Loading services/audioflinger/PlaybackTracks.h +0 −12 Original line number Diff line number Diff line Loading @@ -148,14 +148,6 @@ public: void setFinalVolume(float volume); float getFinalVolume() const { return mFinalVolume; } /** @return true if the track has changed (metadata or volume) since * the last time this function was called, * true if this function was never called since the track creation, * false otherwise. * Thread safe. */ bool readAndClearHasChanged() { return !mChangeNotified.test_and_set(); } using SourceMetadatas = std::vector<playback_track_metadata_v7_t>; using MetadataInserter = std::back_insert_iterator<SourceMetadatas>; /** Copy the track metadata in the provided iterator. Thread safe. */ Loading Loading @@ -234,8 +226,6 @@ protected: bool presentationComplete(int64_t framesWritten, size_t audioHalFrames); void signalClientFlag(int32_t flag); /** Set that a metadata has changed and needs to be notified to backend. Thread safe. */ void setMetadataHasChanged() { mChangeNotified.clear(); } public: void triggerEvents(AudioSystem::sync_event_t type); virtual void invalidate(); Loading Loading @@ -320,8 +310,6 @@ private: bool mFlushHwPending; // track requests for thread flush bool mPauseHwPending = false; // direct/offload track request for thread pause audio_output_flags_t mFlags; // If the last track change was notified to the client with readAndClearHasChanged std::atomic_flag mChangeNotified = ATOMIC_FLAG_INIT; TeePatches mTeePatches; }; // end of Track Loading services/audioflinger/Threads.cpp +22 −25 Original line number Diff line number Diff line Loading @@ -1798,8 +1798,14 @@ void AudioFlinger::ThreadBase::ActiveTracks<T>::updatePowerState( template <typename T> bool AudioFlinger::ThreadBase::ActiveTracks<T>::readAndClearHasChanged() { const bool hasChanged = mHasChanged; bool hasChanged = mHasChanged; mHasChanged = false; for (const sp<T> &track : mActiveTracks) { // Do not short-circuit as all hasChanged states must be reset // as all the metadata are going to be sent hasChanged |= track->readAndClearHasChanged(); } return hasChanged; } Loading Loading @@ -1986,7 +1992,7 @@ AudioFlinger::PlaybackThread::~PlaybackThread() void AudioFlinger::PlaybackThread::onFirstRef() { if (mOutput == nullptr || mOutput->stream == nullptr) { if (!isStreamInitialized()) { ALOGE("The stream is not open yet"); // This should not happen. } else { // setEventCallback will need a strong pointer as a parameter. Calling it Loading Loading @@ -2695,7 +2701,7 @@ String8 AudioFlinger::PlaybackThread::getParameters(const String8& keys) status_t AudioFlinger::DirectOutputThread::selectPresentation(int presentationId, int programId) { Mutex::Autolock _l(mLock); if (mOutput == nullptr || mOutput->stream == nullptr) { if (!isStreamInitialized()) { return NO_INIT; } return mOutput->stream->selectPresentation(presentationId, programId); Loading Loading @@ -2992,16 +2998,7 @@ void AudioFlinger::PlaybackThread::readOutputParameters_l() void AudioFlinger::PlaybackThread::updateMetadata_l() { if (mOutput == nullptr || mOutput->stream == nullptr ) { return; // That should not happen } bool hasChanged = mActiveTracks.readAndClearHasChanged(); for (const sp<Track> &track : mActiveTracks) { // Do not short-circuit as all hasChanged states must be reset // as all the metadata are going to be sent hasChanged |= track->readAndClearHasChanged(); } if (!hasChanged) { if (!isStreamInitialized() || !mActiveTracks.readAndClearHasChanged()) { return; // nothing to do } StreamOutHalInterface::SourceMetadata metadata; Loading Loading @@ -8186,7 +8183,7 @@ status_t AudioFlinger::RecordThread::getActiveMicrophones( { ALOGV("RecordThread::getActiveMicrophones"); AutoMutex _l(mLock); if (mInput == nullptr || mInput->stream == nullptr) { if (!isStreamInitialized()) { return NO_INIT; } status_t status = mInput->stream->getActiveMicrophones(activeMicrophones); Loading @@ -8198,7 +8195,7 @@ status_t AudioFlinger::RecordThread::setPreferredMicrophoneDirection( { ALOGV("setPreferredMicrophoneDirection(%d)", direction); AutoMutex _l(mLock); if (mInput == nullptr || mInput->stream == nullptr) { if (!isStreamInitialized()) { return NO_INIT; } return mInput->stream->setPreferredMicrophoneDirection(direction); Loading @@ -8208,7 +8205,7 @@ status_t AudioFlinger::RecordThread::setPreferredMicrophoneFieldDimension(float { ALOGV("setPreferredMicrophoneFieldDimension(%f)", zoom); AutoMutex _l(mLock); if (mInput == nullptr || mInput->stream == nullptr) { if (!isStreamInitialized()) { return NO_INIT; } return mInput->stream->setPreferredMicrophoneFieldDimension(zoom); Loading Loading @@ -8259,9 +8256,8 @@ status_t AudioFlinger::RecordThread::shareAudioHistory_l( void AudioFlinger::RecordThread::updateMetadata_l() { if (mInput == nullptr || mInput->stream == nullptr || !mActiveTracks.readAndClearHasChanged()) { return; if (!isStreamInitialized() || !mActiveTracks.readAndClearHasChanged()) { return; // nothing to do } StreamInHalInterface::SinkMetadata metadata; for (const sp<RecordTrack> &track : mActiveTracks) { Loading Loading @@ -9959,14 +9955,16 @@ void AudioFlinger::MmapPlaybackThread::processVolume_l() } } } for (const sp<MmapTrack> &track : mActiveTracks) { track->setMetadataHasChanged(); } } } void AudioFlinger::MmapPlaybackThread::updateMetadata_l() { if (mOutput == nullptr || mOutput->stream == nullptr || !mActiveTracks.readAndClearHasChanged()) { return; if (!isStreamInitialized() || !mActiveTracks.readAndClearHasChanged()) { return; // nothing to do } StreamOutHalInterface::SourceMetadata metadata; for (const sp<MmapTrack> &track : mActiveTracks) { Loading Loading @@ -10093,9 +10091,8 @@ void AudioFlinger::MmapCaptureThread::processVolume_l() void AudioFlinger::MmapCaptureThread::updateMetadata_l() { if (mInput == nullptr || mInput->stream == nullptr || !mActiveTracks.readAndClearHasChanged()) { return; if (!isStreamInitialized() || !mActiveTracks.readAndClearHasChanged()) { return; // nothing to do } StreamInHalInterface::SinkMetadata metadata; for (const sp<MmapTrack> &track : mActiveTracks) { Loading services/audioflinger/Threads.h +23 −1 Original line number Diff line number Diff line Loading @@ -527,6 +527,8 @@ public: } } virtual bool isStreamInitialized() = 0; protected: // entry describing an effect being suspended in mSuspendedSessions keyed vector Loading Loading @@ -741,7 +743,9 @@ protected: void updatePowerState(sp<ThreadBase> thread, bool force = false); /** @return true if one or move active tracks was added or removed since the * last time this function was called or the vector was created. */ * last time this function was called or the vector was created. * true if volume of one of active tracks was changed. */ bool readAndClearHasChanged(); private: Loading Loading @@ -993,6 +997,10 @@ public: && outDeviceTypes().count(mTimestampCorrectedDevice) != 0; } virtual bool isStreamInitialized() { return !(mOutput == nullptr || mOutput->stream == nullptr); } audio_channel_mask_t hapticChannelMask() const override { return mHapticChannelMask; } Loading Loading @@ -1780,6 +1788,10 @@ public: audio_session_t sharedSessionId = AUDIO_SESSION_NONE, int64_t sharedAudioStartMs = -1); virtual bool isStreamInitialized() { return !(mInput == nullptr || mInput->stream == nullptr); } protected: void dumpInternals_l(int fd, const Vector<String16>& args) override; void dumpTracks_l(int fd, const Vector<String16>& args) override; Loading Loading @@ -1949,6 +1961,8 @@ class MmapThread : public ThreadBase virtual void setRecordSilenced(audio_port_handle_t portId __unused, bool silenced __unused) {} virtual bool isStreamInitialized() { return false; } protected: void dumpInternals_l(int fd, const Vector<String16>& args) override; void dumpTracks_l(int fd, const Vector<String16>& args) override; Loading Loading @@ -2011,6 +2025,10 @@ public: status_t getExternalPosition(uint64_t *position, int64_t *timeNanos) override; virtual bool isStreamInitialized() { return !(mOutput == nullptr || mOutput->stream == nullptr); } protected: void dumpInternals_l(int fd, const Vector<String16>& args) override; Loading Loading @@ -2043,6 +2061,10 @@ public: status_t getExternalPosition(uint64_t *position, int64_t *timeNanos) override; virtual bool isStreamInitialized() { return !(mInput == nullptr || mInput->stream == nullptr); } protected: AudioStreamIn* mInput; Loading services/audioflinger/TrackBase.h +14 −0 Original line number Diff line number Diff line Loading @@ -255,6 +255,17 @@ public: audio_channel_mask_t channelMask() const { return mChannelMask; } /** @return true if the track has changed (metadata or volume) since * the last time this function was called, * true if this function was never called since the track creation, * false otherwise. * Thread safe. */ bool readAndClearHasChanged() { return !mChangeNotified.test_and_set(); } /** Set that a metadata has changed and needs to be notified to backend. Thread safe. */ void setMetadataHasChanged() { mChangeNotified.clear(); } protected: DISALLOW_COPY_AND_ASSIGN(TrackBase); Loading Loading @@ -391,6 +402,9 @@ protected: std::atomic<FrameTime> mKernelFrameTime{}; // last frame time on kernel side. const pid_t mCreatorPid; // can be different from mclient->pid() for instance // when created by NuPlayer on behalf of a client // If the last track change was notified to the client with readAndClearHasChanged std::atomic_flag mChangeNotified = ATOMIC_FLAG_INIT; }; // PatchProxyBufferProvider interface is implemented by PatchTrack and PatchRecord. Loading Loading
services/audioflinger/PlaybackTracks.h +0 −12 Original line number Diff line number Diff line Loading @@ -148,14 +148,6 @@ public: void setFinalVolume(float volume); float getFinalVolume() const { return mFinalVolume; } /** @return true if the track has changed (metadata or volume) since * the last time this function was called, * true if this function was never called since the track creation, * false otherwise. * Thread safe. */ bool readAndClearHasChanged() { return !mChangeNotified.test_and_set(); } using SourceMetadatas = std::vector<playback_track_metadata_v7_t>; using MetadataInserter = std::back_insert_iterator<SourceMetadatas>; /** Copy the track metadata in the provided iterator. Thread safe. */ Loading Loading @@ -234,8 +226,6 @@ protected: bool presentationComplete(int64_t framesWritten, size_t audioHalFrames); void signalClientFlag(int32_t flag); /** Set that a metadata has changed and needs to be notified to backend. Thread safe. */ void setMetadataHasChanged() { mChangeNotified.clear(); } public: void triggerEvents(AudioSystem::sync_event_t type); virtual void invalidate(); Loading Loading @@ -320,8 +310,6 @@ private: bool mFlushHwPending; // track requests for thread flush bool mPauseHwPending = false; // direct/offload track request for thread pause audio_output_flags_t mFlags; // If the last track change was notified to the client with readAndClearHasChanged std::atomic_flag mChangeNotified = ATOMIC_FLAG_INIT; TeePatches mTeePatches; }; // end of Track Loading
services/audioflinger/Threads.cpp +22 −25 Original line number Diff line number Diff line Loading @@ -1798,8 +1798,14 @@ void AudioFlinger::ThreadBase::ActiveTracks<T>::updatePowerState( template <typename T> bool AudioFlinger::ThreadBase::ActiveTracks<T>::readAndClearHasChanged() { const bool hasChanged = mHasChanged; bool hasChanged = mHasChanged; mHasChanged = false; for (const sp<T> &track : mActiveTracks) { // Do not short-circuit as all hasChanged states must be reset // as all the metadata are going to be sent hasChanged |= track->readAndClearHasChanged(); } return hasChanged; } Loading Loading @@ -1986,7 +1992,7 @@ AudioFlinger::PlaybackThread::~PlaybackThread() void AudioFlinger::PlaybackThread::onFirstRef() { if (mOutput == nullptr || mOutput->stream == nullptr) { if (!isStreamInitialized()) { ALOGE("The stream is not open yet"); // This should not happen. } else { // setEventCallback will need a strong pointer as a parameter. Calling it Loading Loading @@ -2695,7 +2701,7 @@ String8 AudioFlinger::PlaybackThread::getParameters(const String8& keys) status_t AudioFlinger::DirectOutputThread::selectPresentation(int presentationId, int programId) { Mutex::Autolock _l(mLock); if (mOutput == nullptr || mOutput->stream == nullptr) { if (!isStreamInitialized()) { return NO_INIT; } return mOutput->stream->selectPresentation(presentationId, programId); Loading Loading @@ -2992,16 +2998,7 @@ void AudioFlinger::PlaybackThread::readOutputParameters_l() void AudioFlinger::PlaybackThread::updateMetadata_l() { if (mOutput == nullptr || mOutput->stream == nullptr ) { return; // That should not happen } bool hasChanged = mActiveTracks.readAndClearHasChanged(); for (const sp<Track> &track : mActiveTracks) { // Do not short-circuit as all hasChanged states must be reset // as all the metadata are going to be sent hasChanged |= track->readAndClearHasChanged(); } if (!hasChanged) { if (!isStreamInitialized() || !mActiveTracks.readAndClearHasChanged()) { return; // nothing to do } StreamOutHalInterface::SourceMetadata metadata; Loading Loading @@ -8186,7 +8183,7 @@ status_t AudioFlinger::RecordThread::getActiveMicrophones( { ALOGV("RecordThread::getActiveMicrophones"); AutoMutex _l(mLock); if (mInput == nullptr || mInput->stream == nullptr) { if (!isStreamInitialized()) { return NO_INIT; } status_t status = mInput->stream->getActiveMicrophones(activeMicrophones); Loading @@ -8198,7 +8195,7 @@ status_t AudioFlinger::RecordThread::setPreferredMicrophoneDirection( { ALOGV("setPreferredMicrophoneDirection(%d)", direction); AutoMutex _l(mLock); if (mInput == nullptr || mInput->stream == nullptr) { if (!isStreamInitialized()) { return NO_INIT; } return mInput->stream->setPreferredMicrophoneDirection(direction); Loading @@ -8208,7 +8205,7 @@ status_t AudioFlinger::RecordThread::setPreferredMicrophoneFieldDimension(float { ALOGV("setPreferredMicrophoneFieldDimension(%f)", zoom); AutoMutex _l(mLock); if (mInput == nullptr || mInput->stream == nullptr) { if (!isStreamInitialized()) { return NO_INIT; } return mInput->stream->setPreferredMicrophoneFieldDimension(zoom); Loading Loading @@ -8259,9 +8256,8 @@ status_t AudioFlinger::RecordThread::shareAudioHistory_l( void AudioFlinger::RecordThread::updateMetadata_l() { if (mInput == nullptr || mInput->stream == nullptr || !mActiveTracks.readAndClearHasChanged()) { return; if (!isStreamInitialized() || !mActiveTracks.readAndClearHasChanged()) { return; // nothing to do } StreamInHalInterface::SinkMetadata metadata; for (const sp<RecordTrack> &track : mActiveTracks) { Loading Loading @@ -9959,14 +9955,16 @@ void AudioFlinger::MmapPlaybackThread::processVolume_l() } } } for (const sp<MmapTrack> &track : mActiveTracks) { track->setMetadataHasChanged(); } } } void AudioFlinger::MmapPlaybackThread::updateMetadata_l() { if (mOutput == nullptr || mOutput->stream == nullptr || !mActiveTracks.readAndClearHasChanged()) { return; if (!isStreamInitialized() || !mActiveTracks.readAndClearHasChanged()) { return; // nothing to do } StreamOutHalInterface::SourceMetadata metadata; for (const sp<MmapTrack> &track : mActiveTracks) { Loading Loading @@ -10093,9 +10091,8 @@ void AudioFlinger::MmapCaptureThread::processVolume_l() void AudioFlinger::MmapCaptureThread::updateMetadata_l() { if (mInput == nullptr || mInput->stream == nullptr || !mActiveTracks.readAndClearHasChanged()) { return; if (!isStreamInitialized() || !mActiveTracks.readAndClearHasChanged()) { return; // nothing to do } StreamInHalInterface::SinkMetadata metadata; for (const sp<MmapTrack> &track : mActiveTracks) { Loading
services/audioflinger/Threads.h +23 −1 Original line number Diff line number Diff line Loading @@ -527,6 +527,8 @@ public: } } virtual bool isStreamInitialized() = 0; protected: // entry describing an effect being suspended in mSuspendedSessions keyed vector Loading Loading @@ -741,7 +743,9 @@ protected: void updatePowerState(sp<ThreadBase> thread, bool force = false); /** @return true if one or move active tracks was added or removed since the * last time this function was called or the vector was created. */ * last time this function was called or the vector was created. * true if volume of one of active tracks was changed. */ bool readAndClearHasChanged(); private: Loading Loading @@ -993,6 +997,10 @@ public: && outDeviceTypes().count(mTimestampCorrectedDevice) != 0; } virtual bool isStreamInitialized() { return !(mOutput == nullptr || mOutput->stream == nullptr); } audio_channel_mask_t hapticChannelMask() const override { return mHapticChannelMask; } Loading Loading @@ -1780,6 +1788,10 @@ public: audio_session_t sharedSessionId = AUDIO_SESSION_NONE, int64_t sharedAudioStartMs = -1); virtual bool isStreamInitialized() { return !(mInput == nullptr || mInput->stream == nullptr); } protected: void dumpInternals_l(int fd, const Vector<String16>& args) override; void dumpTracks_l(int fd, const Vector<String16>& args) override; Loading Loading @@ -1949,6 +1961,8 @@ class MmapThread : public ThreadBase virtual void setRecordSilenced(audio_port_handle_t portId __unused, bool silenced __unused) {} virtual bool isStreamInitialized() { return false; } protected: void dumpInternals_l(int fd, const Vector<String16>& args) override; void dumpTracks_l(int fd, const Vector<String16>& args) override; Loading Loading @@ -2011,6 +2025,10 @@ public: status_t getExternalPosition(uint64_t *position, int64_t *timeNanos) override; virtual bool isStreamInitialized() { return !(mOutput == nullptr || mOutput->stream == nullptr); } protected: void dumpInternals_l(int fd, const Vector<String16>& args) override; Loading Loading @@ -2043,6 +2061,10 @@ public: status_t getExternalPosition(uint64_t *position, int64_t *timeNanos) override; virtual bool isStreamInitialized() { return !(mInput == nullptr || mInput->stream == nullptr); } protected: AudioStreamIn* mInput; Loading
services/audioflinger/TrackBase.h +14 −0 Original line number Diff line number Diff line Loading @@ -255,6 +255,17 @@ public: audio_channel_mask_t channelMask() const { return mChannelMask; } /** @return true if the track has changed (metadata or volume) since * the last time this function was called, * true if this function was never called since the track creation, * false otherwise. * Thread safe. */ bool readAndClearHasChanged() { return !mChangeNotified.test_and_set(); } /** Set that a metadata has changed and needs to be notified to backend. Thread safe. */ void setMetadataHasChanged() { mChangeNotified.clear(); } protected: DISALLOW_COPY_AND_ASSIGN(TrackBase); Loading Loading @@ -391,6 +402,9 @@ protected: std::atomic<FrameTime> mKernelFrameTime{}; // last frame time on kernel side. const pid_t mCreatorPid; // can be different from mclient->pid() for instance // when created by NuPlayer on behalf of a client // If the last track change was notified to the client with readAndClearHasChanged std::atomic_flag mChangeNotified = ATOMIC_FLAG_INIT; }; // PatchProxyBufferProvider interface is implemented by PatchTrack and PatchRecord. Loading