1 /* 2 * Copyright (C) 2009 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 AUDIO_SOURCE_H_ 18 19 #define AUDIO_SOURCE_H_ 20 21 #include <media/AudioRecord.h> 22 #include <media/AudioSystem.h> 23 #include <media/stagefright/MediaSource.h> 24 #include <media/MicrophoneInfo.h> 25 #include <media/stagefright/MediaBuffer.h> 26 #include <utils/List.h> 27 28 #include <system/audio.h> 29 30 #include <vector> 31 32 namespace android { 33 34 using content::AttributionSourceState; 35 36 class AudioRecord; 37 38 struct AudioSource : public MediaSource, 39 public MediaBufferObserver, 40 public AudioRecord::IAudioRecordCallback { 41 // Note that the "channels" parameter _is_ the number of channels, 42 // _not_ a bitmask of audio_channels_t constants. 43 AudioSource( 44 const audio_attributes_t *attr, 45 const AttributionSourceState& attributionSource, 46 uint32_t sampleRate, 47 uint32_t channels, 48 uint32_t outSampleRate = 0, 49 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE, 50 audio_microphone_direction_t selectedMicDirection = MIC_DIRECTION_UNSPECIFIED, 51 float selectedMicFieldDimension = MIC_FIELD_DIMENSION_NORMAL); 52 53 // Legacy constructor kept for vendor dependencies 54 AudioSource( 55 const audio_attributes_t *attr, 56 const String16 &opPackageName, 57 uint32_t sampleRate, 58 uint32_t channels, 59 uint32_t outSampleRate = 0, 60 uid_t uid = -1, 61 pid_t pid = -1, 62 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE, 63 audio_microphone_direction_t selectedMicDirection = MIC_DIRECTION_UNSPECIFIED, 64 float selectedMicFieldDimension = MIC_FIELD_DIMENSION_NORMAL); 65 66 status_t initCheck() const; 67 68 virtual status_t start(MetaData *params = NULL); stopAudioSource69 virtual status_t stop() { return reset(); } 70 virtual sp<MetaData> getFormat(); 71 72 // Returns the maximum amplitude since last call. 73 int16_t getMaxAmplitude(); 74 75 virtual status_t read( 76 MediaBufferBase **buffer, const ReadOptions *options = NULL); 77 virtual status_t setStopTimeUs(int64_t stopTimeUs); 78 79 virtual void signalBufferReturned(MediaBufferBase *buffer); 80 81 status_t setInputDevice(audio_port_handle_t deviceId); 82 status_t getRoutedDeviceId(audio_port_handle_t* deviceId); 83 status_t addAudioDeviceCallback(const sp<AudioSystem::AudioDeviceCallback>& callback); 84 status_t removeAudioDeviceCallback(const sp<AudioSystem::AudioDeviceCallback>& callback); 85 86 status_t getActiveMicrophones(std::vector<media::MicrophoneInfo>* activeMicrophones); 87 status_t setPreferredMicrophoneDirection(audio_microphone_direction_t direction); 88 status_t setPreferredMicrophoneFieldDimension(float zoom); 89 90 status_t getPortId(audio_port_handle_t *portId) const; 91 92 protected: 93 virtual ~AudioSource(); 94 95 private: 96 enum { 97 kMaxBufferSize = 2048, 98 99 // After the initial mute, we raise the volume linearly 100 // over kAutoRampDurationUs. 101 kAutoRampDurationUs = 300000, 102 103 // This is the initial mute duration to suppress 104 // the video recording signal tone 105 kAutoRampStartUs = 0, 106 }; 107 108 Mutex mLock; 109 Condition mFrameAvailableCondition; 110 Condition mFrameEncodingCompletionCondition; 111 112 sp<AudioRecord> mRecord; 113 status_t mInitCheck; 114 bool mStarted; 115 int32_t mSampleRate; 116 int32_t mOutSampleRate; 117 118 bool mTrackMaxAmplitude; 119 int64_t mStartTimeUs; 120 int64_t mStopSystemTimeUs; 121 int64_t mLastFrameTimestampUs; 122 int16_t mMaxAmplitude; 123 int64_t mPrevSampleTimeUs; 124 int64_t mInitialReadTimeUs; 125 int64_t mNumFramesReceived; 126 int64_t mNumFramesSkipped; 127 int64_t mNumFramesLost; 128 int64_t mNumClientOwnedBuffers; 129 bool mNoMoreFramesToRead; 130 131 List<MediaBuffer * > mBuffersReceived; 132 133 void trackMaxAmplitude(int16_t *data, int nSamples); 134 135 // This is used to raise the volume from mute to the 136 // actual level linearly. 137 void rampVolume( 138 int32_t startFrame, int32_t rampDurationFrames, 139 uint8_t *data, size_t bytes); 140 141 void queueInputBuffer_l(MediaBuffer *buffer, int64_t timeUs); 142 void releaseQueuedFrames_l(); 143 void waitOutstandingEncodingFrames_l(); 144 status_t reset(); 145 146 // IAudioRecordCallback implementation 147 size_t onMoreData(const AudioRecord::Buffer&) override; 148 void onOverrun() override; 149 150 AudioSource(const AudioSource &); 151 AudioSource &operator=(const AudioSource &); 152 153 void set( 154 const audio_attributes_t *attr, 155 const AttributionSourceState& attributionSource, 156 uint32_t sampleRate, 157 uint32_t channels, 158 uint32_t outSampleRate = 0, 159 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE, 160 audio_microphone_direction_t selectedMicDirection = MIC_DIRECTION_UNSPECIFIED, 161 float selectedMicFieldDimension = MIC_FIELD_DIMENSION_NORMAL); 162 }; 163 164 } // namespace android 165 166 #endif // AUDIO_SOURCE_H_ 167