From: p15692025051 <846603105@qq.com> Date: Wed, 10 Jan 2024 06:55:03 +0000 (+0800) Subject: 音频合成代码更新 X-Git-Url: http://git.snicker.com.cn/?a=commitdiff_plain;h=f7d028bcd03a7c6f02e34e6ea266550e638b5745;p=mirrors%2FASR1603_G5.git 音频合成代码更新 --- diff --git a/2.sdk/Helios_SDK/components/audio/amr/amrnb/enc/api/amrnb_enc_api.cpp b/2.sdk/Helios_SDK/components/audio/amr/amrnb/enc/api/amrnb_enc_api.cpp index 5d29c45b..4f2e3606 100644 --- a/2.sdk/Helios_SDK/components/audio/amr/amrnb/enc/api/amrnb_enc_api.cpp +++ b/2.sdk/Helios_SDK/components/audio/amr/amrnb/enc/api/amrnb_enc_api.cpp @@ -7,9 +7,9 @@ #include #include "gsmamr_enc.h" #include "amrnb_enc_api.h" -#include "audio_file.h" +#include "helios_audio_fs.h" +#include extern "C" { -#include "utils.h" typedef struct AmrNbEncState { void *encCtx; @@ -17,8 +17,8 @@ extern "C" { }AmrNbEncState; typedef struct amrnb_enc_state { - AUDIO_FILE_ID fSrc; - AUDIO_FILE_ID fDst; + HeliosAudFILE* fSrc; + HeliosAudFILE* fDst; uint16_t* inputBuf; uint8_t* outputBuf; AmrNbEncState* amr; @@ -43,7 +43,7 @@ extern "C" { st->out_format = config->output_format; // Open input file. if (config->name) { - st->fSrc = common_fopen(config->name, "rb"); + st->fSrc = Helios_Aud_fopen(config->name, "rb"); if (st->fSrc == NULL) { return -1; } @@ -51,7 +51,7 @@ extern "C" { // Open output file. if (config->out_name) { - st->fDst = common_fopen(config->out_name, "wb"); + st->fDst = Helios_Aud_fopen(config->out_name, "wb"); if (st->fDst == NULL) { return -2; } @@ -59,11 +59,11 @@ extern "C" { // Allocate input buffer. st->inputBuf = (uint16_t*)malloc(kInputSize); - ASSERT(st->inputBuf != NULL); + assert(st->inputBuf != NULL); // Allocate output buffer. st->outputBuf = (uint8_t*)malloc(kOutputSize); - ASSERT(st->outputBuf != NULL); + assert(st->outputBuf != NULL); // Initialize encoder. st->amr = (AmrNbEncState*)malloc(sizeof(AmrNbEncState)); @@ -71,7 +71,7 @@ extern "C" { // Write file header. if (st->out_format == AMR_TX_WMF && st->fDst) - common_fwrite("#!AMR\n", 1, 6, st->fDst); + Helios_Aud_fwrite((void*)"#!AMR\n", 1, 6, st->fDst); *handle = (amrnb_enc_handle)st; return 0; } @@ -96,7 +96,7 @@ extern "C" { if (st) { // Read next input frame. int bytesRead; - bytesRead = common_fread(st->inputBuf, 1, kInputSize, st->fSrc); + bytesRead = Helios_Aud_fread(st->inputBuf, 1, kInputSize, st->fSrc); if (bytesRead != kInputSize) { return -2; } @@ -112,7 +112,7 @@ extern "C" { return -2; // Write the output. - common_fwrite(st->outputBuf, 1, st->bytesGenerated, st->fDst); + Helios_Aud_fwrite(st->outputBuf, 1, st->bytesGenerated, st->fDst); return 0; } return -1; @@ -196,10 +196,10 @@ extern "C" { // Close the input and output files. if (st->fSrc) { - common_fclose(st->fSrc); + Helios_Aud_fclose(st->fSrc); } if (st->fDst) { - common_fclose(st->fDst); + Helios_Aud_fclose(st->fDst); } free(st); diff --git a/2.sdk/Helios_SDK/components/audio/audio.mk b/2.sdk/Helios_SDK/components/audio/audio.mk index 90be90fa..6c70c7ab 100644 --- a/2.sdk/Helios_SDK/components/audio/audio.mk +++ b/2.sdk/Helios_SDK/components/audio/audio.mk @@ -8,13 +8,19 @@ $(NAME)_SRCS += \ ring_buffer.c \ watermark.c \ helios_audio_montage.c \ - helios_audio_fs.c GLOBAL_INCS += \ ./ endif +result1 := $(sort $(filter y,$(CONFIG_AUDIO) $(CONFIG_AUD_RECORD))) +ifeq (y,$(result1)) +$(NAME)_SRCS += \ + helios_audio_fs.c +endif + + ifeq ($(CONFIG_AUDIO_G711_COMPRESS), y) $(NAME)_SRCS += \ G711/g711.c @@ -58,65 +64,6 @@ endif ifeq ($(CONFIG_AUDIO_AMR), y) $(NAME)_SRCS += \ helios_audio_amr.c \ - amr/amrnb/common/src/add.cpp \ - amr/amrnb/common/src/az_lsp.cpp \ - amr/amrnb/common/src/bitno_tab.cpp \ - amr/amrnb/common/src/bitreorder_tab.cpp \ - amr/amrnb/common/src/bits2prm.cpp \ - amr/amrnb/common/src/c2_9pf_tab.cpp \ - amr/amrnb/common/src/copy.cpp \ - amr/amrnb/common/src/div_32.cpp \ - amr/amrnb/common/src/div_s.cpp \ - amr/amrnb/common/src/extract_h.cpp \ - amr/amrnb/common/src/extract_l.cpp \ - amr/amrnb/common/src/gains_tbl.cpp \ - amr/amrnb/common/src/gc_pred.cpp \ - amr/amrnb/common/src/gmed_n.cpp \ - amr/amrnb/common/src/gray_tbl.cpp \ - amr/amrnb/common/src/grid_tbl.cpp \ - amr/amrnb/common/src/int_lpc.cpp \ - amr/amrnb/common/src/inv_sqrt.cpp \ - amr/amrnb/common/src/inv_sqrt_tbl.cpp \ - amr/amrnb/common/src/l_abs.cpp \ - amr/amrnb/common/src/l_deposit_h.cpp \ - amr/amrnb/common/src/l_deposit_l.cpp \ - amr/amrnb/common/src/l_shr_r.cpp \ - amr/amrnb/common/src/log2.cpp \ - amr/amrnb/common/src/log2_norm.cpp \ - amr/amrnb/common/src/log2_tbl.cpp \ - amr/amrnb/common/src/lsfwt.cpp \ - amr/amrnb/common/src/lsp.cpp \ - amr/amrnb/common/src/lsp_az.cpp \ - amr/amrnb/common/src/lsp_lsf.cpp \ - amr/amrnb/common/src/lsp_lsf_tbl.cpp \ - amr/amrnb/common/src/lsp_tab.cpp \ - amr/amrnb/common/src/mult_r.cpp \ - amr/amrnb/common/src/negate.cpp \ - amr/amrnb/common/src/norm_l.cpp \ - amr/amrnb/common/src/norm_s.cpp \ - amr/amrnb/common/src/ph_disp_tab.cpp \ - amr/amrnb/common/src/pow2.cpp \ - amr/amrnb/common/src/pow2_tbl.cpp \ - amr/amrnb/common/src/pred_lt.cpp \ - amr/amrnb/common/src/q_plsf.cpp \ - amr/amrnb/common/src/q_plsf_3.cpp \ - amr/amrnb/common/src/q_plsf_3_tbl.cpp \ - amr/amrnb/common/src/q_plsf_5.cpp \ - amr/amrnb/common/src/q_plsf_5_tbl.cpp \ - amr/amrnb/common/src/qua_gain_tbl.cpp \ - amr/amrnb/common/src/reorder.cpp \ - amr/amrnb/common/src/residu.cpp \ - amr/amrnb/common/src/round.cpp \ - amr/amrnb/common/src/set_zero.cpp \ - amr/amrnb/common/src/shr.cpp \ - amr/amrnb/common/src/shr_r.cpp \ - amr/amrnb/common/src/sqrt_l.cpp \ - amr/amrnb/common/src/sqrt_l_tbl.cpp \ - amr/amrnb/common/src/sub.cpp \ - amr/amrnb/common/src/syn_filt.cpp \ - amr/amrnb/common/src/vad1.cpp \ - amr/amrnb/common/src/weight_a.cpp \ - amr/amrnb/common/src/window_tab.cpp \ $(NAME)_SRCS += \ @@ -154,15 +101,13 @@ $(NAME)_SRCS += \ amr/amrnb/dec/src/pstfilt.cpp \ amr/amrnb/dec/src/qgain475_tab.cpp \ amr/amrnb/dec/src/sp_dec.cpp \ - amr/amrnb/dec/src/wmf_to_ets.cpp + amr/amrnb/dec/src/wmf_to_ets.cpp GLOBAL_INCS += \ amr/include \ amr/amrnb/common/include \ amr/amrnb/dec/api \ amr/amrnb/dec/src \ - amr/amrnb/enc/api \ - amr/amrnb/enc/src \ amr/amrwb/include \ amr/amrwb/api \ amr/amrwb/src \ @@ -171,8 +116,6 @@ GLOBAL_INCS += \ endif - - ifeq ($(CONFIG_AUDIO_MP3), y) $(NAME)_SRCS += \ @@ -251,8 +194,175 @@ $(NAME)_CFLAGS = \ -Wno-error=incompatible-pointer-types \ -Wno-error=sign-compare \ -Wno-error=unused-variable \ - -Wno-error=unused-label + -Wno-error=unused-label \ + -Wno-error=memset-elt-size $(NAME)_COMPONENTS = peripheral + +ifeq ($(CONFIG_AUD_RECORD), y) +$(NAME)_SRCS += \ + helios_record.c \ + +GLOBAL_INCS += \ + ./ \ + amr/amrnb/common/include \ + + +endif + +result2 := $(sort $(filter y,$(CONFIG_AUDIO_AMR) $(CONFIG_AUDIO_RECORD_AMRNB))) +ifeq (y,$(result2)) +$(NAME)_SRCS += \ + amr/amrnb/common/src/add.cpp \ + amr/amrnb/common/src/az_lsp.cpp \ + amr/amrnb/common/src/bitno_tab.cpp \ + amr/amrnb/common/src/bitreorder_tab.cpp \ + amr/amrnb/common/src/bits2prm.cpp \ + amr/amrnb/common/src/c2_9pf_tab.cpp \ + amr/amrnb/common/src/copy.cpp \ + amr/amrnb/common/src/div_32.cpp \ + amr/amrnb/common/src/div_s.cpp \ + amr/amrnb/common/src/extract_h.cpp \ + amr/amrnb/common/src/extract_l.cpp \ + amr/amrnb/common/src/gains_tbl.cpp \ + amr/amrnb/common/src/gc_pred.cpp \ + amr/amrnb/common/src/gmed_n.cpp \ + amr/amrnb/common/src/gray_tbl.cpp \ + amr/amrnb/common/src/grid_tbl.cpp \ + amr/amrnb/common/src/int_lpc.cpp \ + amr/amrnb/common/src/inv_sqrt.cpp \ + amr/amrnb/common/src/inv_sqrt_tbl.cpp \ + amr/amrnb/common/src/l_abs.cpp \ + amr/amrnb/common/src/l_deposit_h.cpp \ + amr/amrnb/common/src/l_deposit_l.cpp \ + amr/amrnb/common/src/l_shr_r.cpp \ + amr/amrnb/common/src/log2.cpp \ + amr/amrnb/common/src/log2_norm.cpp \ + amr/amrnb/common/src/log2_tbl.cpp \ + amr/amrnb/common/src/lsfwt.cpp \ + amr/amrnb/common/src/lsp.cpp \ + amr/amrnb/common/src/lsp_az.cpp \ + amr/amrnb/common/src/lsp_lsf.cpp \ + amr/amrnb/common/src/lsp_lsf_tbl.cpp \ + amr/amrnb/common/src/lsp_tab.cpp \ + amr/amrnb/common/src/mult_r.cpp \ + amr/amrnb/common/src/negate.cpp \ + amr/amrnb/common/src/norm_l.cpp \ + amr/amrnb/common/src/norm_s.cpp \ + amr/amrnb/common/src/ph_disp_tab.cpp \ + amr/amrnb/common/src/pow2.cpp \ + amr/amrnb/common/src/pow2_tbl.cpp \ + amr/amrnb/common/src/pred_lt.cpp \ + amr/amrnb/common/src/q_plsf.cpp \ + amr/amrnb/common/src/q_plsf_3.cpp \ + amr/amrnb/common/src/q_plsf_3_tbl.cpp \ + amr/amrnb/common/src/q_plsf_5.cpp \ + amr/amrnb/common/src/q_plsf_5_tbl.cpp \ + amr/amrnb/common/src/qua_gain_tbl.cpp \ + amr/amrnb/common/src/reorder.cpp \ + amr/amrnb/common/src/residu.cpp \ + amr/amrnb/common/src/round.cpp \ + amr/amrnb/common/src/set_zero.cpp \ + amr/amrnb/common/src/shr.cpp \ + amr/amrnb/common/src/shr_r.cpp \ + amr/amrnb/common/src/sqrt_l.cpp \ + amr/amrnb/common/src/sqrt_l_tbl.cpp \ + amr/amrnb/common/src/sub.cpp \ + amr/amrnb/common/src/syn_filt.cpp \ + amr/amrnb/common/src/vad1.cpp \ + amr/amrnb/common/src/weight_a.cpp \ + amr/amrnb/common/src/window_tab.cpp \ + +endif + +ifeq ($(CONFIG_AUDIO_RECORD_AMRNB), y) +$(NAME)_SRCS += \ + amr/amrnb/enc/src/amrencode.cpp \ + amr/amrnb/enc/src/autocorr.cpp \ + amr/amrnb/enc/src/c1035pf.cpp \ + amr/amrnb/enc/src/c2_11pf.cpp \ + amr/amrnb/enc/src/c2_9pf.cpp \ + amr/amrnb/enc/src/c3_14pf.cpp \ + amr/amrnb/enc/src/c4_17pf.cpp \ + amr/amrnb/enc/src/c8_31pf.cpp \ + amr/amrnb/enc/src/calc_cor.cpp \ + amr/amrnb/enc/src/calc_en.cpp \ + amr/amrnb/enc/src/cbsearch.cpp \ + amr/amrnb/enc/src/cl_ltp.cpp \ + amr/amrnb/enc/src/cod_amr.cpp \ + amr/amrnb/enc/src/convolve.cpp \ + amr/amrnb/enc/src/cor_h.cpp \ + amr/amrnb/enc/src/cor_h_x.cpp \ + amr/amrnb/enc/src/cor_h_x2.cpp \ + amr/amrnb/enc/src/corrwght_tab.cpp \ + amr/amrnb/enc/src/dtx_enc.cpp \ + amr/amrnb/enc/src/enc_lag3.cpp \ + amr/amrnb/enc/src/enc_lag6.cpp \ + amr/amrnb/enc/src/enc_output_format_tab.cpp \ + amr/amrnb/enc/src/ets_to_if2.cpp \ + amr/amrnb/enc/src/ets_to_wmf.cpp \ + amr/amrnb/enc/src/g_adapt.cpp \ + amr/amrnb/enc/src/g_code.cpp \ + amr/amrnb/enc/src/g_pitch.cpp \ + amr/amrnb/enc/src/gain_q.cpp \ + amr/amrnb/enc/src/hp_max.cpp \ + amr/amrnb/enc/src/inter_36.cpp \ + amr/amrnb/enc/src/inter_36_tab.cpp \ + amr/amrnb/enc/src/l_comp.cpp \ + amr/amrnb/enc/src/l_extract.cpp \ + amr/amrnb/enc/src/l_negate.cpp \ + amr/amrnb/enc/src/lag_wind.cpp \ + amr/amrnb/enc/src/lag_wind_tab.cpp \ + amr/amrnb/enc/src/levinson.cpp \ + amr/amrnb/enc/src/lpc.cpp \ + amr/amrnb/enc/src/ol_ltp.cpp \ + amr/amrnb/enc/src/p_ol_wgh.cpp \ + amr/amrnb/enc/src/pitch_fr.cpp \ + amr/amrnb/enc/src/pitch_ol.cpp \ + amr/amrnb/enc/src/pre_big.cpp \ + amr/amrnb/enc/src/pre_proc.cpp \ + amr/amrnb/enc/src/prm2bits.cpp \ + amr/amrnb/enc/src/q_gain_c.cpp \ + amr/amrnb/enc/src/q_gain_p.cpp \ + amr/amrnb/enc/src/qgain475.cpp \ + amr/amrnb/enc/src/qgain795.cpp \ + amr/amrnb/enc/src/qua_gain.cpp \ + amr/amrnb/enc/src/s10_8pf.cpp \ + amr/amrnb/enc/src/set_sign.cpp \ + amr/amrnb/enc/src/sid_sync.cpp \ + amr/amrnb/enc/src/sp_enc.cpp \ + amr/amrnb/enc/src/spreproc.cpp \ + amr/amrnb/enc/src/spstproc.cpp \ + amr/amrnb/enc/src/ton_stab.cpp \ + amr/amrnb/enc/api/amrnb_enc_api.cpp \ + +GLOBAL_INCS += \ + ./ \ + amr/amrnb/common/include \ + amr/amrnb/enc/api \ + amr/amrnb/enc/src \ + amr/amrwbenc/api + + +endif + +ifeq ($(CONFIG_AUDIO_RECORD_MP3), y) + +$(NAME)_SRCS += \ + mp3_shine/bitstream.c \ + mp3_shine/huffman.c \ + mp3_shine/l3bitstream.c \ + mp3_shine/l3loop.c \ + mp3_shine/l3mdct.c \ + mp3_shine/l3subband.c \ + mp3_shine/layer3.c \ + mp3_shine/reservoir.c \ + mp3_shine/tables.c \ + +GLOBAL_INCS += \ + ./ \ + mp3_shine + +endif diff --git a/2.sdk/Helios_SDK/components/audio/audio_option.in b/2.sdk/Helios_SDK/components/audio/audio_option.in index a9ae5280..3134f6b7 100644 --- a/2.sdk/Helios_SDK/components/audio/audio_option.in +++ b/2.sdk/Helios_SDK/components/audio/audio_option.in @@ -51,6 +51,7 @@ config AUDIO_AMR default n help Enable amrnb format. + config AUDIO_G711_COMPRESS bool "Enable G711 compression" @@ -63,4 +64,31 @@ config AUDIO_G729_COMPRESS default n help Enable G729(BGG729) compression function. + +config AUD_RECORD + bool "Enable Audio Record" + default n +help + Audio Record is placed in the python SDK. Enable Audio_Record switch. + +config AUDIO_RECORD_AMRNB + bool "Enable AMRNB format recording" + depends on AUD_RECORD + default n +help + Enable AMRNB format recording. + +config AUDIO_RECORD_WAV + bool "Enable WAV format recording" + depends on AUD_RECORD + default n +help + Enable WAV format recording. + +config AUDIO_RECORD_MP3 + bool "Enable MP3 format recording" + depends on AUD_RECORD + default n +help + Enable MP3 format recording. diff --git a/2.sdk/Helios_SDK/components/audio/helios_audio_amr.c b/2.sdk/Helios_SDK/components/audio/helios_audio_amr.c index 4691ea75..d44622e1 100644 --- a/2.sdk/Helios_SDK/components/audio/helios_audio_amr.c +++ b/2.sdk/Helios_SDK/components/audio/helios_audio_amr.c @@ -29,7 +29,7 @@ enum kFileHeaderSize = 6 }; static const uint32_t kFrameSizes[] = {12, 13, 15, 17, 19, 20, 26, 31}; -#define AMR_STREAM_WM_BUF_SIZE 960 +#define AMR_STREAM_WM_BUF_SIZE (1024*4) #define AMR_DEC_CONTINUE (0x01) #define AMR_WRITE_CONTINUE (0x02) @@ -40,6 +40,18 @@ static int is_amr = 0; cb_on_player aud_play_cb = NULL; +static bool _audio_play_state = 0; + + +#if (defined(PLAT_ASR_1803s) || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) \ + ||defined(PLAT_Unisoc_8850) || defined(BOARD_EC600MCN_CC_EXT_TTS) || defined(BOARD_EC800MCN_CC_TTS) \ + || defined(BOARD_EC800KCN_CC_TTS) || defined(BOARD_EC600KCN_CC_TTS)) + +#define USR_HELIOS_AUDIO 1 + +#endif + + struct helios_arm_stream_cxt { wm_handle_t wm; @@ -99,7 +111,9 @@ static int amr_vm_deinit(void) } -#if defined(PLAT_ASR_1803s) || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) || defined(PLAT_Unisoc_8850) +#if defined(PLAT_ASR_1803s) || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) \ + || defined(PLAT_Unisoc_8850) || defined(BOARD_EC600MCN_CC_EXT_TTS) || defined(BOARD_EC800MCN_CC_TTS) \ + || defined(BOARD_EC800KCN_CC_TTS) || defined(BOARD_EC600KCN_CC_TTS) static void __pcm_play_cb(void *handle, int event){ AUDLOGE("__pcm_play_cb event[%d]\n",event); @@ -110,6 +124,10 @@ static void __pcm_play_cb(void *handle, int event){ g_arm_stream_cxt.pcm_whdl = NULL; } } + + if(event == HELIOS_AUD_PLAYER_FINISHED || event == HELIOS_AUD_PLAYER_CLOSE) { + _audio_play_state = 0; + } if(aud_play_cb != NULL) { aud_play_cb("stream", 0, event); @@ -137,9 +155,11 @@ static void amr_dec_task(void *arg) inputBuf = pAmrInputBuf; outputBuf = pAmrOutputBuf; memset(pAmrOutputBuf, 0, kOutputBufferSize); + int _count = 100; while (1) { g_arm_stream_cxt.is_dec_start = false; + _count = 100; AUDLOGD("amr dec start\n"); Helios_Flag_Wait(g_arm_stream_cxt.flag_ref, AMR_DEC_CONTINUE, Helios_FLAG_OR_CLEAR, &event, HELIOS_WAIT_FOREVER); @@ -147,15 +167,26 @@ static void amr_dec_task(void *arg) g_arm_stream_cxt.is_dec_start = true; + if(g_arm_stream_cxt.pcm_whdl == NULL) { + +#ifdef USR_HELIOS_AUDIO + while(_audio_play_state == 1 && _count-- > 1){ + AUDLOGE("audio1 is playing, waiting[%d]...\n",_count); + Helios_msleep(20); + } +#endif + #ifdef CONFIG_AUDIO_PWM - g_arm_stream_cxt.pcm_whdl = Helios_Aud_PWM_Open(CONFIG_AUDIO_PWM_PIN, 1, 8000, QL_PCM_WRITE_FLAG | QL_PCM_BLOCK_FLAG); + g_arm_stream_cxt.pcm_whdl = Helios_Aud_PWM_Open(CONFIG_AUDIO_PWM_PIN, 1, 8000, QL_PCM_WRITE_FLAG | QL_PCM_BLOCK_FLAG); #else - g_arm_stream_cxt.pcm_whdl = Helios_PCM_Open(1, 8000, QL_PCM_WRITE_FLAG | QL_PCM_BLOCK_FLAG); -#if defined(PLAT_ASR_1803s) || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) || defined(PLAT_Unisoc_8850) - Helios_PCM_Play_Cb(g_arm_stream_cxt.pcm_whdl, __pcm_play_cb); + g_arm_stream_cxt.pcm_whdl = Helios_PCM_Open(1, 8000, QL_PCM_WRITE_FLAG | QL_PCM_BLOCK_FLAG); +#ifdef USR_HELIOS_AUDIO + Helios_PCM_Play_Cb(g_arm_stream_cxt.pcm_whdl, __pcm_play_cb); + _audio_play_state = 1; #endif - #endif + } + AUDLOGD("pcm_whdl[%x]\n", g_arm_stream_cxt.pcm_whdl); @@ -166,12 +197,15 @@ static void amr_dec_task(void *arg) AUDLOGE("pcm_whdl is NULL"); continue; } + Speech_Decode_Frame_reset(g_arm_stream_cxt.amr_dec_hdl); if (is_amr == 0) { if (aud_play_cb) { -#if !defined(PLAT_ASR_1803s) && !defined(BOARD_EC600MCN_CC_EXT) && !defined(BOARD_EC600MCN_LF_SLPOC) && !defined(PLAT_Unisoc_8850) +#if !(defined(PLAT_ASR_1803s) || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) \ + ||defined(PLAT_Unisoc_8850) || defined(BOARD_EC600MCN_CC_EXT_TTS) || defined(BOARD_EC800MCN_CC_TTS) \ + || defined(BOARD_EC800KCN_CC_TTS)) || defined(BOARD_EC600KCN_CC_TTS) aud_play_cb(NULL, 0, HELIOS_AUD_PLAYER_START); #endif } @@ -272,7 +306,9 @@ static void amr_dec_task(void *arg) void Helios_aud_data_done(void); Helios_aud_data_done(); #endif -#if !defined(PLAT_ASR_1803s) && !defined(BOARD_EC600MCN_CC_EXT) && !defined(BOARD_EC600MCN_LF_SLPOC) && !defined(PLAT_Unisoc_8850) +#if !(defined(PLAT_ASR_1803s) || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) \ + ||defined(PLAT_Unisoc_8850) || defined(BOARD_EC600MCN_CC_EXT_TTS) || defined(BOARD_EC800MCN_CC_TTS) \ + || defined(BOARD_EC800KCN_CC_TTS) || defined(BOARD_EC600KCN_CC_TTS)) Helios_PCM_Close(g_arm_stream_cxt.pcm_whdl); g_arm_stream_cxt.pcm_whdl = NULL; #endif @@ -287,7 +323,9 @@ static void amr_dec_task(void *arg) { if (aud_play_cb) { -#if !defined(PLAT_ASR_1803s) && !defined(BOARD_EC600MCN_CC_EXT) && !defined(BOARD_EC600MCN_LF_SLPOC) && !defined(PLAT_Unisoc_8850) +#if !(defined(PLAT_ASR_1803s) || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) \ + ||defined(PLAT_Unisoc_8850) || defined(BOARD_EC600MCN_CC_EXT_TTS) || defined(BOARD_EC800MCN_CC_TTS) \ + || defined(BOARD_EC800KCN_CC_TTS) || defined(BOARD_EC600KCN_CC_TTS)) aud_play_cb(NULL, 0, HELIOS_AUD_PLAYER_FINISHED); #endif } @@ -413,6 +451,7 @@ int helios_amr_stream_write(void *data, unsigned int count) uint8_t msg = 1; int ret = -1; static int amr_stream_open_start = 1; + int _count = 100; if (amr_stream_open_start) { @@ -428,6 +467,14 @@ int helios_amr_stream_write(void *data, unsigned int count) } amr_stream_open_start = 0; } + +#ifdef USR_HELIOS_AUDIO + while(_audio_play_state == 1 && g_arm_stream_cxt.pcm_whdl == NULL && _count-- > 1){ + AUDLOGE("audio is playing, waiting[%d]...\n",_count); + Helios_msleep(20); + } +#endif + Helios_Mutex_Lock(g_arm_stream_cxt.playflag_mux, HELIOS_WAIT_FOREVER); g_arm_stream_cxt.is_playing = true; diff --git a/2.sdk/Helios_SDK/components/audio/helios_audio_mp3.c b/2.sdk/Helios_SDK/components/audio/helios_audio_mp3.c index 9cf345ce..d719361c 100644 --- a/2.sdk/Helios_SDK/components/audio/helios_audio_mp3.c +++ b/2.sdk/Helios_SDK/components/audio/helios_audio_mp3.c @@ -18,6 +18,17 @@ static int __jump_count = 3; static int __jump_cnt = -1; static PCM_HANDLE_T mp3_pcm_whdl = NULL; +static bool _audio_play_state = 0; +static bool _mp3_stream_change_rate = false; + + +#if (defined(PLAT_ASR_1803s) || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) \ + ||defined(PLAT_Unisoc_8850) || defined(BOARD_EC600MCN_CC_EXT_TTS) || defined(BOARD_EC800MCN_CC_TTS) \ + || defined(BOARD_EC800KCN_CC_TTS) || defined(BOARD_EC600KCN_CC_TTS)) + +#define USR_HELIOS_AUDIO 1 + +#endif @@ -86,9 +97,9 @@ static const int kBitrateV3[] = { -#if defined(PLAT_ASR_1803s) || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) || defined(PLAT_Unisoc_8850) +#ifdef USR_HELIOS_AUDIO static void __pcm_play_cb(void *handle, int event){ - AUDLOGE("__pcm_play_cb event[%d]\n",event); + AUDLOGD("__pcm_play_cb event[%d][%x][%x]\n",event,handle,mp3_pcm_whdl); if(event == HELIOS_AUD_PLAYER_NODATA_STRAT || event == HELIOS_AUD_PLAYER_FINISHED || event == HELIOS_AUD_PLAYER_CLOSE || event == HELIOS_AUD_PLAYER_REQURST_CLOSE) { if(mp3_pcm_whdl){ @@ -96,10 +107,17 @@ static void __pcm_play_cb(void *handle, int event){ mp3_pcm_whdl = NULL; } } + if(event == HELIOS_AUD_PLAYER_FINISHED || event == HELIOS_AUD_PLAYER_CLOSE) { + _audio_play_state = 0; + } - if(aud_play_cb != NULL) { + if(aud_play_cb != NULL && _mp3_stream_change_rate == false) { aud_play_cb("stream", 0, event); } + if(event == HELIOS_AUD_PLAYER_START) + { + _mp3_stream_change_rate = false; + } } #endif @@ -509,6 +527,7 @@ static bool parseHeader( return true; } static uint32_t mp3_frame_size, mp3_sample_rate, mp3_num_channels; +static uint8_t _header_buf_pre[4] = {0}; static int get_mp3_frame(void *buffer, uint32_t *size) { uint32 event; @@ -607,6 +626,7 @@ static int get_mp3_frame(void *buffer, uint32_t *size) { return -1; } + memcpy(_header_buf_pre, buf, 4); return 0; } @@ -659,14 +679,39 @@ void Helios_wait(void) int Helios_play_stream_start(unsigned int rate, unsigned int ch, unsigned short *pcm_buf, unsigned int frameByteSize) { int ret = 0; + int _count = 100; + static unsigned int rate_pre = 0; + static unsigned int ch_pre = 0; + if(mp3_pcm_whdl && (rate_pre != rate || ch_pre != ch)) + { + AUDLOGD("change rate\r\n"); + _mp3_stream_change_rate = true; + + while(_audio_play_state == 1 && _count-- > 1){ + AUDLOGD("audio1 is playing, waiting[%d]...\n",_count); + Helios_msleep(20); + } + } + rate_pre = rate; + ch_pre = ch; + _count = 100; + if (mp3_pcm_whdl == NULL) { +#ifdef USR_HELIOS_AUDIO + while(_audio_play_state == 1 && _count-- > 1){ + AUDLOGD("audio1 is playing, waiting[%d]...\n",_count); + Helios_msleep(20); + } +#endif #ifdef CONFIG_AUDIO_PWM mp3_pcm_whdl = Helios_Aud_PWM_Open(CONFIG_AUDIO_PWM_PIN, 1, rate, HELIOS_PCM_WRITE_FLAG | HELIOS_PCM_BLOCK_FLAG); #else mp3_pcm_whdl = Helios_PCM_Open(ch, rate, HELIOS_PCM_WRITE_FLAG | HELIOS_PCM_BLOCK_FLAG); -#if defined(PLAT_ASR_1803s) || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) || defined(PLAT_Unisoc_8850) +#ifdef USR_HELIOS_AUDIO Helios_PCM_Play_Cb(mp3_pcm_whdl, __pcm_play_cb); + _audio_play_state = 1; + #endif #endif @@ -721,6 +766,8 @@ int Helios_mp3_dec(void) char nodataStartCnt = 5; char is_resume = 0; int is_silence = 0; + char is_mutex = 0; + char _change_tmp = 1; buff = (unsigned char *)malloc(1024*2); Helios_pcm_outbuf = (unsigned short *)malloc(4608*2); @@ -733,7 +780,7 @@ int Helios_mp3_dec(void) if (aud_play_cb) { -#if !defined(PLAT_ASR_1803s) && !defined(BOARD_EC600MCN_CC_EXT) && !defined(BOARD_EC600MCN_LF_SLPOC) && !defined(PLAT_Unisoc_8850) +#ifndef USR_HELIOS_AUDIO aud_play_cb(NULL, 0, HELIOS_AUD_PLAYER_START); #endif } @@ -745,20 +792,35 @@ int Helios_mp3_dec(void) if (ret != 0) { // break; + AUDLOGE("get_mp3_frame ret[%d][%d]\n", ret,_change_tmp); + Helios_msleep(20); + _change_tmp ^= 1; + if(_change_tmp == 0){ + continue; + } + if (STREAM_IsNot_SwitchOff_Actively) { memset(buff, 0x00, 2 * 1024); bytesRead = 2 * 1024; - buff[0] = 0xff; - buff[1] = 0xfb; - buff[2] = 0x70; - buff[3] = 0xC0; - bytesRead = 313; + if(_header_buf_pre[0] == 0xff){ + memcpy(buff, _header_buf_pre, 4); + bytesRead = mp3_frame_size; + } else { + buff[0] = 0xff; + buff[1] = 0xfb; + buff[2] = 0x70; + buff[3] = 0xC0; + bytesRead = 313; + } + AUDLOGD("header[%x][%x][%x][%x] size[%d]\n", buff[0],buff[1],buff[2],buff[3], mp3_frame_size); + if (nodataStartCnt == 1) { is_resume = 1; if (aud_play_cb) { + AUDLOGD("HELIOS_AUD_PLAYER_NODATA_STRAT\n"); aud_play_cb(NULL, 0, HELIOS_AUD_PLAYER_NODATA_STRAT); } } @@ -769,21 +831,25 @@ int Helios_mp3_dec(void) { break; } + is_mutex = 1; } else { Helios_config.samplerate = mp3_sample_rate; Helios_config.channels = mp3_num_channels; nodataStartCnt = 5; + _change_tmp = 1; if (is_resume == 1) { is_resume = 0; if (aud_play_cb) { + AUDLOGD("HELIOS_AUD_PLAYER_DATA_RESUME\n"); aud_play_cb(NULL, 0, HELIOS_AUD_PLAYER_DATA_RESUME); } } + is_mutex = 0; } Helios_Semaphore_Poll(Helios_ring_buf->wcond, &ret); @@ -792,7 +858,7 @@ int Helios_mp3_dec(void) Helios_Semaphore_Release(Helios_ring_buf->wcond); } - if(__jump_cnt != -1 && __jump_count != 0 && isSilenceFrame(buff+4, (mp3_frame_size-4)/2)){ + if(__jump_cnt != -1 && __jump_count != 0 && mp3_frame_size >= 4 && isSilenceFrame(buff+4, (mp3_frame_size-4)/2)){ is_silence = 1; } else { is_silence = 0; @@ -817,7 +883,7 @@ int Helios_mp3_dec(void) continue; } - if(is_silence) { + if(is_silence && is_mutex == 0) { AUDLOGD("jis_silence\n"); continue; } @@ -854,7 +920,7 @@ int Helios_mp3_dec(void) Helios_Aud_PWM_Close(mp3_pcm_whdl); mp3_pcm_whdl = NULL; #else -#if !defined(PLAT_ASR_1803s) && !defined(BOARD_EC600MCN_CC_EXT) && !defined(BOARD_EC600MCN_LF_SLPOC) && !defined(PLAT_Unisoc_8850) +#ifndef USR_HELIOS_AUDIO Helios_PCM_Close(mp3_pcm_whdl); mp3_pcm_whdl = NULL; #endif @@ -872,7 +938,7 @@ int Helios_mp3_dec(void) if (aud_play_cb) { -#if !defined(PLAT_ASR_1803s) && !defined(BOARD_EC600MCN_CC_EXT) && !defined(BOARD_EC600MCN_LF_SLPOC) && !defined(PLAT_Unisoc_8850) +#ifndef USR_HELIOS_AUDIO aud_play_cb(NULL, 0, HELIOS_AUD_PLAYER_FINISHED); #endif } @@ -981,9 +1047,15 @@ int Helios_play_mp3_stream_start(void *mp3_buff, int mp3_size) int tatol_size = 0; int left_size = mp3_size; int stream_start = 0; + int _count = 100; AUDLOGD("stream mp3 size[%d]\n", mp3_size); - +#ifdef USR_HELIOS_AUDIO + while(_audio_play_state == 1 && mp3_pcm_whdl == NULL && _count-- > 1){ + AUDLOGE("audio is playing, waiting[%d]...\n",_count); + Helios_msleep(20); + } +#endif if (Helios_ring_buf == NULL) { Helios_config.len_size = MP3_RINGBUFF_LEN; @@ -1055,6 +1127,7 @@ int Helios_play_mp3_stream_start(void *mp3_buff, int mp3_size) { if (aud_play_cb) { + AUDLOGD("HELIOS_AUD_PLAYER_MOREDATA\n"); aud_play_cb(NULL, 0, HELIOS_AUD_PLAYER_MOREDATA); } } @@ -1299,7 +1372,7 @@ int Helios_mp3_file_start(char *file_name, cb_on_player aud_cb) { aud_play_cb = aud_cb; } -#if defined(PLAT_ASR_1803s) || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) || defined(PLAT_Unisoc_8850) +#ifdef USR_HELIOS_AUDIO Helios_aud_stop_play_flag = 0; #endif @@ -1323,6 +1396,7 @@ int Helios_mp3_file_start(char *file_name, cb_on_player aud_cb) AUDLOGE("Sync to the first valid frame error\n"); if (aud_play_cb) { + AUDLOGD("HELIOS_AUD_PLAYER_ERROR\n"); aud_play_cb(NULL, 0, HELIOS_AUD_PLAYER_ERROR); } free(mp3_buf); @@ -1337,6 +1411,7 @@ int Helios_mp3_file_start(char *file_name, cb_on_player aud_cb) AUDLOGE("fs seek failed\n"); if (aud_play_cb) { + AUDLOGD("HELIOS_AUD_PLAYER_ERROR\n"); aud_play_cb(NULL, 0, HELIOS_AUD_PLAYER_ERROR); } free(mp3_buf); @@ -1382,6 +1457,7 @@ int Helios_mp3_file_start(char *file_name, cb_on_player aud_cb) AUDLOGE("fs seek failed\n"); if (aud_play_cb) { + AUDLOGD("HELIOS_AUD_PLAYER_ERROR\n"); aud_play_cb(NULL, 0, HELIOS_AUD_PLAYER_ERROR); } free(mp3_buf); @@ -1394,7 +1470,7 @@ int Helios_mp3_file_start(char *file_name, cb_on_player aud_cb) while (1) { // memset(mp3_buf, 0, read_size); -#if defined(PLAT_ASR_1803s) || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) || defined(PLAT_Unisoc_8850) +#ifdef USR_HELIOS_AUDIO if(Helios_aud_stop_play_flag){ break; } @@ -1440,7 +1516,7 @@ int Helios_mp3_file_stop() AUDLOGE("error, mp3 is not playing\n"); return -1; } -#if !defined(PLAT_ASR_1803s) && !defined(BOARD_EC600MCN_CC_EXT) && !defined(BOARD_EC600MCN_LF_SLPOC) && !defined(PLAT_Unisoc_8850) +#ifndef USR_HELIOS_AUDIO Helios_aud_stop_play_flag = 1; #endif @@ -1451,7 +1527,7 @@ int Helios_mp3_file_stop() Helios_msleep(15); count++; } -#if defined(PLAT_ASR_1803s) || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) || defined(PLAT_Unisoc_8850) +#ifdef USR_HELIOS_AUDIO Helios_mp3_Clear_Cache(); #endif AUDLOGD("mp3Stop finish"); diff --git a/2.sdk/Helios_SDK/components/audio/helios_audio_py.c b/2.sdk/Helios_SDK/components/audio/helios_audio_py.c index d2795e6f..674dec88 100644 --- a/2.sdk/Helios_SDK/components/audio/helios_audio_py.c +++ b/2.sdk/Helios_SDK/components/audio/helios_audio_py.c @@ -109,7 +109,7 @@ static int helios_find_file(char *name) * @return: * start play audio file result, 0 for success,-1 for failure */ -#if defined(PLAT_ASR_1606) +#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602) typedef void(*helios_cb_pcm_play)(void*, int); static void __pcm_play_cb(void *handle, int event){ @@ -165,7 +165,7 @@ int Helios_Audio_StreamPlayStart(Helios_AudStreamFormat format, const void *buf, } // AUDLOGI("wav fomat init completed channels:%d,samplerate:%d\n",wav_config.channels,wav_config.samplerate); helios_stream_init_flag = HELIOS_INITED; -#if defined(PLAT_ASR_1606) +#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602) Helios_PCM_Play_Cb(write_hdl, __pcm_play_cb); #endif } @@ -834,6 +834,7 @@ static void __Helios_audio_file_play_task_init(void) attr.entry = __Helios_file_play; __audio_file_task = Helios_Thread_Create(&attr); + assert(__audio_file_task != 0); inited = 1; @@ -845,26 +846,94 @@ static void __Helios_audio_file_play_task_init(void) int Helios_Audio_FilePlayStop(void); - +static int Helios_Audio_Find_Files_by_name(char *file_name) +{ + int rc = 0; + int index = 0; + char* file_token = NULL; + char* path_index = NULL; + char folder_buff[256] = {0}; + char file_name_buff[256] = {0}; + char file_path_buff[256] = {0}; + int file_name_len = strlen(file_name); + if(file_name_len < sizeof("mp3files=")) + { + rc = helios_find_file(file_name); + if(rc != 1) + { + AUDLOGE("not find %s\n", file_name); + return -1; + } + } + else + { + if(strncmp(file_name,"mp3files=",strlen("mp3files=")) == 0) + { + strcpy(file_name_buff,file_name); + file_token = strtok(file_name_buff,"=+"); + file_token = strtok(NULL,"=+"); + //AUDLOGE("token: %s\n", file_token); + path_index = strrchr(file_token,'/'); + if(NULL != path_index) + { + rc = helios_find_file(file_token); + if(rc != 1) + { + AUDLOGE("not find %s\n", file_token); + return -1; + } + index = path_index - file_token; + memset(folder_buff,0,sizeof(folder_buff)); + strncpy(folder_buff,file_token,index+1); //get folder path + //AUDLOGE("folder_buff: %s\n", folder_buff); + } + while(NULL != file_token) + { + file_token = strtok(NULL,"=+"); + if(NULL != file_token) + { + sprintf(file_path_buff,"%s%s",folder_buff,file_token); //get file path + //AUDLOGE("file: %s\n", file_path_buff); + rc = helios_find_file(file_path_buff); + if(rc != 1) + { + AUDLOGE("not find %s\n", file_path_buff); + return -1; + } + } + else{ + break; + } + } + + } + else + { + rc = helios_find_file(file_name); + if(rc != 1) + { + AUDLOGE("not find %s\n", file_name); + return -1; + } + } + } + + return 0; +} int Helios_Audio_FilePlayStart(char *file_name, Helios_AudPlayerType type, helios_cb_on_player usr_cb) { + int ret = 0; (void)type; AUDLOGE("file[%s] release\n", file_name); play_user_cb = usr_cb; //ql_audio_play_init(helios_audio_play_callback); - int rc = 0, ret = 0; - int read_size = 0; - -#if 0 - rc = helios_find_file(file_name); - if(rc != 1) - { - AUDLOGE("not find %s\n", file_name); - return -1; - } -#endif + ret = Helios_Audio_Find_Files_by_name(file_name); + if(0 != ret) + { + return -1; + } memset(__audio_play_file, 0, sizeof(__audio_play_file)); sprintf(__audio_play_file, "%s", file_name); diff --git a/2.sdk/Helios_SDK/components/audio/helios_audio_py.h b/2.sdk/Helios_SDK/components/audio/helios_audio_py.h index b0f10869..ddcd53a3 100644 --- a/2.sdk/Helios_SDK/components/audio/helios_audio_py.h +++ b/2.sdk/Helios_SDK/components/audio/helios_audio_py.h @@ -60,7 +60,8 @@ typedef enum HELIOS_AUDIO_FORMAT_AAC, ///< AAC HELIOS_AUDIO_FORMAT_M4A, ///< M4A HELIOS_AUDIO_FORMAT_TS, ///< TS - + HELIOS_AUDIO_FORMAT_FLV, + HELIOS_AUDIO_FORMAT_RTMP, HELIOS_AUDIO_FORMAT_MAX } Helios_AudStreamFormat; diff --git a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/audio_audio.c b/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/audio_audio.c index 2677d674..dd07da71 100644 --- a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/audio_audio.c +++ b/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/audio_audio.c @@ -39,8 +39,9 @@ || defined(BOARD_EC800MCN_GA) || defined(BOARD_EC800MCN_GA_VOLTE) \ || defined(BOARD_EC800MCN_GA_ALIPAY) || defined(BOARD_EC800MCN_GA_ALIPAY) \ || defined(BOARD_EC800MCN_GA_SPISD) || defined(BOARD_EC800MCN_GA_MS) \ - || defined(BOARD_EC800MCN_LE) || defined(BOARD_EC800MCN_LE_VOLTE) \ - || defined(BOARD_EC800MCN_LA_POC_XBND) || defined(BOARD_EC800MCN_LE_POC_XBND) + || defined(BOARD_EC800MCN_LE) || defined(BOARD_EC800MCN_LE_VOLTE) || defined(BOARD_EC800MCN_LE_VOLVGL)\ + || defined(BOARD_EC800MCN_LA_POC_XBND) || defined(BOARD_EC800MCN_LE_POC_XBND) \ + || defined(BOARD_EC600MEU_LA_POC_XBND) || defined(PLAT_ASR_1803s) @@ -93,6 +94,7 @@ static int g_gpio_pa = -1; static int g_pa_class = 2; static audio_obj_t *audio_obj[AUDIO_CHANNEL_MAX] = {NULL}; static char montage_is_break = 0; +char audio_playing_file_name[256] = {0}; int audio_err_handle(void); @@ -124,7 +126,8 @@ int audio_err_handle(void); } while (0) #else -#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) +#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_Unisoc_8850) \ + || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) #define GET_FILE_VFS_PATH(x, y) get_vfs_path(x,y) #else #define GET_FILE_VFS_PATH(x, y) \ @@ -219,7 +222,7 @@ static uint8_t play_state = PA_AUDIO_STOP; static Helios_MsgQ_t open_pa_q = 0; static Helios_Thread_t open_pa_task_id = 0; -static uint32_t open_pa_delay = 200; // 默认延时200ms开启PA +static uint32_t open_pa_delay = 0; // 延时打开PA void helios_open_pa(void * argv) { @@ -274,33 +277,6 @@ int asynch_open_pa_init(void) { return ret; } -#if defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) || defined(BOARD_EC600MCN_LE_POC_QS) - -void user_audio_speakerpa_callback(unsigned int event) -{ - HELIOS_AUDIO_LOG("g_gpio_pa{%d],event[%d]\n",g_gpio_pa, event); - if(g_gpio_pa != -1) - { - if (event == 1) - { - //打开PA - audio_open_power_amplifier(); - HELIOS_AUDIO_LOG("audio set high, event 1.\r\n"); - } else { - //关闭PA - set_clk_low(); - HELIOS_AUDIO_LOG("audio set low, event 0.\r\n"); - } - } - if (g_audio_speakerpa_callback) - { - mp_sched_schedule_ex(g_audio_speakerpa_callback, mp_obj_new_int(event)); - } -} - -#else - - void user_audio_speakerpa_callback(unsigned int event) { uint8_t pa_ctrl; @@ -335,9 +311,8 @@ void user_audio_speakerpa_callback(unsigned int event) } } -#endif - -#if defined (PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_Unisoc_8850) || defined(PLAT_EIGEN) || defined(PLAT_Unisoc_8910_R05) +#if defined (PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_Unisoc_8850) \ + || defined(PLAT_EIGEN) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) STATIC mp_obj_t helios_set_pa(size_t n_args, const mp_obj_t *args) { int ret = 0; @@ -367,7 +342,8 @@ STATIC mp_obj_t helios_set_pa(size_t n_args, const mp_obj_t *args) ret = Helios_GPIO_Init(g_gpio_pa, &gpio_struct);//Helios_Audio_SetPa(g_gpio_pa); if (ret != 0) { -#if defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) +#if defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) || defined(BOARD_EC600MCN_CC_EXT_TTS) \ + || defined(BOARD_EC800MCN_CC_TTS) || defined(BOARD_EC800KCN_CC_TTS) || defined(BOARD_EC600KCN_CC_TTS) Helios_Audio_SetPaCallback(HELIOS_OUTPUT_RECEIVER, user_audio_speakerpa_callback); #endif return mp_obj_new_int(0); @@ -392,6 +368,49 @@ STATIC mp_obj_t helios_set_speakerpa_callback(mp_obj_t self_in, mp_obj_t callbac return mp_obj_new_int(0); } STATIC MP_DEFINE_CONST_FUN_OBJ_2(helios_set_speakerpa_callback_obj, helios_set_speakerpa_callback); + +STATIC mp_obj_t helios_user_speakerpa_switch(mp_obj_t self_in, mp_obj_t pa_com) +{ + unsigned int event = 0; + if(mp_obj_get_int(pa_com) < 0 || mp_obj_get_int(pa_com) > 1) { + mp_raise_ValueError(MP_ERROR_TEXT("invalid parameter")); + } + event = mp_obj_get_int(pa_com); + user_audio_speakerpa_callback(event); + + return mp_obj_new_int(0); +} +STATIC MP_DEFINE_CONST_FUN_OBJ_2(helios_user_speakerpa_switch_obj, helios_user_speakerpa_switch); + +#if defined(PLAT_Unisoc) + +STATIC mp_obj_t helios_internal_pa_type(mp_uint_t n_args, const mp_obj_t *args) { + int pa_type = 0; + if(n_args == 1) + { + pa_type = Helios_Get_Audio_Pa_Type(); + if(pa_type >= HELIOS_AUD_SPKPA_TYPE_MAX || pa_type < HELIOS_AUD_SPKPA_TYPE_CLASSAB) + { + return mp_obj_new_int(-1); + } + return mp_obj_new_int(pa_type); + } + else if(n_args == 2) + { + pa_type = mp_obj_get_int(args[1]); + if(pa_type >= HELIOS_AUD_SPKPA_TYPE_MAX || pa_type < HELIOS_AUD_SPKPA_TYPE_CLASSAB) + { + return mp_obj_new_int(-1); + } + int ret = Helios_Set_Audio_Pa_Type(pa_type); + return mp_obj_new_int(ret); + } + return mp_obj_new_int(0); +} +STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(helios_internal_pa_type_obj, 1, 2, (mp_obj_t)helios_internal_pa_type); + +#endif + #endif /*=============================================================================*/ @@ -497,7 +516,8 @@ int audio_play_callback(char *ptr, size_t lens, Helios_EnumAudPlayerState state) } #if !CONFIG_AUDIO_PWM -#if defined (PLAT_ASR) || defined (PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined (PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) +#if defined (PLAT_ASR) || defined (PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined (PLAT_Unisoc_8850) \ + || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) STATIC mp_obj_t helios_audio_set_channel(mp_obj_t self_in, mp_obj_t dev) { audio_obj_t *self = MP_OBJ_TO_PTR(self_in); @@ -558,10 +578,12 @@ STATIC mp_obj_t audio_make_new(const mp_obj_type_t *type, size_t n_args, size_t //self->inited = 0; Helios_Audio_Init(); - #if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_EIGEN) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) + #if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_EIGEN) \ + || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) #if CONFIG_AUDIO extern int Helios_Audio_SetPaCallback_py(Helios_AudOutputType type, helios_audio_pa_cb_t cb); -#if defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) +#if defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) || defined(BOARD_EC600MCN_CC_EXT_TTS) \ + || defined(BOARD_EC800MCN_CC_TTS) || defined(BOARD_EC800KCN_CC_TTS) || defined(BOARD_EC600KCN_CC_TTS) Helios_Audio_SetPaCallback((Helios_AudOutputType)device, user_audio_speakerpa_callback); #else Helios_Audio_SetPaCallback_py((Helios_AudOutputType)device, user_audio_speakerpa_callback); @@ -621,6 +643,13 @@ STATIC mp_obj_t audio_make_new(const mp_obj_type_t *type, size_t n_args, size_t mp_raise_ValueError(MP_ERROR_TEXT("create audio object failed, can not create queue play task.")); } } + else + { + if((audio.montage_mutex == 0) && (audio.queue_msg != 0)) + { + audio.montage_mutex = Helios_Mutex_Create(); + } + } return MP_OBJ_FROM_PTR(self); } @@ -891,11 +920,78 @@ STATIC mp_obj_t helios_play_file_start(size_t n_args, const mp_obj_t *args, mp_m audio.audio_state = AUDIO_IDLE; Helios_Mutex_Unlock(audio.queue_mutex); } - + else + { + memcpy(audio_playing_file_name, vfs_name, sizeof(vfs_name)); + } return mp_obj_new_int(ret); } STATIC MP_DEFINE_CONST_FUN_OBJ_KW(helios_play_file_start_obj, 1, helios_play_file_start); +int helios_set_montage_break_flag(char set){ + if(set == 1 || set == 0) + { + montage_is_break = set; + return 0; + } + return -1; +} + +STATIC mp_obj_t helios_get_audio_play_state(mp_obj_t self_in) +{ + int state = 0; + if (audio.audio_state == AUDIO_PLAYING) + { + state = 1; + } + else + { + state = 0; + } + return mp_obj_new_int(state); +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(helios_get_audio_play_state_obj, helios_get_audio_play_state); + +STATIC mp_obj_t helios_get_audio_playing_file_name(mp_obj_t self_in) +{ + int i = 0; + int wait_file = 0; + int count = 0; + mp_obj_t wait_list = mp_obj_new_list(0, NULL); + if (audio.audio_state == AUDIO_IDLE) + { + return mp_obj_new_int(-1); + } + for (i=QUEUE_NUMS-1; i>=0; i--) + { + uint8_t front = audio.audio_queue[i].front; + uint8_t rear = audio.audio_queue[i].rear; + uint8_t cur = front; + if (!audio_queue_is_empty(&audio.audio_queue[i])) + { + while(cur != rear) + { + cur = (cur + 1) % QUEUE_SIZE; + mp_obj_list_append(wait_list, mp_obj_new_str(audio.audio_queue[i].audio_data[cur].data, strlen(audio.audio_queue[i].audio_data[cur].data))); + if(cur == rear) + { + break; + } + } + + } + } + mp_obj_t tuple[3] = + { + mp_obj_new_int(audio.total_nums), + mp_obj_new_str(audio_playing_file_name,strlen(audio_playing_file_name)), + wait_list, + }; + return mp_obj_new_tuple(3, tuple); +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(helios_get_audio_playing_file_name_obj, helios_get_audio_playing_file_name); + + /*=============================================================================*/ /* FUNCTION: helios_play_file_stop */ @@ -912,12 +1008,13 @@ STATIC mp_obj_t helios_play_file_stop(mp_obj_t self_in) int ret = Helios_Audio_FilePlayStop(); return mp_obj_new_int(ret); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(helios_play_file_stop_obj, helios_play_file_stop); +STATIC mp_obj_t helios_play_stream_stop(mp_obj_t self_in); STATIC mp_obj_t helios_play_file_stop_all(mp_obj_t self_in) { uint8_t i = 0; + int ret = 0; montage_is_break = 1; #if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) audio_err_handle(); @@ -933,8 +1030,14 @@ STATIC mp_obj_t helios_play_file_stop_all(mp_obj_t self_in) audio.total_nums = 0; //audio.audio_state = AUDIO_IDLE; Helios_Mutex_Unlock(audio.queue_mutex); - - int ret = Helios_Audio_FilePlayStop(); + if(audio.cur_type == AUDIO_MONTAGE || audio.cur_type == AUDIO_STREAM) + { + ret = mp_obj_get_int(helios_play_stream_stop(self_in)); + } + else + { + ret = Helios_Audio_FilePlayStop(); + } return mp_obj_new_int(ret); } STATIC MP_DEFINE_CONST_FUN_OBJ_1(helios_play_file_stop_all_obj, helios_play_file_stop_all); @@ -956,26 +1059,26 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(helios_play_file_stop_all_obj, helios_play_file /*=============================================================================*/ STATIC mp_obj_t helios_play_stream_start(size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { - enum { ARG_format, ARG_audiobuf, ARG_mode }; + enum { ARG_format, ARG_audiobuf, ARG_mode, ARG_len }; static const mp_arg_t allowed_args[] = { { MP_QSTR_format, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} }, { MP_QSTR_audiobuf, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, { MP_QSTR_mode, MP_ARG_INT, {.u_int = 0} }, + { MP_QSTR_len, MP_ARG_INT, {.u_int = 0} }, }; mp_arg_val_t vals[MP_ARRAY_SIZE(allowed_args)]; mp_arg_parse_all(n_args - 1, args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, vals); int format = 1; format = vals[ARG_format].u_int; + int play_len = vals[ARG_len].u_int; #if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) - if(format != HELIOS_AUDIO_FORMAT_PCM && format != HELIOS_AUDIO_FORMAT_WAVPCM && format != HELIOS_AUDIO_FORMAT_MP3 && format != HELIOS_AUDIO_FORMAT_AMRNB - && format != HELIOS_AUDIO_FORMAT_AMRWB && format != HELIOS_AUDIO_FORMAT_AAC && format != HELIOS_AUDIO_FORMAT_M4A && format != HELIOS_AUDIO_FORMAT_TS) + if(format <= HELIOS_AUDIO_FORMAT_UNKNOWN || format >= HELIOS_AUDIO_FORMAT_MAX) { mp_raise_ValueError(MP_ERROR_TEXT("Unsupport format!")); return mp_obj_new_int(-1); } - #endif #if defined (PLAT_ASR) @@ -995,13 +1098,18 @@ STATIC mp_obj_t helios_play_stream_start(size_t n_args, const mp_obj_t *args, mp mp_raise_ValueError(MP_ERROR_TEXT("invalid audio_buff data")); } } -#if defined (PLAT_ASR) || defined(PLAT_ASR_1606) || defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) - #if CONFIG_AUDIO_MP3 +#if defined (PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) \ + || defined(PLAT_ASR_1602) Helios_mp3_stream_close_flag(vals[ARG_mode].u_int); - #endif #endif MP_THREAD_GIL_EXIT(); - int ret = Helios_Audio_StreamPlayStart(format, buff_a.buf, buff_a.len, HELIOS_AUDIO_PLAY_TYPE_LOCAL, self->device, audio_play_callback); + int ret = 0; + audio.cur_type = AUDIO_STREAM; + if(play_len == 0) { + ret = Helios_Audio_StreamPlayStart(format, buff_a.buf, buff_a.len, HELIOS_AUDIO_PLAY_TYPE_LOCAL, self->device, audio_play_callback); + } else { + ret = Helios_Audio_StreamPlayStart(format, buff_a.buf, play_len, HELIOS_AUDIO_PLAY_TYPE_LOCAL, self->device, audio_play_callback); + } MP_THREAD_GIL_ENTER(); return mp_obj_new_int(ret); } @@ -1074,6 +1182,25 @@ STATIC mp_obj_t helios_play_stream_stop(mp_obj_t self_in) STATIC MP_DEFINE_CONST_FUN_OBJ_1(helios_play_stream_stop_obj, helios_play_stream_stop); +STATIC mp_obj_t helios_audio_play_stop(mp_obj_t self_in) +{ + int ret = 0; + if(audio.cur_type == AUDIO_MONTAGE || audio.cur_type == AUDIO_STREAM) + { + ret = mp_obj_get_int(helios_play_stream_stop(self_in)); + } + else if(audio.cur_type == AUDIO_FILE) + { + ret = mp_obj_get_int(helios_play_file_stop(self_in)); + } + if(1 == ret) + { + ret = 0; + } + return mp_obj_new_int(ret); +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(helios_audio_play_stop_obj, helios_audio_play_stop); + /*=============================================================================*/ /* FUNCTION: helios_get_audio_state */ @@ -1258,7 +1385,8 @@ STATIC mp_obj_t helios_play_frame_jump(size_t n_args, const mp_obj_t *args, mp_m STATIC MP_DEFINE_CONST_FUN_OBJ_KW(helios_play_jump_frame_obj, 1, helios_play_frame_jump); #endif -#if defined (PLAT_ASR) || defined (PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_Unisoc_8910_R05) +#if defined (PLAT_ASR) || defined (PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) \ + || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) || defined(PLAT_ASR_1803s) #ifndef AUDIO_DTMF_TONE_NEW_SUPPORT STATIC const mp_arg_t tone_allowed_args[] = { { MP_QSTR_tone, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} }, @@ -1460,6 +1588,32 @@ STATIC mp_obj_t helios_aud_tone_play(size_t n_args, const mp_obj_t *p_args, mp_m aud_tone_flag = 0; } + if(0 != time && 0 == aud_tone_thread_id) + { + Helios_ThreadAttr attr = {0}; + attr.name = "aud_tone_stop"; + attr.stack_size = 4096; + attr.priority = 95; + attr.entry = helios_aud_tone_stop_task; + + aud_tone_queue_msg = Helios_MsgQ_Create(10, sizeof(uint8_t)); + if (!aud_tone_queue_msg) + { + return mp_obj_new_int(-1); + } + + aud_tone_thread_id = Helios_Thread_Create(&attr); + if (aud_tone_thread_id == 0) + { + Helios_MsgQ_Delete(aud_tone_queue_msg); + return mp_obj_new_int(-1); + } + } + + while(aud_tone_flag == 1){ + Helios_msleep(20); + } + if(0 != time) { Helios_OSTimerAttr OSTimerAttr = { @@ -1485,32 +1639,8 @@ STATIC mp_obj_t helios_aud_tone_play(size_t n_args, const mp_obj_t *p_args, mp_m return mp_obj_new_int(-1); } - if(0 != time && 0 == aud_tone_thread_id) - { - Helios_ThreadAttr attr = {0}; - attr.name = "aud_tone_stop"; - attr.stack_size = 4096; - attr.priority = 95; - attr.entry = helios_aud_tone_stop_task; - - aud_tone_queue_msg = Helios_MsgQ_Create(10, sizeof(uint8_t)); - if (!aud_tone_queue_msg) - { - return mp_obj_new_int(-1); - } - - aud_tone_thread_id = Helios_Thread_Create(&attr); - if (aud_tone_thread_id == 0) - { - Helios_MsgQ_Delete(aud_tone_queue_msg); - return mp_obj_new_int(-1); - } - } - - while(aud_tone_flag == 1){ - Helios_msleep(20); - } MP_THREAD_GIL_EXIT(); + aud_tone_flag = 1; ret = Helios_Audio_Play_Tone(tone, (uint32_t)time); MP_THREAD_GIL_ENTER(); if(ret != 0) @@ -1520,7 +1650,6 @@ STATIC mp_obj_t helios_aud_tone_play(size_t n_args, const mp_obj_t *p_args, mp_m aud_tone_flag = 0; return mp_obj_new_int(-1); } - aud_tone_flag = 1; return mp_obj_new_int(0); } STATIC MP_DEFINE_CONST_FUN_OBJ_KW(mp_helios_aud_tone_play_obj, 1, helios_aud_tone_play); @@ -1532,9 +1661,11 @@ STATIC mp_obj_t helios_aud_tone_play_stop(mp_obj_t self_in) Helios_Audio_Stop_Tone(); #ifdef AUDIO_DTMF_TONE_NEW_SUPPORT Helios_Audio_Stop_DTMF(); + #endif - if(aud_tone_timer != 0) + if(aud_tone_timer != 0) { ret = Helios_OSTimer_Stop(aud_tone_timer); + } return mp_obj_new_int(ret); } @@ -1663,7 +1794,8 @@ int audio_err_handle(void) //================================montage Handel start===================================================== -#if defined (PLAT_Unisoc) || defined (PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_EIGEN) || defined(PLAT_Unisoc_8910_R05) +#if defined (PLAT_Unisoc) || defined (PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_EIGEN) \ +|| defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) #include "helios_os.h" @@ -1767,7 +1899,6 @@ static char montage_file_preprocessing(char *montage_name) montage_index = __check_is_preprocessed(montage_name); if (montage_index != -1) { - HELIOS_AUDIO_LOG("%s has been pretreated\n", montage_name); return montage_index; } @@ -1871,7 +2002,6 @@ static montage_elem *__getElemByName(char *montage_name, char *file_name) { return NULL; } - HELIOS_AUDIO_LOG("__getElemByName montage index = %d\n", montage_index); elem = (montage_elem *)(all_montage[montage_index].file_info_buf); sprintf(actual_name, file_name + 3, strlen(file_name) - 3); @@ -1879,10 +2009,8 @@ static montage_elem *__getElemByName(char *montage_name, char *file_name) uint32_t i = 0; for (i = 0; i < all_montage[montage_index].file_num; i++) { - HELIOS_AUDIO_LOG("actual_name:%s, elem:%s, offset %d, size=%d\n", actual_name, elem->file_name, elem->offset, elem->size); if (0 == strncmp(file_name, elem->file_name, strlen(actual_name)+3)) { - HELIOS_AUDIO_LOG("elem addr : 0x%x\n", elem); return elem; } elem++; @@ -2003,8 +2131,6 @@ static int ql_audio_play_morefiles(char *montage_file, char *files, montage_play uint32_t cur_count_offset = 0; uint32_t cur_count_size = 0; - HELIOS_AUDIO_LOG("files = %s\n", files); - if (strncmp(files, "mp3files=", 9) == 0) { // file_type = 1; @@ -2026,7 +2152,6 @@ static int ql_audio_play_morefiles(char *montage_file, char *files, montage_play /* parse files info */ p = strtok(files_tmp + 9, "+"); - HELIOS_AUDIO_LOG("path_dir = %s\n", p); if (p != NULL) { HELIOS_AUDIO_LOG("p = %s\n", p); @@ -2043,7 +2168,7 @@ static int ql_audio_play_morefiles(char *montage_file, char *files, montage_play elem = __getElemByName(montage_file, p); if (elem != NULL) { - HELIOS_AUDIO_LOG("XXX elem:%s, offset %d, size=%d\n", elem->file_name, elem->offset, elem->size); + //HELIOS_AUDIO_LOG("XXX elem:%s, offset %d, size=%d\n", elem->file_name, elem->offset, elem->size); item = calloc(1, sizeof(struct mp3_file_list)); sprintf(item->file_name, "%s", p); item->elem = elem; @@ -2269,7 +2394,7 @@ int Helios_Audio_MontageFilePlayStart(char *montage_name, char *file_name, Helio if (montage_play_queue) { - return Helios_MsgQ_Put(montage_play_queue, (const void *)&play_elem, sizeof(montage_play_elem), HELIOS_NO_WAIT); + return Helios_MsgQ_Put(montage_play_queue, (const void *)&play_elem, sizeof(montage_play_elem), HELIOS_NO_WAIT); } return 0; @@ -2594,6 +2719,10 @@ static mp_obj_t helios_play_montage_file_start(size_t n_args, const mp_obj_t *ar audio.audio_state = AUDIO_IDLE; Helios_Mutex_Unlock(audio.queue_mutex); } + else + { + memcpy(audio_playing_file_name, vfs_monFile ,strlen(vfs_monFile)); + } return mp_obj_new_int(ret); } @@ -2602,7 +2731,7 @@ static MP_DEFINE_CONST_FUN_OBJ_KW(helios_play_montage_file_start_obj, 1, helios_ //================================montage Handel end===================================================== -#if defined (PLAT_ASR) || defined(PLAT_ASR_1606) +#if defined (PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602) #if CONFIG_AUDIO_MP3 STATIC mp_obj_t helios_aud_mp3_clear_cache(mp_obj_t self_in) { @@ -2628,9 +2757,11 @@ const mp_obj_type_t audio_audio_pcm; STATIC const mp_rom_map_elem_t audio_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&helios_audio___del___obj) }, { MP_ROM_QSTR(MP_QSTR_play), MP_ROM_PTR(&helios_play_file_start_obj) }, - { MP_ROM_QSTR(MP_QSTR_stop), MP_ROM_PTR(&helios_play_file_stop_obj) }, + { MP_ROM_QSTR(MP_QSTR_stop), MP_ROM_PTR(&helios_audio_play_stop_obj) }, { MP_ROM_QSTR(MP_QSTR_stopAll), MP_ROM_PTR(&helios_play_file_stop_all_obj) }, { MP_ROM_QSTR(MP_QSTR_getState), MP_ROM_PTR(&helios_get_audio_state_obj) }, + { MP_ROM_QSTR(MP_QSTR_getPlayState), MP_ROM_PTR(&helios_get_audio_play_state_obj) }, + { MP_ROM_QSTR(MP_QSTR_getPlayFile), MP_ROM_PTR(&helios_get_audio_playing_file_name_obj) }, #ifdef AUDIO_DTMF_TONE_NEW_SUPPORT { MP_ROM_QSTR(MP_QSTR_setToneVolume), MP_ROM_PTR(&helios_set_ToneVolume_obj) }, #endif @@ -2642,7 +2773,8 @@ STATIC const mp_rom_map_elem_t audio_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_setCallback), MP_ROM_PTR(&helios_set_audio_callback_obj) }, { MP_ROM_QSTR(MP_QSTR_playStream), MP_ROM_PTR(&helios_play_stream_start_obj) }, { MP_ROM_QSTR(MP_QSTR_stopPlayStream), MP_ROM_PTR(&helios_play_stream_stop_obj) }, -#if defined (PLAT_ASR) || defined (PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined (PLAT_Unisoc_8850) || defined(PLAT_EIGEN) || defined(PLAT_Unisoc_8910_R05) +#if defined (PLAT_ASR) || defined (PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined (PLAT_Unisoc_8850) \ + || defined(PLAT_EIGEN) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) #if !CONFIG_AUDIO_PWM #if !defined(PLAT_EIGEN) { MP_ROM_QSTR(MP_QSTR_set_channel), MP_ROM_PTR(&helios_set_channel_obj) }, @@ -2651,18 +2783,25 @@ STATIC const mp_rom_map_elem_t audio_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_set_pa), MP_ROM_PTR(&helios_set_pa_obj) }, { MP_ROM_QSTR(MP_QSTR_set_open_pa_delay), MP_ROM_PTR(&helios_set_open_pa_delay_obj) }, { MP_ROM_QSTR(MP_QSTR_setSpeakerpaCallback), MP_ROM_PTR(&helios_set_speakerpa_callback_obj) }, + { MP_ROM_QSTR(MP_QSTR_setSpeakerpaSwitch), MP_ROM_PTR(&helios_user_speakerpa_switch_obj) }, +#if defined (PLAT_Unisoc) + { MP_ROM_QSTR(MP_QSTR_internal_pa_type), MP_ROM_PTR(&helios_internal_pa_type_obj) }, +#endif + #endif -#if defined (PLAT_ASR) || defined (PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_Unisoc_8910_R05) +#if defined (PLAT_ASR) || defined (PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_Unisoc_8910_R05) \ + || defined(PLAT_ASR_1602) || defined(PLAT_ASR_1803s) { MP_ROM_QSTR(MP_QSTR_aud_tone_play), MP_ROM_PTR(&mp_helios_aud_tone_play_obj) }, { MP_ROM_QSTR(MP_QSTR_aud_tone_play_stop), MP_ROM_PTR(&helios_aud_tone_play_stop_obj) }, -#if defined (PLAT_ASR) || defined(PLAT_ASR_1606) +#if defined (PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602) #if CONFIG_AUDIO_MP3 { MP_ROM_QSTR(MP_QSTR_aud_cache_clear), MP_ROM_PTR(&helios_aud_clear_cache_obj) }, { MP_ROM_QSTR(MP_QSTR_aud_cache_size), MP_ROM_PTR(&helios_aud_cache_size_obj) }, #endif #endif #endif -#if defined (PLAT_ASR) || defined (PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_EIGEN) || defined(PLAT_Unisoc_8910_R05) +#if defined (PLAT_ASR) || defined (PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_EIGEN) \ + || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) { MP_ROM_QSTR(MP_QSTR_montage_play), MP_ROM_PTR(&helios_play_montage_file_start_obj) }, #endif #if CONFIG_AUDIO @@ -2678,7 +2817,7 @@ STATIC const mp_rom_map_elem_t audio_locals_dict_table[] = { #if defined (PLAT_Unisoc) || defined (PLAT_EIGEN) || defined(PLAT_Unisoc_8910_R05) { MP_ROM_QSTR(MP_QSTR_setGainTabel), MP_ROM_PTR(&helios_setgaintabel_obj) }, #endif -#if defined (PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1803s) +#if defined (PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1602) { MP_ROM_QSTR(MP_QSTR_PCM), MP_ROM_PTR(&audio_audio_pcm) }, #endif }; @@ -2691,7 +2830,7 @@ const mp_obj_type_t audio_audio_type = { .locals_dict = (mp_obj_dict_t *)&audio_locals_dict, }; -#if defined (PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1803s) +#if defined (PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1602) #define QL_PCM_BLOCK_FLAG (0x01) #define QL_PCM_NONBLOCK_FLAG (0x02) diff --git a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/audio_queue.c b/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/audio_queue.c index b46bf990..c2593b68 100644 --- a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/audio_queue.c +++ b/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/audio_queue.c @@ -27,7 +27,7 @@ AUDIO_T audio = {0}; extern int audio_play_callback(char *ptr, size_t lens, Helios_EnumAudPlayerState state); - +extern char audio_playing_file_name[256]; /*=============================================================================*/ /* FUNCTION: audio_queue_init */ @@ -130,7 +130,8 @@ int audio_queue_is_full(AUDIO_QUEUE_T *Q) } while (0); -#if defined (PLAT_Unisoc) || defined (PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_EIGEN) || defined(PLAT_Unisoc_8910_R05) +#if defined (PLAT_Unisoc) || defined (PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_EIGEN) \ + || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) extern int Helios_Audio_MontageFilePlayStart(char *montage_name, char *file_name, Helios_AudPlayerType type, helios_cb_on_player usr_cb, uint8_t device); #endif void helios_audio_play_queue(void) @@ -183,10 +184,16 @@ void helios_audio_play_queue(void) #if MICROPY_QPY_AUDIO_TTS if (audio_type == AUDIO_TTS) { - #if defined (PLAT_ASR) || defined (PLAT_Unisoc) || defined (PLAT_ASR_1606) || defined (PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) + #if defined (PLAT_ASR) || defined (PLAT_Unisoc) || defined (PLAT_ASR_1606) || defined (PLAT_ASR_1609) \ + || defined (PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) extern void Helios_Set_MP_TTS_Callback(c_callback_t* callback); Helios_Set_MP_TTS_Callback(&audio.audio_queue[i].audio_data[front].mp_cb); ret = Helios_TTS_Start(mode, data, strlen(data)); + if(ret != -1) + { + memcpy(audio_playing_file_name, data, strlen(data)); + } + #endif } else @@ -194,12 +201,21 @@ void helios_audio_play_queue(void) if (audio_type == AUDIO_FILE) { ret = Helios_Audio_FilePlayStart(data, HELIOS_AUDIO_PLAY_TYPE_LOCAL, audio_play_callback); + if(ret != -1) + { + memcpy(audio_playing_file_name, data, strlen(data)); + } HELIOS_AUDIO_QUEUE_LOG("Helios_Audio_FilePlayStart, ret = %d\r\n", ret); } - #if defined (PLAT_Unisoc) || defined (PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_EIGEN) || defined(PLAT_Unisoc_8910_R05) + #if defined (PLAT_Unisoc) || defined (PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_EIGEN) \ + || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) else if (audio_type == AUDIO_MONTAGE) { ret = Helios_Audio_MontageFilePlayStart(mondata, data, HELIOS_AUDIO_PLAY_TYPE_LOCAL, audio_play_callback, device); + if(ret != -1) + { + memcpy(audio_playing_file_name, mondata, strlen(mondata)); + } HELIOS_AUDIO_QUEUE_LOG("Helios_Audio_MontageFilePlayStart, ret = %d\r\n", ret); } #endif @@ -248,9 +264,12 @@ void helios_audio_queue_play_task(void *argv) break; case AUDIO_FINISH_EVENT: HELIOS_AUDIO_QUEUE_LOG("----AUDIO_FINISH_EVENT---\r\n"); + memset(audio_playing_file_name, 0, sizeof(audio_playing_file_name)); #if !defined (PLAT_Unisoc) && !defined(PLAT_EIGEN) && !defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) + #ifndef CONFIG_AUDIO Helios_Audio_StreamPlayStop(); #endif + #endif //HELIOS_AUDIO_QUEUE_LOG("start queue paly...\r\n"); helios_audio_play_queue(); break; diff --git a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/audio_queue.h b/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/audio_queue.h index d6c244ae..8c644c50 100644 --- a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/audio_queue.h +++ b/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/audio_queue.h @@ -67,6 +67,7 @@ typedef enum AUDIO_TTS = 1, AUDIO_FILE, AUDIO_MONTAGE, + AUDIO_STREAM, }AUDIO_TYPE_E; typedef enum diff --git a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/audio_record.c b/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/audio_record.c index f1617434..c5116239 100644 --- a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/audio_record.c +++ b/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/audio_record.c @@ -68,7 +68,8 @@ static c_callback_t *g_record_callback; static c_callback_t *callback_cur; //extern int device; -#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) +#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_Unisoc_8850) \ + || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) #define GET_FILE_VFS_PATH(x, y) get_vfs_path(x,y) #else #define GET_FILE_VFS_PATH(x, y) \ @@ -128,12 +129,13 @@ STATIC mp_obj_t audio_record_make_new(const mp_obj_type_t *type, size_t n_args, self->device = mp_obj_get_int(args[0]); if ((self->device < HELIOS_OUTPUT_RECEIVER) || (self->device > HELIOS_OUTPUT_SPEAKER)) { - mp_raise_ValueError("invalid device index, the value of device should be in[0,2]"); + mp_raise_ValueError(MP_ERROR_TEXT("invalid device index, the value of device should be in[0,2]")); } if (!audio_channel_check(self->device)) { - mp_raise_msg_varg(&mp_type_ValueError, "The current platform does not support device %d.", self->device); + mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("The current platform does not support device %d."), self->device); + } } audio_record_printf("create record obj, n_args = %d, device = %d\r\n", n_args, self->device); @@ -238,9 +240,9 @@ static int check_format(char *path) { if(strncmp(st_old, "wav", 3)==0){ return FORMAT_WAV; - }/* else if(strncmp(st_old, "mp3", 3)==0) { + } else if(strncmp(st_old, "mp3", 3)==0) { return FORMAT_MP3; - }*/ else if(strncmp(st_old, "amr", 3)==0) { + } else if(strncmp(st_old, "amr", 3)==0) { return FORMAT_AMR; } else { return -3; @@ -339,7 +341,7 @@ STATIC mp_obj_t helios_audio_record_stream_start(size_t n_args, const mp_obj_t * audio_record_obj_t *self = MP_OBJ_TO_PTR(p_args[0]); if(self->isbusy == 1 || record_state == 1) { - mp_raise_ValueError("record is busy\n"); + mp_raise_ValueError(MP_ERROR_TEXT("record is busy\n")); return mp_obj_new_int(-1); } @@ -350,14 +352,14 @@ STATIC mp_obj_t helios_audio_record_stream_start(size_t n_args, const mp_obj_t * callback_cur = self->callback; - if((format != HELIOS_AUDIO_FORMAT_AMRNB && format != HELIOS_AUDIO_FORMAT_AMRWB) || !(samplerate == 8000 || samplerate == 16000)) { - mp_raise_ValueError("Parameter error\n"); + if(format != HELIOS_AUDIO_FORMAT_AMRNB && format != HELIOS_AUDIO_FORMAT_AMRWB && format != HELIOS_AUDIO_FORMAT_MP3) { + mp_raise_ValueError(MP_ERROR_TEXT("Parameter error\n")); return mp_obj_new_int(-1); } //check time is valid if(time < 0) { - mp_raise_ValueError("Record time must be larger than or equal to 0.\n"); + mp_raise_ValueError(MP_ERROR_TEXT("Record time must be larger than or equal to 0.\n")); return mp_obj_new_int(-1); } @@ -567,6 +569,15 @@ STATIC mp_obj_t helios_audio_record_start(mp_obj_t self_in, mp_obj_t path, mp_ob record_info.cb = (void *)helios_file_record_cb; ret = Helios_Audio_FileRecordStart(self->file_name, &record_info); } + else if(format==FORMAT_MP3){ + record_conf.samplerate = 22050; + Helios_AUDRecordInitStruct record_info; + record_info.record_para = &record_conf; + record_info.format = HELIOS_AUDIO_FORMAT_MP3; + record_info.type = HELIOS_REC_TYPE_MIC; + record_info.cb = (void *)helios_file_record_cb; + ret = Helios_Audio_FileRecordStart(self->file_name, &record_info); + } else{ self->isbusy = 0; record_state = 0; @@ -831,9 +842,45 @@ STATIC mp_obj_t helios_set_record_callback(mp_obj_t self_in, mp_obj_t callback) } STATIC MP_DEFINE_CONST_FUN_OBJ_2(mp_helios_record_file_end_callback_obj, helios_set_record_callback); +#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) +STATIC mp_obj_t helios_audio_record_gain_set(size_t n_args, const mp_obj_t *args) +{ + //audio_record_obj_t *self = MP_OBJ_TO_PTR(args[0]); + int codec_gain = mp_obj_get_int(args[1]); + int dsp_gain = mp_obj_get_int(args[2]); + + if (!(codec_gain >= 0 && codec_gain <= 4)) { + mp_raise_ValueError(MP_ERROR_TEXT("invalid codec_gain value, must be in [0,4]")); + } + if (!(dsp_gain >= -36 && dsp_gain <= 12)) { + mp_raise_ValueError(MP_ERROR_TEXT("invalid dsp_gain value, must be in [-36,12]")); + } + audio_record_printf("codec_gain = %d, dsp_gain = %d\n",codec_gain, dsp_gain); + Helios_Audio_GainSet(codec_gain, dsp_gain); + + return mp_obj_new_int(0); +} +STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_helios_audio_record_gain_set_obj, 3, 3, helios_audio_record_gain_set); + +STATIC mp_obj_t helios_audio_record_gain_get(mp_obj_t self_in) +{ + short int codec_gain = 0; + char dsp_gain = 0; + + Helios_Audio_GainGet(&codec_gain, &dsp_gain); + audio_record_printf("dsp_gain = %d\n", dsp_gain); + mp_obj_t gain_list[2] = { + mp_obj_new_int(codec_gain), + mp_obj_new_int((signed char)dsp_gain) + }; + return mp_obj_new_list(2, gain_list); +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_helios_audio_record_gain_get_obj, helios_audio_record_gain_get); +#endif +#ifdef PLAT_ASR STATIC mp_obj_t helios_audio_record_gain(size_t n_args, const mp_obj_t *args) { //audio_record_obj_t *self = MP_OBJ_TO_PTR(args[0]); @@ -854,7 +901,7 @@ STATIC mp_obj_t helios_audio_record_gain(size_t n_args, const mp_obj_t *args) return mp_obj_new_int(0); } STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_helios_record_file_gain_obj,3,3, helios_audio_record_gain); -#ifdef PLAT_ASR + /*=============================================================================*/ /* FUNCTION: helios_amrenc_dtx_enable */ /*=============================================================================*/ @@ -904,6 +951,7 @@ static int play_callback(char *p_data, int len, Helios_EnumAudPlayerState state) return 0; } +#if MICROPY_QPY_AUDIO_AUDIO STATIC mp_obj_t helios_audio_record_play(mp_obj_t self_in,mp_obj_t path, mp_obj_t audio_path) { @@ -939,7 +987,7 @@ STATIC mp_obj_t helios_audio_record_play(mp_obj_t self_in,mp_obj_t path, mp_obj_ return mp_obj_new_int(0); } STATIC MP_DEFINE_CONST_FUN_OBJ_3(mp_helios_record_file_play_obj, helios_audio_record_play); - +#endif STATIC mp_obj_t helios_audio_deinit(mp_obj_t self_in) { int ret = 0; @@ -963,10 +1011,23 @@ STATIC mp_obj_t helios_audio_deinit(mp_obj_t self_in) } STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_helios_record_deinit_obj, helios_audio_deinit); +#if CONFIG_AUDIO_RECORD_MP3 +STATIC mp_obj_t helios_set_mp3_record_bitr(mp_obj_t self_in, mp_obj_t bitr) +{ + int bitr_value = mp_obj_get_int(bitr); + extern void Helios_mp3Record_set_bitr(int val); + Helios_mp3Record_set_bitr(bitr_value); + return mp_obj_new_int(0); +} +STATIC MP_DEFINE_CONST_FUN_OBJ_2(mp_helios_record_mp3_setBitr_obj, helios_set_mp3_record_bitr); +#endif STATIC const mp_rom_map_elem_t audio_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&mp_helios_record_deinit_obj) }, { MP_ROM_QSTR(MP_QSTR_start), MP_ROM_PTR(&mp_helios_record_file_start_obj) }, +#if CONFIG_AUDIO_RECORD_MP3 + { MP_ROM_QSTR(MP_QSTR_set_bitr), MP_ROM_PTR(&mp_helios_record_mp3_setBitr_obj) }, +#endif { MP_ROM_QSTR(MP_QSTR_stream_start), MP_ROM_PTR(&mp_helios_record_stream_start_obj) }, { MP_ROM_QSTR(MP_QSTR_stream_read), MP_ROM_PTR(&mp_helios_record_stream_read_obj) }, { MP_ROM_QSTR(MP_QSTR_stream_stop), MP_ROM_PTR(&mp_helios_record_stream_stop_obj) }, @@ -978,21 +1039,29 @@ STATIC const mp_rom_map_elem_t audio_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_exists), MP_ROM_PTR(&mp_helios_record_file_exists_obj) }, { MP_ROM_QSTR(MP_QSTR_isBusy), MP_ROM_PTR(&mp_helios_record_file_isBusy_obj) }, { MP_ROM_QSTR(MP_QSTR_end_callback), MP_ROM_PTR(&mp_helios_record_file_end_callback_obj) }, - { MP_ROM_QSTR(MP_QSTR_gain), MP_ROM_PTR(&mp_helios_record_file_gain_obj) }, #ifdef PLAT_ASR - //{ MP_ROM_QSTR(MP_QSTR_gain), MP_ROM_PTR(&mp_helios_record_file_gain_obj) }, + { MP_ROM_QSTR(MP_QSTR_gain), MP_ROM_PTR(&mp_helios_record_file_gain_obj) }, { MP_ROM_QSTR(MP_QSTR_WAV), MP_ROM_INT(HELIOS_AUDIO_FORMAT_WAVPCM) }, { MP_ROM_QSTR(MP_QSTR_AMRNB), MP_ROM_INT(HELIOS_AUDIO_FORMAT_AMRNB) }, { MP_ROM_QSTR(MP_QSTR_AMRWB), MP_ROM_INT(HELIOS_AUDIO_FORMAT_AMRWB) }, { MP_ROM_QSTR(MP_QSTR_amrEncDtx_enable), MP_ROM_PTR(&helios_amrenc_dtx_enable_obj) }, #endif +#if MICROPY_QPY_AUDIO_AUDIO { MP_ROM_QSTR(MP_QSTR_play), MP_ROM_PTR(&mp_helios_record_file_play_obj) }, +#endif #if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) { MP_ROM_QSTR(MP_QSTR_PCM), MP_ROM_INT(HELIOS_AUDIO_FORMAT_PCM) }, { MP_ROM_QSTR(MP_QSTR_WAV), MP_ROM_INT(HELIOS_AUDIO_FORMAT_WAVPCM) }, { MP_ROM_QSTR(MP_QSTR_AMRNB), MP_ROM_INT(HELIOS_AUDIO_FORMAT_AMRNB) }, { MP_ROM_QSTR(MP_QSTR_AMRWB), MP_ROM_INT(HELIOS_AUDIO_FORMAT_AMRWB) }, #endif +#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) + { MP_ROM_QSTR(MP_QSTR_gain_set), MP_ROM_PTR(&mp_helios_audio_record_gain_set_obj) }, + { MP_ROM_QSTR(MP_QSTR_gain_get), MP_ROM_PTR(&mp_helios_audio_record_gain_get_obj) }, + { MP_ROM_QSTR(MP_QSTR_WAV), MP_ROM_INT(HELIOS_AUDIO_FORMAT_WAVPCM) }, + { MP_ROM_QSTR(MP_QSTR_AMRNB), MP_ROM_INT(HELIOS_AUDIO_FORMAT_AMRNB) }, + { MP_ROM_QSTR(MP_QSTR_AMRWB), MP_ROM_INT(HELIOS_AUDIO_FORMAT_AMRWB) }, +#endif }; STATIC MP_DEFINE_CONST_DICT(record_locals_dict, audio_locals_dict_table); diff --git a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/audio_tts.c b/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/audio_tts.c index 83f0717a..0cbcfe9d 100644 --- a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/audio_tts.c +++ b/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/audio_tts.c @@ -35,6 +35,8 @@ enum { }; const mp_obj_type_t audio_tts_type; +extern char audio_playing_file_name[256]; + typedef struct _audio_tts_obj_t { mp_obj_base_t base; @@ -168,12 +170,12 @@ STATIC mp_obj_t audio_tts_make_new(const mp_obj_type_t *type, int device = mp_obj_get_int(args[0]); if (device < 0 || device > 2) { - mp_raise_ValueError("invalid device index, the value of device should be in[0,2]"); + mp_raise_ValueError(MP_ERROR_TEXT("invalid device index, the value of device should be in[0,2]")); } if (!audio_channel_check(device)) { - mp_raise_msg_varg(&mp_type_ValueError, "The current platform does not support device %d.", device); + mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("The current platform does not support device %d."), device); } Helios_Audio_SetAudioChannle(device); @@ -207,7 +209,7 @@ STATIC mp_obj_t audio_tts_make_new(const mp_obj_type_t *type, if (!audio.queue_msg) { Helios_Mutex_Delete(audio.queue_mutex); - mp_raise_ValueError("create audio object failed, can not create msgQ."); + mp_raise_ValueError(MP_ERROR_TEXT("create audio object failed, can not create msgQ.")); } Helios_ThreadAttr attr = {0}; @@ -221,7 +223,7 @@ STATIC mp_obj_t audio_tts_make_new(const mp_obj_type_t *type, { Helios_MsgQ_Delete(audio.queue_msg); Helios_Mutex_Delete(audio.queue_mutex); - mp_raise_ValueError("create audio object failed, can not create queue play task."); + mp_raise_ValueError(MP_ERROR_TEXT("create audio object failed, can not create queue play task.")); } } @@ -232,7 +234,7 @@ STATIC mp_obj_t audio_tts_make_new(const mp_obj_type_t *type, } else { - mp_raise_ValueError("TTS Init failed."); + mp_raise_ValueError(MP_ERROR_TEXT("TTS Init failed.")); } Helios_TTS_SetSpeed(self->tts_speed); @@ -282,7 +284,7 @@ STATIC mp_obj_t audio_tts_play(size_t n_args, const mp_obj_t *args, mp_map_t *kw if ((new_mode < 1) || (new_mode > 3)) { HELIOS_TTS_LOG("new_mode is %d\n",new_mode); - mp_raise_ValueError("invalid mode"); + mp_raise_ValueError(MP_ERROR_TEXT("invalid mode")); return mp_obj_new_int(-1); } @@ -299,15 +301,15 @@ STATIC mp_obj_t audio_tts_play(size_t n_args, const mp_obj_t *args, mp_map_t *kw int new_priority = vals[ARG_priority].u_int; int new_breakin = vals[ARG_breakin].u_int; if (new_priority < 0 || new_priority > 4) { - mp_raise_ValueError("invalid priority value, must be in [0,4]"); + mp_raise_ValueError(MP_ERROR_TEXT("invalid priority value, must be in [0,4]")); } if (new_breakin != 0 && new_breakin != 1) { - mp_raise_ValueError("invalid breakin value, must be in [0,1]"); + mp_raise_ValueError(MP_ERROR_TEXT("invalid breakin value, must be in [0,1]")); } mp_obj_t new_mp_cb = vals[ARG_cb].u_obj; if(bufinfo.len > MAX_TTS_TEXT_LEN) { - mp_raise_msg_varg(&mp_type_ValueError, "The string length cannot be greater than %d", MAX_TTS_TEXT_LEN); + mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("The string length cannot be greater than %d"), MAX_TTS_TEXT_LEN); } Helios_Mutex_Lock(audio.queue_mutex, HELIOS_WAIT_FOREVER); @@ -396,6 +398,35 @@ STATIC mp_obj_t audio_tts_play(size_t n_args, const mp_obj_t *args, mp_map_t *kw Helios_Audio_FilePlayStop(); break; } + case AUDIO_MONTAGE: + { + Helios_Mutex_Lock(audio.montage_mutex, HELIOS_WAIT_FOREVER); + HELIOS_TTS_LOG("---- stop audio montage play. ----\r\n"); + extern int helios_set_montage_break_flag(char set); + helios_set_montage_break_flag(1); + audio.montage_is_stopping = 1; +#if CONFIG_AUDIO + extern void helios_audio_montage_stop(); + helios_audio_montage_stop(); +#endif + #if !defined(PLAT_EIGEN) + extern int audio_err_handle(void); + audio_err_handle(); + #endif + Helios_msleep(200); + + Helios_Audio_StreamPlayStop(); + audio.montage_is_stopping = 0; + Helios_Mutex_Unlock(audio.montage_mutex); + Helios_msleep(200); + uint8_t audio_msg = AUDIO_FINISH_EVENT; + if (Helios_MsgQ_Put(audio.queue_msg, (const void *)&audio_msg, sizeof(uint8_t), HELIOS_NO_WAIT) == -1) + { + HELIOS_TTS_LOG("send audio msg failed[%u].\r\n", audio_msg); + return mp_obj_new_int(-1); + } + break; + } default: { HELIOS_TTS_LOG("Unknown audio type.\r\n"); @@ -528,6 +559,11 @@ STATIC mp_obj_t audio_tts_play(size_t n_args, const mp_obj_t *args, mp_map_t *kw Helios_Set_MP_TTS_Callback(&mp_cb); int ret = Helios_TTS_Start(new_mode, bufinfo.buf, bufinfo.len); + if(ret != -1) + { + memcpy(audio_playing_file_name, bufinfo.buf, bufinfo.len); + } + MP_THREAD_GIL_ENTER(); if (ret == -1) { @@ -609,7 +645,7 @@ STATIC mp_obj_t aduio_tts_set_volume(mp_obj_t self_in, mp_obj_t volume) int index = mp_obj_get_int(volume); if ((index > 9) || (index < 0)) { - mp_raise_ValueError("invalid value,TTS volume should be array between [0,9]"); + mp_raise_ValueError(MP_ERROR_TEXT("invalid value,TTS volume should be array between [0,9]")); return mp_obj_new_int(-1); } diff --git a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/machine_lcd.c b/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/machine_lcd.c index 30f66026..3a71da1b 100644 --- a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/machine_lcd.c +++ b/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/machine_lcd.c @@ -458,6 +458,7 @@ STATIC mp_obj_t machine_lcd_init_helper(machine_lcd_obj_t *self, mp_uint_t n_arg STATIC mp_obj_t machine_lcd_init(size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { + //is_first_make_new = 1; machine_lcd_init_helper(args[0], n_args - 1, args + 1, kw_args); return mp_obj_new_int(0); } diff --git a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modGsensor_SC7A20.c b/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modGsensor_SC7A20.c index 27fd8f48..9609bf97 100644 --- a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modGsensor_SC7A20.c +++ b/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modGsensor_SC7A20.c @@ -290,11 +290,13 @@ unsigned char Gsensor_init_flag = 0; float x,y,z; bool SC7A20_INT_STATUS = true; unsigned int SC7A20_STATUS_COUNT = 3; +//#include "lvgl.h" unsigned int SL_SC7A20_PEDO_KCAL_WRIST_SLEEP_SWAY_L_ALGO(void) { #if SL_Sensor_Algo_Release_Enable==0x00 unsigned char sl_i; #endif + //custom_log("lvgl:LV_DPI_DEF:%d",LV_DPI_DEF); signed short SC7A20_XYZ_Buf[3][32]; unsigned char SC7A20_FIFO_NUM;