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