Loading services/audioflinger/Threads.cpp +30 −22 Original line number Diff line number Diff line Loading @@ -7305,8 +7305,21 @@ reacquire_wakelock: // the only active track // 2) invalidate this track: this will cause the client to reconnect and possibly // be invalidated again until unsilenced bool invalidate = false; if (activeTrack->isSilenced()) { if (size > 1) { invalidate = true; } else { silenceFastCapture = true; } } // Invalidate fast tracks if access to audio history is required as this is not // possible with fast tracks. Once the fast track has been invalidated, no new // fast track will be created until mMaxSharedAudioHistoryMs is cleared. if (mMaxSharedAudioHistoryMs != 0) { invalidate = true; } if (invalidate) { activeTrack->invalidate(); ALOG_ASSERT(fastTrackToRemove == 0); fastTrackToRemove = activeTrack; Loading @@ -7314,9 +7327,6 @@ reacquire_wakelock: mActiveTracks.remove(activeTrack); size--; continue; } else { silenceFastCapture = true; } } fastTrack = activeTrack; } Loading Loading @@ -7837,12 +7847,6 @@ sp<AudioFlinger::RecordThread::RecordTrack> AudioFlinger::RecordThread::createRe lStatus = PERMISSION_DENIED; goto Exit; } //TODO: b/185972521 allow resampling buffer resizing on fast mixers by pausing // the fast mixer thread while resizing the buffer in the normal thread if (hasFastCapture()) { lStatus = BAD_VALUE; goto Exit; } if (maxSharedAudioHistoryMs < 0 || maxSharedAudioHistoryMs > AudioFlinger::kMaxSharedAudioHistoryMs) { lStatus = BAD_VALUE; Loading @@ -7854,8 +7858,9 @@ sp<AudioFlinger::RecordThread::RecordTrack> AudioFlinger::RecordThread::createRe } sampleRate = *pSampleRate; // special case for FAST flag considered OK if fast capture is present if (hasFastCapture()) { // special case for FAST flag considered OK if fast capture is present and access to // audio history is not required if (hasFastCapture() && mMaxSharedAudioHistoryMs == 0) { inputFlags = (audio_input_flags_t)(inputFlags | AUDIO_INPUT_FLAG_FAST); } Loading @@ -7867,8 +7872,9 @@ sp<AudioFlinger::RecordThread::RecordTrack> AudioFlinger::RecordThread::createRe *flags = (audio_input_flags_t)(*flags & inputFlags); } // client expresses a preference for FAST, but we get the final say if (*flags & AUDIO_INPUT_FLAG_FAST) { // client expresses a preference for FAST and no access to audio history, // but we get the final say if (*flags & AUDIO_INPUT_FLAG_FAST && maxSharedAudioHistoryMs == 0) { if ( // we formerly checked for a callback handler (non-0 tid), // but that is no longer required for TRANSFER_OBTAIN mode Loading Loading @@ -7988,7 +7994,6 @@ sp<AudioFlinger::RecordThread::RecordTrack> AudioFlinger::RecordThread::createRe if (maxSharedAudioHistoryMs != 0) { sendResizeBufferConfigEvent_l(maxSharedAudioHistoryMs); } } lStatus = NO_ERROR; Loading Loading @@ -8219,9 +8224,6 @@ status_t AudioFlinger::RecordThread::shareAudioHistory( status_t AudioFlinger::RecordThread::shareAudioHistory_l( const std::string& sharedAudioPackageName, audio_session_t sharedSessionId, int64_t sharedAudioStartMs) { if (hasFastCapture()) { return BAD_VALUE; } if ((hasAudioSession_l(sharedSessionId) & ThreadBase::TRACK_SESSION) == 0) { return BAD_VALUE; } Loading Loading @@ -8464,6 +8466,7 @@ status_t AudioFlinger::RecordThread::ResamplerBufferProvider::getNextBuffer( // FIXME if client not keeping up, discard LOG_ALWAYS_FATAL_IF(!(0 <= filled && (size_t) filled <= recordThread->mRsmpInFrames)); // 'filled' may be non-contiguous, so return only the first contiguous chunk front &= recordThread->mRsmpInFramesP2 - 1; size_t part1 = recordThread->mRsmpInFramesP2 - front; if (part1 > (size_t) filled) { Loading Loading @@ -8678,7 +8681,7 @@ void AudioFlinger::RecordThread::readInputParameters_l() // mRsmpInFrames must be 0 before calling resizeInputBuffer_l for the first time mRsmpInFrames = 0; resizeInputBuffer_l(); resizeInputBuffer_l(0 /*maxSharedAudioHistoryMs*/); // AudioRecord mSampleRate and mChannelCount are constant due to AudioRecord API constraints. // But if thread's mSampleRate or mChannelCount changes, how will that affect active tracks? Loading Loading @@ -8919,6 +8922,10 @@ void AudioFlinger::RecordThread::resizeInputBuffer_l(int32_t maxSharedAudioHisto int32_t previousRear = mRsmpInRear; mRsmpInRear = 0; ALOG_ASSERT(maxSharedAudioHistoryMs >= 0 && maxSharedAudioHistoryMs <= AudioFlinger::kMaxSharedAudioHistoryMs, "resizeInputBuffer_l() called with invalid max shared history %d", maxSharedAudioHistoryMs); if (maxSharedAudioHistoryMs != 0) { // resizeInputBuffer_l should never be called with a non zero shared history if the // buffer was not already allocated Loading @@ -8931,6 +8938,7 @@ void AudioFlinger::RecordThread::resizeInputBuffer_l(int32_t maxSharedAudioHisto } mRsmpInFrames = rsmpInFrames; } mMaxSharedAudioHistoryMs = maxSharedAudioHistoryMs; // Note: mRsmpInFrames is 0 when called with maxSharedAudioHistoryMs equals to 0 so it is always // initialized if (mRsmpInFrames < minRsmpInFrames) { Loading services/audioflinger/Threads.h +3 −2 Original line number Diff line number Diff line Loading @@ -338,7 +338,7 @@ public: virtual void updateOutDevices(const DeviceDescriptorBaseVector& outDevices); virtual void toAudioPortConfig(struct audio_port_config *config) = 0; virtual void resizeInputBuffer_l(int32_t maxSharedAudioHistoryMs = 0); virtual void resizeInputBuffer_l(int32_t maxSharedAudioHistoryMs); Loading Loading @@ -1717,7 +1717,7 @@ public: audio_patch_handle_t *handle); virtual status_t releaseAudioPatch_l(const audio_patch_handle_t handle); void updateOutDevices(const DeviceDescriptorBaseVector& outDevices) override; void resizeInputBuffer_l(int32_t maxSharedAudioHistoryMs = 0) override; void resizeInputBuffer_l(int32_t maxSharedAudioHistoryMs) override; void addPatchTrack(const sp<PatchRecord>& record); void deletePatchTrack(const sp<PatchRecord>& record); Loading Loading @@ -1862,6 +1862,7 @@ private: DeviceDescriptorBaseVector mOutDevices; int32_t mMaxSharedAudioHistoryMs = 0; std::string mSharedAudioPackageName = {}; int32_t mSharedAudioStartFrames = -1; audio_session_t mSharedAudioSessionId = AUDIO_SESSION_NONE; Loading Loading
services/audioflinger/Threads.cpp +30 −22 Original line number Diff line number Diff line Loading @@ -7305,8 +7305,21 @@ reacquire_wakelock: // the only active track // 2) invalidate this track: this will cause the client to reconnect and possibly // be invalidated again until unsilenced bool invalidate = false; if (activeTrack->isSilenced()) { if (size > 1) { invalidate = true; } else { silenceFastCapture = true; } } // Invalidate fast tracks if access to audio history is required as this is not // possible with fast tracks. Once the fast track has been invalidated, no new // fast track will be created until mMaxSharedAudioHistoryMs is cleared. if (mMaxSharedAudioHistoryMs != 0) { invalidate = true; } if (invalidate) { activeTrack->invalidate(); ALOG_ASSERT(fastTrackToRemove == 0); fastTrackToRemove = activeTrack; Loading @@ -7314,9 +7327,6 @@ reacquire_wakelock: mActiveTracks.remove(activeTrack); size--; continue; } else { silenceFastCapture = true; } } fastTrack = activeTrack; } Loading Loading @@ -7837,12 +7847,6 @@ sp<AudioFlinger::RecordThread::RecordTrack> AudioFlinger::RecordThread::createRe lStatus = PERMISSION_DENIED; goto Exit; } //TODO: b/185972521 allow resampling buffer resizing on fast mixers by pausing // the fast mixer thread while resizing the buffer in the normal thread if (hasFastCapture()) { lStatus = BAD_VALUE; goto Exit; } if (maxSharedAudioHistoryMs < 0 || maxSharedAudioHistoryMs > AudioFlinger::kMaxSharedAudioHistoryMs) { lStatus = BAD_VALUE; Loading @@ -7854,8 +7858,9 @@ sp<AudioFlinger::RecordThread::RecordTrack> AudioFlinger::RecordThread::createRe } sampleRate = *pSampleRate; // special case for FAST flag considered OK if fast capture is present if (hasFastCapture()) { // special case for FAST flag considered OK if fast capture is present and access to // audio history is not required if (hasFastCapture() && mMaxSharedAudioHistoryMs == 0) { inputFlags = (audio_input_flags_t)(inputFlags | AUDIO_INPUT_FLAG_FAST); } Loading @@ -7867,8 +7872,9 @@ sp<AudioFlinger::RecordThread::RecordTrack> AudioFlinger::RecordThread::createRe *flags = (audio_input_flags_t)(*flags & inputFlags); } // client expresses a preference for FAST, but we get the final say if (*flags & AUDIO_INPUT_FLAG_FAST) { // client expresses a preference for FAST and no access to audio history, // but we get the final say if (*flags & AUDIO_INPUT_FLAG_FAST && maxSharedAudioHistoryMs == 0) { if ( // we formerly checked for a callback handler (non-0 tid), // but that is no longer required for TRANSFER_OBTAIN mode Loading Loading @@ -7988,7 +7994,6 @@ sp<AudioFlinger::RecordThread::RecordTrack> AudioFlinger::RecordThread::createRe if (maxSharedAudioHistoryMs != 0) { sendResizeBufferConfigEvent_l(maxSharedAudioHistoryMs); } } lStatus = NO_ERROR; Loading Loading @@ -8219,9 +8224,6 @@ status_t AudioFlinger::RecordThread::shareAudioHistory( status_t AudioFlinger::RecordThread::shareAudioHistory_l( const std::string& sharedAudioPackageName, audio_session_t sharedSessionId, int64_t sharedAudioStartMs) { if (hasFastCapture()) { return BAD_VALUE; } if ((hasAudioSession_l(sharedSessionId) & ThreadBase::TRACK_SESSION) == 0) { return BAD_VALUE; } Loading Loading @@ -8464,6 +8466,7 @@ status_t AudioFlinger::RecordThread::ResamplerBufferProvider::getNextBuffer( // FIXME if client not keeping up, discard LOG_ALWAYS_FATAL_IF(!(0 <= filled && (size_t) filled <= recordThread->mRsmpInFrames)); // 'filled' may be non-contiguous, so return only the first contiguous chunk front &= recordThread->mRsmpInFramesP2 - 1; size_t part1 = recordThread->mRsmpInFramesP2 - front; if (part1 > (size_t) filled) { Loading Loading @@ -8678,7 +8681,7 @@ void AudioFlinger::RecordThread::readInputParameters_l() // mRsmpInFrames must be 0 before calling resizeInputBuffer_l for the first time mRsmpInFrames = 0; resizeInputBuffer_l(); resizeInputBuffer_l(0 /*maxSharedAudioHistoryMs*/); // AudioRecord mSampleRate and mChannelCount are constant due to AudioRecord API constraints. // But if thread's mSampleRate or mChannelCount changes, how will that affect active tracks? Loading Loading @@ -8919,6 +8922,10 @@ void AudioFlinger::RecordThread::resizeInputBuffer_l(int32_t maxSharedAudioHisto int32_t previousRear = mRsmpInRear; mRsmpInRear = 0; ALOG_ASSERT(maxSharedAudioHistoryMs >= 0 && maxSharedAudioHistoryMs <= AudioFlinger::kMaxSharedAudioHistoryMs, "resizeInputBuffer_l() called with invalid max shared history %d", maxSharedAudioHistoryMs); if (maxSharedAudioHistoryMs != 0) { // resizeInputBuffer_l should never be called with a non zero shared history if the // buffer was not already allocated Loading @@ -8931,6 +8938,7 @@ void AudioFlinger::RecordThread::resizeInputBuffer_l(int32_t maxSharedAudioHisto } mRsmpInFrames = rsmpInFrames; } mMaxSharedAudioHistoryMs = maxSharedAudioHistoryMs; // Note: mRsmpInFrames is 0 when called with maxSharedAudioHistoryMs equals to 0 so it is always // initialized if (mRsmpInFrames < minRsmpInFrames) { Loading
services/audioflinger/Threads.h +3 −2 Original line number Diff line number Diff line Loading @@ -338,7 +338,7 @@ public: virtual void updateOutDevices(const DeviceDescriptorBaseVector& outDevices); virtual void toAudioPortConfig(struct audio_port_config *config) = 0; virtual void resizeInputBuffer_l(int32_t maxSharedAudioHistoryMs = 0); virtual void resizeInputBuffer_l(int32_t maxSharedAudioHistoryMs); Loading Loading @@ -1717,7 +1717,7 @@ public: audio_patch_handle_t *handle); virtual status_t releaseAudioPatch_l(const audio_patch_handle_t handle); void updateOutDevices(const DeviceDescriptorBaseVector& outDevices) override; void resizeInputBuffer_l(int32_t maxSharedAudioHistoryMs = 0) override; void resizeInputBuffer_l(int32_t maxSharedAudioHistoryMs) override; void addPatchTrack(const sp<PatchRecord>& record); void deletePatchTrack(const sp<PatchRecord>& record); Loading Loading @@ -1862,6 +1862,7 @@ private: DeviceDescriptorBaseVector mOutDevices; int32_t mMaxSharedAudioHistoryMs = 0; std::string mSharedAudioPackageName = {}; int32_t mSharedAudioStartFrames = -1; audio_session_t mSharedAudioSessionId = AUDIO_SESSION_NONE; Loading