19969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/*
29969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Copyright (C) 2011 The Android Open Source Project
39969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *
49969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Licensed under the Apache License, Version 2.0 (the "License");
59969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * you may not use this file except in compliance with the License.
69969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * You may obtain a copy of the License at
79969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *
89969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *      http://www.apache.org/licenses/LICENSE-2.0
99969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *
109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Unless required by applicable law or agreed to in writing, software
119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * distributed under the License is distributed on an "AS IS" BASIS,
129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * See the License for the specific language governing permissions and
149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * limitations under the License.
159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang */
169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#ifndef VE_AUDIO_PLAYER_H_
189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#define VE_AUDIO_PLAYER_H_
199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include <media/MediaPlayerInterface.h>
219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include <media/stagefright/MediaBuffer.h>
229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include <media/stagefright/TimeSource.h>
239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include <utils/threads.h>
24727f9e1e8e1306af761765e480ac5499224db646James Dong
259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include "M4xVSS_API.h"
269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include "VideoEditorMain.h"
279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include "M4OSA_FileReader.h"
289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include "VideoEditorBGAudioProcessing.h"
29727f9e1e8e1306af761765e480ac5499224db646James Dong
309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changnamespace android {
329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changclass MediaSource;
349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changclass AudioTrack;
359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changclass PreviewPlayer;
369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
37727f9e1e8e1306af761765e480ac5499224db646James Dongclass VideoEditorAudioPlayer : public TimeSource {
389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changpublic:
399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    enum {
409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        REACHED_EOS,
419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        SEEK_COMPLETE
429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    };
439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    VideoEditorAudioPlayer(const sp<MediaPlayerBase::AudioSink> &audioSink,
4500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong        PreviewPlayer *audioObserver = NULL);
469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
47727f9e1e8e1306af761765e480ac5499224db646James Dong    ~VideoEditorAudioPlayer();
48727f9e1e8e1306af761765e480ac5499224db646James Dong
49727f9e1e8e1306af761765e480ac5499224db646James Dong    // Return time in us.
50727f9e1e8e1306af761765e480ac5499224db646James Dong    int64_t getRealTimeUs();
51727f9e1e8e1306af761765e480ac5499224db646James Dong
52727f9e1e8e1306af761765e480ac5499224db646James Dong    // Returns the timestamp of the last buffer played (in us).
53727f9e1e8e1306af761765e480ac5499224db646James Dong    int64_t getMediaTimeUs();
54727f9e1e8e1306af761765e480ac5499224db646James Dong
55727f9e1e8e1306af761765e480ac5499224db646James Dong    // Returns true iff a mapping is established, i.e. the AudioPlayerBase
56727f9e1e8e1306af761765e480ac5499224db646James Dong    // has played at least one frame of audio.
57727f9e1e8e1306af761765e480ac5499224db646James Dong    bool getMediaTimeMapping(int64_t *realtime_us, int64_t *mediatime_us);
589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    status_t start(bool sourceAlreadyStarted = false);
60727f9e1e8e1306af761765e480ac5499224db646James Dong    void pause(bool playPendingSamples = false);
619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    void resume();
62727f9e1e8e1306af761765e480ac5499224db646James Dong    status_t seekTo(int64_t time_us);
63727f9e1e8e1306af761765e480ac5499224db646James Dong    bool isSeeking();
64727f9e1e8e1306af761765e480ac5499224db646James Dong    bool reachedEOS(status_t *finalStatus);
659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    void setAudioMixSettings(M4xVSS_AudioMixingSettings* pAudioMixSettings);
679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    void setAudioMixPCMFileHandle(M4OSA_Context pBGAudioPCMFileHandle);
689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    void setAudioMixStoryBoardSkimTimeStamp(
699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        M4OSA_UInt32 pBGAudioStoryBoardSkimTimeStamp,
709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        M4OSA_UInt32 pBGAudioCurrentMediaBeginCutTS,
719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        M4OSA_UInt32 pBGAudioCurrentMediaVolumeVal);
729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
7300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    void setObserver(PreviewPlayer *observer);
749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    void setSource(const sp<MediaSource> &source);
759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    sp<MediaSource> getSource();
769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    bool isStarted();
789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changprivate:
799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4xVSS_AudioMixingSettings *mAudioMixSettings;
819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    VideoEditorBGAudioProcessing *mAudioProcess;
829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_Context mBGAudioPCMFileHandle;
849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    int64_t mBGAudioPCMFileLength;
859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    int64_t mBGAudioPCMFileTrimmedLength;
869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    int64_t mBGAudioPCMFileDuration;
879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    int64_t mBGAudioPCMFileSeekPoint;
889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    int64_t mBGAudioPCMFileOriginalSeekPoint;
899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    int64_t mBGAudioStoryBoardSkimTimeStamp;
909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    int64_t mBGAudioStoryBoardCurrentMediaBeginCutTS;
919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    int64_t mBGAudioStoryBoardCurrentMediaVolumeVal;
929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
93727f9e1e8e1306af761765e480ac5499224db646James Dong    sp<MediaSource> mSource;
94727f9e1e8e1306af761765e480ac5499224db646James Dong    AudioTrack *mAudioTrack;
959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
96727f9e1e8e1306af761765e480ac5499224db646James Dong    MediaBuffer *mInputBuffer;
97727f9e1e8e1306af761765e480ac5499224db646James Dong
98727f9e1e8e1306af761765e480ac5499224db646James Dong    int mSampleRate;
99727f9e1e8e1306af761765e480ac5499224db646James Dong    int64_t mLatencyUs;
100727f9e1e8e1306af761765e480ac5499224db646James Dong    size_t mFrameSize;
1019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
102727f9e1e8e1306af761765e480ac5499224db646James Dong    Mutex mLock;
103727f9e1e8e1306af761765e480ac5499224db646James Dong    int64_t mNumFramesPlayed;
104727f9e1e8e1306af761765e480ac5499224db646James Dong
105727f9e1e8e1306af761765e480ac5499224db646James Dong    int64_t mPositionTimeMediaUs;
106727f9e1e8e1306af761765e480ac5499224db646James Dong    int64_t mPositionTimeRealUs;
107727f9e1e8e1306af761765e480ac5499224db646James Dong
108727f9e1e8e1306af761765e480ac5499224db646James Dong    bool mSeeking;
109727f9e1e8e1306af761765e480ac5499224db646James Dong    bool mReachedEOS;
110727f9e1e8e1306af761765e480ac5499224db646James Dong    status_t mFinalStatus;
111727f9e1e8e1306af761765e480ac5499224db646James Dong    int64_t mSeekTimeUs;
112727f9e1e8e1306af761765e480ac5499224db646James Dong
113727f9e1e8e1306af761765e480ac5499224db646James Dong    bool mStarted;
114727f9e1e8e1306af761765e480ac5499224db646James Dong
115727f9e1e8e1306af761765e480ac5499224db646James Dong    bool mIsFirstBuffer;
116727f9e1e8e1306af761765e480ac5499224db646James Dong    status_t mFirstBufferResult;
117727f9e1e8e1306af761765e480ac5499224db646James Dong    MediaBuffer *mFirstBuffer;
118727f9e1e8e1306af761765e480ac5499224db646James Dong
119727f9e1e8e1306af761765e480ac5499224db646James Dong    sp<MediaPlayerBase::AudioSink> mAudioSink;
120727f9e1e8e1306af761765e480ac5499224db646James Dong    PreviewPlayer *mObserver;
121727f9e1e8e1306af761765e480ac5499224db646James Dong
122727f9e1e8e1306af761765e480ac5499224db646James Dong    static void AudioCallback(int event, void *user, void *info);
123727f9e1e8e1306af761765e480ac5499224db646James Dong    void AudioCallback(int event, void *info);
124727f9e1e8e1306af761765e480ac5499224db646James Dong    size_t fillBuffer(void *data, size_t size);
1259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    static size_t AudioSinkCallback(
1269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            MediaPlayerBase::AudioSink *audioSink,
1279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            void *data, size_t size, void *me);
1289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
129727f9e1e8e1306af761765e480ac5499224db646James Dong    void reset();
130727f9e1e8e1306af761765e480ac5499224db646James Dong    void clear();
131727f9e1e8e1306af761765e480ac5499224db646James Dong    int64_t getRealTimeUs_l();
132727f9e1e8e1306af761765e480ac5499224db646James Dong    void setPrimaryTrackVolume(
133727f9e1e8e1306af761765e480ac5499224db646James Dong            M4OSA_Int16 *data, M4OSA_UInt32 size, M4OSA_Float volLevel);
134727f9e1e8e1306af761765e480ac5499224db646James Dong
1359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    VideoEditorAudioPlayer(const VideoEditorAudioPlayer &);
1369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    VideoEditorAudioPlayer &operator=(const VideoEditorAudioPlayer &);
1379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang};
1389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}  // namespace android
1409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#endif  // VE_AUDIO_PLAYER_H_
142