Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d296be0b authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "audio: refactor update metadata process" into sc-dev am: 4a926482 am: f740afa9

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/av/+/14672870

Change-Id: I80367edca59894a08c829c76ca80574b19a6b523
parents ee0df76c f740afa9
Loading
Loading
Loading
Loading
+0 −12
Original line number Diff line number Diff line
@@ -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. */
@@ -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();
@@ -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

+22 −25
Original line number Diff line number Diff line
@@ -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;
}

@@ -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
@@ -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);
@@ -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;
@@ -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);
@@ -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);
@@ -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);
@@ -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) {
@@ -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) {
@@ -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) {
+23 −1
Original line number Diff line number Diff line
@@ -527,6 +527,8 @@ public:
                    }
                }

    virtual     bool isStreamInitialized() = 0;

protected:

                // entry describing an effect being suspended in mSuspendedSessions keyed vector
@@ -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:
@@ -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;
                                     }
@@ -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;
@@ -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;
@@ -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;

@@ -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;
+14 −0
Original line number Diff line number Diff line
@@ -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);

@@ -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.