From 20d03ff9b7076c552eb3bc3ce9080e8e273d03df Mon Sep 17 00:00:00 2001 From: huyue57 Date: Wed, 17 Apr 2024 07:17:41 +0000 Subject: [PATCH 1/5] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=88=86=E5=B8=83?= =?UTF-8?q?=E5=BC=8F=E8=AE=BE=E5=A4=87=E9=80=89=E6=8B=A9=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: huyue57 Change-Id: I03757a60ef48914cfa4537a8e0668f8f691c6831 --- frameworks/js/napi/common/napi_audio_enum.cpp | 3 + frameworks/js/napi/common/napi_audio_enum.h | 3 +- .../include/audio_capturer_private.h | 1 + .../audiocapturer/src/audio_capturer.cpp | 10 +- .../include/audio_policy_manager.h | 6 + .../native/audioutils/include/audio_utils.h | 1 + .../pulseaudio/modules/capturer/BUILD.gn | 2 + .../capturer/module_inner_capturer_sink.c | 4 + .../native/pulseaudio/modules/hdi/hdi_sink.c | 9 + .../audiocommon/include/audio_device_info.h | 5 + .../native/audiocommon/include/audio_errors.h | 3 + .../native/audiocommon/include/audio_info.h | 21 ++ .../audiocommon/include/audio_source_type.h | 3 +- .../include/audio_routing_manager.h | 4 + .../include/audio_system_manager.h | 10 + .../client/include/audio_policy_base.h | 6 + .../include/audio_policy_manager_stub.h | 6 + .../client/include/audio_policy_proxy.h | 5 + .../audio_routing_manager_listener_stub.h | 9 +- .../client/src/audio_policy_manager.cpp | 40 ++++ .../client/src/audio_policy_proxy.cpp | 49 +++++ .../audio_routing_manager_listener_stub.cpp | 88 +++++++++ .../include/audio_policy_ipc_interface_code.h | 5 +- ..._standard_audio_routing_manager_listener.h | 4 +- .../config/audio_interrupt_policy_config.xml | 63 ++++++ .../server/include/audio_policy_server.h | 8 + .../include/audio_policy_server_handler.h | 2 + .../audio_routing_manager_listener_proxy.h | 4 + .../include/service/audio_policy_service.h | 13 +- .../interface/iaudio_policy_interface.h | 2 + .../service/manager/audio_adapter_manager.h | 2 + .../service/routers/audio_router_center.h | 10 +- .../service/routers/cockpit_phone_router.h | 5 + .../include/service/routers/default_router.h | 5 + .../service/routers/package_filter_router.h | 5 + .../service/routers/pair_device_router.h | 5 + .../service/routers/privacy_priority_router.h | 5 + .../service/routers/public_priority_router.h | 5 + .../include/service/routers/router_base.h | 1 + .../service/routers/stream_filter_router.h | 5 + .../service/routers/user_select_router.h | 5 + .../server/src/audio_policy_manager_stub.cpp | 20 ++ .../server/src/audio_policy_server.cpp | 34 +++- .../src/audio_policy_server_handler.cpp | 2 +- .../audio_routing_manager_listener_proxy.cpp | 73 +++++++ .../src/service/audio_device_manager.cpp | 5 +- .../src/service/audio_policy_service.cpp | 181 ++++++++++++------ .../src/service/config/audio_focus_parser.cpp | 4 +- .../service/manager/audio_adapter_manager.cpp | 12 ++ .../service/routers/audio_router_center.cpp | 105 ++++++---- .../client/src/audio_routing_manager.cpp | 22 +++ .../server/include/capturer_in_server.h | 4 + .../server/src/capturer_in_server.cpp | 46 ++++- .../server/src/pa_adapter_manager.cpp | 2 + 54 files changed, 830 insertions(+), 122 deletions(-) diff --git a/frameworks/js/napi/common/napi_audio_enum.cpp b/frameworks/js/napi/common/napi_audio_enum.cpp index fcbb75cee8..93cf23442b 100644 --- a/frameworks/js/napi/common/napi_audio_enum.cpp +++ b/frameworks/js/napi/common/napi_audio_enum.cpp @@ -178,6 +178,7 @@ const std::map NapiAudioEnum::sourceTypeMap = { {"SOURCE_TYPE_VOICE_COMMUNICATION", SOURCE_TYPE_VOICE_COMMUNICATION}, {"SOURCE_TYPE_VOICE_CALL", SOURCE_TYPE_VOICE_CALL}, {"SOURCE_TYPE_VOICE_MESSAGE", SOURCE_TYPE_VOICE_MESSAGE}, + {"SOURCE_TYPE_REMOTE_CAST", SOURCE_TYPE_REMOTE_CAST}, }; const std::map NapiAudioEnum::volumeAdjustTypeMap = { @@ -1030,6 +1031,7 @@ bool NapiAudioEnum::IsLegalCapturerType(int32_t type) case TYPE_COMMUNICATION: case TYPE_VOICE_CALL: case TYPE_MESSAGE: + case TYPE_REMOTE_CAST: result = true; break; default: @@ -1219,6 +1221,7 @@ bool NapiAudioEnum::IsValidSourceType(int32_t intValue) case SourceType::SOURCE_TYPE_WAKEUP: case SourceType::SOURCE_TYPE_VOICE_CALL: case SourceType::SOURCE_TYPE_VOICE_MESSAGE: + case SourceType::SOURCE_TYPE_REMOTE_CAST: return true; default: return false; diff --git a/frameworks/js/napi/common/napi_audio_enum.h b/frameworks/js/napi/common/napi_audio_enum.h index 8316b01ca1..7ec67f0da6 100644 --- a/frameworks/js/napi/common/napi_audio_enum.h +++ b/frameworks/js/napi/common/napi_audio_enum.h @@ -76,7 +76,8 @@ public: TYPE_VOICE_CALL = 4, TYPE_PLAYBACK_CAPTURE = 2, TYPE_COMMUNICATION = 7, - TYPE_MESSAGE = 10 + TYPE_MESSAGE = 10, + TYPE_REMOTE_CAST = 11 }; static napi_value Init(napi_env env, napi_value exports); static bool IsLegalInputArgumentInterruptMode(int32_t interruptMode); diff --git a/frameworks/native/audiocapturer/include/audio_capturer_private.h b/frameworks/native/audiocapturer/include/audio_capturer_private.h index 7e0f814055..bdbe30f9a5 100644 --- a/frameworks/native/audiocapturer/include/audio_capturer_private.h +++ b/frameworks/native/audiocapturer/include/audio_capturer_private.h @@ -131,6 +131,7 @@ private: DeviceInfo currentDeviceInfo_ = {}; bool latencyMeasEnabled_ = false; std::shared_ptr signalDetectAgent_ = nullptr; + FILE *dumpFile_ = nullptr; }; class AudioCapturerInterruptCallbackImpl : public AudioInterruptCallback { diff --git a/frameworks/native/audiocapturer/src/audio_capturer.cpp b/frameworks/native/audiocapturer/src/audio_capturer.cpp index be2cfc1478..48d0230d25 100644 --- a/frameworks/native/audiocapturer/src/audio_capturer.cpp +++ b/frameworks/native/audiocapturer/src/audio_capturer.cpp @@ -22,6 +22,7 @@ #include "audio_utils.h" #include "audio_log.h" #include "audio_policy_manager.h" +#include namespace OHOS { namespace AudioStandard { @@ -47,6 +48,7 @@ AudioCapturerPrivate::~AudioCapturerPrivate() if (audioStateChangeCallback_ != nullptr) { audioStateChangeCallback_->HandleCapturerDestructor(); } + DumpFileUtil::CloseDumpFile(&dumpFile_); } std::unique_ptr AudioCapturer::Create(AudioStreamType audioStreamType) @@ -208,6 +210,8 @@ int32_t AudioCapturerPrivate::SetParams(const AudioCapturerParams params) RegisterCapturerPolicyServiceDiedCallback(); + DumpFileUtil::OpenDumpFile(DUMP_CLIENT_PARA, DUMP_AUDIO_CAPTURER_FILENAME, &dumpFile_); + return InitAudioInterruptCallback(); } @@ -422,7 +426,11 @@ bool AudioCapturerPrivate::Start() const int32_t AudioCapturerPrivate::Read(uint8_t &buffer, size_t userSize, bool isBlockingRead) const { CheckSignalData(&buffer, userSize); - return audioStream_->Read(buffer, userSize, isBlockingRead); + int size = audioStream_->Read(buffer, userSize, isBlockingRead); + if (size > 0) { + DumpFileUtil::WriteDumpFile(dumpFile_, static_cast(&buffer), size); + } + return size; } CapturerState AudioCapturerPrivate::GetStatus() const diff --git a/frameworks/native/audiopolicy/include/audio_policy_manager.h b/frameworks/native/audiopolicy/include/audio_policy_manager.h index ee72a55df2..e637e06414 100644 --- a/frameworks/native/audiopolicy/include/audio_policy_manager.h +++ b/frameworks/native/audiopolicy/include/audio_policy_manager.h @@ -351,6 +351,12 @@ public: int32_t UnregisterHeadTrackingDataRequestedEventListener(const std::string &macAddress); + int32_t SetAudioDeviceRefinerCallback(const std::shared_ptr &callback); + + int32_t UnsetAudioDeviceRefinerCallback(); + + int32_t TriggerFetchDevice(); + private: AudioPolicyManager() {} ~AudioPolicyManager() {} diff --git a/frameworks/native/audioutils/include/audio_utils.h b/frameworks/native/audioutils/include/audio_utils.h index fd60726ce8..6f73e499e0 100644 --- a/frameworks/native/audioutils/include/audio_utils.h +++ b/frameworks/native/audioutils/include/audio_utils.h @@ -141,6 +141,7 @@ const std::string DUMP_PULSE_DIR = "/data/data/.pulse_dir/"; const std::string DUMP_SERVICE_DIR = "/data/local/tmp/"; const std::string DUMP_APP_DIR = "/data/storage/el2/base/cache/"; const std::string DUMP_AUDIO_RENDERER_FILENAME = "dump_client_audio.pcm"; +const std::string DUMP_AUDIO_CAPTURER_FILENAME = "dump_client_capturer_audio.pcm"; const std::string DUMP_BLUETOOTH_RENDER_SINK_FILENAME = "dump_bluetooth_audiosink.pcm"; const std::string DUMP_RENDER_SINK_FILENAME = "dump_audiosink.pcm"; const std::string DUMP_OFFLOAD_RENDER_SINK_FILENAME = "dump_offloadaudiosink.pcm"; diff --git a/frameworks/native/pulseaudio/modules/capturer/BUILD.gn b/frameworks/native/pulseaudio/modules/capturer/BUILD.gn index 81ac81f7ed..c8eca67767 100644 --- a/frameworks/native/pulseaudio/modules/capturer/BUILD.gn +++ b/frameworks/native/pulseaudio/modules/capturer/BUILD.gn @@ -60,6 +60,8 @@ ohos_shared_library("module-inner-capturer-sink") { "$pulseaudio_build_path/src:pulsecommon", "$pulseaudio_build_path/src/pulse:pulse", "$pulseaudio_build_path/src/pulsecore:pulsecore", + "${third_party_path}/bounds_checking_function:libsec_shared", + "../../../audioutils:audio_utils", ] external_deps = [ "hilog:libhilog" ] diff --git a/frameworks/native/pulseaudio/modules/capturer/module_inner_capturer_sink.c b/frameworks/native/pulseaudio/modules/capturer/module_inner_capturer_sink.c index 40b5011b66..6a96dd5b37 100644 --- a/frameworks/native/pulseaudio/modules/capturer/module_inner_capturer_sink.c +++ b/frameworks/native/pulseaudio/modules/capturer/module_inner_capturer_sink.c @@ -42,6 +42,8 @@ #include #include "audio_log.h" +#include "securec.h" +#include "audio_utils_c.h" PA_MODULE_AUTHOR("OpenHarmony"); PA_MODULE_DESCRIPTION(_("Inner Capturer Sink")); @@ -218,6 +220,8 @@ static void ProcessRender(struct userdata *u, pa_usec_t now) pa_memchunk chunk; pa_sink_render(u->sink, u->sink->thread_info.max_request, &chunk); + AUTO_CTRACE("inner_capturer_sink: ProcessRender len %zu, max_request %zu", chunk.length, + u->sink->thread_info.max_request); pa_memblock_unref(chunk.memblock); u->timestamp += pa_bytes_to_usec(chunk.length, &u->sink->sample_spec); diff --git a/frameworks/native/pulseaudio/modules/hdi/hdi_sink.c b/frameworks/native/pulseaudio/modules/hdi/hdi_sink.c index 66b3ce16c3..fe1abb134d 100644 --- a/frameworks/native/pulseaudio/modules/hdi/hdi_sink.c +++ b/frameworks/native/pulseaudio/modules/hdi/hdi_sink.c @@ -89,6 +89,7 @@ const char *DEVICE_CLASS_A2DP = "a2dp"; const char *DEVICE_CLASS_REMOTE = "remote"; const char *DEVICE_CLASS_OFFLOAD = "offload"; const char *DEVICE_CLASS_MULTICHANNEL = "multichannel"; +const char *SINK_NAME_REMOTE_CAST_INNER_CAPTURER = "RemoteCastInnerCapturer"; char *const SCENE_TYPE_SET[SCENE_TYPE_NUM] = {"SCENE_MUSIC", "SCENE_GAME", "SCENE_MOVIE", "SCENE_SPEECH", "SCENE_RING", "SCENE_OTHERS", "EFFECT_NONE"}; @@ -2271,6 +2272,10 @@ static void PaInputStateChangeCb(pa_sink_input *i, pa_sink_input_state_t state) pa_assert(i); pa_sink_input_assert_ref(i); pa_assert(i->sink); + if (!strcmp(i->sink->name, SINK_NAME_REMOTE_CAST_INNER_CAPTURER)) { + AUDIO_INFO_LOG("inner_cap return"); + return; + } pa_assert_se(u = i->sink->userdata); char str[SPRINTF_STR_LEN] = {0}; @@ -2319,6 +2324,10 @@ void PaInputVolumeChangeCb(pa_sink_input *i) struct Userdata *u; pa_sink_input_assert_ref(i); + if (!strcmp(i->sink->name, SINK_NAME_REMOTE_CAST_INNER_CAPTURER)) { + AUDIO_INFO_LOG("inner_cap return"); + return; + } pa_assert_se(u = i->sink->userdata); if (u->offload_enable && InputIsOffload(i)) { diff --git a/interfaces/inner_api/native/audiocommon/include/audio_device_info.h b/interfaces/inner_api/native/audiocommon/include/audio_device_info.h index 44ff63f795..dbf9b20c71 100644 --- a/interfaces/inner_api/native/audiocommon/include/audio_device_info.h +++ b/interfaces/inner_api/native/audiocommon/include/audio_device_info.h @@ -162,6 +162,10 @@ enum DeviceType { * Indicates default device */ DEVICE_TYPE_DEFAULT = 1000, + /** + * Indicates a virtual remote cast device + */ + DEVICE_TYPE_REMOTE_CAST = 1001, /** * Indicates device type max count. */ @@ -194,6 +198,7 @@ inline const std::unordered_set OUTPUT_DEVICE_TYPE_SET = { DeviceType::DEVICE_TYPE_DP, DeviceType::DEVICE_TYPE_USB_ARM_HEADSET, DeviceType::DEVICE_TYPE_FILE_SINK, + DeviceType::DEVICE_TYPE_REMOTE_CAST, }; inline bool IsOutputDevice(DeviceType deviceType) diff --git a/interfaces/inner_api/native/audiocommon/include/audio_errors.h b/interfaces/inner_api/native/audiocommon/include/audio_errors.h index b22f12bb1a..9ab61ca92b 100644 --- a/interfaces/inner_api/native/audiocommon/include/audio_errors.h +++ b/interfaces/inner_api/native/audiocommon/include/audio_errors.h @@ -131,6 +131,9 @@ const int32_t ERR_MICROPHONE_DISABLED_BY_EDM = BASE_AUDIO_ERR_OFFSET - 22; /** system permission denied */ const int32_t ERR_SYSTEM_PERMISSION_DENIED = BASE_AUDIO_ERR_OFFSET - 23; +/** callback not registered */ +const int32_t ERR_CALLBACK_NOT_REGISTERED = BASE_AUDIO_ERR_OFFSET - 24; + /** Unknown error */ const int32_t ERR_UNKNOWN = BASE_AUDIO_ERR_OFFSET - 200; } // namespace AudioStandard diff --git a/interfaces/inner_api/native/audiocommon/include/audio_info.h b/interfaces/inner_api/native/audiocommon/include/audio_info.h index ffa9379126..c0c3d42fd2 100644 --- a/interfaces/inner_api/native/audiocommon/include/audio_info.h +++ b/interfaces/inner_api/native/audiocommon/include/audio_info.h @@ -74,6 +74,8 @@ constexpr std::string_view WAKEUP_NAMES[WAKEUP_LIMIT] = { constexpr std::string_view VOICE_CALL_REC_NAME = "Voice_call_rec"; const std::string INNER_CAPTURER_SOURCE = "Speaker.monitor"; +const std::string REMOTE_CAST_INNER_CAPTURER_SINK_NAME = "RemoteCastInnerCapturer"; +const std::string MONITOR_SOURCE_SUFFIX = ".monitor"; #ifdef FEATURE_DTMF_TONE // Maximun number of sine waves in a tone segment @@ -910,6 +912,25 @@ struct SourceInfo { uint32_t rate_; uint32_t channels_; }; + +enum RouterType { + ROUTER_TYPE_NONE = 0, + ROUTER_TYPE_DEFAULT, + ROUTER_TYPE_STREAM_FILTER, + ROUTER_TYPE_PACKAGE_FILTER, + ROUTER_TYPE_COCKPIT_PHONE, + ROUTER_TYPE_PRIVACY_PRIORITY, + ROUTER_TYPE_PUBLIC_PRIORITY, + ROUTER_TYPE_PAIR_DEVICE, + ROUTER_TYPE_USER_SELECT, +}; + +enum RenderMode { + PRIMARY, + VOIP, + OFFLOAD, + LOW_LATENCY, +}; } // namespace AudioStandard } // namespace OHOS #endif // AUDIO_INFO_H diff --git a/interfaces/inner_api/native/audiocommon/include/audio_source_type.h b/interfaces/inner_api/native/audiocommon/include/audio_source_type.h index 81c708eaff..ba56934348 100644 --- a/interfaces/inner_api/native/audiocommon/include/audio_source_type.h +++ b/interfaces/inner_api/native/audiocommon/include/audio_source_type.h @@ -34,7 +34,8 @@ enum SourceType { SOURCE_TYPE_ULTRASONIC = 8, SOURCE_TYPE_VIRTUAL_CAPTURE = 9, // only for voice call SOURCE_TYPE_VOICE_MESSAGE = 10, - SOURCE_TYPE_MAX = SOURCE_TYPE_VOICE_MESSAGE + SOURCE_TYPE_REMOTE_CAST = 11, + SOURCE_TYPE_MAX = SOURCE_TYPE_REMOTE_CAST }; typedef enum { diff --git a/interfaces/inner_api/native/audiomanager/include/audio_routing_manager.h b/interfaces/inner_api/native/audiomanager/include/audio_routing_manager.h index 190deda0a2..3e148d603f 100644 --- a/interfaces/inner_api/native/audiomanager/include/audio_routing_manager.h +++ b/interfaces/inner_api/native/audiomanager/include/audio_routing_manager.h @@ -28,6 +28,7 @@ namespace AudioStandard { class AudioDeviceDescriptor; class AudioRendererFilter; +class AudioDeviceRefiner; class AudioPreferredOutputDeviceChangeCallback { public: virtual ~AudioPreferredOutputDeviceChangeCallback() = default; @@ -70,6 +71,9 @@ public: std::vector> GetAvailableMicrophones(); std::vector> GetAvailableDevices(AudioDeviceUsage usage); std::unique_ptr GetActiveBluetoothDevice(); + int32_t SetAudioDeviceRefinerCallback(const std::shared_ptr &callback); + int32_t UnsetAudioDeviceRefinerCallback(); + int32_t TriggerFetchDevice(); private: uint32_t GetCallingPid(); }; diff --git a/interfaces/inner_api/native/audiomanager/include/audio_system_manager.h b/interfaces/inner_api/native/audiomanager/include/audio_system_manager.h index b18348df7f..e1faba3ff4 100644 --- a/interfaces/inner_api/native/audiomanager/include/audio_system_manager.h +++ b/interfaces/inner_api/native/audiomanager/include/audio_system_manager.h @@ -382,6 +382,16 @@ private: std::shared_ptr cb_; }; +class AudioDeviceRefiner { +public: + virtual ~AudioDeviceRefiner() = default; + + virtual int32_t OnAudioOutputDeviceRefined(std::vector> &descs, + RouterType routerType, StreamUsage streamUsage, int32_t clientUid, RenderMode renderMode) = 0; + virtual int32_t OnAudioInputDeviceRefined(std::vector> &descs, + RouterType routerType, SourceType sourceType, int32_t clientUid, RenderMode renderMode) = 0; +}; + /** * @brief The AudioSystemManager class is an abstract definition of audio manager. * Provides a series of client/interfaces for audio management diff --git a/services/audio_policy/client/include/audio_policy_base.h b/services/audio_policy/client/include/audio_policy_base.h index 867d01ca07..bfb88c67d1 100644 --- a/services/audio_policy/client/include/audio_policy_base.h +++ b/services/audio_policy/client/include/audio_policy_base.h @@ -280,6 +280,12 @@ public: virtual bool IsHeadTrackingDataRequested(const std::string &macAddress) = 0; + virtual int32_t SetAudioDeviceRefinerCallback(const sptr &object) = 0; + + virtual int32_t UnsetAudioDeviceRefinerCallback() = 0; + + virtual int32_t TriggerFetchDevice() = 0; + public: DECLARE_INTERFACE_DESCRIPTOR(u"IAudioPolicy"); }; diff --git a/services/audio_policy/client/include/audio_policy_manager_stub.h b/services/audio_policy/client/include/audio_policy_manager_stub.h index 07745d115e..6252d20941 100644 --- a/services/audio_policy/client/include/audio_policy_manager_stub.h +++ b/services/audio_policy/client/include/audio_policy_manager_stub.h @@ -141,6 +141,9 @@ private: void SetSpatializationSceneTypeInternal(MessageParcel &data, MessageParcel &reply); void GetMaxAmplitudeInternal(MessageParcel &data, MessageParcel &reply); void IsHeadTrackingDataRequestedInternal(MessageParcel &data, MessageParcel &reply); + void SetAudioDeviceRefinerCallbackInternal(MessageParcel &data, MessageParcel &reply); + void UnsetAudioDeviceRefinerCallbackInternal(MessageParcel &data, MessageParcel &reply); + void TriggerFetchDeviceInternal(MessageParcel &data, MessageParcel &reply); using HandlerFunc = void(AudioPolicyManagerStub::*)(MessageParcel &data, MessageParcel &reply); static inline HandlerFunc handlers[] = { @@ -256,6 +259,9 @@ private: &AudioPolicyManagerStub::SetSpatializationSceneTypeInternal, &AudioPolicyManagerStub::GetMaxAmplitudeInternal, &AudioPolicyManagerStub::IsHeadTrackingDataRequestedInternal, + &AudioPolicyManagerStub::SetAudioDeviceRefinerCallbackInternal, + &AudioPolicyManagerStub::UnsetAudioDeviceRefinerCallbackInternal, + &AudioPolicyManagerStub::TriggerFetchDeviceInternal, }; static constexpr size_t handlersNums = sizeof(handlers) / sizeof(HandlerFunc); static_assert(handlersNums == (static_cast (AudioPolicyInterfaceCode::AUDIO_POLICY_MANAGER_CODE_MAX) + 1), diff --git a/services/audio_policy/client/include/audio_policy_proxy.h b/services/audio_policy/client/include/audio_policy_proxy.h index 73988dd947..0137e33eb9 100644 --- a/services/audio_policy/client/include/audio_policy_proxy.h +++ b/services/audio_policy/client/include/audio_policy_proxy.h @@ -267,6 +267,11 @@ public: float GetMaxAmplitude(const int32_t deviceId) override; bool IsHeadTrackingDataRequested(const std::string &macAddress) override; + int32_t SetAudioDeviceRefinerCallback(const sptr &object) override; + + int32_t UnsetAudioDeviceRefinerCallback() override; + + int32_t TriggerFetchDevice() override; private: static inline BrokerDelegator mDdelegator; void WriteStreamChangeInfo(MessageParcel &data, const AudioMode &mode, diff --git a/services/audio_policy/client/include/audio_routing_manager_listener_stub.h b/services/audio_policy/client/include/audio_routing_manager_listener_stub.h index 9fa520a8b8..a30a4d0683 100644 --- a/services/audio_policy/client/include/audio_routing_manager_listener_stub.h +++ b/services/audio_policy/client/include/audio_routing_manager_listener_stub.h @@ -30,9 +30,16 @@ public: MessageParcel &reply, MessageOption &option) override; void OnDistributedRoutingRoleChange(const sptr descriptor, const CastType type) override; void SetDistributedRoutingRoleCallback(const std::weak_ptr &callback); - + void SetAudioDeviceRefinerCallback(const std::weak_ptr &callback); + int32_t OnAudioOutputDeviceRefined(std::vector> &descs, + RouterType routerType, StreamUsage streamUsage, int32_t clientUid, RenderMode renderMode) override; + int32_t OnAudioInputDeviceRefined(std::vector> &descs, + RouterType routerType, SourceType sourceType, int32_t clientUid, RenderMode renderMode) override; private: + void OnAudioOutputDeviceRefinedInternal(MessageParcel &data, MessageParcel &reply); + void OnAudioInputDeviceRefinedInternal(MessageParcel &data, MessageParcel &reply); std::weak_ptr audioDistributedRoutingRoleCallback_; + std::weak_ptr audioDeviceRefinerCallback_; }; } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_policy/client/src/audio_policy_manager.cpp b/services/audio_policy/client/src/audio_policy_manager.cpp index b3924f277f..52fd4fa8ca 100644 --- a/services/audio_policy/client/src/audio_policy_manager.cpp +++ b/services/audio_policy/client/src/audio_policy_manager.cpp @@ -1520,5 +1520,45 @@ int32_t AudioPolicyManager::UnregisterHeadTrackingDataRequestedEventListener(con } return SUCCESS; } +int32_t AudioPolicyManager::SetAudioDeviceRefinerCallback(const std::shared_ptr &callback) +{ + const sptr gsp = GetAudioPolicyManagerProxy(); + CHECK_AND_RETURN_RET_LOG(gsp != nullptr, ERROR, "audio policy manager proxy is NULL."); + if (callback == nullptr) { + AUDIO_ERR_LOG("SetAudioDeviceRefinerCallback: callback is nullptr"); + return ERR_INVALID_PARAM; + }; + + std::unique_lock lock(listenerStubMutex_); + auto activeDistributedRoutingRoleCb = new (std::nothrow) AudioRoutingManagerListenerStub(); + if (activeDistributedRoutingRoleCb == nullptr) { + AUDIO_ERR_LOG("SetAudioDeviceRefinerCallback: object is nullptr"); + return ERROR; + } + activeDistributedRoutingRoleCb->SetAudioDeviceRefinerCallback(callback); + sptr object = activeDistributedRoutingRoleCb->AsObject(); + if (object == nullptr) { + AUDIO_ERR_LOG("SetAudioDeviceRefinerCallback: listenerStub is nullptr"); + delete activeDistributedRoutingRoleCb; + return ERROR; + } + + return gsp->SetAudioDeviceRefinerCallback(object); +} + +int32_t AudioPolicyManager::UnsetAudioDeviceRefinerCallback() +{ + const sptr gsp = GetAudioPolicyManagerProxy(); + CHECK_AND_RETURN_RET_LOG(gsp != nullptr, ERROR, "audio policy manager proxy is NULL."); + return gsp->UnsetAudioDeviceRefinerCallback(); +} + +int32_t AudioPolicyManager::TriggerFetchDevice() +{ + const sptr gsp = GetAudioPolicyManagerProxy(); + CHECK_AND_RETURN_RET_LOG(gsp != nullptr, ERROR, "audio policy manager proxy is NULL."); + return gsp->TriggerFetchDevice(); +} + } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_policy/client/src/audio_policy_proxy.cpp b/services/audio_policy/client/src/audio_policy_proxy.cpp index 6089cdec95..9a796d8b17 100644 --- a/services/audio_policy/client/src/audio_policy_proxy.cpp +++ b/services/audio_policy/client/src/audio_policy_proxy.cpp @@ -2107,5 +2107,54 @@ bool AudioPolicyProxy::IsHeadTrackingDataRequested(const std::string &macAddress CHECK_AND_RETURN_RET_LOG(error == ERR_NONE, false, "SendRequest failed, error: %d", error); return reply.ReadBool(); } + +int32_t AudioPolicyProxy::SetAudioDeviceRefinerCallback(const sptr &object) +{ + MessageParcel data; + MessageParcel reply; + MessageOption option; + + CHECK_AND_RETURN_RET_LOG(object != nullptr, ERR_NULL_OBJECT, "object is null"); + + bool ret = data.WriteInterfaceToken(GetDescriptor()); + CHECK_AND_RETURN_RET_LOG(ret, -1, "WriteInterfaceToken failed"); + + (void)data.WriteRemoteObject(object); + int32_t error = Remote()->SendRequest( + static_cast(AudioPolicyInterfaceCode::SET_AUDIO_DEVICE_REFINER_CALLBACK), data, reply, option); + CHECK_AND_RETURN_RET_LOG(error == ERR_NONE, error, "SendRequest failed, error: %{public}d", error); + return reply.ReadInt32(); +} + +int32_t AudioPolicyProxy::UnsetAudioDeviceRefinerCallback() +{ + MessageParcel data; + MessageParcel reply; + MessageOption option; + + bool ret = data.WriteInterfaceToken(GetDescriptor()); + CHECK_AND_RETURN_RET_LOG(ret, -1, "WriteInterfaceToken failed"); + + int32_t error = Remote()->SendRequest( + static_cast(AudioPolicyInterfaceCode::UNSET_AUDIO_DEVICE_REFINER_CALLBACK), data, reply, option); + CHECK_AND_RETURN_RET_LOG(error == ERR_NONE, error, "SendRequest failed, error: %{public}d", error); + return reply.ReadInt32(); +} + +int32_t AudioPolicyProxy::TriggerFetchDevice() +{ + MessageParcel data; + MessageParcel reply; + MessageOption option; + + bool ret = data.WriteInterfaceToken(GetDescriptor()); + CHECK_AND_RETURN_RET_LOG(ret, -1, "WriteInterfaceToken failed"); + + int32_t error = Remote()->SendRequest( + static_cast(AudioPolicyInterfaceCode::TRIGGER_FETCH_DEVICE), data, reply, option); + CHECK_AND_RETURN_RET_LOG(error == ERR_NONE, error, "SendRequest failed, error: %{public}d", error); + + return reply.ReadInt32(); +} } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_policy/client/src/audio_routing_manager_listener_stub.cpp b/services/audio_policy/client/src/audio_routing_manager_listener_stub.cpp index d67b94b54c..115a0e399f 100644 --- a/services/audio_policy/client/src/audio_routing_manager_listener_stub.cpp +++ b/services/audio_policy/client/src/audio_routing_manager_listener_stub.cpp @@ -21,6 +21,8 @@ #include "audio_routing_manager.h" #include "audio_log.h" +using namespace std; + namespace OHOS { namespace AudioStandard { AudioRoutingManagerListenerStub::AudioRoutingManagerListenerStub() @@ -43,6 +45,14 @@ int AudioRoutingManagerListenerStub::OnRemoteRequest( OnDistributedRoutingRoleChange(descriptor, type); return AUDIO_OK; } + case ON_AUDIO_OUTPUT_DEVICE_REFINERD: { + OnAudioOutputDeviceRefinedInternal(data, reply); + return AUDIO_OK; + } + case ON_AUDIO_INPUT_DEVICE_REFINERD: { + OnAudioInputDeviceRefinedInternal(data, reply); + return AUDIO_OK; + } default: { AUDIO_ERR_LOG("default case, need check AudioListenerStub"); return IPCObjectStub::OnRemoteRequest(code, data, reply, option); @@ -67,5 +77,83 @@ void AudioRoutingManagerListenerStub::SetDistributedRoutingRoleCallback( { audioDistributedRoutingRoleCallback_ = callback; } + +void AudioRoutingManagerListenerStub::SetAudioDeviceRefinerCallback(const std::weak_ptr &callback) +{ + audioDeviceRefinerCallback_ = callback; + std::shared_ptr audioDeviceRefinerCallback = audioDeviceRefinerCallback_.lock(); + CHECK_AND_RETURN_LOG(audioDeviceRefinerCallback != nullptr, "audioDeviceRefinerCallback_ is nullptr"); +} + +void AudioRoutingManagerListenerStub::OnAudioOutputDeviceRefinedInternal(MessageParcel &data, MessageParcel &reply) +{ + std::vector> descs; + int32_t size = data.ReadInt32(); + for (int32_t i = 0; i < size; i++) { + descs.push_back(make_unique(AudioDeviceDescriptor::Unmarshalling(data))); + } + RouterType routerType = static_cast(data.ReadInt32()); + StreamUsage streamUsage = static_cast(data.ReadInt32()); + int32_t clientUid = data.ReadInt32(); + RenderMode renderMode = static_cast(data.ReadInt32()); + + int32_t result = OnAudioOutputDeviceRefined(descs, routerType, streamUsage, clientUid, renderMode); + if (result == SUCCESS) { + reply.WriteInt32(result); + reply.WriteInt32(descs.size()); + for (auto &desc : descs) { + desc->Marshalling(reply); + } + } else { + reply.WriteInt32(result); + } +} + +void AudioRoutingManagerListenerStub::OnAudioInputDeviceRefinedInternal(MessageParcel &data, MessageParcel &reply) +{ + std::vector> descs; + int32_t size = data.ReadInt32(); + for (int32_t i = 0; i < size; i++) { + descs.push_back(make_unique(AudioDeviceDescriptor::Unmarshalling(data))); + } + RouterType routerType = static_cast(data.ReadInt32()); + SourceType sourceType = static_cast(data.ReadInt32()); + int32_t clientUid = data.ReadInt32(); + RenderMode renderMode = static_cast(data.ReadInt32()); + + int32_t result = OnAudioInputDeviceRefined(descs, routerType, sourceType, clientUid, renderMode); + if (result == SUCCESS) { + reply.WriteInt32(result); + reply.WriteInt32(descs.size()); + for (auto &desc : descs) { + desc->Marshalling(reply); + } + } else { + reply.WriteInt32(result); + } +} + +int32_t AudioRoutingManagerListenerStub::OnAudioOutputDeviceRefined( + std::vector> &descs, RouterType routerType, StreamUsage streamUsage, + int32_t clientUid, RenderMode renderMode) +{ + std::shared_ptr audioDeviceRefinerCallback = audioDeviceRefinerCallback_.lock(); + CHECK_AND_RETURN_RET_LOG(audioDeviceRefinerCallback != nullptr, + ERR_CALLBACK_NOT_REGISTERED, "audioDeviceRefinerCallback_ is nullptr"); + + return audioDeviceRefinerCallback->OnAudioOutputDeviceRefined(descs, routerType, streamUsage, clientUid, renderMode); +} + +int32_t AudioRoutingManagerListenerStub::OnAudioInputDeviceRefined( + std::vector> &descs, RouterType routerType, SourceType sourceType, + int32_t clientUid, RenderMode renderMode) +{ + std::shared_ptr audioDeviceRefinerCallback = audioDeviceRefinerCallback_.lock(); + CHECK_AND_RETURN_RET_LOG(audioDeviceRefinerCallback != nullptr, ERR_CALLBACK_NOT_REGISTERED, + "audioDeviceRefinerCallback_ is nullptr"); + + return audioDeviceRefinerCallback->OnAudioInputDeviceRefined(descs, routerType, sourceType, clientUid, renderMode); +} + } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_policy/common/include/audio_policy_ipc_interface_code.h b/services/audio_policy/common/include/audio_policy_ipc_interface_code.h index 58a4e9be62..40bf8c16fa 100644 --- a/services/audio_policy/common/include/audio_policy_ipc_interface_code.h +++ b/services/audio_policy/common/include/audio_policy_ipc_interface_code.h @@ -132,7 +132,10 @@ enum class AudioPolicyInterfaceCode { SET_SPATIALIZATION_SCENE_TYPE, GET_MAX_AMPLITUDE, IS_HEAD_TRACKING_DATA_REQUESTED, - AUDIO_POLICY_MANAGER_CODE_MAX = IS_HEAD_TRACKING_DATA_REQUESTED, + SET_AUDIO_DEVICE_REFINER_CALLBACK, + UNSET_AUDIO_DEVICE_REFINER_CALLBACK, + TRIGGER_FETCH_DEVICE, + AUDIO_POLICY_MANAGER_CODE_MAX = TRIGGER_FETCH_DEVICE, }; } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_policy/common/include/i_standard_audio_routing_manager_listener.h b/services/audio_policy/common/include/i_standard_audio_routing_manager_listener.h index ab8d2c8357..33829f2a56 100644 --- a/services/audio_policy/common/include/i_standard_audio_routing_manager_listener.h +++ b/services/audio_policy/common/include/i_standard_audio_routing_manager_listener.h @@ -23,7 +23,7 @@ namespace OHOS { namespace AudioStandard { -class IStandardAudioRoutingManagerListener : public IRemoteBroker { +class IStandardAudioRoutingManagerListener : public IRemoteBroker, public AudioDeviceRefiner { public: virtual ~IStandardAudioRoutingManagerListener() = default; virtual void OnDistributedRoutingRoleChange(const sptr descriptor, const CastType type) = 0; @@ -34,6 +34,8 @@ public: enum AudioRingerModeUpdateListenerMsg { ON_ERROR = 0, ON_DISTRIBUTED_ROUTING_ROLE_CHANGE, + ON_AUDIO_OUTPUT_DEVICE_REFINERD, + ON_AUDIO_INPUT_DEVICE_REFINERD, }; DECLARE_INTERFACE_DESCRIPTOR(u"IStandardAudioRoutingManagerListener"); diff --git a/services/audio_policy/server/config/audio_interrupt_policy_config.xml b/services/audio_policy/server/config/audio_interrupt_policy_config.xml index fff1dd0750..7e1e29fc86 100644 --- a/services/audio_policy/server/config/audio_interrupt_policy_config.xml +++ b/services/audio_policy/server/config/audio_interrupt_policy_config.xml @@ -45,6 +45,7 @@ + @@ -73,6 +74,7 @@ + @@ -101,6 +103,7 @@ + @@ -149,6 +152,7 @@ + @@ -178,6 +182,7 @@ + @@ -211,6 +216,7 @@ + @@ -246,6 +252,7 @@ + @@ -279,6 +286,7 @@ + @@ -320,6 +328,7 @@ + @@ -348,6 +357,7 @@ + @@ -378,6 +388,7 @@ + @@ -428,6 +439,7 @@ + @@ -448,6 +460,7 @@ + @@ -488,6 +501,7 @@ + @@ -533,6 +547,7 @@ + @@ -570,6 +585,7 @@ + @@ -605,6 +621,7 @@ + @@ -639,6 +656,7 @@ + @@ -676,6 +694,7 @@ + @@ -714,6 +733,7 @@ + @@ -749,6 +769,7 @@ + @@ -779,6 +800,7 @@ + @@ -821,6 +843,7 @@ + @@ -855,6 +878,7 @@ + @@ -871,6 +895,7 @@ + @@ -925,6 +950,7 @@ + @@ -933,4 +959,41 @@ + + + nil + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/services/audio_policy/server/include/audio_policy_server.h b/services/audio_policy/server/include/audio_policy_server.h index f7dc23ed09..d4f8899233 100644 --- a/services/audio_policy/server/include/audio_policy_server.h +++ b/services/audio_policy/server/include/audio_policy_server.h @@ -361,6 +361,12 @@ public: bool IsHeadTrackingDataRequested(const std::string &macAddress) override; + int32_t SetAudioDeviceRefinerCallback(const sptr &object) override; + + int32_t UnsetAudioDeviceRefinerCallback() override; + + int32_t TriggerFetchDevice() override; + class RemoteParameterCallback : public AudioParameterCallback { public: RemoteParameterCallback(sptr server); @@ -414,6 +420,7 @@ private: static constexpr int32_t EDM_SERVICE_UID = 3057; static constexpr char DAUDIO_DEV_TYPE_SPK = '1'; static constexpr char DAUDIO_DEV_TYPE_MIC = '2'; + static constexpr int32_t AUDIO_UID = 1041; static const std::list RECORD_ALLOW_BACKGROUND_LIST; static const std::list RECORD_PASS_APPINFO_LIST; @@ -519,6 +526,7 @@ private: std::set saveAppCapTokenIdThroughMS; bool isHighResolutionExist_ = false; std::mutex descLock_; + AudioRouterCenter &audioRouterCenter_; }; } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_policy/server/include/audio_policy_server_handler.h b/services/audio_policy/server/include/audio_policy_server_handler.h index e2be974368..60475caa7f 100644 --- a/services/audio_policy/server/include/audio_policy_server_handler.h +++ b/services/audio_policy/server/include/audio_policy_server_handler.h @@ -144,6 +144,8 @@ public: bool SendCapturerRemovedEvent(uint64_t sessionId, bool isSync); bool SendWakeupCloseEvent(bool isSync); bool SendHeadTrackingDeviceChangeEvent(const std::unordered_map &changeInfo); + void AddAudioDeviceRefinerCb(const sptr &callback); + int32_t RemoveAudioDeviceRefinerCb(); protected: void ProcessEvent(const AppExecFwk::InnerEvent::Pointer &event) override; diff --git a/services/audio_policy/server/include/audio_routing_manager_listener_proxy.h b/services/audio_policy/server/include/audio_routing_manager_listener_proxy.h index 3ca7e2d96c..23bceb1bb6 100644 --- a/services/audio_policy/server/include/audio_routing_manager_listener_proxy.h +++ b/services/audio_policy/server/include/audio_routing_manager_listener_proxy.h @@ -27,6 +27,10 @@ public: virtual ~AudioRoutingManagerListenerProxy(); DISALLOW_COPY_AND_MOVE(AudioRoutingManagerListenerProxy); void OnDistributedRoutingRoleChange(const sptr desciptor, const CastType type) override; + int32_t OnAudioOutputDeviceRefined(std::vector> &descs, + RouterType routerType, StreamUsage streamUsage, int32_t clientUid, RenderMode renderMode) override; + int32_t OnAudioInputDeviceRefined(std::vector> &descs, + RouterType routerType, SourceType sourceType, int32_t clientUid, RenderMode renderMode) override; private: static inline BrokerDelegator delegator_; diff --git a/services/audio_policy/server/include/service/audio_policy_service.h b/services/audio_policy/server/include/service/audio_policy_service.h index 98ea8454e6..eb8c208543 100644 --- a/services/audio_policy/server/include/service/audio_policy_service.h +++ b/services/audio_policy/server/include/service/audio_policy_service.h @@ -361,7 +361,7 @@ public: int32_t SetA2dpDeviceVolume(const std::string &macAddress, const int32_t volume); - int32_t OnCapturerSessionAdded(uint64_t sessionID, SessionInfo sessionInfo); + int32_t OnCapturerSessionAdded(uint64_t sessionID, SessionInfo sessionInfo, AudioStreamInfo streamInfo); void OnCapturerSessionRemoved(uint64_t sessionID); @@ -427,6 +427,8 @@ public: int32_t ParsePolicyConfigXmlNodeModuleInfos(ModuleInfo moduleInfo); + int32_t TriggerFetchDevice(); + private: AudioPolicyService() :audioPolicyManager_(AudioPolicyManagerFactory::GetAudioPolicyManager()), @@ -629,7 +631,7 @@ private: void LoadSinksForCapturer(); - void LoadInnerCapturerSink(); + void LoadInnerCapturerSink(string moduleName, AudioStreamInfo streamInfo); void LoadReceiverSink(); @@ -709,6 +711,10 @@ private: int32_t ClosePortAndEraseIOHandle(const std::string &moduleName); + void UnloadInnerCapturerSink(string moduleName); + + void HandleRemoteCastDevice(bool isConnected, AudioStreamInfo streamInfo = {}); + bool isUpdateRouteSupported_ = true; bool isCurrentRemoteRenderer = false; bool remoteCapturerSwitch_ = false; @@ -829,7 +835,8 @@ private: static inline const std::unordered_set specialSourceTypeSet_ = { SOURCE_TYPE_PLAYBACK_CAPTURE, SOURCE_TYPE_WAKEUP, - SOURCE_TYPE_VIRTUAL_CAPTURE + SOURCE_TYPE_VIRTUAL_CAPTURE, + SOURCE_TYPE_REMOTE_CAST }; std::unordered_set sessionIdisRemovedSet_; diff --git a/services/audio_policy/server/include/service/interface/iaudio_policy_interface.h b/services/audio_policy/server/include/service/interface/iaudio_policy_interface.h index 3c228ecbb2..9a7938a0e6 100644 --- a/services/audio_policy/server/include/service/interface/iaudio_policy_interface.h +++ b/services/audio_policy/server/include/service/interface/iaudio_policy_interface.h @@ -111,6 +111,8 @@ public: virtual float GetSystemVolumeInDb(AudioVolumeType volumeType, int32_t volumeLevel, DeviceType deviceType) = 0; virtual std::string GetModuleArgs(const AudioModuleInfo &audioModuleInfo) const = 0; + + virtual void ResetRemoteCastDeviceVolume(); }; } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_policy/server/include/service/manager/audio_adapter_manager.h b/services/audio_policy/server/include/service/manager/audio_adapter_manager.h index 476d5cf132..5f573ba3be 100644 --- a/services/audio_policy/server/include/service/manager/audio_adapter_manager.h +++ b/services/audio_policy/server/include/service/manager/audio_adapter_manager.h @@ -137,6 +137,8 @@ public: bool IsAbsVolumeScene() const; std::string GetModuleArgs(const AudioModuleInfo &audioModuleInfo) const; + + void ResetRemoteCastDeviceVolume(); private: friend class PolicyCallbackImpl; diff --git a/services/audio_policy/server/include/service/routers/audio_router_center.h b/services/audio_policy/server/include/service/routers/audio_router_center.h index 0774164ae5..5d007d63d1 100644 --- a/services/audio_policy/server/include/service/routers/audio_router_center.h +++ b/services/audio_policy/server/include/service/routers/audio_router_center.h @@ -40,6 +40,8 @@ public: } std::unique_ptr FetchOutputDevice(StreamUsage streamUsage, int32_t clientUID); std::unique_ptr FetchInputDevice(SourceType sourceType, int32_t clientUID); + int32_t SetAudioDeviceRefinerCallback(const sptr &object); + int32_t UnsetAudioDeviceRefinerCallback(); private: AudioRouterCenter() @@ -97,8 +99,10 @@ private: ~AudioRouterCenter() {} - unique_ptr FetchMediaRenderDevice(StreamUsage streamUsage, int32_t clientUID); - unique_ptr FetchCallRenderDevice(StreamUsage streamUsage, int32_t clientUID); + unique_ptr FetchMediaRenderDevice(StreamUsage streamUsage, int32_t clientUID, + RouterType &routerType); + unique_ptr FetchCallRenderDevice(StreamUsage streamUsage, int32_t clientUID, + RouterType &routerType); bool HasScoDevice(); std::vector> mediaRenderRouters_; @@ -111,6 +115,8 @@ private: unordered_map renderConfigMap_; unordered_map capturerConfigMap_; + + sptr audioDeviceRefinerCb_; }; } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_policy/server/include/service/routers/cockpit_phone_router.h b/services/audio_policy/server/include/service/routers/cockpit_phone_router.h index 24cc21e4f6..d2919ef1f4 100644 --- a/services/audio_policy/server/include/service/routers/cockpit_phone_router.h +++ b/services/audio_policy/server/include/service/routers/cockpit_phone_router.h @@ -30,6 +30,11 @@ public: return name_; } + RouterType GetRouterType() override + { + return ROUTER_TYPE_COCKPIT_PHONE; + } + std::unique_ptr GetMediaRenderDevice(StreamUsage streamUsage, int32_t clientUID) override; std::unique_ptr GetCallRenderDevice(StreamUsage streamUsage, int32_t clientUID) override; std::unique_ptr GetCallCaptureDevice(SourceType sourceType, int32_t clientUID) override; diff --git a/services/audio_policy/server/include/service/routers/default_router.h b/services/audio_policy/server/include/service/routers/default_router.h index 8c1b63952a..71bbda0419 100644 --- a/services/audio_policy/server/include/service/routers/default_router.h +++ b/services/audio_policy/server/include/service/routers/default_router.h @@ -30,6 +30,11 @@ public: return name_; } + RouterType GetRouterType() override + { + return ROUTER_TYPE_DEFAULT; + } + std::unique_ptr GetMediaRenderDevice(StreamUsage streamUsage, int32_t clientUID) override; std::unique_ptr GetCallRenderDevice(StreamUsage streamUsage, int32_t clientUID) override; std::unique_ptr GetCallCaptureDevice(SourceType sourceType, int32_t clientUID) override; diff --git a/services/audio_policy/server/include/service/routers/package_filter_router.h b/services/audio_policy/server/include/service/routers/package_filter_router.h index c09defbdba..b9c765616c 100644 --- a/services/audio_policy/server/include/service/routers/package_filter_router.h +++ b/services/audio_policy/server/include/service/routers/package_filter_router.h @@ -29,6 +29,11 @@ public: { return name_; } + + RouterType GetRouterType() override + { + return ROUTER_TYPE_PACKAGE_FILTER; + } std::unique_ptr GetMediaRenderDevice(StreamUsage streamUsage, int32_t clientUID) override; std::unique_ptr GetCallRenderDevice(StreamUsage streamUsage, int32_t clientUID) override; std::unique_ptr GetCallCaptureDevice(SourceType sourceType, int32_t clientUID) override; diff --git a/services/audio_policy/server/include/service/routers/pair_device_router.h b/services/audio_policy/server/include/service/routers/pair_device_router.h index 8931c2d7ce..933b66decd 100644 --- a/services/audio_policy/server/include/service/routers/pair_device_router.h +++ b/services/audio_policy/server/include/service/routers/pair_device_router.h @@ -30,6 +30,11 @@ public: return name_; } + RouterType GetRouterType() override + { + return ROUTER_TYPE_PAIR_DEVICE; + } + std::unique_ptr GetMediaRenderDevice(StreamUsage streamUsage, int32_t clientUID) override; std::unique_ptr GetCallRenderDevice(StreamUsage streamUsage, int32_t clientUID) override; std::unique_ptr GetCallCaptureDevice(SourceType sourceType, int32_t clientUID) override; diff --git a/services/audio_policy/server/include/service/routers/privacy_priority_router.h b/services/audio_policy/server/include/service/routers/privacy_priority_router.h index abb509f47d..e3ec8bd93a 100644 --- a/services/audio_policy/server/include/service/routers/privacy_priority_router.h +++ b/services/audio_policy/server/include/service/routers/privacy_priority_router.h @@ -30,6 +30,11 @@ public: return name_; } + RouterType GetRouterType() override + { + return ROUTER_TYPE_PRIVACY_PRIORITY; + } + std::unique_ptr GetMediaRenderDevice(StreamUsage streamUsage, int32_t clientUID) override; std::unique_ptr GetCallRenderDevice(StreamUsage streamUsage, int32_t clientUID) override; std::unique_ptr GetCallCaptureDevice(SourceType sourceType, int32_t clientUID) override; diff --git a/services/audio_policy/server/include/service/routers/public_priority_router.h b/services/audio_policy/server/include/service/routers/public_priority_router.h index f9ab2ad7b8..ffac81f5e3 100644 --- a/services/audio_policy/server/include/service/routers/public_priority_router.h +++ b/services/audio_policy/server/include/service/routers/public_priority_router.h @@ -30,6 +30,11 @@ public: return name_; } + RouterType GetRouterType() override + { + return ROUTER_TYPE_PUBLIC_PRIORITY; + } + std::unique_ptr GetMediaRenderDevice(StreamUsage streamUsage, int32_t clientUID) override; std::unique_ptr GetCallRenderDevice(StreamUsage streamUsage, int32_t clientUID) override; std::unique_ptr GetCallCaptureDevice(SourceType sourceType, int32_t clientUID) override; diff --git a/services/audio_policy/server/include/service/routers/router_base.h b/services/audio_policy/server/include/service/routers/router_base.h index 08d5890b12..c8e8b104cb 100644 --- a/services/audio_policy/server/include/service/routers/router_base.h +++ b/services/audio_policy/server/include/service/routers/router_base.h @@ -34,6 +34,7 @@ public: virtual std::unique_ptr GetRingRenderDevice(StreamUsage streamUsage, int32_t clientUID) = 0; virtual std::unique_ptr GetRecordCaptureDevice(SourceType sourceType, int32_t clientUID) = 0; virtual std::unique_ptr GetToneRenderDevice(StreamUsage streamUsage, int32_t clientUID) = 0; + virtual RouterType GetRouterType() = 0; virtual std::string GetClassName() { diff --git a/services/audio_policy/server/include/service/routers/stream_filter_router.h b/services/audio_policy/server/include/service/routers/stream_filter_router.h index c0650d73c6..703a045f73 100644 --- a/services/audio_policy/server/include/service/routers/stream_filter_router.h +++ b/services/audio_policy/server/include/service/routers/stream_filter_router.h @@ -30,6 +30,11 @@ public: return name_; } + RouterType GetRouterType() override + { + return ROUTER_TYPE_STREAM_FILTER; + } + std::unique_ptr GetMediaRenderDevice(StreamUsage streamUsage, int32_t clientUID) override; std::unique_ptr GetCallRenderDevice(StreamUsage streamUsage, int32_t clientUID) override; std::unique_ptr GetCallCaptureDevice(SourceType sourceType, int32_t clientUID) override; diff --git a/services/audio_policy/server/include/service/routers/user_select_router.h b/services/audio_policy/server/include/service/routers/user_select_router.h index 699eda359f..75c0322f3a 100644 --- a/services/audio_policy/server/include/service/routers/user_select_router.h +++ b/services/audio_policy/server/include/service/routers/user_select_router.h @@ -33,6 +33,11 @@ public: return name_; } + RouterType GetRouterType() override + { + return ROUTER_TYPE_USER_SELECT; + } + std::unique_ptr GetMediaRenderDevice(StreamUsage streamUsage, int32_t clientUID) override; std::unique_ptr GetCallRenderDevice(StreamUsage streamUsage, int32_t clientUID) override; std::unique_ptr GetCallCaptureDevice(SourceType sourceType, int32_t clientUID) override; diff --git a/services/audio_policy/server/src/audio_policy_manager_stub.cpp b/services/audio_policy/server/src/audio_policy_manager_stub.cpp index 0e36a1e6f6..b3f5f7851b 100644 --- a/services/audio_policy/server/src/audio_policy_manager_stub.cpp +++ b/services/audio_policy/server/src/audio_policy_manager_stub.cpp @@ -1132,5 +1132,25 @@ void AudioPolicyManagerStub::IsHeadTrackingDataRequestedInternal(MessageParcel & bool result = IsHeadTrackingDataRequested(macAddress); reply.WriteBool(result); } + +void AudioPolicyManagerStub::SetAudioDeviceRefinerCallbackInternal(MessageParcel &data, MessageParcel &reply) +{ + sptr object = data.ReadRemoteObject(); + CHECK_AND_RETURN_LOG(object != nullptr, "SetAudioDeviceRefinerCallback obj is null"); + int32_t result = SetAudioDeviceRefinerCallback(object); + reply.WriteInt32(result); +} + +void AudioPolicyManagerStub::UnsetAudioDeviceRefinerCallbackInternal(MessageParcel &data, MessageParcel &reply) +{ + int32_t result = UnsetAudioDeviceRefinerCallback(); + reply.WriteInt32(result); +} + +void AudioPolicyManagerStub::TriggerFetchDeviceInternal(MessageParcel &data, MessageParcel &reply) +{ + int32_t result = TriggerFetchDevice(); + reply.WriteInt32(result); +} } // namespace audio_policy } // namespace OHOS diff --git a/services/audio_policy/server/src/audio_policy_server.cpp b/services/audio_policy/server/src/audio_policy_server.cpp index 9320715573..42f53034fb 100644 --- a/services/audio_policy/server/src/audio_policy_server.cpp +++ b/services/audio_policy/server/src/audio_policy_server.cpp @@ -102,7 +102,8 @@ const std::set RECORD_CHECK_FORWARD_LIST = { AudioPolicyServer::AudioPolicyServer(int32_t systemAbilityId, bool runOnCreate) : SystemAbility(systemAbilityId, runOnCreate), audioPolicyService_(AudioPolicyService::GetAudioPolicyService()), - audioSpatializationService_(AudioSpatializationService::GetAudioSpatializationService()) + audioSpatializationService_(AudioSpatializationService::GetAudioSpatializationService()), + audioRouterCenter_(AudioRouterCenter::GetAudioRouterCenter()) { volumeStep_ = system::GetIntParameter("const.multimedia.audio.volumestep", 1); AUDIO_INFO_LOG("Get volumeStep parameter success %{public}d", volumeStep_); @@ -2564,5 +2565,36 @@ bool AudioPolicyServer::IsHeadTrackingDataRequested(const std::string &macAddres { return audioSpatializationService_.IsHeadTrackingDataRequested(macAddress); } + +int32_t AudioPolicyServer::SetAudioDeviceRefinerCallback(const sptr &object) +{ + CHECK_AND_RETURN_RET_LOG(object != nullptr, ERR_INVALID_PARAM, "SetAudioDeviceRefinerCallback object is nullptr"); + auto callerUid = IPCSkeleton::GetCallingUid(); + if (callerUid != UID_AUDIO) { + AUDIO_ERR_LOG("SetAudioDeviceRefinerCallback: Error caller uid: %{public}d", callerUid); + return ERROR; + } + return audioRouterCenter_.SetAudioDeviceRefinerCallback(object); +} + +int32_t AudioPolicyServer::UnsetAudioDeviceRefinerCallback() +{ + auto callerUid = IPCSkeleton::GetCallingUid(); + if (callerUid != UID_AUDIO) { + AUDIO_ERR_LOG("UnsetAudioDeviceRefinerCallback: Error caller uid: %{public}d", callerUid); + return ERROR; + } + return audioRouterCenter_.UnsetAudioDeviceRefinerCallback(); +} + +int32_t AudioPolicyServer::TriggerFetchDevice() +{ + auto callerUid = IPCSkeleton::GetCallingUid(); + if (callerUid != UID_AUDIO) { + AUDIO_ERR_LOG("TriggerFetchDevice: Error caller uid: %{public}d", callerUid); + return ERROR; + } + return audioPolicyService_.TriggerFetchDevice(); +} } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_policy/server/src/audio_policy_server_handler.cpp b/services/audio_policy/server/src/audio_policy_server_handler.cpp index adcad1010b..20ebb17e21 100644 --- a/services/audio_policy/server/src/audio_policy_server_handler.cpp +++ b/services/audio_policy/server/src/audio_policy_server_handler.cpp @@ -639,7 +639,7 @@ void AudioPolicyServerHandler::HandleCapturerCreateEvent(const AppExecFwk::Inner eventContextObj->streamInfo_.channels}; eventContextObj->error_ = AudioPolicyService::GetAudioPolicyService().OnCapturerSessionAdded(sessionId, - sessionInfo); + sessionInfo, eventContextObj->streamInfo_); } void AudioPolicyServerHandler::HandleCapturerRemovedEvent(const AppExecFwk::InnerEvent::Pointer &event) diff --git a/services/audio_policy/server/src/audio_routing_manager_listener_proxy.cpp b/services/audio_policy/server/src/audio_routing_manager_listener_proxy.cpp index a2dcbe5d0e..b21c7dc704 100644 --- a/services/audio_policy/server/src/audio_routing_manager_listener_proxy.cpp +++ b/services/audio_policy/server/src/audio_routing_manager_listener_proxy.cpp @@ -19,6 +19,7 @@ #include "audio_routing_manager.h" #include "audio_system_manager.h" #include "audio_log.h" +#include "audio_errors.h" namespace OHOS { namespace AudioStandard { @@ -50,5 +51,77 @@ void AudioRoutingManagerListenerProxy::OnDistributedRoutingRoleChange(const sptr int error = Remote()->SendRequest(ON_DISTRIBUTED_ROUTING_ROLE_CHANGE, data, reply, option); CHECK_AND_RETURN_LOG(error == ERR_NONE, "OnDistributedRoutingRoleChangefailed, error: %{public}d", error); } + +int32_t AudioRoutingManagerListenerProxy::OnAudioOutputDeviceRefined( + std::vector> &descs, RouterType routerType, StreamUsage streamUsage, + int32_t clientUid, RenderMode renderMode) +{ + AUDIO_DEBUG_LOG("AudioRoutingManagerListenerProxy: OnAudioOutputDeviceRefined as listener proxy"); + MessageParcel data; + MessageParcel reply; + MessageOption option; + + CHECK_AND_RETURN_RET_LOG(data.WriteInterfaceToken(GetDescriptor()), ERROR, + "OnAudioOutputDeviceRefined: WriteInterfaceToken failed"); + + data.WriteInt32(descs.size()); + for (auto &desc : descs) { + desc->Marshalling(data); + } + data.WriteInt32(routerType); + data.WriteInt32(streamUsage); + data.WriteInt32(clientUid); + data.WriteInt32(renderMode); + + int error = Remote()->SendRequest(ON_AUDIO_OUTPUT_DEVICE_REFINERD, data, reply, option); + CHECK_AND_RETURN_RET_LOG(error == ERR_NONE, error, "OnAudioOutputDeviceRefined, error: %{public}d", error); + + int32_t result = reply.ReadInt32(); + CHECK_AND_RETURN_RET_LOG(result == SUCCESS, result, + "OnAudioOutputDeviceRefined callback failed, error %{public}d", result); + + descs.clear(); + int32_t size = reply.ReadInt32(); + for (int32_t i = 0; i < size; i++) { + descs.push_back(std::make_unique(AudioDeviceDescriptor::Unmarshalling(reply))); + } + return SUCCESS; +} + +int32_t AudioRoutingManagerListenerProxy::OnAudioInputDeviceRefined( + std::vector> &descs, RouterType routerType, SourceType sourceType, + int32_t clientUid, RenderMode renderMode) +{ + AUDIO_DEBUG_LOG("AudioRoutingManagerListenerProxy: OnAudioInputDeviceRefined as listener proxy"); + MessageParcel data; + MessageParcel reply; + MessageOption option; + + CHECK_AND_RETURN_RET_LOG(data.WriteInterfaceToken(GetDescriptor()), ERROR, + "OnAudioInputDeviceRefined: WriteInterfaceToken failed"); + + data.WriteInt32(descs.size()); + for (auto &desc : descs) { + desc->Marshalling(data); + } + data.WriteInt32(routerType); + data.WriteInt32(sourceType); + data.WriteInt32(clientUid); + data.WriteInt32(renderMode); + + int error = Remote()->SendRequest(ON_AUDIO_INPUT_DEVICE_REFINERD, data, reply, option); + CHECK_AND_RETURN_RET_LOG(error == ERR_NONE, error, "OnAudioInputDeviceRefined, error: %{public}d", error); + + int32_t result = reply.ReadInt32(); + CHECK_AND_RETURN_RET_LOG(result == SUCCESS, result, + "OnAudioInputDeviceRefined callback failed, error %{public}d", result); + + descs.clear(); + int32_t size = reply.ReadInt32(); + for (int32_t i = 0; i < size; i++) { + descs.push_back(std::make_unique(AudioDeviceDescriptor::Unmarshalling(reply))); + } + return SUCCESS; +} } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_policy/server/src/service/audio_device_manager.cpp b/services/audio_policy/server/src/service/audio_device_manager.cpp index 6140119b3e..a807410024 100644 --- a/services/audio_policy/server/src/service/audio_device_manager.cpp +++ b/services/audio_policy/server/src/service/audio_device_manager.cpp @@ -110,7 +110,8 @@ void AudioDeviceManager::FillArrayWhenDeviceAttrMatch(const shared_ptr &devDesc) { - if (devDesc->networkId_ != LOCAL_NETWORK_ID && devDesc->deviceRole_ == DeviceRole::OUTPUT_DEVICE) { + if ((devDesc->networkId_ != LOCAL_NETWORK_ID || devDesc->deviceType_ == DEVICE_TYPE_REMOTE_CAST) && + devDesc->deviceRole_ == DeviceRole::OUTPUT_DEVICE) { remoteRenderDevices_.push_back(devDesc); } } @@ -338,7 +339,7 @@ void AudioDeviceManager::AddNewDevice(const sptr &deviceD } AddConnectedDevices(devDesc); - if (devDesc->networkId_ != LOCAL_NETWORK_ID) { + if (devDesc->networkId_ != LOCAL_NETWORK_ID || devDesc->deviceType_ == DEVICE_TYPE_REMOTE_CAST) { AddRemoteRenderDev(devDesc); AddRemoteCaptureDev(devDesc); } else { diff --git a/services/audio_policy/server/src/service/audio_policy_service.cpp b/services/audio_policy/server/src/service/audio_policy_service.cpp index 1579370bdf..0e2db19caa 100644 --- a/services/audio_policy/server/src/service/audio_policy_service.cpp +++ b/services/audio_policy/server/src/service/audio_policy_service.cpp @@ -47,7 +47,6 @@ using namespace std; static const std::string INNER_CAPTURER_SINK_NAME = "InnerCapturer"; static const std::string RECEIVER_SINK_NAME = "Receiver"; static const std::string SINK_NAME_FOR_CAPTURE_SUFFIX = "_CAP"; -static const std::string MONITOR_SOURCE_SUFFIX = ".monitor"; static const std::vector VOLUME_TYPE_LIST = { STREAM_VOICE_CALL, @@ -72,6 +71,7 @@ const uint32_t PCM_24_BIT = 24; const uint32_t PCM_32_BIT = 32; const uint32_t BT_BUFFER_ADJUSTMENT_FACTOR = 50; const uint32_t ABS_VOLUME_SUPPORT_RETRY_INTERVAL_IN_MICROSECONDS = 10000; +const float RENDER_FRAME_INTERVAL_IN_SECONDS = 0.02; #ifdef BLUETOOTH_ENABLE const uint32_t USER_NOT_SELECT_BT = 1; const uint32_t USER_SELECT_BT = 2; @@ -1341,6 +1341,9 @@ std::string AudioPolicyService::GetSinkPortName(InternalDeviceType deviceType) case InternalDeviceType::DEVICE_TYPE_FILE_SINK: portName = FILE_SINK; break; + case InternalDeviceType::DEVICE_TYPE_REMOTE_CAST: + portName = REMOTE_CAST_INNER_CAPTURER_SINK_NAME; + break; default: portName = PORT_NONE; break; @@ -1571,7 +1574,7 @@ std::vector> AudioPolicyService::GetDevices(DeviceFl bool filterAllRemote = deviceFlag == DeviceFlag::ALL_DISTRIBUTED_DEVICES_FLAG && device->networkId_ != LOCAL_NETWORK_ID; bool filterRemoteOutput = deviceFlag == DeviceFlag::DISTRIBUTED_OUTPUT_DEVICES_FLAG - && device->networkId_ != LOCAL_NETWORK_ID + && (device->networkId_ != LOCAL_NETWORK_ID || device->deviceType_ == DEVICE_TYPE_REMOTE_CAST) && device->deviceRole_ == DeviceRole::OUTPUT_DEVICE; bool filterRemoteInput = deviceFlag == DeviceFlag::DISTRIBUTED_INPUT_DEVICES_FLAG && device->networkId_ != LOCAL_NETWORK_ID @@ -1625,7 +1628,8 @@ std::vector> AudioPolicyService::GetPreferredInputDe } if (networkId == LOCAL_NETWORK_ID) { unique_ptr desc = audioRouterCenter_.FetchInputDevice(captureInfo.sourceType, -1); - if (desc->deviceType_ == DEVICE_TYPE_NONE && captureInfo.sourceType == SOURCE_TYPE_PLAYBACK_CAPTURE) { + if (desc->deviceType_ == DEVICE_TYPE_NONE && (captureInfo.sourceType == SOURCE_TYPE_PLAYBACK_CAPTURE || + captureInfo.sourceType == SOURCE_TYPE_REMOTE_CAST)) { desc->deviceType_ = DEVICE_TYPE_INVALID; desc->deviceRole_ = INPUT_DEVICE; } @@ -2939,38 +2943,41 @@ void AudioPolicyService::OnDeviceStatusUpdated(DeviceType devType, bool isConnec // Pnp device status update AUDIO_INFO_LOG("Device connection state updated | TYPE[%{public}d] STATUS[%{public}d]", devType, isConnected); - std::lock_guard lock(deviceStatusUpdateSharedMutex_); - - int32_t result = ERROR; - result = HandleSpecialDeviceType(devType, isConnected); - CHECK_AND_RETURN_LOG(result == SUCCESS, "handle special deviceType failed."); - AudioDeviceDescriptor updatedDesc(devType, GetDeviceRole(devType)); - UpdateLocalGroupInfo(isConnected, macAddress, deviceName, streamInfo, updatedDesc); - + AudioStreamDeviceChangeReason reason; // fill device change action for callback std::vector> descForCb = {}; - auto isPresent = [&updatedDesc] (const sptr &descriptor) { - return descriptor->deviceType_ == updatedDesc.deviceType_ && - descriptor->macAddress_ == updatedDesc.macAddress_ && - descriptor->networkId_ == updatedDesc.networkId_; - }; - AudioStreamDeviceChangeReason reason; - if (isConnected) { - // If device already in list, remove it else do not modify the list - connectedDevices_.erase(std::remove_if(connectedDevices_.begin(), connectedDevices_.end(), isPresent), - connectedDevices_.end()); - UpdateConnectedDevicesWhenConnecting(updatedDesc, descForCb); - result = HandleLocalDeviceConnected(updatedDesc); - CHECK_AND_RETURN_LOG(result == SUCCESS, "Connect local device failed."); - reason = AudioStreamDeviceChangeReason::NEW_DEVICE_AVAILABLE; - } else { - UpdateConnectedDevicesWhenDisconnecting(updatedDesc, descForCb); - result = HandleLocalDeviceDisconnected(updatedDesc); - if (devType == DEVICE_TYPE_USB_HEADSET && isArmUsbDevice_) { - isArmUsbDevice_ = false; + + { + std::lock_guard lock(deviceStatusUpdateSharedMutex_); + + int32_t result = ERROR; + result = HandleSpecialDeviceType(devType, isConnected); + CHECK_AND_RETURN_LOG(result == SUCCESS, "handle special deviceType failed."); + AudioDeviceDescriptor updatedDesc(devType, GetDeviceRole(devType)); + UpdateLocalGroupInfo(isConnected, macAddress, deviceName, streamInfo, updatedDesc); + + auto isPresent = [&updatedDesc] (const sptr &descriptor) { + return descriptor->deviceType_ == updatedDesc.deviceType_ && + descriptor->macAddress_ == updatedDesc.macAddress_ && + descriptor->networkId_ == updatedDesc.networkId_; + }; + if (isConnected) { + // If device already in list, remove it else do not modify the list + connectedDevices_.erase(std::remove_if(connectedDevices_.begin(), connectedDevices_.end(), isPresent), + connectedDevices_.end()); + UpdateConnectedDevicesWhenConnecting(updatedDesc, descForCb); + result = HandleLocalDeviceConnected(updatedDesc); + CHECK_AND_RETURN_LOG(result == SUCCESS, "Connect local device failed."); + reason = AudioStreamDeviceChangeReason::NEW_DEVICE_AVAILABLE; + } else { + UpdateConnectedDevicesWhenDisconnecting(updatedDesc, descForCb); + result = HandleLocalDeviceDisconnected(updatedDesc); + if (devType == DEVICE_TYPE_USB_HEADSET && isArmUsbDevice_) { + isArmUsbDevice_ = false; + } + CHECK_AND_RETURN_LOG(result == SUCCESS, "Disconnect local device failed."); + reason = AudioStreamDeviceChangeReason::OLD_DEVICE_UNAVALIABLE; } - CHECK_AND_RETURN_LOG(result == SUCCESS, "Disconnect local device failed."); - reason = AudioStreamDeviceChangeReason::OLD_DEVICE_UNAVALIABLE; } TriggerDeviceChangedCallback(descForCb, isConnected); @@ -2997,32 +3004,34 @@ void AudioPolicyService::OnDeviceStatusUpdated(AudioDeviceDescriptor &updatedDes #endif AUDIO_INFO_LOG("Device connection state updated | TYPE[%{public}d] STATUS[%{public}d]", devType, isConnected); + AudioStreamDeviceChangeReason reason; + // fill device change action for callback + std::vector> descForCb = {}; - std::lock_guard lock(deviceStatusUpdateSharedMutex_); + { + std::lock_guard lock(deviceStatusUpdateSharedMutex_); - UpdateLocalGroupInfo(isConnected, macAddress, deviceName, streamInfo, updatedDesc); + UpdateLocalGroupInfo(isConnected, macAddress, deviceName, streamInfo, updatedDesc); - // fill device change action for callback - std::vector> descForCb = {}; - auto isPresent = [&updatedDesc] (const sptr &descriptor) { - return descriptor->deviceType_ == updatedDesc.deviceType_ && - descriptor->macAddress_ == updatedDesc.macAddress_ && - descriptor->networkId_ == updatedDesc.networkId_; - }; - AudioStreamDeviceChangeReason reason; - if (isConnected) { - // If device already in list, remove it else do not modify the list - connectedDevices_.erase(std::remove_if(connectedDevices_.begin(), connectedDevices_.end(), isPresent), - connectedDevices_.end()); - UpdateConnectedDevicesWhenConnecting(updatedDesc, descForCb); - int32_t result = HandleLocalDeviceConnected(updatedDesc); - CHECK_AND_RETURN_LOG(result == SUCCESS, "Connect local device failed."); - reason = AudioStreamDeviceChangeReason::NEW_DEVICE_AVAILABLE; - } else { - UpdateConnectedDevicesWhenDisconnecting(updatedDesc, descForCb); - int32_t result = HandleLocalDeviceDisconnected(updatedDesc); - CHECK_AND_RETURN_LOG(result == SUCCESS, "Disconnect local device failed."); - reason = AudioStreamDeviceChangeReason::OLD_DEVICE_UNAVALIABLE; + auto isPresent = [&updatedDesc] (const sptr &descriptor) { + return descriptor->deviceType_ == updatedDesc.deviceType_ && + descriptor->macAddress_ == updatedDesc.macAddress_ && + descriptor->networkId_ == updatedDesc.networkId_; + }; + if (isConnected) { + // If device already in list, remove it else do not modify the list + connectedDevices_.erase(std::remove_if(connectedDevices_.begin(), connectedDevices_.end(), isPresent), + connectedDevices_.end()); + UpdateConnectedDevicesWhenConnecting(updatedDesc, descForCb); + int32_t result = HandleLocalDeviceConnected(updatedDesc); + CHECK_AND_RETURN_LOG(result == SUCCESS, "Connect local device failed."); + reason = AudioStreamDeviceChangeReason::NEW_DEVICE_AVAILABLE; + } else { + UpdateConnectedDevicesWhenDisconnecting(updatedDesc, descForCb); + int32_t result = HandleLocalDeviceDisconnected(updatedDesc); + CHECK_AND_RETURN_LOG(result == SUCCESS, "Disconnect local device failed."); + reason = AudioStreamDeviceChangeReason::OLD_DEVICE_UNAVALIABLE; + } } TriggerDeviceChangedCallback(descForCb, isConnected); @@ -3608,7 +3617,8 @@ void AudioPolicyService::UpdateEffectDefaultSink(DeviceType deviceType) void AudioPolicyService::LoadSinksForCapturer() { AUDIO_INFO_LOG("Start"); - LoadInnerCapturerSink(); + AudioStreamInfo streamInfo; + LoadInnerCapturerSink(INNER_CAPTURER_SINK_NAME, streamInfo); LoadReceiverSink(); const sptr gsp = GetAudioServerProxy(); CHECK_AND_RETURN_LOG(gsp != nullptr, "error for g_adProxy null"); @@ -3618,15 +3628,29 @@ void AudioPolicyService::LoadSinksForCapturer() CHECK_AND_RETURN_LOG(ret, "PlaybackCapturerManager create failed"); } -void AudioPolicyService::LoadInnerCapturerSink() +void AudioPolicyService::LoadInnerCapturerSink(string moduleName, AudioStreamInfo streamInfo) { AUDIO_INFO_LOG("Start"); + uint32_t bufferSize = (streamInfo.samplingRate * GetSampleFormatValue(streamInfo.format) + * streamInfo.channels) / PCM_8_BIT * RENDER_FRAME_INTERVAL_IN_SECONDS; + AudioModuleInfo moduleInfo = {}; moduleInfo.lib = "libmodule-inner-capturer-sink.z.so"; + moduleInfo.format = ConvertToHDIAudioFormat(streamInfo.format); moduleInfo.name = INNER_CAPTURER_SINK_NAME; + moduleInfo.networkId = "LocalDevice"; + moduleInfo.channels = std::to_string(streamInfo.channels); + moduleInfo.rate = std::to_string(streamInfo.samplingRate); + moduleInfo.bufferSize = std::to_string(bufferSize); + OpenPortAndInsertIOHandle(moduleInfo.name, moduleInfo); } +void AudioPolicyService::UnloadInnerCapturerSink(string moduleName) +{ + ClosePortAndEraseIOHandle(moduleName); +} + void AudioPolicyService::LoadReceiverSink() { AUDIO_INFO_LOG("Start"); @@ -4451,6 +4475,7 @@ DeviceRole AudioPolicyService::GetDeviceRole(DeviceType deviceType) const case DeviceType::DEVICE_TYPE_USB_HEADSET: case DeviceType::DEVICE_TYPE_DP: case DeviceType::DEVICE_TYPE_USB_ARM_HEADSET: + case DeviceType::DEVICE_TYPE_REMOTE_CAST: return DeviceRole::OUTPUT_DEVICE; case DeviceType::DEVICE_TYPE_MIC: case DeviceType::DEVICE_TYPE_WAKEUP: @@ -5120,6 +5145,12 @@ void AudioPolicyService::OnCapturerSessionRemoved(uint64_t sessionID) return; } + if (sessionWithNormalSourceType_[sessionID].sourceType == SOURCE_TYPE_REMOTE_CAST) { + HandleRemoteCastDevice(false); + sessionWithNormalSourceType_.erase(sessionID); + return; + } + if (sessionWithNormalSourceType_.count(sessionID) > 0) { sessionWithNormalSourceType_.erase(sessionID); if (!sessionWithNormalSourceType_.empty()) { @@ -5133,7 +5164,8 @@ void AudioPolicyService::OnCapturerSessionRemoved(uint64_t sessionID) sessionIdisRemovedSet_.insert(sessionID); } -int32_t AudioPolicyService::OnCapturerSessionAdded(uint64_t sessionID, SessionInfo sessionInfo) +int32_t AudioPolicyService::OnCapturerSessionAdded(uint64_t sessionID, SessionInfo sessionInfo, + AudioStreamInfo streamInfo) { if (sessionIdisRemovedSet_.count(sessionID) > 0) { sessionIdisRemovedSet_.erase(sessionID); @@ -5161,6 +5193,9 @@ int32_t AudioPolicyService::OnCapturerSessionAdded(uint64_t sessionID, SessionIn moduleInfo.name, true, INPUT_DEVICES_FLAG); } sessionWithNormalSourceType_[sessionID] = sessionInfo; + } else if (sessionInfo.sourceType == SOURCE_TYPE_REMOTE_CAST) { + HandleRemoteCastDevice(true, streamInfo); + sessionWithNormalSourceType_[sessionID] = sessionInfo; } else { sessionWithSpecialSourceType_[sessionID] = sessionInfo; } @@ -5699,5 +5734,35 @@ int32_t AudioPolicyService::ClosePortAndEraseIOHandle(const std::string &moduleN CHECK_AND_RETURN_RET_LOG(result == SUCCESS, result, "CloseAudioPort failed %{public}d", result); return SUCCESS; } + +void AudioPolicyService::HandleRemoteCastDevice(bool isConnected, AudioStreamInfo streamInfo) +{ + AudioDeviceDescriptor updatedDesc = AudioDeviceDescriptor(DEVICE_TYPE_REMOTE_CAST, GetDeviceRole(DEVICE_TYPE_REMOTE_CAST)); + std::vector> descForCb = {}; + auto isPresent = [&updatedDesc] (const sptr &descriptor) { + return descriptor->deviceType_ == updatedDesc.deviceType_ && + descriptor->macAddress_ == updatedDesc.macAddress_ && + descriptor->networkId_ == updatedDesc.networkId_; + }; + if (isConnected) { + // If device already in list, remove it else do not modify the list + connectedDevices_.erase(std::remove_if(connectedDevices_.begin(), connectedDevices_.end(), isPresent), + connectedDevices_.end()); + UpdateConnectedDevicesWhenConnecting(updatedDesc, descForCb); + LoadInnerCapturerSink(REMOTE_CAST_INNER_CAPTURER_SINK_NAME, streamInfo); + audioPolicyManager_.ResetRemoteCastDeviceVolume(); + } else { + UpdateConnectedDevicesWhenDisconnecting(updatedDesc, descForCb); + UnloadInnerCapturerSink(REMOTE_CAST_INNER_CAPTURER_SINK_NAME); + } + TriggerFetchDevice(); +} + +int32_t AudioPolicyService::TriggerFetchDevice() +{ + FetchDevice(true); + FetchDevice(false); + return SUCCESS; +} } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_policy/server/src/service/config/audio_focus_parser.cpp b/services/audio_policy/server/src/service/config/audio_focus_parser.cpp index 43582b4e37..f0ffaeaab0 100644 --- a/services/audio_policy/server/src/service/config/audio_focus_parser.cpp +++ b/services/audio_policy/server/src/service/config/audio_focus_parser.cpp @@ -78,7 +78,9 @@ std::map AudioFocusParser::audioFocusMap = { {"SOURCE_TYPE_VOICE_CALL", {AudioStreamType::STREAM_DEFAULT, SourceType::SOURCE_TYPE_VOICE_CALL, false}}, {"SOURCE_TYPE_VOICE_MESSAGE", - {AudioStreamType::STREAM_DEFAULT, SourceType::SOURCE_TYPE_VOICE_MESSAGE, false}} + {AudioStreamType::STREAM_DEFAULT, SourceType::SOURCE_TYPE_VOICE_MESSAGE, false}}, + {"SOURCE_TYPE_REMOTE_CAST", + {AudioStreamType::STREAM_DEFAULT, SourceType::SOURCE_TYPE_REMOTE_CAST, false}} }; // Initialize action map with string vs InterruptActionType diff --git a/services/audio_policy/server/src/service/manager/audio_adapter_manager.cpp b/services/audio_policy/server/src/service/manager/audio_adapter_manager.cpp index 73d5893ae4..6a14021672 100644 --- a/services/audio_policy/server/src/service/manager/audio_adapter_manager.cpp +++ b/services/audio_policy/server/src/service/manager/audio_adapter_manager.cpp @@ -841,6 +841,9 @@ std::string AudioAdapterManager::GetVolumeGroupForDevice(DeviceType deviceType) case DEVICE_TYPE_DP: volumeGroup = "wired"; break; + case DEVICE_TYPE_REMOTE_CAST: + volumeGroup = "remote-cast"; + break; default: AUDIO_ERR_LOG("Device %{public}d is not invalid value for volume group", deviceType); return ""; @@ -1005,6 +1008,15 @@ void AudioAdapterManager::InitVolumeMap(bool isFirstBoot) } } +void AudioAdapterManager::ResetRemoteCastDeviceVolume() +{ + for (auto &streamType: VOLUME_TYPE_LIST) { + AudioStreamType streamAlias = GetStreamForVolumeMap(streamType); + int32_t volumeLevel = GetMaxVolumeLevel(streamAlias); + WriteVolumeToKvStore(DEVICE_TYPE_REMOTE_CAST, streamType, volumeLevel); + } +} + void AudioAdapterManager::InitRingerMode(bool isFirstBoot) { CHECK_AND_RETURN_LOG(audioPolicyKvStore_ != nullptr, "InitRingerMode: kvstore is null!"); diff --git a/services/audio_policy/server/src/service/routers/audio_router_center.cpp b/services/audio_policy/server/src/service/routers/audio_router_center.cpp index 7fe53ddd73..7f231cf077 100644 --- a/services/audio_policy/server/src/service/routers/audio_router_center.cpp +++ b/services/audio_policy/server/src/service/routers/audio_router_center.cpp @@ -31,26 +31,26 @@ const string CALL_CAPTURE_ROUTERS = "CallCaptureRouters"; const string RING_RENDER_ROUTERS = "RingRenderRouters"; const string TONE_RENDER_ROUTERS = "ToneRenderRouters"; -unique_ptr AudioRouterCenter::FetchMediaRenderDevice(StreamUsage streamUsage, int32_t clientUID) +unique_ptr AudioRouterCenter::FetchMediaRenderDevice( + StreamUsage streamUsage, int32_t clientUID, RouterType &routerType) { for (auto &router : mediaRenderRouters_) { unique_ptr desc = router->GetMediaRenderDevice(streamUsage, clientUID); if (desc->deviceType_ != DEVICE_TYPE_NONE) { - AUDIO_INFO_LOG("MediaRender streamUsage %{public}d clientUID %{public}d fetch device %{public}d", - streamUsage, clientUID, desc->deviceType_); + routerType = router->GetRouterType(); return desc; } } return make_unique(); } -unique_ptr AudioRouterCenter::FetchCallRenderDevice(StreamUsage streamUsage, int32_t clientUID) +unique_ptr AudioRouterCenter::FetchCallRenderDevice( + StreamUsage streamUsage, int32_t clientUID, RouterType &routerType) { for (auto &router : callRenderRouters_) { unique_ptr desc = router->GetCallRenderDevice(streamUsage, clientUID); if (desc->deviceType_ != DEVICE_TYPE_NONE) { - AUDIO_INFO_LOG("CallRender streamUsage %{public}d clientUID %{public}d fetch device %{public}d", - streamUsage, clientUID, desc->deviceType_); + routerType = router->GetRouterType(); return desc; } } @@ -80,6 +80,8 @@ bool AudioRouterCenter::HasScoDevice() unique_ptr AudioRouterCenter::FetchOutputDevice(StreamUsage streamUsage, int32_t clientUID) { AUDIO_INFO_LOG("streamUsage %{public}d clientUID %{public}d start fetch device", streamUsage, clientUID); + unique_ptr desc = make_unique(); + RouterType routerType = ROUTER_TYPE_NONE; if (renderConfigMap_[streamUsage] == MEDIA_RENDER_ROUTERS || renderConfigMap_[streamUsage] == RING_RENDER_ROUTERS || renderConfigMap_[streamUsage] == TONE_RENDER_ROUTERS) { @@ -90,70 +92,93 @@ unique_ptr AudioRouterCenter::FetchOutputDevice(StreamUsa return router->name_ == "package_filter_router"; }; auto itr = find_if(mediaRenderRouters_.begin(), mediaRenderRouters_.end(), isPresent); - unique_ptr desc = make_unique(); if (itr != mediaRenderRouters_.end()) { desc = (*itr)->GetMediaRenderDevice(streamUsage, clientUID); + routerType = (*itr)->GetRouterType(); } - if (desc->deviceType_ != DEVICE_TYPE_NONE) { - AUDIO_INFO_LOG("CallRender streamUsage %{public}d clientUID %{public}d fetch device %{public}d", - streamUsage, clientUID, desc->deviceType_); - return desc; - } - streamUsage = audioScene == AUDIO_SCENE_PHONE_CALL ? STREAM_USAGE_VOICE_MODEM_COMMUNICATION + if (desc->deviceType_ == DEVICE_TYPE_NONE) { + streamUsage = audioScene == AUDIO_SCENE_PHONE_CALL ? STREAM_USAGE_VOICE_MODEM_COMMUNICATION : STREAM_USAGE_VOICE_COMMUNICATION; - desc = FetchCallRenderDevice(streamUsage, clientUID); - if (desc->deviceType_ != DEVICE_TYPE_NONE) { - return desc; + desc = FetchCallRenderDevice(streamUsage, clientUID, routerType); } } else { - unique_ptr desc = FetchMediaRenderDevice(streamUsage, clientUID); - if (desc->deviceType_ != DEVICE_TYPE_NONE) { - return desc; - } + desc = FetchMediaRenderDevice(streamUsage, clientUID, routerType); } } else if (renderConfigMap_[streamUsage] == CALL_RENDER_ROUTERS) { - unique_ptr desc = FetchCallRenderDevice(streamUsage, clientUID); - if (desc->deviceType_ != DEVICE_TYPE_NONE) { - return desc; - } + desc = FetchCallRenderDevice(streamUsage, clientUID, routerType); + } else { + AUDIO_INFO_LOG("streamUsage %{public}d didn't config router strategy, skipped", streamUsage); + return desc; } - AUDIO_DEBUG_LOG("streamUsage %{public}d clientUID %{public}d fetch no device", streamUsage, clientUID); - return make_unique(); + vector> descs; + descs.push_back(make_unique(*desc)); + if (audioDeviceRefinerCb_ != nullptr) { + audioDeviceRefinerCb_->OnAudioOutputDeviceRefined(descs, routerType, streamUsage, clientUID, PRIMARY); + } + AUDIO_INFO_LOG("streamUsage %{public}d clientUID %{public}d fetch device %{public}d", streamUsage, clientUID, + descs[0]->deviceType_); + return move(descs[0]); } unique_ptr AudioRouterCenter::FetchInputDevice(SourceType sourceType, int32_t clientUID) { AUDIO_INFO_LOG("sourceType %{public}d clientUID %{public}d start fetch input device", sourceType, clientUID); + unique_ptr desc = make_unique(); + RouterType routerType = ROUTER_TYPE_NONE; if (capturerConfigMap_[sourceType] == "RecordCaptureRouters") { for (auto &router : recordCaptureRouters_) { - unique_ptr desc = router->GetRecordCaptureDevice(sourceType, clientUID); + desc = router->GetRecordCaptureDevice(sourceType, clientUID); if (desc->deviceType_ != DEVICE_TYPE_NONE) { - AUDIO_INFO_LOG("RecordCapture sourceType %{public}d clientUID %{public}d fetch input device %{public}d", - sourceType, clientUID, desc->deviceType_); - return desc; + routerType = router->GetRouterType(); + break; } } } else if (capturerConfigMap_[sourceType] == "CallCaptureRouters") { for (auto &router : callCaptureRouters_) { - unique_ptr desc = router->GetCallCaptureDevice(sourceType, clientUID); + desc = router->GetCallCaptureDevice(sourceType, clientUID); if (desc->deviceType_ != DEVICE_TYPE_NONE) { - AUDIO_INFO_LOG("CallCapture sourceType %{public}d clientUID %{public}d fetch input device %{public}d", - sourceType, clientUID, desc->deviceType_); - return desc; + routerType = router->GetRouterType(); + break; } } } else if (capturerConfigMap_[sourceType] == "VoiceMessages") { for (auto &router : voiceMessageRouters_) { - unique_ptr desc = router->GetRecordCaptureDevice(sourceType, clientUID); + desc = router->GetRecordCaptureDevice(sourceType, clientUID); if (desc->deviceType_ != DEVICE_TYPE_NONE) { - AUDIO_INFO_LOG("VoiceMessages sourceType %{public}d clientUID %{public}d fetch input device %{public}d", - sourceType, clientUID, desc->deviceType_); - return desc; + routerType = router->GetRouterType(); + break; } } } - AUDIO_DEBUG_LOG("sourceType %{public}d clientUID %{public}d fetch no device", sourceType, clientUID); - return make_unique(); + else { + AUDIO_INFO_LOG("sourceType %{public}d didn't config router strategy, skipped", sourceType); + return desc; + } + vector> descs; + descs.push_back(make_unique(*desc)); + if (audioDeviceRefinerCb_ != nullptr) { + audioDeviceRefinerCb_->OnAudioInputDeviceRefined(descs, routerType, sourceType, clientUID , PRIMARY); + } + AUDIO_INFO_LOG("sourceType %{public}d clientUID %{public}d fetch device %{public}d", sourceType, clientUID, + descs[0]->deviceType_); + return move(descs[0]); +} + +int32_t AudioRouterCenter::SetAudioDeviceRefinerCallback(const sptr &object) +{ + sptr listener = iface_cast(object); + if (listener != nullptr) { + audioDeviceRefinerCb_ = listener; + return SUCCESS; + } else { + return ERROR; + } +} + +int32_t AudioRouterCenter::UnsetAudioDeviceRefinerCallback() +{ + audioDeviceRefinerCb_ = nullptr; + return SUCCESS; } } // namespace AudioStandard diff --git a/services/audio_service/client/src/audio_routing_manager.cpp b/services/audio_service/client/src/audio_routing_manager.cpp index c9b5f67087..9438f185a8 100644 --- a/services/audio_service/client/src/audio_routing_manager.cpp +++ b/services/audio_service/client/src/audio_routing_manager.cpp @@ -114,5 +114,27 @@ std::unique_ptr AudioRoutingManager::GetActiveBluetoothDe { return AudioPolicyManager::GetInstance().GetActiveBluetoothDevice(); } + +int32_t AudioRoutingManager::SetAudioDeviceRefinerCallback(const std::shared_ptr &callback) +{ + AUDIO_INFO_LOG("Entered %{public}s", __func__); + CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "callback is nullptr"); + + return AudioPolicyManager::GetInstance().SetAudioDeviceRefinerCallback(callback); +} + +int32_t AudioRoutingManager::UnsetAudioDeviceRefinerCallback() +{ + AUDIO_INFO_LOG("Entered %{public}s", __func__); + + return AudioPolicyManager::GetInstance().UnsetAudioDeviceRefinerCallback(); +} + +int32_t AudioRoutingManager::TriggerFetchDevice() +{ + AUDIO_INFO_LOG("Entered %{public}s", __func__); + + return AudioPolicyManager::GetInstance().TriggerFetchDevice(); +} } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_service/server/include/capturer_in_server.h b/services/audio_service/server/include/capturer_in_server.h index b28b71c56e..4bed38367d 100644 --- a/services/audio_service/server/include/capturer_in_server.h +++ b/services/audio_service/server/include/capturer_in_server.h @@ -20,6 +20,7 @@ #include "i_capturer_stream.h" #include "i_stream_listener.h" #include "oh_audio_buffer.h" +#include "audio_ring_cache.h" namespace OHOS { namespace AudioStandard { @@ -58,6 +59,7 @@ public: int32_t DrainAudioBuffer(); private: + int32_t InitCacheBuffer(size_t targetSize); std::mutex statusLock_; std::condition_variable statusCv_; std::shared_ptr stream_ = nullptr; @@ -80,6 +82,8 @@ private: bool resetTime_ = false; uint64_t resetTimestamp_ = 0; bool overFlowLogFlag = false; + std::unique_ptr ringCache_ = nullptr; + size_t cacheSizeInBytes_ = 0; }; } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_service/server/src/capturer_in_server.cpp b/services/audio_service/server/src/capturer_in_server.cpp index 5d7f2c21c9..fd3779b423 100644 --- a/services/audio_service/server/src/capturer_in_server.cpp +++ b/services/audio_service/server/src/capturer_in_server.cpp @@ -65,6 +65,9 @@ int32_t CapturerInServer::ConfigServerBuffer() return ERR_INVALID_PARAM; } + int32_t ret = InitCacheBuffer(2 * spanSizeInBytes_); + CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "InitCacheBuffer failed %{public}d", ret); + // create OHAudioBuffer in server audioServerBuffer_ = OHAudioBuffer::CreateFromLocal(totalSizeInFrame_, spanSizeInFrame_, byteSizePerFrame_); CHECK_AND_RETURN_RET_LOG(audioServerBuffer_ != nullptr, ERR_OPERATION_FAILED, "Create oh audio buffer failed"); @@ -72,7 +75,7 @@ int32_t CapturerInServer::ConfigServerBuffer() // we need to clear data buffer to avoid dirty data. memset_s(audioServerBuffer_->GetDataBase(), audioServerBuffer_->GetDataSize(), 0, audioServerBuffer_->GetDataSize()); - int32_t ret = InitBufferStatus(); + ret = InitBufferStatus(); AUDIO_DEBUG_LOG("Clear data buffer, ret:%{public}d", ret); isBufferConfiged_ = true; isInited_ = true; @@ -176,10 +179,8 @@ BufferDesc CapturerInServer::DequeueBuffer(size_t length) void CapturerInServer::ReadData(size_t length) { - if (length < spanSizeInBytes_) { - AUDIO_WARNING_LOG("Length %{public}zu is less than spanSizeInBytes %{public}zu", length, spanSizeInBytes_); - return; - } + CHECK_AND_RETURN_LOG(length >= spanSizeInBytes_, + "Length %{public}zu is less than spanSizeInBytes %{public}zu", length, spanSizeInBytes_); std::shared_ptr stateListener = streamListener_.lock(); CHECK_AND_RETURN_LOG(stateListener != nullptr, "IStreamListener is nullptr"); @@ -203,8 +204,17 @@ void CapturerInServer::ReadData(size_t length) } else { overFlowLogFlag = false; } - - BufferDesc srcBuffer = stream_->DequeueBuffer(length); + + OptResult result = ringCache_->GetWritableSize(); + CHECK_AND_RETURN_LOG(result.ret == OPERATION_SUCCESS, "RingCache write invalid size %{public}zu", result.size); + BufferDesc srcBuffer = stream_->DequeueBuffer(result.size); + ringCache_->Enqueue({srcBuffer.buffer, srcBuffer.bufLength}); + result = ringCache_->GetReadableSize(); + if (result.ret != OPERATION_SUCCESS || result.size < spanSizeInBytes_) { + AUDIO_INFO_LOG("RingCache size not full, return"); + stream_->EnqueueBuffer(srcBuffer); + return; + } { BufferDesc dstBuffer = {nullptr, 0, 0}; uint64_t curWritePos = audioServerBuffer_->GetCurWriteFrame(); @@ -212,7 +222,7 @@ void CapturerInServer::ReadData(size_t length) if (ret < 0) { return; } - memcpy_s(dstBuffer.buffer, spanSizeInBytes_, srcBuffer.buffer, spanSizeInBytes_); + ringCache_->Dequeue({dstBuffer.buffer, dstBuffer.bufLength}); uint64_t nextWriteFrame = currentWriteFrame + spanSizeInFrame_; AUDIO_DEBUG_LOG("Read data, current write frame: %{public}" PRIu64 ", next write frame: %{public}" PRIu64 "", @@ -380,5 +390,25 @@ void CapturerInServer::RegisterTestCallback(const std::weak_ptrReConfig(cacheSizeInBytes_, false); // false --> clear buffer + if (result.ret != OPERATION_SUCCESS) { + AUDIO_ERR_LOG("ReConfig AudioRingCache to size %{public}u failed:ret%{public}zu", result.ret, targetSize); + return ERR_OPERATION_FAILED; + } + } + + return SUCCESS; +} } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_service/server/src/pa_adapter_manager.cpp b/services/audio_service/server/src/pa_adapter_manager.cpp index 26025f3719..f51c212590 100644 --- a/services/audio_service/server/src/pa_adapter_manager.cpp +++ b/services/audio_service/server/src/pa_adapter_manager.cpp @@ -294,6 +294,8 @@ int32_t PaAdapterManager::GetDeviceNameForConnect(AudioProcessConfig processConf } } else if (processConfig.isInnerCapturer) { deviceName = INNER_CAPTURER_SOURCE; + } else if (processConfig.capturerInfo.sourceType == SOURCE_TYPE_REMOTE_CAST) { + deviceName = REMOTE_CAST_INNER_CAPTURER_SINK_NAME + MONITOR_SOURCE_SUFFIX; } return PolicyHandler::GetInstance().NotifyCapturerAdded(processConfig.capturerInfo, processConfig.streamInfo, sessionId); -- Gitee From 97b7ebecb6843dcf252fcd23498837fa61e0ea41 Mon Sep 17 00:00:00 2001 From: huyue57 Date: Wed, 17 Apr 2024 08:14:20 +0000 Subject: [PATCH 2/5] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=88=86=E5=B8=83?= =?UTF-8?q?=E5=BC=8F=E8=AE=BE=E5=A4=87=E9=80=89=E6=8B=A9=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: huyue57 Change-Id: I73c24455495fe4f7641f5ae91ef011b3ef4c1e41 --- .../client/src/audio_routing_manager_listener_stub.cpp | 5 +++-- .../include/service/interface/iaudio_policy_interface.h | 2 +- .../server/include/service/manager/audio_adapter_manager.h | 2 +- .../server/src/service/audio_policy_service.cpp | 3 ++- .../server/src/service/routers/audio_router_center.cpp | 7 +++---- services/audio_service/server/src/capturer_in_server.cpp | 3 +-- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/services/audio_policy/client/src/audio_routing_manager_listener_stub.cpp b/services/audio_policy/client/src/audio_routing_manager_listener_stub.cpp index 115a0e399f..48b283ccb7 100644 --- a/services/audio_policy/client/src/audio_routing_manager_listener_stub.cpp +++ b/services/audio_policy/client/src/audio_routing_manager_listener_stub.cpp @@ -141,7 +141,8 @@ int32_t AudioRoutingManagerListenerStub::OnAudioOutputDeviceRefined( CHECK_AND_RETURN_RET_LOG(audioDeviceRefinerCallback != nullptr, ERR_CALLBACK_NOT_REGISTERED, "audioDeviceRefinerCallback_ is nullptr"); - return audioDeviceRefinerCallback->OnAudioOutputDeviceRefined(descs, routerType, streamUsage, clientUid, renderMode); + return audioDeviceRefinerCallback->OnAudioOutputDeviceRefined(descs, routerType, streamUsage, clientUid, + renderMode); } int32_t AudioRoutingManagerListenerStub::OnAudioInputDeviceRefined( @@ -150,7 +151,7 @@ int32_t AudioRoutingManagerListenerStub::OnAudioInputDeviceRefined( { std::shared_ptr audioDeviceRefinerCallback = audioDeviceRefinerCallback_.lock(); CHECK_AND_RETURN_RET_LOG(audioDeviceRefinerCallback != nullptr, ERR_CALLBACK_NOT_REGISTERED, - "audioDeviceRefinerCallback_ is nullptr"); + "audioDeviceRefinerCallback_ is nullptr"); return audioDeviceRefinerCallback->OnAudioInputDeviceRefined(descs, routerType, sourceType, clientUid, renderMode); } diff --git a/services/audio_policy/server/include/service/interface/iaudio_policy_interface.h b/services/audio_policy/server/include/service/interface/iaudio_policy_interface.h index 9a7938a0e6..2ec3a9f813 100644 --- a/services/audio_policy/server/include/service/interface/iaudio_policy_interface.h +++ b/services/audio_policy/server/include/service/interface/iaudio_policy_interface.h @@ -112,7 +112,7 @@ public: virtual std::string GetModuleArgs(const AudioModuleInfo &audioModuleInfo) const = 0; - virtual void ResetRemoteCastDeviceVolume(); + virtual void ResetRemoteCastDeviceVolume(); }; } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_policy/server/include/service/manager/audio_adapter_manager.h b/services/audio_policy/server/include/service/manager/audio_adapter_manager.h index 5f573ba3be..9cf0d0beac 100644 --- a/services/audio_policy/server/include/service/manager/audio_adapter_manager.h +++ b/services/audio_policy/server/include/service/manager/audio_adapter_manager.h @@ -138,7 +138,7 @@ public: bool IsAbsVolumeScene() const; std::string GetModuleArgs(const AudioModuleInfo &audioModuleInfo) const; - void ResetRemoteCastDeviceVolume(); + void ResetRemoteCastDeviceVolume(); private: friend class PolicyCallbackImpl; diff --git a/services/audio_policy/server/src/service/audio_policy_service.cpp b/services/audio_policy/server/src/service/audio_policy_service.cpp index 0e2db19caa..f32a913210 100644 --- a/services/audio_policy/server/src/service/audio_policy_service.cpp +++ b/services/audio_policy/server/src/service/audio_policy_service.cpp @@ -5737,7 +5737,8 @@ int32_t AudioPolicyService::ClosePortAndEraseIOHandle(const std::string &moduleN void AudioPolicyService::HandleRemoteCastDevice(bool isConnected, AudioStreamInfo streamInfo) { - AudioDeviceDescriptor updatedDesc = AudioDeviceDescriptor(DEVICE_TYPE_REMOTE_CAST, GetDeviceRole(DEVICE_TYPE_REMOTE_CAST)); + AudioDeviceDescriptor updatedDesc = AudioDeviceDescriptor(DEVICE_TYPE_REMOTE_CAST, + GetDeviceRole(DEVICE_TYPE_REMOTE_CAST)); std::vector> descForCb = {}; auto isPresent = [&updatedDesc] (const sptr &descriptor) { return descriptor->deviceType_ == updatedDesc.deviceType_ && diff --git a/services/audio_policy/server/src/service/routers/audio_router_center.cpp b/services/audio_policy/server/src/service/routers/audio_router_center.cpp index 7f231cf077..7340eb8860 100644 --- a/services/audio_policy/server/src/service/routers/audio_router_center.cpp +++ b/services/audio_policy/server/src/service/routers/audio_router_center.cpp @@ -113,7 +113,7 @@ unique_ptr AudioRouterCenter::FetchOutputDevice(StreamUsa vector> descs; descs.push_back(make_unique(*desc)); if (audioDeviceRefinerCb_ != nullptr) { - audioDeviceRefinerCb_->OnAudioOutputDeviceRefined(descs, routerType, streamUsage, clientUID, PRIMARY); + audioDeviceRefinerCb_->OnAudioOutputDeviceRefined(descs, routerType, streamUsage, clientUid, PRIMARY); } AUDIO_INFO_LOG("streamUsage %{public}d clientUID %{public}d fetch device %{public}d", streamUsage, clientUID, descs[0]->deviceType_); @@ -149,15 +149,14 @@ unique_ptr AudioRouterCenter::FetchInputDevice(SourceType break; } } - } - else { + } else { AUDIO_INFO_LOG("sourceType %{public}d didn't config router strategy, skipped", sourceType); return desc; } vector> descs; descs.push_back(make_unique(*desc)); if (audioDeviceRefinerCb_ != nullptr) { - audioDeviceRefinerCb_->OnAudioInputDeviceRefined(descs, routerType, sourceType, clientUID , PRIMARY); + audioDeviceRefinerCb_->OnAudioInputDeviceRefined(descs, routerType, sourceType, clientUID, PRIMARY); } AUDIO_INFO_LOG("sourceType %{public}d clientUID %{public}d fetch device %{public}d", sourceType, clientUID, descs[0]->deviceType_); diff --git a/services/audio_service/server/src/capturer_in_server.cpp b/services/audio_service/server/src/capturer_in_server.cpp index fd3779b423..97d8c0ac25 100644 --- a/services/audio_service/server/src/capturer_in_server.cpp +++ b/services/audio_service/server/src/capturer_in_server.cpp @@ -218,8 +218,7 @@ void CapturerInServer::ReadData(size_t length) { BufferDesc dstBuffer = {nullptr, 0, 0}; uint64_t curWritePos = audioServerBuffer_->GetCurWriteFrame(); - int32_t ret = audioServerBuffer_->GetWriteBuffer(curWritePos, dstBuffer); - if (ret < 0) { + if (audioServerBuffer_->GetWriteBuffer(curWritePos, dstBuffer) < 0) { return; } ringCache_->Dequeue({dstBuffer.buffer, dstBuffer.bufLength}); -- Gitee From 1a2a4986f910b05b40fd008564840d667e31bbfc Mon Sep 17 00:00:00 2001 From: huyue57 Date: Wed, 17 Apr 2024 13:18:40 +0000 Subject: [PATCH 3/5] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=88=86=E5=B8=83?= =?UTF-8?q?=E5=BC=8F=E8=AE=BE=E5=A4=87=E9=80=89=E6=8B=A9=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: huyue57 Change-Id: Ie41479d03aace3913eaa2aaf13eac5f4e4ee7e86 --- .../audiocapturer/src/audio_capturer.cpp | 3 +- .../pulseaudio/modules/capturer/BUILD.gn | 6 ++- .../capturer/module_inner_capturer_sink.c | 2 +- .../native/pulseaudio/modules/hdi/hdi_sink.c | 4 +- .../native/audiocommon/include/audio_info.h | 52 +++++++++++++++++++ .../client/src/audio_policy_manager.cpp | 1 - .../server/src/audio_policy_manager_stub.cpp | 1 - .../server/src/audio_policy_server.cpp | 3 -- .../audio_routing_manager_listener_proxy.cpp | 2 - .../client/src/audio_routing_manager.cpp | 5 -- .../server/include/capturer_in_server.h | 1 + 11 files changed, 62 insertions(+), 18 deletions(-) diff --git a/frameworks/native/audiocapturer/src/audio_capturer.cpp b/frameworks/native/audiocapturer/src/audio_capturer.cpp index 48d0230d25..b5b2c6b239 100644 --- a/frameworks/native/audiocapturer/src/audio_capturer.cpp +++ b/frameworks/native/audiocapturer/src/audio_capturer.cpp @@ -15,6 +15,8 @@ #undef LOG_TAG #define LOG_TAG "AudioCapturer" +#include + #include "audio_capturer.h" #include "audio_capturer_private.h" @@ -22,7 +24,6 @@ #include "audio_utils.h" #include "audio_log.h" #include "audio_policy_manager.h" -#include namespace OHOS { namespace AudioStandard { diff --git a/frameworks/native/pulseaudio/modules/capturer/BUILD.gn b/frameworks/native/pulseaudio/modules/capturer/BUILD.gn index c8eca67767..e8b8ede38d 100644 --- a/frameworks/native/pulseaudio/modules/capturer/BUILD.gn +++ b/frameworks/native/pulseaudio/modules/capturer/BUILD.gn @@ -60,11 +60,13 @@ ohos_shared_library("module-inner-capturer-sink") { "$pulseaudio_build_path/src:pulsecommon", "$pulseaudio_build_path/src/pulse:pulse", "$pulseaudio_build_path/src/pulsecore:pulsecore", - "${third_party_path}/bounds_checking_function:libsec_shared", "../../../audioutils:audio_utils", ] - external_deps = [ "hilog:libhilog" ] + external_deps = [ + "hilog:libhilog", + "${third_party_path}/bounds_checking_function:libsec_shared", + ] subsystem_name = "multimedia" part_name = "audio_framework" diff --git a/frameworks/native/pulseaudio/modules/capturer/module_inner_capturer_sink.c b/frameworks/native/pulseaudio/modules/capturer/module_inner_capturer_sink.c index 6a96dd5b37..71f31bdef9 100644 --- a/frameworks/native/pulseaudio/modules/capturer/module_inner_capturer_sink.c +++ b/frameworks/native/pulseaudio/modules/capturer/module_inner_capturer_sink.c @@ -41,8 +41,8 @@ #include #include -#include "audio_log.h" #include "securec.h" +#include "audio_log.h" #include "audio_utils_c.h" PA_MODULE_AUTHOR("OpenHarmony"); diff --git a/frameworks/native/pulseaudio/modules/hdi/hdi_sink.c b/frameworks/native/pulseaudio/modules/hdi/hdi_sink.c index fe1abb134d..66b70bca89 100644 --- a/frameworks/native/pulseaudio/modules/hdi/hdi_sink.c +++ b/frameworks/native/pulseaudio/modules/hdi/hdi_sink.c @@ -2273,7 +2273,7 @@ static void PaInputStateChangeCb(pa_sink_input *i, pa_sink_input_state_t state) pa_sink_input_assert_ref(i); pa_assert(i->sink); if (!strcmp(i->sink->name, SINK_NAME_REMOTE_CAST_INNER_CAPTURER)) { - AUDIO_INFO_LOG("inner_cap return"); + AUDIO_INFO_LOG("PaInputStateChangeCb inner_cap return"); return; } pa_assert_se(u = i->sink->userdata); @@ -2325,7 +2325,7 @@ void PaInputVolumeChangeCb(pa_sink_input *i) pa_sink_input_assert_ref(i); if (!strcmp(i->sink->name, SINK_NAME_REMOTE_CAST_INNER_CAPTURER)) { - AUDIO_INFO_LOG("inner_cap return"); + AUDIO_INFO_LOG("PaInputVolumeChangeCb inner_cap return"); return; } pa_assert_se(u = i->sink->userdata); diff --git a/interfaces/inner_api/native/audiocommon/include/audio_info.h b/interfaces/inner_api/native/audiocommon/include/audio_info.h index c0c3d42fd2..91dc89ea42 100644 --- a/interfaces/inner_api/native/audiocommon/include/audio_info.h +++ b/interfaces/inner_api/native/audiocommon/include/audio_info.h @@ -914,21 +914,73 @@ struct SourceInfo { }; enum RouterType { + /** + * None router. + * @since 12 + */ ROUTER_TYPE_NONE = 0, + /** + * Default router. + * @since 12 + */ ROUTER_TYPE_DEFAULT, + /** + * Stream filter router. + * @since 12 + */ ROUTER_TYPE_STREAM_FILTER, + /** + * Package filter router. + * @since 12 + */ ROUTER_TYPE_PACKAGE_FILTER, + /** + * Cockpit phone router. + * @since 12 + */ ROUTER_TYPE_COCKPIT_PHONE, + /** + * Privacy priority router. + * @since 12 + */ ROUTER_TYPE_PRIVACY_PRIORITY, + /** + * Public priority router. + * @since 12 + */ ROUTER_TYPE_PUBLIC_PRIORITY, + /** + * Pair device router. + * @since 12 + */ ROUTER_TYPE_PAIR_DEVICE, + /** + * User select router. + * @since 12 + */ ROUTER_TYPE_USER_SELECT, }; enum RenderMode { + /** + * Primary render mode. + * @since 12 + */ PRIMARY, + /** + * VOIP render mode. + * @since 12 + */ VOIP, + /** + * Offload render mode. + * @since 12 + */ OFFLOAD, + /** + * Low latency render mode. + * @since 12 + */ LOW_LATENCY, }; } // namespace AudioStandard diff --git a/services/audio_policy/client/src/audio_policy_manager.cpp b/services/audio_policy/client/src/audio_policy_manager.cpp index 52fd4fa8ca..c422b7e5b0 100644 --- a/services/audio_policy/client/src/audio_policy_manager.cpp +++ b/services/audio_policy/client/src/audio_policy_manager.cpp @@ -1525,7 +1525,6 @@ int32_t AudioPolicyManager::SetAudioDeviceRefinerCallback(const std::shared_ptr< const sptr gsp = GetAudioPolicyManagerProxy(); CHECK_AND_RETURN_RET_LOG(gsp != nullptr, ERROR, "audio policy manager proxy is NULL."); if (callback == nullptr) { - AUDIO_ERR_LOG("SetAudioDeviceRefinerCallback: callback is nullptr"); return ERR_INVALID_PARAM; }; diff --git a/services/audio_policy/server/src/audio_policy_manager_stub.cpp b/services/audio_policy/server/src/audio_policy_manager_stub.cpp index b3f5f7851b..08d5a6a63d 100644 --- a/services/audio_policy/server/src/audio_policy_manager_stub.cpp +++ b/services/audio_policy/server/src/audio_policy_manager_stub.cpp @@ -1136,7 +1136,6 @@ void AudioPolicyManagerStub::IsHeadTrackingDataRequestedInternal(MessageParcel & void AudioPolicyManagerStub::SetAudioDeviceRefinerCallbackInternal(MessageParcel &data, MessageParcel &reply) { sptr object = data.ReadRemoteObject(); - CHECK_AND_RETURN_LOG(object != nullptr, "SetAudioDeviceRefinerCallback obj is null"); int32_t result = SetAudioDeviceRefinerCallback(object); reply.WriteInt32(result); } diff --git a/services/audio_policy/server/src/audio_policy_server.cpp b/services/audio_policy/server/src/audio_policy_server.cpp index 42f53034fb..b243d632f6 100644 --- a/services/audio_policy/server/src/audio_policy_server.cpp +++ b/services/audio_policy/server/src/audio_policy_server.cpp @@ -2571,7 +2571,6 @@ int32_t AudioPolicyServer::SetAudioDeviceRefinerCallback(const sptr> &descs, RouterType routerType, StreamUsage streamUsage, int32_t clientUid, RenderMode renderMode) { - AUDIO_DEBUG_LOG("AudioRoutingManagerListenerProxy: OnAudioOutputDeviceRefined as listener proxy"); MessageParcel data; MessageParcel reply; MessageOption option; @@ -92,7 +91,6 @@ int32_t AudioRoutingManagerListenerProxy::OnAudioInputDeviceRefined( std::vector> &descs, RouterType routerType, SourceType sourceType, int32_t clientUid, RenderMode renderMode) { - AUDIO_DEBUG_LOG("AudioRoutingManagerListenerProxy: OnAudioInputDeviceRefined as listener proxy"); MessageParcel data; MessageParcel reply; MessageOption option; diff --git a/services/audio_service/client/src/audio_routing_manager.cpp b/services/audio_service/client/src/audio_routing_manager.cpp index 9438f185a8..36a42a65a4 100644 --- a/services/audio_service/client/src/audio_routing_manager.cpp +++ b/services/audio_service/client/src/audio_routing_manager.cpp @@ -117,7 +117,6 @@ std::unique_ptr AudioRoutingManager::GetActiveBluetoothDe int32_t AudioRoutingManager::SetAudioDeviceRefinerCallback(const std::shared_ptr &callback) { - AUDIO_INFO_LOG("Entered %{public}s", __func__); CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "callback is nullptr"); return AudioPolicyManager::GetInstance().SetAudioDeviceRefinerCallback(callback); @@ -125,15 +124,11 @@ int32_t AudioRoutingManager::SetAudioDeviceRefinerCallback(const std::shared_ptr int32_t AudioRoutingManager::UnsetAudioDeviceRefinerCallback() { - AUDIO_INFO_LOG("Entered %{public}s", __func__); - return AudioPolicyManager::GetInstance().UnsetAudioDeviceRefinerCallback(); } int32_t AudioRoutingManager::TriggerFetchDevice() { - AUDIO_INFO_LOG("Entered %{public}s", __func__); - return AudioPolicyManager::GetInstance().TriggerFetchDevice(); } } // namespace AudioStandard diff --git a/services/audio_service/server/include/capturer_in_server.h b/services/audio_service/server/include/capturer_in_server.h index 4bed38367d..45d038a70b 100644 --- a/services/audio_service/server/include/capturer_in_server.h +++ b/services/audio_service/server/include/capturer_in_server.h @@ -60,6 +60,7 @@ public: private: int32_t InitCacheBuffer(size_t targetSize); + std::mutex statusLock_; std::condition_variable statusCv_; std::shared_ptr stream_ = nullptr; -- Gitee From 3f99169fcc95ce777021bc76473f884b536cfb89 Mon Sep 17 00:00:00 2001 From: huyue57 Date: Wed, 17 Apr 2024 13:35:53 +0000 Subject: [PATCH 4/5] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=88=86=E5=B8=83?= =?UTF-8?q?=E5=BC=8F=E8=AE=BE=E5=A4=87=E9=80=89=E6=8B=A9=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: huyue57 Change-Id: Ia85d4c4fe315155731e957706b2090463b11fcaa --- frameworks/native/pulseaudio/modules/capturer/BUILD.gn | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/frameworks/native/pulseaudio/modules/capturer/BUILD.gn b/frameworks/native/pulseaudio/modules/capturer/BUILD.gn index e8b8ede38d..13d3aee1af 100644 --- a/frameworks/native/pulseaudio/modules/capturer/BUILD.gn +++ b/frameworks/native/pulseaudio/modules/capturer/BUILD.gn @@ -63,10 +63,9 @@ ohos_shared_library("module-inner-capturer-sink") { "../../../audioutils:audio_utils", ] - external_deps = [ - "hilog:libhilog", - "${third_party_path}/bounds_checking_function:libsec_shared", - ] + external_deps = [ "hilog:libhilog" ] + + public_external_deps = [ "bounds_checking_function:libsec_shared" ] subsystem_name = "multimedia" part_name = "audio_framework" -- Gitee From 76c099f2a928465bf31d65e79c4cce8bce29ad35 Mon Sep 17 00:00:00 2001 From: huyue57 Date: Wed, 17 Apr 2024 13:57:33 +0000 Subject: [PATCH 5/5] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=88=86=E5=B8=83?= =?UTF-8?q?=E5=BC=8F=E8=AE=BE=E5=A4=87=E9=80=89=E6=8B=A9=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: huyue57 Change-Id: If0de01a559984945b927f1bbb11cb0d3db436f4e --- .../server/src/service/routers/audio_router_center.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/audio_policy/server/src/service/routers/audio_router_center.cpp b/services/audio_policy/server/src/service/routers/audio_router_center.cpp index 7340eb8860..cee6266bc2 100644 --- a/services/audio_policy/server/src/service/routers/audio_router_center.cpp +++ b/services/audio_policy/server/src/service/routers/audio_router_center.cpp @@ -113,7 +113,7 @@ unique_ptr AudioRouterCenter::FetchOutputDevice(StreamUsa vector> descs; descs.push_back(make_unique(*desc)); if (audioDeviceRefinerCb_ != nullptr) { - audioDeviceRefinerCb_->OnAudioOutputDeviceRefined(descs, routerType, streamUsage, clientUid, PRIMARY); + audioDeviceRefinerCb_->OnAudioOutputDeviceRefined(descs, routerType, streamUsage, clientUID, PRIMARY); } AUDIO_INFO_LOG("streamUsage %{public}d clientUID %{public}d fetch device %{public}d", streamUsage, clientUID, descs[0]->deviceType_); -- Gitee