android_StreamPlayer.h revision 485a038f9f0f898227b8ab4218e94c5d56b6ed0b
13839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* 23839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Copyright (C) 2010 The Android Open Source Project 33839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * 419c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * Licensed under the Apache License, Version 2.0 (the "License"); 519c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * you may not use this file except in compliance with the License. 619c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * You may obtain a copy of the License at 719c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * 819c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * http://www.apache.org/licenses/LICENSE-2.0 919c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * 103839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Unless required by applicable law or agreed to in writing, software 113839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * distributed under the License is distributed on an "AS IS" BASIS, 123839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * See the License for the specific language governing permissions and 143839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * limitations under the License. 153839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */ 163839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 173839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <media/IStreamSource.h> 18a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o#include <binder/IServiceManager.h> 193839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "android/android_GenericMediaPlayer.h" 203839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 213839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o// number of SLuint32 fields to store a buffer event message in an item, by mapping each 223839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o// to the item key (SLuint32), the item size (SLuint32), and the item data (mask on SLuint32) 232740156bd12747389eaf745529653b26a3a9d73dTheodore Ts'o#define NB_BUFFEREVENT_ITEM_FIELDS 3 242740156bd12747389eaf745529653b26a3a9d73dTheodore Ts'o 252740156bd12747389eaf745529653b26a3a9d73dTheodore Ts'o//-------------------------------------------------------------------------------------------------- 26a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'onamespace android { 273839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 28373b8337c7b6c6243810be250083fa4773891e92Theodore Ts'o//-------------------------------------------------------------------------------------------------- 29373b8337c7b6c6243810be250083fa4773891e92Theodore Ts'oclass StreamSourceAppProxy : public BnStreamSource { 30373b8337c7b6c6243810be250083fa4773891e92Theodore Ts'opublic: 31a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o StreamSourceAppProxy( 32a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o const void* user, bool userIsAudioPlayer, 333839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o void *appContext, 34a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o const void *caller, 35a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o const sp<CallbackProtector> &callbackProtector); 363839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o virtual ~StreamSourceAppProxy(); 37a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o 38a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o // store an item structure to indicate a processed buffer 39a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o static const SLuint32 kItemProcessed[NB_BUFFEREVENT_ITEM_FIELDS]; 40a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o 41a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o // IStreamSource implementation 423839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o virtual void setListener(const sp<IStreamListener> &listener); 43a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o virtual void setBuffers(const Vector<sp<IMemory> > &buffers); 443839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o virtual void onBufferAvailable(size_t index); 45f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o 46f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o // Consumption from ABQ 4754c637d4d29af3e6365779f8b12976abe95a4753Theodore Ts'o void pullFromBuffQueue(); 483839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 491e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o void receivedCmd_l(IStreamListener::Command cmd, const sp<AMessage> &msg = NULL); 50896938d57e7091e7a032674dfeeb91f2a17fd78bTheodore Ts'o void receivedBuffer_l(size_t buffIndex, size_t buffLength); 513839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 5263985320384bf143eaac9857af424800d9867a1aTheodore Ts'oprivate: 533839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o // for mListener and mAvailableBuffers 54d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o Mutex mLock; 553839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o sp<IStreamListener> mListener; 563839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o // array of shared memory buffers 573839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o Vector<sp<IMemory> > mBuffers; 586733c2fd0046c525203034f58fc0a8c69fdf480bTheodore Ts'o // list of available buffers in shared memory, identified by their index 591e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o List<size_t> mAvailableBuffers; 601e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o 611e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o const void* mUser; 623839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o bool mUserIsAudioPlayer; 63f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o // the Android Buffer Queue from which data is consumed and written to shared memory 643839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o IAndroidBufferQueue* mAndroidBufferQueue; 653839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 66d48755e97f7d4cb06092921bff0d3681d30a8acaTheodore Ts'o void *mAppContext; 673839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o const void *mCaller; 683839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 6916ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o sp<CallbackProtector> mCallbackProtector; 7016ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o 7116ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o DISALLOW_EVIL_CONSTRUCTORS(StreamSourceAppProxy); 7216ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o}; 7316ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o 7416ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o 7516ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o//-------------------------------------------------------------------------------------------------- 7616ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'oclass StreamPlayer : public GenericMediaPlayer 7716ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o{ 7816ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'opublic: 793839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o StreamPlayer(AudioPlayback_Parameters* params, bool hasVideo); 803839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o virtual ~StreamPlayer(); 8116ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o 8216ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o // overridden from GenericPlayer 8316ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o virtual void onMessageReceived(const sp<AMessage> &msg); 8416ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o 8516ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o void registerQueueCallback( 863839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o const void* user, bool userIsAudioPlayer, 8763985320384bf143eaac9857af424800d9867a1aTheodore Ts'o void *context, 883839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o const void *caller); 89d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o void queueRefilled_l(); 90dc2ec525f5619bf478d2aae1b406fca2ff4b0d21Theodore Ts'o void appClear_l(); 915515e6b47de9ff941164a546dd9a74e9c6da3367Theodore Ts'o 925515e6b47de9ff941164a546dd9a74e9c6da3367Theodore Ts'oprotected: 9318160d26c0fcf8dbe990977c0231ebbc79fc9508Theodore Ts'o 94b10fd5e84ec7ea0e843b09e7c44784f072b8fdb7Theodore Ts'o enum { 953839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o // message to asynchronously notify mAppProxy the Android Buffer Queue was refilled 963839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o kWhatQueueRefilled = 'qrfi' 973839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o }; 983839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 996733c2fd0046c525203034f58fc0a8c69fdf480bTheodore Ts'o sp<StreamSourceAppProxy> mAppProxy; // application proxy for the android buffer queue source 1003839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1013839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o // overridden from GenericMediaPlayer 1023839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o virtual void onPrepare(); 1033839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1043839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o void onQueueRefilled(); 1053839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1063839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o Mutex mAppProxyLock; 1073839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1083839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1093839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oprivate: 1103839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o DISALLOW_EVIL_CONSTRUCTORS(StreamPlayer); 1116733c2fd0046c525203034f58fc0a8c69fdf480bTheodore Ts'o}; 1121dde43f0c1176f61dd0bf91aff265ce8cd1c5fd6Theodore Ts'o 1131dde43f0c1176f61dd0bf91aff265ce8cd1c5fd6Theodore Ts'o} // namespace android 1141dde43f0c1176f61dd0bf91aff265ce8cd1c5fd6Theodore Ts'o 1151dde43f0c1176f61dd0bf91aff265ce8cd1c5fd6Theodore Ts'o 1161dde43f0c1176f61dd0bf91aff265ce8cd1c5fd6Theodore Ts'o//-------------------------------------------------------------------------------------------------- 1171dde43f0c1176f61dd0bf91aff265ce8cd1c5fd6Theodore Ts'o/* 1181dde43f0c1176f61dd0bf91aff265ce8cd1c5fd6Theodore Ts'o * xxx_l functions are called with a lock on the CAudioPlayer mObject 1191dde43f0c1176f61dd0bf91aff265ce8cd1c5fd6Theodore Ts'o */ 1203839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern void android_StreamPlayer_realize_l(CAudioPlayer *ap, const notif_cbf_t cbf, 12150787ea22edd8b4662203daf3569411d9dcf4287Theodore Ts'o void* notifUser); 12250787ea22edd8b4662203daf3569411d9dcf4287Theodore Ts'o