diff options
author | Steve Kondik <steve@cyngn.com> | 2016-04-22 18:32:39 -0700 |
---|---|---|
committer | Steve Kondik <steve@cyngn.com> | 2016-04-27 13:28:15 -0700 |
commit | 3f9eb321481de3e118632a594bf1b0c9001c281c (patch) | |
tree | a5a0f5a1771e780f32aa4212eeac20e68ba8857c /media/libmedia/AudioSystem.cpp | |
parent | 244deea89aaf3c5dfa8bd369a845276ae501cb5a (diff) | |
download | frameworks_av-3f9eb321481de3e118632a594bf1b0c9001c281c.zip frameworks_av-3f9eb321481de3e118632a594bf1b0c9001c281c.tar.gz frameworks_av-3f9eb321481de3e118632a594bf1b0c9001c281c.tar.bz2 |
audiopolicy: Add AudioSessionInfo API
* This patch introduces a new API which allows applications to
query the state of the audio effects system, and receive
callbacks with the necessary information to attach effects
to any stream.
* In the future, this may come as part of the AudioPort system,
but since that's an active area of development by Google, we
will dodge it for now.
* The policy now simply keeps a refcounted list of objects which
hold various bits of stream metadata. Callbacks are sent on
stream open/close to applications which might be listening
for them.
Change-Id: I2d554d36e1378f4eb7b276010a3bfe8345c22ecd
Diffstat (limited to 'media/libmedia/AudioSystem.cpp')
-rw-r--r-- | media/libmedia/AudioSystem.cpp | 39 |
1 files changed, 38 insertions, 1 deletions
diff --git a/media/libmedia/AudioSystem.cpp b/media/libmedia/AudioSystem.cpp index 9d645f0..2e9fca9 100644 --- a/media/libmedia/AudioSystem.cpp +++ b/media/libmedia/AudioSystem.cpp @@ -37,7 +37,7 @@ sp<IAudioFlinger> AudioSystem::gAudioFlinger; sp<AudioSystem::AudioFlingerClient> AudioSystem::gAudioFlingerClient; audio_error_callback AudioSystem::gAudioErrorCallback = NULL; dynamic_policy_callback AudioSystem::gDynPolicyCallback = NULL; - +audio_session_callback AudioSystem::gAudioSessionCallback = NULL; // establish binder interface to AudioFlinger service const sp<IAudioFlinger> AudioSystem::get_audio_flinger() @@ -652,6 +652,17 @@ status_t AudioSystem::AudioFlingerClient::removeAudioDeviceCallback( gDynPolicyCallback = cb; } +/*static*/ status_t AudioSystem::setAudioSessionCallback(audio_session_callback cb) +{ + const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); + if (aps == 0) return PERMISSION_DENIED; + + Mutex::Autolock _l(gLock); + gAudioSessionCallback = cb; + + return NO_ERROR; +} + // client singleton for AudioPolicyService binder interface // protected by gLockAPS sp<IAudioPolicyService> AudioSystem::gAudioPolicyService; @@ -1223,6 +1234,32 @@ void AudioSystem::AudioPolicyServiceClient::onDynamicPolicyMixStateUpdate( } } +// --------------------------------------------------------------------------- + +status_t AudioSystem::listAudioSessions(audio_stream_type_t stream, + Vector< sp<AudioSessionInfo>> &sessions) +{ + const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); + if (aps == 0) return PERMISSION_DENIED; + return aps->listAudioSessions(stream, sessions); +} + +void AudioSystem::AudioPolicyServiceClient::onOutputSessionEffectsUpdate( + sp<AudioSessionInfo>& info, bool added) +{ + ALOGV("AudioPolicyServiceClient::onOutputSessionEffectsUpdate(%d, %d, %d)", + info->mStream, info->mSessionId, added); + audio_session_callback cb = NULL; + { + Mutex::Autolock _l(AudioSystem::gLock); + cb = gAudioSessionCallback; + } + + if (cb != NULL) { + cb(AUDIO_OUTPUT_SESSION_EFFECTS_UPDATE, info, added); + } +} + void AudioSystem::AudioPolicyServiceClient::binderDied(const wp<IBinder>& who __unused) { { |