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

Commit 25f4aa83 authored by Glenn Kasten's avatar Glenn Kasten
Browse files

Move handleSyncStartEvent and clearSyncStartEvent to RecordTrack

Change-Id: I611a63e63acf3eb17e2072c1a77b91fe9e62e36a
parent deca2ae0
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -47,6 +47,9 @@ public:
    static  void        appendDumpHeader(String8& result);
            void        dump(char* buffer, size_t size, bool active);

            void        handleSyncStartEvent(const sp<SyncEvent>& event);
            void        clearSyncStartEvent();

private:
    friend class AudioFlinger;  // for mState

+7 −31
Original line number Diff line number Diff line
@@ -4809,7 +4809,7 @@ reacquire_wakelock:
                    if (activeTrack->mFramesToDrop > 0) {
                        activeTrack->mFramesToDrop -= framesOut;
                        if (activeTrack->mFramesToDrop <= 0) {
                            clearSyncStartEvent(activeTrack.get());
                            activeTrack->clearSyncStartEvent();
                        }
                    } else {
                        activeTrack->mFramesToDrop += framesOut;
@@ -4820,7 +4820,7 @@ reacquire_wakelock:
                                  activeTrack->sessionId(),
                                  (activeTrack->mSyncStartEvent != 0) ?
                                          activeTrack->mSyncStartEvent->triggerSession() : 0);
                            clearSyncStartEvent(activeTrack.get());
                            activeTrack->clearSyncStartEvent();
                        }
                    }
                }
@@ -5011,8 +5011,7 @@ status_t AudioFlinger::RecordThread::start(RecordThread::RecordTrack* recordTrac
    status_t status = NO_ERROR;

    if (event == AudioSystem::SYNC_EVENT_NONE) {
        // FIXME hmm should be per-track
        clearSyncStartEvent(recordTrack);
        recordTrack->clearSyncStartEvent();
    } else if (event != AudioSystem::SYNC_EVENT_SAME) {
        recordTrack->mSyncStartEvent = mAudioFlinger->createSyncEvent(event,
                                       triggerSession,
@@ -5022,7 +5021,7 @@ status_t AudioFlinger::RecordThread::start(RecordThread::RecordTrack* recordTrac
        // Sync event can be cancelled by the trigger session if the track is not in a
        // compatible state in which case we start record immediately
        if (recordTrack->mSyncStartEvent->isCancelled()) {
            clearSyncStartEvent(recordTrack);
            recordTrack->clearSyncStartEvent();
        } else {
            // do not wait for the event for more than AudioSystem::kSyncRecordStartTimeOutMs
            recordTrack->mFramesToDrop = -
@@ -5053,7 +5052,7 @@ status_t AudioFlinger::RecordThread::start(RecordThread::RecordTrack* recordTrac
        if (status != NO_ERROR) {
            mActiveTracks.remove(recordTrack);
            mActiveTracksGen++;
            clearSyncStartEvent(recordTrack);
            recordTrack->clearSyncStartEvent();
            return status;
        }
        // Catch up with current buffer indices if thread is already running.
@@ -5080,41 +5079,18 @@ status_t AudioFlinger::RecordThread::start(RecordThread::RecordTrack* recordTrac

startError:
    AudioSystem::stopInput(mId);
    clearSyncStartEvent(recordTrack);
    recordTrack->clearSyncStartEvent();
    // FIXME I wonder why we do not reset the state here?
    return status;
}

void AudioFlinger::RecordThread::clearSyncStartEvent(RecordThread::RecordTrack* recordTrack)
{
    if (recordTrack->mSyncStartEvent != 0) {
        recordTrack->mSyncStartEvent->cancel();
        recordTrack->mSyncStartEvent.clear();
    }
    recordTrack->mFramesToDrop = 0;
}

void AudioFlinger::RecordThread::syncStartEventCallback(const wp<SyncEvent>& event)
{
    sp<SyncEvent> strongEvent = event.promote();

    if (strongEvent != 0) {
        RecordTrack *recordTrack = (RecordTrack *)strongEvent->cookie();
        sp<ThreadBase> threadBase = recordTrack->mThread.promote();
        if (threadBase != 0) {
            RecordThread *me = (RecordThread *) threadBase.get();
            me->handleSyncStartEvent(recordTrack, strongEvent);
        }
    }
}

void AudioFlinger::RecordThread::handleSyncStartEvent(
        RecordThread::RecordTrack* recordTrack, const sp<SyncEvent>& event)
{
    if (event == recordTrack->mSyncStartEvent) {
        // TODO: use actual buffer filling status instead of 2 buffers when info is available
        // from audio HAL
        recordTrack->mFramesToDrop = mFrameCount * 2;
        recordTrack->handleSyncStartEvent(strongEvent);
    }
}

+0 −3
Original line number Diff line number Diff line
@@ -931,14 +931,11 @@ public:
    virtual bool     isValidSyncEvent(const sp<SyncEvent>& event) const;

    static void syncStartEventCallback(const wp<SyncEvent>& event);
           void handleSyncStartEvent(RecordTrack *recordTrack, const sp<SyncEvent>& event);

    virtual size_t      frameCount() const { return mFrameCount; }
            bool        hasFastRecorder() const { return false; }

private:
            void    clearSyncStartEvent(RecordTrack* recordTrack);

            // Enter standby if not already in standby, and set mStandby flag
            void    standbyIfNotAlreadyInStandby();

+23 −0
Original line number Diff line number Diff line
@@ -1903,4 +1903,27 @@ void AudioFlinger::RecordThread::RecordTrack::dump(char* buffer, size_t size, bo

}

void AudioFlinger::RecordThread::RecordTrack::handleSyncStartEvent(const sp<SyncEvent>& event)
{
    if (event == mSyncStartEvent) {
        ssize_t framesToDrop = 0;
        sp<ThreadBase> threadBase = mThread.promote();
        if (threadBase != 0) {
            // TODO: use actual buffer filling status instead of 2 buffers when info is available
            // from audio HAL
            framesToDrop = threadBase->mFrameCount * 2;
        }
        mFramesToDrop = framesToDrop;
    }
}

void AudioFlinger::RecordThread::RecordTrack::clearSyncStartEvent()
{
    if (mSyncStartEvent != 0) {
        mSyncStartEvent->cancel();
        mSyncStartEvent.clear();
    }
    mFramesToDrop = 0;
}

}; // namespace android