修改偶现互斥锁导致的通路无法创建 1611/1 1611/head
authorhcj <1224667075@qq.com>
Thu, 9 Jan 2025 07:31:32 +0000 (15:31 +0800)
committerhcj <1224667075@qq.com>
Thu, 9 Jan 2025 07:31:32 +0000 (15:31 +0800)
code/sdk/application/wearable/fd230app/nativeui/phoneservice/src/PhoneAGService.cpp
code/sdk/application/wearable/fd230app/nativeui/phoneservice/src/PhoneService.cpp
code/sdk/middleware/services/media/foundation/sample/wrapper/voice_call_volte_sample_wrapper.cpp
code/sdk/middleware/services/media/foundation/sample/wrapper/voice_call_volte_sample_wrapper.h

index ebf31e7..0fe30a1 100644 (file)
@@ -32,7 +32,7 @@
 #include "PhoneService.h"
 #include "CallerLogModel.h"
 #include "custom_utils.h"
-
+#include "voice_call_volte_sample_wrapper.h"
 
 
 #define SAMPLE_HFP_TASK_STACK_SIZE 0x1600
@@ -322,10 +322,12 @@ static void sample_hfp_ag_codec_changed_callback(const bd_addr_t *bd_addr, hfp_a
         if (codec == HFP_AG_CODEC_ID_CVSD) {
 
         g_hfp_codec = PCM;
+        updata_Audio_code_hfp(0);
 
     } else if (codec == HFP_AG_CODEC_ID_MSBC) {
 
-        g_hfp_codec = mSBC;
+        // g_hfp_codec = mSBC;
+        updata_Audio_code_hfp(1);
     }
 
 
index 23feaa9..f9dfa40 100755 (executable)
@@ -43,6 +43,7 @@ typedef struct {
     bool isVoiceCallVolteStopped;
     MediaMutexHandle mutex;
     MediaThreadCondHandle cond;
+    MediaThreadIdHandle taskHandle;
 } VoiceCallVolteContext;
 
 static MediaMutexHandle g_voiceCallVolteContextMutex = nullptr;
@@ -72,6 +73,16 @@ static int32_t VoiceCallSetVolume(const char **param);
 static int32_t VoiceCAllSeaEnable(const char **param);
 static int32_t VoiceCallMicMute(const char **param);
 static int32_t StartHFPVoiceCall(const char **param);
+// static int32_t updata_Audio_code_hfp(const char **param);
+
+typedef struct {
+  AudioCodecFormat code;
+  uint32_t sampleRate;
+} Audio_code_hfp;
+
+Audio_code_hfp Audio_code_hfp_t={mSBC,16000};
+
+
 
 typedef struct {
     char cmd[MEDIA_CMD_LEN_MAX];
@@ -84,9 +95,27 @@ static FuncsMap g_voiceCallVolteFuncs[] = {
     { "setvolume", VoiceCallSetVolume },
     { "seaenable", VoiceCAllSeaEnable },
     { "mute", VoiceCallMicMute },
-    { "startSCO",StartHFPVoiceCall}
+    { "startSCO",StartHFPVoiceCall},
+    // { "updata_Audio_code_hfp",updata_Audio_code_hfp}
 };
 
+
+void updata_Audio_code_hfp(uint32_t type)
+{
+    if(type)
+    {
+        Audio_code_hfp_t.code=mSBC;
+        Audio_code_hfp_t.sampleRate=16000;
+    }
+    else
+    {
+        Audio_code_hfp_t.code=PCM;
+        Audio_code_hfp_t.sampleRate=8000;
+    }
+
+}
+
+
 class VoiceCallVolteInterruptListener : public InterruptListener {
 public:
     VoiceCallVolteInterruptListener(VoiceCallVolteContext *in)
@@ -248,12 +277,12 @@ static int32_t RunVoiceCallVolte(VoiceCallVolteContext *context)
     }
 
     g_stream_in_uplink = std::make_shared<AudioStreamIn>();
-
+ 
     CapturerInputConfig captureConfig = {};
-    captureConfig.audioFormat = mSBC;
+    captureConfig.audioFormat = Audio_code_hfp_t.code;
     captureConfig.channelCount = 1;
     captureConfig.linkDir = AUDIO_UP_LINK;
-    captureConfig.sampleRate = 16000;
+    captureConfig.sampleRate =  Audio_code_hfp_t.sampleRate;
     captureConfig.sessionID = context->sessionId;
     captureConfig.streamType = AUDIO_STREAM_VOICE_CALL_VOLTE;
 
@@ -265,10 +294,10 @@ static int32_t RunVoiceCallVolte(VoiceCallVolteContext *context)
     g_stream_out_uplink = std::make_shared<AudioStreamOut>();
 
     AudioRendererConfig renderConfig = {};
-    renderConfig.audioFormat = mSBC;
+    renderConfig.audioFormat =Audio_code_hfp_t.code;
     renderConfig.channelCount = 1;
     renderConfig.linkDir = AUDIO_UP_LINK;
-    renderConfig.sampleRate = 16000;
+    renderConfig.sampleRate =  Audio_code_hfp_t.sampleRate;
     renderConfig.sessionID = context->sessionId;
     renderConfig.streamType = AUDIO_STREAM_VOICE_CALL_VOLTE;
 
@@ -279,10 +308,10 @@ static int32_t RunVoiceCallVolte(VoiceCallVolteContext *context)
 
     g_stream_in_downink = std::make_shared<AudioStreamIn>();
 
-    captureConfig.audioFormat = mSBC;
+    captureConfig.audioFormat = Audio_code_hfp_t.code;
     captureConfig.channelCount = 1;
     captureConfig.linkDir = AUDIO_DOWN_LINK;
-    captureConfig.sampleRate = 16000;
+    captureConfig.sampleRate =  Audio_code_hfp_t.sampleRate;
     captureConfig.sessionID = context->sessionId;
     captureConfig.streamType = AUDIO_STREAM_VOICE_CALL_VOLTE;
 
@@ -293,10 +322,10 @@ static int32_t RunVoiceCallVolte(VoiceCallVolteContext *context)
 
     g_stream_out_downink = std::make_shared<AudioStreamOut>();
 
-    renderConfig.audioFormat = mSBC;
+    renderConfig.audioFormat = Audio_code_hfp_t.code;
     renderConfig.channelCount = 1;
     renderConfig.linkDir = AUDIO_DOWN_LINK;
-    renderConfig.sampleRate = 16000;
+    renderConfig.sampleRate =  Audio_code_hfp_t.sampleRate;
     renderConfig.sessionID = context->sessionId;
     renderConfig.streamType = AUDIO_STREAM_VOICE_CALL_VOLTE;
 
@@ -604,6 +633,7 @@ static void *VoiceCallVolteThread(void *priv)
     return nullptr;
 }
 
+
 static int32_t StartVoiceCall(const char **param)
 {
     MediaMutexLock(g_voiceCallVolteContextMutex);
@@ -625,9 +655,9 @@ static int32_t StartVoiceCall(const char **param)
     MediaMutexUnLock(g_voiceCallVolteContextMutex);
 
     // 3. create voice call volte thread
-    MediaThreadattr attr = { "VoiceCallVolteThread", 0x2000, THREAD_SCHED_INVALID, 0, true };
-    MediaThreadIdHandle taskHandle = MediaThreadCreate(VoiceCallVolteThread, g_voiceCallVolteContext, &attr);
-    if (taskHandle == nullptr) {
+    MediaThreadattr attr = { "VoiceCallVolteThread", 0x2000, THREAD_SCHED_INVALID, 0, false };
+    g_voiceCallVolteContext->taskHandle= MediaThreadCreate(VoiceCallVolteThread, g_voiceCallVolteContext, &attr);
+    if (g_voiceCallVolteContext->taskHandle == nullptr) {
         MEDIA_ERR_LOG("create voice call volte  thread failed");
         free(g_voiceCallVolteContext);
         g_voiceCallVolteContext = nullptr;
@@ -638,29 +668,37 @@ static int32_t StartVoiceCall(const char **param)
     return 0;
 }
 
+
 static int32_t StopVoiceCall(const char **param)
 {
+    MEDIA_UNUSED(param);
+    MediaMutexLock(g_voiceCallVolteContextMutex);
     if (g_voiceCallVolteContext == nullptr) {
         MEDIA_ERR_LOG("voice call volte context is null, execute start command first");
+        MediaMutexUnLock(g_voiceCallVolteContextMutex);
         return -1;
     }
-
-    MediaMutexLock(g_voiceCallVolteContextMutex);
     if (g_voiceCallVolteContext->isVoiceCallVolteStopped) {
         MEDIA_ERR_LOG("voice call volte already stopped");
-        return 0;
     }
-
-    MEDIA_ERR_LOG("voice call volte stop signal one");
     MediaMutexLock(g_voiceCallVolteContext->mutex);
     g_voiceCallVolteContext->isVoiceCallVolteStopped = true;
     MediaThreadCondSignal(g_voiceCallVolteContext->cond);
     MediaMutexUnLock(g_voiceCallVolteContext->mutex);
+    MediaThreadJoin(&g_voiceCallVolteContext->taskHandle);
+
+    // (void)MediaThreadCondDestroy(&g_voiceCallVolteContext->cond);
+    // (void)MediaMutexDestroy(&g_voiceCallVolteContext->mutex);
 
+    // if (g_voiceCallVolteContext != nullptr) {
+    //     free(g_voiceCallVolteContext);
+    //     g_voiceCallVolteContext = nullptr;
+    // }
     MediaMutexUnLock(g_voiceCallVolteContextMutex);
     return 0;
 }
 
+
 static int32_t VoiceCAllSeaEnable(const char **param)
 {
     int32_t enable = atoi(param[0x1]);
@@ -761,10 +799,10 @@ static int32_t RunVoiceCallVolte_NO_LOCAL_VOICE_CALL(VoiceCallVolteContext *cont
     g_stream_in_uplink = std::make_shared<AudioStreamIn>();
 
     CapturerInputConfig captureConfig = {};
-    captureConfig.audioFormat = mSBC;
+    captureConfig.audioFormat =  Audio_code_hfp_t.code;
     captureConfig.channelCount = 1;
     captureConfig.linkDir = AUDIO_UP_LINK;
-    captureConfig.sampleRate = 16000;
+    captureConfig.sampleRate =  Audio_code_hfp_t.sampleRate;
     captureConfig.sessionID = context->sessionId;
     captureConfig.streamType = AUDIO_STREAM_VOICE_CALL_VOLTE;
 
@@ -776,10 +814,10 @@ static int32_t RunVoiceCallVolte_NO_LOCAL_VOICE_CALL(VoiceCallVolteContext *cont
     g_stream_out_uplink = std::make_shared<AudioStreamOut>();
     // 16000 32000 44100 48000
     AudioRendererConfig renderConfig = {};
-    renderConfig.audioFormat = mSBC;
+    renderConfig.audioFormat =  Audio_code_hfp_t.code;
     renderConfig.channelCount = 1;
     renderConfig.linkDir = AUDIO_UP_LINK;
-    renderConfig.sampleRate = 16000;
+    renderConfig.sampleRate =  Audio_code_hfp_t.sampleRate;
     renderConfig.sessionID = context->sessionId;
     renderConfig.streamType = AUDIO_STREAM_VOICE_CALL_VOLTE;
 
@@ -791,10 +829,10 @@ static int32_t RunVoiceCallVolte_NO_LOCAL_VOICE_CALL(VoiceCallVolteContext *cont
     //下行
     g_stream_in_downink = std::make_shared<AudioStreamIn>();
 
-    captureConfig.audioFormat = mSBC;
+    captureConfig.audioFormat =  Audio_code_hfp_t.code;
     captureConfig.channelCount = 1;
     captureConfig.linkDir = AUDIO_DOWN_LINK;
-    captureConfig.sampleRate = 16000;
+    captureConfig.sampleRate =  Audio_code_hfp_t.sampleRate;
     captureConfig.sessionID = context->sessionId;
     captureConfig.streamType = AUDIO_STREAM_VOICE_CALL_VOLTE;
 
@@ -805,10 +843,10 @@ static int32_t RunVoiceCallVolte_NO_LOCAL_VOICE_CALL(VoiceCallVolteContext *cont
 
     g_stream_out_downink = std::make_shared<AudioStreamOut>();
 
-    renderConfig.audioFormat = mSBC;
+    renderConfig.audioFormat =  Audio_code_hfp_t.code;
     renderConfig.channelCount = 1;
     renderConfig.linkDir = AUDIO_DOWN_LINK;
-    renderConfig.sampleRate = 16000;
+    renderConfig.sampleRate = Audio_code_hfp_t.sampleRate;
     renderConfig.sessionID = context->sessionId;
     renderConfig.streamType = AUDIO_STREAM_VOICE_CALL_VOLTE;
 
@@ -979,9 +1017,9 @@ static int32_t StartHFPVoiceCall(const char **param)
     MediaMutexUnLock(g_voiceCallVolteContextMutex);
 
     // 3. create voice call volte thread
-    MediaThreadattr attr = { "VoiceCallVolteThread", 0x2000, THREAD_SCHED_INVALID, 0, true };
-    MediaThreadIdHandle taskHandle = MediaThreadCreate(VoiceCallVolteHFPThread, g_voiceCallVolteContext, &attr);
-    if (taskHandle == nullptr) {
+    MediaThreadattr attr = { "VoiceCallVolteThread", 0x2000, THREAD_SCHED_INVALID, 0, false };
+    g_voiceCallVolteContext->taskHandle  = MediaThreadCreate(VoiceCallVolteHFPThread, g_voiceCallVolteContext, &attr);
+    if ( g_voiceCallVolteContext->taskHandle == nullptr) {
         MEDIA_ERR_LOG("create voice call volte  thread failed");
         free(g_voiceCallVolteContext);
         g_voiceCallVolteContext = nullptr;