From 67651f97c9c3880a4440c86618337f8a64c3e1a9 Mon Sep 17 00:00:00 2001 From: Eric Laurent Date: Mon, 29 Jan 2018 14:27:03 -0800 Subject: [PATCH 1/2] Revert "audio flinger: move record permission checks to audio policy service" This reverts commit c7b71a1b3a16231d7741f9ef52c5f84ec8de0c31. Bug: 72628781 Test: Capture several videos from camera app Change-Id: If633e677d87320335e368a8340599c9e4a398201 --- services/audioflinger/AudioFlinger.cpp | 6 ++++ services/audioflinger/Threads.cpp | 4 +++ .../service/AudioPolicyInterfaceImpl.cpp | 28 ++++--------------- 3 files changed, 15 insertions(+), 23 deletions(-) diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp index 113744f4fb..baab926049 100644 --- a/services/audioflinger/AudioFlinger.cpp +++ b/services/audioflinger/AudioFlinger.cpp @@ -1622,6 +1622,12 @@ sp AudioFlinger::createRecord(const CreateRecordInput& inpu clientPid = callingPid; } + // check calling permissions + if (!recordingAllowed(input.opPackageName, input.clientInfo.clientTid, clientUid)) { + ALOGE("createRecord() permission denied: recording not allowed"); + lStatus = PERMISSION_DENIED; + goto Exit; + } // we don't yet support anything other than linear PCM if (!audio_is_valid_format(input.config.format) || !audio_is_linear_pcm(input.config.format)) { ALOGE("createRecord() invalid format %#x", input.config.format); diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp index 7bfe802947..3d270fca02 100644 --- a/services/audioflinger/Threads.cpp +++ b/services/audioflinger/Threads.cpp @@ -7801,6 +7801,10 @@ status_t AudioFlinger::MmapThread::start(const AudioClient& client, return NO_ERROR; } + if (!isOutput() && !recordingAllowed(client.packageName, client.clientPid, client.clientUid)) { + return PERMISSION_DENIED; + } + audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE; audio_io_handle_t io = mId; diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp index 306de3f123..0ce562c43d 100644 --- a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp +++ b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp @@ -296,7 +296,6 @@ status_t AudioPolicyService::getInputForAttr(const audio_attributes_t *attr, if (mAudioPolicyManager == NULL) { return NO_INIT; } - // already checked by client, but double-check in case the client wrapper is bypassed if (attr->source < AUDIO_SOURCE_DEFAULT && attr->source >= AUDIO_SOURCE_CNT && attr->source != AUDIO_SOURCE_HOTWORD && attr->source != AUDIO_SOURCE_FM_TUNER) { @@ -320,13 +319,6 @@ status_t AudioPolicyService::getInputForAttr(const audio_attributes_t *attr, pid = callingPid; } - // check calling permissions - if (!recordingAllowed(opPackageName, pid, uid)) { - ALOGE("%s permission denied: recording not allowed for uid %d pid %d", - __func__, uid, pid); - return PERMISSION_DENIED; - } - if ((attr->source == AUDIO_SOURCE_HOTWORD) && !captureHotwordAllowed(pid, uid)) { return BAD_VALUE; } @@ -400,28 +392,18 @@ status_t AudioPolicyService::startInput(audio_port_handle_t portId, bool *silenc if (mAudioPolicyManager == NULL) { return NO_INIT; } - sp client; - { - Mutex::Autolock _l(mLock); - ssize_t index = mAudioRecordClients.indexOfKey(portId); - if (index < 0) { - return INVALID_OPERATION; - } - client = mAudioRecordClients.valueAt(index); - } + Mutex::Autolock _l(mLock); - // check calling permissions - if (!recordingAllowed(client->opPackageName, client->pid, client->uid)) { - ALOGE("%s permission denied: recording not allowed for uid %d pid %d", - __func__, client->uid, client->pid); - return PERMISSION_DENIED; + ssize_t index = mAudioRecordClients.indexOfKey(portId); + if (index < 0) { + return INVALID_OPERATION; } + sp client = mAudioRecordClients.valueAt(index); // If UID inactive it records silence until becoming active *silenced = !mUidPolicy->isUidActive(client->uid) && !client->isVirtualDevice; - Mutex::Autolock _l(mLock); AudioPolicyInterface::concurrency_type__mask_t concurrency = AudioPolicyInterface::API_INPUT_CONCURRENCY_NONE; From e9ebcdbb0580bd4a75f4530b957b1859e535c028 Mon Sep 17 00:00:00 2001 From: Eric Laurent Date: Mon, 29 Jan 2018 14:27:18 -0800 Subject: [PATCH 2/2] Revert "audio policy: refactor audio record APIs" This reverts commit 0f4b3c5449f85c1cd78e1b9ac4850de962b8edbe. Bug: 72628781 Test: Capture several videos from camera app Change-Id: I6bcc87c618ac9bfe5c911915cbb37de616bc727a --- media/libaudioclient/AudioSystem.cpp | 21 ++++--- media/libaudioclient/IAudioPolicyService.cpp | 44 ++++++++----- .../include/media/AudioSystem.h | 12 ++-- .../include/media/IAudioPolicyService.h | 12 ++-- services/audioflinger/AudioFlinger.cpp | 8 +-- services/audioflinger/Threads.cpp | 16 ++--- services/audioflinger/Tracks.cpp | 6 +- .../service/AudioPolicyInterfaceImpl.cpp | 61 ++++++------------- .../audiopolicy/service/AudioPolicyService.h | 38 +++--------- 9 files changed, 96 insertions(+), 122 deletions(-) diff --git a/media/libaudioclient/AudioSystem.cpp b/media/libaudioclient/AudioSystem.cpp index 7783ad364a..3bb09d2d9d 100644 --- a/media/libaudioclient/AudioSystem.cpp +++ b/media/libaudioclient/AudioSystem.cpp @@ -904,7 +904,6 @@ status_t AudioSystem::getInputForAttr(const audio_attributes_t *attr, audio_session_t session, pid_t pid, uid_t uid, - const String16& opPackageName, const audio_config_base_t *config, audio_input_flags_t flags, audio_port_handle_t *selectedDeviceId, @@ -913,29 +912,35 @@ status_t AudioSystem::getInputForAttr(const audio_attributes_t *attr, const sp& aps = AudioSystem::get_audio_policy_service(); if (aps == 0) return NO_INIT; return aps->getInputForAttr( - attr, input, session, pid, uid, opPackageName, + attr, input, session, pid, uid, config, flags, selectedDeviceId, portId); } -status_t AudioSystem::startInput(audio_port_handle_t portId, bool *silenced) +status_t AudioSystem::startInput(audio_io_handle_t input, + audio_session_t session, + audio_devices_t device, + uid_t uid, + bool *silenced) { const sp& aps = AudioSystem::get_audio_policy_service(); if (aps == 0) return PERMISSION_DENIED; - return aps->startInput(portId, silenced); + return aps->startInput(input, session, device, uid, silenced); } -status_t AudioSystem::stopInput(audio_port_handle_t portId) +status_t AudioSystem::stopInput(audio_io_handle_t input, + audio_session_t session) { const sp& aps = AudioSystem::get_audio_policy_service(); if (aps == 0) return PERMISSION_DENIED; - return aps->stopInput(portId); + return aps->stopInput(input, session); } -void AudioSystem::releaseInput(audio_port_handle_t portId) +void AudioSystem::releaseInput(audio_io_handle_t input, + audio_session_t session) { const sp& aps = AudioSystem::get_audio_policy_service(); if (aps == 0) return; - aps->releaseInput(portId); + aps->releaseInput(input, session); } status_t AudioSystem::initStreamVolume(audio_stream_type_t stream, diff --git a/media/libaudioclient/IAudioPolicyService.cpp b/media/libaudioclient/IAudioPolicyService.cpp index b91e4cf191..6478975598 100644 --- a/media/libaudioclient/IAudioPolicyService.cpp +++ b/media/libaudioclient/IAudioPolicyService.cpp @@ -285,7 +285,6 @@ public: audio_session_t session, pid_t pid, uid_t uid, - const String16& opPackageName, const audio_config_base_t *config, audio_input_flags_t flags, audio_port_handle_t *selectedDeviceId, @@ -314,7 +313,6 @@ public: data.writeInt32(session); data.writeInt32(pid); data.writeInt32(uid); - data.writeString16(opPackageName); data.write(config, sizeof(audio_config_base_t)); data.writeInt32(flags); data.writeInt32(*selectedDeviceId); @@ -333,12 +331,18 @@ public: return NO_ERROR; } - virtual status_t startInput(audio_port_handle_t portId, + virtual status_t startInput(audio_io_handle_t input, + audio_session_t session, + audio_devices_t device, + uid_t uid, bool *silenced) { Parcel data, reply; data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); - data.writeInt32(portId); + data.writeInt32(input); + data.writeInt32(session); + data.writeInt32(device); + data.writeInt32(uid); data.writeInt32(*silenced ? 1 : 0); remote()->transact(START_INPUT, data, &reply); status_t status = static_cast (reply.readInt32()); @@ -346,20 +350,24 @@ public: return status; } - virtual status_t stopInput(audio_port_handle_t portId) + virtual status_t stopInput(audio_io_handle_t input, + audio_session_t session) { Parcel data, reply; data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); - data.writeInt32(portId); + data.writeInt32(input); + data.writeInt32(session); remote()->transact(STOP_INPUT, data, &reply); return static_cast (reply.readInt32()); } - virtual void releaseInput(audio_port_handle_t portId) + virtual void releaseInput(audio_io_handle_t input, + audio_session_t session) { Parcel data, reply; data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); - data.writeInt32(portId); + data.writeInt32(input); + data.writeInt32(session); remote()->transact(RELEASE_INPUT, data, &reply); } @@ -1026,7 +1034,6 @@ status_t BnAudioPolicyService::onTransact( audio_session_t session = (audio_session_t)data.readInt32(); pid_t pid = (pid_t)data.readInt32(); uid_t uid = (uid_t)data.readInt32(); - const String16 opPackageName = data.readString16(); audio_config_base_t config; memset(&config, 0, sizeof(audio_config_base_t)); data.read(&config, sizeof(audio_config_base_t)); @@ -1034,7 +1041,7 @@ status_t BnAudioPolicyService::onTransact( audio_port_handle_t selectedDeviceId = (audio_port_handle_t) data.readInt32(); audio_port_handle_t portId = (audio_port_handle_t)data.readInt32(); status_t status = getInputForAttr(&attr, &input, session, pid, uid, - opPackageName, &config, + &config, flags, &selectedDeviceId, &portId); reply->writeInt32(status); if (status == NO_ERROR) { @@ -1047,9 +1054,12 @@ status_t BnAudioPolicyService::onTransact( case START_INPUT: { CHECK_INTERFACE(IAudioPolicyService, data, reply); - audio_port_handle_t portId = static_cast (data.readInt32()); + audio_io_handle_t input = static_cast (data.readInt32()); + audio_session_t session = static_cast (data.readInt32()); + audio_devices_t device = static_cast (data.readInt32()); + uid_t uid = static_cast (data.readInt32()); bool silenced = data.readInt32() == 1; - status_t status = startInput(portId, &silenced); + status_t status = startInput(input, session, device, uid, &silenced); reply->writeInt32(static_cast (status)); reply->writeInt32(silenced ? 1 : 0); return NO_ERROR; @@ -1057,15 +1067,17 @@ status_t BnAudioPolicyService::onTransact( case STOP_INPUT: { CHECK_INTERFACE(IAudioPolicyService, data, reply); - audio_port_handle_t portId = static_cast (data.readInt32()); - reply->writeInt32(static_cast (stopInput(portId))); + audio_io_handle_t input = static_cast (data.readInt32()); + audio_session_t session = static_cast (data.readInt32()); + reply->writeInt32(static_cast (stopInput(input, session))); return NO_ERROR; } break; case RELEASE_INPUT: { CHECK_INTERFACE(IAudioPolicyService, data, reply); - audio_port_handle_t portId = static_cast (data.readInt32()); - releaseInput(portId); + audio_io_handle_t input = static_cast (data.readInt32()); + audio_session_t session = static_cast (data.readInt32()); + releaseInput(input, session); return NO_ERROR; } break; diff --git a/media/libaudioclient/include/media/AudioSystem.h b/media/libaudioclient/include/media/AudioSystem.h index 52dcfaad88..f7c3d039be 100644 --- a/media/libaudioclient/include/media/AudioSystem.h +++ b/media/libaudioclient/include/media/AudioSystem.h @@ -239,16 +239,20 @@ public: audio_session_t session, pid_t pid, uid_t uid, - const String16& opPackageName, const audio_config_base_t *config, audio_input_flags_t flags, audio_port_handle_t *selectedDeviceId, audio_port_handle_t *portId); - static status_t startInput(audio_port_handle_t portId, + static status_t startInput(audio_io_handle_t input, + audio_session_t session, + audio_devices_t device, + uid_t uid, bool *silenced); - static status_t stopInput(audio_port_handle_t portId); - static void releaseInput(audio_port_handle_t portId); + static status_t stopInput(audio_io_handle_t input, + audio_session_t session); + static void releaseInput(audio_io_handle_t input, + audio_session_t session); static status_t initStreamVolume(audio_stream_type_t stream, int indexMin, int indexMax); diff --git a/media/libaudioclient/include/media/IAudioPolicyService.h b/media/libaudioclient/include/media/IAudioPolicyService.h index 949d593dcd..533892731b 100644 --- a/media/libaudioclient/include/media/IAudioPolicyService.h +++ b/media/libaudioclient/include/media/IAudioPolicyService.h @@ -80,15 +80,19 @@ public: audio_session_t session, pid_t pid, uid_t uid, - const String16& opPackageName, const audio_config_base_t *config, audio_input_flags_t flags, audio_port_handle_t *selectedDeviceId, audio_port_handle_t *portId) = 0; - virtual status_t startInput(audio_port_handle_t portId, + virtual status_t startInput(audio_io_handle_t input, + audio_session_t session, + audio_devices_t device, + uid_t uid, bool *silenced) = 0; - virtual status_t stopInput(audio_port_handle_t portId) = 0; - virtual void releaseInput(audio_port_handle_t portId) = 0; + virtual status_t stopInput(audio_io_handle_t input, + audio_session_t session) = 0; + virtual void releaseInput(audio_io_handle_t input, + audio_session_t session) = 0; virtual status_t initStreamVolume(audio_stream_type_t stream, int indexMin, int indexMax) = 0; diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp index baab926049..e362530e7b 100644 --- a/services/audioflinger/AudioFlinger.cpp +++ b/services/audioflinger/AudioFlinger.cpp @@ -321,7 +321,6 @@ status_t AudioFlinger::openMmapStream(MmapStreamInterface::stream_direction_t di actualSessionId, client.clientPid, client.clientUid, - client.packageName, config, AUDIO_INPUT_FLAG_MMAP_NOIRQ, deviceId, &portId); } @@ -341,7 +340,7 @@ status_t AudioFlinger::openMmapStream(MmapStreamInterface::stream_direction_t di if (direction == MmapStreamInterface::DIRECTION_OUTPUT) { AudioSystem::releaseOutput(io, streamType, actualSessionId); } else { - AudioSystem::releaseInput(portId); + AudioSystem::releaseInput(io, actualSessionId); } ret = NO_INIT; } @@ -1664,7 +1663,7 @@ sp AudioFlinger::createRecord(const CreateRecordInput& inpu // release previously opened input if retrying. if (output.inputId != AUDIO_IO_HANDLE_NONE) { recordTrack.clear(); - AudioSystem::releaseInput(portId); + AudioSystem::releaseInput(output.inputId, sessionId); output.inputId = AUDIO_IO_HANDLE_NONE; } lStatus = AudioSystem::getInputForAttr(&input.attr, &output.inputId, @@ -1672,7 +1671,6 @@ sp AudioFlinger::createRecord(const CreateRecordInput& inpu // FIXME compare to AudioTrack clientPid, clientUid, - input.opPackageName, &input.config, output.flags, &output.selectedDeviceId, &portId); @@ -1741,7 +1739,7 @@ Exit: } recordTrack.clear(); if (output.inputId != AUDIO_IO_HANDLE_NONE) { - AudioSystem::releaseInput(portId); + AudioSystem::releaseInput(output.inputId, sessionId); } } diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp index 3d270fca02..420e6e1f08 100644 --- a/services/audioflinger/Threads.cpp +++ b/services/audioflinger/Threads.cpp @@ -6936,7 +6936,8 @@ status_t AudioFlinger::RecordThread::start(RecordThread::RecordTrack* recordTrac if (recordTrack->isExternalTrack()) { mLock.unlock(); bool silenced; - status = AudioSystem::startInput(recordTrack->portId(), &silenced); + status = AudioSystem::startInput(mId, recordTrack->sessionId(), + mInDevice, recordTrack->uid(), &silenced); mLock.lock(); // FIXME should verify that recordTrack is still in mActiveTracks if (status != NO_ERROR) { @@ -6968,7 +6969,7 @@ status_t AudioFlinger::RecordThread::start(RecordThread::RecordTrack* recordTrac startError: if (recordTrack->isExternalTrack()) { - AudioSystem::stopInput(recordTrack->portId()); + AudioSystem::stopInput(mId, recordTrack->sessionId()); } recordTrack->clearSyncStartEvent(); // FIXME I wonder why we do not reset the state here? @@ -7741,7 +7742,7 @@ void AudioFlinger::MmapThread::disconnect() if (isOutput()) { AudioSystem::releaseOutput(mId, streamType(), mSessionId); } else { - AudioSystem::releaseInput(mPortId); + AudioSystem::releaseInput(mId, mSessionId); } } @@ -7836,7 +7837,6 @@ status_t AudioFlinger::MmapThread::start(const AudioClient& client, mSessionId, client.clientPid, client.clientUid, - client.packageName, &config, AUDIO_INPUT_FLAG_MMAP_NOIRQ, &deviceId, @@ -7855,7 +7855,7 @@ status_t AudioFlinger::MmapThread::start(const AudioClient& client, } else { // TODO: Block recording for idle UIDs (b/72134552) bool silenced; - ret = AudioSystem::startInput(portId, &silenced); + ret = AudioSystem::startInput(mId, mSessionId, mInDevice, client.clientUid, &silenced); } // abort if start is rejected by audio policy manager @@ -7865,7 +7865,7 @@ status_t AudioFlinger::MmapThread::start(const AudioClient& client, if (isOutput()) { AudioSystem::releaseOutput(mId, streamType(), mSessionId); } else { - AudioSystem::releaseInput(portId); + AudioSystem::releaseInput(mId, mSessionId); } } else { mHalStream->stop(); @@ -7922,8 +7922,8 @@ status_t AudioFlinger::MmapThread::stop(audio_port_handle_t handle) AudioSystem::stopOutput(mId, streamType(), track->sessionId()); AudioSystem::releaseOutput(mId, streamType(), track->sessionId()); } else { - AudioSystem::stopInput(track->portId()); - AudioSystem::releaseInput(track->portId()); + AudioSystem::stopInput(mId, track->sessionId()); + AudioSystem::releaseInput(mId, track->sessionId()); } sp chain = getEffectChain_l(track->sessionId()); diff --git a/services/audioflinger/Tracks.cpp b/services/audioflinger/Tracks.cpp index 06bbf1e395..cdd8ca00ef 100644 --- a/services/audioflinger/Tracks.cpp +++ b/services/audioflinger/Tracks.cpp @@ -1687,7 +1687,7 @@ void AudioFlinger::RecordThread::RecordTrack::stop() if (thread != 0) { RecordThread *recordThread = (RecordThread *)thread.get(); if (recordThread->stop(this) && isExternalTrack()) { - AudioSystem::stopInput(mPortId); + AudioSystem::stopInput(mThreadIoHandle, mSessionId); } } } @@ -1699,9 +1699,9 @@ void AudioFlinger::RecordThread::RecordTrack::destroy() { if (isExternalTrack()) { if (mState == ACTIVE || mState == RESUMING) { - AudioSystem::stopInput(mPortId); + AudioSystem::stopInput(mThreadIoHandle, mSessionId); } - AudioSystem::releaseInput(mPortId); + AudioSystem::releaseInput(mThreadIoHandle, mSessionId); } sp thread = mThread.promote(); if (thread != 0) { diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp index 0ce562c43d..f1d7d86850 100644 --- a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp +++ b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp @@ -287,7 +287,6 @@ status_t AudioPolicyService::getInputForAttr(const audio_attributes_t *attr, audio_session_t session, pid_t pid, uid_t uid, - const String16& opPackageName, const audio_config_base_t *config, audio_input_flags_t flags, audio_port_handle_t *selectedDeviceId, @@ -368,13 +367,6 @@ status_t AudioPolicyService::getInputForAttr(const audio_attributes_t *attr, } return status; } - - sp client = - new AudioRecordClient(*attr, *input, uid, pid, opPackageName, session); - client->active = false; - client->isConcurrent = false; - client->isVirtualDevice = false; //TODO : update from APM->getInputForAttr() - mAudioRecordClients.add(*portId, client); } if (audioPolicyEffects != 0) { @@ -387,28 +379,23 @@ status_t AudioPolicyService::getInputForAttr(const audio_attributes_t *attr, return NO_ERROR; } -status_t AudioPolicyService::startInput(audio_port_handle_t portId, bool *silenced) +status_t AudioPolicyService::startInput(audio_io_handle_t input, + audio_session_t session, + audio_devices_t device, + uid_t uid, + bool *silenced) { + // If UID inactive it records silence until becoming active + *silenced = !mUidPolicy->isUidActive(uid) && !is_virtual_input_device(device); + if (mAudioPolicyManager == NULL) { return NO_INIT; } Mutex::Autolock _l(mLock); - - ssize_t index = mAudioRecordClients.indexOfKey(portId); - if (index < 0) { - return INVALID_OPERATION; - } - sp client = mAudioRecordClients.valueAt(index); - - // If UID inactive it records silence until becoming active - *silenced = !mUidPolicy->isUidActive(client->uid) && !client->isVirtualDevice; - AudioPolicyInterface::concurrency_type__mask_t concurrency = AudioPolicyInterface::API_INPUT_CONCURRENCY_NONE; - - status_t status = mAudioPolicyManager->startInput( - client->input, client->session, *silenced, &concurrency); + status_t status = mAudioPolicyManager->startInput(input, session, *silenced, &concurrency); if (status == NO_ERROR) { LOG_ALWAYS_FATAL_IF(concurrency & ~AudioPolicyInterface::API_INPUT_CONCURRENCY_ALL, @@ -426,52 +413,38 @@ status_t AudioPolicyService::startInput(audio_port_handle_t portId, bool *silenc return status; } -status_t AudioPolicyService::stopInput(audio_port_handle_t portId) +status_t AudioPolicyService::stopInput(audio_io_handle_t input, + audio_session_t session) { if (mAudioPolicyManager == NULL) { return NO_INIT; } Mutex::Autolock _l(mLock); - ssize_t index = mAudioRecordClients.indexOfKey(portId); - if (index < 0) { - return INVALID_OPERATION; - } - sp client = mAudioRecordClients.valueAt(index); - - return mAudioPolicyManager->stopInput(client->input, client->session); + return mAudioPolicyManager->stopInput(input, session); } -void AudioPolicyService::releaseInput(audio_port_handle_t portId) +void AudioPolicyService::releaseInput(audio_io_handle_t input, + audio_session_t session) { if (mAudioPolicyManager == NULL) { return; } spaudioPolicyEffects; - sp client; { Mutex::Autolock _l(mLock); audioPolicyEffects = mAudioPolicyEffects; - ssize_t index = mAudioRecordClients.indexOfKey(portId); - if (index < 0) { - return; - } - client = mAudioRecordClients.valueAt(index); - mAudioRecordClients.removeItem(portId); - } - if (client == 0) { - return; } if (audioPolicyEffects != 0) { // release audio processors from the input - status_t status = audioPolicyEffects->releaseInputEffects(client->input, client->session); + status_t status = audioPolicyEffects->releaseInputEffects(input, session); if(status != NO_ERROR) { - ALOGW("Failed to release effects on input %d", client->input); + ALOGW("Failed to release effects on input %d", input); } } { Mutex::Autolock _l(mLock); - mAudioPolicyManager->releaseInput(client->input, client->session); + mAudioPolicyManager->releaseInput(input, session); } } diff --git a/services/audiopolicy/service/AudioPolicyService.h b/services/audiopolicy/service/AudioPolicyService.h index bfa3ef40d5..c21aa58e04 100644 --- a/services/audiopolicy/service/AudioPolicyService.h +++ b/services/audiopolicy/service/AudioPolicyService.h @@ -98,15 +98,19 @@ public: audio_session_t session, pid_t pid, uid_t uid, - const String16& opPackageName, const audio_config_base_t *config, audio_input_flags_t flags, audio_port_handle_t *selectedDeviceId = NULL, audio_port_handle_t *portId = NULL); - virtual status_t startInput(audio_port_handle_t portId, + virtual status_t startInput(audio_io_handle_t input, + audio_session_t session, + audio_devices_t device, + uid_t uid, bool *silenced); - virtual status_t stopInput(audio_port_handle_t portId); - virtual void releaseInput(audio_port_handle_t portId); + virtual status_t stopInput(audio_io_handle_t input, + audio_session_t session); + virtual void releaseInput(audio_io_handle_t input, + audio_session_t session); virtual status_t initStreamVolume(audio_stream_type_t stream, int indexMin, int indexMax); @@ -607,31 +611,6 @@ private: bool mAudioPortCallbacksEnabled; }; - // --- AudioRecordClient --- - // Information about each registered AudioRecord client - // (between calls to getInputForAttr() and releaseInput()) - class AudioRecordClient : public RefBase { - public: - AudioRecordClient(const audio_attributes_t attributes, - const audio_io_handle_t input, uid_t uid, pid_t pid, - const String16& opPackageName, const audio_session_t session) : - attributes(attributes), - input(input), uid(uid), pid(pid), - opPackageName(opPackageName), session(session), - active(false), isConcurrent(false), isVirtualDevice(false) {} - virtual ~AudioRecordClient() {} - - const audio_attributes_t attributes; // source, flags ... - const audio_io_handle_t input; // audio HAL input IO handle - const uid_t uid; // client UID - const pid_t pid; // client PID - const String16 opPackageName; // client package name - const audio_session_t session; // audio session ID - bool active; // Capture is active or inactive - bool isConcurrent; // is allowed to concurrent capture - bool isVirtualDevice; // uses vitual device: updated by APM::getInputForAttr() - }; - // Internal dump utilities. status_t dumpPermissionDenial(int fd); @@ -657,7 +636,6 @@ private: audio_mode_t mPhoneState; sp mUidPolicy; - DefaultKeyedVector< audio_port_handle_t, sp > mAudioRecordClients; }; } // namespace android