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