blob: e914b34daf815e5481d87f2f3cfbd36d5116d884 [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),
39 mEasJetFileLoc(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();
54
55}
56
57//-------------------------------------------------------------------------------------------------
58int JetPlayer::init()
59{
60 //Mutex::Autolock lock(&mMutex);
61
62 EAS_RESULT result;
63
64 // retrieve the EAS library settings
65 if (pLibConfig == NULL)
66 pLibConfig = EAS_Config();
67 if (pLibConfig == NULL) {
Steve Block29357bc2012-01-06 19:20:56 +000068 ALOGE("JetPlayer::init(): EAS library configuration could not be retrieved, aborting.");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080069 return EAS_FAILURE;
70 }
71
72 // init the EAS library
73 result = EAS_Init(&mEasData);
Glenn Kastene53b9ea2012-03-12 16:29:55 -070074 if (result != EAS_SUCCESS) {
Steve Block29357bc2012-01-06 19:20:56 +000075 ALOGE("JetPlayer::init(): Error initializing Sonivox EAS library, aborting.");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080076 mState = EAS_STATE_ERROR;
77 return result;
78 }
79 // init the JET library with the default app event controller range
80 result = JET_Init(mEasData, NULL, sizeof(S_JET_CONFIG));
Glenn Kastene53b9ea2012-03-12 16:29:55 -070081 if (result != EAS_SUCCESS) {
Steve Block29357bc2012-01-06 19:20:56 +000082 ALOGE("JetPlayer::init(): Error initializing JET library, aborting.");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080083 mState = EAS_STATE_ERROR;
84 return result;
85 }
86
87 // create the output AudioTrack
88 mAudioTrack = new AudioTrack();
Glenn Kasten17a736c2012-02-14 08:52:15 -080089 mAudioTrack->set(AUDIO_STREAM_MUSIC, //TODO parameterize this
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080090 pLibConfig->sampleRate,
Glenn Kastene1c39622012-01-04 09:36:37 -080091 AUDIO_FORMAT_PCM_16_BIT,
Glenn Kastenab334fd2012-03-14 12:56:06 -070092 audio_channel_out_mask_from_count(pLibConfig->numChannels),
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080093 mTrackBufferSize,
Eric Laurent0ca3cf92012-04-18 09:24:29 -070094 AUDIO_OUTPUT_FLAG_NONE);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080095
96 // create render and playback thread
97 {
98 Mutex::Autolock l(mMutex);
Steve Block3856b092011-10-20 11:56:00 +010099 ALOGV("JetPlayer::init(): trying to start render thread");
Glenn Kastena23856c2011-06-23 16:43:24 -0700100 mThread = new JetPlayerThread(this);
101 mThread->run("jetRenderThread", ANDROID_PRIORITY_AUDIO);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800102 mCondition.wait(mMutex);
103 }
104 if (mTid > 0) {
105 // render thread started, we're ready
Steve Block3856b092011-10-20 11:56:00 +0100106 ALOGV("JetPlayer::init(): render thread(%d) successfully started.", mTid);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800107 mState = EAS_STATE_READY;
108 } else {
Steve Block29357bc2012-01-06 19:20:56 +0000109 ALOGE("JetPlayer::init(): failed to start render thread.");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800110 mState = EAS_STATE_ERROR;
111 return EAS_FAILURE;
112 }
113
114 return EAS_SUCCESS;
115}
116
117void JetPlayer::setEventCallback(jetevent_callback eventCallback)
118{
119 Mutex::Autolock l(mMutex);
120 mEventCallback = eventCallback;
121}
122
123//-------------------------------------------------------------------------------------------------
124int JetPlayer::release()
125{
Steve Block3856b092011-10-20 11:56:00 +0100126 ALOGV("JetPlayer::release()");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800127 Mutex::Autolock lock(mMutex);
128 mPaused = true;
129 mRender = false;
130 if (mEasData) {
131 JET_Pause(mEasData);
132 JET_CloseFile(mEasData);
133 JET_Shutdown(mEasData);
134 EAS_Shutdown(mEasData);
135 }
136 if (mEasJetFileLoc) {
137 free(mEasJetFileLoc);
138 mEasJetFileLoc = NULL;
139 }
Glenn Kasten2799d742013-05-30 14:33:29 -0700140 if (mAudioTrack != 0) {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800141 mAudioTrack->stop();
142 mAudioTrack->flush();
Glenn Kasten2799d742013-05-30 14:33:29 -0700143 mAudioTrack.clear();
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800144 }
145 if (mAudioBuffer) {
146 delete mAudioBuffer;
147 mAudioBuffer = NULL;
148 }
149 mEasData = NULL;
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700150
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800151 return EAS_SUCCESS;
152}
153
154
155//-------------------------------------------------------------------------------------------------
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800156int JetPlayer::render() {
157 EAS_RESULT result = EAS_FAILURE;
158 EAS_I32 count;
159 int temp;
160 bool audioStarted = false;
161
Steve Block3856b092011-10-20 11:56:00 +0100162 ALOGV("JetPlayer::render(): entering");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800163
164 // allocate render buffer
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700165 mAudioBuffer =
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800166 new EAS_PCM[pLibConfig->mixBufferSize * pLibConfig->numChannels * MIX_NUM_BUFFERS];
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800167
168 // signal main thread that we started
169 {
170 Mutex::Autolock l(mMutex);
Glenn Kasten0512ab52011-05-04 17:58:57 -0700171 mTid = gettid();
Steve Block3856b092011-10-20 11:56:00 +0100172 ALOGV("JetPlayer::render(): render thread(%d) signal", mTid);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800173 mCondition.signal();
174 }
175
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700176 while (1) {
177
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800178 mMutex.lock(); // [[[[[[[[ LOCK ---------------------------------------
179
The Android Open Source Project1179bc92009-03-18 17:39:46 -0700180 if (mEasData == NULL) {
181 mMutex.unlock();
Steve Block3856b092011-10-20 11:56:00 +0100182 ALOGV("JetPlayer::render(): NULL EAS data, exiting render.");
The Android Open Source Project1179bc92009-03-18 17:39:46 -0700183 goto threadExit;
184 }
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700185
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800186 // nothing to render, wait for client thread to wake us up
187 while (!mRender)
188 {
Steve Block3856b092011-10-20 11:56:00 +0100189 ALOGV("JetPlayer::render(): signal wait");
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700190 if (audioStarted) {
191 mAudioTrack->pause();
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800192 // we have to restart the playback once we start rendering again
193 audioStarted = false;
194 }
195 mCondition.wait(mMutex);
Steve Block3856b092011-10-20 11:56:00 +0100196 ALOGV("JetPlayer::render(): signal rx'd");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800197 }
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700198
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800199 // render midi data into the input buffer
200 int num_output = 0;
201 EAS_PCM* p = mAudioBuffer;
202 for (int i = 0; i < MIX_NUM_BUFFERS; i++) {
203 result = EAS_Render(mEasData, p, pLibConfig->mixBufferSize, &count);
204 if (result != EAS_SUCCESS) {
Steve Block29357bc2012-01-06 19:20:56 +0000205 ALOGE("JetPlayer::render(): EAS_Render returned error %ld", result);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800206 }
207 p += count * pLibConfig->numChannels;
208 num_output += count * pLibConfig->numChannels * sizeof(EAS_PCM);
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700209
210 // send events that were generated (if any) to the event callback
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800211 fireEventsFromJetQueue();
212 }
213
214 // update playback state
Steve Block3856b092011-10-20 11:56:00 +0100215 //ALOGV("JetPlayer::render(): updating state");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800216 JET_Status(mEasData, &mJetStatus);
217 fireUpdateOnStatusChange();
218 mPaused = mJetStatus.paused;
219
220 mMutex.unlock(); // UNLOCK ]]]]]]]] -----------------------------------
221
222 // check audio output track
223 if (mAudioTrack == NULL) {
Steve Block29357bc2012-01-06 19:20:56 +0000224 ALOGE("JetPlayer::render(): output AudioTrack was not created");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800225 goto threadExit;
226 }
227
228 // Write data to the audio hardware
Steve Block3856b092011-10-20 11:56:00 +0100229 //ALOGV("JetPlayer::render(): writing to audio output");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800230 if ((temp = mAudioTrack->write(mAudioBuffer, num_output)) < 0) {
Steve Block29357bc2012-01-06 19:20:56 +0000231 ALOGE("JetPlayer::render(): Error in writing:%d",temp);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800232 return temp;
233 }
234
235 // start audio output if necessary
236 if (!audioStarted) {
Steve Block3856b092011-10-20 11:56:00 +0100237 ALOGV("JetPlayer::render(): starting audio playback");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800238 mAudioTrack->start();
239 audioStarted = true;
240 }
241
242 }//while (1)
243
244threadExit:
Glenn Kasten9d1f02d2012-02-08 17:47:58 -0800245 if (mAudioTrack != NULL) {
The Android Open Source Project1179bc92009-03-18 17:39:46 -0700246 mAudioTrack->stop();
247 mAudioTrack->flush();
248 }
Glenn Kasten9d1f02d2012-02-08 17:47:58 -0800249 delete [] mAudioBuffer;
250 mAudioBuffer = NULL;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800251 mMutex.lock();
252 mTid = -1;
253 mCondition.signal();
254 mMutex.unlock();
255 return result;
256}
257
258
259//-------------------------------------------------------------------------------------------------
260// fire up an update if any of the status fields has changed
261// precondition: mMutex locked
262void JetPlayer::fireUpdateOnStatusChange()
263{
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700264 if ( (mJetStatus.currentUserID != mPreviousJetStatus.currentUserID)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800265 ||(mJetStatus.segmentRepeatCount != mPreviousJetStatus.segmentRepeatCount) ) {
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700266 if (mEventCallback) {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800267 mEventCallback(
268 JetPlayer::JET_USERID_UPDATE,
269 mJetStatus.currentUserID,
270 mJetStatus.segmentRepeatCount,
271 mJavaJetPlayerRef);
272 }
273 mPreviousJetStatus.currentUserID = mJetStatus.currentUserID;
274 mPreviousJetStatus.segmentRepeatCount = mJetStatus.segmentRepeatCount;
275 }
276
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700277 if (mJetStatus.numQueuedSegments != mPreviousJetStatus.numQueuedSegments) {
278 if (mEventCallback) {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800279 mEventCallback(
280 JetPlayer::JET_NUMQUEUEDSEGMENT_UPDATE,
281 mJetStatus.numQueuedSegments,
282 -1,
283 mJavaJetPlayerRef);
284 }
285 mPreviousJetStatus.numQueuedSegments = mJetStatus.numQueuedSegments;
286 }
287
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700288 if (mJetStatus.paused != mPreviousJetStatus.paused) {
289 if (mEventCallback) {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800290 mEventCallback(JetPlayer::JET_PAUSE_UPDATE,
291 mJetStatus.paused,
292 -1,
293 mJavaJetPlayerRef);
294 }
295 mPreviousJetStatus.paused = mJetStatus.paused;
296 }
297
298}
299
300
301//-------------------------------------------------------------------------------------------------
302// fire up all the JET events in the JET engine queue (until the queue is empty)
303// precondition: mMutex locked
304void JetPlayer::fireEventsFromJetQueue()
305{
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700306 if (!mEventCallback) {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800307 // no callback, just empty the event queue
308 while (JET_GetEvent(mEasData, NULL, NULL)) { }
309 return;
310 }
311
312 EAS_U32 rawEvent;
313 while (JET_GetEvent(mEasData, &rawEvent, NULL)) {
314 mEventCallback(
315 JetPlayer::JET_EVENT,
316 rawEvent,
317 -1,
318 mJavaJetPlayerRef);
319 }
320}
321
322
323//-------------------------------------------------------------------------------------------------
324int JetPlayer::loadFromFile(const char* path)
325{
Steve Block3856b092011-10-20 11:56:00 +0100326 ALOGV("JetPlayer::loadFromFile(): path=%s", path);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800327
328 Mutex::Autolock lock(mMutex);
329
330 mEasJetFileLoc = (EAS_FILE_LOCATOR) malloc(sizeof(EAS_FILE));
Glenn Kasten0049acf2012-01-10 08:41:33 -0800331 strncpy(mJetFilePath, path, sizeof(mJetFilePath));
332 mJetFilePath[sizeof(mJetFilePath) - 1] = '\0';
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800333 mEasJetFileLoc->path = mJetFilePath;
334
335 mEasJetFileLoc->fd = 0;
336 mEasJetFileLoc->length = 0;
337 mEasJetFileLoc->offset = 0;
338
339 EAS_RESULT result = JET_OpenFile(mEasData, mEasJetFileLoc);
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700340 if (result != EAS_SUCCESS)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800341 mState = EAS_STATE_ERROR;
342 else
343 mState = EAS_STATE_OPEN;
344 return( result );
345}
346
347
348//-------------------------------------------------------------------------------------------------
349int JetPlayer::loadFromFD(const int fd, const long long offset, const long long length)
350{
Steve Block3856b092011-10-20 11:56:00 +0100351 ALOGV("JetPlayer::loadFromFD(): fd=%d offset=%lld length=%lld", fd, offset, length);
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700352
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800353 Mutex::Autolock lock(mMutex);
354
355 mEasJetFileLoc = (EAS_FILE_LOCATOR) malloc(sizeof(EAS_FILE));
356 mEasJetFileLoc->fd = fd;
357 mEasJetFileLoc->offset = offset;
358 mEasJetFileLoc->length = length;
359 mEasJetFileLoc->path = NULL;
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700360
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800361 EAS_RESULT result = JET_OpenFile(mEasData, mEasJetFileLoc);
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700362 if (result != EAS_SUCCESS)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800363 mState = EAS_STATE_ERROR;
364 else
365 mState = EAS_STATE_OPEN;
366 return( result );
367}
368
369
370//-------------------------------------------------------------------------------------------------
371int JetPlayer::closeFile()
372{
373 Mutex::Autolock lock(mMutex);
374 return JET_CloseFile(mEasData);
375}
376
377
378//-------------------------------------------------------------------------------------------------
379int JetPlayer::play()
380{
Steve Block3856b092011-10-20 11:56:00 +0100381 ALOGV("JetPlayer::play(): entering");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800382 Mutex::Autolock lock(mMutex);
383
384 EAS_RESULT result = JET_Play(mEasData);
385
386 mPaused = false;
387 mRender = true;
388
389 JET_Status(mEasData, &mJetStatus);
390 this->dumpJetStatus(&mJetStatus);
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700391
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800392 fireUpdateOnStatusChange();
393
394 // wake up render thread
Steve Block3856b092011-10-20 11:56:00 +0100395 ALOGV("JetPlayer::play(): wakeup render thread");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800396 mCondition.signal();
397
398 return result;
399}
400
401//-------------------------------------------------------------------------------------------------
402int JetPlayer::pause()
403{
404 Mutex::Autolock lock(mMutex);
405 mPaused = true;
406 EAS_RESULT result = JET_Pause(mEasData);
407
408 mRender = false;
409
410 JET_Status(mEasData, &mJetStatus);
411 this->dumpJetStatus(&mJetStatus);
412 fireUpdateOnStatusChange();
413
414
415 return result;
416}
417
418
419//-------------------------------------------------------------------------------------------------
420int JetPlayer::queueSegment(int segmentNum, int libNum, int repeatCount, int transpose,
421 EAS_U32 muteFlags, EAS_U8 userID)
422{
Steve Block3856b092011-10-20 11:56:00 +0100423 ALOGV("JetPlayer::queueSegment segmentNum=%d, libNum=%d, repeatCount=%d, transpose=%d",
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800424 segmentNum, libNum, repeatCount, transpose);
425 Mutex::Autolock lock(mMutex);
426 return JET_QueueSegment(mEasData, segmentNum, libNum, repeatCount, transpose, muteFlags, userID);
427}
428
429//-------------------------------------------------------------------------------------------------
430int JetPlayer::setMuteFlags(EAS_U32 muteFlags, bool sync)
431{
432 Mutex::Autolock lock(mMutex);
433 return JET_SetMuteFlags(mEasData, muteFlags, sync);
434}
435
436//-------------------------------------------------------------------------------------------------
437int JetPlayer::setMuteFlag(int trackNum, bool muteFlag, bool sync)
438{
439 Mutex::Autolock lock(mMutex);
440 return JET_SetMuteFlag(mEasData, trackNum, muteFlag, sync);
441}
442
443//-------------------------------------------------------------------------------------------------
444int JetPlayer::triggerClip(int clipId)
445{
Steve Block3856b092011-10-20 11:56:00 +0100446 ALOGV("JetPlayer::triggerClip clipId=%d", clipId);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800447 Mutex::Autolock lock(mMutex);
448 return JET_TriggerClip(mEasData, clipId);
449}
450
451//-------------------------------------------------------------------------------------------------
452int JetPlayer::clearQueue()
453{
Steve Block3856b092011-10-20 11:56:00 +0100454 ALOGV("JetPlayer::clearQueue");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800455 Mutex::Autolock lock(mMutex);
456 return JET_Clear_Queue(mEasData);
457}
458
459//-------------------------------------------------------------------------------------------------
460void JetPlayer::dump()
461{
Steve Block29357bc2012-01-06 19:20:56 +0000462 ALOGE("JetPlayer dump: JET file=%s", mEasJetFileLoc->path);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800463}
464
465void JetPlayer::dumpJetStatus(S_JET_STATUS* pJetStatus)
466{
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700467 if (pJetStatus!=NULL)
Steve Block3856b092011-10-20 11:56:00 +0100468 ALOGV(">> current JET player status: userID=%d segmentRepeatCount=%d numQueuedSegments=%d paused=%d",
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800469 pJetStatus->currentUserID, pJetStatus->segmentRepeatCount,
470 pJetStatus->numQueuedSegments, pJetStatus->paused);
471 else
Steve Block29357bc2012-01-06 19:20:56 +0000472 ALOGE(">> JET player status is NULL");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800473}
474
475
476} // end namespace android