126f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi/* 226f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi * Copyright (C) 2010 The Android Open Source Project 326f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi * 426f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); 526f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi * you may not use this file except in compliance with the License. 626f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi * You may obtain a copy of the License at 726f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi * 826f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 926f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi * 1026f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 1126f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, 1226f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1326f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi * See the License for the specific language governing permissions and 1426f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi * limitations under the License. 1526f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi */ 1626f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi 1762b90b5c5b8495c12900c5d759fa341319e661b3Jean-Michel Trivi#include <media/IStreamSource.h> 18185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Trivi#include <binder/IServiceManager.h> 19d004feb25e830dd92a8d6e6af0d363e4d11721a2Jean-Michel Trivi#include "android/android_GenericMediaPlayer.h" 20185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Trivi 214756e5726b53c2b4d7fae8b66b5596afd7fcf309Jean-Michel Trivi// number of SLuint32 fields to store a buffer event message in an item, by mapping each 224756e5726b53c2b4d7fae8b66b5596afd7fcf309Jean-Michel Trivi// to the item key (SLuint32), the item size (SLuint32), and the item data (mask on SLuint32) 234756e5726b53c2b4d7fae8b66b5596afd7fcf309Jean-Michel Trivi#define NB_BUFFEREVENT_ITEM_FIELDS 3 24935dd61f52dc7683e00f3cd338e0c8c25eb21409Jean-Michel Trivi 25185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Trivi//-------------------------------------------------------------------------------------------------- 2626f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivinamespace android { 2726f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi 28f65b260193e5ca669ec4479a7e1c4517e18cc6b0Jean-Michel Trivi//-------------------------------------------------------------------------------------------------- 29320e3f8feca85d6658bd238a9931458fb809d4f6Jean-Michel Triviclass StreamPlayer; 30320e3f8feca85d6658bd238a9931458fb809d4f6Jean-Michel Trivi 3164e6ae6c2a1aab5f837df796427ff63cb773e79cJean-Michel Triviclass StreamSourceAppProxy : public BnStreamSource { 32185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Trivipublic: 335b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi StreamSourceAppProxy( 345f542f6e29f76ccc34d3072c13638e84d7b88496Glenn Kasten IAndroidBufferQueue *androidBufferQueue, 35320e3f8feca85d6658bd238a9931458fb809d4f6Jean-Michel Trivi const sp<CallbackProtector> &callbackProtector, 363adea07faf6124cfbc68d2db80e05f4cced9dfa9Glenn Kasten StreamPlayer *player); 37185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Trivi virtual ~StreamSourceAppProxy(); 38185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Trivi 394756e5726b53c2b4d7fae8b66b5596afd7fcf309Jean-Michel Trivi // store an item structure to indicate a processed buffer 404756e5726b53c2b4d7fae8b66b5596afd7fcf309Jean-Michel Trivi static const SLuint32 kItemProcessed[NB_BUFFEREVENT_ITEM_FIELDS]; 414756e5726b53c2b4d7fae8b66b5596afd7fcf309Jean-Michel Trivi 42185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Trivi // IStreamSource implementation 433adea07faf6124cfbc68d2db80e05f4cced9dfa9Glenn Kasten virtual void setListener(const sp<IStreamListener> &listener); // mediaserver calls exactly once 443adea07faf6124cfbc68d2db80e05f4cced9dfa9Glenn Kasten virtual void setBuffers(const Vector<sp<IMemory> > &buffers); // mediaserver calls exactly once 45185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Trivi virtual void onBufferAvailable(size_t index); 46185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Trivi 475b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi // Consumption from ABQ 485b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi void pullFromBuffQueue(); 495b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi 503adea07faf6124cfbc68d2db80e05f4cced9dfa9Glenn Kastenprivate: 515b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi void receivedCmd_l(IStreamListener::Command cmd, const sp<AMessage> &msg = NULL); 525b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi void receivedBuffer_l(size_t buffIndex, size_t buffLength); 5364e6ae6c2a1aab5f837df796427ff63cb773e79cJean-Michel Trivi 543adea07faf6124cfbc68d2db80e05f4cced9dfa9Glenn Kastenpublic: 553adea07faf6124cfbc68d2db80e05f4cced9dfa9Glenn Kasten // Call at least once prior to releasing the last strong reference to this object. It causes 563adea07faf6124cfbc68d2db80e05f4cced9dfa9Glenn Kasten // the player to release all of its resources, similar to android.media.MediaPlayer disconnect. 573adea07faf6124cfbc68d2db80e05f4cced9dfa9Glenn Kasten void disconnect(); 583adea07faf6124cfbc68d2db80e05f4cced9dfa9Glenn Kasten 59185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Triviprivate: 603adea07faf6124cfbc68d2db80e05f4cced9dfa9Glenn Kasten // protects mListener, mBuffers, mBuffersHasBeenSet, and mAvailableBuffers 615b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi Mutex mLock; 623adea07faf6124cfbc68d2db80e05f4cced9dfa9Glenn Kasten 63185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Trivi sp<IStreamListener> mListener; 645b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi // array of shared memory buffers 65185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Trivi Vector<sp<IMemory> > mBuffers; 663adea07faf6124cfbc68d2db80e05f4cced9dfa9Glenn Kasten bool mBuffersHasBeenSet; 675b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi // list of available buffers in shared memory, identified by their index 685b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi List<size_t> mAvailableBuffers; 69185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Trivi 705b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi // the Android Buffer Queue from which data is consumed and written to shared memory 713adea07faf6124cfbc68d2db80e05f4cced9dfa9Glenn Kasten IAndroidBufferQueue* const mAndroidBufferQueue; 72f65b260193e5ca669ec4479a7e1c4517e18cc6b0Jean-Michel Trivi 735f542f6e29f76ccc34d3072c13638e84d7b88496Glenn Kasten const sp<CallbackProtector> mCallbackProtector; 743adea07faf6124cfbc68d2db80e05f4cced9dfa9Glenn Kasten const wp<StreamPlayer> mPlayer; 75abf6db3696e93960f7bc943e8235ba31f73e5c3fGlenn Kasten 76185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Trivi DISALLOW_EVIL_CONSTRUCTORS(StreamSourceAppProxy); 77185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Trivi}; 78185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Trivi 79185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Trivi 80185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Trivi//-------------------------------------------------------------------------------------------------- 81e8af8705a6eb3b8ebd239c379d9143dc69c363d4Jean-Michel Triviclass StreamPlayer : public GenericMediaPlayer 8226f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi{ 8326f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivipublic: 845f542f6e29f76ccc34d3072c13638e84d7b88496Glenn Kasten StreamPlayer(AudioPlayback_Parameters* params, bool hasVideo, 855f542f6e29f76ccc34d3072c13638e84d7b88496Glenn Kasten IAndroidBufferQueue *androidBufferQueue, const sp<CallbackProtector> &callbackProtector); 8626f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi virtual ~StreamPlayer(); 8726f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi 885b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi // overridden from GenericPlayer 895b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi virtual void onMessageReceived(const sp<AMessage> &msg); 908703ed0d5207cddb1966328380922f6e8876695aGlenn Kasten virtual void preDestroy(); 915b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi 92320e3f8feca85d6658bd238a9931458fb809d4f6Jean-Michel Trivi void queueRefilled(); 93ec6861ed4f54b73425bdca049f3a75f7ac57a682Jean-Michel Trivi void appClear_l(); 94185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Trivi 9526f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Triviprotected: 965b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi 975b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi enum { 98320e3f8feca85d6658bd238a9931458fb809d4f6Jean-Michel Trivi // message to asynchronously notify mAppProxy it should try to pull from the Android 99320e3f8feca85d6658bd238a9931458fb809d4f6Jean-Michel Trivi // Buffer Queue and push to shared memory (media server), either because the buffer queue 100320e3f8feca85d6658bd238a9931458fb809d4f6Jean-Michel Trivi // was refilled, or because during playback, the shared memory buffers should remain 101320e3f8feca85d6658bd238a9931458fb809d4f6Jean-Michel Trivi // filled to prevent it from draining (this can happen if the ABQ is not ready 102320e3f8feca85d6658bd238a9931458fb809d4f6Jean-Michel Trivi // whenever a shared memory buffer becomes available) 1038703ed0d5207cddb1966328380922f6e8876695aGlenn Kasten kWhatPullFromAbq = 'plfq', 1048703ed0d5207cddb1966328380922f6e8876695aGlenn Kasten kWhatStopForDestroy = 's4ds' 1055b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi }; 1065b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi 1075f542f6e29f76ccc34d3072c13638e84d7b88496Glenn Kasten const sp<StreamSourceAppProxy> mAppProxy; // application proxy for the shared memory source 10826f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi 109e8af8705a6eb3b8ebd239c379d9143dc69c363d4Jean-Michel Trivi // overridden from GenericMediaPlayer 11007ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi virtual void onPrepare(); 111c7c027f9ddbe3754388a0aea55c2958ea81e664dJean-Michel Trivi virtual void onPlay(); 11226f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi 113320e3f8feca85d6658bd238a9931458fb809d4f6Jean-Michel Trivi void onPullFromAndroidBufferQueue(); 1145b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi 115185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Triviprivate: 1168703ed0d5207cddb1966328380922f6e8876695aGlenn Kasten void onStopForDestroy(); 1178703ed0d5207cddb1966328380922f6e8876695aGlenn Kasten 1188703ed0d5207cddb1966328380922f6e8876695aGlenn Kasten Mutex mStopForDestroyLock; 1198703ed0d5207cddb1966328380922f6e8876695aGlenn Kasten Condition mStopForDestroyCondition; 1208703ed0d5207cddb1966328380922f6e8876695aGlenn Kasten bool mStopForDestroyCompleted; 1218703ed0d5207cddb1966328380922f6e8876695aGlenn Kasten 12207ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi DISALLOW_EVIL_CONSTRUCTORS(StreamPlayer); 12326f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi}; 12426f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi 12526f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi} // namespace android 126