126f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi/*
226f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi * Copyright (C) 2010 The Android Open Source Project
326f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi *
426f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License");
526f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi * you may not use this file except in compliance with the License.
626f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi * You may obtain a copy of the License at
726f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi *
826f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi *      http://www.apache.org/licenses/LICENSE-2.0
926f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi *
1026f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software
1126f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS,
1226f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1326f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi * See the License for the specific language governing permissions and
1426f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi * limitations under the License.
1526f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi */
1626f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi
1762b90b5c5b8495c12900c5d759fa341319e661b3Jean-Michel Trivi#include <media/IStreamSource.h>
18185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Trivi#include <binder/IServiceManager.h>
19d004feb25e830dd92a8d6e6af0d363e4d11721a2Jean-Michel Trivi#include "android/android_GenericMediaPlayer.h"
20185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Trivi
214756e5726b53c2b4d7fae8b66b5596afd7fcf309Jean-Michel Trivi// number of SLuint32 fields to store a buffer event message in an item, by mapping each
224756e5726b53c2b4d7fae8b66b5596afd7fcf309Jean-Michel Trivi//   to the item key (SLuint32), the item size (SLuint32), and the item data (mask on SLuint32)
234756e5726b53c2b4d7fae8b66b5596afd7fcf309Jean-Michel Trivi#define NB_BUFFEREVENT_ITEM_FIELDS 3
24935dd61f52dc7683e00f3cd338e0c8c25eb21409Jean-Michel Trivi
25185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Trivi//--------------------------------------------------------------------------------------------------
2626f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivinamespace android {
2726f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi
28f65b260193e5ca669ec4479a7e1c4517e18cc6b0Jean-Michel Trivi//--------------------------------------------------------------------------------------------------
29320e3f8feca85d6658bd238a9931458fb809d4f6Jean-Michel Triviclass StreamPlayer;
30320e3f8feca85d6658bd238a9931458fb809d4f6Jean-Michel Trivi
3164e6ae6c2a1aab5f837df796427ff63cb773e79cJean-Michel Triviclass StreamSourceAppProxy : public BnStreamSource {
32185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Trivipublic:
335b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi    StreamSourceAppProxy(
345f542f6e29f76ccc34d3072c13638e84d7b88496Glenn Kasten            IAndroidBufferQueue *androidBufferQueue,
35320e3f8feca85d6658bd238a9931458fb809d4f6Jean-Michel Trivi            const sp<CallbackProtector> &callbackProtector,
363adea07faf6124cfbc68d2db80e05f4cced9dfa9Glenn Kasten            StreamPlayer *player);
37185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Trivi    virtual ~StreamSourceAppProxy();
38185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Trivi
394756e5726b53c2b4d7fae8b66b5596afd7fcf309Jean-Michel Trivi    // store an item structure to indicate a processed buffer
404756e5726b53c2b4d7fae8b66b5596afd7fcf309Jean-Michel Trivi    static const SLuint32 kItemProcessed[NB_BUFFEREVENT_ITEM_FIELDS];
414756e5726b53c2b4d7fae8b66b5596afd7fcf309Jean-Michel Trivi
42185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Trivi    // IStreamSource implementation
433adea07faf6124cfbc68d2db80e05f4cced9dfa9Glenn Kasten    virtual void setListener(const sp<IStreamListener> &listener); // mediaserver calls exactly once
443adea07faf6124cfbc68d2db80e05f4cced9dfa9Glenn Kasten    virtual void setBuffers(const Vector<sp<IMemory> > &buffers);  // mediaserver calls exactly once
45185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Trivi    virtual void onBufferAvailable(size_t index);
46185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Trivi
475b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi    // Consumption from ABQ
485b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi    void pullFromBuffQueue();
495b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi
503adea07faf6124cfbc68d2db80e05f4cced9dfa9Glenn Kastenprivate:
515b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi    void receivedCmd_l(IStreamListener::Command cmd, const sp<AMessage> &msg = NULL);
525b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi    void receivedBuffer_l(size_t buffIndex, size_t buffLength);
5364e6ae6c2a1aab5f837df796427ff63cb773e79cJean-Michel Trivi
543adea07faf6124cfbc68d2db80e05f4cced9dfa9Glenn Kastenpublic:
553adea07faf6124cfbc68d2db80e05f4cced9dfa9Glenn Kasten    // Call at least once prior to releasing the last strong reference to this object. It causes
563adea07faf6124cfbc68d2db80e05f4cced9dfa9Glenn Kasten    // the player to release all of its resources, similar to android.media.MediaPlayer disconnect.
573adea07faf6124cfbc68d2db80e05f4cced9dfa9Glenn Kasten    void disconnect();
583adea07faf6124cfbc68d2db80e05f4cced9dfa9Glenn Kasten
59185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Triviprivate:
603adea07faf6124cfbc68d2db80e05f4cced9dfa9Glenn Kasten    // protects mListener, mBuffers, mBuffersHasBeenSet, and mAvailableBuffers
615b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi    Mutex mLock;
623adea07faf6124cfbc68d2db80e05f4cced9dfa9Glenn Kasten
63185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Trivi    sp<IStreamListener> mListener;
645b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi    // array of shared memory buffers
65185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Trivi    Vector<sp<IMemory> > mBuffers;
663adea07faf6124cfbc68d2db80e05f4cced9dfa9Glenn Kasten    bool mBuffersHasBeenSet;
675b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi    // list of available buffers in shared memory, identified by their index
685b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi    List<size_t> mAvailableBuffers;
69185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Trivi
705b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi    // the Android Buffer Queue from which data is consumed and written to shared memory
713adea07faf6124cfbc68d2db80e05f4cced9dfa9Glenn Kasten    IAndroidBufferQueue* const mAndroidBufferQueue;
72f65b260193e5ca669ec4479a7e1c4517e18cc6b0Jean-Michel Trivi
735f542f6e29f76ccc34d3072c13638e84d7b88496Glenn Kasten    const sp<CallbackProtector> mCallbackProtector;
743adea07faf6124cfbc68d2db80e05f4cced9dfa9Glenn Kasten    const wp<StreamPlayer> mPlayer;
75abf6db3696e93960f7bc943e8235ba31f73e5c3fGlenn Kasten
76185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Trivi    DISALLOW_EVIL_CONSTRUCTORS(StreamSourceAppProxy);
77185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Trivi};
78185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Trivi
79185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Trivi
80185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Trivi//--------------------------------------------------------------------------------------------------
81e8af8705a6eb3b8ebd239c379d9143dc69c363d4Jean-Michel Triviclass StreamPlayer : public GenericMediaPlayer
8226f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi{
8326f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivipublic:
845f542f6e29f76ccc34d3072c13638e84d7b88496Glenn Kasten    StreamPlayer(AudioPlayback_Parameters* params, bool hasVideo,
855f542f6e29f76ccc34d3072c13638e84d7b88496Glenn Kasten           IAndroidBufferQueue *androidBufferQueue, const sp<CallbackProtector> &callbackProtector);
8626f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi    virtual ~StreamPlayer();
8726f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi
885b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi    // overridden from GenericPlayer
895b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi    virtual void onMessageReceived(const sp<AMessage> &msg);
908703ed0d5207cddb1966328380922f6e8876695aGlenn Kasten    virtual void preDestroy();
915b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi
92320e3f8feca85d6658bd238a9931458fb809d4f6Jean-Michel Trivi    void queueRefilled();
93ec6861ed4f54b73425bdca049f3a75f7ac57a682Jean-Michel Trivi    void appClear_l();
94185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Trivi
9526f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Triviprotected:
965b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi
975b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi    enum {
98320e3f8feca85d6658bd238a9931458fb809d4f6Jean-Michel Trivi        // message to asynchronously notify mAppProxy it should try to pull from the Android
99320e3f8feca85d6658bd238a9931458fb809d4f6Jean-Michel Trivi        //    Buffer Queue and push to shared memory (media server), either because the buffer queue
100320e3f8feca85d6658bd238a9931458fb809d4f6Jean-Michel Trivi        //    was refilled, or because during playback, the shared memory buffers should remain
101320e3f8feca85d6658bd238a9931458fb809d4f6Jean-Michel Trivi        //    filled to prevent it from draining (this can happen if the ABQ is not ready
102320e3f8feca85d6658bd238a9931458fb809d4f6Jean-Michel Trivi        //    whenever a shared memory buffer becomes available)
1038703ed0d5207cddb1966328380922f6e8876695aGlenn Kasten        kWhatPullFromAbq    = 'plfq',
1048703ed0d5207cddb1966328380922f6e8876695aGlenn Kasten        kWhatStopForDestroy = 's4ds'
1055b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi    };
1065b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi
1075f542f6e29f76ccc34d3072c13638e84d7b88496Glenn Kasten    const sp<StreamSourceAppProxy> mAppProxy; // application proxy for the shared memory source
10826f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi
109e8af8705a6eb3b8ebd239c379d9143dc69c363d4Jean-Michel Trivi    // overridden from GenericMediaPlayer
11007ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi    virtual void onPrepare();
111c7c027f9ddbe3754388a0aea55c2958ea81e664dJean-Michel Trivi    virtual void onPlay();
11226f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi
113320e3f8feca85d6658bd238a9931458fb809d4f6Jean-Michel Trivi    void onPullFromAndroidBufferQueue();
1145b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi
115185c2b9bd386e079b4ab99d07ca16d79342aa55fJean-Michel Triviprivate:
1168703ed0d5207cddb1966328380922f6e8876695aGlenn Kasten    void onStopForDestroy();
1178703ed0d5207cddb1966328380922f6e8876695aGlenn Kasten
1188703ed0d5207cddb1966328380922f6e8876695aGlenn Kasten    Mutex mStopForDestroyLock;
1198703ed0d5207cddb1966328380922f6e8876695aGlenn Kasten    Condition mStopForDestroyCondition;
1208703ed0d5207cddb1966328380922f6e8876695aGlenn Kasten    bool mStopForDestroyCompleted;
1218703ed0d5207cddb1966328380922f6e8876695aGlenn Kasten
12207ae4e2417fc17301435a72b85ad80bd4253b6b5Jean-Michel Trivi    DISALLOW_EVIL_CONSTRUCTORS(StreamPlayer);
12326f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi};
12426f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi
12526f4740dcf05c434de6dfa7519b9435756e653c1Jean-Michel Trivi} // namespace android
126