AudioPlayer.h revision ad3af3305f024bcbbd55c894a4995e449498e1ba
1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)/*
2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * Copyright (C) 2009 The Android Open Source Project
3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) *
4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * Licensed under the Apache License, Version 2.0 (the "License");
5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * you may not use this file except in compliance with the License.
6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * You may obtain a copy of the License at
7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) *
8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) *      http://www.apache.org/licenses/LICENSE-2.0
9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) *
10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * Unless required by applicable law or agreed to in writing, software
11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * distributed under the License is distributed on an "AS IS" BASIS,
12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * See the License for the specific language governing permissions and
14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * limitations under the License.
15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) */
16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#ifndef AUDIO_PLAYER_H_
18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#define AUDIO_PLAYER_H_
20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <media/MediaPlayerInterface.h>
22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <media/stagefright/MediaBuffer.h>
23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <media/stagefright/TimeSource.h>
24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <utils/threads.h>
25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace android {
27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class MediaSource;
29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class AudioTrack;
30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class AwesomePlayer;
31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class AudioPlayer : public TimeSource {
33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)public:
34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    enum {
35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        REACHED_EOS,
36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        SEEK_COMPLETE
37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    };
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    enum {
40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        ALLOW_DEEP_BUFFERING = 0x01,
41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        USE_OFFLOAD = 0x02
42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    };
43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    AudioPlayer(const sp<MediaPlayerBase::AudioSink> &audioSink,
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                uint32_t flags = 0,
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                AwesomePlayer *audioObserver = NULL);
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    virtual ~AudioPlayer();
49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    // Caller retains ownership of "source".
51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    void setSource(const sp<MediaSource> &source);
52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    // Return time in us.
54    virtual int64_t getRealTimeUs();
55
56    status_t start(bool sourceAlreadyStarted = false);
57
58    void pause(bool playPendingSamples = false);
59    void resume();
60
61    // Returns the timestamp of the last buffer played (in us).
62    int64_t getMediaTimeUs();
63
64    // Returns true iff a mapping is established, i.e. the AudioPlayer
65    // has played at least one frame of audio.
66    bool getMediaTimeMapping(int64_t *realtime_us, int64_t *mediatime_us);
67
68    status_t seekTo(int64_t time_us);
69
70    bool isSeeking();
71    bool reachedEOS(status_t *finalStatus);
72
73    status_t setPlaybackRatePermille(int32_t ratePermille);
74
75    void notifyAudioEOS();
76
77private:
78    friend class VideoEditorAudioPlayer;
79    sp<MediaSource> mSource;
80    sp<AudioTrack> mAudioTrack;
81
82    MediaBuffer *mInputBuffer;
83
84    int mSampleRate;
85    int64_t mLatencyUs;
86    size_t mFrameSize;
87
88    Mutex mLock;
89    int64_t mNumFramesPlayed;
90    int64_t mNumFramesPlayedSysTimeUs;
91
92    int64_t mPositionTimeMediaUs;
93    int64_t mPositionTimeRealUs;
94
95    bool mSeeking;
96    bool mReachedEOS;
97    status_t mFinalStatus;
98    int64_t mSeekTimeUs;
99
100    bool mStarted;
101
102    bool mIsFirstBuffer;
103    status_t mFirstBufferResult;
104    MediaBuffer *mFirstBuffer;
105
106    sp<MediaPlayerBase::AudioSink> mAudioSink;
107    bool mAllowDeepBuffering;       // allow audio deep audio buffers. Helps with low power audio
108                                    // playback but implies high latency
109    AwesomePlayer *mObserver;
110    int64_t mPinnedTimeUs;
111
112    static void AudioCallback(int event, void *user, void *info);
113    void AudioCallback(int event, void *info);
114
115    static size_t AudioSinkCallback(
116            MediaPlayerBase::AudioSink *audioSink,
117            void *data, size_t size, void *me,
118            MediaPlayerBase::AudioSink::cb_event_t event);
119
120    size_t fillBuffer(void *data, size_t size);
121
122    int64_t getRealTimeUsLocked() const;
123
124    void reset();
125
126    uint32_t getNumFramesPendingPlayout() const;
127    int64_t getOutputPlayPositionUs_l() const;
128
129    AudioPlayer(const AudioPlayer &);
130    AudioPlayer &operator=(const AudioPlayer &);
131};
132
133}  // namespace android
134
135#endif  // AUDIO_PLAYER_H_
136