blob: 0d3c1bac5fbfe2b2dd716acbf3ba28c461e6453f [file] [log] [blame]
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001/*
2 * Copyright (C) 2008 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Jean-Michel Trivi06aff802009-03-24 18:46:20 -070017//#define LOG_NDEBUG 0
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080018#define LOG_TAG "JetPlayer-C"
19
20#include <utils/Log.h>
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080021#include <media/JetPlayer.h>
22
23
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080024namespace android
25{
26
27static const int MIX_NUM_BUFFERS = 4;
28static const S_EAS_LIB_CONFIG* pLibConfig = NULL;
29
30//-------------------------------------------------------------------------------------------------
Eric Laurent2e66a782012-03-26 10:47:22 -070031JetPlayer::JetPlayer(void *javaJetPlayer, int maxTracks, int trackBufferSize) :
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080032 mEventCallback(NULL),
33 mJavaJetPlayerRef(javaJetPlayer),
34 mTid(-1),
35 mRender(false),
36 mPaused(false),
37 mMaxTracks(maxTracks),
38 mEasData(NULL),
Marco Nelissen3d21ae32018-02-16 08:24:08 -080039 mIoWrapper(NULL),
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080040 mTrackBufferSize(trackBufferSize)
41{
Steve Block3856b092011-10-20 11:56:00 +010042 ALOGV("JetPlayer constructor");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080043 mPreviousJetStatus.currentUserID = -1;
44 mPreviousJetStatus.segmentRepeatCount = -1;
45 mPreviousJetStatus.numQueuedSegments = -1;
46 mPreviousJetStatus.paused = true;
47}
48
49//-------------------------------------------------------------------------------------------------
50JetPlayer::~JetPlayer()
51{
Steve Block3856b092011-10-20 11:56:00 +010052 ALOGV("~JetPlayer");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080053 release();
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080054}
55
56//-------------------------------------------------------------------------------------------------
57int JetPlayer::init()
58{
59 //Mutex::Autolock lock(&mMutex);
60
61 EAS_RESULT result;
62
63 // retrieve the EAS library settings
64 if (pLibConfig == NULL)
65 pLibConfig = EAS_Config();
66 if (pLibConfig == NULL) {
Steve Block29357bc2012-01-06 19:20:56 +000067 ALOGE("JetPlayer::init(): EAS library configuration could not be retrieved, aborting.");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080068 return EAS_FAILURE;
69 }
70
71 // init the EAS library
72 result = EAS_Init(&mEasData);
Glenn Kastene53b9ea2012-03-12 16:29:55 -070073 if (result != EAS_SUCCESS) {
Steve Block29357bc2012-01-06 19:20:56 +000074 ALOGE("JetPlayer::init(): Error initializing Sonivox EAS library, aborting.");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080075 mState = EAS_STATE_ERROR;
76 return result;
77 }
78 // init the JET library with the default app event controller range
79 result = JET_Init(mEasData, NULL, sizeof(S_JET_CONFIG));
Glenn Kastene53b9ea2012-03-12 16:29:55 -070080 if (result != EAS_SUCCESS) {
Steve Block29357bc2012-01-06 19:20:56 +000081 ALOGE("JetPlayer::init(): Error initializing JET library, aborting.");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080082 mState = EAS_STATE_ERROR;
83 return result;
84 }
85
86 // create the output AudioTrack
87 mAudioTrack = new AudioTrack();
Glenn Kasten3e98ecd2015-05-18 13:13:24 -070088 status_t status = mAudioTrack->set(AUDIO_STREAM_MUSIC, //TODO parameterize this
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080089 pLibConfig->sampleRate,
Glenn Kastene1c39622012-01-04 09:36:37 -080090 AUDIO_FORMAT_PCM_16_BIT,
Glenn Kastenab334fd2012-03-14 12:56:06 -070091 audio_channel_out_mask_from_count(pLibConfig->numChannels),
Glenn Kastenbce50bf2014-02-27 15:29:51 -080092 (size_t) mTrackBufferSize,
Eric Laurent0ca3cf92012-04-18 09:24:29 -070093 AUDIO_OUTPUT_FLAG_NONE);
Glenn Kasten3e98ecd2015-05-18 13:13:24 -070094 if (status != OK) {
95 ALOGE("JetPlayer::init(): Error initializing JET library; AudioTrack error %d", status);
96 mAudioTrack.clear();
97 mState = EAS_STATE_ERROR;
98 return EAS_FAILURE;
99 }
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800100
101 // create render and playback thread
102 {
103 Mutex::Autolock l(mMutex);
Steve Block3856b092011-10-20 11:56:00 +0100104 ALOGV("JetPlayer::init(): trying to start render thread");
Glenn Kastena23856c2011-06-23 16:43:24 -0700105 mThread = new JetPlayerThread(this);
106 mThread->run("jetRenderThread", ANDROID_PRIORITY_AUDIO);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800107 mCondition.wait(mMutex);
108 }
109 if (mTid > 0) {
110 // render thread started, we're ready
Steve Block3856b092011-10-20 11:56:00 +0100111 ALOGV("JetPlayer::init(): render thread(%d) successfully started.", mTid);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800112 mState = EAS_STATE_READY;
113 } else {
Steve Block29357bc2012-01-06 19:20:56 +0000114 ALOGE("JetPlayer::init(): failed to start render thread.");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800115 mState = EAS_STATE_ERROR;
116 return EAS_FAILURE;
117 }
118
119 return EAS_SUCCESS;
120}
121
122void JetPlayer::setEventCallback(jetevent_callback eventCallback)
123{
124 Mutex::Autolock l(mMutex);
125 mEventCallback = eventCallback;
126}
127
128//-------------------------------------------------------------------------------------------------
129int JetPlayer::release()
130{
Steve Block3856b092011-10-20 11:56:00 +0100131 ALOGV("JetPlayer::release()");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800132 Mutex::Autolock lock(mMutex);
133 mPaused = true;
134 mRender = false;
135 if (mEasData) {
136 JET_Pause(mEasData);
137 JET_CloseFile(mEasData);
138 JET_Shutdown(mEasData);
139 EAS_Shutdown(mEasData);
140 }
Marco Nelissen3d21ae32018-02-16 08:24:08 -0800141 delete mIoWrapper;
142 mIoWrapper = NULL;
Glenn Kasten2799d742013-05-30 14:33:29 -0700143 if (mAudioTrack != 0) {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800144 mAudioTrack->stop();
145 mAudioTrack->flush();
Glenn Kasten2799d742013-05-30 14:33:29 -0700146 mAudioTrack.clear();
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800147 }
148 if (mAudioBuffer) {
149 delete mAudioBuffer;
150 mAudioBuffer = NULL;
151 }
152 mEasData = NULL;
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700153
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800154 return EAS_SUCCESS;
155}
156
157
158//-------------------------------------------------------------------------------------------------
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800159int JetPlayer::render() {
160 EAS_RESULT result = EAS_FAILURE;
161 EAS_I32 count;
162 int temp;
163 bool audioStarted = false;
164
Steve Block3856b092011-10-20 11:56:00 +0100165 ALOGV("JetPlayer::render(): entering");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800166
167 // allocate render buffer
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700168 mAudioBuffer =
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800169 new EAS_PCM[pLibConfig->mixBufferSize * pLibConfig->numChannels * MIX_NUM_BUFFERS];
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800170
171 // signal main thread that we started
172 {
173 Mutex::Autolock l(mMutex);
Glenn Kasten0512ab52011-05-04 17:58:57 -0700174 mTid = gettid();
Steve Block3856b092011-10-20 11:56:00 +0100175 ALOGV("JetPlayer::render(): render thread(%d) signal", mTid);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800176 mCondition.signal();
177 }
178
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700179 while (1) {
180
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800181 mMutex.lock(); // [[[[[[[[ LOCK ---------------------------------------
182
The Android Open Source Project1179bc92009-03-18 17:39:46 -0700183 if (mEasData == NULL) {
184 mMutex.unlock();
Steve Block3856b092011-10-20 11:56:00 +0100185 ALOGV("JetPlayer::render(): NULL EAS data, exiting render.");
The Android Open Source Project1179bc92009-03-18 17:39:46 -0700186 goto threadExit;
187 }
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700188
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800189 // nothing to render, wait for client thread to wake us up
190 while (!mRender)
191 {
Steve Block3856b092011-10-20 11:56:00 +0100192 ALOGV("JetPlayer::render(): signal wait");
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700193 if (audioStarted) {
194 mAudioTrack->pause();
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800195 // we have to restart the playback once we start rendering again
196 audioStarted = false;
197 }
198 mCondition.wait(mMutex);
Steve Block3856b092011-10-20 11:56:00 +0100199 ALOGV("JetPlayer::render(): signal rx'd");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800200 }
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700201
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800202 // render midi data into the input buffer
203 int num_output = 0;
204 EAS_PCM* p = mAudioBuffer;
205 for (int i = 0; i < MIX_NUM_BUFFERS; i++) {
206 result = EAS_Render(mEasData, p, pLibConfig->mixBufferSize, &count);
207 if (result != EAS_SUCCESS) {
Steve Block29357bc2012-01-06 19:20:56 +0000208 ALOGE("JetPlayer::render(): EAS_Render returned error %ld", result);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800209 }
210 p += count * pLibConfig->numChannels;
211 num_output += count * pLibConfig->numChannels * sizeof(EAS_PCM);
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700212
213 // send events that were generated (if any) to the event callback
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800214 fireEventsFromJetQueue();
215 }
216
217 // update playback state
Steve Block3856b092011-10-20 11:56:00 +0100218 //ALOGV("JetPlayer::render(): updating state");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800219 JET_Status(mEasData, &mJetStatus);
220 fireUpdateOnStatusChange();
221 mPaused = mJetStatus.paused;
222
223 mMutex.unlock(); // UNLOCK ]]]]]]]] -----------------------------------
224
225 // check audio output track
226 if (mAudioTrack == NULL) {
Steve Block29357bc2012-01-06 19:20:56 +0000227 ALOGE("JetPlayer::render(): output AudioTrack was not created");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800228 goto threadExit;
229 }
230
231 // Write data to the audio hardware
Steve Block3856b092011-10-20 11:56:00 +0100232 //ALOGV("JetPlayer::render(): writing to audio output");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800233 if ((temp = mAudioTrack->write(mAudioBuffer, num_output)) < 0) {
Steve Block29357bc2012-01-06 19:20:56 +0000234 ALOGE("JetPlayer::render(): Error in writing:%d",temp);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800235 return temp;
236 }
237
238 // start audio output if necessary
239 if (!audioStarted) {
Steve Block3856b092011-10-20 11:56:00 +0100240 ALOGV("JetPlayer::render(): starting audio playback");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800241 mAudioTrack->start();
242 audioStarted = true;
243 }
244
245 }//while (1)
246
247threadExit:
Glenn Kasten9d1f02d2012-02-08 17:47:58 -0800248 if (mAudioTrack != NULL) {
The Android Open Source Project1179bc92009-03-18 17:39:46 -0700249 mAudioTrack->stop();
250 mAudioTrack->flush();
251 }
Glenn Kasten9d1f02d2012-02-08 17:47:58 -0800252 delete [] mAudioBuffer;
253 mAudioBuffer = NULL;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800254 mMutex.lock();
255 mTid = -1;
256 mCondition.signal();
257 mMutex.unlock();
258 return result;
259}
260
261
262//-------------------------------------------------------------------------------------------------
263// fire up an update if any of the status fields has changed
264// precondition: mMutex locked
265void JetPlayer::fireUpdateOnStatusChange()
266{
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700267 if ( (mJetStatus.currentUserID != mPreviousJetStatus.currentUserID)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800268 ||(mJetStatus.segmentRepeatCount != mPreviousJetStatus.segmentRepeatCount) ) {
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700269 if (mEventCallback) {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800270 mEventCallback(
271 JetPlayer::JET_USERID_UPDATE,
272 mJetStatus.currentUserID,
273 mJetStatus.segmentRepeatCount,
274 mJavaJetPlayerRef);
275 }
276 mPreviousJetStatus.currentUserID = mJetStatus.currentUserID;
277 mPreviousJetStatus.segmentRepeatCount = mJetStatus.segmentRepeatCount;
278 }
279
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700280 if (mJetStatus.numQueuedSegments != mPreviousJetStatus.numQueuedSegments) {
281 if (mEventCallback) {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800282 mEventCallback(
283 JetPlayer::JET_NUMQUEUEDSEGMENT_UPDATE,
284 mJetStatus.numQueuedSegments,
285 -1,
286 mJavaJetPlayerRef);
287 }
288 mPreviousJetStatus.numQueuedSegments = mJetStatus.numQueuedSegments;
289 }
290
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700291 if (mJetStatus.paused != mPreviousJetStatus.paused) {
292 if (mEventCallback) {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800293 mEventCallback(JetPlayer::JET_PAUSE_UPDATE,
294 mJetStatus.paused,
295 -1,
296 mJavaJetPlayerRef);
297 }
298 mPreviousJetStatus.paused = mJetStatus.paused;
299 }
300
301}
302
303
304//-------------------------------------------------------------------------------------------------
305// fire up all the JET events in the JET engine queue (until the queue is empty)
306// precondition: mMutex locked
307void JetPlayer::fireEventsFromJetQueue()
308{
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700309 if (!mEventCallback) {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800310 // no callback, just empty the event queue
311 while (JET_GetEvent(mEasData, NULL, NULL)) { }
312 return;
313 }
314
315 EAS_U32 rawEvent;
316 while (JET_GetEvent(mEasData, &rawEvent, NULL)) {
317 mEventCallback(
318 JetPlayer::JET_EVENT,
319 rawEvent,
320 -1,
321 mJavaJetPlayerRef);
322 }
323}
324
325
326//-------------------------------------------------------------------------------------------------
327int JetPlayer::loadFromFile(const char* path)
328{
Steve Block3856b092011-10-20 11:56:00 +0100329 ALOGV("JetPlayer::loadFromFile(): path=%s", path);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800330
331 Mutex::Autolock lock(mMutex);
332
Marco Nelissen3d21ae32018-02-16 08:24:08 -0800333 delete mIoWrapper;
Marco Nelissen08b9e2d2014-12-16 12:46:34 -0800334 mIoWrapper = new MidiIoWrapper(path);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800335
Marco Nelissen08b9e2d2014-12-16 12:46:34 -0800336 EAS_RESULT result = JET_OpenFile(mEasData, mIoWrapper->getLocator());
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700337 if (result != EAS_SUCCESS)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800338 mState = EAS_STATE_ERROR;
339 else
340 mState = EAS_STATE_OPEN;
341 return( result );
342}
343
344
345//-------------------------------------------------------------------------------------------------
346int JetPlayer::loadFromFD(const int fd, const long long offset, const long long length)
347{
Steve Block3856b092011-10-20 11:56:00 +0100348 ALOGV("JetPlayer::loadFromFD(): fd=%d offset=%lld length=%lld", fd, offset, length);
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700349
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800350 Mutex::Autolock lock(mMutex);
351
Marco Nelissen3d21ae32018-02-16 08:24:08 -0800352 delete mIoWrapper;
Marco Nelissen08b9e2d2014-12-16 12:46:34 -0800353 mIoWrapper = new MidiIoWrapper(fd, offset, length);
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700354
Marco Nelissen08b9e2d2014-12-16 12:46:34 -0800355 EAS_RESULT result = JET_OpenFile(mEasData, mIoWrapper->getLocator());
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700356 if (result != EAS_SUCCESS)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800357 mState = EAS_STATE_ERROR;
358 else
359 mState = EAS_STATE_OPEN;
360 return( result );
361}
362
363
364//-------------------------------------------------------------------------------------------------
365int JetPlayer::closeFile()
366{
367 Mutex::Autolock lock(mMutex);
368 return JET_CloseFile(mEasData);
369}
370
371
372//-------------------------------------------------------------------------------------------------
373int JetPlayer::play()
374{
Steve Block3856b092011-10-20 11:56:00 +0100375 ALOGV("JetPlayer::play(): entering");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800376 Mutex::Autolock lock(mMutex);
377
378 EAS_RESULT result = JET_Play(mEasData);
379
380 mPaused = false;
381 mRender = true;
382
383 JET_Status(mEasData, &mJetStatus);
384 this->dumpJetStatus(&mJetStatus);
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700385
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800386 fireUpdateOnStatusChange();
387
388 // wake up render thread
Steve Block3856b092011-10-20 11:56:00 +0100389 ALOGV("JetPlayer::play(): wakeup render thread");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800390 mCondition.signal();
391
392 return result;
393}
394
395//-------------------------------------------------------------------------------------------------
396int JetPlayer::pause()
397{
398 Mutex::Autolock lock(mMutex);
399 mPaused = true;
400 EAS_RESULT result = JET_Pause(mEasData);
401
402 mRender = false;
403
404 JET_Status(mEasData, &mJetStatus);
405 this->dumpJetStatus(&mJetStatus);
406 fireUpdateOnStatusChange();
407
408
409 return result;
410}
411
412
413//-------------------------------------------------------------------------------------------------
414int JetPlayer::queueSegment(int segmentNum, int libNum, int repeatCount, int transpose,
415 EAS_U32 muteFlags, EAS_U8 userID)
416{
Steve Block3856b092011-10-20 11:56:00 +0100417 ALOGV("JetPlayer::queueSegment segmentNum=%d, libNum=%d, repeatCount=%d, transpose=%d",
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800418 segmentNum, libNum, repeatCount, transpose);
419 Mutex::Autolock lock(mMutex);
Glenn Kastenb187de12014-12-30 08:18:15 -0800420 return JET_QueueSegment(mEasData, segmentNum, libNum, repeatCount, transpose, muteFlags,
421 userID);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800422}
423
424//-------------------------------------------------------------------------------------------------
425int JetPlayer::setMuteFlags(EAS_U32 muteFlags, bool sync)
426{
427 Mutex::Autolock lock(mMutex);
428 return JET_SetMuteFlags(mEasData, muteFlags, sync);
429}
430
431//-------------------------------------------------------------------------------------------------
432int JetPlayer::setMuteFlag(int trackNum, bool muteFlag, bool sync)
433{
434 Mutex::Autolock lock(mMutex);
435 return JET_SetMuteFlag(mEasData, trackNum, muteFlag, sync);
436}
437
438//-------------------------------------------------------------------------------------------------
439int JetPlayer::triggerClip(int clipId)
440{
Steve Block3856b092011-10-20 11:56:00 +0100441 ALOGV("JetPlayer::triggerClip clipId=%d", clipId);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800442 Mutex::Autolock lock(mMutex);
443 return JET_TriggerClip(mEasData, clipId);
444}
445
446//-------------------------------------------------------------------------------------------------
447int JetPlayer::clearQueue()
448{
Steve Block3856b092011-10-20 11:56:00 +0100449 ALOGV("JetPlayer::clearQueue");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800450 Mutex::Autolock lock(mMutex);
451 return JET_Clear_Queue(mEasData);
452}
453
454//-------------------------------------------------------------------------------------------------
455void JetPlayer::dump()
456{
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800457}
458
459void JetPlayer::dumpJetStatus(S_JET_STATUS* pJetStatus)
460{
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700461 if (pJetStatus!=NULL)
Glenn Kastenb187de12014-12-30 08:18:15 -0800462 ALOGV(">> current JET player status: userID=%d segmentRepeatCount=%d numQueuedSegments=%d "
463 "paused=%d",
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800464 pJetStatus->currentUserID, pJetStatus->segmentRepeatCount,
465 pJetStatus->numQueuedSegments, pJetStatus->paused);
466 else
Steve Block29357bc2012-01-06 19:20:56 +0000467 ALOGE(">> JET player status is NULL");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800468}
469
470
471} // end namespace android