#ifndef XYSDK_PLAYER_API_H_
#define XYSDK_PLAYER_API_H_



typedef enum
{
    XY_STREAM_PLAYER_NULL = 0,
    XY_STREAM_PLAYER_WAITING,
    XY_STREAM_PLAYER_PLAY,
    XY_STREAM_PLAYER_PAUSE,
    XY_STREAM_PLAYER_STOP,

    XY_STREAM_PLAYER_END,
    XY_STREAM_PLAYER_SUSPEND,
    XY_STREAM_PLAYER_ERR,

    XY_STREAM_PLAYER_MAX,
}xy_stream_status_e;


typedef struct track_info
{	
	uint8_t list_type;					//列表类型  0:专辑，1：听单，2：声音
	uint8_t limit;					    //每页数据的大小，小于等于XY_ALBUM_NUM_PER_PAGE
    uint8_t source_type;                // 1：大喜马  2：小喜马。未获取到默认传1 
    uint8_t pay_type;                   //音频付费类型，0：免费  1：付费  2：试听
    uint8_t album_type;                 //专辑类型 0:免费专辑 1：精品单购， 2：vip专享， 3：vip畅听,当pay_type为1时需要该字段判断是否购买
    uint16_t cur_page;					//当前页码,从1开始
	uint16_t cur_index;					//当前音频相对于总数的index
    uint16_t play_duration;					//播放时长
    uint32_t play_offset;               //播放断点
	char listen_id[XY_MAX_ID_LEN];      //听单id, 若list_type为1时必传，此id填听单id，否则可不传。				
	char track_id[XY_MAX_ID_LEN];		//音频id, 有的话尽量传, 当list_type为2时必传。
    char album_id[XY_MAX_ID_LEN];	    //专辑id，有的话尽量传，当list_type为0时必传。
    char title[XY_MAX_NAME_LEN];		//专辑或听单名称
    char track_name[XY_MAX_NAME_LEN];		//音频名称
}track_info_t;


typedef struct player_info
{	
    //uint8_t play_statues;               //播放状态 0：未播放，1：播放中，2：暂停    
    uint32_t play_size;                 //音频文件大小
    char play_url[XY_MAX_PLAY_URL_LEN]; //音频播放地址
    track_info_t cur_track;                 //当前播放的音频信息
}player_info_t;

typedef struct playlist_array
{
	uint8_t list_type;					//列表类型  0:专辑，1：听单，2：声音
	uint8_t track_num;					//当前页音频数量
    uint8_t limit;					    //每页数据的大小，
	uint16_t cur_page;					//当前页码
    uint8_t album_type;                 //专辑类型 0:免费专辑 1：精品单购， 2：vip专享， 3：vip畅听,当pay_type为1时需要该字段判断是否购买
	uint16_t track_total;				//总音频数
	uint16_t cur_index;					//当前音频相对于总数的index
	char listen_id[XY_MAX_ID_LEN];      //听单id				
	char title[XY_MAX_NAME_LEN];		//专辑或听单名称	
    char album_id[XY_MAX_ID_LEN];	    //专辑id
    xy_list_t *track_list;				//听单下的音频列表		
}playlist_array_t;



//播放状态回调函数定义
typedef void (*stream_play_status_cb)(xy_stream_status_e status);

/**
 * 播放指定的音频,存在http阻塞请求
 * 
 * @param track_info_t 音频信息
 * 
 * return http_ret_value枚举
 */
int xy_api_player_play(track_info_t *track_info);
int xy_api_player_resume(void);
int xy_api_player_pause(void);

//停止播放，有数据上报，存在http阻塞请求
int xy_api_player_stop(void);

//下一曲，存在http阻塞请求
int xy_api_player_next(void);
//上一曲，存在http阻塞请求
int xy_api_player_prev(void);

//获取当前播放进度  
uint16_t xy_api_get_play_progress(void);

//获取是否在播放中
bool xy_api_get_player_status(void);

//获取当前播放的音频信息
track_info_t *xy_api_get_cur_playing_info(void);

//获取当前播放列表
playlist_array_t *xy_api_get_play_list(void);

//播放器初始化
int xy_api_player_init(stream_play_status_cb status_cb);

//注销播放器
int xy_api_player_deinit(void);

//上报播放数据，开始播放时候调用，放sdk中处理响应较慢，建议在收到XY_STREAM_PLAYER_PLAY的回调时调用，stop已在sdk中实现
int xy_api_upload_play_record(void);
#endif