| /* |
| ** |
| ** Copyright 2008, 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 ANDROID_MIDIFILE_H |
| #define ANDROID_MIDIFILE_H |
| |
| #include <media/MediaPlayerInterface.h> |
| #include <libsonivox/eas.h> |
| |
| namespace android { |
| |
| // Note that the name MidiFile is misleading; this actually represents a MIDI file player |
| class MidiFile : public MediaPlayerInterface { |
| public: |
| MidiFile(); |
| ~MidiFile(); |
| |
| virtual status_t initCheck(); |
| |
| virtual status_t setDataSource( |
| const sp<IMediaHTTPService> &httpService, |
| const char* path, |
| const KeyedVector<String8, String8> *headers); |
| |
| virtual status_t setDataSource(int fd, int64_t offset, int64_t length); |
| virtual status_t setVideoSurfaceTexture( |
| const sp<IGraphicBufferProducer>& /*bufferProducer*/) |
| { return UNKNOWN_ERROR; } |
| virtual status_t prepare(); |
| virtual status_t prepareAsync(); |
| virtual status_t start(); |
| virtual status_t stop(); |
| virtual status_t seekTo(int msec); |
| virtual status_t pause(); |
| virtual bool isPlaying(); |
| virtual status_t getCurrentPosition(int* msec); |
| virtual status_t getDuration(int* msec); |
| virtual status_t release(); |
| virtual status_t reset(); |
| virtual status_t setLooping(int loop); |
| virtual player_type playerType() { return SONIVOX_PLAYER; } |
| virtual status_t invoke(const Parcel& /*request*/, Parcel* /*reply*/) { |
| return INVALID_OPERATION; |
| } |
| virtual status_t setParameter(int /*key*/, const Parcel &/*request*/) { |
| return INVALID_OPERATION; |
| } |
| virtual status_t getParameter(int /*key*/, Parcel* /*reply*/) { |
| return INVALID_OPERATION; |
| } |
| |
| |
| private: |
| status_t createOutputTrack(); |
| status_t reset_nosync(); |
| int render(); |
| void updateState(){ EAS_State(mEasData, mEasHandle, &mState); } |
| |
| Mutex mMutex; |
| Condition mCondition; |
| EAS_DATA_HANDLE mEasData; |
| EAS_HANDLE mEasHandle; |
| EAS_PCM* mAudioBuffer; |
| EAS_I32 mPlayTime; |
| EAS_I32 mDuration; |
| EAS_STATE mState; |
| EAS_FILE mFileLocator; |
| audio_stream_type_t mStreamType; |
| bool mLoop; |
| volatile bool mExit; |
| bool mPaused; |
| volatile bool mRender; |
| pid_t mTid; |
| |
| class MidiFileThread : public Thread { |
| public: |
| MidiFileThread(MidiFile *midiPlayer) : mMidiFile(midiPlayer) { |
| } |
| |
| protected: |
| virtual ~MidiFileThread() {} |
| |
| private: |
| MidiFile *mMidiFile; |
| |
| bool threadLoop() { |
| int result; |
| result = mMidiFile->render(); |
| return false; |
| } |
| |
| MidiFileThread(const MidiFileThread &); |
| MidiFileThread &operator=(const MidiFileThread &); |
| }; |
| |
| sp<MidiFileThread> mThread; |
| }; |
| |
| }; // namespace android |
| |
| #endif // ANDROID_MIDIFILE_H |