VideoEditorAudioPlayer.h revision 727f9e1e8e1306af761765e480ac5499224db646
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