android_AudioSfDecoder.h revision 13837cf3f7be0eb8b1a9552bd99a89f98c987720
1/* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 18//-------------------------------------------------------------------------------------------------- 19namespace android { 20 21class AudioSfDecoder : public GenericPlayer 22{ 23public: 24 25 AudioSfDecoder(const AudioPlayback_Parameters* params); 26 virtual ~AudioSfDecoder(); 27 28 // overridden from GenericPlayer 29 virtual void play(); 30 31 void startPrefetch_async(); 32 33protected: 34 35 enum CacheStatus { 36 kStatusUnknown = -1, 37 kStatusEmpty = 0, 38 kStatusLow, 39 kStatusIntermediate, 40 kStatusEnough, 41 kStatusHigh 42 }; 43 44 enum { 45 kEventPrefetchStatusChange = 'prsc', 46 kEventPrefetchFillLevelUpdate = 'pflu', 47 kEventEndOfStream = 'eos', 48 }; 49 50 enum { 51 kWhatDecode = 'deco', 52 kWhatRender = 'rend', 53 kWhatCheckCache = 'cach', 54 }; 55 56 // Async event handlers (called from the AudioSfDecoder's event loop) 57 void onDecode(); 58 void onCheckCache(const sp<AMessage> &msg); 59 virtual void onRender(); 60 61 // Async event handlers (called from GenericPlayer's event loop) 62 virtual void onPrepare(); 63 virtual void onPlay(); 64 virtual void onPause(); 65 virtual void onSeek(const sp<AMessage> &msg); 66 virtual void onLoop(const sp<AMessage> &msg); 67 68 // overridden from GenericPlayer 69 virtual void onNotify(const sp<AMessage> &msg); 70 virtual void onMessageReceived(const sp<AMessage> &msg); 71 72 // to be implemented by subclasses of AudioSfDecoder to do something with the audio samples 73 virtual void createAudioSink() = 0; 74 virtual void updateAudioSink() = 0; 75 virtual void startAudioSink() = 0; 76 virtual void pauseAudioSink() = 0; 77 78 sp<DataSource> mDataSource; 79 sp<MediaSource> mAudioSource; 80 81 // negative values indicate invalid value 82 int64_t mBitrate; // in bits/sec 83 int32_t mNumChannels; 84 int32_t mSampleRateHz; 85 int64_t mDurationUsec; 86 87 // buffer passed from decoder to renderer 88 MediaBuffer *mDecodeBuffer; 89 // mutex used to protect the decode buffer 90 Mutex mDecodeBufferLock; 91 92 93private: 94 95 void notifyStatus(); 96 void notifyCacheFill(); 97 void notifyPrepared(status_t prepareRes); 98 99 CacheStatus mCacheStatus; 100 int16_t mCacheFill; // cache fill level in permille, signed per OpenSL ES 101 int16_t mLastNotifiedCacheFill; // last cache fill level communicated to the listener 102 int16_t mCacheFillNotifThreshold; // threshold in cache fill level for cache fill to be reported 103 104 int64_t mTimeDelta; 105 int64_t mSeekTimeMsec; 106 int64_t mLastDecodedPositionUs; 107 108 // mutex used for seek flag and seek time read/write 109 Mutex mSeekLock; 110 111/* 112 sp<ALooper> mRenderLooper; 113*/ 114 115 bool wantPrefetch(); 116 CacheStatus getCacheRemaining(bool *eos); 117 int64_t getPositionUsec(); 118 119private: 120 DISALLOW_EVIL_CONSTRUCTORS(AudioSfDecoder); 121 122}; 123 124} // namespace android 125