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