音频合成代码更新
authorp15692025051 <846603105@qq.com>
Wed, 10 Jan 2024 06:55:03 +0000 (14:55 +0800)
committerp15692025051 <846603105@qq.com>
Wed, 10 Jan 2024 06:55:03 +0000 (14:55 +0800)
14 files changed:
2.sdk/Helios_SDK/components/audio/amr/amrnb/enc/api/amrnb_enc_api.cpp
2.sdk/Helios_SDK/components/audio/audio.mk
2.sdk/Helios_SDK/components/audio/audio_option.in
2.sdk/Helios_SDK/components/audio/helios_audio_amr.c
2.sdk/Helios_SDK/components/audio/helios_audio_mp3.c
2.sdk/Helios_SDK/components/audio/helios_audio_py.c
2.sdk/Helios_SDK/components/audio/helios_audio_py.h
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/audio_audio.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/audio_queue.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/audio_queue.h
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/audio_record.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/audio_tts.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/machine_lcd.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modGsensor_SC7A20.c

index 5d29c45..4f2e360 100644 (file)
@@ -7,9 +7,9 @@
 #include <string.h>
 #include "gsmamr_enc.h"
 #include "amrnb_enc_api.h"
-#include "audio_file.h"
+#include "helios_audio_fs.h"
+#include <assert.h>
 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);
index 90be90f..6c70c7a 100644 (file)
@@ -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
index a9ae528..3134f6b 100644 (file)
@@ -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.
     
index 4691ea7..d44622e 100644 (file)
@@ -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;
index 9cf345c..d719361 100644 (file)
@@ -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");
index d2795e6..674dec8 100644 (file)
@@ -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);
index b0f1086..ddcd53a 100644 (file)
@@ -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;
 
index 2677d67..dd07da7 100644 (file)
@@ -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)
index b46bf99..c2593b6 100644 (file)
@@ -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;
index d6c244a..8c644c5 100644 (file)
@@ -67,6 +67,7 @@ typedef enum
        AUDIO_TTS = 1,
        AUDIO_FILE,
        AUDIO_MONTAGE,
+       AUDIO_STREAM,
 }AUDIO_TYPE_E;
 
 typedef enum
index f161743..c511623 100644 (file)
@@ -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);
 
index 83f0717..0cbcfe9 100644 (file)
@@ -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);
        }
        
index 30f6602..3a71da1 100644 (file)
@@ -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);
 }
index 27fd8f4..9609bf9 100644 (file)
@@ -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;