AudioSource.h revision b44c9d2bdc0d5b9cb03254022a58e017b516e9e6
120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber/* 220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Copyright (C) 2009 The Android Open Source Project 320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * you may not use this file except in compliance with the License. 620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * You may obtain a copy of the License at 720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 1020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Unless required by applicable law or agreed to in writing, software 1120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 1220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * See the License for the specific language governing permissions and 1420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * limitations under the License. 1520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber */ 1620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#ifndef AUDIO_SOURCE_H_ 1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define AUDIO_SOURCE_H_ 2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 216b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong#include <media/AudioRecord.h> 22e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber#include <media/AudioSystem.h> 2320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MediaSource.h> 246b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong#include <media/stagefright/MediaBuffer.h> 256b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong#include <utils/List.h> 2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2764760240f931714858a59c1579f07264d7182ba2Dima Zavin#include <system/audio.h> 28fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin 2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android { 3020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass AudioRecord; 3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 336b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dongstruct AudioSource : public MediaSource, public MediaBufferObserver { 34e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber // Note that the "channels" parameter is _not_ the number of channels, 35fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin // but a bitmask of audio_channels_t constants. 36e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber AudioSource( 37eba51fb3a361f67a6a64d5a16eba6084fe27d60eGlenn Kasten audio_source_t inputSource, uint32_t sampleRate, 38fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin uint32_t channels = AUDIO_CHANNEL_IN_MONO); 3920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t initCheck() const; 4120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual status_t start(MetaData *params = NULL); 43b44c9d2bdc0d5b9cb03254022a58e017b516e9e6James Dong virtual status_t stop() { return reset(); } 4420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual sp<MetaData> getFormat(); 4520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 46d3d4e5069e1af0437c4f5a7b4ba344bda5b937afJames Dong // Returns the maximum amplitude since last call. 47d3d4e5069e1af0437c4f5a7b4ba344bda5b937afJames Dong int16_t getMaxAmplitude(); 48d3d4e5069e1af0437c4f5a7b4ba344bda5b937afJames Dong 4920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual status_t read( 5020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber MediaBuffer **buffer, const ReadOptions *options = NULL); 5120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 526b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong status_t dataCallbackTimestamp(const AudioRecord::Buffer& buffer, int64_t timeUs); 536b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong virtual void signalBufferReturned(MediaBuffer *buffer); 546b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong 55e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huberprotected: 56e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber virtual ~AudioSource(); 57e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber 5820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprivate: 59f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong enum { 60f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong kMaxBufferSize = 2048, 61f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong 62f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong // After the initial mute, we raise the volume linearly 63f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong // over kAutoRampDurationUs. 64a472613aec322e25891abf5c77bf3f7e3c244920James Dong kAutoRampDurationUs = 300000, 65f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong 66f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong // This is the initial mute duration to suppress 67f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong // the video recording signal tone 68a472613aec322e25891abf5c77bf3f7e3c244920James Dong kAutoRampStartUs = 0, 69a472613aec322e25891abf5c77bf3f7e3c244920James Dong }; 70e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber 716b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong Mutex mLock; 726b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong Condition mFrameAvailableCondition; 736b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong Condition mFrameEncodingCompletionCondition; 746b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong 7520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber AudioRecord *mRecord; 7620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t mInitCheck; 77e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber bool mStarted; 786b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong int32_t mSampleRate; 79365a963142093a1cd8efdcea76b5f65096a5b115James Dong 80d3d4e5069e1af0437c4f5a7b4ba344bda5b937afJames Dong bool mTrackMaxAmplitude; 81f60cafe0e6aad8f9ce54660fa88b651ae4e749e6James Dong int64_t mStartTimeUs; 82d3d4e5069e1af0437c4f5a7b4ba344bda5b937afJames Dong int16_t mMaxAmplitude; 8346292fb347d72a314d985e34e5e3743d846cb9b6James Dong int64_t mPrevSampleTimeUs; 84d707fcb3e29707ca4a5935c294ef0b38eb5aba5fJames Dong int64_t mInitialReadTimeUs; 856b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong int64_t mNumFramesReceived; 866b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong int64_t mNumClientOwnedBuffers; 87365a963142093a1cd8efdcea76b5f65096a5b115James Dong 886b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong List<MediaBuffer * > mBuffersReceived; 8920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 90d3d4e5069e1af0437c4f5a7b4ba344bda5b937afJames Dong void trackMaxAmplitude(int16_t *data, int nSamples); 91d3d4e5069e1af0437c4f5a7b4ba344bda5b937afJames Dong 92f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong // This is used to raise the volume from mute to the 93f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong // actual level linearly. 94f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong void rampVolume( 95f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong int32_t startFrame, int32_t rampDurationFrames, 96f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong uint8_t *data, size_t bytes); 97f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong 986b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong void releaseQueuedFrames_l(); 996b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong void waitOutstandingEncodingFrames_l(); 100b44c9d2bdc0d5b9cb03254022a58e017b516e9e6James Dong status_t reset(); 1016b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong 10220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber AudioSource(const AudioSource &); 10320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber AudioSource &operator=(const AudioSource &); 10420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 10520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 10620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} // namespace android 10720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 10820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif // AUDIO_SOURCE_H_ 109