1e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber/* 2e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * Copyright (C) 2009 The Android Open Source Project 3e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * 4e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * you may not use this file except in compliance with the License. 6e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * You may obtain a copy of the License at 7e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * 8e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * 10e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * Unless required by applicable law or agreed to in writing, software 11e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * See the License for the specific language governing permissions and 14e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * limitations under the License. 15e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber */ 16e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 17e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#ifndef AUDIO_SOURCE_H_ 18e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 19e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#define AUDIO_SOURCE_H_ 20e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 2107bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber#include <media/AudioSystem.h> 22e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <media/stagefright/MediaSource.h> 23e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 24e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubernamespace android { 25e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 26e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass AudioRecord; 2707bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huberstruct MediaBufferGroup; 28e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 2907bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huberstruct AudioSource : public MediaSource { 3007bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber // Note that the "channels" parameter is _not_ the number of channels, 3107bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber // but a bitmask of AudioSystem::audio_channels constants. 3207bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber AudioSource( 3307bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber int inputSource, uint32_t sampleRate, 3407bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber uint32_t channels = AudioSystem::CHANNEL_IN_MONO); 35e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 36e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber status_t initCheck() const; 37e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 38e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber virtual status_t start(MetaData *params = NULL); 39e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber virtual status_t stop(); 40e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber virtual sp<MetaData> getFormat(); 41e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 4257e7f83c0336db3f03666f077bce4c2692a88cf6James Dong // Returns the maximum amplitude since last call. 4357e7f83c0336db3f03666f077bce4c2692a88cf6James Dong int16_t getMaxAmplitude(); 4457e7f83c0336db3f03666f077bce4c2692a88cf6James Dong 45e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber virtual status_t read( 46e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber MediaBuffer **buffer, const ReadOptions *options = NULL); 47e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 4807bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huberprotected: 4907bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber virtual ~AudioSource(); 5007bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber 51e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberprivate: 52d7f1c3d69274fef8772a663ce1c792fd0466fcc5James Dong enum { 53d7f1c3d69274fef8772a663ce1c792fd0466fcc5James Dong kMaxBufferSize = 2048, 54d7f1c3d69274fef8772a663ce1c792fd0466fcc5James Dong 55d7f1c3d69274fef8772a663ce1c792fd0466fcc5James Dong // After the initial mute, we raise the volume linearly 56d7f1c3d69274fef8772a663ce1c792fd0466fcc5James Dong // over kAutoRampDurationUs. 57a7ac739b74428539ad8087a389c9de81081d1a93James Dong kAutoRampDurationUs = 700000, 58d7f1c3d69274fef8772a663ce1c792fd0466fcc5James Dong 59d7f1c3d69274fef8772a663ce1c792fd0466fcc5James Dong // This is the initial mute duration to suppress 60d7f1c3d69274fef8772a663ce1c792fd0466fcc5James Dong // the video recording signal tone 61a7ac739b74428539ad8087a389c9de81081d1a93James Dong kAutoRampStartUs = 1000000, 62d7f1c3d69274fef8772a663ce1c792fd0466fcc5James Dong }; 6307bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber 64e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber AudioRecord *mRecord; 65e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber status_t mInitCheck; 6607bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber bool mStarted; 67dae9fd31907c62712f7a96bb2a8e288b0cca57c2James Dong 68dae9fd31907c62712f7a96bb2a8e288b0cca57c2James Dong bool mCollectStats; 6957e7f83c0336db3f03666f077bce4c2692a88cf6James Dong bool mTrackMaxAmplitude; 7036e573bf7db5888f92c52eda26e0771aaa2406e4James Dong int64_t mStartTimeUs; 7157e7f83c0336db3f03666f077bce4c2692a88cf6James Dong int16_t mMaxAmplitude; 72c3ae937a95cbaf4afbe8aa006dc3db4c27f0ad44James Dong int64_t mPrevSampleTimeUs; 73afe5305855e2f3d830337f768028615a44d4aa16James Dong int64_t mTotalLostFrames; 74afe5305855e2f3d830337f768028615a44d4aa16James Dong int64_t mPrevLostBytes; 754c23815c3986e50f0cfad3976d748e600f1befa2James Dong int64_t mInitialReadTimeUs; 76dae9fd31907c62712f7a96bb2a8e288b0cca57c2James Dong 7707bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber MediaBufferGroup *mGroup; 78e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 7957e7f83c0336db3f03666f077bce4c2692a88cf6James Dong void trackMaxAmplitude(int16_t *data, int nSamples); 8057e7f83c0336db3f03666f077bce4c2692a88cf6James Dong 81d7f1c3d69274fef8772a663ce1c792fd0466fcc5James Dong // This is used to raise the volume from mute to the 82d7f1c3d69274fef8772a663ce1c792fd0466fcc5James Dong // actual level linearly. 83d7f1c3d69274fef8772a663ce1c792fd0466fcc5James Dong void rampVolume( 84d7f1c3d69274fef8772a663ce1c792fd0466fcc5James Dong int32_t startFrame, int32_t rampDurationFrames, 85d7f1c3d69274fef8772a663ce1c792fd0466fcc5James Dong uint8_t *data, size_t bytes); 86d7f1c3d69274fef8772a663ce1c792fd0466fcc5James Dong 87e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber AudioSource(const AudioSource &); 88e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber AudioSource &operator=(const AudioSource &); 89e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber}; 90e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 91e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} // namespace android 92e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 93e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#endif // AUDIO_SOURCE_H_ 94