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