diff options
Diffstat (limited to 'include/media')
-rw-r--r-- | include/media/AudioIoDescriptor.h | 21 | ||||
-rw-r--r-- | include/media/AudioRecord.h | 34 | ||||
-rw-r--r-- | include/media/AudioSystem.h | 43 | ||||
-rw-r--r-- | include/media/AudioTrack.h | 35 |
4 files changed, 125 insertions, 8 deletions
diff --git a/include/media/AudioIoDescriptor.h b/include/media/AudioIoDescriptor.h index 2437901..c94b738 100644 --- a/include/media/AudioIoDescriptor.h +++ b/include/media/AudioIoDescriptor.h @@ -33,12 +33,31 @@ enum audio_io_config_event { class AudioIoDescriptor : public RefBase { public: AudioIoDescriptor() : + mIoHandle(AUDIO_IO_HANDLE_NONE), mSamplingRate(0), mFormat(AUDIO_FORMAT_DEFAULT), mChannelMask(AUDIO_CHANNEL_NONE), - mFrameCount(0), mLatency(0) {} + mFrameCount(0), mLatency(0) + { + memset(&mPatch, 0, sizeof(struct audio_patch)); + } virtual ~AudioIoDescriptor() {} + audio_port_handle_t getDeviceId() { + if (mPatch.num_sources != 0 && mPatch.num_sinks != 0) { + if (mPatch.sources[0].type == AUDIO_PORT_TYPE_MIX) { + // this is an output mix + // FIXME: the API only returns the first device in case of multiple device selection + return mPatch.sinks[0].id; + } else { + // this is an input mix + return mPatch.sources[0].id; + } + } + return AUDIO_PORT_HANDLE_NONE; + } + audio_io_handle_t mIoHandle; + struct audio_patch mPatch; uint32_t mSamplingRate; audio_format_t mFormat; audio_channel_mask_t mChannelMask; diff --git a/include/media/AudioRecord.h b/include/media/AudioRecord.h index b743c11..0403e1a 100644 --- a/include/media/AudioRecord.h +++ b/include/media/AudioRecord.h @@ -390,6 +390,39 @@ public: * TODO Document this method. */ audio_port_handle_t getInputDevice(); + + /* Returns the ID of the audio device actually used by the input to which this AudioRecord + * is attached. + * A value of AUDIO_PORT_HANDLE_NONE indicates the AudioRecord is not attached to any input. + * + * Parameters: + * none. + */ + audio_port_handle_t getRoutedDeviceId(); + + /* Add an AudioDeviceCallback. The caller will be notified when the audio device + * to which this AudioRecord is routed is updated. + * Replaces any previously installed callback. + * Parameters: + * callback: The callback interface + * Returns NO_ERROR if successful. + * INVALID_OPERATION if the same callback is already installed. + * NO_INIT or PREMISSION_DENIED if AudioFlinger service is not reachable + * BAD_VALUE if the callback is NULL + */ + status_t addAudioDeviceCallback( + const sp<AudioSystem::AudioDeviceCallback>& callback); + + /* remove an AudioDeviceCallback. + * Parameters: + * callback: The callback interface + * Returns NO_ERROR if successful. + * INVALID_OPERATION if the callback is not installed + * BAD_VALUE if the callback is NULL + */ + status_t removeAudioDeviceCallback( + const sp<AudioSystem::AudioDeviceCallback>& callback); + private: /* If nonContig is non-NULL, it is an output parameter that will be set to the number of * additional non-contiguous frames that are predicted to be available immediately, @@ -582,6 +615,7 @@ private: // For Device Selection API // a value of AUDIO_PORT_HANDLE_NONE indicated default (AudioPolicyManager) routing. audio_port_handle_t mSelectedDeviceId; + sp<AudioSystem::AudioDeviceCallback> mDeviceCallback; }; }; // namespace android 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<AudioPortCallback>& callBack); - static status_t removeAudioPortCallback(const sp<AudioPortCallback>& callBack); + static status_t addAudioPortCallback(const sp<AudioPortCallback>& callback); + static status_t removeAudioPortCallback(const sp<AudioPortCallback>& 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<AudioDeviceCallback>& callback, + audio_io_handle_t audioIo); + static status_t removeAudioDeviceCallback(const sp<AudioDeviceCallback>& 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<AudioIoDescriptor>& ioDesc); + + + status_t addAudioDeviceCallback(const sp<AudioDeviceCallback>& callback, + audio_io_handle_t audioIo); + status_t removeAudioDeviceCallback(const sp<AudioDeviceCallback>& callback, + audio_io_handle_t audioIo); + + audio_port_handle_t getDeviceIdForIo(audio_io_handle_t audioIo); + private: Mutex mLock; - DefaultKeyedVector<audio_io_handle_t, sp<AudioIoDescriptor> > mIoDescriptors; - + DefaultKeyedVector<audio_io_handle_t, sp<AudioIoDescriptor> > mIoDescriptors; + DefaultKeyedVector<audio_io_handle_t, Vector < sp<AudioDeviceCallback> > > + 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<AudioPortCallback>& callBack); - status_t removeAudioPortCallback(const sp<AudioPortCallback>& callBack); + status_t addAudioPortCallback(const sp<AudioPortCallback>& callback); + status_t removeAudioPortCallback(const sp<AudioPortCallback>& callback); // DeathRecipient virtual void binderDied(const wp<IBinder>& who); @@ -393,6 +421,9 @@ private: Vector <sp <AudioPortCallback> > mAudioPortCallbacks; }; + static const sp<AudioFlingerClient> getAudioFlingerClient(); + static sp<AudioIoDescriptor> getIoDescriptor(audio_io_handle_t ioHandle); + static sp<AudioFlingerClient> gAudioFlingerClient; static sp<AudioPolicyServiceClient> gAudioPolicyServiceClient; friend class AudioFlingerClient; diff --git a/include/media/AudioTrack.h b/include/media/AudioTrack.h index 0ccd19e..458f4b4 100644 --- a/include/media/AudioTrack.h +++ b/include/media/AudioTrack.h @@ -510,7 +510,7 @@ public: */ status_t setOutputDevice(audio_port_handle_t deviceId); - /* Returns the ID of the audio device used for output of this AudioTrack. + /* Returns the ID of the audio device selected for this AudioTrack. * A value of AUDIO_PORT_HANDLE_NONE indicates default (AudioPolicyManager) routing. * * Parameters: @@ -518,6 +518,15 @@ public: */ audio_port_handle_t getOutputDevice(); + /* Returns the ID of the audio device actually used by the output to which this AudioTrack is + * attached. + * A value of AUDIO_PORT_HANDLE_NONE indicates the audio track is not attached to any output. + * + * Parameters: + * none. + */ + audio_port_handle_t getRoutedDeviceId(); + /* Returns the unique session ID associated with this track. * * Parameters: @@ -664,6 +673,28 @@ public: */ status_t getTimestamp(AudioTimestamp& timestamp); + /* Add an AudioDeviceCallback. The caller will be notified when the audio device to which this + * AudioTrack is routed is updated. + * Replaces any previously installed callback. + * Parameters: + * callback: The callback interface + * Returns NO_ERROR if successful. + * INVALID_OPERATION if the same callback is already installed. + * NO_INIT or PREMISSION_DENIED if AudioFlinger service is not reachable + * BAD_VALUE if the callback is NULL + */ + status_t addAudioDeviceCallback(const sp<AudioSystem::AudioDeviceCallback>& callback); + + /* remove an AudioDeviceCallback. + * Parameters: + * callback: The callback interface + * Returns NO_ERROR if successful. + * INVALID_OPERATION if the callback is not installed + * BAD_VALUE if the callback is NULL + */ + status_t removeAudioDeviceCallback( + const sp<AudioSystem::AudioDeviceCallback>& callback); + protected: /* copying audio tracks is not allowed */ AudioTrack(const AudioTrack& other); @@ -885,6 +916,8 @@ private: uint32_t mSequence; // incremented for each new IAudioTrack attempt int mClientUid; pid_t mClientPid; + + sp<AudioSystem::AudioDeviceCallback> mDeviceCallback; }; class TimedAudioTrack : public AudioTrack |