diff options
-rw-r--r-- | include/media/AudioSystem.h | 9 | ||||
-rw-r--r-- | include/media/IAudioPolicyService.h | 9 | ||||
-rw-r--r-- | media/libmedia/AudioRecord.cpp | 2 | ||||
-rw-r--r-- | media/libmedia/AudioSystem.cpp | 15 | ||||
-rw-r--r-- | media/libmedia/IAudioPolicyService.cpp | 21 | ||||
-rw-r--r-- | services/audioflinger/Threads.cpp | 4 | ||||
-rw-r--r-- | services/audioflinger/Tracks.cpp | 6 | ||||
-rw-r--r-- | services/audiopolicy/AudioPolicyInterface.h | 11 | ||||
-rw-r--r-- | services/audiopolicy/AudioPolicyInterfaceImpl.cpp | 19 | ||||
-rw-r--r-- | services/audiopolicy/AudioPolicyInterfaceImplLegacy.cpp | 9 | ||||
-rw-r--r-- | services/audiopolicy/AudioPolicyManager.cpp | 39 | ||||
-rw-r--r-- | services/audiopolicy/AudioPolicyManager.h | 12 | ||||
-rw-r--r-- | services/audiopolicy/AudioPolicyService.h | 9 |
13 files changed, 111 insertions, 54 deletions
diff --git a/include/media/AudioSystem.h b/include/media/AudioSystem.h index 2e3cab0..cf34991 100644 --- a/include/media/AudioSystem.h +++ b/include/media/AudioSystem.h @@ -237,9 +237,12 @@ public: int sessionId, audio_input_flags_t); - static status_t startInput(audio_io_handle_t input); - static status_t stopInput(audio_io_handle_t input); - static void releaseInput(audio_io_handle_t input); + static status_t startInput(audio_io_handle_t input, + audio_session_t session); + 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/include/media/IAudioPolicyService.h b/include/media/IAudioPolicyService.h index e08b5ae..abbda32 100644 --- a/include/media/IAudioPolicyService.h +++ b/include/media/IAudioPolicyService.h @@ -75,9 +75,12 @@ public: audio_channel_mask_t channelMask, int audioSession, audio_input_flags_t flags) = 0; - virtual status_t startInput(audio_io_handle_t input) = 0; - virtual status_t stopInput(audio_io_handle_t input) = 0; - virtual void releaseInput(audio_io_handle_t input) = 0; + virtual status_t startInput(audio_io_handle_t input, + audio_session_t session) = 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/media/libmedia/AudioRecord.cpp b/media/libmedia/AudioRecord.cpp index 299a77c..9e7ba88 100644 --- a/media/libmedia/AudioRecord.cpp +++ b/media/libmedia/AudioRecord.cpp @@ -572,7 +572,7 @@ status_t AudioRecord::openRecord_l(size_t epoch) } release: - AudioSystem::releaseInput(input); + AudioSystem::releaseInput(input, (audio_session_t)mSessionId); if (status == NO_ERROR) { status = NO_INIT; } diff --git a/media/libmedia/AudioSystem.cpp b/media/libmedia/AudioSystem.cpp index 0d61885..365a594 100644 --- a/media/libmedia/AudioSystem.cpp +++ b/media/libmedia/AudioSystem.cpp @@ -696,25 +696,28 @@ audio_io_handle_t AudioSystem::getInput(audio_source_t inputSource, return aps->getInput(inputSource, samplingRate, format, channelMask, sessionId, flags); } -status_t AudioSystem::startInput(audio_io_handle_t input) +status_t AudioSystem::startInput(audio_io_handle_t input, + audio_session_t session) { const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); if (aps == 0) return PERMISSION_DENIED; - return aps->startInput(input); + return aps->startInput(input, session); } -status_t AudioSystem::stopInput(audio_io_handle_t input) +status_t AudioSystem::stopInput(audio_io_handle_t input, + audio_session_t session) { const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); if (aps == 0) return PERMISSION_DENIED; - return aps->stopInput(input); + return aps->stopInput(input, session); } -void AudioSystem::releaseInput(audio_io_handle_t input) +void AudioSystem::releaseInput(audio_io_handle_t input, + audio_session_t session) { const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); if (aps == 0) return; - aps->releaseInput(input); + aps->releaseInput(input, session); } status_t AudioSystem::initStreamVolume(audio_stream_type_t stream, diff --git a/media/libmedia/IAudioPolicyService.cpp b/media/libmedia/IAudioPolicyService.cpp index 40dfb58..1593b17 100644 --- a/media/libmedia/IAudioPolicyService.cpp +++ b/media/libmedia/IAudioPolicyService.cpp @@ -240,29 +240,35 @@ public: return static_cast <audio_io_handle_t> (reply.readInt32()); } - virtual status_t startInput(audio_io_handle_t input) + virtual status_t startInput(audio_io_handle_t input, + audio_session_t session) { Parcel data, reply; data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); data.writeInt32(input); + data.writeInt32(session); remote()->transact(START_INPUT, data, &reply); return static_cast <status_t> (reply.readInt32()); } - virtual status_t stopInput(audio_io_handle_t input) + virtual status_t stopInput(audio_io_handle_t input, + audio_session_t session) { Parcel data, reply; data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); data.writeInt32(input); + data.writeInt32(session); remote()->transact(STOP_INPUT, data, &reply); return static_cast <status_t> (reply.readInt32()); } - virtual void releaseInput(audio_io_handle_t input) + virtual void releaseInput(audio_io_handle_t input, + audio_session_t session) { Parcel data, reply; data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); data.writeInt32(input); + data.writeInt32(session); remote()->transact(RELEASE_INPUT, data, &reply); } @@ -723,21 +729,24 @@ status_t BnAudioPolicyService::onTransact( case START_INPUT: { CHECK_INTERFACE(IAudioPolicyService, data, reply); audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32()); - reply->writeInt32(static_cast <uint32_t>(startInput(input))); + audio_session_t session = static_cast <audio_session_t>(data.readInt32()); + reply->writeInt32(static_cast <uint32_t>(startInput(input, session))); return NO_ERROR; } break; case STOP_INPUT: { CHECK_INTERFACE(IAudioPolicyService, data, reply); audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32()); - reply->writeInt32(static_cast <uint32_t>(stopInput(input))); + audio_session_t session = static_cast <audio_session_t>(data.readInt32()); + reply->writeInt32(static_cast <uint32_t>(stopInput(input, session))); return NO_ERROR; } break; case RELEASE_INPUT: { CHECK_INTERFACE(IAudioPolicyService, data, reply); audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32()); - releaseInput(input); + audio_session_t session = static_cast <audio_session_t>(data.readInt32()); + releaseInput(input, session); return NO_ERROR; } break; diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp index 0ef5bb8..2e2f533 100644 --- a/services/audioflinger/Threads.cpp +++ b/services/audioflinger/Threads.cpp @@ -5649,7 +5649,7 @@ status_t AudioFlinger::RecordThread::start(RecordThread::RecordTrack* recordTrac status_t status = NO_ERROR; if (recordTrack->isExternalTrack()) { mLock.unlock(); - status = AudioSystem::startInput(mId); + status = AudioSystem::startInput(mId, (audio_session_t)recordTrack->sessionId()); mLock.lock(); // FIXME should verify that recordTrack is still in mActiveTracks if (status != NO_ERROR) { @@ -5684,7 +5684,7 @@ status_t AudioFlinger::RecordThread::start(RecordThread::RecordTrack* recordTrac startError: if (recordTrack->isExternalTrack()) { - AudioSystem::stopInput(mId); + AudioSystem::stopInput(mId, (audio_session_t)recordTrack->sessionId()); } recordTrack->clearSyncStartEvent(); // FIXME I wonder why we do not reset the state here? diff --git a/services/audioflinger/Tracks.cpp b/services/audioflinger/Tracks.cpp index e81697f..48093da 100644 --- a/services/audioflinger/Tracks.cpp +++ b/services/audioflinger/Tracks.cpp @@ -2050,7 +2050,7 @@ void AudioFlinger::RecordThread::RecordTrack::stop() if (thread != 0) { RecordThread *recordThread = (RecordThread *)thread.get(); if (recordThread->stop(this) && isExternalTrack()) { - AudioSystem::stopInput(recordThread->id()); + AudioSystem::stopInput(recordThread->id(), (audio_session_t)mSessionId); } } } @@ -2064,9 +2064,9 @@ void AudioFlinger::RecordThread::RecordTrack::destroy() if (thread != 0) { if (isExternalTrack()) { if (mState == ACTIVE || mState == RESUMING) { - AudioSystem::stopInput(thread->id()); + AudioSystem::stopInput(thread->id(), (audio_session_t)mSessionId); } - AudioSystem::releaseInput(thread->id()); + AudioSystem::releaseInput(thread->id(), (audio_session_t)mSessionId); } Mutex::Autolock _l(thread->mLock); RecordThread *recordThread = (RecordThread *) thread.get(); diff --git a/services/audiopolicy/AudioPolicyInterface.h b/services/audiopolicy/AudioPolicyInterface.h index 749350a..50ee803 100644 --- a/services/audiopolicy/AudioPolicyInterface.h +++ b/services/audiopolicy/AudioPolicyInterface.h @@ -112,14 +112,17 @@ public: uint32_t samplingRate, audio_format_t format, audio_channel_mask_t channelMask, - audio_in_acoustics_t acoustics, + audio_session_t session, audio_input_flags_t flags) = 0; // indicates to the audio policy manager that the input starts being used. - virtual status_t startInput(audio_io_handle_t input) = 0; + virtual status_t startInput(audio_io_handle_t input, + audio_session_t session) = 0; // indicates to the audio policy manager that the input stops being used. - virtual status_t stopInput(audio_io_handle_t input) = 0; + virtual status_t stopInput(audio_io_handle_t input, + audio_session_t session) = 0; // releases the input. - virtual void releaseInput(audio_io_handle_t input) = 0; + virtual void releaseInput(audio_io_handle_t input, + audio_session_t session) = 0; // // volume control functions diff --git a/services/audiopolicy/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/AudioPolicyInterfaceImpl.cpp index 4a55bec..75745b3 100644 --- a/services/audiopolicy/AudioPolicyInterfaceImpl.cpp +++ b/services/audiopolicy/AudioPolicyInterfaceImpl.cpp @@ -232,8 +232,8 @@ audio_io_handle_t AudioPolicyService::getInput(audio_source_t inputSource, Mutex::Autolock _l(mLock); // the audio_in_acoustics_t parameter is ignored by get_input() audio_io_handle_t input = mAudioPolicyManager->getInput(inputSource, samplingRate, - format, channelMask, (audio_in_acoustics_t) 0, - flags); + format, channelMask, + (audio_session_t)audioSession, flags); if (input == 0) { return input; @@ -248,33 +248,36 @@ audio_io_handle_t AudioPolicyService::getInput(audio_source_t inputSource, return input; } -status_t AudioPolicyService::startInput(audio_io_handle_t input) +status_t AudioPolicyService::startInput(audio_io_handle_t input, + audio_session_t session) { if (mAudioPolicyManager == NULL) { return NO_INIT; } Mutex::Autolock _l(mLock); - return mAudioPolicyManager->startInput(input); + return mAudioPolicyManager->startInput(input, session); } -status_t AudioPolicyService::stopInput(audio_io_handle_t input) +status_t AudioPolicyService::stopInput(audio_io_handle_t input, + audio_session_t session) { if (mAudioPolicyManager == NULL) { return NO_INIT; } Mutex::Autolock _l(mLock); - return mAudioPolicyManager->stopInput(input); + return mAudioPolicyManager->stopInput(input, session); } -void AudioPolicyService::releaseInput(audio_io_handle_t input) +void AudioPolicyService::releaseInput(audio_io_handle_t input, + audio_session_t session) { if (mAudioPolicyManager == NULL) { return; } Mutex::Autolock _l(mLock); - mAudioPolicyManager->releaseInput(input); + mAudioPolicyManager->releaseInput(input, session); // release audio processors from the input status_t status = mAudioPolicyEffects->releaseInputEffects(input); diff --git a/services/audiopolicy/AudioPolicyInterfaceImplLegacy.cpp b/services/audiopolicy/AudioPolicyInterfaceImplLegacy.cpp index 5ef02e5..aa46ace 100644 --- a/services/audiopolicy/AudioPolicyInterfaceImplLegacy.cpp +++ b/services/audiopolicy/AudioPolicyInterfaceImplLegacy.cpp @@ -235,7 +235,8 @@ audio_io_handle_t AudioPolicyService::getInput(audio_source_t inputSource, return input; } -status_t AudioPolicyService::startInput(audio_io_handle_t input) +status_t AudioPolicyService::startInput(audio_io_handle_t input, + audio_session_t session __unused) { if (mpAudioPolicy == NULL) { return NO_INIT; @@ -245,7 +246,8 @@ status_t AudioPolicyService::startInput(audio_io_handle_t input) return mpAudioPolicy->start_input(mpAudioPolicy, input); } -status_t AudioPolicyService::stopInput(audio_io_handle_t input) +status_t AudioPolicyService::stopInput(audio_io_handle_t input, + audio_session_t session __unused) { if (mpAudioPolicy == NULL) { return NO_INIT; @@ -255,7 +257,8 @@ status_t AudioPolicyService::stopInput(audio_io_handle_t input) return mpAudioPolicy->stop_input(mpAudioPolicy, input); } -void AudioPolicyService::releaseInput(audio_io_handle_t input) +void AudioPolicyService::releaseInput(audio_io_handle_t input, + audio_session_t session __unused) { if (mpAudioPolicy == NULL) { return; diff --git a/services/audiopolicy/AudioPolicyManager.cpp b/services/audiopolicy/AudioPolicyManager.cpp index 7fd9b3a..37f8513 100644 --- a/services/audiopolicy/AudioPolicyManager.cpp +++ b/services/audiopolicy/AudioPolicyManager.cpp @@ -1062,12 +1062,12 @@ audio_io_handle_t AudioPolicyManager::getInput(audio_source_t inputSource, uint32_t samplingRate, audio_format_t format, audio_channel_mask_t channelMask, - audio_in_acoustics_t acoustics, + audio_session_t session, audio_input_flags_t flags) { - ALOGV("getInput() inputSource %d, samplingRate %d, format %d, channelMask %x, acoustics %x, " + ALOGV("getInput() inputSource %d, samplingRate %d, format %d, channelMask %x, session %d, " "flags %#x", - inputSource, samplingRate, format, channelMask, acoustics, flags); + inputSource, samplingRate, format, channelMask, session, flags); audio_devices_t device = getDeviceForInputSource(inputSource); @@ -1142,13 +1142,15 @@ audio_io_handle_t AudioPolicyManager::getInput(audio_source_t inputSource, inputDesc->mFormat = format; inputDesc->mChannelMask = channelMask; inputDesc->mDevice = device; + inputDesc->mSessions.add(session); addInput(input, inputDesc); mpClientInterface->onAudioPortListUpdate(); return input; } -status_t AudioPolicyManager::startInput(audio_io_handle_t input) +status_t AudioPolicyManager::startInput(audio_io_handle_t input, + audio_session_t session) { ALOGV("startInput() input %d", input); ssize_t index = mInputs.indexOfKey(input); @@ -1158,6 +1160,12 @@ status_t AudioPolicyManager::startInput(audio_io_handle_t input) } sp<AudioInputDescriptor> inputDesc = mInputs.valueAt(index); + index = inputDesc->mSessions.indexOf(session); + if (index < 0) { + ALOGW("startInput() unknown session %d on input %d", session, input); + return BAD_VALUE; + } + // virtual input devices are compatible with other input devices if (!isVirtualInputDevice(inputDesc->mDevice)) { @@ -1170,8 +1178,8 @@ status_t AudioPolicyManager::startInput(audio_io_handle_t input) sp<AudioInputDescriptor> activeDesc = mInputs.valueFor(activeInput); if (activeDesc->mInputSource == AUDIO_SOURCE_HOTWORD) { ALOGW("startInput(%d) preempting low-priority input %d", input, activeInput); - stopInput(activeInput); - releaseInput(activeInput); + stopInput(activeInput, activeDesc->mSessions.itemAt(0)); + releaseInput(activeInput, activeDesc->mSessions.itemAt(0)); } else { ALOGE("startInput(%d) failed: other input %d already started", input, activeInput); return INVALID_OPERATION; @@ -1196,7 +1204,8 @@ status_t AudioPolicyManager::startInput(audio_io_handle_t input) return NO_ERROR; } -status_t AudioPolicyManager::stopInput(audio_io_handle_t input) +status_t AudioPolicyManager::stopInput(audio_io_handle_t input, + audio_session_t session) { ALOGV("stopInput() input %d", input); ssize_t index = mInputs.indexOfKey(input); @@ -1206,6 +1215,12 @@ status_t AudioPolicyManager::stopInput(audio_io_handle_t input) } sp<AudioInputDescriptor> inputDesc = mInputs.valueAt(index); + index = inputDesc->mSessions.indexOf(session); + if (index < 0) { + ALOGW("stopInput() unknown session %d on input %d", session, input); + return BAD_VALUE; + } + if (inputDesc->mRefCount == 0) { ALOGW("stopInput() input %d already stopped", input); return INVALID_OPERATION; @@ -1225,7 +1240,8 @@ status_t AudioPolicyManager::stopInput(audio_io_handle_t input) return NO_ERROR; } -void AudioPolicyManager::releaseInput(audio_io_handle_t input) +void AudioPolicyManager::releaseInput(audio_io_handle_t input, + audio_session_t session) { ALOGV("releaseInput() %d", input); ssize_t index = mInputs.indexOfKey(input); @@ -1235,6 +1251,13 @@ void AudioPolicyManager::releaseInput(audio_io_handle_t input) } sp<AudioInputDescriptor> inputDesc = mInputs.valueAt(index); ALOG_ASSERT(inputDesc != 0); + + index = inputDesc->mSessions.indexOf(session); + if (index < 0) { + ALOGW("releaseInput() unknown session %d on input %d", session, input); + return; + } + inputDesc->mSessions.remove(session); if (inputDesc->mOpenRefCount == 0) { ALOGW("releaseInput() invalid open ref count %d", inputDesc->mOpenRefCount); return; diff --git a/services/audiopolicy/AudioPolicyManager.h b/services/audiopolicy/AudioPolicyManager.h index cb4b056..ec94144 100644 --- a/services/audiopolicy/AudioPolicyManager.h +++ b/services/audiopolicy/AudioPolicyManager.h @@ -107,15 +107,18 @@ public: uint32_t samplingRate, audio_format_t format, audio_channel_mask_t channelMask, - audio_in_acoustics_t acoustics, + audio_session_t session, audio_input_flags_t flags); // indicates to the audio policy manager that the input starts being used. - virtual status_t startInput(audio_io_handle_t input); + virtual status_t startInput(audio_io_handle_t input, + audio_session_t session); // indicates to the audio policy manager that the input stops being used. - virtual status_t stopInput(audio_io_handle_t input); - virtual void releaseInput(audio_io_handle_t input); + 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 void closeAllInputs(); virtual void initStreamVolume(audio_stream_type_t stream, int indexMin, @@ -485,6 +488,7 @@ protected: uint32_t mOpenRefCount; audio_source_t mInputSource; // input source selected by application (mediarecorder.h) const sp<IOProfile> mProfile; // I/O profile this output derives from + SortedVector<audio_session_t> mSessions; // audio sessions attached to this input virtual void toAudioPortConfig(struct audio_port_config *dstConfig, const struct audio_port_config *srcConfig = NULL) const; diff --git a/services/audiopolicy/AudioPolicyService.h b/services/audiopolicy/AudioPolicyService.h index 3769aab..97236e3 100644 --- a/services/audiopolicy/AudioPolicyService.h +++ b/services/audiopolicy/AudioPolicyService.h @@ -91,9 +91,12 @@ public: audio_channel_mask_t channelMask, int audioSession, audio_input_flags_t flags); - virtual status_t startInput(audio_io_handle_t input); - virtual status_t stopInput(audio_io_handle_t input); - virtual void releaseInput(audio_io_handle_t input); + virtual status_t startInput(audio_io_handle_t input, + audio_session_t session); + 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); |