diff --git a/frameworks/native/audiodefinitions/include/audio_stream_enum.h b/frameworks/native/audiodefinitions/include/audio_stream_enum.h index cddc7c5e8e3fea63e0ae29d626e97b55cd6fc4c0..a840e02ad624c49fda21465e3816fa25c13acbfd 100644 --- a/frameworks/native/audiodefinitions/include/audio_stream_enum.h +++ b/frameworks/native/audiodefinitions/include/audio_stream_enum.h @@ -36,6 +36,7 @@ enum AudioFlag : uint32_t { AUDIO_OUTPUT_FLAG_VOIP_FAST = 0x80, // select, route AUDIO_OUTPUT_FLAG_HWDECODING = 0x100, // select, route AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD = 0x200, // select, route + AUDIO_OUTPUT_FLAG_MODEM_COMMUNICATION = 0x400, // select, route AUDIO_INPUT_FLAG_NORMAL = 0x1000, // route AUDIO_INPUT_FLAG_FAST = 0x2000, // select, route AUDIO_INPUT_FLAG_VOIP = 0x4000, // select diff --git a/services/audio_policy/server/domain/pipe/include/audio_pipe_manager.h b/services/audio_policy/server/domain/pipe/include/audio_pipe_manager.h index 6a0c2ee88b6ee9ba04ade06f57a70337ad1a5187..69969bc7ebb0921151b8d051cc1ea89c4e7d9146 100644 --- a/services/audio_policy/server/domain/pipe/include/audio_pipe_manager.h +++ b/services/audio_policy/server/domain/pipe/include/audio_pipe_manager.h @@ -74,6 +74,7 @@ public: void AddModemCommunicationId(uint32_t sessionId, std::shared_ptr &streamDesc); void RemoveModemCommunicationId(uint32_t sessionId); std::shared_ptr GetModemCommunicationStreamDescById(uint32_t sessionId); + std::shared_ptr GetModemCommunicationStreamDesc(); std::unordered_map> GetModemCommunicationMap(); void UpdateModemStreamStatus(AudioStreamStatus streamStatus); void UpdateModemStreamDevice(std::vector> &deviceDescs); diff --git a/services/audio_policy/server/domain/pipe/include/audio_pipe_selector.h b/services/audio_policy/server/domain/pipe/include/audio_pipe_selector.h index 14b7733ea72571dae0d04204886f539349f4b1e7..3410eda2a090fc4f7dbcc997138c1b410e98b54b 100644 --- a/services/audio_policy/server/domain/pipe/include/audio_pipe_selector.h +++ b/services/audio_policy/server/domain/pipe/include/audio_pipe_selector.h @@ -67,6 +67,8 @@ private: std::map, std::string> &streamToAdapter); void AddStreamToPipeAndUpdateAction(std::shared_ptr &streamToAdd, std::shared_ptr &pipe); + void ProcessModemCommunicationConcurrency(std::vector> &streamDescs, + std::vector> &streamsMoveToNormal); AudioPolicyConfigManager& configManager_; }; diff --git a/services/audio_policy/server/domain/pipe/src/audio_pipe_manager.cpp b/services/audio_policy/server/domain/pipe/src/audio_pipe_manager.cpp index 3da2354ac6711cee3578e7cbc1a34046a3cca1d3..405609cf4fa79c01658a36fc2526930ff124f452 100644 --- a/services/audio_policy/server/domain/pipe/src/audio_pipe_manager.cpp +++ b/services/audio_policy/server/domain/pipe/src/audio_pipe_manager.cpp @@ -445,6 +445,13 @@ std::shared_ptr AudioPipeManager::GetModemCommunicationSt } } +std::shared_ptr AudioPipeManager::GetModemCommunicationStreamDesc() +{ + std::shared_lock pLock(pipeListLock_); + CHECK_AND_RETURN_RET_LOG(!modemCommunicationIdMap_.empty(), nullptr, "ModemCommunicationMap is empty!"); + return modemCommunicationIdMap_.begin()->second; +} + std::unordered_map> AudioPipeManager::GetModemCommunicationMap() { std::shared_lock pLock(pipeListLock_); diff --git a/services/audio_policy/server/domain/pipe/src/audio_pipe_selector.cpp b/services/audio_policy/server/domain/pipe/src/audio_pipe_selector.cpp index 5e44823fa9dc31a860d364899604ec17c2f036c1..f44c6e77ffcb14b2c4a81693dbd5751e2afc1280 100644 --- a/services/audio_policy/server/domain/pipe/src/audio_pipe_selector.cpp +++ b/services/audio_policy/server/domain/pipe/src/audio_pipe_selector.cpp @@ -140,13 +140,15 @@ void AudioPipeSelector::DecideFinalRouteFlag(std::vectorrouteFlag_ = GetRouteFlagByStreamDesc(streamDescs[0]); + // Do not need to move stream, because stream actions are all decided in DecidePipesAndStreamAction(), + // not in ProcessConcurrency(). + std::vector> streamsMoveToNormal; if (streamDescs.size() == 1) { + // modemCommunication streamDescs stored in modemCommunicationIdMap_, need to do extra concurrencyProcess + ProcessModemCommunicationConcurrency(streamDescs, streamsMoveToNormal); return; } - // Do not need to move stream, because stream actions are all decided in DecidePipesAndStreamAction(), - // not in ProcessConcurrency(). - std::vector> streamsMoveToNormal; for (size_t cmpStreamIdx = 1; cmpStreamIdx < streamDescs.size(); ++cmpStreamIdx) { streamDescs[cmpStreamIdx]->routeFlag_ = GetRouteFlagByStreamDesc(streamDescs[cmpStreamIdx]); // calculate concurrency in time order @@ -154,6 +156,7 @@ void AudioPipeSelector::DecideFinalRouteFlag(std::vectorSetAction(PIPE_ACTION_UPDATE); } } + // modemCommunication streamDescs stored in modemCommunicationIdMap_, need to do extra concurrencyProcess + std::vector> tempStreamDescs{streamDesc}; + ProcessModemCommunicationConcurrency(tempStreamDescs, streamsMoveToNormal); + // Move concede existing streams to its corresponding normal pipe MoveStreamsToNormalPipes(streamsMoveToNormal, pipeInfoList); @@ -315,6 +322,8 @@ AudioPipeType AudioPipeSelector::GetPipeType(uint32_t flag, AudioMode audioMode) return PIPE_TYPE_MULTICHANNEL; } else if (flag & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) { return PIPE_TYPE_OFFLOAD; + } else if (flag & AUDIO_OUTPUT_FLAG_MODEM_COMMUNICATION) { + return PIPE_TYPE_CALL_OUT; } else { return PIPE_TYPE_NORMAL_OUT; } @@ -597,5 +606,19 @@ void AudioPipeSelector::RemoveTargetStreams( } } } + +void AudioPipeSelector::ProcessModemCommunicationConcurrency( + std::vector> &streamDescs, + std::vector> &streamsMoveToNormal) +{ + CHECK_AND_RETURN(AudioPipeManager::GetPipeManager()->IsModemCommunicationIdExist()); + AUDIO_INFO_LOG("ModemCommunication exists, need process concurrency"); + std::shared_ptr modemCommStream = + AudioPipeManager::GetPipeManager()->GetModemCommunicationStreamDesc(); + for (auto &streamDesc : streamDescs) { + ProcessConcurrency(modemCommStream, streamDesc, streamsMoveToNormal); + } +} + } // namespace AudioStandard } // namespace OHOS \ No newline at end of file diff --git a/services/audio_policy/server/service/service_main/src/audio_core_service.cpp b/services/audio_policy/server/service/service_main/src/audio_core_service.cpp index 10ce3b5fa5c3c76e53c1bd69f38907daad45840d..ceff02fe69ee2040fbd9e4c69b8d2f6863be4485 100644 --- a/services/audio_policy/server/service/service_main/src/audio_core_service.cpp +++ b/services/audio_policy/server/service/service_main/src/audio_core_service.cpp @@ -171,6 +171,8 @@ int32_t AudioCoreService::CreateRendererClient( isModemStream = true; audioFlag = AUDIO_FLAG_NORMAL; AddSessionId(sessionId); + streamDesc->audioFlag_ = AUDIO_OUTPUT_FLAG_MODEM_COMMUNICATION; + streamDesc->routeFlag_ = AUDIO_OUTPUT_FLAG_MODEM_COMMUNICATION; pipeManager_->AddModemCommunicationId(sessionId, streamDesc); }