diff options
author | Wolfgang Wiedmeyer <wolfgit@wiedmeyer.de> | 2016-12-12 15:01:24 +0100 |
---|---|---|
committer | Wolfgang Wiedmeyer <wolfgit@wiedmeyer.de> | 2016-12-12 15:01:24 +0100 |
commit | e15fd68c5dc4089690b5d3086776c3851e504bb7 (patch) | |
tree | 2c75274dee02b07463c9164efdf6888e1a9c75dc /services/audiopolicy | |
parent | 185e2110a53feb7720d91b6f8366ad27402f21cc (diff) | |
parent | 26c5fa31d17a638bf314de6e12e86bb8a86db44b (diff) | |
download | frameworks_av-e15fd68c5dc4089690b5d3086776c3851e504bb7.zip frameworks_av-e15fd68c5dc4089690b5d3086776c3851e504bb7.tar.gz frameworks_av-e15fd68c5dc4089690b5d3086776c3851e504bb7.tar.bz2 |
Merge branch 'cm-13.0' of https://github.com/CyanogenMod/android_frameworks_av into replicant-6.0
Diffstat (limited to 'services/audiopolicy')
9 files changed, 215 insertions, 162 deletions
diff --git a/services/audiopolicy/AudioPolicyInterface.h b/services/audiopolicy/AudioPolicyInterface.h index a5edc14..93e6266 100644 --- a/services/audiopolicy/AudioPolicyInterface.h +++ b/services/audiopolicy/AudioPolicyInterface.h @@ -332,8 +332,8 @@ public: virtual void onDynamicPolicyMixStateUpdate(String8 regId, int32_t state) = 0; - virtual void onOutputSessionEffectsUpdate(audio_stream_type_t stream, - audio_unique_id_t sessionId, bool added) = 0; + virtual void onOutputSessionEffectsUpdate(sp<AudioSessionInfo>& streamInfo, bool added) = 0; + }; extern "C" AudioPolicyInterface* createAudioPolicyManager(AudioPolicyClientInterface *clientInterface); diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/Android.mk b/services/audiopolicy/engineconfigurable/parameter-framework/Android.mk index c402fd5..be86231 100644 --- a/services/audiopolicy/engineconfigurable/parameter-framework/Android.mk +++ b/services/audiopolicy/engineconfigurable/parameter-framework/Android.mk @@ -4,4 +4,4 @@ LOCAL_PATH := $(call my-dir) # Recursive call sub-folder Android.mk ####################################################################### -include $(call all-makefiles-under,$(LOCAL_PATH)) +include $(LOCAL_PATH)/plugin/Android.mk diff --git a/services/audiopolicy/service/AudioPolicyClientImpl.cpp b/services/audiopolicy/service/AudioPolicyClientImpl.cpp index d71daa4..82720f4 100644 --- a/services/audiopolicy/service/AudioPolicyClientImpl.cpp +++ b/services/audiopolicy/service/AudioPolicyClientImpl.cpp @@ -220,9 +220,9 @@ void AudioPolicyService::AudioPolicyClient::onDynamicPolicyMixStateUpdate( } void AudioPolicyService::AudioPolicyClient::onOutputSessionEffectsUpdate( - audio_stream_type_t stream, audio_unique_id_t sessionId, bool added) + sp<AudioSessionInfo>& info, bool added) { - mAudioPolicyService->onOutputSessionEffectsUpdate(stream, sessionId, added); + mAudioPolicyService->onOutputSessionEffectsUpdate(info, added); } audio_unique_id_t AudioPolicyService::AudioPolicyClient::newAudioUniqueId() diff --git a/services/audiopolicy/service/AudioPolicyEffects.cpp b/services/audiopolicy/service/AudioPolicyEffects.cpp index f2d7f6f..d6fabfe 100644 --- a/services/audiopolicy/service/AudioPolicyEffects.cpp +++ b/services/audiopolicy/service/AudioPolicyEffects.cpp @@ -228,6 +228,8 @@ status_t AudioPolicyEffects::addOutputSessionEffects(audio_io_handle_t output, { status_t status = NO_ERROR; + ALOGV("addOutputSessionEffects %d", audioSession); + Mutex::Autolock _l(mLock); // create audio processors according to stream // FIXME: should we have specific post processing settings for internal streams? @@ -235,6 +237,22 @@ status_t AudioPolicyEffects::addOutputSessionEffects(audio_io_handle_t output, if (stream >= AUDIO_STREAM_PUBLIC_CNT) { stream = AUDIO_STREAM_MUSIC; } + + // send the streaminfo notification only once + ssize_t sidx = mOutputAudioSessionInfo.indexOfKey(audioSession); + if (sidx >= 0) { + // AudioSessionInfo is existing and we just need to increase ref count + sp<AudioSessionInfo> info = mOutputAudioSessionInfo.valueAt(sidx); + info->mRefCount++; + + if (info->mRefCount == 1) { + mAudioPolicyService->onOutputSessionEffectsUpdate(info, true); + } + ALOGV("addOutputSessionEffects(): session info %d refCount=%d", audioSession, info->mRefCount); + } else { + ALOGV("addOutputSessionEffects(): no output stream info found for stream"); + } + ssize_t index = mOutputStreams.indexOfKey(stream); if (index < 0) { ALOGV("addOutputSessionEffects(): no output processing needed for this stream"); @@ -246,8 +264,6 @@ status_t AudioPolicyEffects::addOutputSessionEffects(audio_io_handle_t output, if (idx < 0) { procDesc = new EffectVector(audioSession); mOutputSessions.add(audioSession, procDesc); - - mAudioPolicyService->onOutputSessionEffectsUpdate(stream, audioSession, true); } else { // EffectVector is existing and we just need to increase ref count procDesc = mOutputSessions.valueAt(idx); @@ -279,65 +295,123 @@ status_t AudioPolicyEffects::addOutputSessionEffects(audio_io_handle_t output, return status; } -status_t AudioPolicyEffects::releaseOutputSessionEffects(audio_io_handle_t output, - audio_stream_type_t stream, - int audioSession) +status_t AudioPolicyEffects::releaseOutputAudioSessionInfo(audio_io_handle_t /* output */, + audio_stream_type_t stream, + int session) { - status_t status = NO_ERROR; - (void) output; // argument not used for now - (void) stream; // argument not used for now + if (uint32_t(stream) >= AUDIO_STREAM_CNT) { + return BAD_VALUE; + } Mutex::Autolock _l(mLock); - ssize_t index = mOutputSessions.indexOfKey(audioSession); - if (index < 0) { - ALOGV("releaseOutputSessionEffects: no output processing was attached to this stream"); - return NO_ERROR; + + ssize_t idx = mOutputAudioSessionInfo.indexOfKey(session); + if (idx >= 0) { + sp<AudioSessionInfo> info = mOutputAudioSessionInfo.valueAt(idx); + if (info->mRefCount == 0) { + mOutputAudioSessionInfo.removeItemsAt(idx); + } + ALOGV("releaseOutputAudioSessionInfo() sessionId=%d refcount=%d", + session, info->mRefCount); + } else { + ALOGV("releaseOutputAudioSessionInfo() no session info found"); } + return NO_ERROR; +} - EffectVector *procDesc = mOutputSessions.valueAt(index); +status_t AudioPolicyEffects::updateOutputAudioSessionInfo(audio_io_handle_t /* output */, + audio_stream_type_t stream, + int session, + audio_output_flags_t flags, + audio_channel_mask_t channelMask, uid_t uid) +{ + if (uint32_t(stream) >= AUDIO_STREAM_CNT) { + return BAD_VALUE; + } - // just in case it already has a death wish - if (procDesc->mRefCount == 0) { + Mutex::Autolock _l(mLock); + + // TODO: Handle other stream types based on client registration + if (stream != AUDIO_STREAM_MUSIC) { return NO_ERROR; } - procDesc->mRefCount--; - ALOGV("releaseOutputSessionEffects(): session: %d, refCount: %d", - audioSession, procDesc->mRefCount); + // update AudioSessionInfo. This is used in the stream open/close path + // to notify userspace applications about session creation and + // teardown, allowing the app to make decisions about effects for + // a particular stream. This is independent of the current + // output_session_processing feature which forcibly attaches a + // static list of effects to a stream. + ssize_t idx = mOutputAudioSessionInfo.indexOfKey(session); + sp<AudioSessionInfo> info; + if (idx < 0) { + info = new AudioSessionInfo(session, stream, flags, channelMask, uid); + mOutputAudioSessionInfo.add(session, info); + } else { + // the streaminfo may actually change + info = mOutputAudioSessionInfo.valueAt(idx); + info->mFlags = flags; + info->mChannelMask = channelMask; + } - if (procDesc->mRefCount == 0) { - mAudioPolicyService->releaseOutputSessionEffectsDelayed( - output, stream, audioSession, 10000); + ALOGV("updateOutputAudioSessionInfo() sessionId=%d, flags=0x%x, channelMask=0x%x uid=%d refCount=%d", + info->mSessionId, info->mFlags, info->mChannelMask, info->mUid, info->mRefCount); + + return NO_ERROR; +} + +status_t AudioPolicyEffects::listAudioSessions(audio_stream_type_t streams, + Vector< sp<AudioSessionInfo>> &sessions) +{ + ALOGV("listAudioSessions() streams %d", streams); + + for (unsigned int i = 0; i < mOutputAudioSessionInfo.size(); i++) { + sp<AudioSessionInfo> info = mOutputAudioSessionInfo.valueAt(i); + if (streams == -1 || info->mStream == streams) { + sessions.push_back(info); + } } - return status; + return NO_ERROR; } -status_t AudioPolicyEffects::doReleaseOutputSessionEffects(audio_io_handle_t output, +status_t AudioPolicyEffects::releaseOutputSessionEffects(audio_io_handle_t output, audio_stream_type_t stream, int audioSession) { status_t status = NO_ERROR; (void) output; // argument not used for now + (void) stream; // argument not used for now Mutex::Autolock _l(mLock); - ssize_t index = mOutputSessions.indexOfKey(audioSession); + ssize_t index = mOutputAudioSessionInfo.indexOfKey(audioSession); + if (index >= 0) { + sp<AudioSessionInfo> info = mOutputAudioSessionInfo.valueAt(index); + info->mRefCount--; + if (info->mRefCount == 0) { + mAudioPolicyService->onOutputSessionEffectsUpdate(info, false); + } + ALOGV("releaseOutputSessionEffects(): session=%d refCount=%d", info->mSessionId, info->mRefCount); + } else { + ALOGV("releaseOutputSessionEffects: no stream info was attached to this stream"); + } + + index = mOutputSessions.indexOfKey(audioSession); if (index < 0) { - ALOGV("doReleaseOutputSessionEffects: no output processing was attached to this stream"); + ALOGV("releaseOutputSessionEffects: no output processing was attached to this stream"); return NO_ERROR; } EffectVector *procDesc = mOutputSessions.valueAt(index); - ALOGV("doReleaseOutputSessionEffects(): session: %d, refCount: %d", + procDesc->mRefCount--; + ALOGV("releaseOutputSessionEffects(): session: %d, refCount: %d", audioSession, procDesc->mRefCount); - if (procDesc->mRefCount == 0) { procDesc->setProcessorEnabled(false); procDesc->mEffects.clear(); delete procDesc; mOutputSessions.removeItemsAt(index); - mAudioPolicyService->onOutputSessionEffectsUpdate(stream, audioSession, false); - ALOGV("doReleaseOutputSessionEffects(): output processing released from session: %d", + ALOGV("releaseOutputSessionEffects(): output processing released from session: %d", audioSession); } return status; diff --git a/services/audiopolicy/service/AudioPolicyEffects.h b/services/audiopolicy/service/AudioPolicyEffects.h index 7988515..a95d49f 100644 --- a/services/audiopolicy/service/AudioPolicyEffects.h +++ b/services/audiopolicy/service/AudioPolicyEffects.h @@ -46,7 +46,7 @@ public: // The constructor will parse audio_effects.conf // First it will look whether vendor specific file exists, // otherwise it will parse the system default file. - AudioPolicyEffects(AudioPolicyService *audioPolicyService); + AudioPolicyEffects(AudioPolicyService *audioPolicyService); virtual ~AudioPolicyEffects(); // NOTE: methods on AudioPolicyEffects should never be called with the AudioPolicyService @@ -86,11 +86,18 @@ public: audio_stream_type_t stream, int audioSession); - // For deferred release - status_t doReleaseOutputSessionEffects(audio_io_handle_t output, - audio_stream_type_t stream, - int audioSession); + status_t updateOutputAudioSessionInfo(audio_io_handle_t output, + audio_stream_type_t stream, + int audioSession, + audio_output_flags_t flags, + audio_channel_mask_t channelMask, uid_t uid); + + status_t releaseOutputAudioSessionInfo(audio_io_handle_t output, + audio_stream_type_t stream, + int audioSession); + status_t listAudioSessions(audio_stream_type_t streams, + Vector< sp<AudioSessionInfo>> &sessions); private: @@ -200,6 +207,8 @@ private: KeyedVector< audio_stream_type_t, EffectDescVector* > mOutputStreams; // Automatic output effects are unique for audiosession ID KeyedVector< int32_t, EffectVector* > mOutputSessions; + // Stream info for session events + KeyedVector< int32_t, sp<AudioSessionInfo> > mOutputAudioSessionInfo; AudioPolicyService *mAudioPolicyService; }; diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp index c0d3866..b23c35e 100644 --- a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp +++ b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp @@ -161,19 +161,32 @@ status_t AudioPolicyService::getOutputForAttr(const audio_attributes_t *attr, if (mAudioPolicyManager == NULL) { return NO_INIT; } - ALOGV("getOutput()"); - Mutex::Autolock _l(mLock); + ALOGV("getOutputForAttr()"); + status_t status = NO_ERROR; + sp<AudioPolicyEffects> audioPolicyEffects; + { + Mutex::Autolock _l(mLock); - // if the caller is us, trust the specified uid - if (IPCThreadState::self()->getCallingPid() != getpid_cached || uid == (uid_t)-1) { - uid_t newclientUid = IPCThreadState::self()->getCallingUid(); - if (uid != (uid_t)-1 && uid != newclientUid) { - ALOGW("%s uid %d tried to pass itself off as %d", __FUNCTION__, newclientUid, uid); + // if the caller is us, trust the specified uid + if (IPCThreadState::self()->getCallingPid() != getpid_cached || uid == (uid_t)-1) { + uid_t newclientUid = IPCThreadState::self()->getCallingUid(); + if (uid != (uid_t)-1 && uid != newclientUid) { + ALOGW("%s uid %d tried to pass itself off as %d", __FUNCTION__, newclientUid, uid); + } + uid = newclientUid; } - uid = newclientUid; + status = mAudioPolicyManager->getOutputForAttr(attr, output, session, stream, uid, samplingRate, + format, channelMask, flags, selectedDeviceId, offloadInfo); + + audioPolicyEffects = mAudioPolicyEffects; } - return mAudioPolicyManager->getOutputForAttr(attr, output, session, stream, uid, samplingRate, - format, channelMask, flags, selectedDeviceId, offloadInfo); + + if (status == NO_ERROR && audioPolicyEffects != 0) { + audioPolicyEffects->updateOutputAudioSessionInfo(*output, + *stream, session, flags, channelMask, uid); + } + + return status; } status_t AudioPolicyService::startOutput(audio_io_handle_t output, @@ -269,8 +282,16 @@ void AudioPolicyService::doReleaseOutput(audio_io_handle_t output, audio_session_t session) { ALOGV("doReleaseOutput from tid %d", gettid()); - Mutex::Autolock _l(mLock); - mAudioPolicyManager->releaseOutput(output, stream, session); + sp<AudioPolicyEffects>audioPolicyEffects; + { + Mutex::Autolock _l(mLock); + audioPolicyEffects = mAudioPolicyEffects; + mAudioPolicyManager->releaseOutput(output, stream, session); + } + if (audioPolicyEffects != 0) { + audioPolicyEffects->releaseOutputAudioSessionInfo(output, + stream, session); + } } status_t AudioPolicyService::getInputForAttr(const audio_attributes_t *attr, @@ -295,6 +316,11 @@ status_t AudioPolicyService::getInputForAttr(const audio_attributes_t *attr, if ((attr->source == AUDIO_SOURCE_HOTWORD) && !captureHotwordAllowed()) { return BAD_VALUE; } + + if ((attr->source == AUDIO_SOURCE_FM_TUNER) && !accessFmRadioAllowed()) { + return BAD_VALUE; + } + sp<AudioPolicyEffects>audioPolicyEffects; status_t status; AudioPolicyInterface::input_type_t inputType; @@ -717,4 +743,25 @@ status_t AudioPolicyService::stopAudioSource(audio_io_handle_t handle) return mAudioPolicyManager->stopAudioSource(handle); } +status_t AudioPolicyService::listAudioSessions(audio_stream_type_t streams, + Vector< sp<AudioSessionInfo>> &sessions) +{ + sp<AudioPolicyEffects> audioPolicyEffects; + { + Mutex::Autolock _l(mLock); + if (mAudioPolicyManager == NULL) { + return NO_INIT; + } + audioPolicyEffects = mAudioPolicyEffects; + } + + if (audioPolicyEffects != 0) { + return audioPolicyEffects->listAudioSessions(streams, sessions); + } + + // no errors here if effects are not available + return NO_ERROR; +} + + }; // namespace android diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImplLegacy.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImplLegacy.cpp index 318c6d2..da7f45d 100644 --- a/services/audiopolicy/service/AudioPolicyInterfaceImplLegacy.cpp +++ b/services/audiopolicy/service/AudioPolicyInterfaceImplLegacy.cpp @@ -275,6 +275,10 @@ status_t AudioPolicyService::getInputForAttr(const audio_attributes_t *attr, return BAD_VALUE; } + if ((inputSource == AUDIO_SOURCE_FM_TUNER) && !accessFmRadioAllowed()) { + return BAD_VALUE; + } + #ifdef HAVE_PRE_KITKAT_AUDIO_POLICY_BLOB if (inputSource == AUDIO_SOURCE_HOTWORD) inputSource = AUDIO_SOURCE_VOICE_RECOGNITION; @@ -642,4 +646,9 @@ status_t AudioPolicyService::stopAudioSource(audio_io_handle_t handle) return INVALID_OPERATION; } +status_t AudioPolicyService::listAudioSessions(audio_stream_type_t streams, + Vector< sp<AudioSessionInfo>> &sessions) +{ + return INVALID_OPERATION; +} }; // namespace android diff --git a/services/audiopolicy/service/AudioPolicyService.cpp b/services/audiopolicy/service/AudioPolicyService.cpp index 58cfe37..79370f4 100644 --- a/services/audiopolicy/service/AudioPolicyService.cpp +++ b/services/audiopolicy/service/AudioPolicyService.cpp @@ -177,23 +177,6 @@ void AudioPolicyService::setAudioPortCallbacksEnabled(bool enabled) mNotificationClients.valueFor(uid)->setAudioPortCallbacksEnabled(enabled); } -status_t AudioPolicyService::setEffectSessionCallbacksEnabled(bool enabled) -{ - Mutex::Autolock _l(mNotificationClientsLock); - - uid_t uid = IPCThreadState::self()->getCallingUid(); - if (mNotificationClients.indexOfKey(uid) < 0) { - return NO_INIT; - } - if (!modifyAudioRoutingAllowed()) { - ALOGE("setEffectSessionCallbacksEnabled requires MODIFY_AUDIO_ROUTING"); - return PERMISSION_DENIED; - } - mNotificationClients.valueFor(uid)->setEffectSessionCallbacksEnabled(enabled); - return OK; -} - - // removeNotificationClient() is called when the client process dies. void AudioPolicyService::removeNotificationClient(uid_t uid) { @@ -271,22 +254,18 @@ status_t AudioPolicyService::clientSetAudioPortConfig(const struct audio_port_co return mAudioCommandThread->setAudioPortConfigCommand(config, delayMs); } -void AudioPolicyService::onOutputSessionEffectsUpdate(audio_stream_type_t stream, - audio_unique_id_t sessionId, - bool added) +void AudioPolicyService::onOutputSessionEffectsUpdate(sp<AudioSessionInfo>& info, bool added) { ALOGV("AudioPolicyService::onOutputSessionEffectsUpdate(%d, %d, %d)", - stream, sessionId, added); - mOutputCommandThread->effectSessionUpdateCommand(stream, sessionId, added); + info->mStream, info->mSessionId, added); + mOutputCommandThread->effectSessionUpdateCommand(info, added); } -void AudioPolicyService::doOnOutputSessionEffectsUpdate(audio_stream_type_t stream, - audio_unique_id_t sessionId, - bool added) +void AudioPolicyService::doOnOutputSessionEffectsUpdate(sp<AudioSessionInfo>& info, bool added) { Mutex::Autolock _l(mNotificationClientsLock); for (size_t i = 0; i < mNotificationClients.size(); i++) { - mNotificationClients.valueAt(i)->onOutputSessionEffectsUpdate(stream, sessionId, added); + mNotificationClients.valueAt(i)->onOutputSessionEffectsUpdate(info, added); } } @@ -294,8 +273,7 @@ AudioPolicyService::NotificationClient::NotificationClient(const sp<AudioPolicyS const sp<IAudioPolicyServiceClient>& client, uid_t uid) : mService(service), mUid(uid), mAudioPolicyServiceClient(client), - mAudioPortCallbacksEnabled(false), - mEffectSessionCallbacksEnabled(false) + mAudioPortCallbacksEnabled(false) { } @@ -327,10 +305,10 @@ void AudioPolicyService::NotificationClient::onAudioPatchListUpdate() } void AudioPolicyService::NotificationClient::onOutputSessionEffectsUpdate( - audio_stream_type_t stream, audio_unique_id_t sessionId, bool added) + sp<AudioSessionInfo>& info, bool added) { - if (mAudioPolicyServiceClient != 0 && mEffectSessionCallbacksEnabled) { - mAudioPolicyServiceClient->onOutputSessionEffectsUpdate(stream, sessionId, added); + if (mAudioPolicyServiceClient != 0) { + mAudioPolicyServiceClient->onOutputSessionEffectsUpdate(info, added); } } @@ -347,23 +325,12 @@ void AudioPolicyService::NotificationClient::setAudioPortCallbacksEnabled(bool e mAudioPortCallbacksEnabled = enabled; } -void AudioPolicyService::NotificationClient::setEffectSessionCallbacksEnabled(bool enabled) -{ - mEffectSessionCallbacksEnabled = enabled; -} void AudioPolicyService::binderDied(const wp<IBinder>& who) { ALOGW("binderDied() %p, calling pid %d", who.unsafe_get(), IPCThreadState::self()->getCallingPid()); } -void AudioPolicyService::releaseOutputSessionEffectsDelayed( - audio_io_handle_t output, audio_stream_type_t stream, - audio_unique_id_t sessionId, int delayMs) -{ - mAudioCommandThread->releaseOutputSessionEffectsCommand(output, stream, sessionId, delayMs); -} - static bool tryLock(Mutex& mutex) { bool locked = false; @@ -639,30 +606,16 @@ bool AudioPolicyService::AudioCommandThread::threadLoop() EffectSessionUpdateData *data = (EffectSessionUpdateData *)command->mParam.get(); ALOGV("AudioCommandThread() processing effect session update %d %d %d", - data->mStream, data->mSessionId, data->mAdded); + data->mAudioSessionInfo->mStream, data->mAudioSessionInfo->mSessionId, + data->mAdded); svc = mService.promote(); if (svc == 0) { break; } mLock.unlock(); - svc->doOnOutputSessionEffectsUpdate(data->mStream, data->mSessionId, data->mAdded); + svc->doOnOutputSessionEffectsUpdate(data->mAudioSessionInfo, data->mAdded); mLock.lock(); } break; - case RELEASE_OUTPUT_SESSION_EFFECTS: { - ReleaseOutputSessionEffectsData *data = - (ReleaseOutputSessionEffectsData *)command->mParam.get(); - ALOGV("AudioCommandThread() processing release output session effects %d %d %d", - data->mOutput, data->mStream, data->mSessionId); - svc = mService.promote(); - if (svc == 0) { - break; - } - mLock.unlock(); - svc->mAudioPolicyEffects->doReleaseOutputSessionEffects( - data->mOutput, data->mStream, data->mSessionId); - mLock.lock(); - } break; - default: ALOGW("AudioCommandThread() unknown command %d", command->mCommand); @@ -937,37 +890,19 @@ void AudioPolicyService::AudioCommandThread::dynamicPolicyMixStateUpdateCommand( } void AudioPolicyService::AudioCommandThread::effectSessionUpdateCommand( - audio_stream_type_t stream, audio_unique_id_t sessionId, bool added) + sp<AudioSessionInfo>& streamInfo, bool added) { sp<AudioCommand> command = new AudioCommand(); command->mCommand = EFFECT_SESSION_UPDATE; EffectSessionUpdateData *data = new EffectSessionUpdateData(); - data->mStream = stream; - data->mSessionId = sessionId; + data->mAudioSessionInfo = streamInfo; data->mAdded = added; command->mParam = data; ALOGV("AudioCommandThread() sending effect session update (id=%d) for stream %d (added=%d)", - stream, sessionId, added); + streamInfo->mStream, streamInfo->mSessionId, added); sendCommand(command); } -void AudioPolicyService::AudioCommandThread::releaseOutputSessionEffectsCommand( - audio_io_handle_t output, audio_stream_type_t stream, - audio_unique_id_t sessionId, int delayMs) -{ - sp<AudioCommand> command = new AudioCommand(); - command->mCommand = RELEASE_OUTPUT_SESSION_EFFECTS; - ReleaseOutputSessionEffectsData *data = new ReleaseOutputSessionEffectsData(); - data->mOutput = output; - data->mStream = stream; - data->mSessionId = sessionId; - command->mParam = data; - ALOGV("AudioCommandThread() sending release output session effects (id=%d) for stream %d", - sessionId, stream); - sendCommand(command, delayMs); -} - - status_t AudioPolicyService::AudioCommandThread::sendCommand(sp<AudioCommand>& command, int delayMs) { { diff --git a/services/audiopolicy/service/AudioPolicyService.h b/services/audiopolicy/service/AudioPolicyService.h index 9b17a26..b7f55ae 100644 --- a/services/audiopolicy/service/AudioPolicyService.h +++ b/services/audiopolicy/service/AudioPolicyService.h @@ -202,7 +202,8 @@ public: audio_io_handle_t *handle); virtual status_t stopAudioSource(audio_io_handle_t handle); - virtual status_t setEffectSessionCallbacksEnabled(bool enabled); + virtual status_t listAudioSessions(audio_stream_type_t stream, + Vector< sp<AudioSessionInfo>>& sessions); status_t doStartOutput(audio_io_handle_t output, audio_stream_type_t stream, @@ -231,14 +232,8 @@ public: void onDynamicPolicyMixStateUpdate(String8 regId, int32_t state); void doOnDynamicPolicyMixStateUpdate(String8 regId, int32_t state); - void onOutputSessionEffectsUpdate(audio_stream_type_t stream, - audio_unique_id_t sessionId, bool added); - void doOnOutputSessionEffectsUpdate(audio_stream_type_t stream, - audio_unique_id_t sessionId, bool added); - void releaseOutputSessionEffectsDelayed(audio_io_handle_t output, - audio_stream_type_t stream, - audio_unique_id_t sessionId, - int delayMs); + void onOutputSessionEffectsUpdate(sp<AudioSessionInfo>& info, bool added); + void doOnOutputSessionEffectsUpdate(sp<AudioSessionInfo>& info, bool added); private: AudioPolicyService() ANDROID_API; @@ -273,7 +268,6 @@ private: SET_AUDIOPORT_CONFIG, DYN_POLICY_MIX_STATE_UPDATE, EFFECT_SESSION_UPDATE, - RELEASE_OUTPUT_SESSION_EFFECTS, }; AudioCommandThread (String8 name, const wp<AudioPolicyService>& service); @@ -316,12 +310,7 @@ private: int delayMs); void dynamicPolicyMixStateUpdateCommand(String8 regId, int32_t state); void insertCommand_l(AudioCommand *command, int delayMs = 0); - void effectSessionUpdateCommand(audio_stream_type_t stream, - audio_unique_id_t sessionId, bool added); - void releaseOutputSessionEffectsCommand(audio_io_handle_t output, - audio_stream_type_t stream, - audio_unique_id_t sessionId, - int delayMs = 0); + void effectSessionUpdateCommand(sp<AudioSessionInfo>& info, bool added); private: class AudioCommandData; @@ -420,18 +409,10 @@ private: class EffectSessionUpdateData : public AudioCommandData { public: - audio_stream_type_t mStream; - audio_unique_id_t mSessionId; + sp<AudioSessionInfo> mAudioSessionInfo; bool mAdded; }; - class ReleaseOutputSessionEffectsData : public AudioCommandData { - public: - audio_io_handle_t mOutput; - audio_stream_type_t mStream; - audio_unique_id_t mSessionId; - }; - Mutex mLock; Condition mWaitWorkCV; Vector < sp<AudioCommand> > mAudioCommands; // list of pending commands @@ -541,8 +522,8 @@ private: virtual audio_unique_id_t newAudioUniqueId(); - virtual void onOutputSessionEffectsUpdate(audio_stream_type_t stream, - audio_unique_id_t sessionId, bool added); + virtual void onOutputSessionEffectsUpdate(sp<AudioSessionInfo>& info, bool added); + private: AudioPolicyService *mAudioPolicyService; @@ -560,9 +541,8 @@ private: void onAudioPatchListUpdate(); void onDynamicPolicyMixStateUpdate(String8 regId, int32_t state); void setAudioPortCallbacksEnabled(bool enabled); - void setEffectSessionCallbacksEnabled(bool enabled); - void onOutputSessionEffectsUpdate(audio_stream_type_t stream, - audio_unique_id_t sessionId, bool added); + void onOutputSessionEffectsUpdate(sp<AudioSessionInfo>& info, + bool added); // IBinder::DeathRecipient virtual void binderDied(const wp<IBinder>& who); @@ -574,7 +554,6 @@ private: const uid_t mUid; const sp<IAudioPolicyServiceClient> mAudioPolicyServiceClient; bool mAudioPortCallbacksEnabled; - bool mEffectSessionCallbacksEnabled; }; // Internal dump utilities. |