| /* |
| * Copyright (C) 2010 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include <media/IStreamSource.h> |
| #include <binder/IServiceManager.h> |
| #include "android/android_GenericMediaPlayer.h" |
| |
| // number of SLuint32 fields to store a buffer event message in an item, by mapping each |
| // to the item key (SLuint32), the item size (SLuint32), and the item data (mask on SLuint32) |
| #define NB_BUFFEREVENT_ITEM_FIELDS 3 |
| |
| //-------------------------------------------------------------------------------------------------- |
| namespace android { |
| |
| //-------------------------------------------------------------------------------------------------- |
| class StreamPlayer; |
| |
| class StreamSourceAppProxy : public BnStreamSource { |
| public: |
| StreamSourceAppProxy( |
| IAndroidBufferQueue *androidBufferQueue, |
| const sp<CallbackProtector> &callbackProtector, |
| StreamPlayer *player); |
| virtual ~StreamSourceAppProxy(); |
| |
| // store an item structure to indicate a processed buffer |
| static const SLuint32 kItemProcessed[NB_BUFFEREVENT_ITEM_FIELDS]; |
| |
| // IStreamSource implementation |
| virtual void setListener(const sp<IStreamListener> &listener); // mediaserver calls exactly once |
| virtual void setBuffers(const Vector<sp<IMemory> > &buffers); // mediaserver calls exactly once |
| virtual void onBufferAvailable(size_t index); |
| |
| // Consumption from ABQ |
| void pullFromBuffQueue(); |
| |
| private: |
| void receivedCmd_l(IStreamListener::Command cmd, const sp<AMessage> &msg = NULL); |
| void receivedBuffer_l(size_t buffIndex, size_t buffLength); |
| |
| public: |
| // Call at least once prior to releasing the last strong reference to this object. It causes |
| // the player to release all of its resources, similar to android.media.MediaPlayer disconnect. |
| void disconnect(); |
| |
| private: |
| // protects mListener, mBuffers, mBuffersHasBeenSet, and mAvailableBuffers |
| Mutex mLock; |
| |
| sp<IStreamListener> mListener; |
| // array of shared memory buffers |
| Vector<sp<IMemory> > mBuffers; |
| bool mBuffersHasBeenSet; |
| // list of available buffers in shared memory, identified by their index |
| List<size_t> mAvailableBuffers; |
| |
| // the Android Buffer Queue from which data is consumed and written to shared memory |
| IAndroidBufferQueue* const mAndroidBufferQueue; |
| |
| const sp<CallbackProtector> mCallbackProtector; |
| const wp<StreamPlayer> mPlayer; |
| |
| DISALLOW_EVIL_CONSTRUCTORS(StreamSourceAppProxy); |
| }; |
| |
| |
| //-------------------------------------------------------------------------------------------------- |
| class StreamPlayer : public GenericMediaPlayer |
| { |
| public: |
| StreamPlayer(const AudioPlayback_Parameters* params, bool hasVideo, |
| IAndroidBufferQueue *androidBufferQueue, const sp<CallbackProtector> &callbackProtector); |
| virtual ~StreamPlayer(); |
| |
| // overridden from GenericPlayer |
| virtual void onMessageReceived(const sp<AMessage> &msg); |
| virtual void preDestroy(); |
| |
| void queueRefilled(); |
| // Called after AndroidBufferQueue::Clear. |
| // The "_l" indicates the caller still has it's (now empty) AndroidBufferQueue locked. |
| void appClear_l(); |
| |
| protected: |
| |
| enum { |
| // message to asynchronously notify mAppProxy it should try to pull from the Android |
| // Buffer Queue and push to shared memory (media server), either because the buffer queue |
| // was refilled, or because during playback, the shared memory buffers should remain |
| // filled to prevent it from draining (this can happen if the ABQ is not ready |
| // whenever a shared memory buffer becomes available) |
| kWhatPullFromAbq = 'plfq', |
| kWhatStopForDestroy = 's4ds' |
| }; |
| |
| const sp<StreamSourceAppProxy> mAppProxy; // application proxy for the shared memory source |
| |
| // overridden from GenericMediaPlayer |
| virtual void onPrepare(); |
| virtual void onPlay(); |
| |
| void onPullFromAndroidBufferQueue(); |
| |
| private: |
| void onStopForDestroy(); |
| |
| Mutex mStopForDestroyLock; |
| Condition mStopForDestroyCondition; |
| bool mStopForDestroyCompleted; |
| |
| DISALLOW_EVIL_CONSTRUCTORS(StreamPlayer); |
| }; |
| |
| } // namespace android |