1fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi/* 2fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi * Copyright (C) 2010 The Android Open Source Project 3fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi * 4fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); 5fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi * you may not use this file except in compliance with the License. 6fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi * You may obtain a copy of the License at 7fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi * 8fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 9fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi * 10fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 11fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, 12fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi * See the License for the specific language governing permissions and 14fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi * limitations under the License. 15fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi */ 16fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi 1763c002ab68761be0eace98f28320d8eb2f3f7695Jean-Michel Trivi#include <media/IStreamSource.h> 1826043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi#include <binder/IServiceManager.h> 192b06e20ae32388f6e1dfd088d9773c34e6b1cb45Jean-Michel Trivi#include "android/android_GenericMediaPlayer.h" 2026043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi 211c853a41d9d9886e60618a7c878ce3912f46bf3cJean-Michel Trivi// number of SLuint32 fields to store a buffer event message in an item, by mapping each 221c853a41d9d9886e60618a7c878ce3912f46bf3cJean-Michel Trivi// to the item key (SLuint32), the item size (SLuint32), and the item data (mask on SLuint32) 231c853a41d9d9886e60618a7c878ce3912f46bf3cJean-Michel Trivi#define NB_BUFFEREVENT_ITEM_FIELDS 3 24ad887a253969ac2017a1dbe062d0b76d505594c0Jean-Michel Trivi 2526043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi//-------------------------------------------------------------------------------------------------- 26fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivinamespace android { 27fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi 28d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi//-------------------------------------------------------------------------------------------------- 29bc0e642e6c1a51b3ae3a02d490d94b03e718e6b5Jean-Michel Triviclass StreamPlayer; 30bc0e642e6c1a51b3ae3a02d490d94b03e718e6b5Jean-Michel Trivi 31be59fc5cfd9354d70d4b0e28bb2bca24a6ca6f22Jean-Michel Triviclass StreamSourceAppProxy : public BnStreamSource { 3226043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivipublic: 3370c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi StreamSourceAppProxy( 347133228a478e16458b659946f2180ecddd13fda7Glenn Kasten IAndroidBufferQueue *androidBufferQueue, 35bc0e642e6c1a51b3ae3a02d490d94b03e718e6b5Jean-Michel Trivi const sp<CallbackProtector> &callbackProtector, 36a0fa47f72f47fffb80ab2ae791739ce73de1e8f4Glenn Kasten StreamPlayer *player); 3726043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi virtual ~StreamSourceAppProxy(); 3826043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi 391c853a41d9d9886e60618a7c878ce3912f46bf3cJean-Michel Trivi // store an item structure to indicate a processed buffer 401c853a41d9d9886e60618a7c878ce3912f46bf3cJean-Michel Trivi static const SLuint32 kItemProcessed[NB_BUFFEREVENT_ITEM_FIELDS]; 411c853a41d9d9886e60618a7c878ce3912f46bf3cJean-Michel Trivi 4226043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi // IStreamSource implementation 43a0fa47f72f47fffb80ab2ae791739ce73de1e8f4Glenn Kasten virtual void setListener(const sp<IStreamListener> &listener); // mediaserver calls exactly once 44a0fa47f72f47fffb80ab2ae791739ce73de1e8f4Glenn Kasten virtual void setBuffers(const Vector<sp<IMemory> > &buffers); // mediaserver calls exactly once 4526043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi virtual void onBufferAvailable(size_t index); 4626043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi 4770c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi // Consumption from ABQ 4870c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi void pullFromBuffQueue(); 4970c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi 50a0fa47f72f47fffb80ab2ae791739ce73de1e8f4Glenn Kastenprivate: 5170c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi void receivedCmd_l(IStreamListener::Command cmd, const sp<AMessage> &msg = NULL); 5270c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi void receivedBuffer_l(size_t buffIndex, size_t buffLength); 53be59fc5cfd9354d70d4b0e28bb2bca24a6ca6f22Jean-Michel Trivi 54a0fa47f72f47fffb80ab2ae791739ce73de1e8f4Glenn Kastenpublic: 55a0fa47f72f47fffb80ab2ae791739ce73de1e8f4Glenn Kasten // Call at least once prior to releasing the last strong reference to this object. It causes 56a0fa47f72f47fffb80ab2ae791739ce73de1e8f4Glenn Kasten // the player to release all of its resources, similar to android.media.MediaPlayer disconnect. 57a0fa47f72f47fffb80ab2ae791739ce73de1e8f4Glenn Kasten void disconnect(); 58a0fa47f72f47fffb80ab2ae791739ce73de1e8f4Glenn Kasten 5926043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Triviprivate: 60a0fa47f72f47fffb80ab2ae791739ce73de1e8f4Glenn Kasten // protects mListener, mBuffers, mBuffersHasBeenSet, and mAvailableBuffers 6170c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi Mutex mLock; 62a0fa47f72f47fffb80ab2ae791739ce73de1e8f4Glenn Kasten 6326043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi sp<IStreamListener> mListener; 6470c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi // array of shared memory buffers 6526043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi Vector<sp<IMemory> > mBuffers; 66a0fa47f72f47fffb80ab2ae791739ce73de1e8f4Glenn Kasten bool mBuffersHasBeenSet; 6770c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi // list of available buffers in shared memory, identified by their index 6870c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi List<size_t> mAvailableBuffers; 6926043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi 7070c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi // the Android Buffer Queue from which data is consumed and written to shared memory 71a0fa47f72f47fffb80ab2ae791739ce73de1e8f4Glenn Kasten IAndroidBufferQueue* const mAndroidBufferQueue; 72d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi 737133228a478e16458b659946f2180ecddd13fda7Glenn Kasten const sp<CallbackProtector> mCallbackProtector; 74a0fa47f72f47fffb80ab2ae791739ce73de1e8f4Glenn Kasten const wp<StreamPlayer> mPlayer; 75485a038f9f0f898227b8ab4218e94c5d56b6ed0bGlenn Kasten 7626043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi DISALLOW_EVIL_CONSTRUCTORS(StreamSourceAppProxy); 7726043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi}; 7826043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi 7926043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi 8026043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi//-------------------------------------------------------------------------------------------------- 8168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Triviclass StreamPlayer : public GenericMediaPlayer 82fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi{ 83fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivipublic: 84167a2af67dcc0d20e6e3e995a23a0567715e0ee1Glenn Kasten StreamPlayer(const AudioPlayback_Parameters* params, bool hasVideo, 857133228a478e16458b659946f2180ecddd13fda7Glenn Kasten IAndroidBufferQueue *androidBufferQueue, const sp<CallbackProtector> &callbackProtector); 86fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi virtual ~StreamPlayer(); 87fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi 8870c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi // overridden from GenericPlayer 8970c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi virtual void onMessageReceived(const sp<AMessage> &msg); 90d1e9fd4cff80becfef5077090fc90328ba63999aGlenn Kasten virtual void preDestroy(); 9170c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi 92bc0e642e6c1a51b3ae3a02d490d94b03e718e6b5Jean-Michel Trivi void queueRefilled(); 93e2e8fa36bd7448b59fbcdf141e0b6d21e5401d91Glenn Kasten // Called after AndroidBufferQueue::Clear. 94e2e8fa36bd7448b59fbcdf141e0b6d21e5401d91Glenn Kasten // The "_l" indicates the caller still has it's (now empty) AndroidBufferQueue locked. 95e7bfcdc183454ec959ff51342f0973cabba219b2Jean-Michel Trivi void appClear_l(); 9626043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi 97fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Triviprotected: 9870c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi 9970c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi enum { 100bc0e642e6c1a51b3ae3a02d490d94b03e718e6b5Jean-Michel Trivi // message to asynchronously notify mAppProxy it should try to pull from the Android 101bc0e642e6c1a51b3ae3a02d490d94b03e718e6b5Jean-Michel Trivi // Buffer Queue and push to shared memory (media server), either because the buffer queue 102bc0e642e6c1a51b3ae3a02d490d94b03e718e6b5Jean-Michel Trivi // was refilled, or because during playback, the shared memory buffers should remain 103bc0e642e6c1a51b3ae3a02d490d94b03e718e6b5Jean-Michel Trivi // filled to prevent it from draining (this can happen if the ABQ is not ready 104bc0e642e6c1a51b3ae3a02d490d94b03e718e6b5Jean-Michel Trivi // whenever a shared memory buffer becomes available) 105d1e9fd4cff80becfef5077090fc90328ba63999aGlenn Kasten kWhatPullFromAbq = 'plfq', 106d1e9fd4cff80becfef5077090fc90328ba63999aGlenn Kasten kWhatStopForDestroy = 's4ds' 10770c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi }; 10870c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi 1097133228a478e16458b659946f2180ecddd13fda7Glenn Kasten const sp<StreamSourceAppProxy> mAppProxy; // application proxy for the shared memory source 110fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi 11168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi // overridden from GenericMediaPlayer 11216ce39d96d41884c7b0d1676553ab8167baaab74Jean-Michel Trivi virtual void onPrepare(); 113b712aebe63a6c50cc01f4493282fc77578242976Jean-Michel Trivi virtual void onPlay(); 114fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi 115bc0e642e6c1a51b3ae3a02d490d94b03e718e6b5Jean-Michel Trivi void onPullFromAndroidBufferQueue(); 11670c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi 11726043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Triviprivate: 118d1e9fd4cff80becfef5077090fc90328ba63999aGlenn Kasten void onStopForDestroy(); 119d1e9fd4cff80becfef5077090fc90328ba63999aGlenn Kasten 120d1e9fd4cff80becfef5077090fc90328ba63999aGlenn Kasten Mutex mStopForDestroyLock; 121d1e9fd4cff80becfef5077090fc90328ba63999aGlenn Kasten Condition mStopForDestroyCondition; 122d1e9fd4cff80becfef5077090fc90328ba63999aGlenn Kasten bool mStopForDestroyCompleted; 123d1e9fd4cff80becfef5077090fc90328ba63999aGlenn Kasten 12416ce39d96d41884c7b0d1676553ab8167baaab74Jean-Michel Trivi DISALLOW_EVIL_CONSTRUCTORS(StreamPlayer); 125fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi}; 126fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi 127fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi} // namespace android 128