xref: /aosp_15_r20/frameworks/wilhelm/src/android/android_StreamPlayer.h (revision bebae9c0e76121f8312ccb50385c080b3a0b023c)
1*bebae9c0SAndroid Build Coastguard Worker /*
2*bebae9c0SAndroid Build Coastguard Worker  * Copyright (C) 2010 The Android Open Source Project
3*bebae9c0SAndroid Build Coastguard Worker  *
4*bebae9c0SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*bebae9c0SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*bebae9c0SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*bebae9c0SAndroid Build Coastguard Worker  *
8*bebae9c0SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*bebae9c0SAndroid Build Coastguard Worker  *
10*bebae9c0SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*bebae9c0SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*bebae9c0SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*bebae9c0SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*bebae9c0SAndroid Build Coastguard Worker  * limitations under the License.
15*bebae9c0SAndroid Build Coastguard Worker  */
16*bebae9c0SAndroid Build Coastguard Worker 
17*bebae9c0SAndroid Build Coastguard Worker #include <media/IStreamSource.h>
18*bebae9c0SAndroid Build Coastguard Worker #include <binder/IServiceManager.h>
19*bebae9c0SAndroid Build Coastguard Worker #include "android/android_GenericMediaPlayer.h"
20*bebae9c0SAndroid Build Coastguard Worker 
21*bebae9c0SAndroid Build Coastguard Worker // number of SLuint32 fields to store a buffer event message in an item, by mapping each
22*bebae9c0SAndroid Build Coastguard Worker //   to the item key (SLuint32), the item size (SLuint32), and the item data (mask on SLuint32)
23*bebae9c0SAndroid Build Coastguard Worker #define NB_BUFFEREVENT_ITEM_FIELDS 3
24*bebae9c0SAndroid Build Coastguard Worker 
25*bebae9c0SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------
26*bebae9c0SAndroid Build Coastguard Worker namespace android {
27*bebae9c0SAndroid Build Coastguard Worker 
28*bebae9c0SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------
29*bebae9c0SAndroid Build Coastguard Worker class StreamPlayer;
30*bebae9c0SAndroid Build Coastguard Worker 
31*bebae9c0SAndroid Build Coastguard Worker class StreamSourceAppProxy : public BnStreamSource {
32*bebae9c0SAndroid Build Coastguard Worker public:
33*bebae9c0SAndroid Build Coastguard Worker     StreamSourceAppProxy(
34*bebae9c0SAndroid Build Coastguard Worker             IAndroidBufferQueue *androidBufferQueue,
35*bebae9c0SAndroid Build Coastguard Worker             const sp<CallbackProtector> &callbackProtector,
36*bebae9c0SAndroid Build Coastguard Worker             StreamPlayer *player);
37*bebae9c0SAndroid Build Coastguard Worker     virtual ~StreamSourceAppProxy();
38*bebae9c0SAndroid Build Coastguard Worker 
39*bebae9c0SAndroid Build Coastguard Worker     // store an item structure to indicate a processed buffer
40*bebae9c0SAndroid Build Coastguard Worker     static const SLuint32 kItemProcessed[NB_BUFFEREVENT_ITEM_FIELDS];
41*bebae9c0SAndroid Build Coastguard Worker 
42*bebae9c0SAndroid Build Coastguard Worker     // IStreamSource implementation
43*bebae9c0SAndroid Build Coastguard Worker     virtual void setListener(const sp<IStreamListener> &listener); // mediaserver calls exactly once
44*bebae9c0SAndroid Build Coastguard Worker     virtual void setBuffers(const Vector<sp<IMemory> > &buffers);  // mediaserver calls exactly once
45*bebae9c0SAndroid Build Coastguard Worker     virtual void onBufferAvailable(size_t index);
46*bebae9c0SAndroid Build Coastguard Worker 
47*bebae9c0SAndroid Build Coastguard Worker     // Consumption from ABQ
48*bebae9c0SAndroid Build Coastguard Worker     void pullFromBuffQueue();
49*bebae9c0SAndroid Build Coastguard Worker 
50*bebae9c0SAndroid Build Coastguard Worker private:
51*bebae9c0SAndroid Build Coastguard Worker     void receivedCmd_l(IStreamListener::Command cmd, const sp<AMessage> &msg = NULL);
52*bebae9c0SAndroid Build Coastguard Worker     void receivedBuffer_l(size_t buffIndex, size_t buffLength);
53*bebae9c0SAndroid Build Coastguard Worker 
54*bebae9c0SAndroid Build Coastguard Worker public:
55*bebae9c0SAndroid Build Coastguard Worker     // Call at least once prior to releasing the last strong reference to this object. It causes
56*bebae9c0SAndroid Build Coastguard Worker     // the player to release all of its resources, similar to android.media.MediaPlayer disconnect.
57*bebae9c0SAndroid Build Coastguard Worker     void disconnect();
58*bebae9c0SAndroid Build Coastguard Worker 
59*bebae9c0SAndroid Build Coastguard Worker private:
60*bebae9c0SAndroid Build Coastguard Worker     // protects mListener, mBuffers, mBuffersHasBeenSet, and mAvailableBuffers
61*bebae9c0SAndroid Build Coastguard Worker     Mutex mLock;
62*bebae9c0SAndroid Build Coastguard Worker 
63*bebae9c0SAndroid Build Coastguard Worker     sp<IStreamListener> mListener;
64*bebae9c0SAndroid Build Coastguard Worker     // array of shared memory buffers
65*bebae9c0SAndroid Build Coastguard Worker     Vector<sp<IMemory> > mBuffers;
66*bebae9c0SAndroid Build Coastguard Worker     bool mBuffersHasBeenSet;
67*bebae9c0SAndroid Build Coastguard Worker     // list of available buffers in shared memory, identified by their index
68*bebae9c0SAndroid Build Coastguard Worker     List<size_t> mAvailableBuffers;
69*bebae9c0SAndroid Build Coastguard Worker 
70*bebae9c0SAndroid Build Coastguard Worker     // the Android Buffer Queue from which data is consumed and written to shared memory
71*bebae9c0SAndroid Build Coastguard Worker     IAndroidBufferQueue* const mAndroidBufferQueue;
72*bebae9c0SAndroid Build Coastguard Worker 
73*bebae9c0SAndroid Build Coastguard Worker     const sp<CallbackProtector> mCallbackProtector;
74*bebae9c0SAndroid Build Coastguard Worker     const wp<StreamPlayer> mPlayer;
75*bebae9c0SAndroid Build Coastguard Worker 
76*bebae9c0SAndroid Build Coastguard Worker     DISALLOW_EVIL_CONSTRUCTORS(StreamSourceAppProxy);
77*bebae9c0SAndroid Build Coastguard Worker };
78*bebae9c0SAndroid Build Coastguard Worker 
79*bebae9c0SAndroid Build Coastguard Worker 
80*bebae9c0SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------
81*bebae9c0SAndroid Build Coastguard Worker class StreamPlayer : public GenericMediaPlayer
82*bebae9c0SAndroid Build Coastguard Worker {
83*bebae9c0SAndroid Build Coastguard Worker public:
84*bebae9c0SAndroid Build Coastguard Worker     StreamPlayer(const AudioPlayback_Parameters* params, bool hasVideo,
85*bebae9c0SAndroid Build Coastguard Worker            IAndroidBufferQueue *androidBufferQueue, const sp<CallbackProtector> &callbackProtector);
86*bebae9c0SAndroid Build Coastguard Worker     virtual ~StreamPlayer();
87*bebae9c0SAndroid Build Coastguard Worker 
88*bebae9c0SAndroid Build Coastguard Worker     // overridden from GenericPlayer
89*bebae9c0SAndroid Build Coastguard Worker     virtual void onMessageReceived(const sp<AMessage> &msg);
90*bebae9c0SAndroid Build Coastguard Worker     virtual void preDestroy();
91*bebae9c0SAndroid Build Coastguard Worker 
92*bebae9c0SAndroid Build Coastguard Worker     void queueRefilled();
93*bebae9c0SAndroid Build Coastguard Worker     // Called after AndroidBufferQueue::Clear.
94*bebae9c0SAndroid Build Coastguard Worker     // The "_l" indicates the caller still has it's (now empty) AndroidBufferQueue locked.
95*bebae9c0SAndroid Build Coastguard Worker     void appClear_l();
96*bebae9c0SAndroid Build Coastguard Worker 
97*bebae9c0SAndroid Build Coastguard Worker protected:
98*bebae9c0SAndroid Build Coastguard Worker 
99*bebae9c0SAndroid Build Coastguard Worker     enum {
100*bebae9c0SAndroid Build Coastguard Worker         // message to asynchronously notify mAppProxy it should try to pull from the Android
101*bebae9c0SAndroid Build Coastguard Worker         //    Buffer Queue and push to shared memory (media server), either because the buffer queue
102*bebae9c0SAndroid Build Coastguard Worker         //    was refilled, or because during playback, the shared memory buffers should remain
103*bebae9c0SAndroid Build Coastguard Worker         //    filled to prevent it from draining (this can happen if the ABQ is not ready
104*bebae9c0SAndroid Build Coastguard Worker         //    whenever a shared memory buffer becomes available)
105*bebae9c0SAndroid Build Coastguard Worker         kWhatPullFromAbq    = 'plfq',
106*bebae9c0SAndroid Build Coastguard Worker         kWhatStopForDestroy = 's4ds'
107*bebae9c0SAndroid Build Coastguard Worker     };
108*bebae9c0SAndroid Build Coastguard Worker 
109*bebae9c0SAndroid Build Coastguard Worker     const sp<StreamSourceAppProxy> mAppProxy; // application proxy for the shared memory source
110*bebae9c0SAndroid Build Coastguard Worker 
111*bebae9c0SAndroid Build Coastguard Worker     // overridden from GenericMediaPlayer
112*bebae9c0SAndroid Build Coastguard Worker     virtual void onPrepare();
113*bebae9c0SAndroid Build Coastguard Worker     virtual void onPlay();
114*bebae9c0SAndroid Build Coastguard Worker 
115*bebae9c0SAndroid Build Coastguard Worker     void onPullFromAndroidBufferQueue();
116*bebae9c0SAndroid Build Coastguard Worker 
117*bebae9c0SAndroid Build Coastguard Worker private:
118*bebae9c0SAndroid Build Coastguard Worker     void onStopForDestroy();
119*bebae9c0SAndroid Build Coastguard Worker 
120*bebae9c0SAndroid Build Coastguard Worker     Mutex mStopForDestroyLock;
121*bebae9c0SAndroid Build Coastguard Worker     Condition mStopForDestroyCondition;
122*bebae9c0SAndroid Build Coastguard Worker     bool mStopForDestroyCompleted;
123*bebae9c0SAndroid Build Coastguard Worker 
124*bebae9c0SAndroid Build Coastguard Worker     DISALLOW_EVIL_CONSTRUCTORS(StreamPlayer);
125*bebae9c0SAndroid Build Coastguard Worker };
126*bebae9c0SAndroid Build Coastguard Worker 
127*bebae9c0SAndroid Build Coastguard Worker } // namespace android
128