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 { 34082830f92373a1b9e512dbbfb940187ffa1c2c6fAndreas Huber // Note that the "channels" parameter _is_ the number of channels, 35082830f92373a1b9e512dbbfb940187ffa1c2c6fAndreas Huber // _not_ a bitmask of audio_channels_t constants. 36e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber AudioSource( 37082830f92373a1b9e512dbbfb940187ffa1c2c6fAndreas Huber audio_source_t inputSource, 38082830f92373a1b9e512dbbfb940187ffa1c2c6fAndreas Huber uint32_t sampleRate, 39082830f92373a1b9e512dbbfb940187ffa1c2c6fAndreas Huber uint32_t channels = 1); 4020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t initCheck() const; 4220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual status_t start(MetaData *params = NULL); 44b44c9d2bdc0d5b9cb03254022a58e017b516e9e6James Dong virtual status_t stop() { return reset(); } 4520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual sp<MetaData> getFormat(); 4620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 47d3d4e5069e1af0437c4f5a7b4ba344bda5b937afJames Dong // Returns the maximum amplitude since last call. 48d3d4e5069e1af0437c4f5a7b4ba344bda5b937afJames Dong int16_t getMaxAmplitude(); 49d3d4e5069e1af0437c4f5a7b4ba344bda5b937afJames Dong 5020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual status_t read( 5120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber MediaBuffer **buffer, const ReadOptions *options = NULL); 5220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 53082830f92373a1b9e512dbbfb940187ffa1c2c6fAndreas Huber status_t dataCallback(const AudioRecord::Buffer& buffer); 546b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong virtual void signalBufferReturned(MediaBuffer *buffer); 556b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong 56e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huberprotected: 57e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber virtual ~AudioSource(); 58e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber 5920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprivate: 60f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong enum { 61f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong kMaxBufferSize = 2048, 62f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong 63f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong // After the initial mute, we raise the volume linearly 64f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong // over kAutoRampDurationUs. 65a472613aec322e25891abf5c77bf3f7e3c244920James Dong kAutoRampDurationUs = 300000, 66f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong 67f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong // This is the initial mute duration to suppress 68f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong // the video recording signal tone 69a472613aec322e25891abf5c77bf3f7e3c244920James Dong kAutoRampStartUs = 0, 70a472613aec322e25891abf5c77bf3f7e3c244920James Dong }; 71e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber 726b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong Mutex mLock; 736b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong Condition mFrameAvailableCondition; 746b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong Condition mFrameEncodingCompletionCondition; 756b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong 7620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber AudioRecord *mRecord; 7720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t mInitCheck; 78e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber bool mStarted; 796b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong int32_t mSampleRate; 80365a963142093a1cd8efdcea76b5f65096a5b115James Dong 81d3d4e5069e1af0437c4f5a7b4ba344bda5b937afJames Dong bool mTrackMaxAmplitude; 82f60cafe0e6aad8f9ce54660fa88b651ae4e749e6James Dong int64_t mStartTimeUs; 83d3d4e5069e1af0437c4f5a7b4ba344bda5b937afJames Dong int16_t mMaxAmplitude; 8446292fb347d72a314d985e34e5e3743d846cb9b6James Dong int64_t mPrevSampleTimeUs; 85d707fcb3e29707ca4a5935c294ef0b38eb5aba5fJames Dong int64_t mInitialReadTimeUs; 866b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong int64_t mNumFramesReceived; 876b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong int64_t mNumClientOwnedBuffers; 88365a963142093a1cd8efdcea76b5f65096a5b115James Dong 896b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong List<MediaBuffer * > mBuffersReceived; 9020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 91d3d4e5069e1af0437c4f5a7b4ba344bda5b937afJames Dong void trackMaxAmplitude(int16_t *data, int nSamples); 92d3d4e5069e1af0437c4f5a7b4ba344bda5b937afJames Dong 93f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong // This is used to raise the volume from mute to the 94f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong // actual level linearly. 95f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong void rampVolume( 96f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong int32_t startFrame, int32_t rampDurationFrames, 97f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong uint8_t *data, size_t bytes); 98f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong 99b575ddce78d266fa218006f90306158dda5c8f56James Dong void queueInputBuffer_l(MediaBuffer *buffer, int64_t timeUs); 1006b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong void releaseQueuedFrames_l(); 1016b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong void waitOutstandingEncodingFrames_l(); 102b44c9d2bdc0d5b9cb03254022a58e017b516e9e6James Dong status_t reset(); 1036b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong 10420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber AudioSource(const AudioSource &); 10520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber AudioSource &operator=(const AudioSource &); 10620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 10720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 10820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} // namespace android 10920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 11020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif // AUDIO_SOURCE_H_ 111