diff options
author | Marco Nelissen <marcone@google.com> | 2011-08-02 13:33:41 -0700 |
---|---|---|
committer | Marco Nelissen <marcone@google.com> | 2011-08-09 10:21:10 -0700 |
commit | 3a34befc6fb04a4945a849e8bda8b84e4bf973fe (patch) | |
tree | 80dee67385fb78763b2c25f6dce9ed122bfd9aee /media | |
parent | a1f10e8959cd4656aedb2613e855342102e59555 (diff) | |
download | frameworks_av-3a34befc6fb04a4945a849e8bda8b84e4bf973fe.zip frameworks_av-3a34befc6fb04a4945a849e8bda8b84e4bf973fe.tar.gz frameworks_av-3a34befc6fb04a4945a849e8bda8b84e4bf973fe.tar.bz2 |
Keep effects sessions active when the caller dies.
Don't remove effects until the session they are in goes away or all
AudioEffects have been explicitly released. This allows the control
panel process to die without stopping the effects.
Change-Id: I4496e5df080230ca1af149dec95c1309ab8ea888
Diffstat (limited to 'media')
-rw-r--r-- | media/libmedia/AudioRecord.cpp | 3 | ||||
-rw-r--r-- | media/libmedia/AudioSystem.cpp | 14 | ||||
-rw-r--r-- | media/libmedia/AudioTrack.cpp | 2 | ||||
-rw-r--r-- | media/libmedia/IAudioFlinger.cpp | 32 | ||||
-rw-r--r-- | media/libmedia/mediaplayer.cpp | 8 |
5 files changed, 57 insertions, 2 deletions
diff --git a/media/libmedia/AudioRecord.cpp b/media/libmedia/AudioRecord.cpp index 16554c2..e5062ab 100644 --- a/media/libmedia/AudioRecord.cpp +++ b/media/libmedia/AudioRecord.cpp @@ -114,6 +114,7 @@ AudioRecord::~AudioRecord() } mAudioRecord.clear(); IPCThreadState::self()->flushCommands(); + AudioSystem::releaseAudioSessionId(mSessionId); } } @@ -233,6 +234,7 @@ status_t AudioRecord::set( mInputSource = (uint8_t)inputSource; mFlags = flags; mInput = input; + AudioSystem::acquireAudioSessionId(mSessionId); return NO_ERROR; } @@ -465,6 +467,7 @@ status_t AudioRecord::openRecord_l( ((uint16_t)flags) << 16, &mSessionId, &status); + if (record == 0) { LOGE("AudioFlinger could not create record track, status: %d", status); return status; diff --git a/media/libmedia/AudioSystem.cpp b/media/libmedia/AudioSystem.cpp index 5009957..b26ed71 100644 --- a/media/libmedia/AudioSystem.cpp +++ b/media/libmedia/AudioSystem.cpp @@ -356,6 +356,20 @@ int AudioSystem::newAudioSessionId() { return af->newAudioSessionId(); } +void AudioSystem::acquireAudioSessionId(int audioSession) { + const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); + if (af != 0) { + af->acquireAudioSessionId(audioSession); + } +} + +void AudioSystem::releaseAudioSessionId(int audioSession) { + const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); + if (af != 0) { + af->releaseAudioSessionId(audioSession); + } +} + // --------------------------------------------------------------------------- void AudioSystem::AudioFlingerClient::binderDied(const wp<IBinder>& who) { diff --git a/media/libmedia/AudioTrack.cpp b/media/libmedia/AudioTrack.cpp index 31eb97a..3949c39 100644 --- a/media/libmedia/AudioTrack.cpp +++ b/media/libmedia/AudioTrack.cpp @@ -134,6 +134,7 @@ AudioTrack::~AudioTrack() } mAudioTrack.clear(); IPCThreadState::self()->flushCommands(); + AudioSystem::releaseAudioSessionId(mSessionId); } } @@ -259,6 +260,7 @@ status_t AudioTrack::set( mNewPosition = 0; mUpdatePeriod = 0; mFlags = flags; + AudioSystem::acquireAudioSessionId(mSessionId); return NO_ERROR; } diff --git a/media/libmedia/IAudioFlinger.cpp b/media/libmedia/IAudioFlinger.cpp index 4a12962..d58834b 100644 --- a/media/libmedia/IAudioFlinger.cpp +++ b/media/libmedia/IAudioFlinger.cpp @@ -1,4 +1,4 @@ -/* //device/extlibs/pv/android/IAudioflinger.cpp +/* ** ** Copyright 2007, The Android Open Source Project ** @@ -63,6 +63,8 @@ enum { GET_RENDER_POSITION, GET_INPUT_FRAMES_LOST, NEW_AUDIO_SESSION_ID, + ACQUIRE_AUDIO_SESSION_ID, + RELEASE_AUDIO_SESSION_ID, QUERY_NUM_EFFECTS, QUERY_EFFECT, GET_EFFECT_DESCRIPTOR, @@ -526,6 +528,22 @@ public: return id; } + virtual void acquireAudioSessionId(int audioSession) + { + Parcel data, reply; + data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); + data.writeInt32(audioSession); + remote()->transact(ACQUIRE_AUDIO_SESSION_ID, data, &reply); + } + + virtual void releaseAudioSessionId(int audioSession) + { + Parcel data, reply; + data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); + data.writeInt32(audioSession); + remote()->transact(RELEASE_AUDIO_SESSION_ID, data, &reply); + } + virtual status_t queryNumberEffects(uint32_t *numEffects) { Parcel data, reply; @@ -919,6 +937,18 @@ status_t BnAudioFlinger::onTransact( reply->writeInt32(newAudioSessionId()); return NO_ERROR; } break; + case ACQUIRE_AUDIO_SESSION_ID: { + CHECK_INTERFACE(IAudioFlinger, data, reply); + int audioSession = data.readInt32(); + acquireAudioSessionId(audioSession); + return NO_ERROR; + } break; + case RELEASE_AUDIO_SESSION_ID: { + CHECK_INTERFACE(IAudioFlinger, data, reply); + int audioSession = data.readInt32(); + releaseAudioSessionId(audioSession); + return NO_ERROR; + } break; case QUERY_NUM_EFFECTS: { CHECK_INTERFACE(IAudioFlinger, data, reply); uint32_t numEffects; diff --git a/media/libmedia/mediaplayer.cpp b/media/libmedia/mediaplayer.cpp index 3dd9249..67a66a2 100644 --- a/media/libmedia/mediaplayer.cpp +++ b/media/libmedia/mediaplayer.cpp @@ -61,12 +61,14 @@ MediaPlayer::MediaPlayer() mVideoWidth = mVideoHeight = 0; mLockThreadId = 0; mAudioSessionId = AudioSystem::newAudioSessionId(); + AudioSystem::acquireAudioSessionId(mAudioSessionId); mSendLevel = 0; } MediaPlayer::~MediaPlayer() { LOGV("destructor"); + AudioSystem::releaseAudioSessionId(mAudioSessionId); disconnect(); IPCThreadState::self()->flushCommands(); } @@ -618,7 +620,11 @@ status_t MediaPlayer::setAudioSessionId(int sessionId) if (sessionId < 0) { return BAD_VALUE; } - mAudioSessionId = sessionId; + if (sessionId != mAudioSessionId) { + AudioSystem::releaseAudioSessionId(mAudioSessionId); + AudioSystem::acquireAudioSessionId(sessionId); + mAudioSessionId = sessionId; + } return NO_ERROR; } |