Loading services/audioflinger/AudioFlinger.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -3823,7 +3823,7 @@ void AudioFlinger::updateSecondaryOutputsForTrack_l( patchTrack->setPeerProxy(patchRecord, true /* holdReference */); patchRecord->setPeerProxy(patchTrack, false /* holdReference */); } track->setTeePatchesToUpdate(std::move(teePatches)); track->setTeePatchesToUpdate_l(std::move(teePatches)); } sp<audioflinger::SyncEvent> AudioFlinger::createSyncEvent(AudioSystem::sync_event_t type, Loading services/audioflinger/IAfTrack.h +2 −2 Original line number Diff line number Diff line Loading @@ -339,10 +339,10 @@ public: virtual sp<os::ExternalVibration> getExternalVibration() const = 0; // This function should be called with holding thread lock. virtual void updateTeePatches() = 0; virtual void updateTeePatches_l() = 0; // Argument teePatchesToUpdate is by value, use std::move to optimize. virtual void setTeePatchesToUpdate(TeePatches teePatchesToUpdate) = 0; virtual void setTeePatchesToUpdate_l(TeePatches teePatchesToUpdate) = 0; static bool checkServerLatencySupported(audio_format_t format, audio_output_flags_t flags) { return audio_is_linear_pcm(format) && (flags & AUDIO_OUTPUT_FLAG_HW_AV_SYNC) == 0; Loading services/audioflinger/PlaybackTracks.h +4 −3 Original line number Diff line number Diff line Loading @@ -193,8 +193,8 @@ public: sp<os::ExternalVibration> getExternalVibration() const final { return mExternalVibration; } // This function should be called with holding thread lock. void updateTeePatches() final; void setTeePatchesToUpdate(TeePatches teePatchesToUpdate) final; void updateTeePatches_l() final; void setTeePatchesToUpdate_l(TeePatches teePatchesToUpdate) final; void tallyUnderrunFrames(size_t frames) final { if (isOut()) { // we expect this from output tracks only Loading Loading @@ -349,8 +349,9 @@ protected: private: void interceptBuffer(const AudioBufferProvider::Buffer& buffer); // Must hold thread lock to access tee patches template <class F> void forEachTeePatchTrack(F f) { void forEachTeePatchTrack_l(F f) { for (auto& tp : mTeePatches) { f(tp.patchTrack); } }; Loading services/audioflinger/Threads.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -4178,7 +4178,7 @@ NO_THREAD_SAFETY_ANALYSIS // manual locking of AudioFlinger setHalLatencyMode_l(); for (const auto &track : mActiveTracks ) { track->updateTeePatches(); track->updateTeePatches_l(); } // signal actual start of output stream when the render position reported by the kernel Loading services/audioflinger/Tracks.cpp +14 −12 Original line number Diff line number Diff line Loading @@ -895,12 +895,12 @@ void Track::destroy() audio_utils::lock_guard _l(thread->mutex()); auto* const playbackThread = thread->asIAfPlaybackThread().get(); wasActive = playbackThread->destroyTrack_l(this); forEachTeePatchTrack_l([](const auto& patchTrack) { patchTrack->destroy(); }); } if (isExternalTrack() && !wasActive) { AudioSystem::releaseOutput(mPortId); } } forEachTeePatchTrack([](auto patchTrack) { patchTrack->destroy(); }); } void Track::appendDumpHeader(String8& result) const Loading Loading @@ -1275,12 +1275,13 @@ status_t Track::start(AudioSystem::sync_event_t event __unused, buffer.mFrameCount = 1; (void) mAudioTrackServerProxy->obtainBuffer(&buffer, true /*ackFlush*/); } if (status == NO_ERROR) { forEachTeePatchTrack_l([](const auto& patchTrack) { patchTrack->start(); }); } } else { status = BAD_VALUE; } if (status == NO_ERROR) { forEachTeePatchTrack([](auto patchTrack) { patchTrack->start(); }); // send format to AudioManager for playback activity monitoring const sp<IAudioManager> audioManager = thread->afThreadCallback()->getOrCreateAudioManager(); Loading Loading @@ -1331,8 +1332,8 @@ void Track::stop() ALOGV("%s(%d): not stopping/stopped => stopping/stopped on thread %d", __func__, mId, (int)mThreadIoHandle); } forEachTeePatchTrack_l([](const auto& patchTrack) { patchTrack->stop(); }); } forEachTeePatchTrack([](auto patchTrack) { patchTrack->stop(); }); } void Track::pause() Loading Loading @@ -1367,9 +1368,9 @@ void Track::pause() default: break; } } // Pausing the TeePatch to avoid a glitch on underrun, at the cost of buffered audio loss. forEachTeePatchTrack([](auto patchTrack) { patchTrack->pause(); }); forEachTeePatchTrack_l([](const auto& patchTrack) { patchTrack->pause(); }); } } void Track::flush() Loading Loading @@ -1430,9 +1431,10 @@ void Track::flush() // before mixer thread can run. This is important when offloading // because the hardware buffer could hold a large amount of audio playbackThread->broadcast_l(); // Flush the Tee to avoid on resume playing old data and glitching on the transition to // new data forEachTeePatchTrack_l([](const auto& patchTrack) { patchTrack->flush(); }); } // Flush the Tee to avoid on resume playing old data and glitching on the transition to new data forEachTeePatchTrack([](auto patchTrack) { patchTrack->flush(); }); } // must be called with thread lock held Loading Loading @@ -1611,19 +1613,19 @@ void Track::copyMetadataTo(MetadataInserter& backInserter) const *backInserter++ = metadata; } void Track::updateTeePatches() { void Track::updateTeePatches_l() { if (mTeePatchesToUpdate.has_value()) { forEachTeePatchTrack([](auto patchTrack) { patchTrack->destroy(); }); forEachTeePatchTrack_l([](const auto& patchTrack) { patchTrack->destroy(); }); mTeePatches = mTeePatchesToUpdate.value(); if (mState == TrackBase::ACTIVE || mState == TrackBase::RESUMING || mState == TrackBase::STOPPING_1) { forEachTeePatchTrack([](auto patchTrack) { patchTrack->start(); }); forEachTeePatchTrack_l([](const auto& patchTrack) { patchTrack->start(); }); } mTeePatchesToUpdate.reset(); } } void Track::setTeePatchesToUpdate(TeePatches teePatchesToUpdate) { void Track::setTeePatchesToUpdate_l(TeePatches teePatchesToUpdate) { ALOGW_IF(mTeePatchesToUpdate.has_value(), "%s, existing tee patches to update will be ignored", __func__); mTeePatchesToUpdate = std::move(teePatchesToUpdate); Loading Loading
services/audioflinger/AudioFlinger.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -3823,7 +3823,7 @@ void AudioFlinger::updateSecondaryOutputsForTrack_l( patchTrack->setPeerProxy(patchRecord, true /* holdReference */); patchRecord->setPeerProxy(patchTrack, false /* holdReference */); } track->setTeePatchesToUpdate(std::move(teePatches)); track->setTeePatchesToUpdate_l(std::move(teePatches)); } sp<audioflinger::SyncEvent> AudioFlinger::createSyncEvent(AudioSystem::sync_event_t type, Loading
services/audioflinger/IAfTrack.h +2 −2 Original line number Diff line number Diff line Loading @@ -339,10 +339,10 @@ public: virtual sp<os::ExternalVibration> getExternalVibration() const = 0; // This function should be called with holding thread lock. virtual void updateTeePatches() = 0; virtual void updateTeePatches_l() = 0; // Argument teePatchesToUpdate is by value, use std::move to optimize. virtual void setTeePatchesToUpdate(TeePatches teePatchesToUpdate) = 0; virtual void setTeePatchesToUpdate_l(TeePatches teePatchesToUpdate) = 0; static bool checkServerLatencySupported(audio_format_t format, audio_output_flags_t flags) { return audio_is_linear_pcm(format) && (flags & AUDIO_OUTPUT_FLAG_HW_AV_SYNC) == 0; Loading
services/audioflinger/PlaybackTracks.h +4 −3 Original line number Diff line number Diff line Loading @@ -193,8 +193,8 @@ public: sp<os::ExternalVibration> getExternalVibration() const final { return mExternalVibration; } // This function should be called with holding thread lock. void updateTeePatches() final; void setTeePatchesToUpdate(TeePatches teePatchesToUpdate) final; void updateTeePatches_l() final; void setTeePatchesToUpdate_l(TeePatches teePatchesToUpdate) final; void tallyUnderrunFrames(size_t frames) final { if (isOut()) { // we expect this from output tracks only Loading Loading @@ -349,8 +349,9 @@ protected: private: void interceptBuffer(const AudioBufferProvider::Buffer& buffer); // Must hold thread lock to access tee patches template <class F> void forEachTeePatchTrack(F f) { void forEachTeePatchTrack_l(F f) { for (auto& tp : mTeePatches) { f(tp.patchTrack); } }; Loading
services/audioflinger/Threads.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -4178,7 +4178,7 @@ NO_THREAD_SAFETY_ANALYSIS // manual locking of AudioFlinger setHalLatencyMode_l(); for (const auto &track : mActiveTracks ) { track->updateTeePatches(); track->updateTeePatches_l(); } // signal actual start of output stream when the render position reported by the kernel Loading
services/audioflinger/Tracks.cpp +14 −12 Original line number Diff line number Diff line Loading @@ -895,12 +895,12 @@ void Track::destroy() audio_utils::lock_guard _l(thread->mutex()); auto* const playbackThread = thread->asIAfPlaybackThread().get(); wasActive = playbackThread->destroyTrack_l(this); forEachTeePatchTrack_l([](const auto& patchTrack) { patchTrack->destroy(); }); } if (isExternalTrack() && !wasActive) { AudioSystem::releaseOutput(mPortId); } } forEachTeePatchTrack([](auto patchTrack) { patchTrack->destroy(); }); } void Track::appendDumpHeader(String8& result) const Loading Loading @@ -1275,12 +1275,13 @@ status_t Track::start(AudioSystem::sync_event_t event __unused, buffer.mFrameCount = 1; (void) mAudioTrackServerProxy->obtainBuffer(&buffer, true /*ackFlush*/); } if (status == NO_ERROR) { forEachTeePatchTrack_l([](const auto& patchTrack) { patchTrack->start(); }); } } else { status = BAD_VALUE; } if (status == NO_ERROR) { forEachTeePatchTrack([](auto patchTrack) { patchTrack->start(); }); // send format to AudioManager for playback activity monitoring const sp<IAudioManager> audioManager = thread->afThreadCallback()->getOrCreateAudioManager(); Loading Loading @@ -1331,8 +1332,8 @@ void Track::stop() ALOGV("%s(%d): not stopping/stopped => stopping/stopped on thread %d", __func__, mId, (int)mThreadIoHandle); } forEachTeePatchTrack_l([](const auto& patchTrack) { patchTrack->stop(); }); } forEachTeePatchTrack([](auto patchTrack) { patchTrack->stop(); }); } void Track::pause() Loading Loading @@ -1367,9 +1368,9 @@ void Track::pause() default: break; } } // Pausing the TeePatch to avoid a glitch on underrun, at the cost of buffered audio loss. forEachTeePatchTrack([](auto patchTrack) { patchTrack->pause(); }); forEachTeePatchTrack_l([](const auto& patchTrack) { patchTrack->pause(); }); } } void Track::flush() Loading Loading @@ -1430,9 +1431,10 @@ void Track::flush() // before mixer thread can run. This is important when offloading // because the hardware buffer could hold a large amount of audio playbackThread->broadcast_l(); // Flush the Tee to avoid on resume playing old data and glitching on the transition to // new data forEachTeePatchTrack_l([](const auto& patchTrack) { patchTrack->flush(); }); } // Flush the Tee to avoid on resume playing old data and glitching on the transition to new data forEachTeePatchTrack([](auto patchTrack) { patchTrack->flush(); }); } // must be called with thread lock held Loading Loading @@ -1611,19 +1613,19 @@ void Track::copyMetadataTo(MetadataInserter& backInserter) const *backInserter++ = metadata; } void Track::updateTeePatches() { void Track::updateTeePatches_l() { if (mTeePatchesToUpdate.has_value()) { forEachTeePatchTrack([](auto patchTrack) { patchTrack->destroy(); }); forEachTeePatchTrack_l([](const auto& patchTrack) { patchTrack->destroy(); }); mTeePatches = mTeePatchesToUpdate.value(); if (mState == TrackBase::ACTIVE || mState == TrackBase::RESUMING || mState == TrackBase::STOPPING_1) { forEachTeePatchTrack([](auto patchTrack) { patchTrack->start(); }); forEachTeePatchTrack_l([](const auto& patchTrack) { patchTrack->start(); }); } mTeePatchesToUpdate.reset(); } } void Track::setTeePatchesToUpdate(TeePatches teePatchesToUpdate) { void Track::setTeePatchesToUpdate_l(TeePatches teePatchesToUpdate) { ALOGW_IF(mTeePatchesToUpdate.has_value(), "%s, existing tee patches to update will be ignored", __func__); mTeePatchesToUpdate = std::move(teePatchesToUpdate); Loading