From 296fb13dd9b5e90d6a05cce897c3b1e7914a478a Mon Sep 17 00:00:00 2001 From: Eric Laurent Date: Fri, 1 May 2015 11:38:42 -0700 Subject: Implement audio device callback Add class AudioSystem::AudioDeviceCallback notifying AudioSystem clients upon device selection change on a given input or output thread. Maintain a list of installed callback per I/O handle in AudioSystem and call registered callbacks when an OPEN of CONFIG_CHANGED event is received on IAudioFlingerClient::ioConfigChanged(). Add methods to AudioTrack and AudioRecord to add and remove device change callbacks. Add methods to AudioTrack and AudioRecord to query currently selected device. ioConfigChanged() events now convey the audio patch describing the input or output thread routing. Fix AudioRecord failure to start when invalidation is handled by start(). Change-Id: I9e938adf025fa712337c63b1e02a8c18f2a20d39 --- include/media/AudioSystem.h | 43 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 6 deletions(-) (limited to 'include/media/AudioSystem.h') diff --git a/include/media/AudioSystem.h b/include/media/AudioSystem.h index 0cbcdb1..3241e9c 100644 --- a/include/media/AudioSystem.h +++ b/include/media/AudioSystem.h @@ -332,8 +332,26 @@ public: }; - static status_t addAudioPortCallback(const sp& callBack); - static status_t removeAudioPortCallback(const sp& callBack); + static status_t addAudioPortCallback(const sp& callback); + static status_t removeAudioPortCallback(const sp& callback); + + class AudioDeviceCallback : public RefBase + { + public: + + AudioDeviceCallback() {} + virtual ~AudioDeviceCallback() {} + + virtual void onAudioDeviceUpdate(audio_io_handle_t audioIo, + audio_port_handle_t deviceId) = 0; + }; + + static status_t addAudioDeviceCallback(const sp& callback, + audio_io_handle_t audioIo); + static status_t removeAudioDeviceCallback(const sp& callback, + audio_io_handle_t audioIo); + + static audio_port_handle_t getDeviceIdForIo(audio_io_handle_t audioIo); private: @@ -359,10 +377,20 @@ private: // values for output/input parameters up-to-date in client process virtual void ioConfigChanged(audio_io_config_event event, const sp& ioDesc); + + + status_t addAudioDeviceCallback(const sp& callback, + audio_io_handle_t audioIo); + status_t removeAudioDeviceCallback(const sp& callback, + audio_io_handle_t audioIo); + + audio_port_handle_t getDeviceIdForIo(audio_io_handle_t audioIo); + private: Mutex mLock; - DefaultKeyedVector > mIoDescriptors; - + DefaultKeyedVector > mIoDescriptors; + DefaultKeyedVector > > + mAudioDeviceCallbacks; // cached values for recording getInputBufferSize() queries size_t mInBuffSize; // zero indicates cache is invalid uint32_t mInSamplingRate; @@ -377,8 +405,8 @@ private: AudioPolicyServiceClient() { } - status_t addAudioPortCallback(const sp& callBack); - status_t removeAudioPortCallback(const sp& callBack); + status_t addAudioPortCallback(const sp& callback); + status_t removeAudioPortCallback(const sp& callback); // DeathRecipient virtual void binderDied(const wp& who); @@ -393,6 +421,9 @@ private: Vector > mAudioPortCallbacks; }; + static const sp getAudioFlingerClient(); + static sp getIoDescriptor(audio_io_handle_t ioHandle); + static sp gAudioFlingerClient; static sp gAudioPolicyServiceClient; friend class AudioFlingerClient; -- cgit v1.1