197876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi/* 297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi * Copyright (C) 2011 The Android Open Source Project 397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi * 497876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); 597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi * you may not use this file except in compliance with the License. 697876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi * You may obtain a copy of the License at 797876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi * 897876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi * 1097876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 1197876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, 1297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi * See the License for the specific language governing permissions and 1497876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi * limitations under the License. 1597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi */ 1697876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 1797876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi//#define USE_LOG SLAndroidLogLevel_Verbose 1897876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 1997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi#include "sles_allinclusive.h" 20fb8035480852914d326eb4c2074060df32382926Andreas Huber 21fb8035480852914d326eb4c2074060df32382926Andreas Huber#include <media/IMediaHTTPService.h> 2297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi#include <media/IMediaPlayerService.h> 23fb8035480852914d326eb4c2074060df32382926Andreas Huber 242b06e20ae32388f6e1dfd088d9773c34e6b1cb45Jean-Michel Trivi#include "android_LocAVPlayer.h" 2597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 26fb8035480852914d326eb4c2074060df32382926Andreas Huber#include "HTTPHelper.h" 2797876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 2897876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivinamespace android { 2997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 3097876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi//-------------------------------------------------------------------------------------------------- 31167a2af67dcc0d20e6e3e995a23a0567715e0ee1Glenn KastenLocAVPlayer::LocAVPlayer(const AudioPlayback_Parameters* params, bool hasVideo) : 3268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi GenericMediaPlayer(params, hasVideo) 3397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi{ 34e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("LocAVPlayer::LocAVPlayer()"); 3597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 3697876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi} 3797876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 3897876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 3997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel TriviLocAVPlayer::~LocAVPlayer() { 40e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("LocAVPlayer::~LocAVPlayer()"); 4197876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 4297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi} 4397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 4497876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 4597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi//-------------------------------------------------- 4697876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi// Event handlers 4797876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivivoid LocAVPlayer::onPrepare() { 48e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("LocAVPlayer::onPrepare()"); 4985edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten sp<IMediaPlayerService> mediaPlayerService(getMediaPlayerService()); 5085edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten if (mediaPlayerService != NULL) { 5185edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten switch (mDataLocatorType) { 5285edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten case kDataLocatorUri: 533376429dfe306b9bfebf3a50941e2ccf44984495Glenn Kasten mPlayer = mediaPlayerService->create(mPlayerClient /*IMediaPlayerClient*/, 54e52e877354b1477d5cb34d24c70417820b013521Dave Burke mPlaybackParams.sessionId); 5585edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten if (mPlayer == NULL) { 5685edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten SL_LOGE("media player service failed to create player by URI"); 57fb8035480852914d326eb4c2074060df32382926Andreas Huber } else if (mPlayer->setDataSource( 58fb8035480852914d326eb4c2074060df32382926Andreas Huber CreateHTTPServiceInCurrentJavaContext(), 59fb8035480852914d326eb4c2074060df32382926Andreas Huber mDataLocator.uriRef, 60fb8035480852914d326eb4c2074060df32382926Andreas Huber NULL /*headers*/) != NO_ERROR) { 61e52e877354b1477d5cb34d24c70417820b013521Dave Burke SL_LOGE("setDataSource failed"); 62e52e877354b1477d5cb34d24c70417820b013521Dave Burke mPlayer.clear(); 6385edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten } 6485edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten break; 6585edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten case kDataLocatorFd: 663376429dfe306b9bfebf3a50941e2ccf44984495Glenn Kasten mPlayer = mediaPlayerService->create(mPlayerClient /*IMediaPlayerClient*/, 6785edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten mPlaybackParams.sessionId); 6885edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten if (mPlayer == NULL) { 6985edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten SL_LOGE("media player service failed to create player by FD"); 70e52e877354b1477d5cb34d24c70417820b013521Dave Burke } else if (mPlayer->setDataSource(mDataLocator.fdi.fd, mDataLocator.fdi.offset, 71e52e877354b1477d5cb34d24c70417820b013521Dave Burke mDataLocator.fdi.length) != NO_ERROR) { 72e52e877354b1477d5cb34d24c70417820b013521Dave Burke SL_LOGE("setDataSource failed"); 73e52e877354b1477d5cb34d24c70417820b013521Dave Burke mPlayer.clear(); 7485edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten } 75833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten // Binder dups the fd for use by mediaserver, so if we own the fd then OK to close now 76833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten if (mDataLocator.fdi.mCloseAfterUse) { 77833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten (void) ::close(mDataLocator.fdi.fd); 78833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten mDataLocator.fdi.fd = -1; 79833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten mDataLocator.fdi.mCloseAfterUse = false; 80833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten } 8185edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten break; 8285edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten case kDataLocatorNone: 8385edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten SL_LOGE("no data locator for MediaPlayer object"); 8485edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten break; 8585edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten default: 8685edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten SL_LOGE("unsupported data locator %d for MediaPlayer object", mDataLocatorType); 8785edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten break; 8885edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten } 8985edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten } 9085edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten if (mPlayer == NULL) { 9185edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten mStateFlags |= kFlagPreparedUnsuccessfully; 9297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi } 9397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi // blocks until mPlayer is prepared 9468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi GenericMediaPlayer::onPrepare(); 95e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("LocAVPlayer::onPrepare() done"); 9697876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi} 9797876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 9897876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi} // namespace android 99