JetPlayer.h revision 2e66a7896c9a9da3a15fc6cff9be28b4174d8719
189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/*
289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *
489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * you may not use this file except in compliance with the License.
689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * You may obtain a copy of the License at
789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *
889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *
1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * See the License for the specific language governing permissions and
1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * limitations under the License.
1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */
1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#ifndef JETPLAYER_H_
1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define JETPLAYER_H_
1989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/threads.h>
2189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <libsonivox/jet.h>
2389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <libsonivox/eas_types.h>
24b4d307481960b6b348fae4b4e8edefd003c3d36cGlenn Kasten#include <media/AudioTrack.h>
2589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android {
2889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projecttypedef void (*jetevent_callback)(int eventType, int val1, int val2, void *cookie);
3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass JetPlayer {
3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // to keep in sync with the JetPlayer class constants
3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // defined in frameworks/base/media/java/android/media/JetPlayer.java
3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static const int JET_EVENT                   = 1;
3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static const int JET_USERID_UPDATE           = 2;
3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static const int JET_NUMQUEUEDSEGMENT_UPDATE = 3;
4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static const int JET_PAUSE_UPDATE            = 4;
4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
422e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent    JetPlayer(void *javaJetPlayer,
43e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten            int maxTracks = 32,
4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int trackBufferSize = 1200);
4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    ~JetPlayer();
4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    int init();
4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    int release();
48e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten
4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    int loadFromFile(const char* url);
5089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    int loadFromFD(const int fd, const long long offset, const long long length);
5189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    int closeFile();
5289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    int play();
5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    int pause();
5489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    int queueSegment(int segmentNum, int libNum, int repeatCount, int transpose,
5589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            EAS_U32 muteFlags, EAS_U8 userID);
5689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    int setMuteFlags(EAS_U32 muteFlags, bool sync);
5789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    int setMuteFlag(int trackNum, bool muteFlag, bool sync);
5889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    int triggerClip(int clipId);
5989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    int clearQueue();
6089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
6189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    void setEventCallback(jetevent_callback callback);
62e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten
6389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    int getMaxTracks() { return mMaxTracks; };
6489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
6589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
6689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectprivate:
6789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    int                 render();
6889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    void                fireUpdateOnStatusChange();
6989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    void                fireEventsFromJetQueue();
7089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
7189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    JetPlayer() {} // no default constructor
7289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    void dump();
7389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    void dumpJetStatus(S_JET_STATUS* pJetStatus);
7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
7589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    jetevent_callback   mEventCallback;
7689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
772e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent    void*               mJavaJetPlayerRef;
7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex               mMutex; // mutex to sync the render and playback thread with the JET calls
7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    pid_t               mTid;
8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Condition           mCondition;
8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    volatile bool       mRender;
8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    bool                mPaused;
8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    EAS_STATE           mState;
8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    int*                mMemFailedVar;
8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    int                 mMaxTracks; // max number of MIDI tracks, usually 32
8889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    EAS_DATA_HANDLE     mEasData;
8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    EAS_FILE_LOCATOR    mEasJetFileLoc;
90e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    EAS_PCM*            mAudioBuffer;// EAS renders the MIDI data into this buffer,
9189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    AudioTrack*         mAudioTrack; // and we play it in this audio track
9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    int                 mTrackBufferSize;
9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    S_JET_STATUS        mJetStatus;
9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    S_JET_STATUS        mPreviousJetStatus;
9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
960049acfc8b1c33eb90afc925dacd08a487618e17Glenn Kasten    char                mJetFilePath[PATH_MAX];
9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
98a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten    class JetPlayerThread : public Thread {
99a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten    public:
100a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten        JetPlayerThread(JetPlayer *player) : mPlayer(player) {
101a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten        }
102a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten
103a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten    protected:
104a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten        virtual ~JetPlayerThread() {}
105a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten
106a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten    private:
107a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten        JetPlayer *mPlayer;
108a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten
109a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten        bool threadLoop() {
110a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten            int result;
111a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten            result = mPlayer->render();
112a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten            return false;
113a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten        }
114a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten
115a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten        JetPlayerThread(const JetPlayerThread &);
116a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten        JetPlayerThread &operator=(const JetPlayerThread &);
117a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten    };
118a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten
119a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten    sp<JetPlayerThread> mThread;
12089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
12189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // end class JetPlayer
12289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
12389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} // end namespace android
12489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
12589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
12689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
12789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#endif /*JETPLAYER_H_*/
128