summaryrefslogtreecommitdiffstats
path: root/services/audiopolicy/AudioPolicyInterfaceImpl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'services/audiopolicy/AudioPolicyInterfaceImpl.cpp')
-rw-r--r--services/audiopolicy/AudioPolicyInterfaceImpl.cpp99
1 files changed, 62 insertions, 37 deletions
diff --git a/services/audiopolicy/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/AudioPolicyInterfaceImpl.cpp
index b212ca6..6cd0ac8 100644
--- a/services/audiopolicy/AudioPolicyInterfaceImpl.cpp
+++ b/services/audiopolicy/AudioPolicyInterfaceImpl.cpp
@@ -162,14 +162,19 @@ status_t AudioPolicyService::startOutput(audio_io_handle_t output,
return NO_INIT;
}
ALOGV("startOutput()");
- Mutex::Autolock _l(mLock);
-
- // create audio processors according to stream
- status_t status = mAudioPolicyEffects->addOutputSessionEffects(output, stream, session);
- if (status != NO_ERROR && status != ALREADY_EXISTS) {
- ALOGW("Failed to add effects on session %d", session);
+ sp<AudioPolicyEffects>audioPolicyEffects;
+ {
+ Mutex::Autolock _l(mLock);
+ audioPolicyEffects = mAudioPolicyEffects;
+ }
+ if (audioPolicyEffects != 0) {
+ // create audio processors according to stream
+ status_t status = audioPolicyEffects->addOutputSessionEffects(output, stream, session);
+ if (status != NO_ERROR && status != ALREADY_EXISTS) {
+ ALOGW("Failed to add effects on session %d", session);
+ }
}
-
+ Mutex::Autolock _l(mLock);
return mAudioPolicyManager->startOutput(output, stream, session);
}
@@ -190,14 +195,19 @@ status_t AudioPolicyService::doStopOutput(audio_io_handle_t output,
int session)
{
ALOGV("doStopOutput from tid %d", gettid());
- Mutex::Autolock _l(mLock);
-
- // release audio processors from the stream
- status_t status = mAudioPolicyEffects->releaseOutputSessionEffects(output, stream, session);
- if (status != NO_ERROR && status != ALREADY_EXISTS) {
- ALOGW("Failed to release effects on session %d", session);
+ sp<AudioPolicyEffects>audioPolicyEffects;
+ {
+ Mutex::Autolock _l(mLock);
+ audioPolicyEffects = mAudioPolicyEffects;
+ }
+ if (audioPolicyEffects != 0) {
+ // release audio processors from the stream
+ status_t status = audioPolicyEffects->releaseOutputSessionEffects(output, stream, session);
+ if (status != NO_ERROR && status != ALREADY_EXISTS) {
+ ALOGW("Failed to release effects on session %d", session);
+ }
}
-
+ Mutex::Autolock _l(mLock);
return mAudioPolicyManager->stopOutput(output, stream, session);
}
@@ -235,23 +245,26 @@ audio_io_handle_t AudioPolicyService::getInput(audio_source_t inputSource,
if ((inputSource == AUDIO_SOURCE_HOTWORD) && !captureHotwordAllowed()) {
return 0;
}
-
- Mutex::Autolock _l(mLock);
- // the audio_in_acoustics_t parameter is ignored by get_input()
- audio_io_handle_t input = mAudioPolicyManager->getInput(inputSource, samplingRate,
- format, channelMask,
- (audio_session_t)audioSession, flags);
-
+ audio_io_handle_t input;
+ sp<AudioPolicyEffects>audioPolicyEffects;
+ {
+ Mutex::Autolock _l(mLock);
+ // the audio_in_acoustics_t parameter is ignored by get_input()
+ input = mAudioPolicyManager->getInput(inputSource, samplingRate,
+ format, channelMask,
+ (audio_session_t)audioSession, flags);
+ audioPolicyEffects = mAudioPolicyEffects;
+ }
if (input == 0) {
return input;
}
-
- // create audio pre processors according to input source
- status_t status = mAudioPolicyEffects->addInputEffects(input, inputSource, audioSession);
- if (status != NO_ERROR && status != ALREADY_EXISTS) {
- ALOGW("Failed to add effects on input %d", input);
+ if (audioPolicyEffects != 0) {
+ // create audio pre processors according to input source
+ status_t status = audioPolicyEffects->addInputEffects(input, inputSource, audioSession);
+ if (status != NO_ERROR && status != ALREADY_EXISTS) {
+ ALOGW("Failed to add effects on input %d", input);
+ }
}
-
return input;
}
@@ -283,13 +296,18 @@ void AudioPolicyService::releaseInput(audio_io_handle_t input,
if (mAudioPolicyManager == NULL) {
return;
}
- Mutex::Autolock _l(mLock);
- mAudioPolicyManager->releaseInput(input, session);
-
- // release audio processors from the input
- status_t status = mAudioPolicyEffects->releaseInputEffects(input);
- if(status != NO_ERROR) {
- ALOGW("Failed to release effects on input %d", input);
+ sp<AudioPolicyEffects>audioPolicyEffects;
+ {
+ Mutex::Autolock _l(mLock);
+ mAudioPolicyManager->releaseInput(input, session);
+ audioPolicyEffects = mAudioPolicyEffects;
+ }
+ if (audioPolicyEffects != 0) {
+ // release audio processors from the input
+ status_t status = audioPolicyEffects->releaseInputEffects(input);
+ if(status != NO_ERROR) {
+ ALOGW("Failed to release effects on input %d", input);
+ }
}
}
@@ -437,9 +455,16 @@ status_t AudioPolicyService::queryDefaultPreProcessing(int audioSession,
*count = 0;
return NO_INIT;
}
- Mutex::Autolock _l(mLock);
-
- return mAudioPolicyEffects->queryDefaultInputEffects(audioSession, descriptors, count);
+ sp<AudioPolicyEffects>audioPolicyEffects;
+ {
+ Mutex::Autolock _l(mLock);
+ audioPolicyEffects = mAudioPolicyEffects;
+ }
+ if (audioPolicyEffects == 0) {
+ *count = 0;
+ return NO_INIT;
+ }
+ return audioPolicyEffects->queryDefaultInputEffects(audioSession, descriptors, count);
}
bool AudioPolicyService::isOffloadSupported(const audio_offload_info_t& info)