JetPlayer.h revision e53b9ead781c36e96d6b6f012ddffc93a3d80f0d
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#include <nativehelper/jni.h>
2289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <libsonivox/jet.h>
2489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <libsonivox/eas_types.h>
2589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include "AudioTrack.h"
2689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android {
2989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projecttypedef void (*jetevent_callback)(int eventType, int val1, int val2, void *cookie);
3189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass JetPlayer {
3389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
3589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // to keep in sync with the JetPlayer class constants
3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // defined in frameworks/base/media/java/android/media/JetPlayer.java
3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static const int JET_EVENT                   = 1;
3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static const int JET_USERID_UPDATE           = 2;
4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static const int JET_NUMQUEUEDSEGMENT_UPDATE = 3;
4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static const int JET_PAUSE_UPDATE            = 4;
4289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
43e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    JetPlayer(jobject javaJetPlayer,
44e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten            int maxTracks = 32,
4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int trackBufferSize = 1200);
4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    ~JetPlayer();
4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    int init();
4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    int release();
49e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten
5089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    int loadFromFile(const char* url);
5189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    int loadFromFD(const int fd, const long long offset, const long long length);
5289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    int closeFile();
5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    int play();
5489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    int pause();
5589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    int queueSegment(int segmentNum, int libNum, int repeatCount, int transpose,
5689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            EAS_U32 muteFlags, EAS_U8 userID);
5789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    int setMuteFlags(EAS_U32 muteFlags, bool sync);
5889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    int setMuteFlag(int trackNum, bool muteFlag, bool sync);
5989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    int triggerClip(int clipId);
6089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    int clearQueue();
6189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
6289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    void setEventCallback(jetevent_callback callback);
63e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten
6489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    int getMaxTracks() { return mMaxTracks; };
6589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
6689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
6789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectprivate:
6889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    int                 render();
6989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    void                fireUpdateOnStatusChange();
7089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    void                fireEventsFromJetQueue();
7189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
7289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    JetPlayer() {} // no default constructor
7389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    void dump();
7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    void dumpJetStatus(S_JET_STATUS* pJetStatus);
7589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
7689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    jetevent_callback   mEventCallback;
7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    jobject             mJavaJetPlayerRef;
7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex               mMutex; // mutex to sync the render and playback thread with the JET calls
8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    pid_t               mTid;
8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Condition           mCondition;
8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    volatile bool       mRender;
8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    bool                mPaused;
8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    EAS_STATE           mState;
8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    int*                mMemFailedVar;
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
8889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    int                 mMaxTracks; // max number of MIDI tracks, usually 32
8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    EAS_DATA_HANDLE     mEasData;
9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    EAS_FILE_LOCATOR    mEasJetFileLoc;
91e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    EAS_PCM*            mAudioBuffer;// EAS renders the MIDI data into this buffer,
9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    AudioTrack*         mAudioTrack; // and we play it in this audio track
9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    int                 mTrackBufferSize;
9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    S_JET_STATUS        mJetStatus;
9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    S_JET_STATUS        mPreviousJetStatus;
9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
970049acfc8b1c33eb90afc925dacd08a487618e17Glenn Kasten    char                mJetFilePath[PATH_MAX];
9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
99a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten    class JetPlayerThread : public Thread {
100a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten    public:
101a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten        JetPlayerThread(JetPlayer *player) : mPlayer(player) {
102a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten        }
103a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten
104a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten    protected:
105a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten        virtual ~JetPlayerThread() {}
106a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten
107a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten    private:
108a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten        JetPlayer *mPlayer;
109a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten
110a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten        bool threadLoop() {
111a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten            int result;
112a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten            result = mPlayer->render();
113a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten            return false;
114a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten        }
115a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten
116a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten        JetPlayerThread(const JetPlayerThread &);
117a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten        JetPlayerThread &operator=(const JetPlayerThread &);
118a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten    };
119a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten
120a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten    sp<JetPlayerThread> mThread;
12189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
12289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // end class JetPlayer
12389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
12489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} // end namespace android
12589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
12689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
12789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
12889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#endif /*JETPLAYER_H_*/
129