PageRenderTime 45ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/frameworks/av/media/libmedia/mediaplayer.cpp

https://gitlab.com/brian0218/rk3066_r-box_android4.2.2_sdk
C++ | 810 lines | 682 code | 85 blank | 43 comment | 164 complexity | 6b16fd337b9e4249065a7197ef2695e1 MD5 | raw file
  1. /*
  2. **
  3. ** Copyright 2006, The Android Open Source Project
  4. **
  5. ** Licensed under the Apache License, Version 2.0 (the "License");
  6. ** you may not use this file except in compliance with the License.
  7. ** You may obtain a copy of the License at
  8. **
  9. ** http://www.apache.org/licenses/LICENSE-2.0
  10. **
  11. ** Unless required by applicable law or agreed to in writing, software
  12. ** distributed under the License is distributed on an "AS IS" BASIS,
  13. ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. ** See the License for the specific language governing permissions and
  15. ** limitations under the License.
  16. */
  17. //#define LOG_NDEBUG 0
  18. #define LOG_TAG "MediaPlayer"
  19. #include <utils/Log.h>
  20. #include <sys/types.h>
  21. #include <sys/stat.h>
  22. #include <unistd.h>
  23. #include <fcntl.h>
  24. #include <binder/IServiceManager.h>
  25. #include <binder/IPCThreadState.h>
  26. #include <gui/SurfaceTextureClient.h>
  27. #include <media/mediaplayer.h>
  28. #include <media/AudioSystem.h>
  29. #include <binder/MemoryBase.h>
  30. #include <utils/KeyedVector.h>
  31. #include <utils/String8.h>
  32. #include <system/audio.h>
  33. #include <system/window.h>
  34. namespace android {
  35. MediaPlayer::MediaPlayer()
  36. {
  37. ALOGV("constructor");
  38. mListener = NULL;
  39. mCookie = NULL;
  40. mStreamType = AUDIO_STREAM_MUSIC;
  41. mCurrentPosition = -1;
  42. mSeekPosition = -1;
  43. mCurrentState = MEDIA_PLAYER_IDLE;
  44. mPrepareSync = false;
  45. mPrepareStatus = NO_ERROR;
  46. mLoop = false;
  47. mLeftVolume = mRightVolume = 1.0;
  48. mVideoWidth = mVideoHeight = 0;
  49. mLockThreadId = 0;
  50. mAudioSessionId = AudioSystem::newAudioSessionId();
  51. AudioSystem::acquireAudioSessionId(mAudioSessionId);
  52. mSendLevel = 0;
  53. mRetransmitEndpointValid = false;
  54. }
  55. MediaPlayer::~MediaPlayer()
  56. {
  57. ALOGV("destructor");
  58. AudioSystem::releaseAudioSessionId(mAudioSessionId);
  59. disconnect();
  60. IPCThreadState::self()->flushCommands();
  61. }
  62. void MediaPlayer::disconnect()
  63. {
  64. ALOGV("disconnect");
  65. sp<IMediaPlayer> p;
  66. {
  67. Mutex::Autolock _l(mLock);
  68. p = mPlayer;
  69. mPlayer.clear();
  70. }
  71. if (p != 0) {
  72. p->disconnect();
  73. }
  74. }
  75. // always call with lock held
  76. void MediaPlayer::clear_l()
  77. {
  78. mCurrentPosition = -1;
  79. mSeekPosition = -1;
  80. mVideoWidth = mVideoHeight = 0;
  81. mRetransmitEndpointValid = false;
  82. }
  83. status_t MediaPlayer::setListener(const sp<MediaPlayerListener>& listener)
  84. {
  85. ALOGV("setListener");
  86. Mutex::Autolock _l(mLock);
  87. mListener = listener;
  88. return NO_ERROR;
  89. }
  90. status_t MediaPlayer::attachNewPlayer(const sp<IMediaPlayer>& player)
  91. {
  92. status_t err = UNKNOWN_ERROR;
  93. sp<IMediaPlayer> p;
  94. { // scope for the lock
  95. Mutex::Autolock _l(mLock);
  96. if ( !( (mCurrentState & MEDIA_PLAYER_IDLE) ||
  97. (mCurrentState == MEDIA_PLAYER_STATE_ERROR ) ) ) {
  98. ALOGE("attachNewPlayer called in state %d", mCurrentState);
  99. return INVALID_OPERATION;
  100. }
  101. clear_l();
  102. p = mPlayer;
  103. mPlayer = player;
  104. if (player != 0) {
  105. mCurrentState = MEDIA_PLAYER_INITIALIZED;
  106. err = NO_ERROR;
  107. } else {
  108. ALOGE("Unable to to create media player");
  109. }
  110. }
  111. if (p != 0) {
  112. p->disconnect();
  113. }
  114. return err;
  115. }
  116. status_t MediaPlayer::setDataSource(
  117. const char *url, const KeyedVector<String8, String8> *headers)
  118. {
  119. ALOGV("setDataSource(%s)", url);
  120. status_t err = BAD_VALUE;
  121. if (url != NULL) {
  122. const sp<IMediaPlayerService>& service(getMediaPlayerService());
  123. if (service != 0) {
  124. sp<IMediaPlayer> player(service->create(getpid(), this, mAudioSessionId));
  125. if ((NO_ERROR != doSetRetransmitEndpoint(player)) ||
  126. (NO_ERROR != player->setDataSource(url, headers))) {
  127. player.clear();
  128. }
  129. err = attachNewPlayer(player);
  130. }
  131. }
  132. return err;
  133. }
  134. status_t MediaPlayer::setDataSource(int fd, int64_t offset, int64_t length)
  135. {
  136. ALOGV("setDataSource(%d, %lld, %lld)", fd, offset, length);
  137. status_t err = UNKNOWN_ERROR;
  138. const sp<IMediaPlayerService>& service(getMediaPlayerService());
  139. if (service != 0) {
  140. sp<IMediaPlayer> player(service->create(getpid(), this, mAudioSessionId));
  141. if ((NO_ERROR != doSetRetransmitEndpoint(player)) ||
  142. (NO_ERROR != player->setDataSource(fd, offset, length))) {
  143. player.clear();
  144. }
  145. err = attachNewPlayer(player);
  146. }
  147. return err;
  148. }
  149. status_t MediaPlayer::setDataSource(const sp<IStreamSource> &source)
  150. {
  151. ALOGV("setDataSource");
  152. status_t err = UNKNOWN_ERROR;
  153. const sp<IMediaPlayerService>& service(getMediaPlayerService());
  154. if (service != 0) {
  155. sp<IMediaPlayer> player(service->create(getpid(), this, mAudioSessionId));
  156. if ((NO_ERROR != doSetRetransmitEndpoint(player)) ||
  157. (NO_ERROR != player->setDataSource(source))) {
  158. player.clear();
  159. }
  160. err = attachNewPlayer(player);
  161. }
  162. return err;
  163. }
  164. status_t MediaPlayer::invoke(const Parcel& request, Parcel *reply)
  165. {
  166. Mutex::Autolock _l(mLock);
  167. const bool hasBeenInitialized =
  168. (mCurrentState != MEDIA_PLAYER_STATE_ERROR) &&
  169. ((mCurrentState & MEDIA_PLAYER_IDLE) != MEDIA_PLAYER_IDLE);
  170. if ((mPlayer != NULL) && hasBeenInitialized) {
  171. ALOGV("invoke %d", request.dataSize());
  172. return mPlayer->invoke(request, reply);
  173. }
  174. ALOGE("invoke failed: wrong state %X", mCurrentState);
  175. return INVALID_OPERATION;
  176. }
  177. status_t MediaPlayer::setMetadataFilter(const Parcel& filter)
  178. {
  179. ALOGD("setMetadataFilter");
  180. Mutex::Autolock lock(mLock);
  181. if (mPlayer == NULL) {
  182. return NO_INIT;
  183. }
  184. return mPlayer->setMetadataFilter(filter);
  185. }
  186. status_t MediaPlayer::getMetadata(bool update_only, bool apply_filter, Parcel *metadata)
  187. {
  188. ALOGD("getMetadata");
  189. Mutex::Autolock lock(mLock);
  190. if (mPlayer == NULL) {
  191. return NO_INIT;
  192. }
  193. return mPlayer->getMetadata(update_only, apply_filter, metadata);
  194. }
  195. status_t MediaPlayer::setVideoSurfaceTexture(
  196. const sp<ISurfaceTexture>& surfaceTexture)
  197. {
  198. ALOGV("setVideoSurfaceTexture");
  199. Mutex::Autolock _l(mLock);
  200. if (mPlayer == 0) return NO_INIT;
  201. return mPlayer->setVideoSurfaceTexture(surfaceTexture);
  202. }
  203. // must call with lock held
  204. status_t MediaPlayer::prepareAsync_l()
  205. {
  206. if ( (mPlayer != 0) && ( mCurrentState & ( MEDIA_PLAYER_INITIALIZED | MEDIA_PLAYER_STOPPED) ) ) {
  207. mPlayer->setAudioStreamType(mStreamType);
  208. mCurrentState = MEDIA_PLAYER_PREPARING;
  209. return mPlayer->prepareAsync();
  210. }
  211. ALOGE("prepareAsync called in state %d", mCurrentState);
  212. return INVALID_OPERATION;
  213. }
  214. // TODO: In case of error, prepareAsync provides the caller with 2 error codes,
  215. // one defined in the Android framework and one provided by the implementation
  216. // that generated the error. The sync version of prepare returns only 1 error
  217. // code.
  218. status_t MediaPlayer::prepare()
  219. {
  220. ALOGV("prepare");
  221. Mutex::Autolock _l(mLock);
  222. mLockThreadId = getThreadId();
  223. if (mPrepareSync) {
  224. mLockThreadId = 0;
  225. return -EALREADY;
  226. }
  227. mPrepareSync = true;
  228. status_t ret = prepareAsync_l();
  229. if (ret != NO_ERROR) {
  230. mLockThreadId = 0;
  231. return ret;
  232. }
  233. if (mPrepareSync) {
  234. mSignal.wait(mLock); // wait for prepare done
  235. mPrepareSync = false;
  236. }
  237. ALOGV("prepare complete - status=%d", mPrepareStatus);
  238. mLockThreadId = 0;
  239. return mPrepareStatus;
  240. }
  241. status_t MediaPlayer::prepareAsync()
  242. {
  243. ALOGV("prepareAsync");
  244. Mutex::Autolock _l(mLock);
  245. return prepareAsync_l();
  246. }
  247. status_t MediaPlayer::start()
  248. {
  249. ALOGV("start");
  250. Mutex::Autolock _l(mLock);
  251. if (mCurrentState & MEDIA_PLAYER_STARTED)
  252. return NO_ERROR;
  253. if ( (mPlayer != 0) && ( mCurrentState & ( MEDIA_PLAYER_PREPARED |
  254. MEDIA_PLAYER_PLAYBACK_COMPLETE | MEDIA_PLAYER_PAUSED ) ) ) {
  255. mPlayer->setLooping(mLoop);
  256. mPlayer->setVolume(mLeftVolume, mRightVolume);
  257. mPlayer->setAuxEffectSendLevel(mSendLevel);
  258. mCurrentState = MEDIA_PLAYER_STARTED;
  259. status_t ret = mPlayer->start();
  260. if (ret != NO_ERROR) {
  261. mCurrentState = MEDIA_PLAYER_STATE_ERROR;
  262. } else {
  263. if (mCurrentState == MEDIA_PLAYER_PLAYBACK_COMPLETE) {
  264. ALOGV("playback completed immediately following start()");
  265. }
  266. }
  267. return ret;
  268. }
  269. ALOGE("start called in state %d", mCurrentState);
  270. return INVALID_OPERATION;
  271. }
  272. status_t MediaPlayer::stop()
  273. {
  274. ALOGV("stop");
  275. Mutex::Autolock _l(mLock);
  276. if (mCurrentState & MEDIA_PLAYER_STOPPED) return NO_ERROR;
  277. if ( (mPlayer != 0) && ( mCurrentState & ( MEDIA_PLAYER_STARTED | MEDIA_PLAYER_PREPARED |
  278. MEDIA_PLAYER_PAUSED | MEDIA_PLAYER_PLAYBACK_COMPLETE ) ) ) {
  279. status_t ret = mPlayer->stop();
  280. if (ret != NO_ERROR) {
  281. mCurrentState = MEDIA_PLAYER_STATE_ERROR;
  282. } else {
  283. mCurrentState = MEDIA_PLAYER_STOPPED;
  284. }
  285. return ret;
  286. }
  287. ALOGE("stop called in state %d", mCurrentState);
  288. return INVALID_OPERATION;
  289. }
  290. status_t MediaPlayer::pause()
  291. {
  292. ALOGV("pause");
  293. Mutex::Autolock _l(mLock);
  294. if (mCurrentState & (MEDIA_PLAYER_PAUSED|MEDIA_PLAYER_PLAYBACK_COMPLETE))
  295. return NO_ERROR;
  296. if ((mPlayer != 0) && (mCurrentState & MEDIA_PLAYER_STARTED)) {
  297. status_t ret = mPlayer->pause();
  298. if (ret != NO_ERROR) {
  299. mCurrentState = MEDIA_PLAYER_STATE_ERROR;
  300. } else {
  301. mCurrentState = MEDIA_PLAYER_PAUSED;
  302. }
  303. return ret;
  304. }
  305. ALOGE("pause called in state %d", mCurrentState);
  306. return INVALID_OPERATION;
  307. }
  308. bool MediaPlayer::isPlaying()
  309. {
  310. Mutex::Autolock _l(mLock);
  311. if (mPlayer != 0) {
  312. bool temp = false;
  313. mPlayer->isPlaying(&temp);
  314. ALOGV("isPlaying: %d", temp);
  315. if ((mCurrentState & MEDIA_PLAYER_STARTED) && ! temp) {
  316. ALOGE("internal/external state mismatch corrected");
  317. mCurrentState = MEDIA_PLAYER_PAUSED;
  318. }
  319. return temp;
  320. }
  321. ALOGV("isPlaying: no active player");
  322. return false;
  323. }
  324. status_t MediaPlayer::getVideoWidth(int *w)
  325. {
  326. ALOGV("getVideoWidth");
  327. Mutex::Autolock _l(mLock);
  328. if (mPlayer == 0) return INVALID_OPERATION;
  329. *w = mVideoWidth;
  330. return NO_ERROR;
  331. }
  332. status_t MediaPlayer::getVideoHeight(int *h)
  333. {
  334. ALOGV("getVideoHeight");
  335. Mutex::Autolock _l(mLock);
  336. if (mPlayer == 0) return INVALID_OPERATION;
  337. *h = mVideoHeight;
  338. return NO_ERROR;
  339. }
  340. status_t MediaPlayer::getCurrentPosition(int *msec)
  341. {
  342. ALOGV("getCurrentPosition");
  343. Mutex::Autolock _l(mLock);
  344. if (mPlayer != 0) {
  345. if (mCurrentPosition >= 0) {
  346. ALOGV("Using cached seek position: %d", mCurrentPosition);
  347. *msec = mCurrentPosition;
  348. return NO_ERROR;
  349. }
  350. return mPlayer->getCurrentPosition(msec);
  351. }
  352. return INVALID_OPERATION;
  353. }
  354. status_t MediaPlayer::getDuration_l(int *msec)
  355. {
  356. ALOGV("getDuration_l");
  357. bool isValidState = (mCurrentState & (MEDIA_PLAYER_PREPARED | MEDIA_PLAYER_STARTED | MEDIA_PLAYER_PAUSED | MEDIA_PLAYER_STOPPED | MEDIA_PLAYER_PLAYBACK_COMPLETE));
  358. if (mPlayer != 0 && isValidState) {
  359. int durationMs;
  360. status_t ret = mPlayer->getDuration(&durationMs);
  361. if (msec) {
  362. *msec = durationMs;
  363. }
  364. return ret;
  365. }
  366. ALOGE("Attempt to call getDuration without a valid mediaplayer");
  367. return INVALID_OPERATION;
  368. }
  369. status_t MediaPlayer::getDuration(int *msec)
  370. {
  371. Mutex::Autolock _l(mLock);
  372. return getDuration_l(msec);
  373. }
  374. status_t MediaPlayer::seekTo_l(int msec)
  375. {
  376. ALOGV("seekTo %d", msec);
  377. if ((mPlayer != 0) && ( mCurrentState & ( MEDIA_PLAYER_STARTED | MEDIA_PLAYER_PREPARED | MEDIA_PLAYER_PAUSED | MEDIA_PLAYER_PLAYBACK_COMPLETE) ) ) {
  378. if ( msec < 0 ) {
  379. ALOGW("Attempt to seek to invalid position: %d", msec);
  380. msec = 0;
  381. }
  382. int durationMs;
  383. status_t err = mPlayer->getDuration(&durationMs);
  384. if (err != OK) {
  385. ALOGW("Stream has no duration and is therefore not seekable.");
  386. return err;
  387. }
  388. if (msec > durationMs) {
  389. ALOGW("Attempt to seek to past end of file: request = %d, "
  390. "durationMs = %d",
  391. msec,
  392. durationMs);
  393. msec = durationMs;
  394. }
  395. // cache duration
  396. mCurrentPosition = msec;
  397. if (mSeekPosition < 0) {
  398. mSeekPosition = msec;
  399. return mPlayer->seekTo(msec);
  400. }
  401. else {
  402. ALOGV("Seek in progress - queue up seekTo[%d]", msec);
  403. return NO_ERROR;
  404. }
  405. }
  406. ALOGE("Attempt to perform seekTo in wrong state: mPlayer=%p, mCurrentState=%u", mPlayer.get(), mCurrentState);
  407. return INVALID_OPERATION;
  408. }
  409. status_t MediaPlayer::seekTo(int msec)
  410. {
  411. mLockThreadId = getThreadId();
  412. Mutex::Autolock _l(mLock);
  413. status_t result = seekTo_l(msec);
  414. mLockThreadId = 0;
  415. return result;
  416. }
  417. status_t MediaPlayer::reset_l()
  418. {
  419. mLoop = false;
  420. if (mCurrentState == MEDIA_PLAYER_IDLE) return NO_ERROR;
  421. mPrepareSync = false;
  422. if (mPlayer != 0) {
  423. status_t ret = mPlayer->reset();
  424. if (ret != NO_ERROR) {
  425. ALOGE("reset() failed with return code (%d)", ret);
  426. mCurrentState = MEDIA_PLAYER_STATE_ERROR;
  427. } else {
  428. mCurrentState = MEDIA_PLAYER_IDLE;
  429. }
  430. // setDataSource has to be called again to create a
  431. // new mediaplayer.
  432. mPlayer = 0;
  433. return ret;
  434. }
  435. clear_l();
  436. return NO_ERROR;
  437. }
  438. status_t MediaPlayer::doSetRetransmitEndpoint(const sp<IMediaPlayer>& player) {
  439. Mutex::Autolock _l(mLock);
  440. if (player == NULL) {
  441. return UNKNOWN_ERROR;
  442. }
  443. if (mRetransmitEndpointValid) {
  444. return player->setRetransmitEndpoint(&mRetransmitEndpoint);
  445. }
  446. return OK;
  447. }
  448. status_t MediaPlayer::reset()
  449. {
  450. ALOGV("reset");
  451. Mutex::Autolock _l(mLock);
  452. return reset_l();
  453. }
  454. status_t MediaPlayer::setAudioStreamType(audio_stream_type_t type)
  455. {
  456. ALOGV("MediaPlayer::setAudioStreamType");
  457. Mutex::Autolock _l(mLock);
  458. if (mStreamType == type) return NO_ERROR;
  459. if (mCurrentState & ( MEDIA_PLAYER_PREPARED | MEDIA_PLAYER_STARTED |
  460. MEDIA_PLAYER_PAUSED | MEDIA_PLAYER_PLAYBACK_COMPLETE ) ) {
  461. // Can't change the stream type after prepare
  462. ALOGE("setAudioStream called in state %d", mCurrentState);
  463. return INVALID_OPERATION;
  464. }
  465. // cache
  466. mStreamType = type;
  467. return OK;
  468. }
  469. status_t MediaPlayer::setLooping(int loop)
  470. {
  471. ALOGV("MediaPlayer::setLooping");
  472. Mutex::Autolock _l(mLock);
  473. mLoop = (loop != 0);
  474. if (mPlayer != 0) {
  475. return mPlayer->setLooping(loop);
  476. }
  477. return OK;
  478. }
  479. bool MediaPlayer::isLooping() {
  480. ALOGV("isLooping");
  481. Mutex::Autolock _l(mLock);
  482. if (mPlayer != 0) {
  483. return mLoop;
  484. }
  485. ALOGV("isLooping: no active player");
  486. return false;
  487. }
  488. status_t MediaPlayer::setVolume(float leftVolume, float rightVolume)
  489. {
  490. ALOGV("MediaPlayer::setVolume(%f, %f)", leftVolume, rightVolume);
  491. Mutex::Autolock _l(mLock);
  492. mLeftVolume = leftVolume;
  493. mRightVolume = rightVolume;
  494. if (mPlayer != 0) {
  495. return mPlayer->setVolume(leftVolume, rightVolume);
  496. }
  497. return OK;
  498. }
  499. status_t MediaPlayer::setAudioSessionId(int sessionId)
  500. {
  501. ALOGV("MediaPlayer::setAudioSessionId(%d)", sessionId);
  502. Mutex::Autolock _l(mLock);
  503. if (!(mCurrentState & MEDIA_PLAYER_IDLE)) {
  504. ALOGE("setAudioSessionId called in state %d", mCurrentState);
  505. return INVALID_OPERATION;
  506. }
  507. if (sessionId < 0) {
  508. return BAD_VALUE;
  509. }
  510. if (sessionId != mAudioSessionId) {
  511. AudioSystem::releaseAudioSessionId(mAudioSessionId);
  512. AudioSystem::acquireAudioSessionId(sessionId);
  513. mAudioSessionId = sessionId;
  514. }
  515. return NO_ERROR;
  516. }
  517. int MediaPlayer::getAudioSessionId()
  518. {
  519. Mutex::Autolock _l(mLock);
  520. return mAudioSessionId;
  521. }
  522. status_t MediaPlayer::setAuxEffectSendLevel(float level)
  523. {
  524. ALOGV("MediaPlayer::setAuxEffectSendLevel(%f)", level);
  525. Mutex::Autolock _l(mLock);
  526. mSendLevel = level;
  527. if (mPlayer != 0) {
  528. return mPlayer->setAuxEffectSendLevel(level);
  529. }
  530. return OK;
  531. }
  532. status_t MediaPlayer::attachAuxEffect(int effectId)
  533. {
  534. ALOGV("MediaPlayer::attachAuxEffect(%d)", effectId);
  535. Mutex::Autolock _l(mLock);
  536. if (mPlayer == 0 ||
  537. (mCurrentState & MEDIA_PLAYER_IDLE) ||
  538. (mCurrentState == MEDIA_PLAYER_STATE_ERROR )) {
  539. ALOGE("attachAuxEffect called in state %d", mCurrentState);
  540. return INVALID_OPERATION;
  541. }
  542. return mPlayer->attachAuxEffect(effectId);
  543. }
  544. status_t MediaPlayer::setParameter(int key, const Parcel& request)
  545. {
  546. ALOGV("MediaPlayer::setParameter(%d)", key);
  547. Mutex::Autolock _l(mLock);
  548. if (mPlayer != NULL) {
  549. return mPlayer->setParameter(key, request);
  550. }
  551. ALOGV("setParameter: no active player");
  552. return INVALID_OPERATION;
  553. }
  554. status_t MediaPlayer::getParameter(int key, Parcel *reply)
  555. {
  556. ALOGV("MediaPlayer::getParameter(%d)", key);
  557. Mutex::Autolock _l(mLock);
  558. if (mPlayer != NULL) {
  559. return mPlayer->getParameter(key, reply);
  560. }
  561. ALOGV("getParameter: no active player");
  562. return INVALID_OPERATION;
  563. }
  564. status_t MediaPlayer::setRetransmitEndpoint(const char* addrString,
  565. uint16_t port) {
  566. ALOGV("MediaPlayer::setRetransmitEndpoint(%s:%hu)",
  567. addrString ? addrString : "(null)", port);
  568. Mutex::Autolock _l(mLock);
  569. if ((mPlayer != NULL) || (mCurrentState != MEDIA_PLAYER_IDLE))
  570. return INVALID_OPERATION;
  571. if (NULL == addrString) {
  572. mRetransmitEndpointValid = false;
  573. return OK;
  574. }
  575. struct in_addr saddr;
  576. if(!inet_aton(addrString, &saddr)) {
  577. return BAD_VALUE;
  578. }
  579. memset(&mRetransmitEndpoint, 0, sizeof(&mRetransmitEndpoint));
  580. mRetransmitEndpoint.sin_family = AF_INET;
  581. mRetransmitEndpoint.sin_addr = saddr;
  582. mRetransmitEndpoint.sin_port = htons(port);
  583. mRetransmitEndpointValid = true;
  584. return OK;
  585. }
  586. void MediaPlayer::notify(int msg, int ext1, int ext2, const Parcel *obj)
  587. {
  588. ALOGV("message received msg=%d, ext1=%d, ext2=%d", msg, ext1, ext2);
  589. bool send = true;
  590. bool locked = false;
  591. // TODO: In the future, we might be on the same thread if the app is
  592. // running in the same process as the media server. In that case,
  593. // this will deadlock.
  594. //
  595. // The threadId hack below works around this for the care of prepare
  596. // and seekTo within the same process.
  597. // FIXME: Remember, this is a hack, it's not even a hack that is applied
  598. // consistently for all use-cases, this needs to be revisited.
  599. if (mLockThreadId != getThreadId()) {
  600. mLock.lock();
  601. locked = true;
  602. }
  603. // Allows calls from JNI in idle state to notify errors
  604. if (!(msg == MEDIA_ERROR && mCurrentState == MEDIA_PLAYER_IDLE) && mPlayer == 0) {
  605. ALOGV("notify(%d, %d, %d) callback on disconnected mediaplayer", msg, ext1, ext2);
  606. if (locked) mLock.unlock(); // release the lock when done.
  607. return;
  608. }
  609. switch (msg) {
  610. case MEDIA_NOP: // interface test message
  611. break;
  612. case MEDIA_PREPARED:
  613. ALOGV("prepared");
  614. mCurrentState = MEDIA_PLAYER_PREPARED;
  615. if (mPrepareSync) {
  616. ALOGV("signal application thread");
  617. mPrepareSync = false;
  618. mPrepareStatus = NO_ERROR;
  619. mSignal.signal();
  620. }
  621. break;
  622. case MEDIA_PLAYBACK_COMPLETE:
  623. ALOGV("playback complete");
  624. if (mCurrentState == MEDIA_PLAYER_IDLE) {
  625. ALOGE("playback complete in idle state");
  626. }
  627. if (!mLoop) {
  628. mCurrentState = MEDIA_PLAYER_PLAYBACK_COMPLETE;
  629. }
  630. break;
  631. case MEDIA_ERROR:
  632. // Always log errors.
  633. // ext1: Media framework error code.
  634. // ext2: Implementation dependant error code.
  635. ALOGE("error (%d, %d)", ext1, ext2);
  636. mCurrentState = MEDIA_PLAYER_STATE_ERROR;
  637. if (mPrepareSync)
  638. {
  639. ALOGV("signal application thread");
  640. mPrepareSync = false;
  641. mPrepareStatus = ext1;
  642. mSignal.signal();
  643. send = false;
  644. }
  645. break;
  646. case MEDIA_INFO:
  647. // ext1: Media framework error code.
  648. // ext2: Implementation dependant error code.
  649. if (ext1 != MEDIA_INFO_VIDEO_TRACK_LAGGING) {
  650. ALOGW("info/warning (%d, %d)", ext1, ext2);
  651. }
  652. break;
  653. case MEDIA_SEEK_COMPLETE:
  654. ALOGV("Received seek complete");
  655. if (mSeekPosition != mCurrentPosition) {
  656. ALOGV("Executing queued seekTo(%d)", mSeekPosition);
  657. mSeekPosition = -1;
  658. seekTo_l(mCurrentPosition);
  659. }
  660. else {
  661. ALOGV("All seeks complete - return to regularly scheduled program");
  662. mCurrentPosition = mSeekPosition = -1;
  663. }
  664. break;
  665. case MEDIA_BUFFERING_UPDATE:
  666. ALOGV("buffering %d", ext1);
  667. break;
  668. case MEDIA_SET_VIDEO_SIZE:
  669. ALOGV("New video size %d x %d", ext1, ext2);
  670. mVideoWidth = ext1;
  671. mVideoHeight = ext2;
  672. break;
  673. case MEDIA_TIMED_TEXT:
  674. ALOGV("Received timed text message");
  675. break;
  676. default:
  677. ALOGV("unrecognized message: (%d, %d, %d)", msg, ext1, ext2);
  678. break;
  679. }
  680. sp<MediaPlayerListener> listener = mListener;
  681. if (locked) mLock.unlock();
  682. // this prevents re-entrant calls into client code
  683. if ((listener != 0) && send) {
  684. Mutex::Autolock _l(mNotifyLock);
  685. ALOGV("callback application");
  686. listener->notify(msg, ext1, ext2, obj);
  687. ALOGV("back from callback");
  688. }
  689. }
  690. /*static*/ sp<IMemory> MediaPlayer::decode(const char* url, uint32_t *pSampleRate, int* pNumChannels, audio_format_t* pFormat)
  691. {
  692. ALOGV("decode(%s)", url);
  693. sp<IMemory> p;
  694. const sp<IMediaPlayerService>& service = getMediaPlayerService();
  695. if (service != 0) {
  696. p = service->decode(url, pSampleRate, pNumChannels, pFormat);
  697. } else {
  698. ALOGE("Unable to locate media service");
  699. }
  700. return p;
  701. }
  702. void MediaPlayer::died()
  703. {
  704. ALOGV("died");
  705. notify(MEDIA_ERROR, MEDIA_ERROR_SERVER_DIED, 0);
  706. }
  707. /*static*/ sp<IMemory> MediaPlayer::decode(int fd, int64_t offset, int64_t length, uint32_t *pSampleRate, int* pNumChannels, audio_format_t* pFormat)
  708. {
  709. ALOGV("decode(%d, %lld, %lld)", fd, offset, length);
  710. sp<IMemory> p;
  711. const sp<IMediaPlayerService>& service = getMediaPlayerService();
  712. if (service != 0) {
  713. p = service->decode(fd, offset, length, pSampleRate, pNumChannels, pFormat);
  714. } else {
  715. ALOGE("Unable to locate media service");
  716. }
  717. return p;
  718. }
  719. status_t MediaPlayer::setNextMediaPlayer(const sp<MediaPlayer>& next) {
  720. if (mPlayer == NULL) {
  721. return NO_INIT;
  722. }
  723. return mPlayer->setNextPlayer(next == NULL ? NULL : next->mPlayer);
  724. }
  725. }; // namespace android