From 8c7e6dac6f5eb38cef627dab92eac8b38513450c Mon Sep 17 00:00:00 2001 From: Eric Laurent Date: Tue, 21 Apr 2015 17:37:00 -0700 Subject: audio policy: session routes continued. - Clear session routes when client process dies. - Enforce the route only when the requesting session is active. - Fix requested route not working if an output mix change is required (e.g forcing to SPEAKER when the default route is USB or A2DP). - Make sure all sessions sharing the strategy with a rerouted session have the same route (needed for volume control consistency) Change-Id: I0ab347a8fb97e73e2c5965374544c5f4fe509ef1 --- .../managerdefault/AudioPolicyManager.h | 47 ++++++++++++++-------- 1 file changed, 31 insertions(+), 16 deletions(-) (limited to 'services/audiopolicy/managerdefault/AudioPolicyManager.h') diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.h b/services/audiopolicy/managerdefault/AudioPolicyManager.h index b965411..ea16864 100644 --- a/services/audiopolicy/managerdefault/AudioPolicyManager.h +++ b/services/audiopolicy/managerdefault/AudioPolicyManager.h @@ -109,6 +109,7 @@ public: audio_io_handle_t *output, audio_session_t session, audio_stream_type_t *stream, + uid_t uid, uint32_t samplingRate, audio_format_t format, audio_channel_mask_t channelMask, @@ -127,6 +128,7 @@ public: virtual status_t getInputForAttr(const audio_attributes_t *attr, audio_io_handle_t *input, audio_session_t session, + uid_t uid, uint32_t samplingRate, audio_format_t format, audio_channel_mask_t channelMask, @@ -207,7 +209,6 @@ public: struct audio_patch *patches, unsigned int *generation); virtual status_t setAudioPortConfig(const struct audio_port_config *config); - virtual void clearAudioPatches(uid_t uid); virtual status_t acquireSoundTriggerSession(audio_session_t *session, audio_io_handle_t *ioHandle, @@ -226,6 +227,8 @@ public: audio_io_handle_t *handle); virtual status_t stopAudioSource(audio_io_handle_t handle); + virtual void releaseResourcesForUid(uid_t uid); + // Audio policy configuration file parsing (audio_policy.conf) // TODO candidates to be moved to ConfigParsingUtils void defaultAudioPolicyConfig(void); @@ -248,31 +251,36 @@ protected: SessionRoute(audio_session_t session, audio_stream_type_t streamType, audio_source_t source, - sp deviceDescriptor) - : mSession(session), + sp deviceDescriptor, + uid_t uid) + : mUid(uid), + mSession(session), mDeviceDescriptor(deviceDescriptor), mRefCount(0), mActivityCount(0), mChanged(false), mStreamType(streamType), - mSource(source) {} + mSource(source) + {} - audio_session_t mSession; + void log(const char* prefix); - sp mDeviceDescriptor; + bool isActive() { + return (mDeviceDescriptor != 0) && (mChanged || (mActivityCount > 0)); + } - void log(const char* prefix); + uid_t mUid; + audio_session_t mSession; + sp mDeviceDescriptor; // "reference" counting - int mRefCount; // +/- on references - int mActivityCount; // +/- on start/stop - bool mChanged; - + int mRefCount; // +/- on references + int mActivityCount; // +/- on start/stop + bool mChanged; // for outputs - const audio_stream_type_t mStreamType; - + const audio_stream_type_t mStreamType; // for inputs - const audio_source_t mSource; + const audio_source_t mSource; }; class SessionRouteMap: public KeyedVector> { @@ -292,6 +300,7 @@ protected: } bool hasRoute(audio_session_t session); + void removeRoute(audio_session_t session); int incRouteActivity(audio_session_t session); @@ -306,7 +315,8 @@ protected: void addRoute(audio_session_t session, audio_stream_type_t streamType, audio_source_t source, - sp deviceDescriptor); + sp deviceDescriptor, + uid_t uid); private: // Used to mark a SessionRoute as for either inputs (mMapType == kSessionRouteMap_Input) @@ -559,7 +569,12 @@ protected: audio_devices_t device, uint32_t *delayMs); status_t stopSource(sp outputDesc, - audio_stream_type_t stream); + audio_stream_type_t stream, + bool forceDeviceUpdate); + + void clearAudioPatches(uid_t uid); + void clearSessionRoutes(uid_t uid); + void checkStrategyRoute(routing_strategy strategy, audio_io_handle_t ouptutToSkip); uid_t mUidCached; AudioPolicyClientInterface *mpClientInterface; // audio policy client interface -- cgit v1.1