From bb6c9a05840d924b502ce0f1868fca4881ada1ed Mon Sep 17 00:00:00 2001 From: Eric Laurent Date: Thu, 25 Sep 2014 14:11:47 -0700 Subject: audio: fix stream type for accessibility usage Make sure that accessibility prompts are heard when a ringtone is active by forcing stream type to AUDIO_STREAM_RING when phone state is AUDIO_MODE_RINGTONE. Bug: 17558149. Change-Id: Ia3bead8052fca5cbf282c267f7b9b06014fef628 --- include/media/AudioSystem.h | 2 ++ include/media/IAudioPolicyService.h | 2 ++ media/libmedia/AudioSystem.cpp | 9 +++++++++ media/libmedia/AudioTrack.cpp | 9 ++++++++- media/libmedia/IAudioPolicyService.cpp | 20 +++++++++++++++++++- services/audiopolicy/AudioPolicyInterfaceImpl.cpp | 7 +++++++ .../audiopolicy/AudioPolicyInterfaceImplLegacy.cpp | 7 +++++++ services/audiopolicy/AudioPolicyService.cpp | 2 +- services/audiopolicy/AudioPolicyService.h | 3 +++ 9 files changed, 58 insertions(+), 3 deletions(-) diff --git a/include/media/AudioSystem.h b/include/media/AudioSystem.h index dd63a23..f8c0198 100644 --- a/include/media/AudioSystem.h +++ b/include/media/AudioSystem.h @@ -320,6 +320,8 @@ public: audio_devices_t *device); static status_t releaseSoundTriggerSession(audio_session_t session); + static audio_mode_t getPhoneState(); + // ---------------------------------------------------------------------------- class AudioPortCallback : public RefBase diff --git a/include/media/IAudioPolicyService.h b/include/media/IAudioPolicyService.h index c251439..16fe9cf 100644 --- a/include/media/IAudioPolicyService.h +++ b/include/media/IAudioPolicyService.h @@ -142,6 +142,8 @@ public: audio_devices_t *device) = 0; virtual status_t releaseSoundTriggerSession(audio_session_t session) = 0; + + virtual audio_mode_t getPhoneState() = 0; }; diff --git a/media/libmedia/AudioSystem.cpp b/media/libmedia/AudioSystem.cpp index 1742fbe..dda3657 100644 --- a/media/libmedia/AudioSystem.cpp +++ b/media/libmedia/AudioSystem.cpp @@ -939,6 +939,15 @@ status_t AudioSystem::releaseSoundTriggerSession(audio_session_t session) if (aps == 0) return PERMISSION_DENIED; return aps->releaseSoundTriggerSession(session); } + +audio_mode_t AudioSystem::getPhoneState() +{ + const sp& aps = AudioSystem::get_audio_policy_service(); + if (aps == 0) return AUDIO_MODE_INVALID; + return aps->getPhoneState(); +} + + // --------------------------------------------------------------------------- void AudioSystem::AudioPolicyServiceClient::binderDied(const wp& who __unused) diff --git a/media/libmedia/AudioTrack.cpp b/media/libmedia/AudioTrack.cpp index ea7b279..e3beba5 100644 --- a/media/libmedia/AudioTrack.cpp +++ b/media/libmedia/AudioTrack.cpp @@ -2124,9 +2124,16 @@ void AudioTrack::setStreamTypeFromAttributes(audio_attributes_t& aa) { // usage to stream type mapping switch (aa.usage) { + case AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY: + // TODO once AudioPolicyManager fully supports audio_attributes_t, + // remove stream change based on phone state + if (AudioSystem::getPhoneState() == AUDIO_MODE_RINGTONE) { + mStreamType = AUDIO_STREAM_RING; + break; + } + /// FALL THROUGH case AUDIO_USAGE_MEDIA: case AUDIO_USAGE_GAME: - case AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY: case AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE: mStreamType = AUDIO_STREAM_MUSIC; return; diff --git a/media/libmedia/IAudioPolicyService.cpp b/media/libmedia/IAudioPolicyService.cpp index b57f747..256cb3f 100644 --- a/media/libmedia/IAudioPolicyService.cpp +++ b/media/libmedia/IAudioPolicyService.cpp @@ -67,7 +67,8 @@ enum { REGISTER_CLIENT, GET_OUTPUT_FOR_ATTR, ACQUIRE_SOUNDTRIGGER_SESSION, - RELEASE_SOUNDTRIGGER_SESSION + RELEASE_SOUNDTRIGGER_SESSION, + GET_PHONE_STATE }; class BpAudioPolicyService : public BpInterface @@ -607,6 +608,17 @@ public: } return (status_t)reply.readInt32(); } + + virtual audio_mode_t getPhoneState() + { + Parcel data, reply; + data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); + status_t status = remote()->transact(GET_PHONE_STATE, data, &reply); + if (status != NO_ERROR) { + return AUDIO_MODE_INVALID; + } + return (audio_mode_t)reply.readInt32(); + } }; IMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService"); @@ -1057,6 +1069,12 @@ status_t BnAudioPolicyService::onTransact( return NO_ERROR; } break; + case GET_PHONE_STATE: { + CHECK_INTERFACE(IAudioPolicyService, data, reply); + reply->writeInt32((int32_t)getPhoneState()); + return NO_ERROR; + } break; + default: return BBinder::onTransact(code, data, reply, flags); } diff --git a/services/audiopolicy/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/AudioPolicyInterfaceImpl.cpp index 2c51e25..b212ca6 100644 --- a/services/audiopolicy/AudioPolicyInterfaceImpl.cpp +++ b/services/audiopolicy/AudioPolicyInterfaceImpl.cpp @@ -80,9 +80,16 @@ status_t AudioPolicyService::setPhoneState(audio_mode_t state) Mutex::Autolock _l(mLock); mAudioPolicyManager->setPhoneState(state); + mPhoneState = state; return NO_ERROR; } +audio_mode_t AudioPolicyService::getPhoneState() +{ + Mutex::Autolock _l(mLock); + return mPhoneState; +} + status_t AudioPolicyService::setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config) { diff --git a/services/audiopolicy/AudioPolicyInterfaceImplLegacy.cpp b/services/audiopolicy/AudioPolicyInterfaceImplLegacy.cpp index f20c070..1e40bc3 100644 --- a/services/audiopolicy/AudioPolicyInterfaceImplLegacy.cpp +++ b/services/audiopolicy/AudioPolicyInterfaceImplLegacy.cpp @@ -84,9 +84,16 @@ status_t AudioPolicyService::setPhoneState(audio_mode_t state) Mutex::Autolock _l(mLock); mpAudioPolicy->set_phone_state(mpAudioPolicy, state); + mPhoneState = state; return NO_ERROR; } +audio_mode_t AudioPolicyService::getPhoneState() +{ + Mutex::Autolock _l(mLock); + return mPhoneState; +} + status_t AudioPolicyService::setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config) { diff --git a/services/audiopolicy/AudioPolicyService.cpp b/services/audiopolicy/AudioPolicyService.cpp index 50bb8c7..647cda4 100644 --- a/services/audiopolicy/AudioPolicyService.cpp +++ b/services/audiopolicy/AudioPolicyService.cpp @@ -59,7 +59,7 @@ namespace { AudioPolicyService::AudioPolicyService() : BnAudioPolicyService(), mpAudioPolicyDev(NULL), mpAudioPolicy(NULL), - mAudioPolicyManager(NULL), mAudioPolicyClient(NULL) + mAudioPolicyManager(NULL), mAudioPolicyClient(NULL), mPhoneState(AUDIO_MODE_INVALID) { char value[PROPERTY_VALUE_MAX]; const struct hw_module_t *module; diff --git a/services/audiopolicy/AudioPolicyService.h b/services/audiopolicy/AudioPolicyService.h index 0044e7a..2cea40b 100644 --- a/services/audiopolicy/AudioPolicyService.h +++ b/services/audiopolicy/AudioPolicyService.h @@ -174,6 +174,8 @@ public: virtual status_t releaseSoundTriggerSession(audio_session_t session); + virtual audio_mode_t getPhoneState(); + status_t doStopOutput(audio_io_handle_t output, audio_stream_type_t stream, int session = 0); @@ -493,6 +495,7 @@ private: // Manage all effects configured in audio_effects.conf sp mAudioPolicyEffects; + audio_mode_t mPhoneState; }; }; // namespace android -- cgit v1.1