MidiFile.h revision 247d9ebdbe7f165644f308745eee061fcbb77771
1b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski/* 2b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski** 3b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski** Copyright 2008, The Android Open Source Project 4b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski** 5b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski** Licensed under the Apache License, Version 2.0 (the "License"); 6b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski** you may not use this file except in compliance with the License. 7b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski** You may obtain a copy of the License at 8b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski** 9b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski** http://www.apache.org/licenses/LICENSE-2.0 10b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski** 11b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski** Unless required by applicable law or agreed to in writing, software 12b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski** distributed under the License is distributed on an "AS IS" BASIS, 13b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski** See the License for the specific language governing permissions and 15b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski** limitations under the License. 16b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski*/ 17b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski 18b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski#ifndef ANDROID_MIDIFILE_H 19b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski#define ANDROID_MIDIFILE_H 20b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski 21b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski#include <media/MediaPlayerInterface.h> 22b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski#include <libsonivox/eas.h> 23b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski 24b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinskinamespace android { 25b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski 26b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski// Note that the name MidiFile is misleading; this actually represents a MIDI file player 277b7c58b3842d47c4c8df4876e2e2248c58477d97Dianne Hackbornclass MidiFile : public MediaPlayerInterface { 28b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinskipublic: 29b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski MidiFile(); 30b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski ~MidiFile(); 31b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski 327b7c58b3842d47c4c8df4876e2e2248c58477d97Dianne Hackborn virtual status_t initCheck(); 33b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski 34b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski virtual status_t setDataSource( 35b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski const char* path, const KeyedVector<String8, String8> *headers); 36b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski 37b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski virtual status_t setDataSource(int fd, int64_t offset, int64_t length); 38b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski virtual status_t setVideoSurfaceTexture( 39b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski const sp<IGraphicBufferProducer>& /*bufferProducer*/) 40b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski { return UNKNOWN_ERROR; } 41b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski virtual status_t prepare(); 42b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski virtual status_t prepareAsync(); 43b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski virtual status_t start(); 44b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski virtual status_t stop(); 457b7c58b3842d47c4c8df4876e2e2248c58477d97Dianne Hackborn virtual status_t seekTo(int msec); 467b7c58b3842d47c4c8df4876e2e2248c58477d97Dianne Hackborn virtual status_t pause(); 477b7c58b3842d47c4c8df4876e2e2248c58477d97Dianne Hackborn virtual bool isPlaying(); 48b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski virtual status_t getCurrentPosition(int* msec); 49b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski virtual status_t getDuration(int* msec); 507b7c58b3842d47c4c8df4876e2e2248c58477d97Dianne Hackborn virtual status_t release(); 51b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski virtual status_t reset(); 52b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski virtual status_t setLooping(int loop); 53b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski virtual player_type playerType() { return SONIVOX_PLAYER; } 54b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski virtual status_t invoke(const Parcel& /*request*/, Parcel* /*reply*/) { 55b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski return INVALID_OPERATION; 567b7c58b3842d47c4c8df4876e2e2248c58477d97Dianne Hackborn } 577b7c58b3842d47c4c8df4876e2e2248c58477d97Dianne Hackborn virtual status_t setParameter(int /*key*/, const Parcel &/*request*/) { 58b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski return INVALID_OPERATION; 59b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski } 60b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski virtual status_t getParameter(int /*key*/, Parcel* /*reply*/) { 61b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski return INVALID_OPERATION; 62b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski } 63b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski 64b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski 65b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinskiprivate: 66b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski status_t createOutputTrack(); 677b7c58b3842d47c4c8df4876e2e2248c58477d97Dianne Hackborn status_t reset_nosync(); 687b7c58b3842d47c4c8df4876e2e2248c58477d97Dianne Hackborn int render(); 697b7c58b3842d47c4c8df4876e2e2248c58477d97Dianne Hackborn void updateState(){ EAS_State(mEasData, mEasHandle, &mState); } 707b7c58b3842d47c4c8df4876e2e2248c58477d97Dianne Hackborn 717b7c58b3842d47c4c8df4876e2e2248c58477d97Dianne Hackborn Mutex mMutex; 727b7c58b3842d47c4c8df4876e2e2248c58477d97Dianne Hackborn Condition mCondition; 737b7c58b3842d47c4c8df4876e2e2248c58477d97Dianne Hackborn EAS_DATA_HANDLE mEasData; 747b7c58b3842d47c4c8df4876e2e2248c58477d97Dianne Hackborn EAS_HANDLE mEasHandle; 75b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski EAS_PCM* mAudioBuffer; 767b7c58b3842d47c4c8df4876e2e2248c58477d97Dianne Hackborn EAS_I32 mPlayTime; 777b7c58b3842d47c4c8df4876e2e2248c58477d97Dianne Hackborn EAS_I32 mDuration; 78b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski EAS_STATE mState; 79b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski EAS_FILE mFileLocator; 80b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski audio_stream_type_t mStreamType; 81b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski bool mLoop; 82b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski volatile bool mExit; 83b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski bool mPaused; 84b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski volatile bool mRender; 85b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski pid_t mTid; 86b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski 87b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski class MidiFileThread : public Thread { 88b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski public: 897b7c58b3842d47c4c8df4876e2e2248c58477d97Dianne Hackborn MidiFileThread(MidiFile *midiPlayer) : mMidiFile(midiPlayer) { 907b7c58b3842d47c4c8df4876e2e2248c58477d97Dianne Hackborn } 917b7c58b3842d47c4c8df4876e2e2248c58477d97Dianne Hackborn 927b7c58b3842d47c4c8df4876e2e2248c58477d97Dianne Hackborn protected: 937b7c58b3842d47c4c8df4876e2e2248c58477d97Dianne Hackborn virtual ~MidiFileThread() {} 947b7c58b3842d47c4c8df4876e2e2248c58477d97Dianne Hackborn 957b7c58b3842d47c4c8df4876e2e2248c58477d97Dianne Hackborn private: 967b7c58b3842d47c4c8df4876e2e2248c58477d97Dianne Hackborn MidiFile *mMidiFile; 977b7c58b3842d47c4c8df4876e2e2248c58477d97Dianne Hackborn 987b7c58b3842d47c4c8df4876e2e2248c58477d97Dianne Hackborn bool threadLoop() { 997b7c58b3842d47c4c8df4876e2e2248c58477d97Dianne Hackborn int result; 1007b7c58b3842d47c4c8df4876e2e2248c58477d97Dianne Hackborn result = mMidiFile->render(); 1017b7c58b3842d47c4c8df4876e2e2248c58477d97Dianne Hackborn return false; 1027b7c58b3842d47c4c8df4876e2e2248c58477d97Dianne Hackborn } 1037b7c58b3842d47c4c8df4876e2e2248c58477d97Dianne Hackborn 1047b7c58b3842d47c4c8df4876e2e2248c58477d97Dianne Hackborn MidiFileThread(const MidiFileThread &); 1057b7c58b3842d47c4c8df4876e2e2248c58477d97Dianne Hackborn MidiFileThread &operator=(const MidiFileThread &); 106b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski }; 107b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski 108b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski sp<MidiFileThread> mThread; 109b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski}; 110b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski 111b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski}; // namespace android 112b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski 113b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski#endif // ANDROID_MIDIFILE_H 114b5cf61be7c82392a6f34f53d97c8382d9a0f0b3aAdam Lesinski