苹果耳机静音帧数据增加
authorhcj <1224667075@qq.com>
Thu, 18 Dec 2025 09:51:56 +0000 (17:51 +0800)
committerhcj <1224667075@qq.com>
Thu, 18 Dec 2025 09:51:56 +0000 (17:51 +0800)
code/sdk/zhihui/ai/media/ai_media_service_ext.cpp

index 08bdff6..f4c5a09 100644 (file)
@@ -3,6 +3,15 @@
  * Description: AI voice conversation sample wrapper
  * Author: Media Software Group
  * Create: 2023-07-06
+ * 
+ * Silence Audio Configuration:
+ *   - By default, uses 1100-byte silence audio data (with ID3 tags)
+ *   - To use 288-byte version (pure MP3 frames), define USE_SILENCE_AUDIO_288
+ *   - Both versions use the same variable name: silence_audio
+ *   - Usage in code:
+ *     * silence_audio: array pointer to selected audio data
+ *     * SILENCE_AUDIO_SIZE: macro for size of selected audio data
+ *     * silence_audio_size: const variable for size (same as SILENCE_AUDIO_SIZE)
  */
 
 #include "voice_call_volte_sample_wrapper.h"
 #include "ai_media.h"
 #include "ogg.h"
 #include "cmsis_os2.h"
+
+
 #ifdef __cplusplus
 extern "C" {
 #endif
+// #define USE_SILENCE_AUDIO_288
+// 静音音频数据定义
+// 默认使用1100字节版本,定义 USE_SILENCE_AUDIO_288 可切换到288字节版本
+#ifdef USE_SILENCE_AUDIO_288
+// 288字节版本(纯MP3数据帧,无ID3标签)
+static const unsigned char silence_audio[288] = {
+    0xff, 0xf3, 0x88, 0xc4, 0x00, 0x44, 0xc0, 0x03, 0x48, 0x00, 0x00, 0x00,
+    0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+};
+#define SILENCE_AUDIO_SIZE 288
+
+#else
+// 1100字节版本(包含ID3标签,默认)
+static const unsigned char silence_audio[1100] = {
+    0x49, 0x44, 0x33, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf3, 0x18, 0xc4,
+    0x00, 0x00, 0x00, 0x03, 0x48, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x41, 0x4d,
+    0x45, 0x33, 0x2e, 0x31, 0x30, 0x30, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x4c, 0x41, 0xff, 0xf3, 0x18, 0xc4,
+    0x17, 0x00, 0x00, 0x03, 0x48, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x45, 0x33,
+    0x2e, 0x31, 0x30, 0x30, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x4c, 0x41, 0xff, 0xf3, 0x18, 0xc4,
+    0x2e, 0x00, 0x00, 0x03, 0x48, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x45, 0x33,
+    0x2e, 0x31, 0x30, 0x30, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x4c, 0x41, 0xff, 0xf3, 0x18, 0xc4,
+    0x45, 0x00, 0x00, 0x03, 0x48, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x45, 0x33,
+    0x2e, 0x31, 0x30, 0x30, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x4c, 0x41, 0xff, 0xf3, 0x18, 0xc4,
+    0x5c, 0x00, 0x00, 0x03, 0x48, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x45, 0x33,
+    0x2e, 0x31, 0x30, 0x30, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x4c, 0x41, 0xff, 0xf3, 0x18, 0xc4,
+    0x73, 0x00, 0x00, 0x03, 0x48, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x45, 0x33,
+    0x2e, 0x31, 0x30, 0x30, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x4c, 0x41, 0xff, 0xf3, 0x18, 0xc4,
+    0x8a, 0x00, 0x00, 0x03, 0x48, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x45, 0x33,
+    0x2e, 0x31, 0x30, 0x30, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x4c, 0x41, 0xff, 0xf3, 0x18, 0xc4,
+    0xa1, 0x00, 0x00, 0x03, 0x48, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x45, 0x33,
+    0x2e, 0x31, 0x30, 0x30, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x4c, 0x41, 0xff, 0xf3, 0x18, 0xc4,
+    0xb8, 0x00, 0x00, 0x03, 0x48, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x45, 0x33,
+    0x2e, 0x31, 0x30, 0x30, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x4c, 0x41, 0xff, 0xf3, 0x18, 0xc4,
+    0xcf, 0x00, 0x00, 0x03, 0x48, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x45, 0x33,
+    0x2e, 0x31, 0x30, 0x30, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x4c, 0x41, 0xff, 0xf3, 0x18, 0xc4,
+    0xe6, 0x00, 0x00, 0x03, 0x48, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x45, 0x33,
+    0x2e, 0x31, 0x30, 0x30, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x4c, 0x41, 0xff, 0xf3, 0x18, 0xc4,
+    0xe8, 0x00, 0x00, 0x03, 0x48, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x45, 0x33,
+    0x2e, 0x31, 0x30, 0x30, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x4c, 0x41, 0xff, 0xf3, 0x18, 0xc4,
+    0xe8, 0x00, 0x00, 0x03, 0x48, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x45, 0x33,
+    0x2e, 0x31, 0x30, 0x30, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x4c, 0x41, 0xff, 0xf3, 0x18, 0xc4,
+    0xe8, 0x00, 0x00, 0x03, 0x48, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x45, 0x33,
+    0x2e, 0x31, 0x30, 0x30, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x4c, 0x41, 0xff, 0xf3, 0x18, 0xc4,
+    0xe8, 0x00, 0x00, 0x03, 0x48, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x45, 0x33,
+    0x2e, 0x31, 0x30, 0x30, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x4c, 0x41, 0xff, 0xf3, 0x18, 0xc4,
+    0xe8, 0x00, 0x00, 0x03, 0x48, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x45, 0x33,
+    0x2e, 0x31, 0x30, 0x30, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x4c, 0x41, 0xff, 0xf3, 0x18, 0xc4,
+    0xe8, 0x00, 0x00, 0x03, 0x48, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x45, 0x33,
+    0x2e, 0x31, 0x30, 0x30, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x4c, 0x41, 0xff, 0xf3, 0x18, 0xc4,
+    0xe8, 0x00, 0x00, 0x03, 0x48, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x45, 0x33,
+    0x2e, 0x31, 0x30, 0x30, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x4c, 0x41, 0xff, 0xf3, 0x18, 0xc4,
+    0xe8, 0x00, 0x00, 0x03, 0x48, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x45, 0x33,
+    0x2e, 0x31, 0x30, 0x30, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x4c, 0x41, 0xff, 0xf3, 0x18, 0xc4,
+    0xe8, 0x00, 0x00, 0x03, 0x48, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x45, 0x33,
+    0x2e, 0x31, 0x30, 0x30, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xff, 0xf3, 0x18, 0xc4,
+    0xe8, 0x00, 0x00, 0x03, 0x48, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xff, 0xf3, 0x18, 0xc4,
+    0xe8, 0x00, 0x00, 0x03, 0x48, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xff, 0xf3, 0x18, 0xc4,
+    0xe8, 0x00, 0x00, 0x03, 0x48, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xff, 0xf3, 0x18, 0xc4,
+    0xe8, 0x00, 0x00, 0x03, 0x48, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xff, 0xf3, 0x18, 0xc4,
+    0xe8, 0x00, 0x00, 0x03, 0x48, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xff, 0xf3, 0x18, 0xc4,
+    0xe8, 0x00, 0x00, 0x03, 0x48, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xff, 0xf3, 0x18, 0xc4,
+    0xe8, 0x00, 0x00, 0x03, 0x48, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xff, 0xf3, 0x18, 0xc4,
+    0xe8, 0x00, 0x00, 0x03, 0x48, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xff, 0xf3, 0x18, 0xc4,
+    0xe8, 0x00, 0x00, 0x03, 0x48, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xff, 0xf3, 0x18, 0xc4,
+    0xe8, 0x00, 0x00, 0x03, 0x48, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55
+};
+#define SILENCE_AUDIO_SIZE 1100
+
+#endif // USE_SILENCE_AUDIO_288
+
+// 定义数组大小常量(方便使用)
+static const size_t silence_audio_size = SILENCE_AUDIO_SIZE;
 
 using namespace::Audio;
 
@@ -1328,6 +1474,14 @@ static int32_t RunAIVoice(AIVoiceContext *context)
                 if (msg.data != nullptr && msg.size > 0) {
                     // 写入音频数据到输出流
                     AI_WriteAudioData(msg.data,msg.size);
+                    if(msg.size==SILENCE_AUDIO_SIZE)
+                    {
+                        #ifdef USE_SILENCE_AUDIO_288
+                        LOS_Msleep(100);
+                        #else
+                        LOS_Msleep(1000);
+                        #endif
+                    }
                                         // struct timespec ts;
                     // AudioStreamGetTimestamp(&ts);
                     // printf("AudioStreamGetTimestamp %d\r\n",ts.tv_sec);
@@ -1367,6 +1521,36 @@ static int32_t RunAIVoice(AIVoiceContext *context)
                         MEDIA_ERR_LOG("Failed to read from file cache");
                     }
                 }
+                else 
+                {
+                    if(a2dp_is_connect)
+                    {
+                        uint32_t queueSize=0, queueCapacity=0;
+                        AI_GetQueueStatus(&queueSize, &queueCapacity);
+                        if (queueSize==0)
+                        {
+                            // 使用静音音频数据(自动匹配大小)
+                            AIVoiceQueueMessage cachedMsg;
+                            cachedMsg.size = SILENCE_AUDIO_SIZE;
+                            cachedMsg.data = (uint8_t *)malloc(cachedMsg.size);
+                            memcpy(cachedMsg.data, (void*)silence_audio, SILENCE_AUDIO_SIZE);
+
+                            osStatus_t queueStatus = osMessageQueuePut(context->inputQueue, &cachedMsg, 0, 0);
+                            if (queueStatus == osOK) {
+                                context->queueMsgCount++;
+                                // MEDIA_INFO_LOG("Successfully restored %u bytes from cache to queue", cachedMsg.size);
+                            } else {
+                                MEDIA_ERR_LOG("Failed to restore cached data to queue: %d", queueStatus);
+                                // 如果队列写入失败,释放内存
+                                free(cachedMsg.data);
+                            }
+                        }
+
+                    }
+                   
+
+                }
+                
             } else if (status == osErrorTimeout) {
                 // 超时,继续循环检查停止标志
                 continue;
@@ -1945,7 +2129,7 @@ int32_t AI_WriteAudioData(const uint8_t* data, uint32_t size)
     }
     
     // 调用注册的回调函数
-    if (g_writeAudioDataCallback != nullptr) {
+    if (g_writeAudioDataCallback != nullptr && size!=SILENCE_AUDIO_SIZE) {
         g_writeAudioDataCallback(size);
     }