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

Commit 0a091656 authored by Dhananjay Kumar's avatar Dhananjay Kumar Committed by Linux Build Service Account
Browse files

nuplayer: ignore openAudioSink while waiting for teardown completion

- AudioSink is reopened on AudioTearDown event as well as on
  decoder output format change. These events are from different
  contexts, independent of each other and can occur concurrently,
  doing set of thread-unsafe operations on audioSink, which
  sometimes may result in fatal error.

- Any request to openSink, after teardown event is received but
  before its completed, is redundant since once teardown is
  completed sink is anyway going to be opened again. Also
  ignoring sink reopen while in teardown would avoid concurrent
  processing of thread-unsafe operations on audioSink.

- Update nuplayer to prevent reopening of sink while teardown is
  still going on.

Conflicts:
	media/libmediaplayerservice/nuplayer/NuPlayer.cpp

 CRs-Fixed: 978013

Change-Id: Ieb3825f133c2099e07d6e92ef101dd5156af8a20
parent d566cba6
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -1161,6 +1161,15 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
                    ALOGW("Receive a stale message for teardown.");
                    break;
                }
                closeAudioSink();
                mRenderer->flush(
                        true /* audio */, false /* notifyComplete */);
                if (mVideoDecoder != NULL) {
                    mRenderer->flush(
                            false /* audio */, false /* notifyComplete */);
                }
                mRenderer->signalAudioTearDownComplete();

                int64_t positionUs;
                if (!msg->findInt64("positionUs", &positionUs)) {
                    positionUs = mPreviousSeekTimeUs;
+23 −5
Original line number Diff line number Diff line
@@ -126,7 +126,7 @@ NuPlayer::Renderer::Renderer(
      mNextAudioClockUpdateTimeUs(-1),
      mLastAudioMediaTimeUs(-1),
      mAudioOffloadPauseTimeoutGeneration(0),
      mAudioTornDown(false),
      mAudioTearingDown(false),
      mCurrentOffloadInfo(AUDIO_INFO_INITIALIZER),
      mCurrentPcmInfo(AUDIO_PCMINFO_INITIALIZER),
      mTotalBuffersQueued(0),
@@ -666,6 +666,12 @@ void NuPlayer::Renderer::onMessageReceived(const sp<AMessage> &msg) {
            break;
        }

        case kWhatAudioTearDownComplete:
        {
            onAudioTearDownComplete();
            break;
        }

        case kWhatAudioOffloadPauseTimeout:
        {
            int32_t generation;
@@ -882,7 +888,7 @@ void NuPlayer::Renderer::drainAudioQueueUntilLastEOS() {

bool NuPlayer::Renderer::onDrainAudioQueue() {
    // do not drain audio during teardown as queued buffers may be invalid.
    if (mAudioTornDown) {
    if (mAudioTearingDown) {
        return false;
    }
    // TODO: This call to getPosition checks if AudioTrack has been created
@@ -1721,10 +1727,10 @@ bool NuPlayer::Renderer::getSyncQueues() {
}

void NuPlayer::Renderer::onAudioTearDown(AudioTearDownReason reason) {
    if (mAudioTornDown) {
    if (mAudioTearingDown) {
        return;
    }
    mAudioTornDown = true;
    mAudioTearingDown = true;

    int64_t currentPositionUs;
    sp<AMessage> notify = mNotify->dup();
@@ -1769,6 +1775,11 @@ status_t NuPlayer::Renderer::onOpenAudioSink(
        uint32_t flags) {
    ALOGV("openAudioSink: offloadOnly(%d) offloadingAudio(%d)",
            offloadOnly, offloadingAudio());

    if (mAudioTearingDown) {
        ALOGW("openAudioSink: not opening now!, would happen after teardown");
        return OK;
    }
    bool audioSinkChanged = false;

    int32_t numChannels;
@@ -1964,7 +1975,6 @@ status_t NuPlayer::Renderer::onOpenAudioSink(
    if (audioSinkChanged) {
        onAudioSinkChanged();
    }
    mAudioTornDown = false;
    return OK;
}

@@ -1974,5 +1984,13 @@ void NuPlayer::Renderer::onCloseAudioSink() {
    mCurrentPcmInfo = AUDIO_PCMINFO_INITIALIZER;
}

void NuPlayer::Renderer::signalAudioTearDownComplete() {
    (new AMessage(kWhatAudioTearDownComplete, this))->post();
}

void NuPlayer::Renderer::onAudioTearDownComplete() {
    mAudioTearingDown = false;
}

}  // namespace android
+4 −1
Original line number Diff line number Diff line
@@ -80,6 +80,7 @@ struct NuPlayer::Renderer : public AHandler {
            uint32_t flags,
            bool *isOffloaded);
    void closeAudioSink();
    void signalAudioTearDownComplete();

    enum {
        kWhatEOS                      = 'eos ',
@@ -89,6 +90,7 @@ struct NuPlayer::Renderer : public AHandler {
        kWhatMediaRenderingStart      = 'mdrd',
        kWhatAudioTearDown            = 'adTD',
        kWhatAudioOffloadPauseTimeout = 'aOPT',
        kWhatAudioTearDownComplete    = 'aTDC',
    };

    enum AudioTearDownReason {
@@ -185,7 +187,7 @@ protected:
    int64_t mLastAudioMediaTimeUs;

    int32_t mAudioOffloadPauseTimeoutGeneration;
    bool mAudioTornDown;
    bool mAudioTearingDown;
    audio_offload_info_t mCurrentOffloadInfo;

    struct PcmInfo {
@@ -256,6 +258,7 @@ protected:
            bool hasVideo,
            uint32_t flags);
    void onCloseAudioSink();
    void onAudioTearDownComplete();

    void notifyEOS(bool audio, status_t finalResult, int64_t delayUs = 0);
    void notifyFlushComplete(bool audio);