1e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman/* 2e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Copyright (C) 2008 The Android Open Source Project 3e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 4e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Licensed under the Apache License, Version 2.0 (the "License"); 5e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * you may not use this file except in compliance with the License. 6e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * You may obtain a copy of the License at 7e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 8e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * http://www.apache.org/licenses/LICENSE-2.0 9e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 10e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Unless required by applicable law or agreed to in writing, software 11e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * distributed under the License is distributed on an "AS IS" BASIS, 12e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * See the License for the specific language governing permissions and 14e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * limitations under the License. 15e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman */ 16e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 17e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#ifndef JETPLAYER_H_ 18e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#define JETPLAYER_H_ 19e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 20e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <utils/threads.h> 21e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 22e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <libsonivox/jet.h> 23e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <libsonivox/eas_types.h> 24e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <media/AudioTrack.h> 25e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <media/MidiIoWrapper.h> 26e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 27e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 28e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramannamespace android { 29e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 30e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramantypedef void (*jetevent_callback)(int eventType, int val1, int val2, void *cookie); 31e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 32e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanclass JetPlayer { 33e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 34e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanpublic: 35e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 36e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // to keep in sync with the JetPlayer class constants 37e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // defined in frameworks/base/media/java/android/media/JetPlayer.java 38e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman static const int JET_EVENT = 1; 39e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman static const int JET_USERID_UPDATE = 2; 40e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman static const int JET_NUMQUEUEDSEGMENT_UPDATE = 3; 41e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman static const int JET_PAUSE_UPDATE = 4; 42e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 43e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman JetPlayer(void *javaJetPlayer, 44e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman int maxTracks = 32, 45e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman int trackBufferSize = 1200); 46e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman ~JetPlayer(); 47e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman int init(); 48e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman int release(); 49e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 50e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman int loadFromFile(const char* url); 51e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman int loadFromFD(const int fd, const long long offset, const long long length); 52e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman int closeFile(); 53e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman int play(); 54e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman int pause(); 55e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman int queueSegment(int segmentNum, int libNum, int repeatCount, int transpose, 56e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman EAS_U32 muteFlags, EAS_U8 userID); 57e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman int setMuteFlags(EAS_U32 muteFlags, bool sync); 58e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman int setMuteFlag(int trackNum, bool muteFlag, bool sync); 59e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman int triggerClip(int clipId); 60e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman int clearQueue(); 61e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 62e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman void setEventCallback(jetevent_callback callback); 63e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 64e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman int getMaxTracks() { return mMaxTracks; }; 65e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 66e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 67e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanprivate: 68e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman int render(); 69e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman void fireUpdateOnStatusChange(); 70e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman void fireEventsFromJetQueue(); 71e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 72e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman JetPlayer() {} // no default constructor 73e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman void dump(); 74e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman void dumpJetStatus(S_JET_STATUS* pJetStatus); 75e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 76e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman jetevent_callback mEventCallback; 77e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 78e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman void* mJavaJetPlayerRef; 79e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman Mutex mMutex; // mutex to sync the render and playback thread with the JET calls 80e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman pid_t mTid; 81e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman Condition mCondition; 82e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman volatile bool mRender; 83e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman bool mPaused; 84e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 85e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman EAS_STATE mState; 86e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman int* mMemFailedVar; 87e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 88e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman int mMaxTracks; // max number of MIDI tracks, usually 32 89e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman EAS_DATA_HANDLE mEasData; 90e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman sp<MidiIoWrapper> mIoWrapper; 91e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman EAS_PCM* mAudioBuffer;// EAS renders the MIDI data into this buffer, 92e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman sp<AudioTrack> mAudioTrack; // and we play it in this audio track 93e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman int mTrackBufferSize; 94e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman S_JET_STATUS mJetStatus; 95e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman S_JET_STATUS mPreviousJetStatus; 96e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 97e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman class JetPlayerThread : public Thread { 98e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman public: 99e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman JetPlayerThread(JetPlayer *player) : mPlayer(player) { 100e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 101e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 102e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman protected: 103e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual ~JetPlayerThread() {} 104e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 105e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman private: 106e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman JetPlayer *mPlayer; 107e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 108e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman bool threadLoop() { 109e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman int result; 110e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman result = mPlayer->render(); 111e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return false; 112e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 113e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 114e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman JetPlayerThread(const JetPlayerThread &); 115e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman JetPlayerThread &operator=(const JetPlayerThread &); 116e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman }; 117e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 118e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman sp<JetPlayerThread> mThread; 119e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 120e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman}; // end class JetPlayer 121e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 122e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman} // end namespace android 123e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 124e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 125e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 126e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#endif /*JETPLAYER_H_*/ 127