* 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;
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);
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;
}
// 调用注册的回调函数
- if (g_writeAudioDataCallback != nullptr) {
+ if (g_writeAudioDataCallback != nullptr && size!=SILENCE_AUDIO_SIZE) {
g_writeAudioDataCallback(size);
}