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