/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef VE_AUDIO_PLAYER_H_
#define VE_AUDIO_PLAYER_H_

#include <media/MediaPlayerInterface.h>
#include <media/stagefright/MediaBuffer.h>
#include <media/stagefright/TimeSource.h>
#include <utils/threads.h>

#include "M4xVSS_API.h"
#include "VideoEditorMain.h"
#include "M4OSA_FileReader.h"
#include "VideoEditorBGAudioProcessing.h"


namespace android {

class MediaSource;
class AudioTrack;
class PreviewPlayer;

class VideoEditorAudioPlayer : public TimeSource {
public:
    enum {
        REACHED_EOS,
        SEEK_COMPLETE
    };

    VideoEditorAudioPlayer(const sp<MediaPlayerBase::AudioSink> &audioSink,
        PreviewPlayer *audioObserver = NULL);

    ~VideoEditorAudioPlayer();

    // Return time in us.
    int64_t getRealTimeUs();

    // Returns the timestamp of the last buffer played (in us).
    int64_t getMediaTimeUs();

    // Returns true iff a mapping is established, i.e. the AudioPlayerBase
    // has played at least one frame of audio.
    bool getMediaTimeMapping(int64_t *realtime_us, int64_t *mediatime_us);

    status_t start(bool sourceAlreadyStarted = false);
    void pause(bool playPendingSamples = false);
    void resume();
    status_t seekTo(int64_t time_us);
    bool isSeeking();
    bool reachedEOS(status_t *finalStatus);

    void setAudioMixSettings(M4xVSS_AudioMixingSettings* pAudioMixSettings);
    void setAudioMixPCMFileHandle(M4OSA_Context pBGAudioPCMFileHandle);
    void setAudioMixStoryBoardSkimTimeStamp(
        M4OSA_UInt32 pBGAudioStoryBoardSkimTimeStamp,
        M4OSA_UInt32 pBGAudioCurrentMediaBeginCutTS,
        M4OSA_UInt32 pBGAudioCurrentMediaVolumeVal);

    void setObserver(PreviewPlayer *observer);
    void setSource(const sp<MediaSource> &source);
    sp<MediaSource> getSource();

    bool isStarted();
private:

    M4xVSS_AudioMixingSettings *mAudioMixSettings;
    VideoEditorBGAudioProcessing *mAudioProcess;

    M4OSA_Context mBGAudioPCMFileHandle;
    int64_t mBGAudioPCMFileLength;
    int64_t mBGAudioPCMFileTrimmedLength;
    int64_t mBGAudioPCMFileDuration;
    int64_t mBGAudioPCMFileSeekPoint;
    int64_t mBGAudioPCMFileOriginalSeekPoint;
    int64_t mBGAudioStoryBoardSkimTimeStamp;
    int64_t mBGAudioStoryBoardCurrentMediaBeginCutTS;
    int64_t mBGAudioStoryBoardCurrentMediaVolumeVal;

    sp<MediaSource> mSource;
    AudioTrack *mAudioTrack;

    MediaBuffer *mInputBuffer;

    int mSampleRate;
    int64_t mLatencyUs;
    size_t mFrameSize;

    Mutex mLock;
    int64_t mNumFramesPlayed;

    int64_t mPositionTimeMediaUs;
    int64_t mPositionTimeRealUs;

    bool mSeeking;
    bool mReachedEOS;
    status_t mFinalStatus;
    int64_t mSeekTimeUs;

    bool mStarted;

    bool mIsFirstBuffer;
    status_t mFirstBufferResult;
    MediaBuffer *mFirstBuffer;

    sp<MediaPlayerBase::AudioSink> mAudioSink;
    PreviewPlayer *mObserver;

    static void AudioCallback(int event, void *user, void *info);
    void AudioCallback(int event, void *info);
    size_t fillBuffer(void *data, size_t size);
    static size_t AudioSinkCallback(
            MediaPlayerBase::AudioSink *audioSink,
            void *data, size_t size, void *me);

    void reset();
    void clear();
    int64_t getRealTimeUs_l();
    void setPrimaryTrackVolume(
            M4OSA_Int16 *data, M4OSA_UInt32 size, M4OSA_Float volLevel);

    VideoEditorAudioPlayer(const VideoEditorAudioPlayer &);
    VideoEditorAudioPlayer &operator=(const VideoEditorAudioPlayer &);
};

}  // namespace android

#endif  // VE_AUDIO_PLAYER_H_
