• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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