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 #ifndef FRAMEWORKS_EX_VARIABLESPEED_JNI_VARIABLESPEED_H_ 18 #define FRAMEWORKS_EX_VARIABLESPEED_JNI_VARIABLESPEED_H_ 19 20 #include <jni.h> 21 22 #include <SLES/OpenSLES.h> 23 #include <SLES/OpenSLES_Android.h> 24 #include <SLES/OpenSLES_AndroidConfiguration.h> 25 26 #include <integral_types.h> 27 #include <utils/threads.h> 28 29 #include <profile_timer.h> 30 #include <decode_buffer.h> 31 32 #include <queue> 33 #include <stack> 34 35 namespace video_editing { 36 class SolaTimeScaler; 37 } 38 39 // This is the audio engine class. 40 // It forms the bulk of the variablespeed library. 41 // It should not be used directly, but rather used indirectly from the java 42 // native methods. 43 class AudioEngine { 44 public: 45 AudioEngine(size_t targetFrames, float windowDuration, 46 float windowOverlapDuration, size_t maxPlayBufferCount, 47 float initialRate, size_t decodeInitialSize, size_t decodeMaxSize, 48 size_t startPositionMillis, int audioStreamType); 49 virtual ~AudioEngine(); 50 51 bool PlayUri(const char* uri); 52 bool PlayFileDescriptor(int fd, int64 offset, int64 length); 53 void SetVariableSpeed(float speed); 54 void RequestStart(); 55 void RequestStop(); 56 int GetCurrentPosition(); 57 int GetTotalDuration(); 58 59 void DecodingBufferQueueCallback( 60 SLAndroidSimpleBufferQueueItf queueItf, void *context); 61 void DecodingEventCallback(SLPlayItf caller, SLuint32 event); 62 void PrefetchEventCallback(SLPrefetchStatusItf caller, SLuint32 event); 63 void PlayingBufferQueueCallback(); 64 65 static AudioEngine* GetEngine(); 66 static void SetEngine(AudioEngine* engine); 67 static void DeleteEngine(); 68 69 private: 70 bool PlayFromThisSource(const SLDataSource& audioSrc); 71 void EnqueueMoreAudioIfNecessary(SLAndroidSimpleBufferQueueItf bufferQueue); 72 bool EnqueueNextBufferOfAudio(SLAndroidSimpleBufferQueueItf bufferQueue); 73 void PrefetchDurationSampleRateAndChannels( 74 SLPlayItf playItf, SLPrefetchStatusItf prefetchItf); 75 video_editing::SolaTimeScaler* GetTimeScaler(); 76 bool Finished(); 77 bool GetWasStartRequested(); 78 bool GetWasStopRequested(); 79 void ClearRequestStart(); 80 void SetEndOfDecoderReached(); 81 bool GetEndOfDecoderReached(); 82 bool DecodeBufferTooFull(); 83 void ClearDecodeBuffer(); 84 bool IsDecodeBufferEmpty(); 85 bool GetHasReachedPlayingBuffersLimit(); 86 bool HasSampleRateAndChannels(); 87 SLuint32 GetSLSampleRate(); 88 SLuint32 GetSLChannels(); 89 size_t GetChannelCount(); 90 91 // The single global audio engine instance. 92 static AudioEngine* audioEngine_; 93 94 // Protects access to the shared decode buffer. 95 android::Mutex decodeBufferLock_; 96 // Buffer into which we put the audio data as we decode. 97 // Protected by decodeBufferLock_. 98 DecodeBuffer decodeBuffer_; 99 100 // Protects access to the playingBuffers_ and freeBuffers_. 101 android::Mutex playBufferLock_; 102 // The buffers we're using for playback. 103 std::queue<int16*> playingBuffers_; 104 std::stack<int16*> freeBuffers_; 105 106 // The time scaler. 107 video_editing::SolaTimeScaler* timeScaler_; 108 109 // The frame buffer, used for converting between PCM data and float for 110 // time scaler. 111 float* floatBuffer_; 112 float* injectBuffer_; 113 114 // Required when we create the audio player. 115 // Set during the first callback from the decoder. 116 // Guarded by callbackLock_. 117 SLuint32 mSampleRate; 118 SLuint32 mChannels; 119 120 size_t targetFrames_; 121 float windowDuration_; 122 float windowOverlapDuration_; 123 size_t maxPlayBufferCount_; 124 float initialRate_; 125 size_t startPositionMillis_; 126 // The type of audio stream as defined by the STREAM_XXX constants in 127 // android.media.AudioManager. These constant values actually match the 128 // corresponding SL_ANDROID_STREAM_XXX constants defined by 129 // include/SLES/OpenSLES_AndroidConfiguration.h 130 int audioStreamType_; 131 132 // The prefetch callback signal, for letting the prefetch callback method 133 // indicate when it is done. 134 android::Mutex prefetchLock_; 135 android::Condition prefetchCondition_; 136 137 // Protects access to the CallbackContext object. 138 // I don't believe this to be necessary, I think that it's thread-confined, 139 // but it also won't do any harm. 140 android::Mutex callbackLock_; 141 142 // Protects access to the shared member variables below. 143 android::Mutex lock_; 144 // Protected by lock_. 145 // Stores the total duration of the track. 146 SLmillisecond totalDurationMs_; 147 // Protected by lock_. 148 // Stores the current position of the decoder head. 149 SLmillisecond decoderCurrentPosition_; 150 // Protected by lock_. 151 // Set externally via RequestStart(), this determines when we begin to 152 // playback audio. 153 // Until this is set to true, our audio player will remain stopped. 154 bool startRequested_; 155 // Protected by lock_. 156 // Set externally via RequestStop(), this tells us top stop playing 157 // and therefore shut everything down. 158 bool stopRequested_; 159 // Protected by lock_. 160 // This is set to true once we reach the end of the decoder stream. 161 bool finishedDecoding_; 162 163 DISALLOW_COPY_AND_ASSIGN(AudioEngine); 164 }; 165 166 #endif // FRAMEWORKS_EX_VARIABLESPEED_JNI_VARIABLESPEED_H_ 167