# 应用示例 ## 初始化 ```c // 初始化接口 gx_aout_init() ``` 其中已包含时钟开启、中断注册等操作,**需要关注返回值** ## 设置输出声道和输出端口 输出声道模式详见 \ref GX_AOUT_CH_MODE ```c gx_hal_aout_route_set_channel_mode(GX_HAL_AOUT_CH_MODE_STEREO); ``` 输出端口模式详见 \ref GX_AOUT_OUT_PORT ```c gx_hal_aout_set_out_source(GX_HAL_AOUT_OUT_PORT_LODAC, GX_HAL_AOUT_OUT_SRC_AFTER_EQ_DRC); //选择输出端口LoDAC ``` ## 设置数据类型和数据地址 配置采样率、通道数、数据存放格式、大小端、数据位宽、存储空间 ```c GX_AOUT_PCM pcm = {0}; pcm.left_buffer = ((unsigned int)addr & 0x0fffffff); //设置数据地址时,需将虚拟地址转化为物理地址 pcm.right_buffer = ((unsigned int)addr+offset & 0x0fffffff); //交织数据右声道地址配置为0 gx_aout_route_set_pcm(&pcm); ``` **结构体中其他内容见** \ref GX_AOUT_PCM ## 淡入淡出 ```c //淡入速度配置,淡入速度为每持续2^4,即每16个样点音量下降1dB gx_aout_route_set_fade_in_speed(4); //淡出速度同理 gx_aout_route_set_fade_out_speed(4); //开启淡入淡出使能 gx_aout_route_set_fade(1); ``` ## 播放配置 ```c GX_AOUT_FRAME frame = {0}; frame.saddr = 0; //播放数据的起始地址;该地址为相对于物理地址的相对地址 frame.eaddr = frame.saddr + period_size - 1; //播放数据的结束地址 gx_aout_route_push_frame(&frame); ``` ## 应用中断回调函数 **注册中断回调函数** ```c GX_AOUT_CB cb = {0}; cb.newframe_cb_func = _aout_new_frame_callback; //注册帧锁存中断处理函数 cb.fifo_empty_cb_func = _aout_fifo_empty_callback; //注册FIFO空中断处理函数 cb.fade_done_cb_func = _aout_fade_done_callback; //注册淡入淡出完成中断处理函数 ret = gx_aout_set_cb(&cb); ``` **中断回调函数处理** * 依靠帧锁存中断,可继续配置新的播放帧数据 * 依靠FIFO为空中断,可以控制播放结束相关操作 * 在淡入淡出完成中断,可以感知当前播放状态 ## 播放停止和恢复 **播放停止** ```c gx_aout_route_request_stop(); //申请播放停止,阻塞接口;申请成功才能正确关闭 gx_aout_route_enable(0); //停止播放功能 ``` **此时播放器处于暂停状态,播放buffer的起始地址和大小仍然有效** **播放恢复** ```c gx_aout_route_enable(1); //开启播放功能 ... gx_aout_route_push_frame(&frame); //推出播放帧 ``` ## 播放结束 ```c gx_aout_exit(); //销毁播放 ```