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 1720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#ifndef AUDIO_PLAYER_H_ 1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define AUDIO_PLAYER_H_ 2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/MediaPlayerInterface.h> 2220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MediaBuffer.h> 2320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/TimeSource.h> 2420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/threads.h> 2520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android { 2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass MediaSource; 2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass AudioTrack; 30ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huberclass AwesomePlayer; 3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass AudioPlayer : public TimeSource { 3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic: 34bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber enum { 35bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber REACHED_EOS, 36bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber SEEK_COMPLETE 37bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber }; 38bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 39ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald enum { 40ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald ALLOW_DEEP_BUFFERING = 0x01, 4194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald USE_OFFLOAD = 0x02, 4294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald HAS_VIDEO = 0x1000, 4394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald IS_STREAMING = 0x2000 4494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald 45ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald }; 46ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald 47ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber AudioPlayer(const sp<MediaPlayerBase::AudioSink> &audioSink, 48ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald uint32_t flags = 0, 49ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber AwesomePlayer *audioObserver = NULL); 50ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber 51693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber virtual ~AudioPlayer(); 5220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // Caller retains ownership of "source". 54693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber void setSource(const sp<MediaSource> &source); 5520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // Return time in us. 5720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual int64_t getRealTimeUs(); 5820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 59e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber status_t start(bool sourceAlreadyStarted = false); 6020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 61b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber void pause(bool playPendingSamples = false); 6294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald status_t resume(); 6320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 6420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // Returns the timestamp of the last buffer played (in us). 6520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber int64_t getMediaTimeUs(); 6620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 6720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // Returns true iff a mapping is established, i.e. the AudioPlayer 6820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // has played at least one frame of audio. 6920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber bool getMediaTimeMapping(int64_t *realtime_us, int64_t *mediatime_us); 7020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 7120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t seekTo(int64_t time_us); 7220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 731862a33b246249630b654182afb5914da3480d4cAndreas Huber bool isSeeking(); 745295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber bool reachedEOS(status_t *finalStatus); 751862a33b246249630b654182afb5914da3480d4cAndreas Huber 767a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi status_t setPlaybackRatePermille(int32_t ratePermille); 777a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi 78ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald void notifyAudioEOS(); 79ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald 8020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprivate: 81ccb3506ed1845121b94f4e27244e61a46eb19815Dharmaray Kundargi friend class VideoEditorAudioPlayer; 82693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber sp<MediaSource> mSource; 832799d743ee2ae5a25fe869a7f9c052acc029559fGlenn Kasten sp<AudioTrack> mAudioTrack; 8420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 8520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber MediaBuffer *mInputBuffer; 8620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 8720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber int mSampleRate; 8820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber int64_t mLatencyUs; 8920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber size_t mFrameSize; 9020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 9120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Mutex mLock; 9220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber int64_t mNumFramesPlayed; 93e4451a91a61a341014f5eff61db356156c3ecb37Andreas Huber int64_t mNumFramesPlayedSysTimeUs; 9420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 9520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber int64_t mPositionTimeMediaUs; 9620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber int64_t mPositionTimeRealUs; 9720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 9820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber bool mSeeking; 991862a33b246249630b654182afb5914da3480d4cAndreas Huber bool mReachedEOS; 1005295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber status_t mFinalStatus; 10120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber int64_t mSeekTimeUs; 10220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 10320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber bool mStarted; 10420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1053c3ddfa39635a2d39f4ee7c966fb9403fe1ec9d8Andreas Huber bool mIsFirstBuffer; 1063c3ddfa39635a2d39f4ee7c966fb9403fe1ec9d8Andreas Huber status_t mFirstBufferResult; 1073c3ddfa39635a2d39f4ee7c966fb9403fe1ec9d8Andreas Huber MediaBuffer *mFirstBuffer; 1083c3ddfa39635a2d39f4ee7c966fb9403fe1ec9d8Andreas Huber 10920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<MediaPlayerBase::AudioSink> mAudioSink; 110ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber AwesomePlayer *mObserver; 111a99a5bca365277271915cbaeea811ad87131270dAndreas Huber int64_t mPinnedTimeUs; 11220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 11394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald bool mPlaying; 11494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald int64_t mStartPosUs; 11594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald const uint32_t mCreateFlags; 11694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald 117d217a8c4632b3e3065f8c2a26b9ce4dc4c97171fGlenn Kasten static void AudioCallback(int event, void *user, void *info); 118d217a8c4632b3e3065f8c2a26b9ce4dc4c97171fGlenn Kasten void AudioCallback(int event, void *info); 11920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1207d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber static size_t AudioSinkCallback( 12120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber MediaPlayerBase::AudioSink *audioSink, 122ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald void *data, size_t size, void *me, 123ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald MediaPlayerBase::AudioSink::cb_event_t event); 12420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1257d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber size_t fillBuffer(void *data, size_t size); 12620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 12720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber int64_t getRealTimeUsLocked() const; 12820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 129b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber void reset(); 130b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber 13184b343f29063fbfa2ee61b2e3d37ba059ca507d4Andreas Huber uint32_t getNumFramesPendingPlayout() const; 1326f59db12a64f4496866952a251122ccb77a36c6bEric Laurent int64_t getOutputPlayPositionUs_l(); 13384b343f29063fbfa2ee61b2e3d37ba059ca507d4Andreas Huber 13494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald bool allowDeepBuffering() const { return (mCreateFlags & ALLOW_DEEP_BUFFERING) != 0; } 13594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald bool useOffload() const { return (mCreateFlags & USE_OFFLOAD) != 0; } 13694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald 13720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber AudioPlayer(const AudioPlayer &); 13820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber AudioPlayer &operator=(const AudioPlayer &); 13920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 14020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 14120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} // namespace android 14220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 14320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif // AUDIO_PLAYER_H_ 144