diff --git a/interfaces/inner_api/native/audiocommon/include/audio_info.h b/interfaces/inner_api/native/audiocommon/include/audio_info.h index 7f862805212b52002c361683a9fd030d31e096a5..183dc002ab06ff791ff374c12fc5ecbe3475948b 100644 --- a/interfaces/inner_api/native/audiocommon/include/audio_info.h +++ b/interfaces/inner_api/native/audiocommon/include/audio_info.h @@ -35,6 +35,8 @@ constexpr int32_t MIN_SERVICE_COUNT = 2; constexpr int32_t ROOT_UID = 0; constexpr int32_t INVALID_UID = -1; constexpr int32_t NETWORK_ID_SIZE = 80; +constexpr int32_t DEFAULT_VOLUME_GROUP_ID = 1; +constexpr int32_t DEFAULT_VOLUME_INTERRUPT_ID = 1; const std::string MICROPHONE_PERMISSION = "ohos.permission.MICROPHONE"; const std::string MODIFY_AUDIO_SETTINGS_PERMISSION = "ohos.permission.MODIFY_AUDIO_SETTINGS"; diff --git a/interfaces/inner_api/native/audiomanager/include/audio_group_manager.h b/interfaces/inner_api/native/audiomanager/include/audio_group_manager.h index 9349feddb5a0c961474ebcb064f56f8de7017dda..9194bb376398e6c889f55dfe1d2256660081e845 100755 --- a/interfaces/inner_api/native/audiomanager/include/audio_group_manager.h +++ b/interfaces/inner_api/native/audiomanager/include/audio_group_manager.h @@ -27,6 +27,29 @@ namespace OHOS { namespace AudioStandard { +class AudioRingerModeCallback { +public: + virtual ~AudioRingerModeCallback() = default; + /** + * Called when ringer mode is updated. + * + * @param ringerMode Indicates the updated ringer mode value. + * For details, refer RingerMode enum in audio_info.h + */ + virtual void OnRingerModeUpdated(const AudioRingerMode &ringerMode) = 0; +}; + +class AudioManagerMicStateChangeCallback { +public: + virtual ~AudioManagerMicStateChangeCallback() = default; + /** + * Called when the microphone state changes + * + * @param micStateChangeEvent Microphone Status Information. + */ + virtual void OnMicStateUpdated(const MicStateChangeEvent &micStateChangeEvent) = 0; +}; + class AudioGroupManager { public: const std::vector GET_STREAM_ALL_VOLUME_TYPES { @@ -48,10 +71,19 @@ public: int32_t Init(); bool IsAlived(); int32_t GetGroupId(); + int32_t SetRingerModeCallback(const int32_t clientId, + const std::shared_ptr &callback); + int32_t UnsetRingerModeCallback(const int32_t clientId) const; + int32_t SetRingerMode(AudioRingerMode ringMode) const; + AudioRingerMode GetRingerMode() const; + int32_t SetMicrophoneMute(bool isMute); + bool IsMicrophoneMute(void); + int32_t SetMicStateChangeCallback(const std::shared_ptr &callback); private: int32_t groupId_; ConnectType connectType_ = CONNECT_TYPE_LOCAL; std::string netWorkId_ = LOCAL_NETWORK_ID; + int32_t cbClientId_ = -1; static constexpr int32_t MAX_VOLUME_LEVEL = 15; static constexpr int32_t MIN_VOLUME_LEVEL = 0; static constexpr int32_t CONST_FACTOR = 100; diff --git a/interfaces/inner_api/native/audiomanager/include/audio_routing_manager.h b/interfaces/inner_api/native/audiomanager/include/audio_routing_manager.h index 1825fded8630d7d3a3e39a7246590b79bee90fb4..3c166bfb8e89401a05aaeff23bf2cf3416352430 100644 --- a/interfaces/inner_api/native/audiomanager/include/audio_routing_manager.h +++ b/interfaces/inner_api/native/audiomanager/include/audio_routing_manager.h @@ -19,19 +19,10 @@ #include #include "audio_info.h" +#include "audio_group_manager.h" namespace OHOS { namespace AudioStandard { -class AudioManagerMicStateChangeCallback { -public: - virtual ~AudioManagerMicStateChangeCallback() = default; - /** - * Called when the microphone state changes - * - * @param micStateChangeEvent Microphone Status Information. - */ - virtual void OnMicStateUpdated(const MicStateChangeEvent &micStateChangeEvent) = 0; -}; class AudioRoutingManager { public: diff --git a/interfaces/inner_api/native/audiomanager/include/audio_system_manager.h b/interfaces/inner_api/native/audiomanager/include/audio_system_manager.h index bb89b4face3b6fea3bd784ae759e5970adbde67d..52b5ad0c857d0c340a0835d6046c274421620841 100644 --- a/interfaces/inner_api/native/audiomanager/include/audio_system_manager.h +++ b/interfaces/inner_api/native/audiomanager/include/audio_system_manager.h @@ -188,18 +188,6 @@ public: const std::string& condition, const std::string& value) = 0; }; -class AudioRingerModeCallback { -public: - virtual ~AudioRingerModeCallback() = default; - /** - * Called when ringer mode is updated. - * - * @param ringerMode Indicates the updated ringer mode value. - * For details, refer RingerMode enum in audio_info.h - */ - virtual void OnRingerModeUpdated(const AudioRingerMode &ringerMode) = 0; -}; - /** * @brief The AudioSystemManager class is an abstract definition of audio manager. * Provides a series of client/interfaces for audio management @@ -245,8 +233,8 @@ public: DeviceType GetActiveOutputDevice(); DeviceType GetActiveInputDevice(); bool IsStreamActive(AudioVolumeType volumeType) const; - int32_t SetRingerMode(AudioRingerMode ringMode) const; - AudioRingerMode GetRingerMode() const; + int32_t SetRingerMode(AudioRingerMode ringMode); + AudioRingerMode GetRingerMode(); int32_t SetAudioScene(const AudioScene &scene); AudioScene GetAudioScene() const; int32_t SetDeviceChangeCallback(const DeviceFlag flag, const std::shared_ptr diff --git a/services/audio_service/client/src/audio_group_manager.cpp b/services/audio_service/client/src/audio_group_manager.cpp index 0240625fe00dba8601bf702b46377711da7b4fc6..d84e97994f5d29e2da5ffd1a5cad2fcf5d600f6c 100755 --- a/services/audio_service/client/src/audio_group_manager.cpp +++ b/services/audio_service/client/src/audio_group_manager.cpp @@ -31,6 +31,9 @@ AudioGroupManager::AudioGroupManager(int32_t groupId) : groupId_(groupId) AudioGroupManager::~AudioGroupManager() { AUDIO_DEBUG_LOG("AudioGroupManager start"); + if (cbClientId_ != -1) { + UnsetRingerModeCallback(cbClientId_); + } } float AudioGroupManager::MapVolumeToHDI(int32_t volume) @@ -308,5 +311,75 @@ int32_t AudioGroupManager::GetGroupId() { return groupId_; } + +int32_t AudioGroupManager::SetRingerModeCallback(const int32_t clientId, + const std::shared_ptr &callback) +{ + if (callback == nullptr) { + AUDIO_ERR_LOG("AudioSystemManager: callback is nullptr"); + return ERR_INVALID_PARAM; + } + + cbClientId_ = clientId; + + return AudioPolicyManager::GetInstance().SetRingerModeCallback(clientId, callback); +} + +int32_t AudioGroupManager::UnsetRingerModeCallback(const int32_t clientId) const +{ + return AudioPolicyManager::GetInstance().UnsetRingerModeCallback(clientId); +} + +int32_t AudioGroupManager::SetRingerMode(AudioRingerMode ringMode) const +{ + if (netWorkId_ != LOCAL_NETWORK_ID) { + AUDIO_ERR_LOG("AudioGroupManager::SetRingerMode is not supported for local device."); + return ERROR; + } + /* Call Audio Policy SetRingerMode */ + return AudioPolicyManager::GetInstance().SetRingerMode(ringMode); +} + +AudioRingerMode AudioGroupManager::GetRingerMode() const +{ + /* Call Audio Policy GetRingerMode */ + if (netWorkId_ != LOCAL_NETWORK_ID) { + AUDIO_ERR_LOG("AudioGroupManager::SetRingerMode is not supported for local device."); + return AudioRingerMode::RINGER_MODE_NORMAL; + } + return (AudioPolicyManager::GetInstance().GetRingerMode()); +} + +int32_t AudioGroupManager::SetMicrophoneMute(bool isMute) +{ + /* Call Audio Policy GetRingerMode */ + if (netWorkId_ != LOCAL_NETWORK_ID) { + AUDIO_ERR_LOG("AudioGroupManager::SetRingerMode is not supported for local device."); + return ERROR; + } + return AudioPolicyManager::GetInstance().SetMicrophoneMute(isMute); +} + +bool AudioGroupManager::IsMicrophoneMute() +{ + /* Call Audio Policy GetRingerMode */ + if (netWorkId_ != LOCAL_NETWORK_ID) { + AUDIO_ERR_LOG("AudioGroupManager::SetRingerMode is not supported for local device."); + return false; + } + return AudioPolicyManager::GetInstance().IsMicrophoneMute(); +} + +int32_t AudioGroupManager::SetMicStateChangeCallback( + const std::shared_ptr &callback) +{ + AUDIO_INFO_LOG("Entered AudioRoutingManager::%{public}s", __func__); + if (callback == nullptr) { + AUDIO_ERR_LOG("setMicrophoneMuteCallback::callback is null"); + return ERR_INVALID_PARAM; + } + int32_t clientId = static_cast(getpid()); + return AudioPolicyManager::GetInstance().SetMicStateChangeCallback(clientId, callback); +} } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_service/client/src/audio_routing_manager.cpp b/services/audio_service/client/src/audio_routing_manager.cpp index 38c7c5424ead3289ebc593f136ae37943b26f93b..69e062021837e99505ae9424ebb139d6243bc38a 100644 --- a/services/audio_service/client/src/audio_routing_manager.cpp +++ b/services/audio_service/client/src/audio_routing_manager.cpp @@ -35,13 +35,13 @@ uint32_t AudioRoutingManager::GetCallingPid() int32_t AudioRoutingManager::SetMicStateChangeCallback( const std::shared_ptr &callback) { - AUDIO_INFO_LOG("Entered AudioRoutingManager::%{public}s", __func__); - if (callback == nullptr) { - AUDIO_ERR_LOG("setMicrophoneMuteCallback::callback is null"); + AudioSystemManager* audioSystemManager = AudioSystemManager::GetInstance(); + std::shared_ptr groupManager = audioSystemManager->GetGroupManager(DEFAULT_VOLUME_GROUP_ID); + if (groupManager == nullptr) { + AUDIO_ERR_LOG("setMicrophoneMuteCallback falied, groupManager is null"); return ERR_INVALID_PARAM; } - int32_t clientId = static_cast(GetCallingPid()); - return AudioPolicyManager::GetInstance().SetMicStateChangeCallback(clientId, callback); + return groupManager->SetMicStateChangeCallback(callback); } } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_service/client/src/audio_system_manager.cpp b/services/audio_service/client/src/audio_system_manager.cpp index 65439e78ff0b2d406ce5e78301a6c9df38206d5d..cc36be45e4908440c255dd9430e012eb239520b7 100644 --- a/services/audio_service/client/src/audio_system_manager.cpp +++ b/services/audio_service/client/src/audio_system_manager.cpp @@ -141,16 +141,24 @@ void AudioSystemManager::init() } } -int32_t AudioSystemManager::SetRingerMode(AudioRingerMode ringMode) const +int32_t AudioSystemManager::SetRingerMode(AudioRingerMode ringMode) { - /* Call Audio Policy SetRingerMode */ - return AudioPolicyManager::GetInstance().SetRingerMode(ringMode); + std::shared_ptr groupManager = GetGroupManager(DEFAULT_VOLUME_GROUP_ID); + if (groupManager == nullptr) { + AUDIO_ERR_LOG("SetRingerMode failed, groupManager is null"); + return ERR_INVALID_PARAM; + } + return groupManager->SetRingerMode(ringMode); } -AudioRingerMode AudioSystemManager::GetRingerMode() const +AudioRingerMode AudioSystemManager::GetRingerMode() { - /* Call Audio Policy GetRingerMode */ - return (AudioPolicyManager::GetInstance().GetRingerMode()); + std::shared_ptr groupManager = GetGroupManager(DEFAULT_VOLUME_GROUP_ID); + if (groupManager == nullptr) { + AUDIO_ERR_LOG("GetRingerMode failed, groupManager is null"); + return AudioRingerMode::RINGER_MODE_NORMAL; + } + return groupManager->GetRingerMode(); } int32_t AudioSystemManager::SetAudioScene(const AudioScene &scene) @@ -494,12 +502,22 @@ bool AudioSystemManager::IsAlived() int32_t AudioSystemManager::SetMicrophoneMute(bool isMute) { - return AudioPolicyManager::GetInstance().SetMicrophoneMute(isMute); + std::shared_ptr groupManager = GetGroupManager(DEFAULT_VOLUME_GROUP_ID); + if (groupManager == nullptr) { + AUDIO_ERR_LOG("SetMicrophoneMute failed, groupManager is null"); + return ERR_INVALID_PARAM; + } + return groupManager->SetMicrophoneMute(isMute); } bool AudioSystemManager::IsMicrophoneMute() { - return AudioPolicyManager::GetInstance().IsMicrophoneMute(); + std::shared_ptr groupManager = GetGroupManager(DEFAULT_VOLUME_GROUP_ID); + if (groupManager == nullptr) { + AUDIO_ERR_LOG("IsMicrophoneMute failed, groupManager is null"); + return false; + } + return groupManager->IsMicrophoneMute(); } int32_t AudioSystemManager::SelectOutputDevice(std::vector> audioDeviceDescriptors) const