am 880dfe4f: Merge "Fix issue 3007862" into gingerbread
Merge commit '880dfe4f675128188f8d598f2025a417ccabd1bf' into gingerbread-plus-aosp * commit '880dfe4f675128188f8d598f2025a417ccabd1bf': Fix issue 3007862
This commit is contained in:
@@ -4653,29 +4653,44 @@ sp<IEffect> AudioFlinger::createEffect(pid_t pid,
|
|||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// check audio settings permission for global effects
|
||||||
|
if (sessionId == AudioSystem::SESSION_OUTPUT_MIX && !settingsAllowed()) {
|
||||||
|
lStatus = PERMISSION_DENIED;
|
||||||
|
goto Exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Session AudioSystem::SESSION_OUTPUT_STAGE is reserved for output stage effects
|
||||||
|
// that can only be created by audio policy manager (running in same process)
|
||||||
|
if (sessionId == AudioSystem::SESSION_OUTPUT_STAGE && getpid() != pid) {
|
||||||
|
lStatus = PERMISSION_DENIED;
|
||||||
|
goto Exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check recording permission for visualizer
|
||||||
|
if ((memcmp(&pDesc->type, SL_IID_VISUALIZATION, sizeof(effect_uuid_t)) == 0 ||
|
||||||
|
memcmp(&pDesc->uuid, &VISUALIZATION_UUID_, sizeof(effect_uuid_t)) == 0) &&
|
||||||
|
!recordingAllowed()) {
|
||||||
|
lStatus = PERMISSION_DENIED;
|
||||||
|
goto Exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (output == 0) {
|
||||||
|
if (sessionId == AudioSystem::SESSION_OUTPUT_STAGE) {
|
||||||
|
// output must be specified by AudioPolicyManager when using session
|
||||||
|
// AudioSystem::SESSION_OUTPUT_STAGE
|
||||||
|
lStatus = BAD_VALUE;
|
||||||
|
goto Exit;
|
||||||
|
} else if (sessionId == AudioSystem::SESSION_OUTPUT_MIX) {
|
||||||
|
// if the output returned by getOutputForEffect() is removed before we lock the
|
||||||
|
// mutex below, the call to checkPlaybackThread_l(output) below will detect it
|
||||||
|
// and we will exit safely
|
||||||
|
output = AudioSystem::getOutputForEffect(&desc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
Mutex::Autolock _l(mLock);
|
Mutex::Autolock _l(mLock);
|
||||||
|
|
||||||
// check audio settings permission for global effects
|
|
||||||
if (sessionId == AudioSystem::SESSION_OUTPUT_MIX && !settingsAllowed()) {
|
|
||||||
lStatus = PERMISSION_DENIED;
|
|
||||||
goto Exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Session AudioSystem::SESSION_OUTPUT_STAGE is reserved for output stage effects
|
|
||||||
// that can only be created by audio policy manager (running in same process)
|
|
||||||
if (sessionId == AudioSystem::SESSION_OUTPUT_STAGE && getpid() != pid) {
|
|
||||||
lStatus = PERMISSION_DENIED;
|
|
||||||
goto Exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
// check recording permission for visualizer
|
|
||||||
if ((memcmp(&pDesc->type, SL_IID_VISUALIZATION, sizeof(effect_uuid_t)) == 0 ||
|
|
||||||
memcmp(&pDesc->uuid, &VISUALIZATION_UUID_, sizeof(effect_uuid_t)) == 0) &&
|
|
||||||
!recordingAllowed()) {
|
|
||||||
lStatus = PERMISSION_DENIED;
|
|
||||||
goto Exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!EffectIsNullUuid(&pDesc->uuid)) {
|
if (!EffectIsNullUuid(&pDesc->uuid)) {
|
||||||
// if uuid is specified, request effect descriptor
|
// if uuid is specified, request effect descriptor
|
||||||
@@ -4744,32 +4759,24 @@ sp<IEffect> AudioFlinger::createEffect(pid_t pid,
|
|||||||
|
|
||||||
// If output is not specified try to find a matching audio session ID in one of the
|
// If output is not specified try to find a matching audio session ID in one of the
|
||||||
// output threads.
|
// output threads.
|
||||||
// TODO: allow attachment of effect to inputs
|
// If output is 0 here, sessionId is neither SESSION_OUTPUT_STAGE nor SESSION_OUTPUT_MIX
|
||||||
|
// because of code checking output when entering the function.
|
||||||
if (output == 0) {
|
if (output == 0) {
|
||||||
if (sessionId == AudioSystem::SESSION_OUTPUT_STAGE) {
|
// look for the thread where the specified audio session is present
|
||||||
// output must be specified by AudioPolicyManager when using session
|
for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
|
||||||
// AudioSystem::SESSION_OUTPUT_STAGE
|
if (mPlaybackThreads.valueAt(i)->hasAudioSession(sessionId) != 0) {
|
||||||
lStatus = BAD_VALUE;
|
output = mPlaybackThreads.keyAt(i);
|
||||||
goto Exit;
|
break;
|
||||||
} else if (sessionId == AudioSystem::SESSION_OUTPUT_MIX) {
|
|
||||||
output = AudioSystem::getOutputForEffect(&desc);
|
|
||||||
LOGV("createEffect() got output %d for effect %s", output, desc.name);
|
|
||||||
} else {
|
|
||||||
// look for the thread where the specified audio session is present
|
|
||||||
for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
|
|
||||||
if (mPlaybackThreads.valueAt(i)->hasAudioSession(sessionId) != 0) {
|
|
||||||
output = mPlaybackThreads.keyAt(i);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// If no output thread contains the requested session ID, default to
|
|
||||||
// first output. The effect chain will be moved to the correct output
|
|
||||||
// thread when a track with the same session ID is created
|
|
||||||
if (output == 0 && mPlaybackThreads.size()) {
|
|
||||||
output = mPlaybackThreads.keyAt(0);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// If no output thread contains the requested session ID, default to
|
||||||
|
// first output. The effect chain will be moved to the correct output
|
||||||
|
// thread when a track with the same session ID is created
|
||||||
|
if (output == 0 && mPlaybackThreads.size()) {
|
||||||
|
output = mPlaybackThreads.keyAt(0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
LOGV("createEffect() got output %d for effect %s", output, desc.name);
|
||||||
PlaybackThread *thread = checkPlaybackThread_l(output);
|
PlaybackThread *thread = checkPlaybackThread_l(output);
|
||||||
if (thread == NULL) {
|
if (thread == NULL) {
|
||||||
LOGE("createEffect() unknown output thread");
|
LOGE("createEffect() unknown output thread");
|
||||||
@@ -4777,6 +4784,8 @@ sp<IEffect> AudioFlinger::createEffect(pid_t pid,
|
|||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: allow attachment of effect to inputs
|
||||||
|
|
||||||
wclient = mClients.valueFor(pid);
|
wclient = mClients.valueFor(pid);
|
||||||
|
|
||||||
if (wclient != NULL) {
|
if (wclient != NULL) {
|
||||||
|
|||||||
Reference in New Issue
Block a user