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