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" 2097876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi#include <media/IMediaPlayerService.h> 212b06e20ae32388f6e1dfd088d9773c34e6b1cb45Jean-Michel Trivi#include "android_LocAVPlayer.h" 2297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 2397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 2497876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivinamespace android { 2597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 2697876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi//-------------------------------------------------------------------------------------------------- 27167a2af67dcc0d20e6e3e995a23a0567715e0ee1Glenn KastenLocAVPlayer::LocAVPlayer(const AudioPlayback_Parameters* params, bool hasVideo) : 2868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi GenericMediaPlayer(params, hasVideo) 2997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi{ 30e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("LocAVPlayer::LocAVPlayer()"); 3197876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 3297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi} 3397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 3497876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 3597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel TriviLocAVPlayer::~LocAVPlayer() { 36e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("LocAVPlayer::~LocAVPlayer()"); 3797876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 3897876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi} 3997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 4097876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 4197876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi//-------------------------------------------------- 4297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi// Event handlers 4397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivivoid LocAVPlayer::onPrepare() { 44e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("LocAVPlayer::onPrepare()"); 4585edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten sp<IMediaPlayerService> mediaPlayerService(getMediaPlayerService()); 4685edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten if (mediaPlayerService != NULL) { 4785edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten switch (mDataLocatorType) { 4885edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten case kDataLocatorUri: 493376429dfe306b9bfebf3a50941e2ccf44984495Glenn Kasten mPlayer = mediaPlayerService->create(mPlayerClient /*IMediaPlayerClient*/, 50e52e877354b1477d5cb34d24c70417820b013521Dave Burke mPlaybackParams.sessionId); 5185edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten if (mPlayer == NULL) { 5285edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten SL_LOGE("media player service failed to create player by URI"); 53e52e877354b1477d5cb34d24c70417820b013521Dave Burke } else if (mPlayer->setDataSource(mDataLocator.uriRef, NULL /*headers*/) != NO_ERROR) { 54e52e877354b1477d5cb34d24c70417820b013521Dave Burke SL_LOGE("setDataSource failed"); 55e52e877354b1477d5cb34d24c70417820b013521Dave Burke mPlayer.clear(); 5685edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten } 5785edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten break; 5885edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten case kDataLocatorFd: 593376429dfe306b9bfebf3a50941e2ccf44984495Glenn Kasten mPlayer = mediaPlayerService->create(mPlayerClient /*IMediaPlayerClient*/, 6085edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten mPlaybackParams.sessionId); 6185edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten if (mPlayer == NULL) { 6285edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten SL_LOGE("media player service failed to create player by FD"); 63e52e877354b1477d5cb34d24c70417820b013521Dave Burke } else if (mPlayer->setDataSource(mDataLocator.fdi.fd, mDataLocator.fdi.offset, 64e52e877354b1477d5cb34d24c70417820b013521Dave Burke mDataLocator.fdi.length) != NO_ERROR) { 65e52e877354b1477d5cb34d24c70417820b013521Dave Burke SL_LOGE("setDataSource failed"); 66e52e877354b1477d5cb34d24c70417820b013521Dave Burke mPlayer.clear(); 6785edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten } 68833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten // Binder dups the fd for use by mediaserver, so if we own the fd then OK to close now 69833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten if (mDataLocator.fdi.mCloseAfterUse) { 70833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten (void) ::close(mDataLocator.fdi.fd); 71833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten mDataLocator.fdi.fd = -1; 72833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten mDataLocator.fdi.mCloseAfterUse = false; 73833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten } 7485edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten break; 7585edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten case kDataLocatorNone: 7685edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten SL_LOGE("no data locator for MediaPlayer object"); 7785edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten break; 7885edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten default: 7985edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten SL_LOGE("unsupported data locator %d for MediaPlayer object", mDataLocatorType); 8085edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten break; 8185edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten } 8285edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten } 8385edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten if (mPlayer == NULL) { 8485edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten mStateFlags |= kFlagPreparedUnsuccessfully; 8597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi } 8697876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi // blocks until mPlayer is prepared 8768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi GenericMediaPlayer::onPrepare(); 88e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("LocAVPlayer::onPrepare() done"); 8997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi} 9097876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi 9197876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi} // namespace android 92