#include "application/audio_dec_app.h" #include "app_config.h" #include "audio_config.h" #include "app_main.h" ////////////////////////////////////////////////////////////////////////////// extern struct audio_decoder_task decode_task; extern struct audio_mixer mixer; extern struct audio_dac_hdl dac_hdl; #if AUDIO_DAC_MULTI_CHANNEL_ENABLE extern struct audio_dac_channel default_dac; #endif extern const int audio_dec_app_mix_en; extern u32 audio_output_channel_num(void); ////////////////////////////////////////////////////////////////////////////// struct audio_dec_app_audio_state_hdl { struct audio_mixer *p_mixer; u32 dec_mix : 1; // 1:叠加模式 u32 flag; }; ////////////////////////////////////////////////////////////////////////////// const struct audio_dec_format_hdl decode_format_list[] = { {"wtg", AUDIO_CODING_G729}, {"msbc", AUDIO_CODING_MSBC}, {"sbc", AUDIO_CODING_SBC}, {"mty", AUDIO_CODING_MTY}, {"aac", AUDIO_CODING_AAC}, {"mp3", AUDIO_CODING_MP3}, {"wma", AUDIO_CODING_WMA}, {"wav", AUDIO_CODING_WAV}, #if TCFG_DEC_WTGV2_ENABLE {"wts", AUDIO_CODING_WTGV2}, #endif {0, 0}, }; #if defined(CONFIG_MEDIA_DEVELOP_ENABLE) static struct audio_stream_entry *audio_dec_app_entries[2] = {NULL}; #endif ////////////////////////////////////////////////////////////////////////////// /*----------------------------------------------------------------------------*/ /**@brief 解码创建参数初始化 @param *dec: 解码句柄 @return 0-正常 @note 弱函数重定义 */ /*----------------------------------------------------------------------------*/ int audio_dec_app_create_param_init(struct audio_dec_app_hdl *dec) { dec->p_decode_task = &decode_task; #if defined(CONFIG_MEDIA_DEVELOP_ENABLE) if (!audio_dec_app_mix_en) { #if AUDIO_DAC_MULTI_CHANNEL_ENABLE audio_dec_app_entries[0] = &default_dac.entry; #else audio_dec_app_entries[0] = &dac_hdl.entry; #endif dec->entries = audio_dec_app_entries; } else #endif { dec->p_mixer = &mixer; } #if defined(CONFIG_MEDIA_DEVELOP_ENABLE) u8 dac_connect_mode = app_audio_output_mode_get(); if (dac_connect_mode == DAC_OUTPUT_FRONT_LR_REAR_LR) { dec->out_ch_num = 4; } else { dec->out_ch_num = audio_output_channel_num(); } #else dec->p_dac_hdl = &dac_hdl; #endif return 0; } /*----------------------------------------------------------------------------*/ /**@brief 文件解码创建参数初始化 @param *file_dec: 文件解码句柄 @return 0-正常 @note 弱函数重定义 */ /*----------------------------------------------------------------------------*/ int audio_dec_file_app_create_param_init(struct audio_dec_file_app_hdl *file_dec) { file_dec->format = decode_format_list; return 0; } /*----------------------------------------------------------------------------*/ /**@brief 解码输出状态设置 @param *dec: 解码句柄 @param flag: 解码标签 @return 0-正常 @note */ /*----------------------------------------------------------------------------*/ int audio_dec_app_audio_state_switch(struct audio_dec_app_hdl *dec, u32 flag) { u8 need_set_audio = 1; /* if ((dec->dec_mix) && (audio_mixer_get_ch_num(dec->p_mixer) > 1)) { */ /* need_set_audio = 0; */ /* } */ if (app_audio_get_state() == APP_AUDIO_STATE_IDLE) { need_set_audio = 1; } if (need_set_audio) { if (flag == AUDIO_DEC_FILE_FLAG_AUDIO_STATE_MUSIC) { app_audio_state_switch(APP_AUDIO_STATE_MUSIC, get_max_sys_vol()); } else { #ifdef TCFG_WTONT_ONCE_VOL extern u8 get_tone_once_vol(void); app_audio_state_switch(APP_AUDIO_STATE_WTONE, get_tone_once_vol()); #else app_audio_state_switch(APP_AUDIO_STATE_WTONE, get_tone_vol()); #endif } } return 0; } /*----------------------------------------------------------------------------*/ /**@brief 解码输出状态退出 @param *p_aud_state: 输出状态 @return 0-正常 @note */ /*----------------------------------------------------------------------------*/ int audio_dec_app_audio_state_exit(struct audio_dec_app_audio_state_hdl *p_aud_state) { u8 need_set_audio = 1; /* if ((p_aud_state->dec_mix) && (audio_mixer_get_ch_num(p_aud_state->p_mixer) > 1)) { */ /* need_set_audio = 0; */ /* } */ /* if (app_audio_get_state() == APP_AUDIO_STATE_IDLE) { */ /* need_set_audio = 1; */ /* } */ if (need_set_audio) { if (p_aud_state->flag == AUDIO_DEC_FILE_FLAG_AUDIO_STATE_MUSIC) { app_audio_state_exit(APP_AUDIO_STATE_MUSIC); } else { app_audio_state_exit(APP_AUDIO_STATE_WTONE); } } return 0; } /*----------------------------------------------------------------------------*/ /**@brief 文件解码初始化完成 @param *file_dec: 文件解码句柄 @return 0-正常 @note 弱函数重定义 */ /*----------------------------------------------------------------------------*/ int audio_dec_file_app_init_ok(struct audio_dec_file_app_hdl *file_dec) { audio_dec_app_audio_state_switch(file_dec->dec, file_dec->flag & AUDIO_DEC_FILE_FLAG_AUDIO_STATE_MASK); return 0; } /*----------------------------------------------------------------------------*/ /**@brief 文件解码结束 @param *file_dec: 文件解码句柄 @return 0-正常 @note 弱函数重定义 */ /*----------------------------------------------------------------------------*/ int audio_dec_file_app_play_end(struct audio_dec_file_app_hdl *file_dec) { struct audio_dec_app_audio_state_hdl aud_state = {0}; aud_state.p_mixer = file_dec->dec->p_mixer; aud_state.dec_mix = file_dec->dec->dec_mix; aud_state.flag = file_dec->flag & AUDIO_DEC_FILE_FLAG_AUDIO_STATE_MASK; audio_dec_file_app_close(file_dec); audio_dec_app_audio_state_exit(&aud_state); return 0; } /*----------------------------------------------------------------------------*/ /**@brief 正弦波解码初始化完成 @param *sine_dec: 正弦波解码句柄 @return 0-正常 @note 弱函数重定义 */ /*----------------------------------------------------------------------------*/ int audio_dec_sine_app_init_ok(struct audio_dec_sine_app_hdl *sine_dec) { audio_dec_app_audio_state_switch(sine_dec->dec, sine_dec->flag & AUDIO_DEC_FILE_FLAG_AUDIO_STATE_MASK); return 0; } /*----------------------------------------------------------------------------*/ /**@brief 正弦波解码结束 @param *sine_dec: 正弦波解码句柄 @return 0-正常 @note 弱函数重定义 */ /*----------------------------------------------------------------------------*/ int audio_dec_sine_app_play_end(struct audio_dec_sine_app_hdl *sine_dec) { struct audio_dec_app_audio_state_hdl aud_state = {0}; aud_state.p_mixer = sine_dec->dec->p_mixer; aud_state.dec_mix = sine_dec->dec->dec_mix; aud_state.flag = sine_dec->flag & AUDIO_DEC_FILE_FLAG_AUDIO_STATE_MASK; audio_dec_sine_app_close(sine_dec); audio_dec_app_audio_state_exit(&aud_state); return 0; } #if (!defined(CONFIG_MEDIA_DEVELOP_ENABLE)) void audio_dec_app_output_sr_set(struct audio_dec_app_hdl *dec) { /* #if defined(CONFIG_CPU_BR23) */ /* extern u32 audio_output_rate(int input_rate); */ /* dec->src_out_sr = audio_output_rate(dec->src_out_sr); */ /* #endif */ if (dec->sample_rate == 0) { dec->sample_rate = dec->src_out_sr; } } #endif ////////////////////////////////////////////////////////////////////////////// // test #if 0 #include "tone_player.h" void audio_dec_file_test(void) { struct audio_dec_file_app_hdl *hdl; hdl = audio_dec_file_app_create(TONE_POWER_ON, 1); if (hdl) { audio_dec_file_app_open(hdl); } os_time_dly(2); hdl = audio_dec_file_app_create(TONE_POWER_OFF, 1); if (hdl) { audio_dec_file_app_open(hdl); } os_time_dly(300); } static const struct audio_sin_param sine_test[] = { /*{0, 1000, 0, 100},*/ {200 << 9, 4000, 0, 100}, }; static const struct audio_sin_param sine_test1[] = { {450 << 9, 24960, 1, 16.667 * 512}, {0, 16000, 0, 100}, }; void audio_dec_sine_test(void) { struct audio_dec_sine_app_hdl *hdl; /* hdl = audio_dec_sine_app_create(SDFILE_RES_ROOT_PATH"tone/vol_max.sin", 1); */ hdl = audio_dec_sine_app_create_by_parm(sine_test1, ARRAY_SIZE(sine_test1), 1); if (hdl) { audio_dec_sine_app_open(hdl); } os_time_dly(2); hdl = audio_dec_sine_app_create_by_parm(sine_test, ARRAY_SIZE(sine_test), 1); if (hdl) { audio_dec_sine_app_open(hdl); } /* os_time_dly(300); */ } void audio_dec_usb_file_test(void) { tone_play_stop(); clk_set("sys", 192 * 1000000L); struct audio_dec_file_app_hdl *hdl; /* hdl = audio_dec_file_app_create("storage/udisk/C/1.mp3", 1); */ hdl = audio_dec_file_app_create("storage/udisk/C/1.wav", 1); if (hdl) { audio_dec_file_app_open(hdl); } os_time_dly(2); /* hdl = audio_dec_file_app_create("storage/udisk/C/2.mp3", 1); */ hdl = audio_dec_file_app_create("storage/udisk/C/2.wav", 1); if (hdl) { audio_dec_file_app_open(hdl); } os_time_dly(300); } #endif /*test*/