120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber/*
220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Copyright (C) 2009 The Android Open Source Project
320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *
420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * you may not use this file except in compliance with the License.
620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * You may obtain a copy of the License at
720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *
820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *
1020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Unless required by applicable law or agreed to in writing, software
1120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
1220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * See the License for the specific language governing permissions and
1420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * limitations under the License.
1520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber */
1620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
17a5750e0dad9e90f2195ce36f2c4457fa04b2b83eMark Salyzyn#include <inttypes.h>
18a5750e0dad9e90f2195ce36f2c4457fa04b2b83eMark Salyzyn
19dae04ca7c4b5590786ffc336721ee8714cc79fefAndreas Huber//#define LOG_NDEBUG 0
2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define LOG_TAG "AudioPlayer"
2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/Log.h>
2294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald#include <cutils/compiler.h>
2320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2425155ff8ccf7898d08ab62fae46297e046a571f0Andreas Huber#include <binder/IPCThreadState.h>
2520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/AudioTrack.h>
262829edccd7d2bb8244246f316face82b650b8949aarti jadhav-gaikwad#include <media/openmax/OMX_Audio.h>
27f7eade99250520f2c9c8366a20a9256c4b34abc1Andreas Huber#include <media/stagefright/foundation/ADebug.h>
2878bd91b15ee8ea5aa2ab5a8cad7e892cb2d01c1bLajos Molnar#include <media/stagefright/foundation/ALookup.h>
29e4451a91a61a341014f5eff61db356156c3ecb37Andreas Huber#include <media/stagefright/foundation/ALooper.h>
3020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/AudioPlayer.h>
3118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber#include <media/stagefright/MediaDefs.h>
323cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber#include <media/stagefright/MediaErrors.h>
3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MediaSource.h>
3420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MetaData.h>
3594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald#include <media/stagefright/Utils.h>
3620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
3720111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android {
3820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
39ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas HuberAudioPlayer::AudioPlayer(
40ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber        const sp<MediaPlayerBase::AudioSink> &audioSink,
41e4d40ad91f3516bde106658673b2cb076b5dfcb7Lajos Molnar        uint32_t flags)
422799d743ee2ae5a25fe869a7f9c052acc029559fGlenn Kasten    : mInputBuffer(NULL),
4320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber      mSampleRate(0),
4420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber      mLatencyUs(0),
4520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber      mFrameSize(0),
4620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber      mNumFramesPlayed(0),
47e4451a91a61a341014f5eff61db356156c3ecb37Andreas Huber      mNumFramesPlayedSysTimeUs(ALooper::GetNowUs()),
4820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber      mPositionTimeMediaUs(-1),
4920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber      mPositionTimeRealUs(-1),
5020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber      mSeeking(false),
511862a33b246249630b654182afb5914da3480d4cAndreas Huber      mReachedEOS(false),
525295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber      mFinalStatus(OK),
5394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald      mSeekTimeUs(0),
5420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber      mStarted(false),
553cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber      mIsFirstBuffer(false),
563cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber      mFirstBufferResult(OK),
573cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber      mFirstBuffer(NULL),
58ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber      mAudioSink(audioSink),
5994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald      mPlaying(false),
6094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald      mStartPosUs(0),
6194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald      mCreateFlags(flags) {
6220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
6320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
6420111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberAudioPlayer::~AudioPlayer() {
6520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    if (mStarted) {
66b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber        reset();
6720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
6820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
6920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
70b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenvoid AudioPlayer::setSource(const sp<IMediaSource> &source) {
71f7eade99250520f2c9c8366a20a9256c4b34abc1Andreas Huber    CHECK(mSource == NULL);
7220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    mSource = source;
7320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
7420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
7578bd91b15ee8ea5aa2ab5a8cad7e892cb2d01c1bLajos MolnarALookup<audio_format_t, int32_t> sAudioFormatToPcmEncoding {
7678bd91b15ee8ea5aa2ab5a8cad7e892cb2d01c1bLajos Molnar    {
7778bd91b15ee8ea5aa2ab5a8cad7e892cb2d01c1bLajos Molnar        { AUDIO_FORMAT_PCM_16_BIT, kAudioEncodingPcm16bit },
7878bd91b15ee8ea5aa2ab5a8cad7e892cb2d01c1bLajos Molnar        { AUDIO_FORMAT_PCM_8_BIT,  kAudioEncodingPcm8bit  },
7978bd91b15ee8ea5aa2ab5a8cad7e892cb2d01c1bLajos Molnar        { AUDIO_FORMAT_PCM_FLOAT,  kAudioEncodingPcmFloat },
8078bd91b15ee8ea5aa2ab5a8cad7e892cb2d01c1bLajos Molnar    }
8178bd91b15ee8ea5aa2ab5a8cad7e892cb2d01c1bLajos Molnar};
8278bd91b15ee8ea5aa2ab5a8cad7e892cb2d01c1bLajos Molnar
83e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huberstatus_t AudioPlayer::start(bool sourceAlreadyStarted) {
840c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber    CHECK(!mStarted);
850c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber    CHECK(mSource != NULL);
8620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
87e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber    status_t err;
88e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber    if (!sourceAlreadyStarted) {
89e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber        err = mSource->start();
9088c030e0e0152791ff74f90249f55fce01371198Andreas Huber
91e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber        if (err != OK) {
92e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber            return err;
93e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber        }
9488c030e0e0152791ff74f90249f55fce01371198Andreas Huber    }
9520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
963cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber    // We allow an optional INFO_FORMAT_CHANGED at the very beginning
973cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber    // of playback, if there is one, getFormat below will retrieve the
983cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber    // updated format, if there isn't, we'll stash away the valid buffer
993cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber    // of data to be used on the first audio callback.
1003cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber
1013cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber    CHECK(mFirstBuffer == NULL);
1023cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber
103c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber    MediaSource::ReadOptions options;
104c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber    if (mSeeking) {
105c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber        options.setSeekTo(mSeekTimeUs);
106c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber        mSeeking = false;
107c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber    }
108c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber
109c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber    mFirstBufferResult = mSource->read(&mFirstBuffer, &options);
1103cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber    if (mFirstBufferResult == INFO_FORMAT_CHANGED) {
1113856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("INFO_FORMAT_CHANGED!!!");
1123cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber
1133cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber        CHECK(mFirstBuffer == NULL);
1143cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber        mFirstBufferResult = OK;
1153cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber        mIsFirstBuffer = false;
1163cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber    } else {
1173cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber        mIsFirstBuffer = true;
1183cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber    }
1193cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber
12020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    sp<MetaData> format = mSource->getFormat();
12120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    const char *mime;
12220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool success = format->findCString(kKeyMIMEType, &mime);
1230c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber    CHECK(success);
12494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    CHECK(useOffload() || !strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW));
12520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
12620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    success = format->findInt32(kKeySampleRate, &mSampleRate);
1270c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber    CHECK(success);
12820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
129786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi    int32_t numChannels, channelMask;
13020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    success = format->findInt32(kKeyChannelCount, &numChannels);
1310c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber    CHECK(success);
13220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
133786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi    if(!format->findInt32(kKeyChannelMask, &channelMask)) {
1342c3297ab6c4daaaa7b27eed8418c64cf168fe2a1Jean-Michel Trivi        // log only when there's a risk of ambiguity of channel mask selection
1352c3297ab6c4daaaa7b27eed8418c64cf168fe2a1Jean-Michel Trivi        ALOGI_IF(numChannels > 2,
1362c3297ab6c4daaaa7b27eed8418c64cf168fe2a1Jean-Michel Trivi                "source format didn't specify channel mask, using (%d) channel order", numChannels);
137786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi        channelMask = CHANNEL_MASK_USE_CHANNEL_ORDER;
138786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi    }
139786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi
14094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    audio_format_t audioFormat = AUDIO_FORMAT_PCM_16_BIT;
14178bd91b15ee8ea5aa2ab5a8cad7e892cb2d01c1bLajos Molnar    int32_t pcmEncoding;
14278bd91b15ee8ea5aa2ab5a8cad7e892cb2d01c1bLajos Molnar    if (format->findInt32(kKeyPcmEncoding, &pcmEncoding)) {
14378bd91b15ee8ea5aa2ab5a8cad7e892cb2d01c1bLajos Molnar        sAudioFormatToPcmEncoding.map(pcmEncoding, &audioFormat);
14478bd91b15ee8ea5aa2ab5a8cad7e892cb2d01c1bLajos Molnar    }
14594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
14694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    if (useOffload()) {
14794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        if (mapMimeToAudioFormat(audioFormat, mime) != OK) {
14894ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            ALOGE("Couldn't map mime type \"%s\" to a valid AudioSystem::audio_format", mime);
14994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            audioFormat = AUDIO_FORMAT_INVALID;
15094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        } else {
15194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            ALOGV("Mime type \"%s\" mapped to audio_format 0x%x", mime, audioFormat);
15294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        }
1532829edccd7d2bb8244246f316face82b650b8949aarti jadhav-gaikwad
1542829edccd7d2bb8244246f316face82b650b8949aarti jadhav-gaikwad        int32_t aacaot = -1;
1552829edccd7d2bb8244246f316face82b650b8949aarti jadhav-gaikwad        if ((audioFormat == AUDIO_FORMAT_AAC) && format->findInt32(kKeyAACAOT, &aacaot)) {
1562829edccd7d2bb8244246f316face82b650b8949aarti jadhav-gaikwad            // Redefine AAC format corrosponding to aac profile
1572829edccd7d2bb8244246f316face82b650b8949aarti jadhav-gaikwad            mapAACProfileToAudioFormat(audioFormat,(OMX_AUDIO_AACPROFILETYPE) aacaot);
1582829edccd7d2bb8244246f316face82b650b8949aarti jadhav-gaikwad        }
15994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    }
16094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
16194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    int avgBitRate = -1;
16294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    format->findInt32(kKeyBitRate, &avgBitRate);
16394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
16420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    if (mAudioSink.get() != NULL) {
1651948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent
16694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        uint32_t flags = AUDIO_OUTPUT_FLAG_NONE;
16794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        audio_offload_info_t offloadInfo = AUDIO_INFO_INITIALIZER;
16894ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
16994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        if (allowDeepBuffering()) {
17094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            flags |= AUDIO_OUTPUT_FLAG_DEEP_BUFFER;
17194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        }
17294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        if (useOffload()) {
17394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            flags |= AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD;
17494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
17594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            int64_t durationUs;
17694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            if (format->findInt64(kKeyDuration, &durationUs)) {
17794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                offloadInfo.duration_us = durationUs;
17894ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            } else {
17994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                offloadInfo.duration_us = -1;
18094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            }
18194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
18294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            offloadInfo.sample_rate = mSampleRate;
18394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            offloadInfo.channel_mask = channelMask;
18494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            offloadInfo.format = audioFormat;
18594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            offloadInfo.stream_type = AUDIO_STREAM_MUSIC;
18694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            offloadInfo.bit_rate = avgBitRate;
18794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            offloadInfo.has_video = ((mCreateFlags & HAS_VIDEO) != 0);
18894ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            offloadInfo.is_streaming = ((mCreateFlags & IS_STREAMING) != 0);
18994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        }
19094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
19120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        status_t err = mAudioSink->open(
19294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                mSampleRate, numChannels, channelMask, audioFormat,
19320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                DEFAULT_AUDIOSINK_BUFFERCOUNT,
1941948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                &AudioPlayer::AudioSinkCallback,
1951948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                this,
19694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                (audio_output_flags_t)flags,
19794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                useOffload() ? &offloadInfo : NULL);
19894ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
19994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        if (err == OK) {
20094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            mLatencyUs = (int64_t)mAudioSink->latency() * 1000;
20194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            mFrameSize = mAudioSink->frameSize();
20294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
20394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            if (useOffload()) {
20494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                // If the playback is offloaded to h/w we pass the
20594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                // HAL some metadata information
20694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                // We don't want to do this for PCM because it will be going
20794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                // through the AudioFlinger mixer before reaching the hardware
20894ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                sendMetaDataToHal(mAudioSink, format);
20994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            }
21094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
21194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            err = mAudioSink->start();
21294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            // do not alter behavior for non offloaded tracks: ignore start status.
21394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            if (!useOffload()) {
21494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                err = OK;
21594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            }
21694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        }
21794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
21888c030e0e0152791ff74f90249f55fce01371198Andreas Huber        if (err != OK) {
2193cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber            if (mFirstBuffer != NULL) {
2203cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber                mFirstBuffer->release();
2213cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber                mFirstBuffer = NULL;
2223cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber            }
2233cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber
2244575beb3dea80e271eaa6619234fdc02e914e6e6Andreas Huber            if (!sourceAlreadyStarted) {
2254575beb3dea80e271eaa6619234fdc02e914e6e6Andreas Huber                mSource->stop();
2264575beb3dea80e271eaa6619234fdc02e914e6e6Andreas Huber            }
22788c030e0e0152791ff74f90249f55fce01371198Andreas Huber
22888c030e0e0152791ff74f90249f55fce01371198Andreas Huber            return err;
22988c030e0e0152791ff74f90249f55fce01371198Andreas Huber        }
23020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
23120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    } else {
232786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi        // playing to an AudioTrack, set up mask if necessary
233786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi        audio_channel_mask_t audioMask = channelMask == CHANNEL_MASK_USE_CHANNEL_ORDER ?
234ab334fd351ae5a0e18903da123d63e565b536874Glenn Kasten                audio_channel_out_mask_from_count(numChannels) : channelMask;
235786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi        if (0 == audioMask) {
236786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi            return BAD_VALUE;
237786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi        }
238786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi
23920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        mAudioTrack = new AudioTrack(
240786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi                AUDIO_STREAM_MUSIC, mSampleRate, AUDIO_FORMAT_PCM_16_BIT, audioMask,
2412301acc6a9c7a3af4ad01f3d1d0f76f13eca7350Glenn Kasten                0 /*frameCount*/, AUDIO_OUTPUT_FLAG_NONE, &AudioCallback, this,
2422301acc6a9c7a3af4ad01f3d1d0f76f13eca7350Glenn Kasten                0 /*notificationFrames*/);
24320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
24432dcebf970356eb8599ea965d71535ed0c212c2dKenny Root        if ((err = mAudioTrack->initCheck()) != OK) {
2452799d743ee2ae5a25fe869a7f9c052acc029559fGlenn Kasten            mAudioTrack.clear();
24688c030e0e0152791ff74f90249f55fce01371198Andreas Huber
2473cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber            if (mFirstBuffer != NULL) {
2483cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber                mFirstBuffer->release();
2493cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber                mFirstBuffer = NULL;
2503cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber            }
2513cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber
2524575beb3dea80e271eaa6619234fdc02e914e6e6Andreas Huber            if (!sourceAlreadyStarted) {
2534575beb3dea80e271eaa6619234fdc02e914e6e6Andreas Huber                mSource->stop();
2544575beb3dea80e271eaa6619234fdc02e914e6e6Andreas Huber            }
25588c030e0e0152791ff74f90249f55fce01371198Andreas Huber
25632dcebf970356eb8599ea965d71535ed0c212c2dKenny Root            return err;
25788c030e0e0152791ff74f90249f55fce01371198Andreas Huber        }
25820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
25920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        mLatencyUs = (int64_t)mAudioTrack->latency() * 1000;
26020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        mFrameSize = mAudioTrack->frameSize();
26120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
26220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        mAudioTrack->start();
26320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
26420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
26520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    mStarted = true;
26694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    mPlaying = true;
26788c030e0e0152791ff74f90249f55fce01371198Andreas Huber
26888c030e0e0152791ff74f90249f55fce01371198Andreas Huber    return OK;
26920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
27020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
271b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Hubervoid AudioPlayer::pause(bool playPendingSamples) {
2720c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber    CHECK(mStarted);
27320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
274b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber    if (playPendingSamples) {
275b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber        if (mAudioSink.get() != NULL) {
276b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber            mAudioSink->stop();
277b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber        } else {
278b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber            mAudioTrack->stop();
279b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber        }
2800b293e76c8fe4e973ccd8a872bc5320ba28d49ccAndreas Huber
2810b293e76c8fe4e973ccd8a872bc5320ba28d49ccAndreas Huber        mNumFramesPlayed = 0;
282e4451a91a61a341014f5eff61db356156c3ecb37Andreas Huber        mNumFramesPlayedSysTimeUs = ALooper::GetNowUs();
28320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    } else {
284b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber        if (mAudioSink.get() != NULL) {
285b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber            mAudioSink->pause();
286b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber        } else {
287b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber            mAudioTrack->pause();
288b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber        }
28920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
29094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
29194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    mPlaying = false;
29220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
29320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
29494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgeraldstatus_t AudioPlayer::resume() {
2950c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber    CHECK(mStarted);
29694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    status_t err;
29720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
29820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    if (mAudioSink.get() != NULL) {
29994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        err = mAudioSink->start();
30020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    } else {
30194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        err = mAudioTrack->start();
30220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
30394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
30494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    if (err == OK) {
30594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        mPlaying = true;
30694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    }
30794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
30894ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    return err;
30920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
31020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
311b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Hubervoid AudioPlayer::reset() {
3120c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber    CHECK(mStarted);
31320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
31494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    ALOGV("reset: mPlaying=%d mReachedEOS=%d useOffload=%d",
31594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                                mPlaying, mReachedEOS, useOffload() );
31694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
31720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    if (mAudioSink.get() != NULL) {
31820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        mAudioSink->stop();
31994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        // If we're closing and have reached EOS, we don't want to flush
32094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        // the track because if it is offloaded there could be a small
32194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        // amount of residual data in the hardware buffer which we must
32294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        // play to give gapless playback.
32394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        // But if we're resetting when paused or before we've reached EOS
32494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        // we can't be doing a gapless playback and there could be a large
32594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        // amount of data queued in the hardware if the track is offloaded,
32694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        // so we must flush to prevent a track switch being delayed playing
32794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        // the buffered data that we don't want now
32894ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        if (!mPlaying || !mReachedEOS) {
32994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            mAudioSink->flush();
33094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        }
33194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
332fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber        mAudioSink->close();
33320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    } else {
33420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        mAudioTrack->stop();
33520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
33694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        if (!mPlaying || !mReachedEOS) {
33794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            mAudioTrack->flush();
33894ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        }
33994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
3402799d743ee2ae5a25fe869a7f9c052acc029559fGlenn Kasten        mAudioTrack.clear();
34120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
342fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber
34320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // Make sure to release any buffer we hold onto so that the
34420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // source is able to stop().
3453cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber
3463cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber    if (mFirstBuffer != NULL) {
3473cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber        mFirstBuffer->release();
3483cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber        mFirstBuffer = NULL;
3493cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber    }
3503cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber
35120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    if (mInputBuffer != NULL) {
3523856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("AudioPlayer releasing input buffer.");
35320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
35420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        mInputBuffer->release();
35520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        mInputBuffer = NULL;
35620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
35720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
35820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    mSource->stop();
359fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber
36025155ff8ccf7898d08ab62fae46297e046a571f0Andreas Huber    // The following hack is necessary to ensure that the OMX
36125155ff8ccf7898d08ab62fae46297e046a571f0Andreas Huber    // component is completely released by the time we may try
36225155ff8ccf7898d08ab62fae46297e046a571f0Andreas Huber    // to instantiate it again.
36394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    // When offloading, the OMX component is not used so this hack
36494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    // is not needed
36594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    if (!useOffload()) {
366b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen        wp<IMediaSource> tmp = mSource;
36794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        mSource.clear();
36894ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        while (tmp.promote() != NULL) {
36994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            usleep(1000);
37094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        }
37194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    } else {
37294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        mSource.clear();
37325155ff8ccf7898d08ab62fae46297e046a571f0Andreas Huber    }
37425155ff8ccf7898d08ab62fae46297e046a571f0Andreas Huber    IPCThreadState::self()->flushCommands();
37525155ff8ccf7898d08ab62fae46297e046a571f0Andreas Huber
37620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    mNumFramesPlayed = 0;
377e4451a91a61a341014f5eff61db356156c3ecb37Andreas Huber    mNumFramesPlayedSysTimeUs = ALooper::GetNowUs();
37820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    mPositionTimeMediaUs = -1;
37920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    mPositionTimeRealUs = -1;
38020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    mSeeking = false;
38191b0ca1a5bea44dd9b5196910186dd2927821994Eric Laurent    mSeekTimeUs = 0;
3821862a33b246249630b654182afb5914da3480d4cAndreas Huber    mReachedEOS = false;
3835295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber    mFinalStatus = OK;
38420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    mStarted = false;
38594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    mPlaying = false;
38694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    mStartPosUs = 0;
38720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
38820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
38920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber// static
390d217a8c4632b3e3065f8c2a26b9ce4dc4c97171fGlenn Kastenvoid AudioPlayer::AudioCallback(int event, void *user, void *info) {
39120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    static_cast<AudioPlayer *>(user)->AudioCallback(event, info);
39220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
39320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
3945295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huberbool AudioPlayer::reachedEOS(status_t *finalStatus) {
3955295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber    *finalStatus = OK;
3965295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber
3971862a33b246249630b654182afb5914da3480d4cAndreas Huber    Mutex::Autolock autoLock(mLock);
3985295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber    *finalStatus = mFinalStatus;
3991862a33b246249630b654182afb5914da3480d4cAndreas Huber    return mReachedEOS;
4001862a33b246249630b654182afb5914da3480d4cAndreas Huber}
4011862a33b246249630b654182afb5914da3480d4cAndreas Huber
4023a474aa67fc31505740526dd249d96204c08bf79Lajos Molnarstatus_t AudioPlayer::setPlaybackRate(const AudioPlaybackRate &rate) {
4037a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi    if (mAudioSink.get() != NULL) {
4043a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        return mAudioSink->setPlaybackRate(rate);
4052799d743ee2ae5a25fe869a7f9c052acc029559fGlenn Kasten    } else if (mAudioTrack != 0){
4063a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        return mAudioTrack->setPlaybackRate(rate);
4073a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    } else {
4083a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        return NO_INIT;
4093a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    }
4103a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar}
4113a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar
4123a474aa67fc31505740526dd249d96204c08bf79Lajos Molnarstatus_t AudioPlayer::getPlaybackRate(AudioPlaybackRate *rate /* nonnull */) {
4133a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    if (mAudioSink.get() != NULL) {
4143a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        return mAudioSink->getPlaybackRate(rate);
4153a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    } else if (mAudioTrack != 0) {
4163a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        *rate = mAudioTrack->getPlaybackRate();
4173a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        return OK;
4187a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi    } else {
4197a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi        return NO_INIT;
4207a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi    }
4217a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi}
4227a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi
42320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber// static
4247d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Hubersize_t AudioPlayer::AudioSinkCallback(
42584333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber        MediaPlayerBase::AudioSink * /* audioSink */,
426ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald        void *buffer, size_t size, void *cookie,
427ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald        MediaPlayerBase::AudioSink::cb_event_t event) {
42820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    AudioPlayer *me = (AudioPlayer *)cookie;
42920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
43094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    switch(event) {
43194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    case MediaPlayerBase::AudioSink::CB_EVENT_FILL_BUFFER:
43294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        return me->fillBuffer(buffer, size);
43320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
43494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    case MediaPlayerBase::AudioSink::CB_EVENT_STREAM_END:
43594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        ALOGV("AudioSinkCallback: stream end");
43694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        me->mReachedEOS = true;
43794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        break;
43894ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
43994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    case MediaPlayerBase::AudioSink::CB_EVENT_TEAR_DOWN:
44094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        ALOGV("AudioSinkCallback: Tear down event");
44194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        break;
44220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
44320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
44494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    return 0;
44594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald}
44694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
44794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgeraldvoid AudioPlayer::AudioCallback(int event, void *info) {
44894ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    switch (event) {
44994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    case AudioTrack::EVENT_MORE_DATA:
45094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        {
45194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        AudioTrack::Buffer *buffer = (AudioTrack::Buffer *)info;
45294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        size_t numBytesWritten = fillBuffer(buffer->raw, buffer->size);
45394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        buffer->size = numBytesWritten;
45494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        }
45594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        break;
4567d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber
45794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    case AudioTrack::EVENT_STREAM_END:
45894ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        mReachedEOS = true;
45994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        break;
46094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    }
46120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
46220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
4637d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Hubersize_t AudioPlayer::fillBuffer(void *data, size_t size) {
46420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    if (mNumFramesPlayed == 0) {
4653856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("AudioCallback");
46620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
46720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
4681862a33b246249630b654182afb5914da3480d4cAndreas Huber    if (mReachedEOS) {
46951c1e0e86a0ad95bf3d890a9a2f51e54b8ef9444Andreas Huber        return 0;
4701862a33b246249630b654182afb5914da3480d4cAndreas Huber    }
4711862a33b246249630b654182afb5914da3480d4cAndreas Huber
47220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    size_t size_done = 0;
47320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    size_t size_remaining = size;
47420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    while (size_remaining > 0) {
47520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        MediaSource::ReadOptions options;
47694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        bool refreshSeekTime = false;
47720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
47820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        {
47920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            Mutex::Autolock autoLock(mLock);
48020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
48120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            if (mSeeking) {
4823cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber                if (mIsFirstBuffer) {
4833cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber                    if (mFirstBuffer != NULL) {
4843cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber                        mFirstBuffer->release();
4853cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber                        mFirstBuffer = NULL;
4863cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber                    }
4873cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber                    mIsFirstBuffer = false;
4883cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber                }
4893cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber
49020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                options.setSeekTo(mSeekTimeUs);
49194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                refreshSeekTime = true;
49220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
49320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                if (mInputBuffer != NULL) {
49420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                    mInputBuffer->release();
49520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                    mInputBuffer = NULL;
49620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                }
497cb9859bcf5f00cee57de06e9968b88a69b2d6d9cGloria Wang
498cb9859bcf5f00cee57de06e9968b88a69b2d6d9cGloria Wang                mSeeking = false;
49920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
50020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
50120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
50220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (mInputBuffer == NULL) {
5033cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber            status_t err;
5043cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber
5053cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber            if (mIsFirstBuffer) {
5063cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber                mInputBuffer = mFirstBuffer;
5073cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber                mFirstBuffer = NULL;
5083cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber                err = mFirstBufferResult;
5093cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber
5103cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber                mIsFirstBuffer = false;
5113cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber            } else {
5123cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber                err = mSource->read(&mInputBuffer, &options);
5133cc219dfc67b866e10828f0c17641668d47c1cd8Andreas Huber            }
51420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
5150c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber            CHECK((err == OK && mInputBuffer != NULL)
51620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                   || (err != OK && mInputBuffer == NULL));
51720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
5181862a33b246249630b654182afb5914da3480d4cAndreas Huber            Mutex::Autolock autoLock(mLock);
519bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
52020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            if (err != OK) {
52194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                if (!mReachedEOS) {
52294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                    if (useOffload()) {
52394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                        // no more buffers to push - stop() and wait for STREAM_END
52494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                        // don't set mReachedEOS until stream end received
52594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                        if (mAudioSink != NULL) {
52694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                            mAudioSink->stop();
52794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                        } else {
52894ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                            mAudioTrack->stop();
52994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                        }
5306b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen                    } else {
53194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                        mReachedEOS = true;
5326b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen                    }
533ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber                }
534ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber
5355295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber                mFinalStatus = err;
53620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                break;
53720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
53820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
539db354e58e65592777aa17caa47933e14838b8b35Eric Laurent            if (mAudioSink != NULL) {
540db354e58e65592777aa17caa47933e14838b8b35Eric Laurent                mLatencyUs = (int64_t)mAudioSink->latency() * 1000;
541db354e58e65592777aa17caa47933e14838b8b35Eric Laurent            } else {
542db354e58e65592777aa17caa47933e14838b8b35Eric Laurent                mLatencyUs = (int64_t)mAudioTrack->latency() * 1000;
543db354e58e65592777aa17caa47933e14838b8b35Eric Laurent            }
544db354e58e65592777aa17caa47933e14838b8b35Eric Laurent
54594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            if(mInputBuffer->range_length() != 0) {
54694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                CHECK(mInputBuffer->meta_data()->findInt64(
54748c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber                        kKeyTime, &mPositionTimeMediaUs));
54894ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            }
54994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
55094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            // need to adjust the mStartPosUs for offload decoding since parser
55194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            // might not be able to get the exact seek time requested.
55291b0ca1a5bea44dd9b5196910186dd2927821994Eric Laurent            if (refreshSeekTime) {
55391b0ca1a5bea44dd9b5196910186dd2927821994Eric Laurent                if (useOffload()) {
55491b0ca1a5bea44dd9b5196910186dd2927821994Eric Laurent                    mStartPosUs = mPositionTimeMediaUs;
55591b0ca1a5bea44dd9b5196910186dd2927821994Eric Laurent                    ALOGV("adjust seek time to: %.2f", mStartPosUs/ 1E6);
55691b0ca1a5bea44dd9b5196910186dd2927821994Eric Laurent                }
55791b0ca1a5bea44dd9b5196910186dd2927821994Eric Laurent                // clear seek time with mLock locked and once we have valid mPositionTimeMediaUs
55891b0ca1a5bea44dd9b5196910186dd2927821994Eric Laurent                // and mPositionTimeRealUs
55991b0ca1a5bea44dd9b5196910186dd2927821994Eric Laurent                // before clearing mSeekTimeUs check if a new seek request has been received while
56091b0ca1a5bea44dd9b5196910186dd2927821994Eric Laurent                // we were reading from the source with mLock released.
56191b0ca1a5bea44dd9b5196910186dd2927821994Eric Laurent                if (!mSeeking) {
56291b0ca1a5bea44dd9b5196910186dd2927821994Eric Laurent                    mSeekTimeUs = 0;
56391b0ca1a5bea44dd9b5196910186dd2927821994Eric Laurent                }
56494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            }
5650024245e134467d120b40099da16c467dc365e76Andreas Huber
56694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            if (!useOffload()) {
56794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                mPositionTimeRealUs =
56894ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                    ((mNumFramesPlayed + size_done / mFrameSize) * 1000000)
56994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                        / mSampleRate;
570a5750e0dad9e90f2195ce36f2c4457fa04b2b83eMark Salyzyn                ALOGV("buffer->size() = %zu, "
57194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                     "mPositionTimeMediaUs=%.2f mPositionTimeRealUs=%.2f",
57294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                     mInputBuffer->range_length(),
57394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                     mPositionTimeMediaUs / 1E6, mPositionTimeRealUs / 1E6);
57494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            }
575dae04ca7c4b5590786ffc336721ee8714cc79fefAndreas Huber
57620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
57720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
57820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (mInputBuffer->range_length() == 0) {
57920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            mInputBuffer->release();
58020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            mInputBuffer = NULL;
58120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
58220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            continue;
58320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
58420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
58520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        size_t copy = size_remaining;
58620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (copy > mInputBuffer->range_length()) {
58720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            copy = mInputBuffer->range_length();
58820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
58920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
59020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        memcpy((char *)data + size_done,
59120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber               (const char *)mInputBuffer->data() + mInputBuffer->range_offset(),
59220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber               copy);
59320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
59420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        mInputBuffer->set_range(mInputBuffer->range_offset() + copy,
59520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                                mInputBuffer->range_length() - copy);
596fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber
59720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        size_done += copy;
59820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        size_remaining -= copy;
59920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
60020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
60194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    if (useOffload()) {
60294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        // We must ask the hardware what it has played
60394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        mPositionTimeRealUs = getOutputPlayPositionUs_l();
60494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        ALOGV("mPositionTimeMediaUs=%.2f mPositionTimeRealUs=%.2f",
60594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald             mPositionTimeMediaUs / 1E6, mPositionTimeRealUs / 1E6);
60694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    }
60794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
608bd7b7177f88ae6e83bd7bb8bfd9b7018be923931Andreas Huber    {
609bd7b7177f88ae6e83bd7bb8bfd9b7018be923931Andreas Huber        Mutex::Autolock autoLock(mLock);
610bd7b7177f88ae6e83bd7bb8bfd9b7018be923931Andreas Huber        mNumFramesPlayed += size_done / mFrameSize;
611e4451a91a61a341014f5eff61db356156c3ecb37Andreas Huber        mNumFramesPlayedSysTimeUs = ALooper::GetNowUs();
612bd7b7177f88ae6e83bd7bb8bfd9b7018be923931Andreas Huber    }
613bd7b7177f88ae6e83bd7bb8bfd9b7018be923931Andreas Huber
6147d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber    return size_done;
61520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
61620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
6176f59db12a64f4496866952a251122ccb77a36c6bEric Laurentint64_t AudioPlayer::getOutputPlayPositionUs_l()
61894ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald{
61994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    uint32_t playedSamples = 0;
6206f59db12a64f4496866952a251122ccb77a36c6bEric Laurent    uint32_t sampleRate;
62194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    if (mAudioSink != NULL) {
62294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        mAudioSink->getPosition(&playedSamples);
6236f59db12a64f4496866952a251122ccb77a36c6bEric Laurent        sampleRate = mAudioSink->getSampleRate();
62494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    } else {
62594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        mAudioTrack->getPosition(&playedSamples);
6266f59db12a64f4496866952a251122ccb77a36c6bEric Laurent        sampleRate = mAudioTrack->getSampleRate();
6276f59db12a64f4496866952a251122ccb77a36c6bEric Laurent    }
6286f59db12a64f4496866952a251122ccb77a36c6bEric Laurent    if (sampleRate != 0) {
6296f59db12a64f4496866952a251122ccb77a36c6bEric Laurent        mSampleRate = sampleRate;
63094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    }
63194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
6326f59db12a64f4496866952a251122ccb77a36c6bEric Laurent    int64_t playedUs;
6336f59db12a64f4496866952a251122ccb77a36c6bEric Laurent    if (mSampleRate != 0) {
6346f59db12a64f4496866952a251122ccb77a36c6bEric Laurent        playedUs = (static_cast<int64_t>(playedSamples) * 1000000 ) / mSampleRate;
6356f59db12a64f4496866952a251122ccb77a36c6bEric Laurent    } else {
6366f59db12a64f4496866952a251122ccb77a36c6bEric Laurent        playedUs = 0;
6376f59db12a64f4496866952a251122ccb77a36c6bEric Laurent    }
63894ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
63994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    // HAL position is relative to the first buffer we sent at mStartPosUs
64094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    const int64_t renderedDuration = mStartPosUs + playedUs;
641a5750e0dad9e90f2195ce36f2c4457fa04b2b83eMark Salyzyn    ALOGV("getOutputPlayPositionUs_l %" PRId64, renderedDuration);
64294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    return renderedDuration;
64394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald}
64494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
64520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t AudioPlayer::seekTo(int64_t time_us) {
64620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    Mutex::Autolock autoLock(mLock);
64720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
648a5750e0dad9e90f2195ce36f2c4457fa04b2b83eMark Salyzyn    ALOGV("seekTo( %" PRId64 " )", time_us);
64994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
65020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    mSeeking = true;
651fe9b71919cdddf898a516169db840751878098caAndreas Huber    mPositionTimeRealUs = mPositionTimeMediaUs = -1;
6521862a33b246249630b654182afb5914da3480d4cAndreas Huber    mReachedEOS = false;
65320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    mSeekTimeUs = time_us;
65494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    mStartPosUs = time_us;
65520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
6566c375490a5536695770a85b57ec9f828d3c0c9d4James Dong    // Flush resets the number of played frames
6576c375490a5536695770a85b57ec9f828d3c0c9d4James Dong    mNumFramesPlayed = 0;
658e4451a91a61a341014f5eff61db356156c3ecb37Andreas Huber    mNumFramesPlayedSysTimeUs = ALooper::GetNowUs();
6596c375490a5536695770a85b57ec9f828d3c0c9d4James Dong
660c7d368d990303dc5369c7c61579f88c5059dc8d7Andreas Huber    if (mAudioSink != NULL) {
66194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        if (mPlaying) {
66294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            mAudioSink->pause();
66394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        }
664c7d368d990303dc5369c7c61579f88c5059dc8d7Andreas Huber        mAudioSink->flush();
66594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        if (mPlaying) {
66694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            mAudioSink->start();
66794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        }
668c7d368d990303dc5369c7c61579f88c5059dc8d7Andreas Huber    } else {
66994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        if (mPlaying) {
67094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            mAudioTrack->pause();
67194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        }
672c7d368d990303dc5369c7c61579f88c5059dc8d7Andreas Huber        mAudioTrack->flush();
67394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        if (mPlaying) {
67494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            mAudioTrack->start();
67594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        }
676c7d368d990303dc5369c7c61579f88c5059dc8d7Andreas Huber    }
677c7d368d990303dc5369c7c61579f88c5059dc8d7Andreas Huber
67820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return OK;
67920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
68020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
68120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
682