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