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