From 7dbad84ef3c868af48cf79a71e21984cf59667aa Mon Sep 17 00:00:00 2001 From: songshenke Date: Mon, 22 Aug 2022 16:58:24 +0800 Subject: [PATCH 01/12] Handle mono audio and audio balance config change Test Signed-off-by: songshenke Change-Id: I03e0cdadde311b4632de8134d5d6df43a6b5980e --- .../include/audio_service_adapter.h | 11 ++++ .../pulse_audio_service_adapter_impl.h | 4 ++ .../src/pulse_audio_service_adapter_impl.cpp | 60 +++++++++++++++++++ services/audio_policy/BUILD.gn | 4 +- .../include/service/audio_policy_service.h | 10 +++- .../iaudio_accessibility_config_observer.h | 30 ++++++++++ .../interface/iaudio_policy_interface.h | 2 + .../listener/accessibility_config_listener.h | 44 ++++++++++++++ .../service/manager/audio_adapter_manager.h | 2 + .../src/service/audio_policy_service.cpp | 17 ++++++ .../accessibility_config_listener.cpp | 57 ++++++++++++++++++ .../service/manager/audio_adapter_manager.cpp | 10 ++++ 12 files changed, 249 insertions(+), 2 deletions(-) create mode 100755 services/audio_policy/server/include/service/interface/iaudio_accessibility_config_observer.h create mode 100755 services/audio_policy/server/include/service/listener/accessibility_config_listener.h create mode 100755 services/audio_policy/server/src/service/listener/accessibility_config_listener.cpp diff --git a/frameworks/native/audioadapter/include/audio_service_adapter.h b/frameworks/native/audioadapter/include/audio_service_adapter.h index 87276e2594..d274e786af 100644 --- a/frameworks/native/audioadapter/include/audio_service_adapter.h +++ b/frameworks/native/audioadapter/include/audio_service_adapter.h @@ -17,6 +17,7 @@ #define ST_AUDIO_SERVICE_ADAPTER_H #include +#include #include #include #include @@ -149,6 +150,16 @@ public: */ virtual int32_t SuspendAudioDevice(std::string &audioPortName, bool isSuspend) = 0; + /** + * @brief Adjust volume balance in current active device + * + * @param audioPortName Name of the default audio sink + * @param audioBalance Audio balance value + * @return Returns {@link SUCCESS} if suspend is success; returns an error code + * defined in {@link audio_errors.h} otherwise. + */ + virtual int32_t AdjustAudioBalance(const std::string &audioPortName, std::optional audioBalanceOptional) = 0; + /** * @brief returns if given streamType is set to mute * diff --git a/frameworks/native/audioadapter/include/pulse_audio_service_adapter_impl.h b/frameworks/native/audioadapter/include/pulse_audio_service_adapter_impl.h index 45bc6336ac..3d1fde4b10 100644 --- a/frameworks/native/audioadapter/include/pulse_audio_service_adapter_impl.h +++ b/frameworks/native/audioadapter/include/pulse_audio_service_adapter_impl.h @@ -38,6 +38,8 @@ public: int32_t SetVolume(AudioStreamType streamType, float volume) override; int32_t SetMute(AudioStreamType streamType, bool mute) override; int32_t SuspendAudioDevice(std::string &audioPortName, bool isSuspend) override; + int32_t AdjustAudioBalance(const std::string &audioPortName, + std::optional audioBalanceOptional) override; bool IsMute(AudioStreamType streamType) override; bool IsStreamActive(AudioStreamType streamType) override; std::vector GetAllSinkInputs() override; @@ -58,6 +60,7 @@ public: static void PaContextStateCb(pa_context *c, void *userdata); static void PaModuleLoadCb(pa_context *c, uint32_t idx, void *userdata); static void PaGetSinkInputInfoVolumeCb(pa_context *c, const pa_sink_input_info *i, int eol, void *userdata); + static void PaAdjustSinkAudioBalanceCb(pa_context *c, const pa_sink_info *i, int eol, void *userdata); static void PaSubscribeCb(pa_context *c, pa_subscription_event_type_t t, uint32_t idx, void *userdata); static void PaGetSinkInputInfoMuteCb(pa_context *c, const pa_sink_input_info *i, int eol, void *userdata); static void PaGetSinkInputInfoMuteStatusCb(pa_context *c, const pa_sink_input_info *i, int eol, void *userdata); @@ -85,6 +88,7 @@ private: static constexpr uint32_t PA_CONNECT_RETRY_SLEEP_IN_MICRO_SECONDS = 500000; pa_context *mContext = NULL; pa_threaded_mainloop *mMainLoop = NULL; + float mAudioBalance = 0.0f; static std::unordered_map sinkIndexSessionIDMap; std::mutex mMutex; }; diff --git a/frameworks/native/audioadapter/src/pulse_audio_service_adapter_impl.cpp b/frameworks/native/audioadapter/src/pulse_audio_service_adapter_impl.cpp index 2827c4c662..c2bc73f846 100644 --- a/frameworks/native/audioadapter/src/pulse_audio_service_adapter_impl.cpp +++ b/frameworks/native/audioadapter/src/pulse_audio_service_adapter_impl.cpp @@ -193,6 +193,38 @@ int32_t PulseAudioServiceAdapterImpl::SuspendAudioDevice(string &audioPortName, return SUCCESS; } +int32_t PulseAudioServiceAdapterImpl::AdjustAudioBalance(const std::string &audioPortName, std::optional audioBalanceOptional) +{ + lock_guard lock(mMutex); + + if (audioBalanceOptional.has_value()) { + mAudioBalance = audioBalanceOptional.value(); + } + AUDIO_INFO_LOG("Adjust audio balance for: [%{public}s] : %{public}f", audioPortName.c_str(), mAudioBalance); + + unique_ptr userData = make_unique(); + userData->thiz = this; + + pa_threaded_mainloop_lock(mMainLoop); + + pa_operation *operation = pa_context_get_sink_info_by_name(mContext, audioPortName.c_str(), + PaAdjustSinkAudioBalanceCb, reinterpret_cast(userData.get())); + if (operation == nullptr) { + AUDIO_ERR_LOG("[PulseAudioServiceAdapterImpl] pa_context_get_sink_info_by_name failed!"); + pa_threaded_mainloop_unlock(mMainLoop); + return ERR_OPERATION_FAILED; + } + + while (pa_operation_get_state(operation) == PA_OPERATION_RUNNING) { + pa_threaded_mainloop_wait(mMainLoop); + } + + pa_operation_unref(operation); + pa_threaded_mainloop_unlock(mMainLoop); + + return SUCCESS; +} + int32_t PulseAudioServiceAdapterImpl::SetDefaultSink(string name) { pa_threaded_mainloop_lock(mMainLoop); @@ -205,6 +237,8 @@ int32_t PulseAudioServiceAdapterImpl::SetDefaultSink(string name) pa_operation_unref(operation); pa_threaded_mainloop_unlock(mMainLoop); + // AdjustAudioBalance(name, {}); + return SUCCESS; } @@ -890,6 +924,32 @@ void PulseAudioServiceAdapterImpl::PaGetSinkInputInfoVolumeCb(pa_context *c, con "ISOUTPUT", 1, "STREAMID", sessionID, "STREAMTYPE", streamID, "VOLUME", vol); } +void PulseAudioServiceAdapterImpl::PaAdjustSinkAudioBalanceCb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) +{ + UserData *userData = reinterpret_cast(userdata); + PulseAudioServiceAdapterImpl *thiz = userData->thiz; + + AUDIO_INFO_LOG("[PulseAudioServiceAdapterImpl] PaAdjustSinkAudioBalanceCb"); + if (eol < 0) { + delete userData; + AUDIO_ERR_LOG("[PulseAudioServiceAdapterImpl] Failed to get sink information: %{public}s", + pa_strerror(pa_context_errno(c))); + return; + } + + if (eol) { + pa_threaded_mainloop_signal(thiz->mMainLoop, 0); + delete userData; + return; + } + + pa_cvolume cv = i->volume; + pa_channel_map channelMap = i->channel_map; + + pa_cvolume* adjustedCVolume = pa_cvolume_set_balance(&cv, &channelMap, thiz->mAudioBalance); + pa_context_set_sink_volume_by_name(c, i->name, adjustedCVolume, nullptr, nullptr); +} + void PulseAudioServiceAdapterImpl::PaGetSinkInputInfoCorkStatusCb(pa_context *c, const pa_sink_input_info *i, int eol, void *userdata) { diff --git a/services/audio_policy/BUILD.gn b/services/audio_policy/BUILD.gn index d643061f4a..e3b5a39a58 100644 --- a/services/audio_policy/BUILD.gn +++ b/services/audio_policy/BUILD.gn @@ -9,7 +9,7 @@ # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and -# limitations under the License. +# limitations under the License. import("//build/ohos.gni") import("//drivers/hdf_core/adapter/uhdf2/uhdf.gni") @@ -123,6 +123,7 @@ ohos_shared_library("audio_policy_service") { "server/src/service/audio_policy_service.cpp", "server/src/service/config/audio_focus_parser.cpp", "server/src/service/config/xml_parser.cpp", + "server/src/service/listener/accessibility_config_listener.cpp", "server/src/service/listener/device_status_listener.cpp", "server/src/service/manager/audio_adapter_manager.cpp", ] @@ -134,6 +135,7 @@ ohos_shared_library("audio_policy_service") { "$hdf_uhdf_path/host:libhdf_host", "$hdf_uhdf_path/ipc:libhdf_ipc_adapter", "$hdf_uhdf_path/utils:libhdf_utils", + "//foundation/barrierfree/accessibility/interfaces/innerkits/acfwk:accessibilityconfig", "//foundation/communication/bluetooth/services/bluetooth/ipc:btipc_static", "//foundation/communication/ipc/interfaces/innerkits/ipc_core:ipc_core", "//foundation/distributeddatamgr/distributeddatamgr/interfaces/innerkits/distributeddata:distributeddata_inner", 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 3cf7bc0ddb..27da964fdf 100644 --- a/services/audio_policy/server/include/service/audio_policy_service.h +++ b/services/audio_policy/server/include/service/audio_policy_service.h @@ -16,6 +16,7 @@ #ifndef ST_AUDIO_POLICY_SERVICE_H #define ST_AUDIO_POLICY_SERVICE_H +#include "accessibility_config_listener.h" #include "audio_info.h" #include "audio_policy_manager_factory.h" #include "audio_stream_collector.h" @@ -32,7 +33,8 @@ namespace OHOS { namespace AudioStandard { -class AudioPolicyService : public IPortObserver, public IDeviceStatusObserver { +class AudioPolicyService : public IPortObserver, public IDeviceStatusObserver, + public IAudioAccessibilityConfigObserver { public: static AudioPolicyService& GetAudioPolicyService() { @@ -123,6 +125,10 @@ public: void OnServiceConnected(AudioServiceIndex serviceIndex); + void OnMonoAudioConfigChanged(bool audioMono); + + void OnAudioBalanceChanged(float audioBalance); + int32_t SetAudioSessionCallback(AudioSessionCallback *callback); int32_t SetDeviceChangeCallback(const int32_t clientId, const DeviceFlag flag, const sptr &object); @@ -175,6 +181,7 @@ private: mStreamCollector(AudioStreamCollector::GetAudioStreamCollector()) { mDeviceStatusListener = std::make_unique(*this); + mAccessibilityConfigListener = std::make_shared(*this); } ~AudioPolicyService(); @@ -264,6 +271,7 @@ private: Parser& mConfigParser; AudioStreamCollector& mStreamCollector; std::unique_ptr mDeviceStatusListener; + std::shared_ptr mAccessibilityConfigListener; std::vector> mConnectedDevices; std::unordered_map connectedA2dpDeviceMap_; std::string activeBTDevice_; diff --git a/services/audio_policy/server/include/service/interface/iaudio_accessibility_config_observer.h b/services/audio_policy/server/include/service/interface/iaudio_accessibility_config_observer.h new file mode 100755 index 0000000000..51e7e05c74 --- /dev/null +++ b/services/audio_policy/server/include/service/interface/iaudio_accessibility_config_observer.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ST_AUDIO_ACCESSIBILITY_CONFIG_OBSERVER_H +#define ST_AUDIO_ACCESSIBILITY_CONFIG_OBSERVER_H + +#include "audio_info.h" + +namespace OHOS { +namespace AudioStandard { +class IAudioAccessibilityConfigObserver { +public: + virtual void OnMonoAudioConfigChanged(bool audioMono) = 0; + virtual void OnAudioBalanceChanged(float audioBalance) = 0; +}; +} // namespace AudioStandard +} // namespace OHOS +#endif // ST_AUDIO_ACCESSIBILITY_CONFIG_OBSERVER_H \ No newline at end of file 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 57f8ec9d7f..8c95825081 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 @@ -70,6 +70,8 @@ public: virtual int32_t SetAudioSessionCallback(AudioSessionCallback *callback) = 0; virtual int32_t SuspendAudioDevice(std::string &name, bool isSuspend) = 0; + + virtual int32_t AdjustAudioBalance(const std::string &portName, float audioBalance) = 0; }; } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_policy/server/include/service/listener/accessibility_config_listener.h b/services/audio_policy/server/include/service/listener/accessibility_config_listener.h new file mode 100755 index 0000000000..257037e8e6 --- /dev/null +++ b/services/audio_policy/server/include/service/listener/accessibility_config_listener.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ST_ACCESSIBILITY_CONFIG_LISTENER_H +#define ST_ACCESSIBILITY_CONFIG_LISTENER_H + +#include + +#include "accessibility_config.h" +#include "iaudio_accessibility_config_observer.h" + +namespace OHOS { +namespace AudioStandard { +class AccessibilityConfigListener : public OHOS::AccessibilityConfig::AccessibilityConfigObserver, + public std::enable_shared_from_this { +public: + AccessibilityConfigListener(IAudioAccessibilityConfigObserver &observer); + ~AccessibilityConfigListener(); + + void OnConfigChanged(const AccessibilityConfig::CONFIG_ID configId, + const AccessibilityConfig::ConfigValue &value) override; + + void SubscribeObserver(); + void UnsubscribeObserver(); + +private: + IAudioAccessibilityConfigObserver &audioAccessibilityConfigObserver_; +}; +} // namespace AudioStandard +} // namespace OHOS + +#endif // ST_ACCESSIBILITY_CONFIG_LISTENER_H \ No newline at end of file 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 826bcc4324..1dc5291c55 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 @@ -85,6 +85,8 @@ public: int32_t SuspendAudioDevice(std::string &name, bool isSuspend); + int32_t AdjustAudioBalance(const std::string &portName, float audioBalance); + virtual ~AudioAdapterManager() {} private: 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 ac83f59eaa..b44614cd93 100644 --- a/services/audio_policy/server/src/service/audio_policy_service.cpp +++ b/services/audio_policy/server/src/service/audio_policy_service.cpp @@ -69,6 +69,8 @@ bool AudioPolicyService::Init(void) return false; } + mAccessibilityConfigListener->SubscribeObserver(); + return true; } @@ -118,6 +120,8 @@ void AudioPolicyService::Deinit(void) mIOHandles.clear(); mDeviceStatusListener->UnRegisterDeviceStatusListener(); + mAccessibilityConfigListener->UnsubscribeObserver(); + return; } @@ -1301,6 +1305,19 @@ void AudioPolicyService::OnServiceConnected(AudioServiceIndex serviceIndex) } } +void AudioPolicyService::OnMonoAudioConfigChanged(bool audioMono) +{ + AUDIO_INFO_LOG("audioBalance: OnMonoAudioConfigChanged in"); +} + +void AudioPolicyService::OnAudioBalanceChanged(float audioBalance) +{ + AUDIO_INFO_LOG("audioBalance: OnAduioBalanceChanged in"); + std::string activePort = GetPortName(mCurrentActiveDevice_); + AUDIO_DEBUG_LOG("Adjust balance of active sink %{public}s, balance: %{public}f", activePort.c_str(), audioBalance); + // mAudioPolicyManager.AdjustAudioBalance(activePort, audioBalance); +} + void AudioPolicyService::AddAudioDevice(AudioModuleInfo& moduleInfo, InternalDeviceType devType) { // add new device into active device list diff --git a/services/audio_policy/server/src/service/listener/accessibility_config_listener.cpp b/services/audio_policy/server/src/service/listener/accessibility_config_listener.cpp new file mode 100755 index 0000000000..4ad6ba0389 --- /dev/null +++ b/services/audio_policy/server/src/service/listener/accessibility_config_listener.cpp @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "accessibility_config_listener.h" + +#include "audio_log.h" + +using namespace OHOS::AccessibilityConfig; + +namespace OHOS { +namespace AudioStandard { +AccessibilityConfigListener::AccessibilityConfigListener(IAudioAccessibilityConfigObserver &observer) + : audioAccessibilityConfigObserver_(observer) {} + +AccessibilityConfigListener::~AccessibilityConfigListener() {} + +void AccessibilityConfigListener::OnConfigChanged(const CONFIG_ID configId, const ConfigValue &value) +{ + AUDIO_INFO_LOG("audioBalance: OnConfigChanged in"); + if (configId == CONFIG_AUDIO_MONO) { + audioAccessibilityConfigObserver_.OnMonoAudioConfigChanged(value.audioMono); + } else if (configId == CONFIG_AUDIO_BALANCE) { + audioAccessibilityConfigObserver_.OnAudioBalanceChanged(value.audioBalance); + } +} + +void AccessibilityConfigListener::SubscribeObserver() +{ + AUDIO_INFO_LOG("audioBalance: SubscribeObserver in"); + auto &accessibilityConfig = OHOS::Singleton::GetInstance(); + (void)accessibilityConfig.InitializeContext(); + accessibilityConfig.SubscribeConfigObserver(CONFIG_AUDIO_MONO, shared_from_this()); + accessibilityConfig.SubscribeConfigObserver(CONFIG_AUDIO_BALANCE, shared_from_this()); +} + +void AccessibilityConfigListener::UnsubscribeObserver() +{ + AUDIO_INFO_LOG("audioBalance: UnsubscribeObserver in"); + auto &accessibilityConfig = OHOS::Singleton::GetInstance(); + (void)accessibilityConfig.InitializeContext(); + accessibilityConfig.UnsubscribeConfigObserver(CONFIG_AUDIO_MONO, shared_from_this()); + accessibilityConfig.UnsubscribeConfigObserver(CONFIG_AUDIO_BALANCE, shared_from_this()); +} +} // namespace AudioStandard +} // namespace OHOS \ No newline at end of file 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 7f7d30b697..3ff5a12a21 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 @@ -182,6 +182,16 @@ int32_t AudioAdapterManager::SuspendAudioDevice(std::string &portName, bool isSu return mAudioServiceAdapter->SuspendAudioDevice(portName, isSuspend); } +int32_t AudioAdapterManager::AdjustAudioBalance(const std::string &portName, float audioBalance) +{ + if (!mAudioServiceAdapter) { + AUDIO_ERR_LOG("[AudioAdapterManager] audio adapter null"); + return ERR_OPERATION_FAILED; + } + + return mAudioServiceAdapter->AdjustAudioBalance(portName, audioBalance); +} + int32_t AudioAdapterManager::SetDeviceActive(AudioIOHandle ioHandle, InternalDeviceType deviceType, std::string name, bool active) { -- Gitee From 02a82c9ddb233f680bc7661b37919538a97ea3db Mon Sep 17 00:00:00 2001 From: songshenke Date: Wed, 31 Aug 2022 17:56:21 +0800 Subject: [PATCH 02/12] Balance code 0831 & Mono start Both mono and balance in audio_render_sink 0922 Signed-off-by: songshenke Change-Id: Ie3689bfc170cb3bec4958606d20dec2ed1e06c5e --- .../include/audio_service_adapter.h | 9 ++ .../pulse_audio_service_adapter_impl.h | 4 + .../src/pulse_audio_service_adapter_impl.cpp | 122 +++++++++++++++++- .../native/audioutils/include/audio_utils.h | 2 + .../native/audioutils/src/audio_utils.cpp | 18 +++ .../sink/primary/audio_renderer_sink.cpp | 54 +++++++- .../sink/primary/audio_renderer_sink.h | 8 ++ .../interface/iaudio_policy_interface.h | 2 + .../service/manager/audio_adapter_manager.h | 2 + .../src/service/audio_policy_service.cpp | 40 +++++- .../accessibility_config_listener.cpp | 2 + .../service/manager/audio_adapter_manager.cpp | 12 ++ .../client/include/audio_manager_base.h | 18 +++ .../client/include/audio_manager_proxy.h | 2 + .../client/src/audio_manager_proxy.cpp | 36 ++++++ .../server/include/audio_server.h | 2 + .../server/src/audio_manager_stub.cpp | 14 ++ .../audio_service/server/src/audio_server.cpp | 24 ++++ 18 files changed, 358 insertions(+), 13 deletions(-) diff --git a/frameworks/native/audioadapter/include/audio_service_adapter.h b/frameworks/native/audioadapter/include/audio_service_adapter.h index d274e786af..42c0bc7568 100644 --- a/frameworks/native/audioadapter/include/audio_service_adapter.h +++ b/frameworks/native/audioadapter/include/audio_service_adapter.h @@ -150,6 +150,15 @@ public: */ virtual int32_t SuspendAudioDevice(std::string &audioPortName, bool isSuspend) = 0; + /** + * @brief Adjust audio mono + * + * @param + * @return Returns {@link SUCCESS} if suspend is success; returns an error code + * defined in {@link audio_errors.h} otherwise. + */ + virtual int32_t AdjustAudioMono(const std::string &audioPortName, std::optional audioMonoOptional) = 0; + /** * @brief Adjust volume balance in current active device * diff --git a/frameworks/native/audioadapter/include/pulse_audio_service_adapter_impl.h b/frameworks/native/audioadapter/include/pulse_audio_service_adapter_impl.h index 3d1fde4b10..9d74e62e58 100644 --- a/frameworks/native/audioadapter/include/pulse_audio_service_adapter_impl.h +++ b/frameworks/native/audioadapter/include/pulse_audio_service_adapter_impl.h @@ -38,6 +38,8 @@ public: int32_t SetVolume(AudioStreamType streamType, float volume) override; int32_t SetMute(AudioStreamType streamType, bool mute) override; int32_t SuspendAudioDevice(std::string &audioPortName, bool isSuspend) override; + int32_t AdjustAudioMono(const std::string &audioPortName, + std::optional audioMonoOptional) override; int32_t AdjustAudioBalance(const std::string &audioPortName, std::optional audioBalanceOptional) override; bool IsMute(AudioStreamType streamType) override; @@ -60,6 +62,7 @@ public: static void PaContextStateCb(pa_context *c, void *userdata); static void PaModuleLoadCb(pa_context *c, uint32_t idx, void *userdata); static void PaGetSinkInputInfoVolumeCb(pa_context *c, const pa_sink_input_info *i, int eol, void *userdata); + static void PaAdjustSinkAudioMonoCb(pa_context *c, const pa_sink_info *i, int eol, void *userdata); static void PaAdjustSinkAudioBalanceCb(pa_context *c, const pa_sink_info *i, int eol, void *userdata); static void PaSubscribeCb(pa_context *c, pa_subscription_event_type_t t, uint32_t idx, void *userdata); static void PaGetSinkInputInfoMuteCb(pa_context *c, const pa_sink_input_info *i, int eol, void *userdata); @@ -88,6 +91,7 @@ private: static constexpr uint32_t PA_CONNECT_RETRY_SLEEP_IN_MICRO_SECONDS = 500000; pa_context *mContext = NULL; pa_threaded_mainloop *mMainLoop = NULL; + bool mAudioMono = false; float mAudioBalance = 0.0f; static std::unordered_map sinkIndexSessionIDMap; std::mutex mMutex; diff --git a/frameworks/native/audioadapter/src/pulse_audio_service_adapter_impl.cpp b/frameworks/native/audioadapter/src/pulse_audio_service_adapter_impl.cpp index c2bc73f846..97becb29e8 100644 --- a/frameworks/native/audioadapter/src/pulse_audio_service_adapter_impl.cpp +++ b/frameworks/native/audioadapter/src/pulse_audio_service_adapter_impl.cpp @@ -193,32 +193,72 @@ int32_t PulseAudioServiceAdapterImpl::SuspendAudioDevice(string &audioPortName, return SUCCESS; } +int32_t PulseAudioServiceAdapterImpl::AdjustAudioMono(const std::string &audioPortName, std::optional audioMonoOptional) +{ + AUDIO_INFO_LOG("audioBalance: PulseAudioServiceAdapterImpl::AdjustAudioMono in"); + + lock_guard lock(mMutex); + + if (audioMonoOptional.has_value()) { + mAudioMono = audioMonoOptional.value(); + } + + unique_ptr userData = make_unique(); + userData->thiz = this; + + pa_threaded_mainloop_lock(mMainLoop); + AUDIO_INFO_LOG("audioBalance: PulseAudioServiceAdapterImpl::AdjustAudioMono: operation start"); + pa_operation *operation = pa_context_get_sink_info_by_name(mContext, audioPortName.c_str(), + PulseAudioServiceAdapterImpl::PaAdjustSinkAudioMonoCb, reinterpret_cast(userData.get())); + if (operation == nullptr) { + AUDIO_ERR_LOG("[PulseAudioServiceAdapterImpl] pa_context_get_sink_info_by_name failed!"); + pa_threaded_mainloop_unlock(mMainLoop); + return ERR_OPERATION_FAILED; + } + while (pa_operation_get_state(operation) == PA_OPERATION_RUNNING) { + pa_threaded_mainloop_wait(mMainLoop); + } + AUDIO_INFO_LOG("audioBalance: PulseAudioServiceAdapterImpl::AdjustAudioMono: operation end"); + + userData.release(); + AUDIO_INFO_LOG("audioBalance: PulseAudioServiceAdapterImpl::AdjustAudioMono: release finish"); + pa_operation_unref(operation); + pa_threaded_mainloop_unlock(mMainLoop); + + return SUCCESS; +} + int32_t PulseAudioServiceAdapterImpl::AdjustAudioBalance(const std::string &audioPortName, std::optional audioBalanceOptional) { + AUDIO_INFO_LOG("audioBalance: PulseAudioServiceAdapterImpl::AdjustAudioBalance in"); + lock_guard lock(mMutex); if (audioBalanceOptional.has_value()) { mAudioBalance = audioBalanceOptional.value(); } - AUDIO_INFO_LOG("Adjust audio balance for: [%{public}s] : %{public}f", audioPortName.c_str(), mAudioBalance); + AUDIO_INFO_LOG("audioBalance: Adjust audio balance for: [%{public}s] : %{public}f", audioPortName.c_str(), mAudioBalance); unique_ptr userData = make_unique(); userData->thiz = this; pa_threaded_mainloop_lock(mMainLoop); + AUDIO_INFO_LOG("audioBalance: PulseAudioServiceAdapterImpl::AdjustAudioBalance: operation start"); pa_operation *operation = pa_context_get_sink_info_by_name(mContext, audioPortName.c_str(), - PaAdjustSinkAudioBalanceCb, reinterpret_cast(userData.get())); + PulseAudioServiceAdapterImpl::PaAdjustSinkAudioBalanceCb, reinterpret_cast(userData.get())); if (operation == nullptr) { AUDIO_ERR_LOG("[PulseAudioServiceAdapterImpl] pa_context_get_sink_info_by_name failed!"); pa_threaded_mainloop_unlock(mMainLoop); return ERR_OPERATION_FAILED; } - while (pa_operation_get_state(operation) == PA_OPERATION_RUNNING) { pa_threaded_mainloop_wait(mMainLoop); } + AUDIO_INFO_LOG("audioBalance: PulseAudioServiceAdapterImpl::AdjustAudioBalance: operation end"); + userData.release(); + AUDIO_INFO_LOG("audioBalance: PulseAudioServiceAdapterImpl::AdjustAudioBalance: release finish"); pa_operation_unref(operation); pa_threaded_mainloop_unlock(mMainLoop); @@ -237,7 +277,10 @@ int32_t PulseAudioServiceAdapterImpl::SetDefaultSink(string name) pa_operation_unref(operation); pa_threaded_mainloop_unlock(mMainLoop); - // AdjustAudioBalance(name, {}); + AUDIO_INFO_LOG("audioBalance: PulseAudioServiceAdapterImpl::SetDefaultSink in: name[%{public}s]", name.c_str()); + + AdjustAudioBalance(name, {}); + AdjustAudioMono(name, {}); return SUCCESS; } @@ -924,16 +967,81 @@ void PulseAudioServiceAdapterImpl::PaGetSinkInputInfoVolumeCb(pa_context *c, con "ISOUTPUT", 1, "STREAMID", sessionID, "STREAMTYPE", streamID, "VOLUME", vol); } +void PulseAudioServiceAdapterImpl::PaAdjustSinkAudioMonoCb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) +{ + UserData *userData = reinterpret_cast(userdata); + PulseAudioServiceAdapterImpl *thiz = userData->thiz; + + AUDIO_INFO_LOG("audioBalance: [PulseAudioServiceAdapterImpl] PaAdjustSinkAudioMonoCb in"); + AUDIO_INFO_LOG("[PulseAudioServiceAdapterImpl] PaAdjustSinkAudioMonoCb"); + if (eol < 0) { + AUDIO_ERR_LOG("[PulseAudioServiceAdapterImpl] Failed to get sink information: %{public}s", + pa_strerror(pa_context_errno(c))); + delete userData; + return; + } + + if (eol) { + pa_threaded_mainloop_signal(thiz->mMainLoop, 0); + delete userData; + return; + } + + // // remap + // pa_channel_map channelMap = i->channel_map; + // pa_sample_spec sampleSpec = i->sample_spec; + + // pa_sample_format_t format = sampleSpec.format; + // unsigned inChannels = channelMap.channels; + // unsigned outChannels = 1; + + // pa_remap_t remap = {PA_SAMPLE_INVALID}; + // // setup_remap_channels: + // remap.format = format; + // remap.i_ss.channels = inChannels; + // remap.o_ss.channels = outChannels; + // for (unsigned i = 0; i < inChannels; i++) { + // remap.map_table_f[0][i] = 1.0f / inChannels; + // remap.map_table_i[0][i] = 0x10000 / inChannels; + // } + // pa_init_remap_func(&remap); + + // pa_pstream *pstream = c->pstream; + // pa_memchunk *input = &(pstream->write.memchunk); + // void *src = pa_memblock_acquire_chunk(input); + + // pa_mempool *mempool = c->mempool; + // pa_memblock *output = pa_memblock_new(mempool, input->memblock->length); + // void *dst = pa_memblock_acquire(output); + + // size_t sampleSize = pa_sample_size(&sampleSpec); + // unsigned nSamples = (unsigned) (input->length / sampleSize); + // unsigned nFrames = nSamples / inChannels; + + // // remap_func->do_remap(remap_func, out, in, nsamples); + // remap.do_remap(&remap, dst, src, nFrames); + + // pa_mempool_unref(mempool); + + // // // channelMap + // // AUDIO_INFO_LOG("audioBalance: [PulseAudioServiceAdapterImpl] PaAdjustSinkAudioMonoCb: channel_map.channels = %{public}d, initial", i->channel_map.channels); + // // pa_channel_map channelMap = i->channel_map; + // // (void)pa_channel_map_init_mono(&channelMap); + // // AUDIO_INFO_LOG("audioBalance: [PulseAudioServiceAdapterImpl] PaAdjustSinkAudioMonoCb: channel_map.channels = %{public}d, adjusted", i->channel_map.channels); + +} + void PulseAudioServiceAdapterImpl::PaAdjustSinkAudioBalanceCb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { UserData *userData = reinterpret_cast(userdata); PulseAudioServiceAdapterImpl *thiz = userData->thiz; + AUDIO_INFO_LOG("audioBalance: [PulseAudioServiceAdapterImpl] PaAdjustSinkAudioBalanceCb in"); AUDIO_INFO_LOG("[PulseAudioServiceAdapterImpl] PaAdjustSinkAudioBalanceCb"); if (eol < 0) { - delete userData; AUDIO_ERR_LOG("[PulseAudioServiceAdapterImpl] Failed to get sink information: %{public}s", pa_strerror(pa_context_errno(c))); + delete userData; return; } @@ -947,7 +1055,9 @@ void PulseAudioServiceAdapterImpl::PaAdjustSinkAudioBalanceCb(pa_context *c, con pa_channel_map channelMap = i->channel_map; pa_cvolume* adjustedCVolume = pa_cvolume_set_balance(&cv, &channelMap, thiz->mAudioBalance); - pa_context_set_sink_volume_by_name(c, i->name, adjustedCVolume, nullptr, nullptr); + pa_operation_unref(pa_context_set_sink_volume_by_name(c, i->name, adjustedCVolume, nullptr, nullptr)); + + AUDIO_INFO_LOG("audioBalance: [PulseAudioServiceAdapterImpl] PaAdjustSinkAudioBalanceCb out"); } void PulseAudioServiceAdapterImpl::PaGetSinkInputInfoCorkStatusCb(pa_context *c, const pa_sink_input_info *i, int eol, diff --git a/frameworks/native/audioutils/include/audio_utils.h b/frameworks/native/audioutils/include/audio_utils.h index 614f9e399d..46d814887a 100644 --- a/frameworks/native/audioutils/include/audio_utils.h +++ b/frameworks/native/audioutils/include/audio_utils.h @@ -21,6 +21,8 @@ namespace OHOS { namespace AudioStandard { int64_t GetNowTimeMs(); +void AdjustStereoToMono(int16_t *data, uint64_t len); +void AdjustAudioBalance(int16_t *data, uint64_t len, float left, float right); template bool GetSysPara(const char *key, T &value); diff --git a/frameworks/native/audioutils/src/audio_utils.cpp b/frameworks/native/audioutils/src/audio_utils.cpp index 30635c1f13..b0502735f7 100644 --- a/frameworks/native/audioutils/src/audio_utils.cpp +++ b/frameworks/native/audioutils/src/audio_utils.cpp @@ -29,6 +29,24 @@ int64_t GetNowTimeMs() return nowMs.count(); } +void AdjustStereoToMono(int16_t *data, uint64_t len) +{ + for (unsigned i = len >> 1; i > 0; i--) { + data[0] = data[0] / 2 + data[1] / 2; + data[1] = data[0]; + data += 2; + } +} + +void AdjustAudioBalance(int16_t *data, uint64_t len, float left, float right) +{ + for (unsigned i = len >> 1; i > 0; i--) { + data[0] = (int16_t) data[0] * left; + data[1] = (int16_t) data[1] * right; + data += 2; + } +} + template bool GetSysPara(const char *key, T &value) { diff --git a/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.cpp b/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.cpp index 398b1e73c8..d6968c3ff9 100644 --- a/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.cpp +++ b/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.cpp @@ -43,7 +43,11 @@ const uint32_t INTERNAL_OUTPUT_STREAM_ID = 0; const uint32_t PARAM_VALUE_LENTH = 10; } #ifdef DUMPFILE -const char *g_audioOutTestFilePath = "/data/local/tmp/audioout_test.pcm"; +// Note: accessing to this directory requires selinux permission +// const char *g_audioOutTestFilePath = "/data/local/tmp/audioout_test.pcm"; + +// change file path temporarily +const char *g_audioOutTestFilePath = "/data/data/.pulse_dir/audioout_test.pcm"; #endif // DUMPFILE AudioRendererSink::AudioRendererSink() @@ -95,6 +99,34 @@ std::string AudioRendererSink::GetAudioParameter(const AudioParamKey key, const return value; } +void AudioRendererSink::SetAudioMonoState(bool audioMono) +{ + AUDIO_INFO_LOG("audioBalance: AudioRendererSink::SetAudioMonoState: %{public}d", audioMono); + audioMonoState = audioMono; +} + +void AudioRendererSink::SetAudioBalanceValue(float audioBalance) +{ + AUDIO_INFO_LOG("audioBalance: AudioRendererSink::SetAudioBalanceValue: %{public}f", audioBalance); + // reset the balance coefficient + leftBalanceCoef = 1.0f; + rightBalanceCoef = 1.0f; + + if (std::abs(audioBalance - 0.0f) <= std::numeric_limits::epsilon()) { + // audioBalance is equal to 0.0f + audioBalanceState = false; + } else { + // audioBalance is not equal to 0.0f + audioBalanceState = true; + // calculate the balance coefficient + if (audioBalance > 0.0f) { + leftBalanceCoef -= audioBalance; + } else if (audioBalance < 0.0f) { + rightBalanceCoef += audioBalance; + } + } +} + void AudioRendererSink::DeInit() { started_ = false; @@ -291,10 +323,24 @@ int32_t AudioRendererSink::RenderFrame(char &data, uint64_t len, uint64_t &write return ERR_INVALID_HANDLE; } + if (audioMonoState) { + // AUDIO_INFO_LOG("audioBalance: AudioRendererSink::RenderFrame: audioMonoState is true"); + AdjustStereoToMono((int16_t*)&data, len); + } + + if (audioBalanceState) { + // AUDIO_INFO_LOG("audioBalance: AudioRendererSink::RenderFrame: audioBalanceState is true"); + AdjustAudioBalance((int16_t*)&data, len, leftBalanceCoef, rightBalanceCoef); + } + #ifdef DUMPFILE - size_t writeResult = fwrite((void*)&data, 1, len, pfd); - if (writeResult != len) { - AUDIO_ERR_LOG("Failed to write the file."); + if (pfd != nullptr) { + size_t writeResult = fwrite((void*)&data, 1, (size_t)len, pfd); + if (writeResult != len) { + AUDIO_ERR_LOG("Failed to write the file."); + } + } else { + AUDIO_INFO_LOG("DUMPFILE: nullptr"); } #endif // DUMPFILE diff --git a/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.h b/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.h index 41937aa429..51fc208f15 100644 --- a/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.h +++ b/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.h @@ -12,6 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +// #define DUMPFILE #ifndef AUDIO_RENDERER_SINK_H #define AUDIO_RENDERER_SINK_H @@ -58,6 +59,8 @@ public: bool rendererInited_; void SetAudioParameter(const AudioParamKey key, const std::string& condition, const std::string& value); std::string GetAudioParameter(const AudioParamKey key, const std::string& condition); + void SetAudioMonoState(bool audioMono); + void SetAudioBalanceValue(float audioBalance); private: AudioRendererSink(); @@ -74,6 +77,11 @@ private: struct AudioAdapter *audioAdapter_; struct AudioRender *audioRender_; struct AudioPort audioPort_ = {}; + bool audioMonoState = false; + bool audioBalanceState = false; + // float audioBalanceValue = 0.0f; + float leftBalanceCoef = 1.0f; + float rightBalanceCoef = 1.0f; int32_t CreateRender(struct AudioPort &renderPort); int32_t InitAudioManager(); 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 8c95825081..6b7a98e4f3 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 @@ -71,6 +71,8 @@ public: virtual int32_t SuspendAudioDevice(std::string &name, bool isSuspend) = 0; + virtual int32_t AdjustAudioMono(const std::string &portName, bool audioMono) = 0; + virtual int32_t AdjustAudioBalance(const std::string &portName, float audioBalance) = 0; }; } // namespace AudioStandard 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 1dc5291c55..c912ebfbca 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 @@ -85,6 +85,8 @@ public: int32_t SuspendAudioDevice(std::string &name, bool isSuspend); + int32_t AdjustAudioMono(const std::string &portName, bool audioMono); + int32_t AdjustAudioBalance(const std::string &portName, float audioBalance); virtual ~AudioAdapterManager() {} 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 0602c5a275..0aadae2434 100644 --- a/services/audio_policy/server/src/service/audio_policy_service.cpp +++ b/services/audio_policy/server/src/service/audio_policy_service.cpp @@ -1312,14 +1312,48 @@ void AudioPolicyService::OnServiceConnected(AudioServiceIndex serviceIndex) void AudioPolicyService::OnMonoAudioConfigChanged(bool audioMono) { AUDIO_INFO_LOG("audioBalance: OnMonoAudioConfigChanged in"); + + // std::string activePort = GetPortName(mCurrentActiveDevice_); + // if (activePort == "none") { + // AUDIO_INFO_LOG("audioBalance: Adjust Mono of active sink %{public}s, do not adjust mono and return", activePort.c_str()); + // } else { // activePort is not none + // AUDIO_INFO_LOG("audioBalance: Adjust Mono of active sink %{public}s. Mono: %{public}d", activePort.c_str(), audioMono); + // // 单声道开启时,混合多声道,平均输出。设想调用remap + // // 单声道关闭时,还原立体声 + // mAudioPolicyManager.AdjustAudioMono(activePort, audioMono); + // } + // manager不宜处理播放数据,放弃此思路 + + // 尝试调用hdi_sink.c,直接在该文件里自行编写声道转换函数 + // 最终在audio_renderer_sink.cpp中添加数据处理函数 + if (g_sProxy == nullptr) { + AUDIO_ERR_LOG("Service proxy unavailable: g_sProxy null"); + return; + } + AUDIO_INFO_LOG("audioBalance: Adjust mono by audio_server, audioMono: %{public}d", audioMono); + g_sProxy->SetAudioMonoState(audioMono); } void AudioPolicyService::OnAudioBalanceChanged(float audioBalance) { AUDIO_INFO_LOG("audioBalance: OnAduioBalanceChanged in"); - std::string activePort = GetPortName(mCurrentActiveDevice_); - AUDIO_DEBUG_LOG("Adjust balance of active sink %{public}s, balance: %{public}f", activePort.c_str(), audioBalance); - // mAudioPolicyManager.AdjustAudioBalance(activePort, audioBalance); + + // std::string activePort = GetPortName(mCurrentActiveDevice_); + // if (activePort == "none") { + // AUDIO_INFO_LOG("audioBalance: Adjust balance of active sink %{public}s, do not adjust balance and return", activePort.c_str()); + // } else { + // AUDIO_INFO_LOG("audioBalance: Adjust balance of active sink %{public}s, balance: %{public}f", activePort.c_str(), audioBalance); + // mAudioPolicyManager.AdjustAudioBalance(activePort, audioBalance); + // } + // 此路原本可行,但由于Mono接口是在audio_renderer_sink.cpp中处理数据,会抹掉Manager中调整音量的效果 + + // 改为和Mono接口同一方案 + if (g_sProxy == nullptr) { + AUDIO_ERR_LOG("Service proxy unavailable: g_sProxy null"); + return; + } + AUDIO_INFO_LOG("audioBalance: Adjust balance by audio_server, audioBalance: %{public}f", audioBalance); + g_sProxy->SetAudioBalanceValue(audioBalance); } void AudioPolicyService::AddAudioDevice(AudioModuleInfo& moduleInfo, InternalDeviceType devType) diff --git a/services/audio_policy/server/src/service/listener/accessibility_config_listener.cpp b/services/audio_policy/server/src/service/listener/accessibility_config_listener.cpp index 4ad6ba0389..137f779819 100755 --- a/services/audio_policy/server/src/service/listener/accessibility_config_listener.cpp +++ b/services/audio_policy/server/src/service/listener/accessibility_config_listener.cpp @@ -32,6 +32,8 @@ void AccessibilityConfigListener::OnConfigChanged(const CONFIG_ID configId, cons if (configId == CONFIG_AUDIO_MONO) { audioAccessibilityConfigObserver_.OnMonoAudioConfigChanged(value.audioMono); } else if (configId == CONFIG_AUDIO_BALANCE) { + // 应在此处加入audioBalance值的判断? + // 应在[-1, +1]范围内 audioAccessibilityConfigObserver_.OnAudioBalanceChanged(value.audioBalance); } } 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 3ff5a12a21..9419e4ef87 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 @@ -182,6 +182,17 @@ int32_t AudioAdapterManager::SuspendAudioDevice(std::string &portName, bool isSu return mAudioServiceAdapter->SuspendAudioDevice(portName, isSuspend); } +int32_t AudioAdapterManager::AdjustAudioMono(const std::string &portName, bool audioMono) +{ + if (!mAudioServiceAdapter) { + AUDIO_ERR_LOG("[AudioAdapterManager] audio adapter null"); + return ERR_OPERATION_FAILED; + } + + AUDIO_INFO_LOG("audioBalance: AudioAdapterManager::AdjustAudioMono in"); + return mAudioServiceAdapter->AdjustAudioMono(portName, audioMono); +} + int32_t AudioAdapterManager::AdjustAudioBalance(const std::string &portName, float audioBalance) { if (!mAudioServiceAdapter) { @@ -189,6 +200,7 @@ int32_t AudioAdapterManager::AdjustAudioBalance(const std::string &portName, flo return ERR_OPERATION_FAILED; } + AUDIO_INFO_LOG("audioBalance: AudioAdapterManager::AdjustAudioBalance in"); return mAudioServiceAdapter->AdjustAudioBalance(portName, audioBalance); } diff --git a/services/audio_service/client/include/audio_manager_base.h b/services/audio_service/client/include/audio_manager_base.h index 3e06b57ead..5df3f3bdfc 100644 --- a/services/audio_service/client/include/audio_manager_base.h +++ b/services/audio_service/client/include/audio_manager_base.h @@ -159,6 +159,22 @@ public: */ virtual int32_t SetParameterCallback(const sptr& object) = 0; + /** + * Set audio mono state for accessibility + * + * @param audioMono the state of mono for accessibility + * @return none. + */ + virtual void SetAudioMonoState(bool audioMono) = 0; + + /** + * Set audio balance value for accessibility + * + * @param audioBalance the value of balance for accessibility + * @return none. + */ + virtual void SetAudioBalanceValue(float audioBalance) = 0; + enum { GET_MAX_VOLUME = 0, GET_MIN_VOLUME = 1, @@ -176,6 +192,8 @@ public: SET_REMOTE_AUDIO_PARAMETER = 13, NOTIFY_DEVICE_INFO = 14, CHECK_REMOTE_DEVICE_STATE = 15, + SET_AUDIO_MONO_STATE = 16, + SET_AUDIO_BALANCE_VALUE = 17, }; public: diff --git a/services/audio_service/client/include/audio_manager_proxy.h b/services/audio_service/client/include/audio_manager_proxy.h index f71467c2f8..a477cb2409 100644 --- a/services/audio_service/client/include/audio_manager_proxy.h +++ b/services/audio_service/client/include/audio_manager_proxy.h @@ -44,6 +44,8 @@ public: void NotifyDeviceInfo(std::string networkId, bool connected) override; int32_t CheckRemoteDeviceState(std::string networkId, DeviceRole deviceRole, bool isStartDevice) override; int32_t SetParameterCallback(const sptr& object) override; + void SetAudioMonoState(bool audioMono) override; + void SetAudioBalanceValue(float audioBalance) override; private: static inline BrokerDelegator delegator_; }; diff --git a/services/audio_service/client/src/audio_manager_proxy.cpp b/services/audio_service/client/src/audio_manager_proxy.cpp index 161b1429de..0063f1f617 100644 --- a/services/audio_service/client/src/audio_manager_proxy.cpp +++ b/services/audio_service/client/src/audio_manager_proxy.cpp @@ -389,5 +389,41 @@ int32_t AudioManagerProxy::SetParameterCallback(const sptr& objec return reply.ReadInt32(); } + +void AudioManagerProxy::SetAudioMonoState(bool audioMono) +{ + MessageParcel data; + MessageParcel reply; + MessageOption option; + + if (!data.WriteInterfaceToken(GetDescriptor())) { + AUDIO_ERR_LOG("AudioPolicyProxy: WriteInterfaceToken failed"); + return; + } + (void)data.WriteBool(audioMono); + int error = Remote()->SendRequest(SET_AUDIO_MONO_STATE, data, reply, option); + if (error != ERR_NONE) { + AUDIO_ERR_LOG("AudioPolicyProxy: SetAudioMonoState failed, error: %{public}d", error); + return; + } +} + +void AudioManagerProxy::SetAudioBalanceValue(float audioBalance) +{ + MessageParcel data; + MessageParcel reply; + MessageOption option; + + if (!data.WriteInterfaceToken(GetDescriptor())) { + AUDIO_ERR_LOG("AudioPolicyProxy: WriteInterfaceToken failed"); + return; + } + (void)data.WriteFloat(audioBalance); + int error = Remote()->SendRequest(SET_AUDIO_BALANCE_VALUE, data, reply, option); + if (error != ERR_NONE) { + AUDIO_ERR_LOG("AudioPolicyProxy: SetAudioBalanceValue failed, error: %{public}d", error); + return; + } +} } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_service/server/include/audio_server.h b/services/audio_service/server/include/audio_server.h index 37d7b09f9d..62ee0fa12a 100644 --- a/services/audio_service/server/include/audio_server.h +++ b/services/audio_service/server/include/audio_server.h @@ -55,6 +55,8 @@ public: const char *RetrieveCookie(int32_t &size) override; uint64_t GetTransactionId(DeviceType deviceType, DeviceRole deviceRole) override; int32_t UpdateActiveDeviceRoute(DeviceType type, DeviceFlag flag) override; + void SetAudioMonoState(bool audioMono) override; + void SetAudioBalanceValue(float audioBalance) override; void NotifyDeviceInfo(std::string networkId, bool connected) override; diff --git a/services/audio_service/server/src/audio_manager_stub.cpp b/services/audio_service/server/src/audio_manager_stub.cpp index 573ede61f2..3f5ccbd739 100644 --- a/services/audio_service/server/src/audio_manager_stub.cpp +++ b/services/audio_service/server/src/audio_manager_stub.cpp @@ -171,6 +171,20 @@ int AudioManagerStub::OnRemoteRequest(uint32_t code, MessageParcel &data, Messag reply.WriteInt32(result); return AUDIO_OK; } + case SET_AUDIO_MONO_STATE: { + AUDIO_DEBUG_LOG("SET_AUDIO_MONO_STATE AudioManagerStub"); + bool audioMonoState = data.ReadBool(); + AUDIO_DEBUG_LOG("SET_AUDIO_MONO_STATE audioMonoState from client= %{public}d", audioMonoState); + SetAudioMonoState(audioMonoState); + return AUDIO_OK; + } + case SET_AUDIO_BALANCE_VALUE: { + AUDIO_DEBUG_LOG("SET_AUDIO_BALANCE_VALUE AudioManagerStub"); + float audioBalanceValue = data.ReadFloat(); + AUDIO_DEBUG_LOG("SET_AUDIO_BALANCE_VALUE audioBalanceValue from client= %{public}f", audioBalanceValue); + SetAudioBalanceValue(audioBalanceValue); + return AUDIO_OK; + } default: { AUDIO_ERR_LOG("default case, need check AudioManagerStub"); return IPCObjectStub::OnRemoteRequest(code, data, reply, option); diff --git a/services/audio_service/server/src/audio_server.cpp b/services/audio_service/server/src/audio_server.cpp index 44077cafb1..948efa9fe1 100644 --- a/services/audio_service/server/src/audio_server.cpp +++ b/services/audio_service/server/src/audio_server.cpp @@ -334,6 +334,30 @@ int32_t AudioServer::UpdateActiveDeviceRoute(DeviceType type, DeviceFlag flag) return SUCCESS; } +void AudioServer::SetAudioMonoState(bool audioMono) +{ + AUDIO_INFO_LOG("audioBalance: AudioServer::SetAudioMonoState: %{public}d", audioMono); + AudioRendererSink *audioRendererSinkInstance = AudioRendererSink::GetInstance(); + + if (!audioRendererSinkInstance->rendererInited_) { + AUDIO_WARNING_LOG("Renderer is not initialized."); + } else { + audioRendererSinkInstance->SetAudioMonoState(audioMono); + } +} + +void AudioServer::SetAudioBalanceValue(float audioBalance) +{ + AUDIO_INFO_LOG("audioBalance: AudioServer::SetAudioBalanceValue: %{public}f", audioBalance); + AudioRendererSink *audioRendererSinkInstance = AudioRendererSink::GetInstance(); + + if (!audioRendererSinkInstance->rendererInited_) { + AUDIO_WARNING_LOG("Renderer is not initialized."); + } else { + audioRendererSinkInstance->SetAudioBalanceValue(audioBalance); + } +} + void AudioServer::NotifyDeviceInfo(std::string networkId, bool connected) { AUDIO_INFO_LOG("notify device info: networkId(%{public}s), connected(%{public}d)", networkId.c_str(), connected); -- Gitee From 4f7f1a25217650786d0805fb4c3b7245401c69ea Mon Sep 17 00:00:00 2001 From: songshenke Date: Fri, 23 Sep 2022 10:47:12 +0800 Subject: [PATCH 03/12] support 16bit and 32bit Signed-off-by: songshenke Change-Id: I01361910b734640d9b916ded4d0fe3b31eb49ac8 --- .../native/audioutils/include/audio_utils.h | 6 +- .../native/audioutils/src/audio_utils.cpp | 30 ++++++-- .../sink/primary/audio_renderer_sink.cpp | 72 +++++++++++++++++-- .../sink/primary/audio_renderer_sink.h | 2 + 4 files changed, 100 insertions(+), 10 deletions(-) diff --git a/frameworks/native/audioutils/include/audio_utils.h b/frameworks/native/audioutils/include/audio_utils.h index 46d814887a..56e341ffc1 100644 --- a/frameworks/native/audioutils/include/audio_utils.h +++ b/frameworks/native/audioutils/include/audio_utils.h @@ -21,8 +21,10 @@ namespace OHOS { namespace AudioStandard { int64_t GetNowTimeMs(); -void AdjustStereoToMono(int16_t *data, uint64_t len); -void AdjustAudioBalance(int16_t *data, uint64_t len, float left, float right); +void AdjustStereoToMonoForPCM16Bit(int16_t *data, uint64_t len); +void AdjustStereoToMonoForPCM32Bit(int32_t *data, uint64_t len); +void AdjustAudioBalanceForPCM16Bit(int16_t *data, uint64_t len, float left, float right); +void AdjustAudioBalanceForPCM32Bit(int32_t *data, uint64_t len, float left, float right); template bool GetSysPara(const char *key, T &value); diff --git a/frameworks/native/audioutils/src/audio_utils.cpp b/frameworks/native/audioutils/src/audio_utils.cpp index b0502735f7..52e36e8f07 100644 --- a/frameworks/native/audioutils/src/audio_utils.cpp +++ b/frameworks/native/audioutils/src/audio_utils.cpp @@ -29,7 +29,7 @@ int64_t GetNowTimeMs() return nowMs.count(); } -void AdjustStereoToMono(int16_t *data, uint64_t len) +void AdjustStereoToMonoForPCM16Bit(int16_t *data, uint64_t len) { for (unsigned i = len >> 1; i > 0; i--) { data[0] = data[0] / 2 + data[1] / 2; @@ -38,11 +38,33 @@ void AdjustStereoToMono(int16_t *data, uint64_t len) } } -void AdjustAudioBalance(int16_t *data, uint64_t len, float left, float right) +void AdjustStereoToMonoForPCM32Bit(int32_t *data, uint64_t len) { for (unsigned i = len >> 1; i > 0; i--) { - data[0] = (int16_t) data[0] * left; - data[1] = (int16_t) data[1] * right; + data[0] = data[0] / 2 + data[1] / 2; + data[1] = data[0]; + data += 2; + } +} + +void AdjustAudioBalanceForPCM16Bit(int16_t *data, uint64_t len, float left, float right) +{ + for (unsigned i = len >> 1; i > 0; i--) { + data[0] *= left; + data[1] *= right; + // data[0] = (int16_t) data[0] * left; + // data[1] = (int16_t) data[1] * right; + data += 2; + } +} + +void AdjustAudioBalanceForPCM32Bit(int32_t *data, uint64_t len, float left, float right) +{ + for (unsigned i = len >> 1; i > 0; i--) { + data[0] *= left; + data[1] *= right; + // data[0] = (int16_t) data[0] * left; + // data[1] = (int16_t) data[1] * right; data += 2; } } diff --git a/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.cpp b/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.cpp index d6968c3ff9..a34f56fbef 100644 --- a/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.cpp +++ b/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.cpp @@ -127,6 +127,70 @@ void AudioRendererSink::SetAudioBalanceValue(float audioBalance) } } +void AudioRendererSink::AdjustStereoToMono(char *data, uint64_t len) +{ + if (attr_.channel != 2) { + // 目前仅支持双声道 + // AUDIO_DEBUG_LOG("AudioRendererSink::AdjustStereoToMono: channel is %{public}d", attr_.channel); + return; + } + + switch (attr_.format) { + case AUDIO_FORMAT_PCM_8_BIT: { + // 暂未支持 + break; + } + case AUDIO_FORMAT_PCM_16_BIT: { + AdjustStereoToMonoForPCM16Bit((int16_t*)data, len); + break; + } + case AUDIO_FORMAT_PCM_24_BIT: { + // 暂未支持 + break; + } + case AUDIO_FORMAT_PCM_32_BIT: { + AdjustStereoToMonoForPCM32Bit((int32_t*)data, len); + break; + } + default: { + // AUDIO_DEBUG_LOG("AudioRendererSink::RenderFrame: audioMonoState: Unkowned audio format!"); + break; + } + } +} + +void AudioRendererSink::AdjustAudioBalance(char *data, uint64_t len) +{ + if (attr_.channel != 2) { + // 目前只支持双声道 + // AUDIO_DEBUG_LOG("AudioRendererSink::RenderFrame: audioBalanceState is true, but channel is %{public}d", attr_.channel); + return; + } + + switch (attr_.format) { + case AUDIO_FORMAT_PCM_8_BIT: { + // 暂未支持 + break; + } + case AUDIO_FORMAT_PCM_16_BIT: { + AdjustAudioBalanceForPCM16Bit((int16_t*)data, len, leftBalanceCoef, rightBalanceCoef); + break; + } + case AUDIO_FORMAT_PCM_24_BIT: { + // 暂未支持 + break; + } + case AUDIO_FORMAT_PCM_32_BIT: { + AdjustAudioBalanceForPCM32Bit((int32_t*)data, len, leftBalanceCoef, rightBalanceCoef); + break; + } + default: { + // AUDIO_DEBUG_LOG("AudioRendererSink::RenderFrame: audioMonoState: Unkowned audio format!"); + break; + } + } +} + void AudioRendererSink::DeInit() { started_ = false; @@ -324,13 +388,13 @@ int32_t AudioRendererSink::RenderFrame(char &data, uint64_t len, uint64_t &write } if (audioMonoState) { - // AUDIO_INFO_LOG("audioBalance: AudioRendererSink::RenderFrame: audioMonoState is true"); - AdjustStereoToMono((int16_t*)&data, len); + // AUDIO_DEBUG_LOG("audioBalance: AudioRendererSink::RenderFrame: audioMonoState is true"); + AdjustStereoToMono(&data, len); } if (audioBalanceState) { - // AUDIO_INFO_LOG("audioBalance: AudioRendererSink::RenderFrame: audioBalanceState is true"); - AdjustAudioBalance((int16_t*)&data, len, leftBalanceCoef, rightBalanceCoef); + // AUDIO_DEBUG_LOG("audioBalance: AudioRendererSink::RenderFrame: audioBalanceState is true"); + AdjustAudioBalance(&data, len); } #ifdef DUMPFILE diff --git a/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.h b/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.h index 51fc208f15..5258a538d9 100644 --- a/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.h +++ b/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.h @@ -85,6 +85,8 @@ private: int32_t CreateRender(struct AudioPort &renderPort); int32_t InitAudioManager(); + void AdjustStereoToMono(char *data, uint64_t len); + void AdjustAudioBalance(char *data, uint64_t len); #ifdef DUMPFILE FILE *pfd; #endif // DUMPFILE -- Gitee From a023ff0eec786a4e302222dd0747ebe922437295 Mon Sep 17 00:00:00 2001 From: songshenke Date: Tue, 27 Sep 2022 15:29:42 +0800 Subject: [PATCH 04/12] support 8bit and 24bit, be ready for bluetooth Signed-off-by: songshenke Change-Id: I16e9908f01ecc430111e470e18a89983ebf7e7a3 --- .../native/audioutils/include/audio_utils.h | 4 + .../native/audioutils/src/audio_utils.cpp | 45 +++++++- frameworks/native/hdiadapter/sink/BUILD.gn | 2 + .../bluetooth/bluetooth_renderer_sink.cpp | 104 ++++++++++++++++++ .../sink/bluetooth/bluetooth_renderer_sink.h | 10 +- .../sink/primary/audio_renderer_sink.cpp | 16 ++- .../sink/primary/audio_renderer_sink.h | 1 - services/audio_service/BUILD.gn | 4 + .../server/include/audio_server.h | 1 + .../audio_service/server/src/audio_server.cpp | 18 ++- 10 files changed, 193 insertions(+), 12 deletions(-) diff --git a/frameworks/native/audioutils/include/audio_utils.h b/frameworks/native/audioutils/include/audio_utils.h index 56e341ffc1..011d1ee775 100644 --- a/frameworks/native/audioutils/include/audio_utils.h +++ b/frameworks/native/audioutils/include/audio_utils.h @@ -21,9 +21,13 @@ namespace OHOS { namespace AudioStandard { int64_t GetNowTimeMs(); +void AdjustStereoToMonoForPCM8Bit(int8_t *data, uint64_t len); void AdjustStereoToMonoForPCM16Bit(int16_t *data, uint64_t len); +void AdjustStereoToMonoForPCM24Bit(int8_t *data, uint64_t len); void AdjustStereoToMonoForPCM32Bit(int32_t *data, uint64_t len); +void AdjustAudioBalanceForPCM8Bit(int8_t *data, uint64_t len, float left, float right); void AdjustAudioBalanceForPCM16Bit(int16_t *data, uint64_t len, float left, float right); +void AdjustAudioBalanceForPCM24Bit(int8_t *data, uint64_t len, float left, float right); void AdjustAudioBalanceForPCM32Bit(int32_t *data, uint64_t len, float left, float right); template diff --git a/frameworks/native/audioutils/src/audio_utils.cpp b/frameworks/native/audioutils/src/audio_utils.cpp index 52e36e8f07..edffbfeed2 100644 --- a/frameworks/native/audioutils/src/audio_utils.cpp +++ b/frameworks/native/audioutils/src/audio_utils.cpp @@ -29,6 +29,15 @@ int64_t GetNowTimeMs() return nowMs.count(); } +void AdjustStereoToMonoForPCM8Bit(int8_t *data, uint64_t len) +{ + for (unsigned i = len >> 1; i > 0; i--) { + data[0] = data[0] / 2 + data[1] / 2; + data[1] = data[0]; + data += 2; + } +} + void AdjustStereoToMonoForPCM16Bit(int16_t *data, uint64_t len) { for (unsigned i = len >> 1; i > 0; i--) { @@ -38,6 +47,18 @@ void AdjustStereoToMonoForPCM16Bit(int16_t *data, uint64_t len) } } +void AdjustStereoToMonoForPCM24Bit(int8_t *data, uint64_t len){ + for (unsigned i = len >> 1; i > 0; i--) { + data[0] = data[0] / 2 + data[3] / 2; + data[3] = data[0]; + data[1] = data[1] / 2 + data[4] / 2; + data[4] = data[1]; + data[2] = data[2] / 2 + data[5] / 2; + data[5] = data[2]; + data += 6; + } +} + void AdjustStereoToMonoForPCM32Bit(int32_t *data, uint64_t len) { for (unsigned i = len >> 1; i > 0; i--) { @@ -47,6 +68,15 @@ void AdjustStereoToMonoForPCM32Bit(int32_t *data, uint64_t len) } } +void AdjustAudioBalanceForPCM8Bit(int8_t *data, uint64_t len, float left, float right) +{ + for (unsigned i = len >> 1; i > 0; i--) { + data[0] *= left; + data[1] *= right; + data += 2; + } +} + void AdjustAudioBalanceForPCM16Bit(int16_t *data, uint64_t len, float left, float right) { for (unsigned i = len >> 1; i > 0; i--) { @@ -58,13 +88,24 @@ void AdjustAudioBalanceForPCM16Bit(int16_t *data, uint64_t len, float left, floa } } +void AdjustAudioBalanceForPCM24Bit(int8_t *data, uint64_t len, float left, float right) +{ + for (unsigned i = len >> 1; i > 0; i--) { + data[0] *= left; + data[1] *= left; + data[2] *= left; + data[3] *= right; + data[4] *= right; + data[5] *= right; + data += 6; + } +} + void AdjustAudioBalanceForPCM32Bit(int32_t *data, uint64_t len, float left, float right) { for (unsigned i = len >> 1; i > 0; i--) { data[0] *= left; data[1] *= right; - // data[0] = (int16_t) data[0] * left; - // data[1] = (int16_t) data[1] * right; data += 2; } } diff --git a/frameworks/native/hdiadapter/sink/BUILD.gn b/frameworks/native/hdiadapter/sink/BUILD.gn index fa8d7c4471..c4c47fac92 100644 --- a/frameworks/native/hdiadapter/sink/BUILD.gn +++ b/frameworks/native/hdiadapter/sink/BUILD.gn @@ -65,6 +65,7 @@ ohos_shared_library("bluetooth_renderer_sink") { include_dirs = [ "//foundation/multimedia/audio_framework/interfaces/inner_api/native/audiocommon/include", + "//foundation/multimedia/audio_framework/frameworks/native/audioutils/include", "//foundation/multimedia/audio_framework/frameworks/native/hdiadapter/sink/common", "//commonlibrary/c_utils/base/include", "//base/hiviewdfx/hilog/interfaces/native/innerkits/include", @@ -81,6 +82,7 @@ ohos_shared_library("bluetooth_renderer_sink") { "$hdf_uhdf_path/ipc:libhdf_ipc_adapter", "$hdf_uhdf_path/utils:libhdf_utils", "//base/hiviewdfx/hilog/interfaces/native/innerkits:libhilog", + "//foundation/multimedia/audio_framework/frameworks/native/audioutils:audio_utils", "//third_party/bounds_checking_function:libsec_static", ] diff --git a/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink.cpp b/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink.cpp index 10327e95e0..e9ac4026fb 100644 --- a/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink.cpp +++ b/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink.cpp @@ -22,6 +22,7 @@ #include "audio_errors.h" #include "audio_log.h" +#include "audio_utils.h" using namespace std; using namespace OHOS::HDI::Audio_Bluetooth; @@ -525,6 +526,102 @@ int32_t BluetoothRendererSink::Flush(void) return ERR_OPERATION_FAILED; } + +void BluetoothRendererSink::SetAudioMonoState(bool audioMono) +{ + AUDIO_INFO_LOG("audioBalance: AudioRendererSink::SetAudioMonoState: %{public}d", audioMono); + audioMonoState = audioMono; +} + +void BluetoothRendererSink::SetAudioBalanceValue(float audioBalance) +{ + AUDIO_INFO_LOG("audioBalance: AudioRendererSink::SetAudioBalanceValue: %{public}f", audioBalance); + // reset the balance coefficient + leftBalanceCoef = 1.0f; + rightBalanceCoef = 1.0f; + + if (std::abs(audioBalance - 0.0f) <= std::numeric_limits::epsilon()) { + // audioBalance is equal to 0.0f + audioBalanceState = false; + } else { + // audioBalance is not equal to 0.0f + audioBalanceState = true; + // calculate the balance coefficient + if (audioBalance > 0.0f) { + leftBalanceCoef -= audioBalance; + } else if (audioBalance < 0.0f) { + rightBalanceCoef += audioBalance; + } + } +} + +void BluetoothRendererSink::AdjustStereoToMono(char *data, uint64_t len) +{ + if (attr_.channel != 2) { + // 目前仅支持双声道,暂未支持 channels >= 3 + // AUDIO_DEBUG_LOG("AudioRendererSink::AdjustStereoToMono: channel is %{public}d", attr_.channel); + return; + } + + switch (attr_.format) { + case AUDIO_FORMAT_PCM_8_BIT: { + // 暂未测试是否可行 + AdjustStereoToMonoForPCM8Bit((int8_t*)data, len); + break; + } + case AUDIO_FORMAT_PCM_16_BIT: { + AdjustStereoToMonoForPCM16Bit((int16_t*)data, len); + break; + } + case AUDIO_FORMAT_PCM_24_BIT: { + // 暂未测试是否可行 + AdjustStereoToMonoForPCM24Bit((int8_t*)data, len); + break; + } + case AUDIO_FORMAT_PCM_32_BIT: { + AdjustStereoToMonoForPCM32Bit((int32_t*)data, len); + break; + } + default: { + // AUDIO_DEBUG_LOG("BluetoothRendererSink::RenderFrame: audioMonoState: Unkowned audio format!"); + break; + } + } +} + +void BluetoothRendererSink::AdjustAudioBalance(char *data, uint64_t len) +{ + if (attr_.channel != 2) { + // 目前只支持双声道,单声道无法调整平衡,暂未支持 channels >= 3 + // AUDIO_DEBUG_LOG("AudioRendererSink::RenderFrame: audioBalanceState is true, but channel is %{public}d", attr_.channel); + return; + } + + switch (attr_.format) { + case AUDIO_FORMAT_PCM_8_BIT: { + // 暂未测试是否可行 + AdjustAudioBalanceForPCM8Bit((int8_t*)data, len, leftBalanceCoef, rightBalanceCoef); + break; + } + case AUDIO_FORMAT_PCM_16_BIT: { + AdjustAudioBalanceForPCM16Bit((int16_t*)data, len, leftBalanceCoef, rightBalanceCoef); + break; + } + case AUDIO_FORMAT_PCM_24_BIT: { + // 暂未测试是否可行 + AdjustAudioBalanceForPCM24Bit((int8_t*)data, len, leftBalanceCoef, rightBalanceCoef); + break; + } + case AUDIO_FORMAT_PCM_32_BIT: { + AdjustAudioBalanceForPCM32Bit((int32_t*)data, len, leftBalanceCoef, rightBalanceCoef); + break; + } + default: { + // AUDIO_DEBUG_LOG("AudioRendererSink::RenderFrame: audioMonoState: Unkowned audio format!"); + break; + } + } +} } // namespace AudioStandard } // namespace OHOS @@ -618,6 +715,13 @@ int32_t BluetoothRendererRenderFrame(void *wapper, char &data, uint64_t len, uin return ERR_NOT_STARTED; } + // if (g_bluetoothRendrSinkInstance->GetAudioMonoState()) { + // bluetoothRendererSinkWapper->SetAudioMonoState(true); + // } + // if (g_bluetoothRendrSinkInstance->GetAudioBalanceState()) { + // bluetoothRendererSinkWapper->SetAudioBalanceValue(value); + // } + ret = bluetoothRendererSinkWapper->RenderFrame(data, len, writeLen); return ret; } diff --git a/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink.h b/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink.h index 00ecf0323c..f02b7c24fc 100644 --- a/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink.h +++ b/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink.h @@ -18,7 +18,6 @@ #include "audio_info.h" #include "audio_proxy_manager.h" - #include #include @@ -49,6 +48,9 @@ public: int32_t GetTransactionId(uint64_t *transactionId); static BluetoothRendererSink *GetInstance(void); bool rendererInited_; + void SetAudioMonoState(bool audioMono); + void SetAudioBalanceValue(float audioBalance); + private: BluetoothRendererSink(); ~BluetoothRendererSink(); @@ -62,9 +64,15 @@ private: struct HDI::Audio_Bluetooth::AudioRender *audioRender_; struct HDI::Audio_Bluetooth::AudioPort audioPort = {}; void *handle_; + bool audioMonoState = false; + bool audioBalanceState = false; + float leftBalanceCoef = 1.0f; + float rightBalanceCoef = 1.0f; int32_t CreateRender(struct HDI::Audio_Bluetooth::AudioPort &renderPort); int32_t InitAudioManager(); + void AdjustStereoToMono(char *data, uint64_t len); + void AdjustAudioBalance(char *data, uint64_t len); #ifdef BT_DUMPFILE FILE *pfd; #endif // DUMPFILE diff --git a/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.cpp b/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.cpp index a34f56fbef..4ca642abab 100644 --- a/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.cpp +++ b/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.cpp @@ -130,14 +130,15 @@ void AudioRendererSink::SetAudioBalanceValue(float audioBalance) void AudioRendererSink::AdjustStereoToMono(char *data, uint64_t len) { if (attr_.channel != 2) { - // 目前仅支持双声道 + // 目前仅支持双声道,暂未支持 channels >= 3 // AUDIO_DEBUG_LOG("AudioRendererSink::AdjustStereoToMono: channel is %{public}d", attr_.channel); return; } switch (attr_.format) { case AUDIO_FORMAT_PCM_8_BIT: { - // 暂未支持 + // 暂未测试是否可行 + AdjustStereoToMonoForPCM8Bit((int8_t*)data, len); break; } case AUDIO_FORMAT_PCM_16_BIT: { @@ -145,7 +146,8 @@ void AudioRendererSink::AdjustStereoToMono(char *data, uint64_t len) break; } case AUDIO_FORMAT_PCM_24_BIT: { - // 暂未支持 + // 暂未测试是否可行 + AdjustStereoToMonoForPCM24Bit((int8_t*)data, len); break; } case AUDIO_FORMAT_PCM_32_BIT: { @@ -162,14 +164,15 @@ void AudioRendererSink::AdjustStereoToMono(char *data, uint64_t len) void AudioRendererSink::AdjustAudioBalance(char *data, uint64_t len) { if (attr_.channel != 2) { - // 目前只支持双声道 + // 目前只支持双声道,单声道无法调整平衡,暂未支持 channels >= 3 // AUDIO_DEBUG_LOG("AudioRendererSink::RenderFrame: audioBalanceState is true, but channel is %{public}d", attr_.channel); return; } switch (attr_.format) { case AUDIO_FORMAT_PCM_8_BIT: { - // 暂未支持 + // 暂未测试是否可行 + AdjustAudioBalanceForPCM8Bit((int8_t*)data, len, leftBalanceCoef, rightBalanceCoef); break; } case AUDIO_FORMAT_PCM_16_BIT: { @@ -177,7 +180,8 @@ void AudioRendererSink::AdjustAudioBalance(char *data, uint64_t len) break; } case AUDIO_FORMAT_PCM_24_BIT: { - // 暂未支持 + // 暂未测试是否可行 + AdjustAudioBalanceForPCM24Bit((int8_t*)data, len, leftBalanceCoef, rightBalanceCoef); break; } case AUDIO_FORMAT_PCM_32_BIT: { diff --git a/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.h b/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.h index 5258a538d9..05dd462e64 100644 --- a/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.h +++ b/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.h @@ -61,7 +61,6 @@ public: std::string GetAudioParameter(const AudioParamKey key, const std::string& condition); void SetAudioMonoState(bool audioMono); void SetAudioBalanceValue(float audioBalance); - private: AudioRendererSink(); ~AudioRendererSink(); diff --git a/services/audio_service/BUILD.gn b/services/audio_service/BUILD.gn index eb8c576be2..505a45c970 100644 --- a/services/audio_service/BUILD.gn +++ b/services/audio_service/BUILD.gn @@ -173,6 +173,8 @@ config("audio_service_config") { "//foundation/multimedia/audio_framework/frameworks/native/hdiadapter/source/common", "//foundation/multimedia/audio_framework/frameworks/native/hdiadapter/source/primary", "//drivers/peripheral/audio/interfaces/include", + "//drivers/peripheral/bluetooth/audio/interfaces/include", + "//drivers/peripheral/bluetooth/audio/hal/hdi_binder/proxy/include", "include/audio_service/common", ] @@ -197,7 +199,9 @@ ohos_shared_library("audio_service") { } deps = [ + "$hdf_uhdf_path/hdi:libhdi", "//foundation/multimedia/audio_framework/frameworks/native/hdiadapter/sink:audio_renderer_sink", + "//foundation/multimedia/audio_framework/frameworks/native/hdiadapter/sink:bluetooth_renderer_sink", "//foundation/multimedia/audio_framework/frameworks/native/hdiadapter/sink:remote_audio_renderer_sink", "//foundation/multimedia/audio_framework/frameworks/native/hdiadapter/sink:renderer_sink_adapter", "//foundation/multimedia/audio_framework/frameworks/native/hdiadapter/source:audio_capturer_source", diff --git a/services/audio_service/server/include/audio_server.h b/services/audio_service/server/include/audio_server.h index 62ee0fa12a..c9d6c1a0d6 100644 --- a/services/audio_service/server/include/audio_server.h +++ b/services/audio_service/server/include/audio_server.h @@ -24,6 +24,7 @@ #include "iremote_stub.h" #include "system_ability.h" #include "audio_renderer_sink.h" +// #include "bluetooth_renderer_sink.h" #include "remote_audio_renderer_sink.h" #include "i_standard_audio_server_manager_listener.h" #include "audio_manager_base.h" diff --git a/services/audio_service/server/src/audio_server.cpp b/services/audio_service/server/src/audio_server.cpp index 948efa9fe1..b32feab28b 100644 --- a/services/audio_service/server/src/audio_server.cpp +++ b/services/audio_service/server/src/audio_server.cpp @@ -337,25 +337,39 @@ int32_t AudioServer::UpdateActiveDeviceRoute(DeviceType type, DeviceFlag flag) void AudioServer::SetAudioMonoState(bool audioMono) { AUDIO_INFO_LOG("audioBalance: AudioServer::SetAudioMonoState: %{public}d", audioMono); - AudioRendererSink *audioRendererSinkInstance = AudioRendererSink::GetInstance(); + AudioRendererSink *audioRendererSinkInstance = AudioRendererSink::GetInstance(); if (!audioRendererSinkInstance->rendererInited_) { AUDIO_WARNING_LOG("Renderer is not initialized."); } else { audioRendererSinkInstance->SetAudioMonoState(audioMono); } + + // BluetoothRendererSink *bluetoothRendererSinkInstance = BluetoothRendererSink::GetInstance(); + // if (!bluetoothRendererSinkInstance->rendererInited_) { + // AUDIO_WARNING_LOG("Renderer is not initialized."); + // } else { + // bluetoothRendererSinkInstance->SetAudioMonoState(audioMono); + // } } void AudioServer::SetAudioBalanceValue(float audioBalance) { AUDIO_INFO_LOG("audioBalance: AudioServer::SetAudioBalanceValue: %{public}f", audioBalance); - AudioRendererSink *audioRendererSinkInstance = AudioRendererSink::GetInstance(); + AudioRendererSink *audioRendererSinkInstance = AudioRendererSink::GetInstance(); if (!audioRendererSinkInstance->rendererInited_) { AUDIO_WARNING_LOG("Renderer is not initialized."); } else { audioRendererSinkInstance->SetAudioBalanceValue(audioBalance); } + +// BluetoothRendererSink *bluetoothRendererSinkInstance = BluetoothRendererSink::GetInstance(); +// if (!bluetoothRendererSinkInstance->rendererInited_) { +// AUDIO_WARNING_LOG("Renderer is not initialized."); +// } else { +// bluetoothRendererSinkInstance->SetAudioBalanceValue(audioBalance); +// } } void AudioServer::NotifyDeviceInfo(std::string networkId, bool connected) -- Gitee From c89ac96ecb6595301e4f7f4ed4d424b0ff27fdc1 Mon Sep 17 00:00:00 2001 From: songshenke Date: Tue, 27 Sep 2022 19:17:56 +0800 Subject: [PATCH 05/12] Remove deprecated codes Signed-off-by: songshenke Change-Id: Ie74fd7713fd30df0e00a0f886e3ac504f25c541d --- .../include/audio_service_adapter.h | 20 --- .../pulse_audio_service_adapter_impl.h | 8 - .../src/pulse_audio_service_adapter_impl.cpp | 170 ------------------ .../native/audioutils/src/audio_utils.cpp | 2 - services/audio_policy/BUILD.gn | 1 - .../include/service/audio_policy_service.h | 4 +- .../interface/iaudio_policy_interface.h | 4 - .../service/manager/audio_adapter_manager.h | 4 - .../src/service/audio_policy_service.cpp | 29 +-- .../accessibility_config_listener.cpp | 4 +- .../service/manager/audio_adapter_manager.cpp | 22 --- 11 files changed, 6 insertions(+), 262 deletions(-) diff --git a/frameworks/native/audioadapter/include/audio_service_adapter.h b/frameworks/native/audioadapter/include/audio_service_adapter.h index 42c0bc7568..87276e2594 100644 --- a/frameworks/native/audioadapter/include/audio_service_adapter.h +++ b/frameworks/native/audioadapter/include/audio_service_adapter.h @@ -17,7 +17,6 @@ #define ST_AUDIO_SERVICE_ADAPTER_H #include -#include #include #include #include @@ -150,25 +149,6 @@ public: */ virtual int32_t SuspendAudioDevice(std::string &audioPortName, bool isSuspend) = 0; - /** - * @brief Adjust audio mono - * - * @param - * @return Returns {@link SUCCESS} if suspend is success; returns an error code - * defined in {@link audio_errors.h} otherwise. - */ - virtual int32_t AdjustAudioMono(const std::string &audioPortName, std::optional audioMonoOptional) = 0; - - /** - * @brief Adjust volume balance in current active device - * - * @param audioPortName Name of the default audio sink - * @param audioBalance Audio balance value - * @return Returns {@link SUCCESS} if suspend is success; returns an error code - * defined in {@link audio_errors.h} otherwise. - */ - virtual int32_t AdjustAudioBalance(const std::string &audioPortName, std::optional audioBalanceOptional) = 0; - /** * @brief returns if given streamType is set to mute * diff --git a/frameworks/native/audioadapter/include/pulse_audio_service_adapter_impl.h b/frameworks/native/audioadapter/include/pulse_audio_service_adapter_impl.h index 9d74e62e58..45bc6336ac 100644 --- a/frameworks/native/audioadapter/include/pulse_audio_service_adapter_impl.h +++ b/frameworks/native/audioadapter/include/pulse_audio_service_adapter_impl.h @@ -38,10 +38,6 @@ public: int32_t SetVolume(AudioStreamType streamType, float volume) override; int32_t SetMute(AudioStreamType streamType, bool mute) override; int32_t SuspendAudioDevice(std::string &audioPortName, bool isSuspend) override; - int32_t AdjustAudioMono(const std::string &audioPortName, - std::optional audioMonoOptional) override; - int32_t AdjustAudioBalance(const std::string &audioPortName, - std::optional audioBalanceOptional) override; bool IsMute(AudioStreamType streamType) override; bool IsStreamActive(AudioStreamType streamType) override; std::vector GetAllSinkInputs() override; @@ -62,8 +58,6 @@ public: static void PaContextStateCb(pa_context *c, void *userdata); static void PaModuleLoadCb(pa_context *c, uint32_t idx, void *userdata); static void PaGetSinkInputInfoVolumeCb(pa_context *c, const pa_sink_input_info *i, int eol, void *userdata); - static void PaAdjustSinkAudioMonoCb(pa_context *c, const pa_sink_info *i, int eol, void *userdata); - static void PaAdjustSinkAudioBalanceCb(pa_context *c, const pa_sink_info *i, int eol, void *userdata); static void PaSubscribeCb(pa_context *c, pa_subscription_event_type_t t, uint32_t idx, void *userdata); static void PaGetSinkInputInfoMuteCb(pa_context *c, const pa_sink_input_info *i, int eol, void *userdata); static void PaGetSinkInputInfoMuteStatusCb(pa_context *c, const pa_sink_input_info *i, int eol, void *userdata); @@ -91,8 +85,6 @@ private: static constexpr uint32_t PA_CONNECT_RETRY_SLEEP_IN_MICRO_SECONDS = 500000; pa_context *mContext = NULL; pa_threaded_mainloop *mMainLoop = NULL; - bool mAudioMono = false; - float mAudioBalance = 0.0f; static std::unordered_map sinkIndexSessionIDMap; std::mutex mMutex; }; diff --git a/frameworks/native/audioadapter/src/pulse_audio_service_adapter_impl.cpp b/frameworks/native/audioadapter/src/pulse_audio_service_adapter_impl.cpp index 97becb29e8..2827c4c662 100644 --- a/frameworks/native/audioadapter/src/pulse_audio_service_adapter_impl.cpp +++ b/frameworks/native/audioadapter/src/pulse_audio_service_adapter_impl.cpp @@ -193,78 +193,6 @@ int32_t PulseAudioServiceAdapterImpl::SuspendAudioDevice(string &audioPortName, return SUCCESS; } -int32_t PulseAudioServiceAdapterImpl::AdjustAudioMono(const std::string &audioPortName, std::optional audioMonoOptional) -{ - AUDIO_INFO_LOG("audioBalance: PulseAudioServiceAdapterImpl::AdjustAudioMono in"); - - lock_guard lock(mMutex); - - if (audioMonoOptional.has_value()) { - mAudioMono = audioMonoOptional.value(); - } - - unique_ptr userData = make_unique(); - userData->thiz = this; - - pa_threaded_mainloop_lock(mMainLoop); - AUDIO_INFO_LOG("audioBalance: PulseAudioServiceAdapterImpl::AdjustAudioMono: operation start"); - pa_operation *operation = pa_context_get_sink_info_by_name(mContext, audioPortName.c_str(), - PulseAudioServiceAdapterImpl::PaAdjustSinkAudioMonoCb, reinterpret_cast(userData.get())); - if (operation == nullptr) { - AUDIO_ERR_LOG("[PulseAudioServiceAdapterImpl] pa_context_get_sink_info_by_name failed!"); - pa_threaded_mainloop_unlock(mMainLoop); - return ERR_OPERATION_FAILED; - } - while (pa_operation_get_state(operation) == PA_OPERATION_RUNNING) { - pa_threaded_mainloop_wait(mMainLoop); - } - AUDIO_INFO_LOG("audioBalance: PulseAudioServiceAdapterImpl::AdjustAudioMono: operation end"); - - userData.release(); - AUDIO_INFO_LOG("audioBalance: PulseAudioServiceAdapterImpl::AdjustAudioMono: release finish"); - pa_operation_unref(operation); - pa_threaded_mainloop_unlock(mMainLoop); - - return SUCCESS; -} - -int32_t PulseAudioServiceAdapterImpl::AdjustAudioBalance(const std::string &audioPortName, std::optional audioBalanceOptional) -{ - AUDIO_INFO_LOG("audioBalance: PulseAudioServiceAdapterImpl::AdjustAudioBalance in"); - - lock_guard lock(mMutex); - - if (audioBalanceOptional.has_value()) { - mAudioBalance = audioBalanceOptional.value(); - } - AUDIO_INFO_LOG("audioBalance: Adjust audio balance for: [%{public}s] : %{public}f", audioPortName.c_str(), mAudioBalance); - - unique_ptr userData = make_unique(); - userData->thiz = this; - - pa_threaded_mainloop_lock(mMainLoop); - - AUDIO_INFO_LOG("audioBalance: PulseAudioServiceAdapterImpl::AdjustAudioBalance: operation start"); - pa_operation *operation = pa_context_get_sink_info_by_name(mContext, audioPortName.c_str(), - PulseAudioServiceAdapterImpl::PaAdjustSinkAudioBalanceCb, reinterpret_cast(userData.get())); - if (operation == nullptr) { - AUDIO_ERR_LOG("[PulseAudioServiceAdapterImpl] pa_context_get_sink_info_by_name failed!"); - pa_threaded_mainloop_unlock(mMainLoop); - return ERR_OPERATION_FAILED; - } - while (pa_operation_get_state(operation) == PA_OPERATION_RUNNING) { - pa_threaded_mainloop_wait(mMainLoop); - } - AUDIO_INFO_LOG("audioBalance: PulseAudioServiceAdapterImpl::AdjustAudioBalance: operation end"); - - userData.release(); - AUDIO_INFO_LOG("audioBalance: PulseAudioServiceAdapterImpl::AdjustAudioBalance: release finish"); - pa_operation_unref(operation); - pa_threaded_mainloop_unlock(mMainLoop); - - return SUCCESS; -} - int32_t PulseAudioServiceAdapterImpl::SetDefaultSink(string name) { pa_threaded_mainloop_lock(mMainLoop); @@ -277,11 +205,6 @@ int32_t PulseAudioServiceAdapterImpl::SetDefaultSink(string name) pa_operation_unref(operation); pa_threaded_mainloop_unlock(mMainLoop); - AUDIO_INFO_LOG("audioBalance: PulseAudioServiceAdapterImpl::SetDefaultSink in: name[%{public}s]", name.c_str()); - - AdjustAudioBalance(name, {}); - AdjustAudioMono(name, {}); - return SUCCESS; } @@ -967,99 +890,6 @@ void PulseAudioServiceAdapterImpl::PaGetSinkInputInfoVolumeCb(pa_context *c, con "ISOUTPUT", 1, "STREAMID", sessionID, "STREAMTYPE", streamID, "VOLUME", vol); } -void PulseAudioServiceAdapterImpl::PaAdjustSinkAudioMonoCb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) -{ - UserData *userData = reinterpret_cast(userdata); - PulseAudioServiceAdapterImpl *thiz = userData->thiz; - - AUDIO_INFO_LOG("audioBalance: [PulseAudioServiceAdapterImpl] PaAdjustSinkAudioMonoCb in"); - AUDIO_INFO_LOG("[PulseAudioServiceAdapterImpl] PaAdjustSinkAudioMonoCb"); - if (eol < 0) { - AUDIO_ERR_LOG("[PulseAudioServiceAdapterImpl] Failed to get sink information: %{public}s", - pa_strerror(pa_context_errno(c))); - delete userData; - return; - } - - if (eol) { - pa_threaded_mainloop_signal(thiz->mMainLoop, 0); - delete userData; - return; - } - - // // remap - // pa_channel_map channelMap = i->channel_map; - // pa_sample_spec sampleSpec = i->sample_spec; - - // pa_sample_format_t format = sampleSpec.format; - // unsigned inChannels = channelMap.channels; - // unsigned outChannels = 1; - - // pa_remap_t remap = {PA_SAMPLE_INVALID}; - // // setup_remap_channels: - // remap.format = format; - // remap.i_ss.channels = inChannels; - // remap.o_ss.channels = outChannels; - // for (unsigned i = 0; i < inChannels; i++) { - // remap.map_table_f[0][i] = 1.0f / inChannels; - // remap.map_table_i[0][i] = 0x10000 / inChannels; - // } - // pa_init_remap_func(&remap); - - // pa_pstream *pstream = c->pstream; - // pa_memchunk *input = &(pstream->write.memchunk); - // void *src = pa_memblock_acquire_chunk(input); - - // pa_mempool *mempool = c->mempool; - // pa_memblock *output = pa_memblock_new(mempool, input->memblock->length); - // void *dst = pa_memblock_acquire(output); - - // size_t sampleSize = pa_sample_size(&sampleSpec); - // unsigned nSamples = (unsigned) (input->length / sampleSize); - // unsigned nFrames = nSamples / inChannels; - - // // remap_func->do_remap(remap_func, out, in, nsamples); - // remap.do_remap(&remap, dst, src, nFrames); - - // pa_mempool_unref(mempool); - - // // // channelMap - // // AUDIO_INFO_LOG("audioBalance: [PulseAudioServiceAdapterImpl] PaAdjustSinkAudioMonoCb: channel_map.channels = %{public}d, initial", i->channel_map.channels); - // // pa_channel_map channelMap = i->channel_map; - // // (void)pa_channel_map_init_mono(&channelMap); - // // AUDIO_INFO_LOG("audioBalance: [PulseAudioServiceAdapterImpl] PaAdjustSinkAudioMonoCb: channel_map.channels = %{public}d, adjusted", i->channel_map.channels); - -} - -void PulseAudioServiceAdapterImpl::PaAdjustSinkAudioBalanceCb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) -{ - UserData *userData = reinterpret_cast(userdata); - PulseAudioServiceAdapterImpl *thiz = userData->thiz; - - AUDIO_INFO_LOG("audioBalance: [PulseAudioServiceAdapterImpl] PaAdjustSinkAudioBalanceCb in"); - AUDIO_INFO_LOG("[PulseAudioServiceAdapterImpl] PaAdjustSinkAudioBalanceCb"); - if (eol < 0) { - AUDIO_ERR_LOG("[PulseAudioServiceAdapterImpl] Failed to get sink information: %{public}s", - pa_strerror(pa_context_errno(c))); - delete userData; - return; - } - - if (eol) { - pa_threaded_mainloop_signal(thiz->mMainLoop, 0); - delete userData; - return; - } - - pa_cvolume cv = i->volume; - pa_channel_map channelMap = i->channel_map; - - pa_cvolume* adjustedCVolume = pa_cvolume_set_balance(&cv, &channelMap, thiz->mAudioBalance); - pa_operation_unref(pa_context_set_sink_volume_by_name(c, i->name, adjustedCVolume, nullptr, nullptr)); - - AUDIO_INFO_LOG("audioBalance: [PulseAudioServiceAdapterImpl] PaAdjustSinkAudioBalanceCb out"); -} - void PulseAudioServiceAdapterImpl::PaGetSinkInputInfoCorkStatusCb(pa_context *c, const pa_sink_input_info *i, int eol, void *userdata) { diff --git a/frameworks/native/audioutils/src/audio_utils.cpp b/frameworks/native/audioutils/src/audio_utils.cpp index edffbfeed2..cd8412017f 100644 --- a/frameworks/native/audioutils/src/audio_utils.cpp +++ b/frameworks/native/audioutils/src/audio_utils.cpp @@ -82,8 +82,6 @@ void AdjustAudioBalanceForPCM16Bit(int16_t *data, uint64_t len, float left, floa for (unsigned i = len >> 1; i > 0; i--) { data[0] *= left; data[1] *= right; - // data[0] = (int16_t) data[0] * left; - // data[1] = (int16_t) data[1] * right; data += 2; } } diff --git a/services/audio_policy/BUILD.gn b/services/audio_policy/BUILD.gn index 8899bb9021..ae8203b1bf 100644 --- a/services/audio_policy/BUILD.gn +++ b/services/audio_policy/BUILD.gn @@ -141,7 +141,6 @@ ohos_shared_library("audio_policy_service") { "$hdf_uhdf_path/ipc:libhdf_ipc_adapter", "$hdf_uhdf_path/utils:libhdf_utils", "//foundation/barrierfree/accessibility/interfaces/innerkits/acfwk:accessibilityconfig", - "//foundation/communication/bluetooth/services/bluetooth/ipc:btipc_static", "//foundation/communication/ipc/interfaces/innerkits/ipc_core:ipc_core", "//foundation/distributeddatamgr/datamgr_service/services/distributeddataservice/adapter:distributeddata_adapter", "//foundation/distributeddatamgr/kv_store/interfaces/innerkits/distributeddata:distributeddata_inner", 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 d59238ae20..1f2724665b 100644 --- a/services/audio_policy/server/include/service/audio_policy_service.h +++ b/services/audio_policy/server/include/service/audio_policy_service.h @@ -184,7 +184,7 @@ private: configParser_(ParserFactory::GetInstance().CreateParser(*this)), streamCollector_(AudioStreamCollector::GetAudioStreamCollector()) { - mAccessibilityConfigListener = std::make_shared(*this); + accessibilityConfigListener_ = std::make_shared(*this); deviceStatusListener_ = std::make_unique(*this); } @@ -272,10 +272,10 @@ private: DeviceType currentActiveDevice_ = DEVICE_TYPE_NONE; DeviceType activeInputDevice_ = DEVICE_TYPE_NONE; std::unordered_map> routerMap_; - std::shared_ptr mAccessibilityConfigListener; IAudioPolicyInterface& audioPolicyManager_; Parser& configParser_; AudioStreamCollector& streamCollector_; + std::shared_ptr accessibilityConfigListener_; std::unique_ptr deviceStatusListener_; std::vector> connectedDevices_; std::unordered_map connectedA2dpDeviceMap_; 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 6b7a98e4f3..57f8ec9d7f 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 @@ -70,10 +70,6 @@ public: virtual int32_t SetAudioSessionCallback(AudioSessionCallback *callback) = 0; virtual int32_t SuspendAudioDevice(std::string &name, bool isSuspend) = 0; - - virtual int32_t AdjustAudioMono(const std::string &portName, bool audioMono) = 0; - - virtual int32_t AdjustAudioBalance(const std::string &portName, float audioBalance) = 0; }; } // 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 c912ebfbca..826bcc4324 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 @@ -85,10 +85,6 @@ public: int32_t SuspendAudioDevice(std::string &name, bool isSuspend); - int32_t AdjustAudioMono(const std::string &portName, bool audioMono); - - int32_t AdjustAudioBalance(const std::string &portName, float audioBalance); - virtual ~AudioAdapterManager() {} private: 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 cd13dd683b..62072dc9ac 100644 --- a/services/audio_policy/server/src/service/audio_policy_service.cpp +++ b/services/audio_policy/server/src/service/audio_policy_service.cpp @@ -75,7 +75,7 @@ bool AudioPolicyService::Init(void) return false; } - mAccessibilityConfigListener->SubscribeObserver(); + accessibilityConfigListener_->SubscribeObserver(); return true; } @@ -125,7 +125,7 @@ void AudioPolicyService::Deinit(void) }); IOHandles_.clear(); - mDeviceStatusListener->UnRegisterDeviceStatusListener(); + accessibilityConfigListener_->UnsubscribeObserver(); deviceStatusListener_->UnRegisterDeviceStatusListener(); if (isBtListenerRegistered) { @@ -1327,20 +1327,6 @@ void AudioPolicyService::OnServiceConnected(AudioServiceIndex serviceIndex) void AudioPolicyService::OnMonoAudioConfigChanged(bool audioMono) { AUDIO_INFO_LOG("audioBalance: OnMonoAudioConfigChanged in"); - - // std::string activePort = GetPortName(mCurrentActiveDevice_); - // if (activePort == "none") { - // AUDIO_INFO_LOG("audioBalance: Adjust Mono of active sink %{public}s, do not adjust mono and return", activePort.c_str()); - // } else { // activePort is not none - // AUDIO_INFO_LOG("audioBalance: Adjust Mono of active sink %{public}s. Mono: %{public}d", activePort.c_str(), audioMono); - // // 单声道开启时,混合多声道,平均输出。设想调用remap - // // 单声道关闭时,还原立体声 - // mAudioPolicyManager.AdjustAudioMono(activePort, audioMono); - // } - // manager不宜处理播放数据,放弃此思路 - - // 尝试调用hdi_sink.c,直接在该文件里自行编写声道转换函数 - // 最终在audio_renderer_sink.cpp中添加数据处理函数 if (g_sProxy == nullptr) { AUDIO_ERR_LOG("Service proxy unavailable: g_sProxy null"); return; @@ -1352,17 +1338,6 @@ void AudioPolicyService::OnMonoAudioConfigChanged(bool audioMono) void AudioPolicyService::OnAudioBalanceChanged(float audioBalance) { AUDIO_INFO_LOG("audioBalance: OnAduioBalanceChanged in"); - - // std::string activePort = GetPortName(mCurrentActiveDevice_); - // if (activePort == "none") { - // AUDIO_INFO_LOG("audioBalance: Adjust balance of active sink %{public}s, do not adjust balance and return", activePort.c_str()); - // } else { - // AUDIO_INFO_LOG("audioBalance: Adjust balance of active sink %{public}s, balance: %{public}f", activePort.c_str(), audioBalance); - // mAudioPolicyManager.AdjustAudioBalance(activePort, audioBalance); - // } - // 此路原本可行,但由于Mono接口是在audio_renderer_sink.cpp中处理数据,会抹掉Manager中调整音量的效果 - - // 改为和Mono接口同一方案 if (g_sProxy == nullptr) { AUDIO_ERR_LOG("Service proxy unavailable: g_sProxy null"); return; diff --git a/services/audio_policy/server/src/service/listener/accessibility_config_listener.cpp b/services/audio_policy/server/src/service/listener/accessibility_config_listener.cpp index 137f779819..123eee10be 100755 --- a/services/audio_policy/server/src/service/listener/accessibility_config_listener.cpp +++ b/services/audio_policy/server/src/service/listener/accessibility_config_listener.cpp @@ -32,8 +32,8 @@ void AccessibilityConfigListener::OnConfigChanged(const CONFIG_ID configId, cons if (configId == CONFIG_AUDIO_MONO) { audioAccessibilityConfigObserver_.OnMonoAudioConfigChanged(value.audioMono); } else if (configId == CONFIG_AUDIO_BALANCE) { - // 应在此处加入audioBalance值的判断? - // 应在[-1, +1]范围内 + // 是否应在此处加入audioBalance值的判断? + // value.audioBalance应在[-1, +1]范围内 audioAccessibilityConfigObserver_.OnAudioBalanceChanged(value.audioBalance); } } 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 9419e4ef87..7f7d30b697 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 @@ -182,28 +182,6 @@ int32_t AudioAdapterManager::SuspendAudioDevice(std::string &portName, bool isSu return mAudioServiceAdapter->SuspendAudioDevice(portName, isSuspend); } -int32_t AudioAdapterManager::AdjustAudioMono(const std::string &portName, bool audioMono) -{ - if (!mAudioServiceAdapter) { - AUDIO_ERR_LOG("[AudioAdapterManager] audio adapter null"); - return ERR_OPERATION_FAILED; - } - - AUDIO_INFO_LOG("audioBalance: AudioAdapterManager::AdjustAudioMono in"); - return mAudioServiceAdapter->AdjustAudioMono(portName, audioMono); -} - -int32_t AudioAdapterManager::AdjustAudioBalance(const std::string &portName, float audioBalance) -{ - if (!mAudioServiceAdapter) { - AUDIO_ERR_LOG("[AudioAdapterManager] audio adapter null"); - return ERR_OPERATION_FAILED; - } - - AUDIO_INFO_LOG("audioBalance: AudioAdapterManager::AdjustAudioBalance in"); - return mAudioServiceAdapter->AdjustAudioBalance(portName, audioBalance); -} - int32_t AudioAdapterManager::SetDeviceActive(AudioIOHandle ioHandle, InternalDeviceType deviceType, std::string name, bool active) { -- Gitee From 21f96bbb3c12bddde3b42ed8e92075e29ff72197 Mon Sep 17 00:00:00 2001 From: songshenke Date: Wed, 28 Sep 2022 16:52:38 +0800 Subject: [PATCH 06/12] support bluetooth by intf Signed-off-by: songshenke Change-Id: Ia8a80ad59e3fd5b2f7283c472a4d5de771aa694a --- .../bluetooth/bluetooth_renderer_sink.cpp | 69 ++++++++++++++++--- .../sink/bluetooth/bluetooth_renderer_sink.h | 7 +- .../bluetooth/bluetooth_renderer_sink_intf.h | 2 + .../audio_service/server/src/audio_server.cpp | 5 ++ 4 files changed, 71 insertions(+), 12 deletions(-) diff --git a/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink.cpp b/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink.cpp index a4112fa4bf..6ff52c9aa7 100644 --- a/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink.cpp +++ b/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink.cpp @@ -48,7 +48,8 @@ const uint32_t PCM_32_BIT = 32; } #ifdef BT_DUMPFILE -const char *g_audioOutTestFilePath = "/data/local/tmp/audioout_bt.pcm"; +// const char *g_audioOutTestFilePath = "/data/local/tmp/audioout_bt.pcm"; +const char *g_audioOutTestFilePath = "/data/data/.pulse_dir/audioout_bt.pcm"; #endif // BT_DUMPFILE BluetoothRendererSink::BluetoothRendererSink() @@ -294,6 +295,17 @@ int32_t BluetoothRendererSink::RenderFrame(char &data, uint64_t len, uint64_t &w return ERR_INVALID_HANDLE; } + if (audioMonoState) { + // AUDIO_DEBUG_LOG("audioBalance: AudioRendererSink::RenderFrame: audioMonoState is true"); + // AUDIO_INFO_LOG("audioBalance: BluetoothRendererSink::RenderFrame: audioMonoState is true"); + AdjustStereoToMono(&data, len); + } + + if (audioBalanceState) { + // AUDIO_DEBUG_LOG("audioBalance: AudioRendererSink::RenderFrame: audioBalanceState is true"); + AdjustAudioBalance(&data, len); + } + #ifdef BT_DUMPFILE size_t writeResult = fwrite((void*)&data, 1, len, pfd); if (writeResult != len) { @@ -551,25 +563,38 @@ int32_t BluetoothRendererSink::Flush(void) return ERR_OPERATION_FAILED; } +bool BluetoothRendererSink::GetAudioMonoState() +{ + return audioMonoState; +} + +float BluetoothRendererSink::GetAudioBalanceValue() +{ + return audioBalanceValue; +} + void BluetoothRendererSink::SetAudioMonoState(bool audioMono) { - AUDIO_INFO_LOG("audioBalance: AudioRendererSink::SetAudioMonoState: %{public}d", audioMono); + // AUDIO_INFO_LOG("audioBalance: AudioRendererSink::SetAudioMonoState: %{public}d", audioMono); audioMonoState = audioMono; } void BluetoothRendererSink::SetAudioBalanceValue(float audioBalance) { - AUDIO_INFO_LOG("audioBalance: AudioRendererSink::SetAudioBalanceValue: %{public}f", audioBalance); + // AUDIO_INFO_LOG("audioBalance: AudioRendererSink::SetAudioBalanceValue: %{public}f", audioBalance); + // reset the balance coefficient + audioBalanceValue = 0.0f; leftBalanceCoef = 1.0f; rightBalanceCoef = 1.0f; - if (std::abs(audioBalance - 0.0f) <= std::numeric_limits::epsilon()) { + if (std::abs(audioBalance) <= std::numeric_limits::epsilon()) { // audioBalance is equal to 0.0f audioBalanceState = false; } else { // audioBalance is not equal to 0.0f audioBalanceState = true; + audioBalanceValue = audioBalance; // calculate the balance coefficient if (audioBalance > 0.0f) { leftBalanceCoef -= audioBalance; @@ -586,7 +611,7 @@ void BluetoothRendererSink::AdjustStereoToMono(char *data, uint64_t len) // AUDIO_DEBUG_LOG("AudioRendererSink::AdjustStereoToMono: channel is %{public}d", attr_.channel); return; } - + // AUDIO_INFO_LOG("audioBalance: BluetoothRendererSink::channels is %{public}d, format is %{public}d", attr_.channel, attr_.format); switch (attr_.format) { case AUDIO_FORMAT_PCM_8_BIT: { // 暂未测试是否可行 @@ -739,12 +764,18 @@ int32_t BluetoothRendererRenderFrame(void *wapper, char &data, uint64_t len, uin return ERR_NOT_STARTED; } - // if (g_bluetoothRendrSinkInstance->GetAudioMonoState()) { - // bluetoothRendererSinkWapper->SetAudioMonoState(true); - // } - // if (g_bluetoothRendrSinkInstance->GetAudioBalanceState()) { - // bluetoothRendererSinkWapper->SetAudioBalanceValue(value); - // } + if (bluetoothRendererSinkWapper->GetAudioMonoState() != g_bluetoothRendrSinkInstance->GetAudioMonoState()) { + // AUDIO_INFO_LOG("audioBalance: BluetoothRendererRenderFrame in:g_bt_MonoState is %{public}s", g_bluetoothRendrSinkInstance->GetAudioMonoState()? "true": "false"); + // AUDIO_INFO_LOG("audioBalance: BluetoothRendererRenderFrame in:bt_MonoState is %{public}s", bluetoothRendererSinkWapper->GetAudioMonoState()? "true": "false"); + bluetoothRendererSinkWapper->SetAudioMonoState(g_bluetoothRendrSinkInstance->GetAudioMonoState()); + // AUDIO_INFO_LOG("audioBalance: BluetoothRendererRenderFrame in:g_bt_MonoState is %{public}s", g_bluetoothRendrSinkInstance->GetAudioMonoState()? "true": "false"); + // AUDIO_INFO_LOG("audioBalance: BluetoothRendererRenderFrame in:bt_MonoState is %{public}s", bluetoothRendererSinkWapper->GetAudioMonoState()? "true": "false"); + } + if (std::abs(bluetoothRendererSinkWapper->GetAudioBalanceValue() - g_bluetoothRendrSinkInstance->GetAudioBalanceValue()) + > std::numeric_limits::epsilon()) { + // 若二者值不相等,则重新赋值 + bluetoothRendererSinkWapper->SetAudioBalanceValue(g_bluetoothRendrSinkInstance->GetAudioBalanceValue()); + } ret = bluetoothRendererSinkWapper->RenderFrame(data, len, writeLen); return ret; @@ -797,6 +828,22 @@ int32_t BluetoothRendererSinkGetTransactionId(uint64_t *transactionId) return g_bluetoothRendrSinkInstance->GetTransactionId(transactionId); } + +void BluetoothRendererSinkSetAudioMonoState(bool audioMonoState) +{ + // AUDIO_INFO_LOG("audioBalance: BluetoothRendererSinkSetMonoState in:audioMonoState is %{public}s", audioMonoState? "true": "false"); + // AUDIO_INFO_LOG("audioBalance: BluetoothRendererSinkSetMonoState in:g_bt_MonoState is %{public}s", g_bluetoothRendrSinkInstance->GetAudioMonoState()? "true": "false"); + g_bluetoothRendrSinkInstance->SetAudioMonoState(audioMonoState); + // AUDIO_INFO_LOG("audioBalance: BluetoothRendererSinkSetMonoState out:audioMonoState is %{public}s", audioMonoState? "true": "false"); + // AUDIO_INFO_LOG("audioBalance: BluetoothRendererSinkSetMonoState out:g_bt_MonoState is %{public}s", g_bluetoothRendrSinkInstance->GetAudioMonoState()? "true": "false"); +} + +void BluetoothRendererSinkSetAudioBalanceValue(float audioBalance) +{ + // AUDIO_INFO_LOG("audioBalance: BluetoothRendererSinkSetBalanceValue in:audioBalanceValue is %{public}f", audioBalance); + g_bluetoothRendrSinkInstance->SetAudioBalanceValue(audioBalance); + // AUDIO_INFO_LOG("audioBalance: BluetoothRendererSinkSetBalanceValue out:audioBalanceValue is %{public}f", audioBalance); +} #ifdef __cplusplus } #endif diff --git a/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink.h b/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink.h index 12a7cc4946..3533463324 100644 --- a/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink.h +++ b/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink.h @@ -16,6 +16,8 @@ #ifndef BLUETOOTH_RENDERER_SINK_H #define BLUETOOTH_RENDERER_SINK_H +// #define BT_DUMPFILE + #include "audio_info.h" #include "audio_proxy_manager.h" #include "running_lock.h" @@ -49,9 +51,11 @@ public: int32_t GetLatency(uint32_t *latency); int32_t GetTransactionId(uint64_t *transactionId); static BluetoothRendererSink *GetInstance(void); - bool rendererInited_; + bool GetAudioMonoState(); + float GetAudioBalanceValue(); void SetAudioMonoState(bool audioMono); void SetAudioBalanceValue(float audioBalance); + bool rendererInited_; private: BluetoothRendererSink(); @@ -68,6 +72,7 @@ private: void *handle_; bool audioMonoState = false; bool audioBalanceState = false; + float audioBalanceValue = 0.0f; float leftBalanceCoef = 1.0f; float rightBalanceCoef = 1.0f; diff --git a/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink_intf.h b/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink_intf.h index 0a9a7bf9e1..4285e3c065 100644 --- a/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink_intf.h +++ b/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink_intf.h @@ -38,6 +38,8 @@ int32_t BluetoothRendererRenderFrame(void *wapper, char *data, uint64_t len, uin int32_t BluetoothRendererSinkSetVolume(void *wapper, float left, float right); int32_t BluetoothRendererSinkGetLatency(void *wapper, uint32_t *latency); int32_t BluetoothRendererSinkGetTransactionId(uint64_t *transactionId); +void BluetoothRendererSinkSetAudioMonoState(bool audioMonoState); +void BluetoothRendererSinkSetAudioBalanceValue(float audioBalance); #ifdef __cplusplus } #endif diff --git a/services/audio_service/server/src/audio_server.cpp b/services/audio_service/server/src/audio_server.cpp index f5e989d762..28d697c956 100644 --- a/services/audio_service/server/src/audio_server.cpp +++ b/services/audio_service/server/src/audio_server.cpp @@ -24,6 +24,7 @@ #include "audio_log.h" #include "system_ability_definition.h" #include "audio_manager_listener_proxy.h" +#include "bluetooth_renderer_sink_intf.h" #include "audio_server.h" @@ -357,6 +358,8 @@ void AudioServer::SetAudioMonoState(bool audioMono) audioRendererSinkInstance->SetAudioMonoState(audioMono); } + BluetoothRendererSinkSetAudioMonoState(audioMono); + // AUDIO_INFO_LOG("audioBalance: AudioServer::Bluetooth: SetAudioMonoState: %{public}d", audioMono); // BluetoothRendererSink *bluetoothRendererSinkInstance = BluetoothRendererSink::GetInstance(); // if (!bluetoothRendererSinkInstance->rendererInited_) { // AUDIO_WARNING_LOG("Renderer is not initialized."); @@ -376,6 +379,8 @@ void AudioServer::SetAudioBalanceValue(float audioBalance) audioRendererSinkInstance->SetAudioBalanceValue(audioBalance); } + BluetoothRendererSinkSetAudioBalanceValue(audioBalance); + // AUDIO_INFO_LOG("audioBalance: AudioServer::Bluetooth: SetAudioBalanceValue: %{public}f", audioBalance); // BluetoothRendererSink *bluetoothRendererSinkInstance = BluetoothRendererSink::GetInstance(); // if (!bluetoothRendererSinkInstance->rendererInited_) { // AUDIO_WARNING_LOG("Renderer is not initialized."); -- Gitee From 2881478d7cc92976d81c3c6bd28ac6ab9a259608 Mon Sep 17 00:00:00 2001 From: songshenke Date: Thu, 29 Sep 2022 20:54:43 +0800 Subject: [PATCH 07/12] Remove deprecated codes and optimize logs and comments Signed-off-by: songshenke Change-Id: I0d7e0d4a1a7d1d2977966758f1995444b32069b6 --- .../bluetooth/bluetooth_renderer_sink.cpp | 45 ++++++------------- .../sink/bluetooth/bluetooth_renderer_sink.h | 2 - .../sink/primary/audio_renderer_sink.cpp | 41 +++++++---------- .../sink/primary/audio_renderer_sink.h | 3 +- .../src/service/audio_policy_service.cpp | 6 +-- .../accessibility_config_listener.cpp | 13 +++--- services/audio_service/BUILD.gn | 3 -- .../client/include/audio_manager_base.h | 4 +- .../server/include/audio_server.h | 1 - .../server/src/audio_manager_stub.cpp | 2 - .../audio_service/server/src/audio_server.cpp | 23 +++------- 11 files changed, 48 insertions(+), 95 deletions(-) diff --git a/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink.cpp b/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink.cpp index 6ff52c9aa7..d26fd2a105 100644 --- a/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink.cpp +++ b/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink.cpp @@ -48,8 +48,7 @@ const uint32_t PCM_32_BIT = 32; } #ifdef BT_DUMPFILE -// const char *g_audioOutTestFilePath = "/data/local/tmp/audioout_bt.pcm"; -const char *g_audioOutTestFilePath = "/data/data/.pulse_dir/audioout_bt.pcm"; +const char *g_audioOutTestFilePath = "/data/local/tmp/audioout_bt.pcm"; #endif // BT_DUMPFILE BluetoothRendererSink::BluetoothRendererSink() @@ -296,13 +295,10 @@ int32_t BluetoothRendererSink::RenderFrame(char &data, uint64_t len, uint64_t &w } if (audioMonoState) { - // AUDIO_DEBUG_LOG("audioBalance: AudioRendererSink::RenderFrame: audioMonoState is true"); - // AUDIO_INFO_LOG("audioBalance: BluetoothRendererSink::RenderFrame: audioMonoState is true"); AdjustStereoToMono(&data, len); } if (audioBalanceState) { - // AUDIO_DEBUG_LOG("audioBalance: AudioRendererSink::RenderFrame: audioBalanceState is true"); AdjustAudioBalance(&data, len); } @@ -575,15 +571,12 @@ float BluetoothRendererSink::GetAudioBalanceValue() void BluetoothRendererSink::SetAudioMonoState(bool audioMono) { - // AUDIO_INFO_LOG("audioBalance: AudioRendererSink::SetAudioMonoState: %{public}d", audioMono); audioMonoState = audioMono; } void BluetoothRendererSink::SetAudioBalanceValue(float audioBalance) { - // AUDIO_INFO_LOG("audioBalance: AudioRendererSink::SetAudioBalanceValue: %{public}f", audioBalance); - - // reset the balance coefficient + // reset the balance coefficient value firstly audioBalanceValue = 0.0f; leftBalanceCoef = 1.0f; rightBalanceCoef = 1.0f; @@ -607,14 +600,12 @@ void BluetoothRendererSink::SetAudioBalanceValue(float audioBalance) void BluetoothRendererSink::AdjustStereoToMono(char *data, uint64_t len) { if (attr_.channel != 2) { - // 目前仅支持双声道,暂未支持 channels >= 3 - // AUDIO_DEBUG_LOG("AudioRendererSink::AdjustStereoToMono: channel is %{public}d", attr_.channel); + // only stereo is surpported now (channel numbers is 2) return; } - // AUDIO_INFO_LOG("audioBalance: BluetoothRendererSink::channels is %{public}d, format is %{public}d", attr_.channel, attr_.format); switch (attr_.format) { case AUDIO_FORMAT_PCM_8_BIT: { - // 暂未测试是否可行 + // this function needs to be further tested for usability AdjustStereoToMonoForPCM8Bit((int8_t*)data, len); break; } @@ -623,7 +614,7 @@ void BluetoothRendererSink::AdjustStereoToMono(char *data, uint64_t len) break; } case AUDIO_FORMAT_PCM_24_BIT: { - // 暂未测试是否可行 + // this function needs to be further tested for usability AdjustStereoToMonoForPCM24Bit((int8_t*)data, len); break; } @@ -632,7 +623,8 @@ void BluetoothRendererSink::AdjustStereoToMono(char *data, uint64_t len) break; } default: { - // AUDIO_DEBUG_LOG("BluetoothRendererSink::RenderFrame: audioMonoState: Unkowned audio format!"); + // if the audio format is unsupported, the audio data will not be changed + AUDIO_ERR_LOG("BluetoothRendererSink::AdjustStereoToMono: Unsupported audio format"); break; } } @@ -641,14 +633,13 @@ void BluetoothRendererSink::AdjustStereoToMono(char *data, uint64_t len) void BluetoothRendererSink::AdjustAudioBalance(char *data, uint64_t len) { if (attr_.channel != 2) { - // 目前只支持双声道,单声道无法调整平衡,暂未支持 channels >= 3 - // AUDIO_DEBUG_LOG("AudioRendererSink::RenderFrame: audioBalanceState is true, but channel is %{public}d", attr_.channel); + // only stereo is surpported now (channel numbers is 2) return; } switch (attr_.format) { case AUDIO_FORMAT_PCM_8_BIT: { - // 暂未测试是否可行 + // this function needs to be further tested for usability AdjustAudioBalanceForPCM8Bit((int8_t*)data, len, leftBalanceCoef, rightBalanceCoef); break; } @@ -657,7 +648,7 @@ void BluetoothRendererSink::AdjustAudioBalance(char *data, uint64_t len) break; } case AUDIO_FORMAT_PCM_24_BIT: { - // 暂未测试是否可行 + // this function needs to be further tested for usability AdjustAudioBalanceForPCM24Bit((int8_t*)data, len, leftBalanceCoef, rightBalanceCoef); break; } @@ -666,7 +657,8 @@ void BluetoothRendererSink::AdjustAudioBalance(char *data, uint64_t len) break; } default: { - // AUDIO_DEBUG_LOG("AudioRendererSink::RenderFrame: audioMonoState: Unkowned audio format!"); + // if the audio format is unsupported, the audio data will not be changed + AUDIO_ERR_LOG("BluetoothRendererSink::AdjustAudioBalance: Unsupported audio format"); break; } } @@ -765,15 +757,12 @@ int32_t BluetoothRendererRenderFrame(void *wapper, char &data, uint64_t len, uin } if (bluetoothRendererSinkWapper->GetAudioMonoState() != g_bluetoothRendrSinkInstance->GetAudioMonoState()) { - // AUDIO_INFO_LOG("audioBalance: BluetoothRendererRenderFrame in:g_bt_MonoState is %{public}s", g_bluetoothRendrSinkInstance->GetAudioMonoState()? "true": "false"); - // AUDIO_INFO_LOG("audioBalance: BluetoothRendererRenderFrame in:bt_MonoState is %{public}s", bluetoothRendererSinkWapper->GetAudioMonoState()? "true": "false"); + // if the two mono states are not equal, use the value of g_bluetoothRendrSinkInstance bluetoothRendererSinkWapper->SetAudioMonoState(g_bluetoothRendrSinkInstance->GetAudioMonoState()); - // AUDIO_INFO_LOG("audioBalance: BluetoothRendererRenderFrame in:g_bt_MonoState is %{public}s", g_bluetoothRendrSinkInstance->GetAudioMonoState()? "true": "false"); - // AUDIO_INFO_LOG("audioBalance: BluetoothRendererRenderFrame in:bt_MonoState is %{public}s", bluetoothRendererSinkWapper->GetAudioMonoState()? "true": "false"); } if (std::abs(bluetoothRendererSinkWapper->GetAudioBalanceValue() - g_bluetoothRendrSinkInstance->GetAudioBalanceValue()) > std::numeric_limits::epsilon()) { - // 若二者值不相等,则重新赋值 + // if the two balance values are not equal, use the value of g_bluetoothRendrSinkInstance bluetoothRendererSinkWapper->SetAudioBalanceValue(g_bluetoothRendrSinkInstance->GetAudioBalanceValue()); } @@ -831,18 +820,12 @@ int32_t BluetoothRendererSinkGetTransactionId(uint64_t *transactionId) void BluetoothRendererSinkSetAudioMonoState(bool audioMonoState) { - // AUDIO_INFO_LOG("audioBalance: BluetoothRendererSinkSetMonoState in:audioMonoState is %{public}s", audioMonoState? "true": "false"); - // AUDIO_INFO_LOG("audioBalance: BluetoothRendererSinkSetMonoState in:g_bt_MonoState is %{public}s", g_bluetoothRendrSinkInstance->GetAudioMonoState()? "true": "false"); g_bluetoothRendrSinkInstance->SetAudioMonoState(audioMonoState); - // AUDIO_INFO_LOG("audioBalance: BluetoothRendererSinkSetMonoState out:audioMonoState is %{public}s", audioMonoState? "true": "false"); - // AUDIO_INFO_LOG("audioBalance: BluetoothRendererSinkSetMonoState out:g_bt_MonoState is %{public}s", g_bluetoothRendrSinkInstance->GetAudioMonoState()? "true": "false"); } void BluetoothRendererSinkSetAudioBalanceValue(float audioBalance) { - // AUDIO_INFO_LOG("audioBalance: BluetoothRendererSinkSetBalanceValue in:audioBalanceValue is %{public}f", audioBalance); g_bluetoothRendrSinkInstance->SetAudioBalanceValue(audioBalance); - // AUDIO_INFO_LOG("audioBalance: BluetoothRendererSinkSetBalanceValue out:audioBalanceValue is %{public}f", audioBalance); } #ifdef __cplusplus } diff --git a/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink.h b/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink.h index 3533463324..bb42dd2721 100644 --- a/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink.h +++ b/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink.h @@ -16,8 +16,6 @@ #ifndef BLUETOOTH_RENDERER_SINK_H #define BLUETOOTH_RENDERER_SINK_H -// #define BT_DUMPFILE - #include "audio_info.h" #include "audio_proxy_manager.h" #include "running_lock.h" diff --git a/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.cpp b/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.cpp index c1e9adc654..5e2b2d29c1 100644 --- a/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.cpp +++ b/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.cpp @@ -46,10 +46,7 @@ const uint32_t PARAM_VALUE_LENTH = 10; } #ifdef DUMPFILE // Note: accessing to this directory requires selinux permission -// const char *g_audioOutTestFilePath = "/data/local/tmp/audioout_test.pcm"; - -// change file path temporarily -const char *g_audioOutTestFilePath = "/data/data/.pulse_dir/audioout_test.pcm"; +const char *g_audioOutTestFilePath = "/data/local/tmp/audioout_test.pcm"; #endif // DUMPFILE AudioRendererSink::AudioRendererSink() @@ -103,14 +100,12 @@ std::string AudioRendererSink::GetAudioParameter(const AudioParamKey key, const void AudioRendererSink::SetAudioMonoState(bool audioMono) { - AUDIO_INFO_LOG("audioBalance: AudioRendererSink::SetAudioMonoState: %{public}d", audioMono); audioMonoState = audioMono; } void AudioRendererSink::SetAudioBalanceValue(float audioBalance) { - AUDIO_INFO_LOG("audioBalance: AudioRendererSink::SetAudioBalanceValue: %{public}f", audioBalance); - // reset the balance coefficient + // reset the balance coefficient value firstly leftBalanceCoef = 1.0f; rightBalanceCoef = 1.0f; @@ -132,14 +127,13 @@ void AudioRendererSink::SetAudioBalanceValue(float audioBalance) void AudioRendererSink::AdjustStereoToMono(char *data, uint64_t len) { if (attr_.channel != 2) { - // 目前仅支持双声道,暂未支持 channels >= 3 - // AUDIO_DEBUG_LOG("AudioRendererSink::AdjustStereoToMono: channel is %{public}d", attr_.channel); + // only stereo is surpported now (channel numbers is 2) return; } switch (attr_.format) { case AUDIO_FORMAT_PCM_8_BIT: { - // 暂未测试是否可行 + // this function needs to be further tested for usability AdjustStereoToMonoForPCM8Bit((int8_t*)data, len); break; } @@ -148,7 +142,7 @@ void AudioRendererSink::AdjustStereoToMono(char *data, uint64_t len) break; } case AUDIO_FORMAT_PCM_24_BIT: { - // 暂未测试是否可行 + // this function needs to be further tested for usability AdjustStereoToMonoForPCM24Bit((int8_t*)data, len); break; } @@ -157,7 +151,8 @@ void AudioRendererSink::AdjustStereoToMono(char *data, uint64_t len) break; } default: { - // AUDIO_DEBUG_LOG("AudioRendererSink::RenderFrame: audioMonoState: Unkowned audio format!"); + // if the audio format is unsupported, the audio data will not be changed + AUDIO_ERR_LOG("AudioRendererSink::AdjustStereoToMono: Unsupported audio format"); break; } } @@ -166,14 +161,13 @@ void AudioRendererSink::AdjustStereoToMono(char *data, uint64_t len) void AudioRendererSink::AdjustAudioBalance(char *data, uint64_t len) { if (attr_.channel != 2) { - // 目前只支持双声道,单声道无法调整平衡,暂未支持 channels >= 3 - // AUDIO_DEBUG_LOG("AudioRendererSink::RenderFrame: audioBalanceState is true, but channel is %{public}d", attr_.channel); + // only stereo is surpported now (channel numbers is 2) return; } switch (attr_.format) { case AUDIO_FORMAT_PCM_8_BIT: { - // 暂未测试是否可行 + // this function needs to be further tested for usability AdjustAudioBalanceForPCM8Bit((int8_t*)data, len, leftBalanceCoef, rightBalanceCoef); break; } @@ -182,7 +176,7 @@ void AudioRendererSink::AdjustAudioBalance(char *data, uint64_t len) break; } case AUDIO_FORMAT_PCM_24_BIT: { - // 暂未测试是否可行 + // this function needs to be further tested for usability AdjustAudioBalanceForPCM24Bit((int8_t*)data, len, leftBalanceCoef, rightBalanceCoef); break; } @@ -191,7 +185,8 @@ void AudioRendererSink::AdjustAudioBalance(char *data, uint64_t len) break; } default: { - // AUDIO_DEBUG_LOG("AudioRendererSink::RenderFrame: audioMonoState: Unkowned audio format!"); + // if the audio format is unsupported, the audio data will not be changed + AUDIO_ERR_LOG("AudioRendererSink::AdjustAudioBalance: Unsupported audio format"); break; } } @@ -396,23 +391,17 @@ int32_t AudioRendererSink::RenderFrame(char &data, uint64_t len, uint64_t &write } if (audioMonoState) { - // AUDIO_DEBUG_LOG("audioBalance: AudioRendererSink::RenderFrame: audioMonoState is true"); AdjustStereoToMono(&data, len); } if (audioBalanceState) { - // AUDIO_DEBUG_LOG("audioBalance: AudioRendererSink::RenderFrame: audioBalanceState is true"); AdjustAudioBalance(&data, len); } #ifdef DUMPFILE - if (pfd != nullptr) { - size_t writeResult = fwrite((void*)&data, 1, (size_t)len, pfd); - if (writeResult != len) { - AUDIO_ERR_LOG("Failed to write the file."); - } - } else { - AUDIO_INFO_LOG("DUMPFILE: nullptr"); + size_t writeResult = fwrite((void*)&data, 1, len, pfd); + if (writeResult != len) { + AUDIO_ERR_LOG("Failed to write the file."); } #endif // DUMPFILE diff --git a/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.h b/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.h index 215ecd19a8..853f34a2a9 100644 --- a/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.h +++ b/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.h @@ -12,7 +12,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -// #define DUMPFILE #ifndef AUDIO_RENDERER_SINK_H #define AUDIO_RENDERER_SINK_H @@ -63,6 +62,7 @@ public: std::string GetAudioParameter(const AudioParamKey key, const std::string& condition); void SetAudioMonoState(bool audioMono); void SetAudioBalanceValue(float audioBalance); + private: AudioRendererSink(); ~AudioRendererSink(); @@ -80,7 +80,6 @@ private: struct AudioPort audioPort_ = {}; bool audioMonoState = false; bool audioBalanceState = false; - // float audioBalanceValue = 0.0f; float leftBalanceCoef = 1.0f; float rightBalanceCoef = 1.0f; 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 62072dc9ac..53b5a52847 100644 --- a/services/audio_policy/server/src/service/audio_policy_service.cpp +++ b/services/audio_policy/server/src/service/audio_policy_service.cpp @@ -1326,23 +1326,21 @@ void AudioPolicyService::OnServiceConnected(AudioServiceIndex serviceIndex) void AudioPolicyService::OnMonoAudioConfigChanged(bool audioMono) { - AUDIO_INFO_LOG("audioBalance: OnMonoAudioConfigChanged in"); + AUDIO_INFO_LOG("AudioPolicyService::OnMonoAudioConfigChanged: audioMono = %{public}s", audioMono? "true": "false"); if (g_sProxy == nullptr) { AUDIO_ERR_LOG("Service proxy unavailable: g_sProxy null"); return; } - AUDIO_INFO_LOG("audioBalance: Adjust mono by audio_server, audioMono: %{public}d", audioMono); g_sProxy->SetAudioMonoState(audioMono); } void AudioPolicyService::OnAudioBalanceChanged(float audioBalance) { - AUDIO_INFO_LOG("audioBalance: OnAduioBalanceChanged in"); + AUDIO_INFO_LOG("AudioPolicyService::OnAudioBalanceChanged: audioBalance = %{public}f", audioBalance); if (g_sProxy == nullptr) { AUDIO_ERR_LOG("Service proxy unavailable: g_sProxy null"); return; } - AUDIO_INFO_LOG("audioBalance: Adjust balance by audio_server, audioBalance: %{public}f", audioBalance); g_sProxy->SetAudioBalanceValue(audioBalance); } diff --git a/services/audio_policy/server/src/service/listener/accessibility_config_listener.cpp b/services/audio_policy/server/src/service/listener/accessibility_config_listener.cpp index 123eee10be..22550895e8 100755 --- a/services/audio_policy/server/src/service/listener/accessibility_config_listener.cpp +++ b/services/audio_policy/server/src/service/listener/accessibility_config_listener.cpp @@ -28,19 +28,21 @@ AccessibilityConfigListener::~AccessibilityConfigListener() {} void AccessibilityConfigListener::OnConfigChanged(const CONFIG_ID configId, const ConfigValue &value) { - AUDIO_INFO_LOG("audioBalance: OnConfigChanged in"); if (configId == CONFIG_AUDIO_MONO) { audioAccessibilityConfigObserver_.OnMonoAudioConfigChanged(value.audioMono); } else if (configId == CONFIG_AUDIO_BALANCE) { - // 是否应在此处加入audioBalance值的判断? - // value.audioBalance应在[-1, +1]范围内 - audioAccessibilityConfigObserver_.OnAudioBalanceChanged(value.audioBalance); + // value.audioBalance should be in the range [-1.0, 1.0] + float balance = value.audioBalance; + if (balance < -1.0f || balance > 1.0f) { + AUDIO_ERR_LOG("AccessibilityConfigListener: audioBalance value is out of range [-1.0, 1.0]"); + } else { + audioAccessibilityConfigObserver_.OnAudioBalanceChanged(balance); + } } } void AccessibilityConfigListener::SubscribeObserver() { - AUDIO_INFO_LOG("audioBalance: SubscribeObserver in"); auto &accessibilityConfig = OHOS::Singleton::GetInstance(); (void)accessibilityConfig.InitializeContext(); accessibilityConfig.SubscribeConfigObserver(CONFIG_AUDIO_MONO, shared_from_this()); @@ -49,7 +51,6 @@ void AccessibilityConfigListener::SubscribeObserver() void AccessibilityConfigListener::UnsubscribeObserver() { - AUDIO_INFO_LOG("audioBalance: UnsubscribeObserver in"); auto &accessibilityConfig = OHOS::Singleton::GetInstance(); (void)accessibilityConfig.InitializeContext(); accessibilityConfig.UnsubscribeConfigObserver(CONFIG_AUDIO_MONO, shared_from_this()); diff --git a/services/audio_service/BUILD.gn b/services/audio_service/BUILD.gn index ddec2fbc3a..8d3633a978 100644 --- a/services/audio_service/BUILD.gn +++ b/services/audio_service/BUILD.gn @@ -118,8 +118,6 @@ config("audio_service_config") { "//foundation/multimedia/audio_framework/frameworks/native/hdiadapter/source/common", "//foundation/multimedia/audio_framework/frameworks/native/hdiadapter/source/primary", "//drivers/peripheral/audio/interfaces/include", - "//drivers/peripheral/bluetooth/audio/interfaces/include", - "//drivers/peripheral/bluetooth/audio/hal/hdi_binder/proxy/include", "include/audio_service/common", ] @@ -144,7 +142,6 @@ ohos_shared_library("audio_service") { } deps = [ - "$hdf_uhdf_path/hdi:libhdi", "//foundation/multimedia/audio_framework/frameworks/native/hdiadapter/sink:audio_renderer_sink", "//foundation/multimedia/audio_framework/frameworks/native/hdiadapter/sink:bluetooth_renderer_sink", "//foundation/multimedia/audio_framework/frameworks/native/hdiadapter/sink:remote_audio_renderer_sink", diff --git a/services/audio_service/client/include/audio_manager_base.h b/services/audio_service/client/include/audio_manager_base.h index a81ccd2edd..e58267039a 100644 --- a/services/audio_service/client/include/audio_manager_base.h +++ b/services/audio_service/client/include/audio_manager_base.h @@ -170,7 +170,7 @@ public: /** * Set audio mono state for accessibility * - * @param audioMono the state of mono for accessibility + * @param audioMono the state of mono audio for accessibility * @return none. */ virtual void SetAudioMonoState(bool audioMono) = 0; @@ -178,7 +178,7 @@ public: /** * Set audio balance value for accessibility * - * @param audioBalance the value of balance for accessibility + * @param audioBalance the value of audio balance for accessibility * @return none. */ virtual void SetAudioBalanceValue(float audioBalance) = 0; diff --git a/services/audio_service/server/include/audio_server.h b/services/audio_service/server/include/audio_server.h index 2bfdaf2eae..5fbe93fd6d 100644 --- a/services/audio_service/server/include/audio_server.h +++ b/services/audio_service/server/include/audio_server.h @@ -24,7 +24,6 @@ #include "iremote_stub.h" #include "system_ability.h" #include "audio_renderer_sink.h" -// #include "bluetooth_renderer_sink.h" #include "remote_audio_renderer_sink.h" #include "i_standard_audio_server_manager_listener.h" #include "audio_manager_base.h" diff --git a/services/audio_service/server/src/audio_manager_stub.cpp b/services/audio_service/server/src/audio_manager_stub.cpp index 418234737e..a173bb9bc5 100644 --- a/services/audio_service/server/src/audio_manager_stub.cpp +++ b/services/audio_service/server/src/audio_manager_stub.cpp @@ -181,14 +181,12 @@ int AudioManagerStub::OnRemoteRequest(uint32_t code, MessageParcel &data, Messag case SET_AUDIO_MONO_STATE: { AUDIO_DEBUG_LOG("SET_AUDIO_MONO_STATE AudioManagerStub"); bool audioMonoState = data.ReadBool(); - AUDIO_DEBUG_LOG("SET_AUDIO_MONO_STATE audioMonoState from client= %{public}d", audioMonoState); SetAudioMonoState(audioMonoState); return AUDIO_OK; } case SET_AUDIO_BALANCE_VALUE: { AUDIO_DEBUG_LOG("SET_AUDIO_BALANCE_VALUE AudioManagerStub"); float audioBalanceValue = data.ReadFloat(); - AUDIO_DEBUG_LOG("SET_AUDIO_BALANCE_VALUE audioBalanceValue from client= %{public}f", audioBalanceValue); SetAudioBalanceValue(audioBalanceValue); return AUDIO_OK; } diff --git a/services/audio_service/server/src/audio_server.cpp b/services/audio_service/server/src/audio_server.cpp index 28d697c956..db03c12ba3 100644 --- a/services/audio_service/server/src/audio_server.cpp +++ b/services/audio_service/server/src/audio_server.cpp @@ -349,8 +349,9 @@ int32_t AudioServer::UpdateActiveDeviceRoute(DeviceType type, DeviceFlag flag) void AudioServer::SetAudioMonoState(bool audioMono) { - AUDIO_INFO_LOG("audioBalance: AudioServer::SetAudioMonoState: %{public}d", audioMono); + AUDIO_INFO_LOG("AudioServer::SetAudioMonoState: audioMono = %{public}s", audioMono? "true": "false"); + // Set mono for audio_renderer_sink(primary sink) AudioRendererSink *audioRendererSinkInstance = AudioRendererSink::GetInstance(); if (!audioRendererSinkInstance->rendererInited_) { AUDIO_WARNING_LOG("Renderer is not initialized."); @@ -358,20 +359,15 @@ void AudioServer::SetAudioMonoState(bool audioMono) audioRendererSinkInstance->SetAudioMonoState(audioMono); } + // Set mono for bluetooth_renderer_sink BluetoothRendererSinkSetAudioMonoState(audioMono); - // AUDIO_INFO_LOG("audioBalance: AudioServer::Bluetooth: SetAudioMonoState: %{public}d", audioMono); - // BluetoothRendererSink *bluetoothRendererSinkInstance = BluetoothRendererSink::GetInstance(); - // if (!bluetoothRendererSinkInstance->rendererInited_) { - // AUDIO_WARNING_LOG("Renderer is not initialized."); - // } else { - // bluetoothRendererSinkInstance->SetAudioMonoState(audioMono); - // } } void AudioServer::SetAudioBalanceValue(float audioBalance) { - AUDIO_INFO_LOG("audioBalance: AudioServer::SetAudioBalanceValue: %{public}f", audioBalance); + AUDIO_INFO_LOG("AudioServer::SetAudioBalanceValue: audioBalance = %{public}f", audioBalance); + // Set balance for audio_renderer_sink(primary sink) AudioRendererSink *audioRendererSinkInstance = AudioRendererSink::GetInstance(); if (!audioRendererSinkInstance->rendererInited_) { AUDIO_WARNING_LOG("Renderer is not initialized."); @@ -379,14 +375,9 @@ void AudioServer::SetAudioBalanceValue(float audioBalance) audioRendererSinkInstance->SetAudioBalanceValue(audioBalance); } + // Set balance for bluetooth_renderer_sink BluetoothRendererSinkSetAudioBalanceValue(audioBalance); - // AUDIO_INFO_LOG("audioBalance: AudioServer::Bluetooth: SetAudioBalanceValue: %{public}f", audioBalance); -// BluetoothRendererSink *bluetoothRendererSinkInstance = BluetoothRendererSink::GetInstance(); -// if (!bluetoothRendererSinkInstance->rendererInited_) { -// AUDIO_WARNING_LOG("Renderer is not initialized."); -// } else { -// bluetoothRendererSinkInstance->SetAudioBalanceValue(audioBalance); -// } + } void AudioServer::NotifyDeviceInfo(std::string networkId, bool connected) -- Gitee From b61b11d0cd6aff64d9d09fd5776654e7d38c67fd Mon Sep 17 00:00:00 2001 From: songshenke Date: Sat, 8 Oct 2022 11:17:50 +0800 Subject: [PATCH 08/12] Subscribe accessibilityConfigObserver in AudioPolicyServer::OnAddSystemAbility Signed-off-by: songshenke Change-Id: Ic1f38ba1a1da3804705f1571fea5e97d237d8bcf --- .../bluetooth/bluetooth_renderer_sink.cpp | 46 +++++++++++-------- .../sink/bluetooth/bluetooth_renderer_sink.h | 10 ++-- .../sink/primary/audio_renderer_sink.cpp | 28 +++++------ .../sink/primary/audio_renderer_sink.h | 10 ++-- .../server/include/audio_policy_server.h | 1 + .../include/service/audio_policy_service.h | 2 + .../iaudio_accessibility_config_observer.h | 2 +- .../listener/accessibility_config_listener.h | 2 +- .../server/src/audio_policy_server.cpp | 11 +++++ .../src/service/audio_policy_service.cpp | 7 ++- .../accessibility_config_listener.cpp | 2 +- .../audio_service/server/src/audio_server.cpp | 1 - 12 files changed, 74 insertions(+), 48 deletions(-) diff --git a/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink.cpp b/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink.cpp index d26fd2a105..2df01ea0ef 100644 --- a/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink.cpp +++ b/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink.cpp @@ -294,11 +294,11 @@ int32_t BluetoothRendererSink::RenderFrame(char &data, uint64_t len, uint64_t &w return ERR_INVALID_HANDLE; } - if (audioMonoState) { + if (audioMonoState_) { AdjustStereoToMono(&data, len); } - if (audioBalanceState) { + if (audioBalanceState_) { AdjustAudioBalance(&data, len); } @@ -561,38 +561,38 @@ int32_t BluetoothRendererSink::Flush(void) bool BluetoothRendererSink::GetAudioMonoState() { - return audioMonoState; + return audioMonoState_; } float BluetoothRendererSink::GetAudioBalanceValue() { - return audioBalanceValue; + return audioBalanceValue_; } void BluetoothRendererSink::SetAudioMonoState(bool audioMono) { - audioMonoState = audioMono; + audioMonoState_ = audioMono; } void BluetoothRendererSink::SetAudioBalanceValue(float audioBalance) { // reset the balance coefficient value firstly - audioBalanceValue = 0.0f; - leftBalanceCoef = 1.0f; - rightBalanceCoef = 1.0f; + audioBalanceValue_ = 0.0f; + leftBalanceCoef_ = 1.0f; + rightBalanceCoef_ = 1.0f; if (std::abs(audioBalance) <= std::numeric_limits::epsilon()) { // audioBalance is equal to 0.0f - audioBalanceState = false; + audioBalanceState_ = false; } else { // audioBalance is not equal to 0.0f - audioBalanceState = true; - audioBalanceValue = audioBalance; + audioBalanceState_ = true; + audioBalanceValue_ = audioBalance; // calculate the balance coefficient if (audioBalance > 0.0f) { - leftBalanceCoef -= audioBalance; + leftBalanceCoef_ -= audioBalance; } else if (audioBalance < 0.0f) { - rightBalanceCoef += audioBalance; + rightBalanceCoef_ += audioBalance; } } } @@ -640,20 +640,20 @@ void BluetoothRendererSink::AdjustAudioBalance(char *data, uint64_t len) switch (attr_.format) { case AUDIO_FORMAT_PCM_8_BIT: { // this function needs to be further tested for usability - AdjustAudioBalanceForPCM8Bit((int8_t*)data, len, leftBalanceCoef, rightBalanceCoef); + AdjustAudioBalanceForPCM8Bit((int8_t*)data, len, leftBalanceCoef_, rightBalanceCoef_); break; } case AUDIO_FORMAT_PCM_16_BIT: { - AdjustAudioBalanceForPCM16Bit((int16_t*)data, len, leftBalanceCoef, rightBalanceCoef); + AdjustAudioBalanceForPCM16Bit((int16_t*)data, len, leftBalanceCoef_, rightBalanceCoef_); break; } case AUDIO_FORMAT_PCM_24_BIT: { // this function needs to be further tested for usability - AdjustAudioBalanceForPCM24Bit((int8_t*)data, len, leftBalanceCoef, rightBalanceCoef); + AdjustAudioBalanceForPCM24Bit((int8_t*)data, len, leftBalanceCoef_, rightBalanceCoef_); break; } case AUDIO_FORMAT_PCM_32_BIT: { - AdjustAudioBalanceForPCM32Bit((int32_t*)data, len, leftBalanceCoef, rightBalanceCoef); + AdjustAudioBalanceForPCM32Bit((int32_t*)data, len, leftBalanceCoef_, rightBalanceCoef_); break; } default: { @@ -820,12 +820,20 @@ int32_t BluetoothRendererSinkGetTransactionId(uint64_t *transactionId) void BluetoothRendererSinkSetAudioMonoState(bool audioMonoState) { - g_bluetoothRendrSinkInstance->SetAudioMonoState(audioMonoState); + if (g_bluetoothRendrSinkInstance == nullptr) { + AUDIO_ERR_LOG("BluetoothRendererSinkSetAudioMonoState failed, g_bluetoothRendrSinkInstance is null"); + } else { + g_bluetoothRendrSinkInstance->SetAudioMonoState(audioMonoState); + } } void BluetoothRendererSinkSetAudioBalanceValue(float audioBalance) { - g_bluetoothRendrSinkInstance->SetAudioBalanceValue(audioBalance); + if (g_bluetoothRendrSinkInstance == nullptr) { + AUDIO_ERR_LOG("BluetoothRendererSinkSetAudioBalanceValue failed, g_bluetoothRendrSinkInstance is null"); + } else { + g_bluetoothRendrSinkInstance->SetAudioBalanceValue(audioBalance); + } } #ifdef __cplusplus } diff --git a/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink.h b/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink.h index bb42dd2721..74eb9b086a 100644 --- a/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink.h +++ b/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink.h @@ -68,11 +68,11 @@ private: struct HDI::Audio_Bluetooth::AudioRender *audioRender_; struct HDI::Audio_Bluetooth::AudioPort audioPort = {}; void *handle_; - bool audioMonoState = false; - bool audioBalanceState = false; - float audioBalanceValue = 0.0f; - float leftBalanceCoef = 1.0f; - float rightBalanceCoef = 1.0f; + bool audioMonoState_ = false; + bool audioBalanceState_ = false; + float audioBalanceValue_ = 0.0f; + float leftBalanceCoef_ = 1.0f; + float rightBalanceCoef_ = 1.0f; std::shared_ptr mKeepRunningLock; diff --git a/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.cpp b/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.cpp index 5e2b2d29c1..d35a7d9910 100644 --- a/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.cpp +++ b/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.cpp @@ -100,26 +100,26 @@ std::string AudioRendererSink::GetAudioParameter(const AudioParamKey key, const void AudioRendererSink::SetAudioMonoState(bool audioMono) { - audioMonoState = audioMono; + audioMonoState_ = audioMono; } void AudioRendererSink::SetAudioBalanceValue(float audioBalance) { // reset the balance coefficient value firstly - leftBalanceCoef = 1.0f; - rightBalanceCoef = 1.0f; + leftBalanceCoef_ = 1.0f; + rightBalanceCoef_ = 1.0f; if (std::abs(audioBalance - 0.0f) <= std::numeric_limits::epsilon()) { // audioBalance is equal to 0.0f - audioBalanceState = false; + audioBalanceState_ = false; } else { // audioBalance is not equal to 0.0f - audioBalanceState = true; + audioBalanceState_ = true; // calculate the balance coefficient if (audioBalance > 0.0f) { - leftBalanceCoef -= audioBalance; + leftBalanceCoef_ -= audioBalance; } else if (audioBalance < 0.0f) { - rightBalanceCoef += audioBalance; + rightBalanceCoef_ += audioBalance; } } } @@ -128,6 +128,7 @@ void AudioRendererSink::AdjustStereoToMono(char *data, uint64_t len) { if (attr_.channel != 2) { // only stereo is surpported now (channel numbers is 2) + AUDIO_ERR_LOG("AudioRendererSink::AdjustStereoToMono: Unsupported channel"); return; } @@ -162,26 +163,27 @@ void AudioRendererSink::AdjustAudioBalance(char *data, uint64_t len) { if (attr_.channel != 2) { // only stereo is surpported now (channel numbers is 2) + AUDIO_ERR_LOG("AudioRendererSink::AdjustAudioBalance: Unsupported channel"); return; } switch (attr_.format) { case AUDIO_FORMAT_PCM_8_BIT: { // this function needs to be further tested for usability - AdjustAudioBalanceForPCM8Bit((int8_t*)data, len, leftBalanceCoef, rightBalanceCoef); + AdjustAudioBalanceForPCM8Bit((int8_t*)data, len, leftBalanceCoef_, rightBalanceCoef_); break; } case AUDIO_FORMAT_PCM_16_BIT: { - AdjustAudioBalanceForPCM16Bit((int16_t*)data, len, leftBalanceCoef, rightBalanceCoef); + AdjustAudioBalanceForPCM16Bit((int16_t*)data, len, leftBalanceCoef_, rightBalanceCoef_); break; } case AUDIO_FORMAT_PCM_24_BIT: { // this function needs to be further tested for usability - AdjustAudioBalanceForPCM24Bit((int8_t*)data, len, leftBalanceCoef, rightBalanceCoef); + AdjustAudioBalanceForPCM24Bit((int8_t*)data, len, leftBalanceCoef_, rightBalanceCoef_); break; } case AUDIO_FORMAT_PCM_32_BIT: { - AdjustAudioBalanceForPCM32Bit((int32_t*)data, len, leftBalanceCoef, rightBalanceCoef); + AdjustAudioBalanceForPCM32Bit((int32_t*)data, len, leftBalanceCoef_, rightBalanceCoef_); break; } default: { @@ -390,11 +392,11 @@ int32_t AudioRendererSink::RenderFrame(char &data, uint64_t len, uint64_t &write return ERR_INVALID_HANDLE; } - if (audioMonoState) { + if (audioMonoState_) { AdjustStereoToMono(&data, len); } - if (audioBalanceState) { + if (audioBalanceState_) { AdjustAudioBalance(&data, len); } diff --git a/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.h b/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.h index 853f34a2a9..4f644e768e 100644 --- a/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.h +++ b/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.h @@ -57,11 +57,11 @@ public: int32_t SetOutputRoute(DeviceType deviceType, AudioPortPin &outputPortPin); int32_t SetOutputRoute(DeviceType deviceType); static AudioRendererSink *GetInstance(void); - bool rendererInited_; void SetAudioParameter(const AudioParamKey key, const std::string& condition, const std::string& value); std::string GetAudioParameter(const AudioParamKey key, const std::string& condition); void SetAudioMonoState(bool audioMono); void SetAudioBalanceValue(float audioBalance); + bool rendererInited_; private: AudioRendererSink(); @@ -78,10 +78,10 @@ private: struct AudioAdapter *audioAdapter_; struct AudioRender *audioRender_; struct AudioPort audioPort_ = {}; - bool audioMonoState = false; - bool audioBalanceState = false; - float leftBalanceCoef = 1.0f; - float rightBalanceCoef = 1.0f; + bool audioMonoState_ = false; + bool audioBalanceState_ = false; + float leftBalanceCoef_ = 1.0f; + float rightBalanceCoef_ = 1.0f; std::shared_ptr mKeepRunningLock; diff --git a/services/audio_policy/server/include/audio_policy_server.h b/services/audio_policy/server/include/audio_policy_server.h index 967a45ec7f..dbf4f9fcbe 100644 --- a/services/audio_policy/server/include/audio_policy_server.h +++ b/services/audio_policy/server/include/audio_policy_server.h @@ -209,6 +209,7 @@ private: void InitKVStore(); void ConnectServiceAdapter(); void RegisterBluetoothListener(); + void SubscribeAccessibilityConfigObserver(); static float MapVolumeToHDI(int32_t volume); static int32_t ConvertVolumeToInt(float volume); 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 1f2724665b..ee4f32d627 100644 --- a/services/audio_policy/server/include/service/audio_policy_service.h +++ b/services/audio_policy/server/include/service/audio_policy_service.h @@ -178,6 +178,8 @@ public: void UnregisterBluetoothListener(); + void SubscribeAccessibilityConfigObserver(); + private: AudioPolicyService() : audioPolicyManager_(AudioPolicyManagerFactory::GetAudioPolicyManager()), diff --git a/services/audio_policy/server/include/service/interface/iaudio_accessibility_config_observer.h b/services/audio_policy/server/include/service/interface/iaudio_accessibility_config_observer.h index 51e7e05c74..b35d90c4bc 100755 --- a/services/audio_policy/server/include/service/interface/iaudio_accessibility_config_observer.h +++ b/services/audio_policy/server/include/service/interface/iaudio_accessibility_config_observer.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/services/audio_policy/server/include/service/listener/accessibility_config_listener.h b/services/audio_policy/server/include/service/listener/accessibility_config_listener.h index 257037e8e6..23a7552c22 100755 --- a/services/audio_policy/server/include/service/listener/accessibility_config_listener.h +++ b/services/audio_policy/server/include/service/listener/accessibility_config_listener.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/services/audio_policy/server/src/audio_policy_server.cpp b/services/audio_policy/server/src/audio_policy_server.cpp index 39162d1626..54b6822b1d 100644 --- a/services/audio_policy/server/src/audio_policy_server.cpp +++ b/services/audio_policy/server/src/audio_policy_server.cpp @@ -79,6 +79,7 @@ void AudioPolicyServer::OnStart() AddSystemAbilityListener(MULTIMODAL_INPUT_SERVICE_ID); AddSystemAbilityListener(AUDIO_DISTRIBUTED_SERVICE_ID); AddSystemAbilityListener(BLUETOOTH_HOST_SYS_ABILITY_ID); + AddSystemAbilityListener(ACCESSIBILITY_MANAGER_SERVICE_ID); mPolicyService.Init(); RegisterAudioServerDeathRecipient(); @@ -112,6 +113,10 @@ void AudioPolicyServer::OnAddSystemAbility(int32_t systemAbilityId, const std::s AUDIO_INFO_LOG("OnAddSystemAbility bluetooth service start"); RegisterBluetoothListener(); break; + case ACCESSIBILITY_MANAGER_SERVICE_ID: + AUDIO_INFO_LOG("OnAddSystemAbility accessibility service start"); + SubscribeAccessibilityConfigObserver(); + break; default: AUDIO_ERR_LOG("OnAddSystemAbility unhandled sysabilityId:%{public}d", systemAbilityId); break; @@ -1549,6 +1554,12 @@ void AudioPolicyServer::RegisterBluetoothListener() mPolicyService.RegisterBluetoothListener(); } +void AudioPolicyServer::SubscribeAccessibilityConfigObserver() +{ + AUDIO_INFO_LOG("AudioPolicyServer::SubscribeAccessibilityConfigObserver"); + mPolicyService.SubscribeAccessibilityConfigObserver(); +} + bool AudioPolicyServer::IsAudioRendererLowLatencySupported(const AudioStreamInfo &audioStreamInfo) { AUDIO_INFO_LOG("IsAudioRendererLowLatencySupported server call"); 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 53b5a52847..a5f2089ce4 100644 --- a/services/audio_policy/server/src/service/audio_policy_service.cpp +++ b/services/audio_policy/server/src/service/audio_policy_service.cpp @@ -75,8 +75,6 @@ bool AudioPolicyService::Init(void) return false; } - accessibilityConfigListener_->SubscribeObserver(); - return true; } @@ -2061,5 +2059,10 @@ void AudioPolicyService::UnregisterBluetoothListener() isBtListenerRegistered = false; #endif } + +void AudioPolicyService::SubscribeAccessibilityConfigObserver() +{ + accessibilityConfigListener_->SubscribeObserver(); +} } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_policy/server/src/service/listener/accessibility_config_listener.cpp b/services/audio_policy/server/src/service/listener/accessibility_config_listener.cpp index 22550895e8..e7e57a10a5 100755 --- a/services/audio_policy/server/src/service/listener/accessibility_config_listener.cpp +++ b/services/audio_policy/server/src/service/listener/accessibility_config_listener.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/services/audio_service/server/src/audio_server.cpp b/services/audio_service/server/src/audio_server.cpp index db03c12ba3..714ff6f55a 100644 --- a/services/audio_service/server/src/audio_server.cpp +++ b/services/audio_service/server/src/audio_server.cpp @@ -377,7 +377,6 @@ void AudioServer::SetAudioBalanceValue(float audioBalance) // Set balance for bluetooth_renderer_sink BluetoothRendererSinkSetAudioBalanceValue(audioBalance); - } void AudioServer::NotifyDeviceInfo(std::string networkId, bool connected) -- Gitee From cb764879f66e2d9c014f18d4ed37d795946e884d Mon Sep 17 00:00:00 2001 From: songshenke Date: Sat, 8 Oct 2022 17:03:44 +0800 Subject: [PATCH 09/12] Solve the code checking and tdd compiling problems Signed-off-by: songshenke Change-Id: I8a93a30c236c27652f1763667b096ffe105108d6 --- .../native/audioutils/src/audio_utils.cpp | 39 ++++++++++++------- .../bluetooth/bluetooth_renderer_sink.cpp | 29 +++++++------- .../sink/primary/audio_renderer_sink.cpp | 25 ++++++------ .../iaudio_accessibility_config_observer.h | 2 +- .../listener/accessibility_config_listener.h | 2 +- .../accessibility_config_listener.cpp | 2 +- test/fuzztest/audiopolicy_fuzzer/BUILD.gn | 1 + 7 files changed, 56 insertions(+), 44 deletions(-) diff --git a/frameworks/native/audioutils/src/audio_utils.cpp b/frameworks/native/audioutils/src/audio_utils.cpp index cd8412017f..8711f7455c 100644 --- a/frameworks/native/audioutils/src/audio_utils.cpp +++ b/frameworks/native/audioutils/src/audio_utils.cpp @@ -22,6 +22,10 @@ #include "audio_log.h" namespace OHOS { namespace AudioStandard { +namespace { +const uint32_t STEREO_CHANNEL_COUNT = 2; +} // namespace + int64_t GetNowTimeMs() { std::chrono::milliseconds nowMs = @@ -32,39 +36,42 @@ int64_t GetNowTimeMs() void AdjustStereoToMonoForPCM8Bit(int8_t *data, uint64_t len) { for (unsigned i = len >> 1; i > 0; i--) { - data[0] = data[0] / 2 + data[1] / 2; + data[0] = data[0] / STEREO_CHANNEL_COUNT + data[1] / STEREO_CHANNEL_COUNT; data[1] = data[0]; - data += 2; + data += STEREO_CHANNEL_COUNT; } } void AdjustStereoToMonoForPCM16Bit(int16_t *data, uint64_t len) { for (unsigned i = len >> 1; i > 0; i--) { - data[0] = data[0] / 2 + data[1] / 2; + data[0] = data[0] / STEREO_CHANNEL_COUNT + data[1] / STEREO_CHANNEL_COUNT; data[1] = data[0]; - data += 2; + data += STEREO_CHANNEL_COUNT; } } -void AdjustStereoToMonoForPCM24Bit(int8_t *data, uint64_t len){ +void AdjustStereoToMonoForPCM24Bit(int8_t *data, uint64_t len) +{ + // int8_t is used for reading data of PCM24BIT here. + // 24 / 8 = 3, so we need repeat the calculation three times. for (unsigned i = len >> 1; i > 0; i--) { - data[0] = data[0] / 2 + data[3] / 2; + data[0] = data[0] / STEREO_CHANNEL_COUNT + data[3] / STEREO_CHANNEL_COUNT; data[3] = data[0]; - data[1] = data[1] / 2 + data[4] / 2; + data[1] = data[1] / STEREO_CHANNEL_COUNT + data[4] / STEREO_CHANNEL_COUNT; data[4] = data[1]; - data[2] = data[2] / 2 + data[5] / 2; + data[2] = data[2] / STEREO_CHANNEL_COUNT + data[5] / STEREO_CHANNEL_COUNT; data[5] = data[2]; - data += 6; + data += (STEREO_CHANNEL_COUNT * 3); } } void AdjustStereoToMonoForPCM32Bit(int32_t *data, uint64_t len) { for (unsigned i = len >> 1; i > 0; i--) { - data[0] = data[0] / 2 + data[1] / 2; + data[0] = data[0] / STEREO_CHANNEL_COUNT + data[1] / STEREO_CHANNEL_COUNT; data[1] = data[0]; - data += 2; + data += STEREO_CHANNEL_COUNT; } } @@ -73,7 +80,7 @@ void AdjustAudioBalanceForPCM8Bit(int8_t *data, uint64_t len, float left, float for (unsigned i = len >> 1; i > 0; i--) { data[0] *= left; data[1] *= right; - data += 2; + data += STEREO_CHANNEL_COUNT; } } @@ -82,20 +89,22 @@ void AdjustAudioBalanceForPCM16Bit(int16_t *data, uint64_t len, float left, floa for (unsigned i = len >> 1; i > 0; i--) { data[0] *= left; data[1] *= right; - data += 2; + data += STEREO_CHANNEL_COUNT; } } void AdjustAudioBalanceForPCM24Bit(int8_t *data, uint64_t len, float left, float right) { for (unsigned i = len >> 1; i > 0; i--) { + // int8_t is used for reading data of PCM24BIT here. + // 24 / 8 = 3, so we need repeat the calculation three times. data[0] *= left; data[1] *= left; data[2] *= left; data[3] *= right; data[4] *= right; data[5] *= right; - data += 6; + data += (STEREO_CHANNEL_COUNT * 3); } } @@ -104,7 +113,7 @@ void AdjustAudioBalanceForPCM32Bit(int32_t *data, uint64_t len, float left, floa for (unsigned i = len >> 1; i > 0; i--) { data[0] *= left; data[1] *= right; - data += 2; + data += STEREO_CHANNEL_COUNT; } } diff --git a/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink.cpp b/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink.cpp index 2df01ea0ef..857152ac19 100644 --- a/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink.cpp +++ b/frameworks/native/hdiadapter/sink/bluetooth/bluetooth_renderer_sink.cpp @@ -45,6 +45,7 @@ const uint32_t PCM_8_BIT = 8; const uint32_t PCM_16_BIT = 16; const uint32_t PCM_24_BIT = 24; const uint32_t PCM_32_BIT = 32; +const uint32_t STEREO_CHANNEL_COUNT = 2; } #ifdef BT_DUMPFILE @@ -599,27 +600,27 @@ void BluetoothRendererSink::SetAudioBalanceValue(float audioBalance) void BluetoothRendererSink::AdjustStereoToMono(char *data, uint64_t len) { - if (attr_.channel != 2) { - // only stereo is surpported now (channel numbers is 2) + if (attr_.channel != STEREO_CHANNEL_COUNT) { + // only stereo is surpported now (stereo channel count is 2) return; } switch (attr_.format) { case AUDIO_FORMAT_PCM_8_BIT: { // this function needs to be further tested for usability - AdjustStereoToMonoForPCM8Bit((int8_t*)data, len); + AdjustStereoToMonoForPCM8Bit(reinterpret_cast(data), len); break; } case AUDIO_FORMAT_PCM_16_BIT: { - AdjustStereoToMonoForPCM16Bit((int16_t*)data, len); + AdjustStereoToMonoForPCM16Bit(reinterpret_cast(data), len); break; } case AUDIO_FORMAT_PCM_24_BIT: { // this function needs to be further tested for usability - AdjustStereoToMonoForPCM24Bit((int8_t*)data, len); + AdjustStereoToMonoForPCM24Bit(reinterpret_cast(data), len); break; } case AUDIO_FORMAT_PCM_32_BIT: { - AdjustStereoToMonoForPCM32Bit((int32_t*)data, len); + AdjustStereoToMonoForPCM32Bit(reinterpret_cast(data), len); break; } default: { @@ -632,28 +633,28 @@ void BluetoothRendererSink::AdjustStereoToMono(char *data, uint64_t len) void BluetoothRendererSink::AdjustAudioBalance(char *data, uint64_t len) { - if (attr_.channel != 2) { - // only stereo is surpported now (channel numbers is 2) + if (attr_.channel != STEREO_CHANNEL_COUNT) { + // only stereo is surpported now (stereo channel count is 2) return; } switch (attr_.format) { case AUDIO_FORMAT_PCM_8_BIT: { // this function needs to be further tested for usability - AdjustAudioBalanceForPCM8Bit((int8_t*)data, len, leftBalanceCoef_, rightBalanceCoef_); + AdjustAudioBalanceForPCM8Bit(reinterpret_cast(data), len, leftBalanceCoef_, rightBalanceCoef_); break; } case AUDIO_FORMAT_PCM_16_BIT: { - AdjustAudioBalanceForPCM16Bit((int16_t*)data, len, leftBalanceCoef_, rightBalanceCoef_); + AdjustAudioBalanceForPCM16Bit(reinterpret_cast(data), len, leftBalanceCoef_, rightBalanceCoef_); break; } case AUDIO_FORMAT_PCM_24_BIT: { // this function needs to be further tested for usability - AdjustAudioBalanceForPCM24Bit((int8_t*)data, len, leftBalanceCoef_, rightBalanceCoef_); + AdjustAudioBalanceForPCM24Bit(reinterpret_cast(data), len, leftBalanceCoef_, rightBalanceCoef_); break; } case AUDIO_FORMAT_PCM_32_BIT: { - AdjustAudioBalanceForPCM32Bit((int32_t*)data, len, leftBalanceCoef_, rightBalanceCoef_); + AdjustAudioBalanceForPCM32Bit(reinterpret_cast(data), len, leftBalanceCoef_, rightBalanceCoef_); break; } default: { @@ -760,8 +761,8 @@ int32_t BluetoothRendererRenderFrame(void *wapper, char &data, uint64_t len, uin // if the two mono states are not equal, use the value of g_bluetoothRendrSinkInstance bluetoothRendererSinkWapper->SetAudioMonoState(g_bluetoothRendrSinkInstance->GetAudioMonoState()); } - if (std::abs(bluetoothRendererSinkWapper->GetAudioBalanceValue() - g_bluetoothRendrSinkInstance->GetAudioBalanceValue()) - > std::numeric_limits::epsilon()) { + if (std::abs(bluetoothRendererSinkWapper->GetAudioBalanceValue() - + g_bluetoothRendrSinkInstance->GetAudioBalanceValue()) > std::numeric_limits::epsilon()) { // if the two balance values are not equal, use the value of g_bluetoothRendrSinkInstance bluetoothRendererSinkWapper->SetAudioBalanceValue(g_bluetoothRendrSinkInstance->GetAudioBalanceValue()); } diff --git a/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.cpp b/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.cpp index d35a7d9910..97dbebb45a 100644 --- a/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.cpp +++ b/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.cpp @@ -43,6 +43,7 @@ const uint32_t PCM_24_BIT = 24; const uint32_t PCM_32_BIT = 32; const uint32_t INTERNAL_OUTPUT_STREAM_ID = 0; const uint32_t PARAM_VALUE_LENTH = 10; +const uint32_t STEREO_CHANNEL_COUNT = 2; } #ifdef DUMPFILE // Note: accessing to this directory requires selinux permission @@ -126,8 +127,8 @@ void AudioRendererSink::SetAudioBalanceValue(float audioBalance) void AudioRendererSink::AdjustStereoToMono(char *data, uint64_t len) { - if (attr_.channel != 2) { - // only stereo is surpported now (channel numbers is 2) + if (attr_.channel != STEREO_CHANNEL_COUNT) { + // only stereo is surpported now (stereo channel count is 2) AUDIO_ERR_LOG("AudioRendererSink::AdjustStereoToMono: Unsupported channel"); return; } @@ -135,20 +136,20 @@ void AudioRendererSink::AdjustStereoToMono(char *data, uint64_t len) switch (attr_.format) { case AUDIO_FORMAT_PCM_8_BIT: { // this function needs to be further tested for usability - AdjustStereoToMonoForPCM8Bit((int8_t*)data, len); + AdjustStereoToMonoForPCM8Bit(reinterpret_cast(data), len); break; } case AUDIO_FORMAT_PCM_16_BIT: { - AdjustStereoToMonoForPCM16Bit((int16_t*)data, len); + AdjustStereoToMonoForPCM16Bit(reinterpret_cast(data), len); break; } case AUDIO_FORMAT_PCM_24_BIT: { // this function needs to be further tested for usability - AdjustStereoToMonoForPCM24Bit((int8_t*)data, len); + AdjustStereoToMonoForPCM24Bit(reinterpret_cast(data), len); break; } case AUDIO_FORMAT_PCM_32_BIT: { - AdjustStereoToMonoForPCM32Bit((int32_t*)data, len); + AdjustStereoToMonoForPCM32Bit(reinterpret_cast(data), len); break; } default: { @@ -161,8 +162,8 @@ void AudioRendererSink::AdjustStereoToMono(char *data, uint64_t len) void AudioRendererSink::AdjustAudioBalance(char *data, uint64_t len) { - if (attr_.channel != 2) { - // only stereo is surpported now (channel numbers is 2) + if (attr_.channel != STEREO_CHANNEL_COUNT) { + // only stereo is surpported now (stereo channel count is 2) AUDIO_ERR_LOG("AudioRendererSink::AdjustAudioBalance: Unsupported channel"); return; } @@ -170,20 +171,20 @@ void AudioRendererSink::AdjustAudioBalance(char *data, uint64_t len) switch (attr_.format) { case AUDIO_FORMAT_PCM_8_BIT: { // this function needs to be further tested for usability - AdjustAudioBalanceForPCM8Bit((int8_t*)data, len, leftBalanceCoef_, rightBalanceCoef_); + AdjustAudioBalanceForPCM8Bit(reinterpret_cast(data), len, leftBalanceCoef_, rightBalanceCoef_); break; } case AUDIO_FORMAT_PCM_16_BIT: { - AdjustAudioBalanceForPCM16Bit((int16_t*)data, len, leftBalanceCoef_, rightBalanceCoef_); + AdjustAudioBalanceForPCM16Bit(reinterpret_cast(data), len, leftBalanceCoef_, rightBalanceCoef_); break; } case AUDIO_FORMAT_PCM_24_BIT: { // this function needs to be further tested for usability - AdjustAudioBalanceForPCM24Bit((int8_t*)data, len, leftBalanceCoef_, rightBalanceCoef_); + AdjustAudioBalanceForPCM24Bit(reinterpret_cast(data), len, leftBalanceCoef_, rightBalanceCoef_); break; } case AUDIO_FORMAT_PCM_32_BIT: { - AdjustAudioBalanceForPCM32Bit((int32_t*)data, len, leftBalanceCoef_, rightBalanceCoef_); + AdjustAudioBalanceForPCM32Bit(reinterpret_cast(data), len, leftBalanceCoef_, rightBalanceCoef_); break; } default: { diff --git a/services/audio_policy/server/include/service/interface/iaudio_accessibility_config_observer.h b/services/audio_policy/server/include/service/interface/iaudio_accessibility_config_observer.h index b35d90c4bc..f77f865c1f 100755 --- a/services/audio_policy/server/include/service/interface/iaudio_accessibility_config_observer.h +++ b/services/audio_policy/server/include/service/interface/iaudio_accessibility_config_observer.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2022 Huawei Device Co., Ltd. + * Copyright (c) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/services/audio_policy/server/include/service/listener/accessibility_config_listener.h b/services/audio_policy/server/include/service/listener/accessibility_config_listener.h index 23a7552c22..7876fe91ec 100755 --- a/services/audio_policy/server/include/service/listener/accessibility_config_listener.h +++ b/services/audio_policy/server/include/service/listener/accessibility_config_listener.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2022 Huawei Device Co., Ltd. + * Copyright (c) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/services/audio_policy/server/src/service/listener/accessibility_config_listener.cpp b/services/audio_policy/server/src/service/listener/accessibility_config_listener.cpp index e7e57a10a5..76b3d243ba 100755 --- a/services/audio_policy/server/src/service/listener/accessibility_config_listener.cpp +++ b/services/audio_policy/server/src/service/listener/accessibility_config_listener.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2022 Huawei Device Co., Ltd. + * Copyright (c) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/test/fuzztest/audiopolicy_fuzzer/BUILD.gn b/test/fuzztest/audiopolicy_fuzzer/BUILD.gn index 60648e7452..1858cc6f6a 100644 --- a/test/fuzztest/audiopolicy_fuzzer/BUILD.gn +++ b/test/fuzztest/audiopolicy_fuzzer/BUILD.gn @@ -34,6 +34,7 @@ ohos_fuzztest("AudioPolicyFuzzTest") { deps = [ "$hdf_uhdf_path/hdi:libhdi", + "//foundation/barrierfree/accessibility/interfaces/innerkits/acfwk:accessibilityconfig", "//foundation/multimedia/audio_framework/services/audio_policy:audio_policy_client", "//foundation/multimedia/audio_framework/services/audio_policy:audio_policy_service", ] -- Gitee From f4114017be4a9c02f9efb9ce0342a46bbe7c1c53 Mon Sep 17 00:00:00 2001 From: songshenke Date: Sat, 8 Oct 2022 17:39:54 +0800 Subject: [PATCH 10/12] TDD and fuzz test Signed-off-by: songshenke Change-Id: I8058cd4f64fb3b53f341f9cbe3b1e603ee448138 --- .../test/unittest/audio_balance_test.cpp | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100755 services/audio_service/test/unittest/audio_balance_test.cpp diff --git a/services/audio_service/test/unittest/audio_balance_test.cpp b/services/audio_service/test/unittest/audio_balance_test.cpp new file mode 100755 index 0000000000..8f9ba3f0e3 --- /dev/null +++ b/services/audio_service/test/unittest/audio_balance_test.cpp @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "audio_errors.h" +#include "audio_info.h" + + +namespace OHOS { +namespace AudioStandard { + +} // namespace AudioStandard +} // namespace OHOS \ No newline at end of file -- Gitee From 0faa25469771f39bc5db75b0c23f3f55cf966aa9 Mon Sep 17 00:00:00 2001 From: songshenke Date: Sun, 9 Oct 2022 14:28:11 +0800 Subject: [PATCH 11/12] Finish mono and balance functions Signed-off-by: songshenke Change-Id: Ib7ef5938611cc90eec04ac1b97a947f06bf3688d --- .../iaudio_accessibility_config_observer.h | 0 .../listener/accessibility_config_listener.h | 0 .../accessibility_config_listener.cpp | 0 .../test/unittest/audio_balance_test.cpp | 24 ------------------- 4 files changed, 24 deletions(-) mode change 100755 => 100644 services/audio_policy/server/include/service/interface/iaudio_accessibility_config_observer.h mode change 100755 => 100644 services/audio_policy/server/include/service/listener/accessibility_config_listener.h mode change 100755 => 100644 services/audio_policy/server/src/service/listener/accessibility_config_listener.cpp delete mode 100755 services/audio_service/test/unittest/audio_balance_test.cpp diff --git a/services/audio_policy/server/include/service/interface/iaudio_accessibility_config_observer.h b/services/audio_policy/server/include/service/interface/iaudio_accessibility_config_observer.h old mode 100755 new mode 100644 diff --git a/services/audio_policy/server/include/service/listener/accessibility_config_listener.h b/services/audio_policy/server/include/service/listener/accessibility_config_listener.h old mode 100755 new mode 100644 diff --git a/services/audio_policy/server/src/service/listener/accessibility_config_listener.cpp b/services/audio_policy/server/src/service/listener/accessibility_config_listener.cpp old mode 100755 new mode 100644 diff --git a/services/audio_service/test/unittest/audio_balance_test.cpp b/services/audio_service/test/unittest/audio_balance_test.cpp deleted file mode 100755 index 8f9ba3f0e3..0000000000 --- a/services/audio_service/test/unittest/audio_balance_test.cpp +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "audio_errors.h" -#include "audio_info.h" - - -namespace OHOS { -namespace AudioStandard { - -} // namespace AudioStandard -} // namespace OHOS \ No newline at end of file -- Gitee From 0dc8b4e6f9611477d17e082c53b27e3700238a8d Mon Sep 17 00:00:00 2001 From: songshenke Date: Sun, 9 Oct 2022 11:02:04 +0000 Subject: [PATCH 12/12] update services/audio_policy/server/src/service/listener/accessibility_config_listener.cpp. Signed-off-by: songshenke --- .../src/service/listener/accessibility_config_listener.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/audio_policy/server/src/service/listener/accessibility_config_listener.cpp b/services/audio_policy/server/src/service/listener/accessibility_config_listener.cpp index 76b3d243ba..690b6baff3 100644 --- a/services/audio_policy/server/src/service/listener/accessibility_config_listener.cpp +++ b/services/audio_policy/server/src/service/listener/accessibility_config_listener.cpp @@ -43,7 +43,7 @@ void AccessibilityConfigListener::OnConfigChanged(const CONFIG_ID configId, cons void AccessibilityConfigListener::SubscribeObserver() { - auto &accessibilityConfig = OHOS::Singleton::GetInstance(); + auto &accessibilityConfig = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance(); (void)accessibilityConfig.InitializeContext(); accessibilityConfig.SubscribeConfigObserver(CONFIG_AUDIO_MONO, shared_from_this()); accessibilityConfig.SubscribeConfigObserver(CONFIG_AUDIO_BALANCE, shared_from_this()); @@ -51,7 +51,7 @@ void AccessibilityConfigListener::SubscribeObserver() void AccessibilityConfigListener::UnsubscribeObserver() { - auto &accessibilityConfig = OHOS::Singleton::GetInstance(); + auto &accessibilityConfig = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance(); (void)accessibilityConfig.InitializeContext(); accessibilityConfig.UnsubscribeConfigObserver(CONFIG_AUDIO_MONO, shared_from_this()); accessibilityConfig.UnsubscribeConfigObserver(CONFIG_AUDIO_BALANCE, shared_from_this()); -- Gitee