From d7a4d6dcb9a82eb5daad7ab897a1be5357ce19c3 Mon Sep 17 00:00:00 2001 From: "Wang, Jianfeng XA" Date: Tue, 27 May 2014 17:48:08 +0900 Subject: libcameraservice: Allow media server to disconnect camera even unlocked The camera service may fail to release the camera hardware instance in some use cases. When an application unlocked the camera before disconnect, disconnect from the application will not be accepted. And disconnect from media server will not be accepted also. Then, the camera hardware instance will not be released and a resource leak will be caused. Allow media server to disconnect the camera at all times even if the camera is unlocked. Change-Id: Icd5ed81bed242fa5947aa40ca85e4ca7fa7286e7 --- services/camera/libcameraservice/api1/CameraClient.cpp | 5 ----- 1 file changed, 5 deletions(-) (limited to 'services') diff --git a/services/camera/libcameraservice/api1/CameraClient.cpp b/services/camera/libcameraservice/api1/CameraClient.cpp index 55555fd..735a4ae 100644 --- a/services/camera/libcameraservice/api1/CameraClient.cpp +++ b/services/camera/libcameraservice/api1/CameraClient.cpp @@ -243,11 +243,6 @@ void CameraClient::disconnect() { return; } - if (mClientPid <= 0) { - LOG1("camera is unlocked (mClientPid = %d), don't tear down hardware", mClientPid); - return; - } - // Make sure disconnect() is done once and once only, whether it is called // from the user directly, or called by the destructor. if (mHardware == 0) return; -- cgit v1.1 From 5a4c1f8f409a28508075562277e4d19c4650513c Mon Sep 17 00:00:00 2001 From: Bin Chen Date: Mon, 22 Feb 2016 18:19:58 +1100 Subject: CameraService: Fix cameraId type of onDeviceStatusChanged The cameraId should be of type int, instead of camera_device_status_t. Change-Id: I26d587bb74f7100028f09928984c2e8dad6eebef Signed-off-by: Bin Chen --- services/camera/libcameraservice/CameraService.cpp | 4 ++-- services/camera/libcameraservice/CameraService.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'services') diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp index a560b93..3c9fd16 100644 --- a/services/camera/libcameraservice/CameraService.cpp +++ b/services/camera/libcameraservice/CameraService.cpp @@ -81,7 +81,7 @@ static void camera_device_status_change( sp cs = const_cast( static_cast(callbacks)); - cs->onDeviceStatusChanged(static_cast(camera_id), + cs->onDeviceStatusChanged(camera_id, static_cast(new_status)); } @@ -277,7 +277,7 @@ CameraService::~CameraService() { gCameraService = nullptr; } -void CameraService::onDeviceStatusChanged(camera_device_status_t cameraId, +void CameraService::onDeviceStatusChanged(int cameraId, camera_device_status_t newStatus) { ALOGI("%s: Status changed for cameraId=%d, newStatus=%d", __FUNCTION__, cameraId, newStatus); diff --git a/services/camera/libcameraservice/CameraService.h b/services/camera/libcameraservice/CameraService.h index ee4c3f9..53233bd 100644 --- a/services/camera/libcameraservice/CameraService.h +++ b/services/camera/libcameraservice/CameraService.h @@ -102,7 +102,7 @@ public: ///////////////////////////////////////////////////////////////////// // HAL Callbacks - virtual void onDeviceStatusChanged(camera_device_status_t cameraId, + virtual void onDeviceStatusChanged(int cameraId, camera_device_status_t newStatus); virtual void onTorchStatusChanged(const String8& cameraId, ICameraServiceListener::TorchStatus -- cgit v1.1 From 27ee071a98549919b92c195d51455c62a83ddd1b Mon Sep 17 00:00:00 2001 From: Mohan Kumar Date: Fri, 12 Dec 2014 15:16:46 +0530 Subject: audioflinger: clear mMixerBuffer if frame is not ready Clear the mMixerBuffer if frame is not ready before the FastMixer starts processing. Otherwise it might result in large glitches on output device due to junk data present in the mixbuffer. Change-Id: I9f025234d4ac100f85d2ec67c06a8df4195bea98 --- services/audioflinger/FastMixer.cpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) (limited to 'services') diff --git a/services/audioflinger/FastMixer.cpp b/services/audioflinger/FastMixer.cpp index 45c68b5..2bc8066 100644 --- a/services/audioflinger/FastMixer.cpp +++ b/services/audioflinger/FastMixer.cpp @@ -334,6 +334,11 @@ void FastMixer::onWork() if ((command & FastMixerState::MIX) && (mMixer != NULL) && mIsWarm) { ALOG_ASSERT(mMixerBuffer != NULL); + + // AudioMixer::mState.enabledTracks is undefined if mState.hook == process__validate, + // so we keep a side copy of enabledTracks + bool anyEnabledTracks = false; + // for each track, update volume and check for underrun unsigned currentTrackMask = current->mTrackMask; while (currentTrackMask != 0) { @@ -392,11 +397,13 @@ void FastMixer::onWork() underruns.mBitFields.mPartial++; underruns.mBitFields.mMostRecent = UNDERRUN_PARTIAL; mMixer->enable(name); + anyEnabledTracks = true; } } else { underruns.mBitFields.mFull++; underruns.mBitFields.mMostRecent = UNDERRUN_FULL; mMixer->enable(name); + anyEnabledTracks = true; } ftDump->mUnderruns = underruns; ftDump->mFramesReady = framesReady; @@ -407,9 +414,14 @@ void FastMixer::onWork() pts = AudioBufferProvider::kInvalidPTS; } - // process() is CPU-bound - mMixer->process(pts); - mMixerBufferState = MIXED; + if (anyEnabledTracks) { + // process() is CPU-bound + mMixer->process(pts); + mMixerBufferState = MIXED; + } else if (mMixerBufferState != ZEROED) { + mMixerBufferState = UNDEFINED; + } + } else if (mMixerBufferState == MIXED) { mMixerBufferState = UNDEFINED; } -- cgit v1.1 From b04aee833c5cfb6b31b8558350feb14bb1a0f353 Mon Sep 17 00:00:00 2001 From: Chien-Yu Chen Date: Wed, 9 Mar 2016 12:21:01 -0800 Subject: Camera3Device: Validate template ID Validate template ID before creating a default request. Bug: 26866110 Bug: 27568958 Change-Id: Ifda457024f1d5c2b1382f189c1a8d5fda852d30d --- services/camera/libcameraservice/device3/Camera3Device.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'services') diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp index 50d9d75..8b43154 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.cpp +++ b/services/camera/libcameraservice/device3/Camera3Device.cpp @@ -43,6 +43,7 @@ #include #include +#include "CameraService.h" #include "utils/CameraTraces.h" #include "mediautils/SchedulingPolicyService.h" #include "device3/Camera3Device.h" @@ -1115,6 +1116,13 @@ status_t Camera3Device::createDefaultRequest(int templateId, CameraMetadata *request) { ATRACE_CALL(); ALOGV("%s: for template %d", __FUNCTION__, templateId); + + if (templateId <= 0 || templateId >= CAMERA3_TEMPLATE_COUNT) { + android_errorWriteWithInfoLog(CameraService::SN_EVENT_LOG_ID, "26866110", + IPCThreadState::self()->getCallingUid(), NULL, 0); + return BAD_VALUE; + } + Mutex::Autolock il(mInterfaceLock); Mutex::Autolock l(mLock); -- cgit v1.1 From af76b10d0bce63c7e5896ddbe6fe897ed0110186 Mon Sep 17 00:00:00 2001 From: Weiyin Jiang Date: Mon, 7 Mar 2016 22:12:56 +0800 Subject: audio: allow standby for direct track Delay standby for offload track use case is not suitable for direct track in PCM format, because player torn down doesn't necessarily happen. To avoid AP looping infinitely, allow standby right after direct track in PCM format is paused. CRs-Fixed: 986784 Change-Id: Id0026ac9891a12acc4affa446b2bc841559fcc28 --- services/audioflinger/Threads.cpp | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'services') diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp index c3ee6c2..6f223af 100644 --- a/services/audioflinger/Threads.cpp +++ b/services/audioflinger/Threads.cpp @@ -4863,6 +4863,10 @@ bool AudioFlinger::DirectOutputThread::shouldStandby_l() bool trackPaused = false; bool trackStopped = false; + if ((mType == DIRECT) && audio_is_linear_pcm(mFormat) && !usesHwAvSync()) { + return !mStandby; + } + // do not put the HAL in standby when paused. AwesomePlayer clear the offloaded AudioTrack // after a timeout and we will enter standby then. if (mTracks.size() > 0) { -- cgit v1.1 From e5c901e16fdb7ed1d37bd7aa1232973588692a91 Mon Sep 17 00:00:00 2001 From: Weiyin Jiang Date: Fri, 26 Feb 2016 18:07:49 +0800 Subject: audio: use offload standby delay for direct pcm Default standby delay for legacy direct is too aggressive for track offloaded use case. Using offload standby delay instead, which allows sufficient time for track transition before standby the output. CRs-Fixed: 982822 Change-Id: Ifd0e39c5b3fe4a4af9f444dbbad21ef1e1a5edfa --- services/audioflinger/Threads.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'services') diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp index 6f223af..e1e4980 100644 --- a/services/audioflinger/Threads.cpp +++ b/services/audioflinger/Threads.cpp @@ -4987,6 +4987,8 @@ void AudioFlinger::DirectOutputThread::cacheParameters_l() mStandbyDelayNs = 0; } else if ((mType == OFFLOAD) && !audio_is_linear_pcm(mFormat)) { mStandbyDelayNs = kOffloadStandbyDelayNs; + } else if (mType == DIRECT && mIsDirectPcm) { + mStandbyDelayNs = kOffloadStandbyDelayNs; } else { mStandbyDelayNs = microseconds(mActiveSleepTimeUs*2); } -- cgit v1.1 From e13b58b988ab642d4ae5ca6d0a89013510714956 Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Sun, 3 Apr 2016 11:50:58 -0700 Subject: audio: Send effect session notifications after startOutput success * Because we get a hellish firestorm during offload fallback, and our effects library really dislikes this. Change-Id: I22adb55d04502eedf03ce22f35f8b9f61de1c7b0 --- services/audiopolicy/service/AudioPolicyEffects.cpp | 3 +-- services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp | 13 ++++++++++--- 2 files changed, 11 insertions(+), 5 deletions(-) (limited to 'services') diff --git a/services/audiopolicy/service/AudioPolicyEffects.cpp b/services/audiopolicy/service/AudioPolicyEffects.cpp index f2d7f6f..725bc64 100644 --- a/services/audiopolicy/service/AudioPolicyEffects.cpp +++ b/services/audiopolicy/service/AudioPolicyEffects.cpp @@ -246,8 +246,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); @@ -275,6 +273,7 @@ status_t AudioPolicyEffects::addOutputSessionEffects(audio_io_handle_t output, } procDesc->setProcessorEnabled(true); + return 1; } return status; } diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp index c0d3866..766012e 100644 --- a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp +++ b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp @@ -206,15 +206,22 @@ status_t AudioPolicyService::doStartOutput(audio_io_handle_t output, Mutex::Autolock _l(mLock); audioPolicyEffects = mAudioPolicyEffects; } + + status_t status = NO_ERROR; if (audioPolicyEffects != 0) { // create audio processors according to stream - status_t status = audioPolicyEffects->addOutputSessionEffects(output, stream, session); - if (status != NO_ERROR && status != ALREADY_EXISTS) { + status = audioPolicyEffects->addOutputSessionEffects(output, stream, session); + if (status <= 0 && (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); + status_t status2 = mAudioPolicyManager->startOutput(output, stream, session); + + if (audioPolicyEffects != 0 && status > 0 && status2 == NO_ERROR) { + onOutputSessionEffectsUpdate(stream, session, true); + } + return status2; } status_t AudioPolicyService::stopOutput(audio_io_handle_t output, -- cgit v1.1 From a4123803d0a0e9e0c69faa4207d357cc74a65d58 Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Wed, 6 Apr 2016 18:35:02 -0700 Subject: audiopolicy: Be a little smarter with auto-attach * The edge cases, ZOMG! * Instead of relying on effects to be automatically attached, let's just always notify userspace and send a bit more information. This lets the application decide if effects should be attached rather than relying on a hard-coded configuration file. * Perform the setup in getOutputForAttr, but do it on the command thread so we don't block the client. OPO-593 Change-Id: I3900b349f2e895d51fa3a3dcc2de0c4bdf6dbc08 --- services/audiopolicy/AudioPolicyInterface.h | 5 +- .../audiopolicy/service/AudioPolicyClientImpl.cpp | 7 ++- .../audiopolicy/service/AudioPolicyEffects.cpp | 32 +++++++++- services/audiopolicy/service/AudioPolicyEffects.h | 5 ++ .../service/AudioPolicyInterfaceImpl.cpp | 68 +++++++++++--------- .../audiopolicy/service/AudioPolicyService.cpp | 72 +++++++++++++++++++--- services/audiopolicy/service/AudioPolicyService.h | 55 +++++++++++++++-- 7 files changed, 195 insertions(+), 49 deletions(-) (limited to 'services') diff --git a/services/audiopolicy/AudioPolicyInterface.h b/services/audiopolicy/AudioPolicyInterface.h index a5edc14..bf9dd64 100644 --- a/services/audiopolicy/AudioPolicyInterface.h +++ b/services/audiopolicy/AudioPolicyInterface.h @@ -333,7 +333,10 @@ 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; + audio_session_t sessionId, + audio_output_flags_t flags, + audio_channel_mask_t channelMask, + uid_t uid, bool added) = 0; }; extern "C" AudioPolicyInterface* createAudioPolicyManager(AudioPolicyClientInterface *clientInterface); diff --git a/services/audiopolicy/service/AudioPolicyClientImpl.cpp b/services/audiopolicy/service/AudioPolicyClientImpl.cpp index d71daa4..f1a2ae9 100644 --- a/services/audiopolicy/service/AudioPolicyClientImpl.cpp +++ b/services/audiopolicy/service/AudioPolicyClientImpl.cpp @@ -220,9 +220,12 @@ void AudioPolicyService::AudioPolicyClient::onDynamicPolicyMixStateUpdate( } void AudioPolicyService::AudioPolicyClient::onOutputSessionEffectsUpdate( - audio_stream_type_t stream, audio_unique_id_t sessionId, bool added) + audio_stream_type_t stream, audio_session_t sessionId, + audio_output_flags_t flags, audio_channel_mask_t channelMask, + uid_t uid, bool added) { - mAudioPolicyService->onOutputSessionEffectsUpdate(stream, sessionId, added); + mAudioPolicyService->onOutputSessionEffectsUpdate(stream, sessionId, + flags, channelMask, uid, added); } audio_unique_id_t AudioPolicyService::AudioPolicyClient::newAudioUniqueId() diff --git a/services/audiopolicy/service/AudioPolicyEffects.cpp b/services/audiopolicy/service/AudioPolicyEffects.cpp index 725bc64..bd1cc33 100644 --- a/services/audiopolicy/service/AudioPolicyEffects.cpp +++ b/services/audiopolicy/service/AudioPolicyEffects.cpp @@ -246,6 +246,7 @@ status_t AudioPolicyEffects::addOutputSessionEffects(audio_io_handle_t output, if (idx < 0) { procDesc = new EffectVector(audioSession); mOutputSessions.add(audioSession, procDesc); + } else { // EffectVector is existing and we just need to increase ref count procDesc = mOutputSessions.valueAt(idx); @@ -273,11 +274,35 @@ status_t AudioPolicyEffects::addOutputSessionEffects(audio_io_handle_t output, } procDesc->setProcessorEnabled(true); - return 1; } return status; } +status_t AudioPolicyEffects::doAddOutputSessionEffects(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; + } + ALOGV("doAddOutputSessionEffects()"); + + // create audio processors according to stream + status_t status = addOutputSessionEffects(output, stream, session); + if (status <= 0 && (status != NO_ERROR && status != ALREADY_EXISTS)) { + ALOGW("Failed to add effects on session %d", session); + } + + // notify listeners + mAudioPolicyService->onOutputSessionEffectsUpdate(stream, (audio_session_t)session, + flags, channelMask, uid, true); + + // Never return an error if effects setup fails. + return NO_ERROR; +} + status_t AudioPolicyEffects::releaseOutputSessionEffects(audio_io_handle_t output, audio_stream_type_t stream, int audioSession) @@ -335,10 +360,13 @@ status_t AudioPolicyEffects::doReleaseOutputSessionEffects(audio_io_handle_t out procDesc->mEffects.clear(); delete procDesc; mOutputSessions.removeItemsAt(index); - mAudioPolicyService->onOutputSessionEffectsUpdate(stream, audioSession, false); ALOGV("doReleaseOutputSessionEffects(): output processing released from session: %d", audioSession); } + + mAudioPolicyService->onOutputSessionEffectsUpdate(stream, (audio_session_t)audioSession, + AUDIO_OUTPUT_FLAG_NONE, 0, -1, false); + return status; } diff --git a/services/audiopolicy/service/AudioPolicyEffects.h b/services/audiopolicy/service/AudioPolicyEffects.h index 7988515..6364e40 100644 --- a/services/audiopolicy/service/AudioPolicyEffects.h +++ b/services/audiopolicy/service/AudioPolicyEffects.h @@ -91,6 +91,11 @@ public: audio_stream_type_t stream, int audioSession); + status_t doAddOutputSessionEffects(audio_io_handle_t output, + audio_stream_type_t stream, + int audioSession, + audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE, + audio_channel_mask_t channelMask = 0, uid_t uid = 0); private: diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp index 766012e..51af20b 100644 --- a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp +++ b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp @@ -18,6 +18,7 @@ //#define LOG_NDEBUG 0 #include +#include #include "AudioPolicyService.h" #include "ServiceUtilities.h" @@ -162,18 +163,47 @@ status_t AudioPolicyService::getOutputForAttr(const audio_attributes_t *attr, return NO_INIT; } ALOGV("getOutput()"); - Mutex::Autolock _l(mLock); + status_t status; + sp 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; + } + + if (audioPolicyEffects != 0) { + addOutputSessionEffects(*output, *stream, session, flags, channelMask, uid); + } + + return status; +} + +status_t AudioPolicyService::addOutputSessionEffects(audio_io_handle_t output, + audio_stream_type_t stream, + audio_session_t session, + audio_output_flags_t flags, + audio_channel_mask_t channelMask, + uid_t uid) +{ + if (uint32_t(stream) >= AUDIO_STREAM_CNT) { + return BAD_VALUE; } - return mAudioPolicyManager->getOutputForAttr(attr, output, session, stream, uid, samplingRate, - format, channelMask, flags, selectedDeviceId, offloadInfo); + if (mAudioPolicyManager == NULL) { + return NO_INIT; + } + ALOGV("addOutputSessionEffects()"); + return mOutputCommandThread->addOutputSessionEffectsCommand( + output, stream, session, flags, channelMask, uid); } status_t AudioPolicyService::startOutput(audio_io_handle_t output, @@ -201,27 +231,9 @@ status_t AudioPolicyService::doStartOutput(audio_io_handle_t output, return NO_INIT; } ALOGV("doStartOutput()"); - spaudioPolicyEffects; - { - Mutex::Autolock _l(mLock); - audioPolicyEffects = mAudioPolicyEffects; - } - - status_t status = NO_ERROR; - if (audioPolicyEffects != 0) { - // create audio processors according to stream - status = audioPolicyEffects->addOutputSessionEffects(output, stream, session); - if (status <= 0 && (status != NO_ERROR && status != ALREADY_EXISTS)) { - ALOGW("Failed to add effects on session %d", session); - } - } Mutex::Autolock _l(mLock); - status_t status2 = mAudioPolicyManager->startOutput(output, stream, session); - if (audioPolicyEffects != 0 && status > 0 && status2 == NO_ERROR) { - onOutputSessionEffectsUpdate(stream, session, true); - } - return status2; + return mAudioPolicyManager->startOutput(output, stream, session); } status_t AudioPolicyService::stopOutput(audio_io_handle_t output, diff --git a/services/audiopolicy/service/AudioPolicyService.cpp b/services/audiopolicy/service/AudioPolicyService.cpp index 58cfe37..0e871c2 100644 --- a/services/audiopolicy/service/AudioPolicyService.cpp +++ b/services/audiopolicy/service/AudioPolicyService.cpp @@ -272,21 +272,27 @@ status_t AudioPolicyService::clientSetAudioPortConfig(const struct audio_port_co } void AudioPolicyService::onOutputSessionEffectsUpdate(audio_stream_type_t stream, - audio_unique_id_t sessionId, - bool added) + audio_session_t sessionId, + audio_output_flags_t flags, + audio_channel_mask_t channelMask, + uid_t uid, bool added) { ALOGV("AudioPolicyService::onOutputSessionEffectsUpdate(%d, %d, %d)", stream, sessionId, added); - mOutputCommandThread->effectSessionUpdateCommand(stream, sessionId, added); + mOutputCommandThread->effectSessionUpdateCommand(stream, sessionId, + flags, channelMask, uid, added); } void AudioPolicyService::doOnOutputSessionEffectsUpdate(audio_stream_type_t stream, - audio_unique_id_t sessionId, - bool added) + audio_session_t sessionId, + audio_output_flags_t flags, + audio_channel_mask_t channelMask, + uid_t uid, 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(stream, sessionId, + flags, channelMask, uid, added); } } @@ -327,10 +333,13 @@ void AudioPolicyService::NotificationClient::onAudioPatchListUpdate() } void AudioPolicyService::NotificationClient::onOutputSessionEffectsUpdate( - audio_stream_type_t stream, audio_unique_id_t sessionId, bool added) + audio_stream_type_t stream, audio_session_t sessionId, + audio_output_flags_t flags, audio_channel_mask_t channelMask, + uid_t uid, bool added) { if (mAudioPolicyServiceClient != 0 && mEffectSessionCallbacksEnabled) { - mAudioPolicyServiceClient->onOutputSessionEffectsUpdate(stream, sessionId, added); + mAudioPolicyServiceClient->onOutputSessionEffectsUpdate(stream, sessionId, + flags, channelMask, uid, added); } } @@ -645,7 +654,8 @@ bool AudioPolicyService::AudioCommandThread::threadLoop() break; } mLock.unlock(); - svc->doOnOutputSessionEffectsUpdate(data->mStream, data->mSessionId, data->mAdded); + svc->doOnOutputSessionEffectsUpdate(data->mStream, data->mSessionId, + data->mFlags, data->mChannelMask, data->mUid, data->mAdded); mLock.lock(); } break; case RELEASE_OUTPUT_SESSION_EFFECTS: { @@ -662,6 +672,20 @@ bool AudioPolicyService::AudioCommandThread::threadLoop() data->mOutput, data->mStream, data->mSessionId); mLock.lock(); } break; + case ADD_OUTPUT_SESSION_EFFECTS: { + AddOutputSessionEffectsData *data = (AddOutputSessionEffectsData *)command->mParam.get(); + ALOGV("AudioCommandThread() processing add output session effects %d", + data->mOutput); + svc = mService.promote(); + if (svc == 0) { + break; + } + mLock.unlock(); + svc->mAudioPolicyEffects->doAddOutputSessionEffects( + data->mOutput, data->mStream, data->mSessionId, + data->mFlags, data->mChannelMask, data->mUid); + mLock.lock(); + }break; default: @@ -828,6 +852,29 @@ status_t AudioPolicyService::AudioCommandThread::startOutputCommand(audio_io_han return sendCommand(command); } +status_t AudioPolicyService::AudioCommandThread::addOutputSessionEffectsCommand(audio_io_handle_t output, + audio_stream_type_t stream, + audio_session_t session, + audio_output_flags_t flags, + audio_channel_mask_t channelMask, + uid_t uid) +{ + sp command = new AudioCommand(); + command->mCommand = ADD_OUTPUT_SESSION_EFFECTS; + sp data = new AddOutputSessionEffectsData(); + data->mOutput = output; + data->mStream = stream; + data->mSessionId = session; + data->mFlags = flags; + data->mChannelMask = channelMask; + data->mUid = uid; + command->mParam = data; + command->mWaitStatus = false; + ALOGV("AudioCommandThread() adding start output %d", output); + return sendCommand(command); +} + + void AudioPolicyService::AudioCommandThread::stopOutputCommand(audio_io_handle_t output, audio_stream_type_t stream, audio_session_t session) @@ -937,13 +984,18 @@ void AudioPolicyService::AudioCommandThread::dynamicPolicyMixStateUpdateCommand( } void AudioPolicyService::AudioCommandThread::effectSessionUpdateCommand( - audio_stream_type_t stream, audio_unique_id_t sessionId, bool added) + audio_stream_type_t stream, audio_session_t sessionId, + audio_output_flags_t flags, audio_channel_mask_t channelMask, + uid_t uid, bool added) { sp command = new AudioCommand(); command->mCommand = EFFECT_SESSION_UPDATE; EffectSessionUpdateData *data = new EffectSessionUpdateData(); data->mStream = stream; data->mSessionId = sessionId; + data->mFlags = flags; + data->mChannelMask = channelMask; + data->mUid = uid; data->mAdded = added; command->mParam = data; ALOGV("AudioCommandThread() sending effect session update (id=%d) for stream %d (added=%d)", diff --git a/services/audiopolicy/service/AudioPolicyService.h b/services/audiopolicy/service/AudioPolicyService.h index 9b17a26..01e0e5e 100644 --- a/services/audiopolicy/service/AudioPolicyService.h +++ b/services/audiopolicy/service/AudioPolicyService.h @@ -204,6 +204,13 @@ public: virtual status_t setEffectSessionCallbacksEnabled(bool enabled); + virtual status_t addOutputSessionEffects(audio_io_handle_t output, + audio_stream_type_t stream, + audio_session_t session, + audio_output_flags_t flags, + audio_channel_mask_t channelMask, + uid_t uid); + status_t doStartOutput(audio_io_handle_t output, audio_stream_type_t stream, audio_session_t session); @@ -232,9 +239,15 @@ public: void doOnDynamicPolicyMixStateUpdate(String8 regId, int32_t state); void onOutputSessionEffectsUpdate(audio_stream_type_t stream, - audio_unique_id_t sessionId, bool added); + audio_session_t sessionId, + audio_output_flags_t flags, + audio_channel_mask_t channelMask, + uid_t uid, bool added); void doOnOutputSessionEffectsUpdate(audio_stream_type_t stream, - audio_unique_id_t sessionId, bool added); + audio_session_t sessionId, + audio_output_flags_t flags, + audio_channel_mask_t channelMask, + uid_t uid, bool added); void releaseOutputSessionEffectsDelayed(audio_io_handle_t output, audio_stream_type_t stream, audio_unique_id_t sessionId, @@ -274,6 +287,7 @@ private: DYN_POLICY_MIX_STATE_UPDATE, EFFECT_SESSION_UPDATE, RELEASE_OUTPUT_SESSION_EFFECTS, + ADD_OUTPUT_SESSION_EFFECTS }; AudioCommandThread (String8 name, const wp& service); @@ -317,11 +331,21 @@ private: 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); + audio_session_t sessionId, + audio_output_flags_t flags, + audio_channel_mask_t channelMask, + uid_t uid, bool added); void releaseOutputSessionEffectsCommand(audio_io_handle_t output, audio_stream_type_t stream, audio_unique_id_t sessionId, int delayMs = 0); + status_t addOutputSessionEffectsCommand(audio_io_handle_t output, + audio_stream_type_t stream, + audio_session_t sessionId, + audio_output_flags_t flags, + audio_channel_mask_t channelMask, + uid_t uid); + private: class AudioCommandData; @@ -421,7 +445,10 @@ private: class EffectSessionUpdateData : public AudioCommandData { public: audio_stream_type_t mStream; - audio_unique_id_t mSessionId; + audio_session_t mSessionId; + audio_output_flags_t mFlags; + audio_channel_mask_t mChannelMask; + uid_t mUid; bool mAdded; }; @@ -432,6 +459,16 @@ private: audio_unique_id_t mSessionId; }; + class AddOutputSessionEffectsData : public AudioCommandData { + public: + audio_io_handle_t mOutput; + audio_stream_type_t mStream; + audio_session_t mSessionId; + audio_output_flags_t mFlags; + audio_channel_mask_t mChannelMask; + uid_t mUid; + }; + Mutex mLock; Condition mWaitWorkCV; Vector < sp > mAudioCommands; // list of pending commands @@ -542,7 +579,10 @@ private: virtual audio_unique_id_t newAudioUniqueId(); virtual void onOutputSessionEffectsUpdate(audio_stream_type_t stream, - audio_unique_id_t sessionId, bool added); + audio_session_t sessionId, + audio_output_flags_t flags, + audio_channel_mask_t channelMask, + uid_t uid, bool added); private: AudioPolicyService *mAudioPolicyService; @@ -562,7 +602,10 @@ private: void setAudioPortCallbacksEnabled(bool enabled); void setEffectSessionCallbacksEnabled(bool enabled); void onOutputSessionEffectsUpdate(audio_stream_type_t stream, - audio_unique_id_t sessionId, bool added); + audio_session_t sessionId, + audio_output_flags_t flags, + audio_channel_mask_t channelMask, + uid_t uid, bool added); // IBinder::DeathRecipient virtual void binderDied(const wp& who); -- cgit v1.1 From baf93ea325ca416aa5a0fc0c6892dda4cef1f444 Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Wed, 16 Mar 2016 20:02:38 +0000 Subject: CameraClient: MTK Support Return on MTK hardware, the HAL does this internally and duplicating it here causes an infinite loop. Change-Id: I5bdb925ddb49980747b58dfae4543f812cef4c7d --- services/camera/libcameraservice/api1/CameraClient.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'services') diff --git a/services/camera/libcameraservice/api1/CameraClient.cpp b/services/camera/libcameraservice/api1/CameraClient.cpp index 735a4ae..af46d63 100644 --- a/services/camera/libcameraservice/api1/CameraClient.cpp +++ b/services/camera/libcameraservice/api1/CameraClient.cpp @@ -695,6 +695,9 @@ void CameraClient::disableMsgType(int32_t msgType) { #define CHECK_MESSAGE_INTERVAL 10 // 10ms bool CameraClient::lockIfMessageWanted(int32_t msgType) { +#ifdef MTK_HARDWARE + return true; +#endif int sleepCount = 0; while (mMsgEnabled & msgType) { if (mLock.tryLock() == NO_ERROR) { -- cgit v1.1 From d38f17584c22d77b8b0bac85279ce72e1576c34c Mon Sep 17 00:00:00 2001 From: Ramjee Singh Date: Thu, 22 Oct 2015 12:57:55 +0530 Subject: audioflinger: Compile 192k resampler for 32 bit environment Current makefile compiles the resampler only for 64 bit environment. Allow compilation for 32 bit environment as well. CRs-Fixed: 735776 Change-Id: I626725551af73fc5ea98a7dbf87cacea9dbbc0ef --- services/audioflinger/Android.mk | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'services') diff --git a/services/audioflinger/Android.mk b/services/audioflinger/Android.mk index 0dd2af6..8ea26d3 100644 --- a/services/audioflinger/Android.mk +++ b/services/audioflinger/Android.mk @@ -160,12 +160,19 @@ LOCAL_SHARED_LIBRARIES := \ libaudioutils #QTI Resampler -ifeq ($(call is-vendor-board-platform,QCOM), true) -ifeq ($(strip $(AUDIO_FEATURE_ENABLED_EXTN_RESAMPLER)), true) +ifeq ($(call is-vendor-board-platform,QCOM),true) +ifeq ($(strip $(AUDIO_FEATURE_ENABLED_EXTN_RESAMPLER)),true) +ifdef TARGET_2ND_ARCH LOCAL_SRC_FILES_$(TARGET_2ND_ARCH) += AudioResamplerQTI.cpp.arm LOCAL_C_INCLUDES_$(TARGET_2ND_ARCH) += $(TARGET_OUT_HEADERS)/mm-audio/audio-src LOCAL_SHARED_LIBRARIES_$(TARGET_2ND_ARCH) += libqct_resampler LOCAL_CFLAGS_$(TARGET_2ND_ARCH) += -DQTI_RESAMPLER +else +LOCAL_SRC_FILES += AudioResamplerQTI.cpp.arm +LOCAL_C_INCLUDES += $(TARGET_OUT_HEADERS)/mm-audio/audio-src +LOCAL_SHARED_LIBRARIES += libqct_resampler +LOCAL_CFLAGS += -DQTI_RESAMPLER +endif endif endif #QTI Resampler -- cgit v1.1 From 0d34354e3e6e70ecce4cbef30d7dc6a1b9bcf328 Mon Sep 17 00:00:00 2001 From: Zhou Song Date: Thu, 19 Nov 2015 13:49:18 +0800 Subject: audio: QTI resampler supports for 32 bit input format Configure QTI resampler as 32 bit input format to avoid losing precision. audioflinger: add channel count check to use QTI resampler Change-Id: I8f76dd82b72a0dd8b77343e77e0d0545e1be2114 CRs-Fixed: 940287 Change-Id: I7e1b8582cd6bb106ab0bd25f9bc1bd9e4092318b --- services/audioflinger/AudioMixer.cpp | 3 ++- services/audioflinger/AudioResamplerQTI.cpp | 21 +++++++++++++-------- services/audioflinger/AudioResamplerQTI.h | 2 +- 3 files changed, 16 insertions(+), 10 deletions(-) (limited to 'services') diff --git a/services/audioflinger/AudioMixer.cpp b/services/audioflinger/AudioMixer.cpp index 806eaf1..bb9d4e5 100644 --- a/services/audioflinger/AudioMixer.cpp +++ b/services/audioflinger/AudioMixer.cpp @@ -781,7 +781,8 @@ bool AudioMixer::track_t::setResampler(uint32_t trackSampleRate, uint32_t devSam #ifdef QTI_RESAMPLER if ((trackSampleRate <= QTI_RESAMPLER_MAX_SAMPLERATE) && (trackSampleRate > devSampleRate * 2) && - ((devSampleRate == 48000)||(devSampleRate == 44100))) { + ((devSampleRate == 48000)||(devSampleRate == 44100)) && + (resamplerChannelCount <= 2)) { quality = AudioResampler::QTI_QUALITY; } #endif diff --git a/services/audioflinger/AudioResamplerQTI.cpp b/services/audioflinger/AudioResamplerQTI.cpp index 44b741e..0d57e09 100644 --- a/services/audioflinger/AudioResamplerQTI.cpp +++ b/services/audioflinger/AudioResamplerQTI.cpp @@ -51,8 +51,9 @@ size_t AudioResamplerQTI::resample(int32_t* out, size_t outFrameCount, { int16_t vl = mVolume[0]; int16_t vr = mVolume[1]; - int16_t *pBuf; + int32_t *pBuf; + int64_t tempL, tempR; size_t inFrameRequest; size_t inFrameCount = getNumInSample(outFrameCount); size_t index = 0; @@ -74,7 +75,7 @@ size_t AudioResamplerQTI::resample(int32_t* out, size_t outFrameCount, if(mResamplerOutBuf) { delete [] mResamplerOutBuf; } - mTmpBuf = new int16_t[inFrameRequest + 16]; + mTmpBuf = new int32_t[inFrameRequest + 16]; mResamplerOutBuf = new int32_t[out_count]; } @@ -95,7 +96,7 @@ size_t AudioResamplerQTI::resample(int32_t* out, size_t outFrameCount, goto resample_exit; } - mTmpBuf[index++] = clamp16_from_float(*((float *)mBuffer.raw + frameIndex++)); + mTmpBuf[index++] = clampq4_27_from_float(*((float *)mBuffer.raw + frameIndex++)); if (frameIndex >= mBuffer.frameCount) { provider->releaseBuffer(&mBuffer); @@ -121,8 +122,8 @@ size_t AudioResamplerQTI::resample(int32_t* out, size_t outFrameCount, goto resample_exit; } - mTmpBuf[index] = clamp16_from_float(*((float *)mBuffer.raw + frameIndex++)); - pBuf[index++] = clamp16_from_float(*((float *)mBuffer.raw + frameIndex++)); + mTmpBuf[index] = clampq4_27_from_float(*((float *)mBuffer.raw + frameIndex++)); + pBuf[index++] = clampq4_27_from_float(*((float *)mBuffer.raw + frameIndex++)); if (frameIndex >= mBuffer.frameCount * 2) { provider->releaseBuffer(&mBuffer); } @@ -133,8 +134,12 @@ size_t AudioResamplerQTI::resample(int32_t* out, size_t outFrameCount, resample_exit: for (int i = 0; i < out_count; i += 2) { - fout[i] += float_from_q4_27(mResamplerOutBuf[i] * vl); - fout[i+1] += float_from_q4_27(mResamplerOutBuf[i+1] * vr); + // Multiplying q4.27 data with u4.12 gain could result in 39 fractional bit data(27+12) + // To get back the 27 fractional bit format output data, do right shift by 12 + tempL = (int64_t)mResamplerOutBuf[i] * vl; + tempR = (int64_t)mResamplerOutBuf[i+1] * vr; + fout[i] += float_from_q4_27((int32_t)(tempL>>12)); + fout[i+1] += float_from_q4_27((int32_t)(tempR>>12)); } mFrameIndex = frameIndex; @@ -151,7 +156,7 @@ void AudioResamplerQTI::setSampleRate(int32_t inSampleRate) void AudioResamplerQTI::init() { - QCT_Resampler::Init(mState, mChannelCount, mInSampleRate, mSampleRate); + QCT_Resampler::Init(mState, mChannelCount, mInSampleRate, mSampleRate, 1/*32bit in*/); } size_t AudioResamplerQTI::getNumInSample(size_t outFrameCount) diff --git a/services/audioflinger/AudioResamplerQTI.h b/services/audioflinger/AudioResamplerQTI.h index 0b30a9f..1cf93fc 100644 --- a/services/audioflinger/AudioResamplerQTI.h +++ b/services/audioflinger/AudioResamplerQTI.h @@ -35,7 +35,7 @@ public: size_t getNumInSample(size_t outFrameCount); int16_t *mState; - int16_t *mTmpBuf; + int32_t *mTmpBuf; int32_t *mResamplerOutBuf; size_t mFrameIndex; size_t stateSize; -- cgit v1.1 From 0ecd6fb627dabf286b7742862e25a592bc1f606c Mon Sep 17 00:00:00 2001 From: Abhishek Kondaveeti Date: Tue, 5 Jan 2016 18:06:15 +0530 Subject: cameraservice: Run HAL3 in Non ZSL mode ZSL mode is not working on HAL3 due to camera backend failures. Run HAL3 forcefully in Non zsl mode till the problem in camera backend fixed. This change will be reverted once the backend issue is fixed. CRs-Fixed: 956182 Change-Id: I1dfcda8eb0fe5cd2d9be6cb2e103f5fd84955ecb --- services/camera/libcameraservice/api1/client2/Parameters.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'services') diff --git a/services/camera/libcameraservice/api1/client2/Parameters.cpp b/services/camera/libcameraservice/api1/client2/Parameters.cpp index 44447b4..4df8361 100644 --- a/services/camera/libcameraservice/api1/client2/Parameters.cpp +++ b/services/camera/libcameraservice/api1/client2/Parameters.cpp @@ -910,7 +910,7 @@ status_t Parameters::initialize(const CameraMetadata *info, int deviceVersion) { } else { zslMode = true; } - + zslMode = false; ALOGI("%s: zslMode: %d slowJpegMode %d", __FUNCTION__, zslMode, slowJpegMode); lightFx = LIGHTFX_NONE; -- cgit v1.1 From d27aa05a1e160badde0ae4ff9b09c72b1d688371 Mon Sep 17 00:00:00 2001 From: Leena Winterrowd Date: Wed, 23 Dec 2015 17:54:33 -0800 Subject: frameworks/av: Fix LOG_NDEBUG compilation issues Fix compilation issues that appear when enabling LOG_NDEBUG. Change-Id: I87e9e5ac66157759dd6f521fab0dd346089a011a --- services/audioflinger/FastCapture.cpp | 1 + services/audioflinger/FastCaptureDumpState.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) (limited to 'services') diff --git a/services/audioflinger/FastCapture.cpp b/services/audioflinger/FastCapture.cpp index 2493fb7..7c8a25f 100644 --- a/services/audioflinger/FastCapture.cpp +++ b/services/audioflinger/FastCapture.cpp @@ -25,6 +25,7 @@ #include #include #include +#include "AudioFlinger.h" #include "FastCapture.h" namespace android { diff --git a/services/audioflinger/FastCaptureDumpState.cpp b/services/audioflinger/FastCaptureDumpState.cpp index 53eeba5..de4a6db 100644 --- a/services/audioflinger/FastCaptureDumpState.cpp +++ b/services/audioflinger/FastCaptureDumpState.cpp @@ -15,7 +15,7 @@ */ #define LOG_TAG "FastCaptureDumpState" -//define LOG_NDEBUG 0 +//#define LOG_NDEBUG 0 #include "Configuration.h" #include -- cgit v1.1 From 489c9fb62f02e1d23d6d6c89b22f7d19c596e65e Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Fri, 15 Apr 2016 01:21:35 -0700 Subject: audiopolicy: Update legacy policy for session callbacks Change-Id: Id6f24195721a48dc5a0d3a7ff7fbee2bd8614128 --- .../service/AudioPolicyInterfaceImplLegacy.cpp | 38 +++++++++++++++------- 1 file changed, 26 insertions(+), 12 deletions(-) (limited to 'services') diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImplLegacy.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImplLegacy.cpp index 318c6d2..e3d69ba 100644 --- a/services/audiopolicy/service/AudioPolicyInterfaceImplLegacy.cpp +++ b/services/audiopolicy/service/AudioPolicyInterfaceImplLegacy.cpp @@ -147,6 +147,24 @@ audio_io_handle_t AudioPolicyService::getOutput(audio_stream_type_t stream, format, channelMask, flags, offloadInfo); } +status_t AudioPolicyService::addOutputSessionEffects(audio_io_handle_t output, + audio_stream_type_t stream, + audio_session_t session, + audio_output_flags_t flags, + audio_channel_mask_t channelMask, + uid_t uid) +{ + if (uint32_t(stream) >= AUDIO_STREAM_CNT) { + return BAD_VALUE; + } + if (mAudioPolicyManager == NULL) { + return NO_INIT; + } + ALOGV("addOutputSessionEffects()"); + return mOutputCommandThread->addOutputSessionEffectsCommand( + output, stream, session, flags, channelMask, uid); +} + status_t AudioPolicyService::startOutput(audio_io_handle_t output, audio_stream_type_t stream, audio_session_t session) @@ -172,18 +190,6 @@ status_t AudioPolicyService::doStartOutput(audio_io_handle_t output, return NO_INIT; } ALOGV("doStartOutput()"); - spaudioPolicyEffects; - { - 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 mpAudioPolicy->start_output(mpAudioPolicy, output, stream, session); @@ -609,6 +615,14 @@ status_t AudioPolicyService::getOutputForAttr(const audio_attributes_t *attr, if (*output == AUDIO_IO_HANDLE_NONE) { return INVALID_OPERATION; } + + Mutex::Autolock _l(mLock); + sp audioPolicyEffects; + audioPolicyEffects = mAudioPolicyEffects; + if (audioPolicyEffects != 0) { + addOutputSessionEffects(*output, *stream, session, flags, channelMask, uid); + } + return NO_ERROR; } -- cgit v1.1 From 32ef0556ae58ff6b7c6fe6fb0a17d3ff7f01de31 Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Tue, 19 Apr 2016 02:41:45 -0700 Subject: audiopolicy: Clean up the mess * Since we're not using the policy directly to auto-attach, let's clean it up and remove the unused stuff. * Also fixes notifications for session release. This reverts commit 47f8c7303c9e2054f1492b02b6c7472385c52dc9. Change-Id: Ibe65f427773c6ef012dde4f289d10e4089c094ea --- .../audiopolicy/service/AudioPolicyEffects.cpp | 42 +----------- services/audiopolicy/service/AudioPolicyEffects.h | 5 -- .../service/AudioPolicyInterfaceImpl.cpp | 33 ++++------ .../service/AudioPolicyInterfaceImplLegacy.cpp | 38 ++++------- .../audiopolicy/service/AudioPolicyService.cpp | 76 ---------------------- services/audiopolicy/service/AudioPolicyService.h | 41 ------------ 6 files changed, 27 insertions(+), 208 deletions(-) (limited to 'services') diff --git a/services/audiopolicy/service/AudioPolicyEffects.cpp b/services/audiopolicy/service/AudioPolicyEffects.cpp index bd1cc33..6a43bea 100644 --- a/services/audiopolicy/service/AudioPolicyEffects.cpp +++ b/services/audiopolicy/service/AudioPolicyEffects.cpp @@ -275,10 +275,11 @@ status_t AudioPolicyEffects::addOutputSessionEffects(audio_io_handle_t output, procDesc->setProcessorEnabled(true); } + return status; } -status_t AudioPolicyEffects::doAddOutputSessionEffects(audio_io_handle_t output, +status_t AudioPolicyEffects::doAddOutputSessionEffects(audio_io_handle_t /* output */, audio_stream_type_t stream, int session, audio_output_flags_t flags, @@ -289,12 +290,6 @@ status_t AudioPolicyEffects::doAddOutputSessionEffects(audio_io_handle_t output, } ALOGV("doAddOutputSessionEffects()"); - // create audio processors according to stream - status_t status = addOutputSessionEffects(output, stream, session); - if (status <= 0 && (status != NO_ERROR && status != ALREADY_EXISTS)) { - ALOGW("Failed to add effects on session %d", session); - } - // notify listeners mAudioPolicyService->onOutputSessionEffectsUpdate(stream, (audio_session_t)session, flags, channelMask, uid, true); @@ -319,42 +314,9 @@ status_t AudioPolicyEffects::releaseOutputSessionEffects(audio_io_handle_t outpu } EffectVector *procDesc = mOutputSessions.valueAt(index); - - // just in case it already has a death wish - if (procDesc->mRefCount == 0) { - return NO_ERROR; - } - procDesc->mRefCount--; ALOGV("releaseOutputSessionEffects(): session: %d, refCount: %d", audioSession, procDesc->mRefCount); - - if (procDesc->mRefCount == 0) { - mAudioPolicyService->releaseOutputSessionEffectsDelayed( - output, stream, audioSession, 10000); - } - - return status; -} - -status_t AudioPolicyEffects::doReleaseOutputSessionEffects(audio_io_handle_t output, - audio_stream_type_t stream, - int audioSession) -{ - status_t status = NO_ERROR; - (void) output; // argument not used for now - - Mutex::Autolock _l(mLock); - ssize_t index = mOutputSessions.indexOfKey(audioSession); - if (index < 0) { - ALOGV("doReleaseOutputSessionEffects: no output processing was attached to this stream"); - return NO_ERROR; - } - - EffectVector *procDesc = mOutputSessions.valueAt(index); - ALOGV("doReleaseOutputSessionEffects(): session: %d, refCount: %d", - audioSession, procDesc->mRefCount); - if (procDesc->mRefCount == 0) { procDesc->setProcessorEnabled(false); procDesc->mEffects.clear(); diff --git a/services/audiopolicy/service/AudioPolicyEffects.h b/services/audiopolicy/service/AudioPolicyEffects.h index 6364e40..1c251e0 100644 --- a/services/audiopolicy/service/AudioPolicyEffects.h +++ b/services/audiopolicy/service/AudioPolicyEffects.h @@ -86,11 +86,6 @@ 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 doAddOutputSessionEffects(audio_io_handle_t output, audio_stream_type_t stream, int audioSession, diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp index 51af20b..96bc4c7 100644 --- a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp +++ b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp @@ -182,30 +182,12 @@ status_t AudioPolicyService::getOutputForAttr(const audio_attributes_t *attr, } if (audioPolicyEffects != 0) { - addOutputSessionEffects(*output, *stream, session, flags, channelMask, uid); + audioPolicyEffects->doAddOutputSessionEffects(*output, *stream, session, flags, channelMask, uid); } return status; } -status_t AudioPolicyService::addOutputSessionEffects(audio_io_handle_t output, - audio_stream_type_t stream, - audio_session_t session, - audio_output_flags_t flags, - audio_channel_mask_t channelMask, - uid_t uid) -{ - if (uint32_t(stream) >= AUDIO_STREAM_CNT) { - return BAD_VALUE; - } - if (mAudioPolicyManager == NULL) { - return NO_INIT; - } - ALOGV("addOutputSessionEffects()"); - return mOutputCommandThread->addOutputSessionEffectsCommand( - output, stream, session, flags, channelMask, uid); -} - status_t AudioPolicyService::startOutput(audio_io_handle_t output, audio_stream_type_t stream, audio_session_t session) @@ -231,8 +213,19 @@ status_t AudioPolicyService::doStartOutput(audio_io_handle_t output, return NO_INIT; } ALOGV("doStartOutput()"); + spaudioPolicyEffects; + { + 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); } diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImplLegacy.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImplLegacy.cpp index e3d69ba..318c6d2 100644 --- a/services/audiopolicy/service/AudioPolicyInterfaceImplLegacy.cpp +++ b/services/audiopolicy/service/AudioPolicyInterfaceImplLegacy.cpp @@ -147,24 +147,6 @@ audio_io_handle_t AudioPolicyService::getOutput(audio_stream_type_t stream, format, channelMask, flags, offloadInfo); } -status_t AudioPolicyService::addOutputSessionEffects(audio_io_handle_t output, - audio_stream_type_t stream, - audio_session_t session, - audio_output_flags_t flags, - audio_channel_mask_t channelMask, - uid_t uid) -{ - if (uint32_t(stream) >= AUDIO_STREAM_CNT) { - return BAD_VALUE; - } - if (mAudioPolicyManager == NULL) { - return NO_INIT; - } - ALOGV("addOutputSessionEffects()"); - return mOutputCommandThread->addOutputSessionEffectsCommand( - output, stream, session, flags, channelMask, uid); -} - status_t AudioPolicyService::startOutput(audio_io_handle_t output, audio_stream_type_t stream, audio_session_t session) @@ -190,6 +172,18 @@ status_t AudioPolicyService::doStartOutput(audio_io_handle_t output, return NO_INIT; } ALOGV("doStartOutput()"); + spaudioPolicyEffects; + { + 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 mpAudioPolicy->start_output(mpAudioPolicy, output, stream, session); @@ -615,14 +609,6 @@ status_t AudioPolicyService::getOutputForAttr(const audio_attributes_t *attr, if (*output == AUDIO_IO_HANDLE_NONE) { return INVALID_OPERATION; } - - Mutex::Autolock _l(mLock); - sp audioPolicyEffects; - audioPolicyEffects = mAudioPolicyEffects; - if (audioPolicyEffects != 0) { - addOutputSessionEffects(*output, *stream, session, flags, channelMask, uid); - } - return NO_ERROR; } diff --git a/services/audiopolicy/service/AudioPolicyService.cpp b/services/audiopolicy/service/AudioPolicyService.cpp index 0e871c2..eead3ac 100644 --- a/services/audiopolicy/service/AudioPolicyService.cpp +++ b/services/audiopolicy/service/AudioPolicyService.cpp @@ -366,13 +366,6 @@ void AudioPolicyService::binderDied(const wp& who) { 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; @@ -658,35 +651,6 @@ bool AudioPolicyService::AudioCommandThread::threadLoop() data->mFlags, data->mChannelMask, data->mUid, 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; - case ADD_OUTPUT_SESSION_EFFECTS: { - AddOutputSessionEffectsData *data = (AddOutputSessionEffectsData *)command->mParam.get(); - ALOGV("AudioCommandThread() processing add output session effects %d", - data->mOutput); - svc = mService.promote(); - if (svc == 0) { - break; - } - mLock.unlock(); - svc->mAudioPolicyEffects->doAddOutputSessionEffects( - data->mOutput, data->mStream, data->mSessionId, - data->mFlags, data->mChannelMask, data->mUid); - mLock.lock(); - }break; - default: ALOGW("AudioCommandThread() unknown command %d", command->mCommand); @@ -852,29 +816,6 @@ status_t AudioPolicyService::AudioCommandThread::startOutputCommand(audio_io_han return sendCommand(command); } -status_t AudioPolicyService::AudioCommandThread::addOutputSessionEffectsCommand(audio_io_handle_t output, - audio_stream_type_t stream, - audio_session_t session, - audio_output_flags_t flags, - audio_channel_mask_t channelMask, - uid_t uid) -{ - sp command = new AudioCommand(); - command->mCommand = ADD_OUTPUT_SESSION_EFFECTS; - sp data = new AddOutputSessionEffectsData(); - data->mOutput = output; - data->mStream = stream; - data->mSessionId = session; - data->mFlags = flags; - data->mChannelMask = channelMask; - data->mUid = uid; - command->mParam = data; - command->mWaitStatus = false; - ALOGV("AudioCommandThread() adding start output %d", output); - return sendCommand(command); -} - - void AudioPolicyService::AudioCommandThread::stopOutputCommand(audio_io_handle_t output, audio_stream_type_t stream, audio_session_t session) @@ -1003,23 +944,6 @@ void AudioPolicyService::AudioCommandThread::effectSessionUpdateCommand( sendCommand(command); } -void AudioPolicyService::AudioCommandThread::releaseOutputSessionEffectsCommand( - audio_io_handle_t output, audio_stream_type_t stream, - audio_unique_id_t sessionId, int delayMs) -{ - sp 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& command, int delayMs) { { diff --git a/services/audiopolicy/service/AudioPolicyService.h b/services/audiopolicy/service/AudioPolicyService.h index 01e0e5e..bc2875d 100644 --- a/services/audiopolicy/service/AudioPolicyService.h +++ b/services/audiopolicy/service/AudioPolicyService.h @@ -204,13 +204,6 @@ public: virtual status_t setEffectSessionCallbacksEnabled(bool enabled); - virtual status_t addOutputSessionEffects(audio_io_handle_t output, - audio_stream_type_t stream, - audio_session_t session, - audio_output_flags_t flags, - audio_channel_mask_t channelMask, - uid_t uid); - status_t doStartOutput(audio_io_handle_t output, audio_stream_type_t stream, audio_session_t session); @@ -248,10 +241,6 @@ public: audio_output_flags_t flags, audio_channel_mask_t channelMask, uid_t uid, bool added); - void releaseOutputSessionEffectsDelayed(audio_io_handle_t output, - audio_stream_type_t stream, - audio_unique_id_t sessionId, - int delayMs); private: AudioPolicyService() ANDROID_API; @@ -286,8 +275,6 @@ private: SET_AUDIOPORT_CONFIG, DYN_POLICY_MIX_STATE_UPDATE, EFFECT_SESSION_UPDATE, - RELEASE_OUTPUT_SESSION_EFFECTS, - ADD_OUTPUT_SESSION_EFFECTS }; AudioCommandThread (String8 name, const wp& service); @@ -335,17 +322,6 @@ private: audio_output_flags_t flags, audio_channel_mask_t channelMask, uid_t uid, bool added); - void releaseOutputSessionEffectsCommand(audio_io_handle_t output, - audio_stream_type_t stream, - audio_unique_id_t sessionId, - int delayMs = 0); - status_t addOutputSessionEffectsCommand(audio_io_handle_t output, - audio_stream_type_t stream, - audio_session_t sessionId, - audio_output_flags_t flags, - audio_channel_mask_t channelMask, - uid_t uid); - private: class AudioCommandData; @@ -452,23 +428,6 @@ private: bool mAdded; }; - class ReleaseOutputSessionEffectsData : public AudioCommandData { - public: - audio_io_handle_t mOutput; - audio_stream_type_t mStream; - audio_unique_id_t mSessionId; - }; - - class AddOutputSessionEffectsData : public AudioCommandData { - public: - audio_io_handle_t mOutput; - audio_stream_type_t mStream; - audio_session_t mSessionId; - audio_output_flags_t mFlags; - audio_channel_mask_t mChannelMask; - uid_t mUid; - }; - Mutex mLock; Condition mWaitWorkCV; Vector < sp > mAudioCommands; // list of pending commands -- cgit v1.1 From c27a16c33c78a36482336a16199b1b8be794cea4 Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Thu, 21 Apr 2016 23:22:00 -0700 Subject: audiopolicy: Fix notification not sent for session release Change-Id: Ifba4025532debc50c7931d08a9bcd1593d9b1721 --- services/audiopolicy/service/AudioPolicyEffects.cpp | 4 ---- services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp | 2 ++ 2 files changed, 2 insertions(+), 4 deletions(-) (limited to 'services') diff --git a/services/audiopolicy/service/AudioPolicyEffects.cpp b/services/audiopolicy/service/AudioPolicyEffects.cpp index 6a43bea..fce471f 100644 --- a/services/audiopolicy/service/AudioPolicyEffects.cpp +++ b/services/audiopolicy/service/AudioPolicyEffects.cpp @@ -325,10 +325,6 @@ status_t AudioPolicyEffects::releaseOutputSessionEffects(audio_io_handle_t outpu ALOGV("doReleaseOutputSessionEffects(): output processing released from session: %d", audioSession); } - - mAudioPolicyService->onOutputSessionEffectsUpdate(stream, (audio_session_t)audioSession, - AUDIO_OUTPUT_FLAG_NONE, 0, -1, false); - return status; } diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp index 96bc4c7..54b1982 100644 --- a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp +++ b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp @@ -282,6 +282,8 @@ void AudioPolicyService::doReleaseOutput(audio_io_handle_t output, { ALOGV("doReleaseOutput from tid %d", gettid()); Mutex::Autolock _l(mLock); + onOutputSessionEffectsUpdate(stream, session, + AUDIO_OUTPUT_FLAG_NONE, 0, -1, false); mAudioPolicyManager->releaseOutput(output, stream, session); } -- cgit v1.1 From 244deea89aaf3c5dfa8bd369a845276ae501cb5a Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Fri, 22 Apr 2016 18:26:43 -0700 Subject: audiopolicy: Revert all session callback patches. * This has been rearchitected in a better way, as this feature turns out to be more difficult than it seems. * Reverting all of this stuff and rolling it into a single commit. This reverts commit c27a16c33c78a36482336a16199b1b8be794cea4. This reverts commit 32ef0556ae58ff6b7c6fe6fb0a17d3ff7f01de31. This reverts commit 489c9fb62f02e1d23d6d6c89b22f7d19c596e65e. This reverts commit a4123803d0a0e9e0c69faa4207d357cc74a65d58. This reverts commit e13b58b988ab642d4ae5ca6d0a89013510714956. This reverts commit 47f8c7303c9e2054f1492b02b6c7472385c52dc9. This reverts commit 0479d7c79a7fd6f112e8dc7e45c009cf6602dbaa. Change-Id: Iaed9f198d806aa414c95960713e8187c98db248b --- services/audiopolicy/AudioPolicyInterface.h | 6 -- .../audiopolicy/service/AudioPolicyClientImpl.cpp | 9 -- .../audiopolicy/service/AudioPolicyEffects.cpp | 27 +----- services/audiopolicy/service/AudioPolicyEffects.h | 12 +-- .../service/AudioPolicyInterfaceImpl.cpp | 32 ++----- .../audiopolicy/service/AudioPolicyService.cpp | 97 +--------------------- services/audiopolicy/service/AudioPolicyService.h | 45 +--------- 7 files changed, 16 insertions(+), 212 deletions(-) (limited to 'services') diff --git a/services/audiopolicy/AudioPolicyInterface.h b/services/audiopolicy/AudioPolicyInterface.h index bf9dd64..c1e7bc0 100644 --- a/services/audiopolicy/AudioPolicyInterface.h +++ b/services/audiopolicy/AudioPolicyInterface.h @@ -331,12 +331,6 @@ public: virtual audio_unique_id_t newAudioUniqueId() = 0; virtual void onDynamicPolicyMixStateUpdate(String8 regId, int32_t state) = 0; - - virtual void onOutputSessionEffectsUpdate(audio_stream_type_t stream, - audio_session_t sessionId, - audio_output_flags_t flags, - audio_channel_mask_t channelMask, - uid_t uid, bool added) = 0; }; extern "C" AudioPolicyInterface* createAudioPolicyManager(AudioPolicyClientInterface *clientInterface); diff --git a/services/audiopolicy/service/AudioPolicyClientImpl.cpp b/services/audiopolicy/service/AudioPolicyClientImpl.cpp index f1a2ae9..489a9be 100644 --- a/services/audiopolicy/service/AudioPolicyClientImpl.cpp +++ b/services/audiopolicy/service/AudioPolicyClientImpl.cpp @@ -219,15 +219,6 @@ void AudioPolicyService::AudioPolicyClient::onDynamicPolicyMixStateUpdate( mAudioPolicyService->onDynamicPolicyMixStateUpdate(regId, state); } -void AudioPolicyService::AudioPolicyClient::onOutputSessionEffectsUpdate( - audio_stream_type_t stream, audio_session_t sessionId, - audio_output_flags_t flags, audio_channel_mask_t channelMask, - uid_t uid, bool added) -{ - mAudioPolicyService->onOutputSessionEffectsUpdate(stream, sessionId, - flags, channelMask, uid, added); -} - audio_unique_id_t AudioPolicyService::AudioPolicyClient::newAudioUniqueId() { return AudioSystem::newAudioUniqueId(); diff --git a/services/audiopolicy/service/AudioPolicyEffects.cpp b/services/audiopolicy/service/AudioPolicyEffects.cpp index fce471f..26857b1 100644 --- a/services/audiopolicy/service/AudioPolicyEffects.cpp +++ b/services/audiopolicy/service/AudioPolicyEffects.cpp @@ -28,7 +28,6 @@ #include #include #include -#include "AudioPolicyService.h" #include "AudioPolicyEffects.h" #include "ServiceUtilities.h" @@ -38,8 +37,7 @@ namespace android { // AudioPolicyEffects Implementation // ---------------------------------------------------------------------------- -AudioPolicyEffects::AudioPolicyEffects(AudioPolicyService *audioPolicyService) : - mAudioPolicyService(audioPolicyService) +AudioPolicyEffects::AudioPolicyEffects() { // load automatic audio effect modules if (access(AUDIO_EFFECT_VENDOR_CONFIG_FILE2, R_OK) == 0) { @@ -246,7 +244,6 @@ status_t AudioPolicyEffects::addOutputSessionEffects(audio_io_handle_t output, if (idx < 0) { procDesc = new EffectVector(audioSession); mOutputSessions.add(audioSession, procDesc); - } else { // EffectVector is existing and we just need to increase ref count procDesc = mOutputSessions.valueAt(idx); @@ -275,29 +272,9 @@ status_t AudioPolicyEffects::addOutputSessionEffects(audio_io_handle_t output, procDesc->setProcessorEnabled(true); } - return status; } -status_t AudioPolicyEffects::doAddOutputSessionEffects(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; - } - ALOGV("doAddOutputSessionEffects()"); - - // notify listeners - mAudioPolicyService->onOutputSessionEffectsUpdate(stream, (audio_session_t)session, - flags, channelMask, uid, true); - - // Never return an error if effects setup fails. - return NO_ERROR; -} - status_t AudioPolicyEffects::releaseOutputSessionEffects(audio_io_handle_t output, audio_stream_type_t stream, int audioSession) @@ -322,7 +299,7 @@ status_t AudioPolicyEffects::releaseOutputSessionEffects(audio_io_handle_t outpu procDesc->mEffects.clear(); delete procDesc; mOutputSessions.removeItemsAt(index); - 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 1c251e0..3845050 100644 --- a/services/audiopolicy/service/AudioPolicyEffects.h +++ b/services/audiopolicy/service/AudioPolicyEffects.h @@ -31,8 +31,6 @@ namespace android { -class AudioPolicyService; - // ---------------------------------------------------------------------------- // AudioPolicyEffects class @@ -46,7 +44,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(); virtual ~AudioPolicyEffects(); // NOTE: methods on AudioPolicyEffects should never be called with the AudioPolicyService @@ -86,12 +84,6 @@ public: audio_stream_type_t stream, int audioSession); - status_t doAddOutputSessionEffects(audio_io_handle_t output, - audio_stream_type_t stream, - int audioSession, - audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE, - audio_channel_mask_t channelMask = 0, uid_t uid = 0); - private: // class to store the description of an effects and its parameters @@ -200,8 +192,6 @@ private: KeyedVector< audio_stream_type_t, EffectDescVector* > mOutputStreams; // Automatic output effects are unique for audiosession ID KeyedVector< int32_t, EffectVector* > mOutputSessions; - - AudioPolicyService *mAudioPolicyService; }; }; // namespace android diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp index 54b1982..c0d3866 100644 --- a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp +++ b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp @@ -18,7 +18,6 @@ //#define LOG_NDEBUG 0 #include -#include #include "AudioPolicyService.h" #include "ServiceUtilities.h" @@ -163,29 +162,18 @@ status_t AudioPolicyService::getOutputForAttr(const audio_attributes_t *attr, return NO_INIT; } ALOGV("getOutput()"); - status_t status; - sp audioPolicyEffects; - { - Mutex::Autolock _l(mLock); + 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); - } - uid = newclientUid; + // 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); } - status = mAudioPolicyManager->getOutputForAttr(attr, output, session, stream, uid, samplingRate, - format, channelMask, flags, selectedDeviceId, offloadInfo); - audioPolicyEffects = mAudioPolicyEffects; - } - - if (audioPolicyEffects != 0) { - audioPolicyEffects->doAddOutputSessionEffects(*output, *stream, session, flags, channelMask, uid); + uid = newclientUid; } - - return status; + return mAudioPolicyManager->getOutputForAttr(attr, output, session, stream, uid, samplingRate, + format, channelMask, flags, selectedDeviceId, offloadInfo); } status_t AudioPolicyService::startOutput(audio_io_handle_t output, @@ -282,8 +270,6 @@ void AudioPolicyService::doReleaseOutput(audio_io_handle_t output, { ALOGV("doReleaseOutput from tid %d", gettid()); Mutex::Autolock _l(mLock); - onOutputSessionEffectsUpdate(stream, session, - AUDIO_OUTPUT_FLAG_NONE, 0, -1, false); mAudioPolicyManager->releaseOutput(output, stream, session); } diff --git a/services/audiopolicy/service/AudioPolicyService.cpp b/services/audiopolicy/service/AudioPolicyService.cpp index eead3ac..12cca65 100644 --- a/services/audiopolicy/service/AudioPolicyService.cpp +++ b/services/audiopolicy/service/AudioPolicyService.cpp @@ -116,7 +116,7 @@ void AudioPolicyService::onFirstRef() #endif } // load audio processing modules - spaudioPolicyEffects = new AudioPolicyEffects(this); + spaudioPolicyEffects = new AudioPolicyEffects(); { Mutex::Autolock _l(mLock); mAudioPolicyEffects = audioPolicyEffects; @@ -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,37 +254,11 @@ status_t AudioPolicyService::clientSetAudioPortConfig(const struct audio_port_co return mAudioCommandThread->setAudioPortConfigCommand(config, delayMs); } -void AudioPolicyService::onOutputSessionEffectsUpdate(audio_stream_type_t stream, - audio_session_t sessionId, - audio_output_flags_t flags, - audio_channel_mask_t channelMask, - uid_t uid, bool added) -{ - ALOGV("AudioPolicyService::onOutputSessionEffectsUpdate(%d, %d, %d)", - stream, sessionId, added); - mOutputCommandThread->effectSessionUpdateCommand(stream, sessionId, - flags, channelMask, uid, added); -} - -void AudioPolicyService::doOnOutputSessionEffectsUpdate(audio_stream_type_t stream, - audio_session_t sessionId, - audio_output_flags_t flags, - audio_channel_mask_t channelMask, - uid_t uid, bool added) -{ - Mutex::Autolock _l(mNotificationClientsLock); - for (size_t i = 0; i < mNotificationClients.size(); i++) { - mNotificationClients.valueAt(i)->onOutputSessionEffectsUpdate(stream, sessionId, - flags, channelMask, uid, added); - } -} - AudioPolicyService::NotificationClient::NotificationClient(const sp& service, const sp& client, uid_t uid) : mService(service), mUid(uid), mAudioPolicyServiceClient(client), - mAudioPortCallbacksEnabled(false), - mEffectSessionCallbacksEnabled(false) + mAudioPortCallbacksEnabled(false) { } @@ -332,17 +289,6 @@ void AudioPolicyService::NotificationClient::onAudioPatchListUpdate() } } -void AudioPolicyService::NotificationClient::onOutputSessionEffectsUpdate( - audio_stream_type_t stream, audio_session_t sessionId, - audio_output_flags_t flags, audio_channel_mask_t channelMask, - uid_t uid, bool added) -{ - if (mAudioPolicyServiceClient != 0 && mEffectSessionCallbacksEnabled) { - mAudioPolicyServiceClient->onOutputSessionEffectsUpdate(stream, sessionId, - flags, channelMask, uid, added); - } -} - void AudioPolicyService::NotificationClient::onDynamicPolicyMixStateUpdate( String8 regId, int32_t state) { @@ -356,10 +302,6 @@ void AudioPolicyService::NotificationClient::setAudioPortCallbacksEnabled(bool e mAudioPortCallbacksEnabled = enabled; } -void AudioPolicyService::NotificationClient::setEffectSessionCallbacksEnabled(bool enabled) -{ - mEffectSessionCallbacksEnabled = enabled; -} void AudioPolicyService::binderDied(const wp& who) { ALOGW("binderDied() %p, calling pid %d", who.unsafe_get(), @@ -637,21 +579,6 @@ bool AudioPolicyService::AudioCommandThread::threadLoop() svc->doOnDynamicPolicyMixStateUpdate(data->mRegId, data->mState); mLock.lock(); } break; - case EFFECT_SESSION_UPDATE: { - EffectSessionUpdateData *data = - (EffectSessionUpdateData *)command->mParam.get(); - ALOGV("AudioCommandThread() processing effect session update %d %d %d", - data->mStream, data->mSessionId, data->mAdded); - svc = mService.promote(); - if (svc == 0) { - break; - } - mLock.unlock(); - svc->doOnOutputSessionEffectsUpdate(data->mStream, data->mSessionId, - data->mFlags, data->mChannelMask, data->mUid, data->mAdded); - mLock.lock(); - } break; - default: ALOGW("AudioCommandThread() unknown command %d", command->mCommand); } @@ -924,26 +851,6 @@ void AudioPolicyService::AudioCommandThread::dynamicPolicyMixStateUpdateCommand( sendCommand(command); } -void AudioPolicyService::AudioCommandThread::effectSessionUpdateCommand( - audio_stream_type_t stream, audio_session_t sessionId, - audio_output_flags_t flags, audio_channel_mask_t channelMask, - uid_t uid, bool added) -{ - sp command = new AudioCommand(); - command->mCommand = EFFECT_SESSION_UPDATE; - EffectSessionUpdateData *data = new EffectSessionUpdateData(); - data->mStream = stream; - data->mSessionId = sessionId; - data->mFlags = flags; - data->mChannelMask = channelMask; - data->mUid = uid; - data->mAdded = added; - command->mParam = data; - ALOGV("AudioCommandThread() sending effect session update (id=%d) for stream %d (added=%d)", - stream, sessionId, added); - sendCommand(command); -} - status_t AudioPolicyService::AudioCommandThread::sendCommand(sp& command, int delayMs) { { diff --git a/services/audiopolicy/service/AudioPolicyService.h b/services/audiopolicy/service/AudioPolicyService.h index bc2875d..d11294b 100644 --- a/services/audiopolicy/service/AudioPolicyService.h +++ b/services/audiopolicy/service/AudioPolicyService.h @@ -202,8 +202,6 @@ public: audio_io_handle_t *handle); virtual status_t stopAudioSource(audio_io_handle_t handle); - virtual status_t setEffectSessionCallbacksEnabled(bool enabled); - status_t doStartOutput(audio_io_handle_t output, audio_stream_type_t stream, audio_session_t session); @@ -231,17 +229,6 @@ public: void onDynamicPolicyMixStateUpdate(String8 regId, int32_t state); void doOnDynamicPolicyMixStateUpdate(String8 regId, int32_t state); - void onOutputSessionEffectsUpdate(audio_stream_type_t stream, - audio_session_t sessionId, - audio_output_flags_t flags, - audio_channel_mask_t channelMask, - uid_t uid, bool added); - void doOnOutputSessionEffectsUpdate(audio_stream_type_t stream, - audio_session_t sessionId, - audio_output_flags_t flags, - audio_channel_mask_t channelMask, - uid_t uid, bool added); - private: AudioPolicyService() ANDROID_API; virtual ~AudioPolicyService(); @@ -273,8 +260,7 @@ private: UPDATE_AUDIOPORT_LIST, UPDATE_AUDIOPATCH_LIST, SET_AUDIOPORT_CONFIG, - DYN_POLICY_MIX_STATE_UPDATE, - EFFECT_SESSION_UPDATE, + DYN_POLICY_MIX_STATE_UPDATE }; AudioCommandThread (String8 name, const wp& service); @@ -317,11 +303,6 @@ 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_session_t sessionId, - audio_output_flags_t flags, - audio_channel_mask_t channelMask, - uid_t uid, bool added); private: class AudioCommandData; @@ -418,16 +399,6 @@ private: int32_t mState; }; - class EffectSessionUpdateData : public AudioCommandData { - public: - audio_stream_type_t mStream; - audio_session_t mSessionId; - audio_output_flags_t mFlags; - audio_channel_mask_t mChannelMask; - uid_t mUid; - bool mAdded; - }; - Mutex mLock; Condition mWaitWorkCV; Vector < sp > mAudioCommands; // list of pending commands @@ -537,12 +508,6 @@ private: virtual audio_unique_id_t newAudioUniqueId(); - virtual void onOutputSessionEffectsUpdate(audio_stream_type_t stream, - audio_session_t sessionId, - audio_output_flags_t flags, - audio_channel_mask_t channelMask, - uid_t uid, bool added); - private: AudioPolicyService *mAudioPolicyService; }; @@ -559,12 +524,7 @@ 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_session_t sessionId, - audio_output_flags_t flags, - audio_channel_mask_t channelMask, - uid_t uid, bool added); + // IBinder::DeathRecipient virtual void binderDied(const wp& who); @@ -576,7 +536,6 @@ private: const uid_t mUid; const sp mAudioPolicyServiceClient; bool mAudioPortCallbacksEnabled; - bool mEffectSessionCallbacksEnabled; }; // Internal dump utilities. -- cgit v1.1 From 3f9eb321481de3e118632a594bf1b0c9001c281c Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Fri, 22 Apr 2016 18:32:39 -0700 Subject: 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 --- services/audiopolicy/AudioPolicyInterface.h | 3 + .../audiopolicy/service/AudioPolicyClientImpl.cpp | 6 ++ .../audiopolicy/service/AudioPolicyEffects.cpp | 111 ++++++++++++++++++++- services/audiopolicy/service/AudioPolicyEffects.h | 21 +++- .../service/AudioPolicyInterfaceImpl.cpp | 66 +++++++++--- .../service/AudioPolicyInterfaceImplLegacy.cpp | 5 + .../audiopolicy/service/AudioPolicyService.cpp | 54 +++++++++- services/audiopolicy/service/AudioPolicyService.h | 22 +++- 8 files changed, 270 insertions(+), 18 deletions(-) (limited to 'services') diff --git a/services/audiopolicy/AudioPolicyInterface.h b/services/audiopolicy/AudioPolicyInterface.h index c1e7bc0..93e6266 100644 --- a/services/audiopolicy/AudioPolicyInterface.h +++ b/services/audiopolicy/AudioPolicyInterface.h @@ -331,6 +331,9 @@ public: virtual audio_unique_id_t newAudioUniqueId() = 0; virtual void onDynamicPolicyMixStateUpdate(String8 regId, int32_t state) = 0; + + virtual void onOutputSessionEffectsUpdate(sp& streamInfo, bool added) = 0; + }; extern "C" AudioPolicyInterface* createAudioPolicyManager(AudioPolicyClientInterface *clientInterface); diff --git a/services/audiopolicy/service/AudioPolicyClientImpl.cpp b/services/audiopolicy/service/AudioPolicyClientImpl.cpp index 489a9be..82720f4 100644 --- a/services/audiopolicy/service/AudioPolicyClientImpl.cpp +++ b/services/audiopolicy/service/AudioPolicyClientImpl.cpp @@ -219,6 +219,12 @@ void AudioPolicyService::AudioPolicyClient::onDynamicPolicyMixStateUpdate( mAudioPolicyService->onDynamicPolicyMixStateUpdate(regId, state); } +void AudioPolicyService::AudioPolicyClient::onOutputSessionEffectsUpdate( + sp& info, bool added) +{ + mAudioPolicyService->onOutputSessionEffectsUpdate(info, added); +} + audio_unique_id_t AudioPolicyService::AudioPolicyClient::newAudioUniqueId() { return AudioSystem::newAudioUniqueId(); diff --git a/services/audiopolicy/service/AudioPolicyEffects.cpp b/services/audiopolicy/service/AudioPolicyEffects.cpp index 26857b1..31b1637 100644 --- a/services/audiopolicy/service/AudioPolicyEffects.cpp +++ b/services/audiopolicy/service/AudioPolicyEffects.cpp @@ -28,6 +28,7 @@ #include #include #include +#include "AudioPolicyService.h" #include "AudioPolicyEffects.h" #include "ServiceUtilities.h" @@ -37,7 +38,8 @@ namespace android { // AudioPolicyEffects Implementation // ---------------------------------------------------------------------------- -AudioPolicyEffects::AudioPolicyEffects() +AudioPolicyEffects::AudioPolicyEffects(AudioPolicyService *audioPolicyService) : + mAudioPolicyService(audioPolicyService) { // load automatic audio effect modules if (access(AUDIO_EFFECT_VENDOR_CONFIG_FILE2, R_OK) == 0) { @@ -226,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? @@ -233,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 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"); @@ -275,6 +295,81 @@ status_t AudioPolicyEffects::addOutputSessionEffects(audio_io_handle_t output, return status; } +status_t AudioPolicyEffects::releaseOutputAudioSessionInfo(audio_io_handle_t /* output */, + audio_stream_type_t stream, + int session) +{ + if (uint32_t(stream) >= AUDIO_STREAM_CNT) { + return BAD_VALUE; + } + + Mutex::Autolock _l(mLock); + + ssize_t idx = mOutputAudioSessionInfo.indexOfKey(session); + if (idx >= 0) { + sp 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; +} + +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; + } + + Mutex::Autolock _l(mLock); + + // 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 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; + } + + 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> &sessions) +{ + ALOGV("listAudioSessions() streams %d", streams); + + for (unsigned int i = 0; i < mOutputAudioSessionInfo.size(); i++) { + sp info = mOutputAudioSessionInfo.valueAt(i); + if (streams == -1 || info->mStream == streams) { + sessions.push_back(info); + } + } + + return NO_ERROR; +} + status_t AudioPolicyEffects::releaseOutputSessionEffects(audio_io_handle_t output, audio_stream_type_t stream, int audioSession) @@ -284,7 +379,19 @@ status_t AudioPolicyEffects::releaseOutputSessionEffects(audio_io_handle_t outpu (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 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("releaseOutputSessionEffects: no output processing was attached to this stream"); return NO_ERROR; diff --git a/services/audiopolicy/service/AudioPolicyEffects.h b/services/audiopolicy/service/AudioPolicyEffects.h index 3845050..a95d49f 100644 --- a/services/audiopolicy/service/AudioPolicyEffects.h +++ b/services/audiopolicy/service/AudioPolicyEffects.h @@ -31,6 +31,8 @@ namespace android { +class AudioPolicyService; + // ---------------------------------------------------------------------------- // AudioPolicyEffects class @@ -44,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(); + AudioPolicyEffects(AudioPolicyService *audioPolicyService); virtual ~AudioPolicyEffects(); // NOTE: methods on AudioPolicyEffects should never be called with the AudioPolicyService @@ -84,6 +86,19 @@ public: 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> &sessions); + private: // class to store the description of an effects and its parameters @@ -192,6 +207,10 @@ 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 > mOutputAudioSessionInfo; + + AudioPolicyService *mAudioPolicyService; }; }; // namespace android diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp index c0d3866..f0be341 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; + { + 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; + } + + if (status == NO_ERROR && audioPolicyEffects != 0) { + audioPolicyEffects->updateOutputAudioSessionInfo(*output, + *stream, session, flags, channelMask, uid); } - return mAudioPolicyManager->getOutputForAttr(attr, output, session, stream, uid, samplingRate, - format, channelMask, flags, selectedDeviceId, offloadInfo); + + 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); + spaudioPolicyEffects; + { + 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, @@ -717,4 +738,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> &sessions) +{ + sp 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..0aad54d 100644 --- a/services/audiopolicy/service/AudioPolicyInterfaceImplLegacy.cpp +++ b/services/audiopolicy/service/AudioPolicyInterfaceImplLegacy.cpp @@ -642,4 +642,9 @@ status_t AudioPolicyService::stopAudioSource(audio_io_handle_t handle) return INVALID_OPERATION; } +status_t AudioPolicyService::listAudioSessions(audio_stream_type_t streams, + Vector< sp> &sessions) +{ + return INVALID_OPERATION; +} }; // namespace android diff --git a/services/audiopolicy/service/AudioPolicyService.cpp b/services/audiopolicy/service/AudioPolicyService.cpp index 12cca65..79370f4 100644 --- a/services/audiopolicy/service/AudioPolicyService.cpp +++ b/services/audiopolicy/service/AudioPolicyService.cpp @@ -116,7 +116,7 @@ void AudioPolicyService::onFirstRef() #endif } // load audio processing modules - spaudioPolicyEffects = new AudioPolicyEffects(); + spaudioPolicyEffects = new AudioPolicyEffects(this); { Mutex::Autolock _l(mLock); mAudioPolicyEffects = audioPolicyEffects; @@ -254,6 +254,21 @@ status_t AudioPolicyService::clientSetAudioPortConfig(const struct audio_port_co return mAudioCommandThread->setAudioPortConfigCommand(config, delayMs); } +void AudioPolicyService::onOutputSessionEffectsUpdate(sp& info, bool added) +{ + ALOGV("AudioPolicyService::onOutputSessionEffectsUpdate(%d, %d, %d)", + info->mStream, info->mSessionId, added); + mOutputCommandThread->effectSessionUpdateCommand(info, added); +} + +void AudioPolicyService::doOnOutputSessionEffectsUpdate(sp& info, bool added) +{ + Mutex::Autolock _l(mNotificationClientsLock); + for (size_t i = 0; i < mNotificationClients.size(); i++) { + mNotificationClients.valueAt(i)->onOutputSessionEffectsUpdate(info, added); + } +} + AudioPolicyService::NotificationClient::NotificationClient(const sp& service, const sp& client, uid_t uid) @@ -289,6 +304,14 @@ void AudioPolicyService::NotificationClient::onAudioPatchListUpdate() } } +void AudioPolicyService::NotificationClient::onOutputSessionEffectsUpdate( + sp& info, bool added) +{ + if (mAudioPolicyServiceClient != 0) { + mAudioPolicyServiceClient->onOutputSessionEffectsUpdate(info, added); + } +} + void AudioPolicyService::NotificationClient::onDynamicPolicyMixStateUpdate( String8 regId, int32_t state) { @@ -579,6 +602,21 @@ bool AudioPolicyService::AudioCommandThread::threadLoop() svc->doOnDynamicPolicyMixStateUpdate(data->mRegId, data->mState); mLock.lock(); } break; + case EFFECT_SESSION_UPDATE: { + EffectSessionUpdateData *data = + (EffectSessionUpdateData *)command->mParam.get(); + ALOGV("AudioCommandThread() processing effect session update %d %d %d", + data->mAudioSessionInfo->mStream, data->mAudioSessionInfo->mSessionId, + data->mAdded); + svc = mService.promote(); + if (svc == 0) { + break; + } + mLock.unlock(); + svc->doOnOutputSessionEffectsUpdate(data->mAudioSessionInfo, data->mAdded); + mLock.lock(); + } break; + default: ALOGW("AudioCommandThread() unknown command %d", command->mCommand); } @@ -851,6 +889,20 @@ void AudioPolicyService::AudioCommandThread::dynamicPolicyMixStateUpdateCommand( sendCommand(command); } +void AudioPolicyService::AudioCommandThread::effectSessionUpdateCommand( + sp& streamInfo, bool added) +{ + sp command = new AudioCommand(); + command->mCommand = EFFECT_SESSION_UPDATE; + EffectSessionUpdateData *data = new EffectSessionUpdateData(); + data->mAudioSessionInfo = streamInfo; + data->mAdded = added; + command->mParam = data; + ALOGV("AudioCommandThread() sending effect session update (id=%d) for stream %d (added=%d)", + streamInfo->mStream, streamInfo->mSessionId, added); + sendCommand(command); +} + status_t AudioPolicyService::AudioCommandThread::sendCommand(sp& command, int delayMs) { { diff --git a/services/audiopolicy/service/AudioPolicyService.h b/services/audiopolicy/service/AudioPolicyService.h index d11294b..b7f55ae 100644 --- a/services/audiopolicy/service/AudioPolicyService.h +++ b/services/audiopolicy/service/AudioPolicyService.h @@ -202,6 +202,9 @@ public: audio_io_handle_t *handle); virtual status_t stopAudioSource(audio_io_handle_t handle); + virtual status_t listAudioSessions(audio_stream_type_t stream, + Vector< sp>& sessions); + status_t doStartOutput(audio_io_handle_t output, audio_stream_type_t stream, audio_session_t session); @@ -229,6 +232,9 @@ public: void onDynamicPolicyMixStateUpdate(String8 regId, int32_t state); void doOnDynamicPolicyMixStateUpdate(String8 regId, int32_t state); + void onOutputSessionEffectsUpdate(sp& info, bool added); + void doOnOutputSessionEffectsUpdate(sp& info, bool added); + private: AudioPolicyService() ANDROID_API; virtual ~AudioPolicyService(); @@ -260,7 +266,8 @@ private: UPDATE_AUDIOPORT_LIST, UPDATE_AUDIOPATCH_LIST, SET_AUDIOPORT_CONFIG, - DYN_POLICY_MIX_STATE_UPDATE + DYN_POLICY_MIX_STATE_UPDATE, + EFFECT_SESSION_UPDATE, }; AudioCommandThread (String8 name, const wp& service); @@ -303,6 +310,7 @@ private: int delayMs); void dynamicPolicyMixStateUpdateCommand(String8 regId, int32_t state); void insertCommand_l(AudioCommand *command, int delayMs = 0); + void effectSessionUpdateCommand(sp& info, bool added); private: class AudioCommandData; @@ -399,6 +407,12 @@ private: int32_t mState; }; + class EffectSessionUpdateData : public AudioCommandData { + public: + sp mAudioSessionInfo; + bool mAdded; + }; + Mutex mLock; Condition mWaitWorkCV; Vector < sp > mAudioCommands; // list of pending commands @@ -508,6 +522,9 @@ private: virtual audio_unique_id_t newAudioUniqueId(); + virtual void onOutputSessionEffectsUpdate(sp& info, bool added); + + private: AudioPolicyService *mAudioPolicyService; }; @@ -524,7 +541,8 @@ private: void onAudioPatchListUpdate(); void onDynamicPolicyMixStateUpdate(String8 regId, int32_t state); void setAudioPortCallbacksEnabled(bool enabled); - + void onOutputSessionEffectsUpdate(sp& info, + bool added); // IBinder::DeathRecipient virtual void binderDied(const wp& who); -- cgit v1.1 From e67a2babcccf11e5209afc39d368eb79b1d35c21 Mon Sep 17 00:00:00 2001 From: Roman Birg Date: Tue, 3 May 2016 11:54:28 -0700 Subject: soundtrigger: fill in default extras from dsp We seem to get an improper offset when getting the value from the DSP (offset 100, data size 1), when this happens, return a new phrase event with valid extras which are initialized to some default values. Change-Id: Ie041f78fec6bdbcd82286b54a7b7fb0c98c740f5 Signed-off-by: Roman Birg --- services/soundtrigger/SoundTriggerHwService.cpp | 31 +++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'services') diff --git a/services/soundtrigger/SoundTriggerHwService.cpp b/services/soundtrigger/SoundTriggerHwService.cpp index 9de6fe2..371c81a 100644 --- a/services/soundtrigger/SoundTriggerHwService.cpp +++ b/services/soundtrigger/SoundTriggerHwService.cpp @@ -270,6 +270,37 @@ void SoundTriggerHwService::sendRecognitionEvent(struct sound_trigger_recognitio if (module == NULL) { return; } + if (event-> type == SOUND_MODEL_TYPE_KEYPHRASE && event->data_size != 0 + && event->data_offset != sizeof(struct sound_trigger_phrase_recognition_event)) { + // set some defaults for the phrase if the recognition event won't be parsed properly + // TODO: read defaults from the config + + struct sound_trigger_phrase_recognition_event newEvent; + memset(&newEvent, 0, sizeof(struct sound_trigger_phrase_recognition_event)); + + sp model = module->getModel(event->model); + + newEvent.num_phrases = 1; + newEvent.phrase_extras[0].id = 100; + newEvent.phrase_extras[0].recognition_modes = RECOGNITION_MODE_VOICE_TRIGGER; + newEvent.phrase_extras[0].confidence_level = 100; + newEvent.phrase_extras[0].num_levels = 1; + newEvent.phrase_extras[0].levels[0].level = 100; + newEvent.phrase_extras[0].levels[0].user_id = 100; + newEvent.common.status = event->status; + newEvent.common.type = event->type; + newEvent.common.model = event->model; + newEvent.common.capture_available = event->capture_available; + newEvent.common.capture_session = event->capture_session; + newEvent.common.capture_delay_ms = event->capture_delay_ms; + newEvent.common.capture_preamble_ms = event->capture_preamble_ms; + newEvent.common.trigger_in_data = event->trigger_in_data; + newEvent.common.audio_config = event->audio_config; + newEvent.common.data_size = event->data_size; + newEvent.common.data_offset = sizeof(struct sound_trigger_phrase_recognition_event); + + event = &newEvent.common; + } sp eventMemory = prepareRecognitionEvent_l(event); if (eventMemory == 0) { return; -- cgit v1.1 From eb6bd31da259ea399a8bb5b13e83929aaf9e3ac3 Mon Sep 17 00:00:00 2001 From: Sanjeev Garg Date: Fri, 1 Apr 2016 18:54:28 +0530 Subject: Revert "cameraservice: Run HAL3 in Non ZSL mode". Reverting the Temp change. This reverts commit f300e17bf3451bf821ccc48c45b243c84ebaff7f. Change-Id: Ib11e38eb8edd7523cb6cdb21caa511152ee62e45 --- services/camera/libcameraservice/api1/client2/Parameters.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'services') diff --git a/services/camera/libcameraservice/api1/client2/Parameters.cpp b/services/camera/libcameraservice/api1/client2/Parameters.cpp index 4df8361..44447b4 100644 --- a/services/camera/libcameraservice/api1/client2/Parameters.cpp +++ b/services/camera/libcameraservice/api1/client2/Parameters.cpp @@ -910,7 +910,7 @@ status_t Parameters::initialize(const CameraMetadata *info, int deviceVersion) { } else { zslMode = true; } - zslMode = false; + ALOGI("%s: zslMode: %d slowJpegMode %d", __FUNCTION__, zslMode, slowJpegMode); lightFx = LIGHTFX_NONE; -- cgit v1.1 From 8f270dc1ec91d3b34d62202463e0b03939900449 Mon Sep 17 00:00:00 2001 From: Diogo Ferreira Date: Mon, 23 May 2016 18:10:55 +0100 Subject: audiopolicy: engineconfigurable: Don't include the example When using the configurable policy engine, the audiopolicy makefile implicitly declares dependencies on the configuration files. However, the example folder already contains the example files which we wan't to override. This patch removes the example from the makefile inclusion path so that we can declare it on a per-device basis without getting errored out by duplicate module names. Change-Id: Ie47ebff6b13606c93630c017252ebaa204203a76 --- services/audiopolicy/engineconfigurable/parameter-framework/Android.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'services') 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 -- cgit v1.1 From 9cd8c3289c91254b3955bd7347cf605d6fa032c6 Mon Sep 17 00:00:00 2001 From: Andy Hung Date: Mon, 20 Jun 2016 15:22:52 -0700 Subject: Check effect command reply size in AudioFlinger Bug: 29251553 Change-Id: I1bcc1281f1f0542bb645f6358ce31631f2a8ffbf --- services/audioflinger/Effects.cpp | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'services') diff --git a/services/audioflinger/Effects.cpp b/services/audioflinger/Effects.cpp index 949c91d..eb52dee 100644 --- a/services/audioflinger/Effects.cpp +++ b/services/audioflinger/Effects.cpp @@ -558,6 +558,12 @@ status_t AudioFlinger::EffectModule::command(uint32_t cmdCode, if (mStatus != NO_ERROR) { return mStatus; } + if (cmdCode == EFFECT_CMD_GET_PARAM && + (*replySize < sizeof(effect_param_t) || + ((effect_param_t *)pCmdData)->psize > *replySize - sizeof(effect_param_t))) { + android_errorWriteLog(0x534e4554, "29251553"); + return -EINVAL; + } status_t status = (*mEffectInterface)->command(mEffectInterface, cmdCode, cmdSize, -- cgit v1.1 From 1f24c730ab6ca5aff1e3137b340b8aeaeda4bdbc Mon Sep 17 00:00:00 2001 From: Eino-Ville Talvala Date: Mon, 20 Jun 2016 17:00:14 -0700 Subject: DO NOT MERGE: Camera: Adjust pointers to ANW buffers to avoid infoleak Subtract address of a random static object from pointers being routed through app process. Bug: 28466701 Change-Id: Idcbfe81e9507433769672f3dc6d67db5eeed4e04 --- .../camera/libcameraservice/api1/client2/StreamingProcessor.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'services') diff --git a/services/camera/libcameraservice/api1/client2/StreamingProcessor.cpp b/services/camera/libcameraservice/api1/client2/StreamingProcessor.cpp index 66d7b00..9e6c0db 100644 --- a/services/camera/libcameraservice/api1/client2/StreamingProcessor.cpp +++ b/services/camera/libcameraservice/api1/client2/StreamingProcessor.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include #include "common/CameraDeviceBase.h" @@ -826,6 +827,9 @@ status_t StreamingProcessor::processRecordingFrame() { (uint8_t*)heap->getBase() + offset); payload->eType = kMetadataBufferTypeANWBuffer; payload->pBuffer = imgBuffer.mGraphicBuffer->getNativeBuffer(); + // b/28466701 + payload->pBuffer = (ANativeWindowBuffer*)((uint8_t*)payload->pBuffer - + ICameraRecordingProxy::getCommonBaseAddress()); payload->nFenceFd = -1; ALOGVV("%s: Camera %d: Sending out ANWBuffer %p", @@ -874,6 +878,10 @@ void StreamingProcessor::releaseRecordingFrame(const sp& mem) { return; } + // b/28466701 + payload->pBuffer = (ANativeWindowBuffer*)(((uint8_t*)payload->pBuffer) + + ICameraRecordingProxy::getCommonBaseAddress()); + // Release the buffer back to the recording queue size_t itemIndex; for (itemIndex = 0; itemIndex < mRecordingBuffers.size(); itemIndex++) { -- cgit v1.1 From 940b28bc37f819c62386e393614354f55069e8f6 Mon Sep 17 00:00:00 2001 From: Scott Mertz Date: Wed, 6 Jul 2016 10:18:52 -0700 Subject: Enforce permission for accessing fm tuner Change-Id: I13f3ba8fc9caaeee21597a2405a8c3629e985502 --- services/audioflinger/ServiceUtilities.cpp | 8 ++++++++ services/audioflinger/ServiceUtilities.h | 1 + services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp | 5 +++++ services/audiopolicy/service/AudioPolicyInterfaceImplLegacy.cpp | 4 ++++ 4 files changed, 18 insertions(+) (limited to 'services') diff --git a/services/audioflinger/ServiceUtilities.cpp b/services/audioflinger/ServiceUtilities.cpp index 2e68dad..031ff05 100644 --- a/services/audioflinger/ServiceUtilities.cpp +++ b/services/audioflinger/ServiceUtilities.cpp @@ -106,6 +106,14 @@ bool captureAudioOutputAllowed() { return ok; } +bool accessFmRadioAllowed() { + static const String16 sAccessFmRadio("android.permission.ACCESS_FM_RADIO"); + // IMPORTANT: Use PermissionCache - not a runtime permission and may not change. + bool ok = PermissionCache::checkCallingPermission(sAccessFmRadio); + if (!ok) ALOGE("Request requires android.permission.ACCESS_FM_RADIO"); + return ok; +} + bool captureHotwordAllowed() { static const String16 sCaptureHotwordAllowed("android.permission.CAPTURE_AUDIO_HOTWORD"); // IMPORTANT: Use PermissionCache - not a runtime permission and may not change. diff --git a/services/audioflinger/ServiceUtilities.h b/services/audioflinger/ServiceUtilities.h index fba6dce..dffb114 100644 --- a/services/audioflinger/ServiceUtilities.h +++ b/services/audioflinger/ServiceUtilities.h @@ -21,6 +21,7 @@ namespace android { extern pid_t getpid_cached; bool recordingAllowed(const String16& opPackageName); +bool accessFmRadioAllowed(); bool captureAudioOutputAllowed(); bool captureHotwordAllowed(); bool settingsAllowed(); diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp index f0be341..b23c35e 100644 --- a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp +++ b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp @@ -316,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; + } + spaudioPolicyEffects; status_t status; AudioPolicyInterface::input_type_t inputType; diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImplLegacy.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImplLegacy.cpp index 0aad54d..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; -- cgit v1.1 From a5ec3545f879e882ed5397707f65a4757f7232d5 Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Mon, 18 Jul 2016 16:50:06 -0700 Subject: audiopolicy: Constrain session events to music streams * We're really only interested in music streams right now, but events are being generated for all streams (system sounds, etc). * Constrain for now, in the future we will filter based on client registrations. Change-Id: Ic445052028c454eed146addebcdb28c4b26c4f20 --- services/audiopolicy/service/AudioPolicyEffects.cpp | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'services') diff --git a/services/audiopolicy/service/AudioPolicyEffects.cpp b/services/audiopolicy/service/AudioPolicyEffects.cpp index 31b1637..d6fabfe 100644 --- a/services/audiopolicy/service/AudioPolicyEffects.cpp +++ b/services/audiopolicy/service/AudioPolicyEffects.cpp @@ -331,6 +331,11 @@ status_t AudioPolicyEffects::updateOutputAudioSessionInfo(audio_io_handle_t /* o Mutex::Autolock _l(mLock); + // TODO: Handle other stream types based on client registration + if (stream != AUDIO_STREAM_MUSIC) { + return NO_ERROR; + } + // 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 -- cgit v1.1 From e72652f039b9067f9e747d70184507d41ef1f6d7 Mon Sep 17 00:00:00 2001 From: Glenn Kasten Date: Wed, 2 Dec 2015 11:40:09 -0800 Subject: Don't place large objects on the stack Bug: 25020816 Change-Id: Ife4da9fc3000e645f654f2eb28b37ad3a89d61f9 --- services/audioflinger/Threads.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) (limited to 'services') diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp index e1e4980..ecdbf43 100644 --- a/services/audioflinger/Threads.cpp +++ b/services/audioflinger/Threads.cpp @@ -4470,8 +4470,12 @@ void AudioFlinger::MixerThread::dumpInternals(int fd, const Vector& ar dprintf(fd, " AudioMixer tracks: 0x%08x\n", mAudioMixer->trackNames()); // Make a non-atomic copy of fast mixer dump state so it won't change underneath us - const FastMixerDumpState copy(mFastMixerDumpState); - copy.dump(fd); + // while we are dumping it. It may be inconsistent, but it won't mutate! + // This is a large object so we place it on the heap. + // FIXME 25972958: Need an intelligent copy constructor that does not touch unused pages. + const FastMixerDumpState *copy = new FastMixerDumpState(mFastMixerDumpState); + copy->dump(fd); + delete copy; #ifdef STATE_QUEUE_DUMP // Similar for state queue @@ -6460,9 +6464,13 @@ void AudioFlinger::RecordThread::dumpInternals(int fd, const Vector& a dprintf(fd, " Fast capture thread: %s\n", hasFastCapture() ? "yes" : "no"); dprintf(fd, " Fast track available: %s\n", mFastTrackAvail ? "yes" : "no"); - // Make a non-atomic copy of fast capture dump state so it won't change underneath us - const FastCaptureDumpState copy(mFastCaptureDumpState); - copy.dump(fd); + // Make a non-atomic copy of fast capture dump state so it won't change underneath us + // while we are dumping it. It may be inconsistent, but it won't mutate! + // This is a large object so we place it on the heap. + // FIXME 25972958: Need an intelligent copy constructor that does not touch unused pages. + const FastCaptureDumpState *copy = new FastCaptureDumpState(mFastCaptureDumpState); + copy->dump(fd); + delete copy; } void AudioFlinger::RecordThread::dumpTracks(int fd, const Vector& args __unused) -- cgit v1.1 From 6fde774471629832951e9b9b2e0d758e10f6431d Mon Sep 17 00:00:00 2001 From: Haynes Mathew George Date: Tue, 3 May 2016 16:34:26 -0700 Subject: audioflinger: set flush pending on invalidating offload track On invalidating an offload track, the IAudioTrack instance is destroyed and the offload output is released. If it so happens that APM::getOutputForAttr for the new IAudioTrack is called before OffloadThread::prepareTracks_l checks and removes an invalid track, the same output can get reused. The side effect of this is data present in HAL and below from before the invalidate will be rendered before data from the new seek position is rendered. This is unexpected. To fix this, set hint to issue flush when an offload track is invalidated. Bug: 28566885 CRs-Fixed: 1002438 Change-Id: Ib6c38a3abb600598b87591bac90d03b7150d5216 --- services/audioflinger/Threads.cpp | 16 ++++++++++++++-- services/audioflinger/Threads.h | 4 +++- 2 files changed, 17 insertions(+), 3 deletions(-) (limited to 'services') diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp index ecdbf43..ee5dc24 100644 --- a/services/audioflinger/Threads.cpp +++ b/services/audioflinger/Threads.cpp @@ -2574,11 +2574,10 @@ void AudioFlinger::PlaybackThread::cacheParameters_l() } } -void AudioFlinger::PlaybackThread::invalidateTracks(audio_stream_type_t streamType) +void AudioFlinger::PlaybackThread::invalidateTracks_l(audio_stream_type_t streamType) { ALOGV("MixerThread::invalidateTracks() mixer %p, streamType %d, mTracks.size %d", this, streamType, mTracks.size()); - Mutex::Autolock _l(mLock); size_t size = mTracks.size(); for (size_t i = 0; i < size; i++) { @@ -2589,6 +2588,12 @@ void AudioFlinger::PlaybackThread::invalidateTracks(audio_stream_type_t streamTy } } +void AudioFlinger::PlaybackThread::invalidateTracks(audio_stream_type_t streamType) +{ + Mutex::Autolock _l(mLock); + invalidateTracks_l(streamType); +} + status_t AudioFlinger::PlaybackThread::addEffectChain_l(const sp& chain) { int session = chain->sessionId(); @@ -5371,6 +5376,13 @@ void AudioFlinger::OffloadThread::flushHw_l() } } +void AudioFlinger::OffloadThread::invalidateTracks(audio_stream_type_t streamType) +{ + Mutex::Autolock _l(mLock); + mFlushPending = true; + PlaybackThread::invalidateTracks_l(streamType); +} + // ---------------------------------------------------------------------------- AudioFlinger::DuplicatingThread::DuplicatingThread(const sp& audioFlinger, diff --git a/services/audioflinger/Threads.h b/services/audioflinger/Threads.h index 48ff77d..8fab1e4 100644 --- a/services/audioflinger/Threads.h +++ b/services/audioflinger/Threads.h @@ -617,7 +617,8 @@ public: virtual bool isValidSyncEvent(const sp& event) const; // called with AudioFlinger lock held - void invalidateTracks(audio_stream_type_t streamType); + void invalidateTracks_l(audio_stream_type_t streamType); + virtual void invalidateTracks(audio_stream_type_t streamType); virtual size_t frameCount() const { return mNormalFrameCount; } @@ -1000,6 +1001,7 @@ protected: virtual bool waitingAsyncCallback(); virtual bool waitingAsyncCallback_l(); + virtual void invalidateTracks(audio_stream_type_t streamType); private: size_t mPausedWriteLength; // length in bytes of write interrupted by pause -- cgit v1.1 From e4575aeb5d66f71b6ef6c611570ea96df81c1246 Mon Sep 17 00:00:00 2001 From: Haynes Mathew George Date: Thu, 5 May 2016 19:02:06 -0700 Subject: audioflinger: Always process volume commands from a latest track Process them irrespective of whether the track is invalid. Ignoring to do so may lead to glitches/loud bursts in audio when a new track reuses the same output. CRs-Fixed: 1002448 Change-Id: I9afbdd221db3a7311eb0ec8bb75852cf5409084e --- services/audioflinger/Threads.cpp | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) (limited to 'services') diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp index ee5dc24..e5e8bdb 100644 --- a/services/audioflinger/Threads.cpp +++ b/services/audioflinger/Threads.cpp @@ -5169,15 +5169,9 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::OffloadThread::prepareTr if (track->isInvalid()) { ALOGW("An invalidated track shouldn't be in active list"); tracksToRemove->add(track); - continue; - } - - if (track->mState == TrackBase::IDLE) { + } else if (track->mState == TrackBase::IDLE) { ALOGW("An idle track shouldn't be in active list"); - continue; - } - - if (track->isPausing()) { + } else if (track->isPausing()) { track->setPaused(); if (last) { if (mHwSupportsPause && !mHwPaused) { @@ -5200,7 +5194,7 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::OffloadThread::prepareTr if (last) { mFlushPending = true; } - } else if (track->isResumePending()){ + } else if (track->isResumePending()) { track->resumeAck(); if (last) { if (mPausedBytesRemaining) { -- cgit v1.1 From 4f7b529d2405e4929e424d4bb12e4fa5bce2fa04 Mon Sep 17 00:00:00 2001 From: Andy Hung Date: Wed, 17 Aug 2016 14:11:13 -0700 Subject: Add EFFECT_CMD_SET_PARAM parameter checking Fix merge conflict to mnc-mr3-release Bug: 30204301 Change-Id: Ib9c3ee1c2f23c96f8f7092dd9e146bc453d7a290 --- services/audioflinger/Effects.cpp | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'services') diff --git a/services/audioflinger/Effects.cpp b/services/audioflinger/Effects.cpp index 949c91d..f87b8f5 100644 --- a/services/audioflinger/Effects.cpp +++ b/services/audioflinger/Effects.cpp @@ -543,6 +543,13 @@ status_t AudioFlinger::EffectModule::remove_effect_from_hal_l() return NO_ERROR; } +// round up delta valid if value and divisor are positive. +template +static T roundUpDelta(const T &value, const T &divisor) { + T remainder = value % divisor; + return remainder == 0 ? 0 : divisor - remainder; +} + status_t AudioFlinger::EffectModule::command(uint32_t cmdCode, uint32_t cmdSize, void *pCmdData, @@ -558,6 +565,28 @@ status_t AudioFlinger::EffectModule::command(uint32_t cmdCode, if (mStatus != NO_ERROR) { return mStatus; } + if (cmdCode == EFFECT_CMD_GET_PARAM && + (*replySize < sizeof(effect_param_t) || + ((effect_param_t *)pCmdData)->psize > *replySize - sizeof(effect_param_t))) { + android_errorWriteLog(0x534e4554, "29251553"); + return -EINVAL; + } + if ((cmdCode == EFFECT_CMD_SET_PARAM + || cmdCode == EFFECT_CMD_SET_PARAM_DEFERRED) && // DEFERRED not generally used + (sizeof(effect_param_t) > cmdSize + || ((effect_param_t *)pCmdData)->psize > cmdSize + - sizeof(effect_param_t) + || ((effect_param_t *)pCmdData)->vsize > cmdSize + - sizeof(effect_param_t) + - ((effect_param_t *)pCmdData)->psize + || roundUpDelta(((effect_param_t *)pCmdData)->psize, (uint32_t)sizeof(int)) > + cmdSize + - sizeof(effect_param_t) + - ((effect_param_t *)pCmdData)->psize + - ((effect_param_t *)pCmdData)->vsize)) { + android_errorWriteLog(0x534e4554, "30204301"); + return -EINVAL; + } status_t status = (*mEffectInterface)->command(mEffectInterface, cmdCode, cmdSize, -- cgit v1.1 From b6af3b9bc072c4d832db9dc93ff818472cd50069 Mon Sep 17 00:00:00 2001 From: Eric Laurent Date: Wed, 17 Aug 2016 06:19:32 -0700 Subject: soundtrigger: add size check on sound model and recogntion data Bug: 30148546 Change-Id: I082f535a853c96571887eeea37c6d41ecee7d8c0 (cherry picked from commit bb00d8f139ff51336ab3c810d35685003949bcf8) (cherry picked from commit ef0c91518446e65533ca8bab6726a845f27c73fd) --- services/soundtrigger/SoundTriggerHwService.cpp | 38 +++++++++++++++++++------ 1 file changed, 30 insertions(+), 8 deletions(-) (limited to 'services') diff --git a/services/soundtrigger/SoundTriggerHwService.cpp b/services/soundtrigger/SoundTriggerHwService.cpp index 9de6fe2..e428388 100644 --- a/services/soundtrigger/SoundTriggerHwService.cpp +++ b/services/soundtrigger/SoundTriggerHwService.cpp @@ -534,6 +534,22 @@ status_t SoundTriggerHwService::Module::loadSoundModel(const sp& modelM struct sound_trigger_sound_model *sound_model = (struct sound_trigger_sound_model *)modelMemory->pointer(); + size_t structSize; + if (sound_model->type == SOUND_MODEL_TYPE_KEYPHRASE) { + structSize = sizeof(struct sound_trigger_phrase_sound_model); + } else { + structSize = sizeof(struct sound_trigger_sound_model); + } + + if (sound_model->data_offset < structSize || + sound_model->data_size > (UINT_MAX - sound_model->data_offset) || + modelMemory->size() < sound_model->data_offset || + sound_model->data_size > (modelMemory->size() - sound_model->data_offset)) { + android_errorWriteLog(0x534e4554, "30148546"); + ALOGE("loadSoundModel() data_size is too big"); + return BAD_VALUE; + } + AutoMutex lock(mLock); if (mModels.size() >= mDescriptor.properties.max_sound_models) { @@ -603,11 +619,23 @@ status_t SoundTriggerHwService::Module::startRecognition(sound_model_handle_t ha return PERMISSION_DENIED; } - if (dataMemory != 0 && dataMemory->pointer() == NULL) { - ALOGE("startRecognition() dataMemory is non-0 but has NULL pointer()"); + if (dataMemory == 0 || dataMemory->pointer() == NULL) { + ALOGE("startRecognition() dataMemory is 0 or has NULL pointer()"); return BAD_VALUE; } + + struct sound_trigger_recognition_config *config = + (struct sound_trigger_recognition_config *)dataMemory->pointer(); + + if (config->data_offset < sizeof(struct sound_trigger_recognition_config) || + config->data_size > (UINT_MAX - config->data_offset) || + dataMemory->size() < config->data_offset || + config->data_size > (dataMemory->size() - config->data_offset)) { + ALOGE("startRecognition() data_size is too big"); + return BAD_VALUE; + } + AutoMutex lock(mLock); if (mServiceState == SOUND_TRIGGER_STATE_DISABLED) { return INVALID_OPERATION; @@ -616,17 +644,11 @@ status_t SoundTriggerHwService::Module::startRecognition(sound_model_handle_t ha if (model == 0) { return BAD_VALUE; } - if ((dataMemory == 0) || - (dataMemory->size() < sizeof(struct sound_trigger_recognition_config))) { - return BAD_VALUE; - } if (model->mState == Model::STATE_ACTIVE) { return INVALID_OPERATION; } - struct sound_trigger_recognition_config *config = - (struct sound_trigger_recognition_config *)dataMemory->pointer(); //TODO: get capture handle and device from audio policy service config->capture_handle = model->mCaptureIOHandle; -- cgit v1.1 From 3f6bb688b22b184b0bfc2739cda3c3cf0dd06a14 Mon Sep 17 00:00:00 2001 From: irii Date: Sun, 11 Sep 2016 16:51:37 +0200 Subject: libcameraservice: Don't pass NULL args on setCallbacks call *This fixes the torch light for cameras with hal 1 *This fix works on the htc m7ul *Fixed line length *Fixed unused parameter names Change-Id: I89c6112546e36dbcca099f4d5cd70371b2c5340a --- services/camera/libcameraservice/CameraFlashlight.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'services') diff --git a/services/camera/libcameraservice/CameraFlashlight.cpp b/services/camera/libcameraservice/CameraFlashlight.cpp index 406c1c4..62ce610 100644 --- a/services/camera/libcameraservice/CameraFlashlight.cpp +++ b/services/camera/libcameraservice/CameraFlashlight.cpp @@ -828,6 +828,18 @@ status_t CameraHardwareInterfaceFlashControl::initializePreviewWindow( return device->setPreviewWindow(mSurface); } +static void notifyCallback(int32_t, int32_t, int32_t, void*) { + /* Empty */ +} + +static void dataCallback(int32_t, const sp&, camera_frame_metadata_t*, void*) { + /* Empty */ +} + +static void dataCallbackTimestamp(nsecs_t, int32_t, const sp&, void*) { + /* Empty */ +} + status_t CameraHardwareInterfaceFlashControl::connectCameraDevice( const String8& cameraId) { sp device = @@ -841,7 +853,7 @@ status_t CameraHardwareInterfaceFlashControl::connectCameraDevice( } // need to set __get_memory in set_callbacks(). - device->setCallbacks(NULL, NULL, NULL, NULL); + device->setCallbacks(notifyCallback, dataCallback, dataCallbackTimestamp, this); mParameters = device->getParameters(); -- cgit v1.1