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, 38be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov const String16 &opPackageName, 39082830f92373a1b9e512dbbfb940187ffa1c2c6fAndreas Huber uint32_t sampleRate, 4046d26dd29195450db15704e84d65740628a821fbChong Zhang uint32_t channels, 41b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent uint32_t outSampleRate = 0, 42b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent uid_t uid = -1, 43b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent pid_t pid = -1); 4420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t initCheck() const; 4620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual status_t start(MetaData *params = NULL); 48b44c9d2bdc0d5b9cb03254022a58e017b516e9e6James Dong virtual status_t stop() { return reset(); } 4920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual sp<MetaData> getFormat(); 5020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 51d3d4e5069e1af0437c4f5a7b4ba344bda5b937afJames Dong // Returns the maximum amplitude since last call. 52d3d4e5069e1af0437c4f5a7b4ba344bda5b937afJames Dong int16_t getMaxAmplitude(); 53d3d4e5069e1af0437c4f5a7b4ba344bda5b937afJames Dong 5420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual status_t read( 5520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber MediaBuffer **buffer, const ReadOptions *options = NULL); 5620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 57082830f92373a1b9e512dbbfb940187ffa1c2c6fAndreas Huber status_t dataCallback(const AudioRecord::Buffer& buffer); 586b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong virtual void signalBufferReturned(MediaBuffer *buffer); 596b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong 60e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huberprotected: 61e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber virtual ~AudioSource(); 62e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber 6320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprivate: 64f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong enum { 65f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong kMaxBufferSize = 2048, 66f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong 67f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong // After the initial mute, we raise the volume linearly 68f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong // over kAutoRampDurationUs. 69a472613aec322e25891abf5c77bf3f7e3c244920James Dong kAutoRampDurationUs = 300000, 70f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong 71f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong // This is the initial mute duration to suppress 72f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong // the video recording signal tone 73a472613aec322e25891abf5c77bf3f7e3c244920James Dong kAutoRampStartUs = 0, 74a472613aec322e25891abf5c77bf3f7e3c244920James Dong }; 75e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber 766b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong Mutex mLock; 776b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong Condition mFrameAvailableCondition; 786b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong Condition mFrameEncodingCompletionCondition; 796b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong 80e2ffd5b583da9d30d96710b0e8879e90b2b51d30Glenn Kasten sp<AudioRecord> mRecord; 8120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t mInitCheck; 82e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber bool mStarted; 836b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong int32_t mSampleRate; 8446d26dd29195450db15704e84d65740628a821fbChong Zhang int32_t mOutSampleRate; 85365a963142093a1cd8efdcea76b5f65096a5b115James Dong 86d3d4e5069e1af0437c4f5a7b4ba344bda5b937afJames Dong bool mTrackMaxAmplitude; 87f60cafe0e6aad8f9ce54660fa88b651ae4e749e6James Dong int64_t mStartTimeUs; 88d3d4e5069e1af0437c4f5a7b4ba344bda5b937afJames Dong int16_t mMaxAmplitude; 8946292fb347d72a314d985e34e5e3743d846cb9b6James Dong int64_t mPrevSampleTimeUs; 90d707fcb3e29707ca4a5935c294ef0b38eb5aba5fJames Dong int64_t mInitialReadTimeUs; 916b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong int64_t mNumFramesReceived; 924f998cdef97b9c027f145b2da5c48278e19c3d33Hangyu Kuang int64_t mNumFramesSkipped; 934f998cdef97b9c027f145b2da5c48278e19c3d33Hangyu Kuang int64_t mNumFramesLost; 946b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong int64_t mNumClientOwnedBuffers; 95365a963142093a1cd8efdcea76b5f65096a5b115James Dong 966b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong List<MediaBuffer * > mBuffersReceived; 9720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 98d3d4e5069e1af0437c4f5a7b4ba344bda5b937afJames Dong void trackMaxAmplitude(int16_t *data, int nSamples); 99d3d4e5069e1af0437c4f5a7b4ba344bda5b937afJames Dong 100f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong // This is used to raise the volume from mute to the 101f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong // actual level linearly. 102f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong void rampVolume( 103f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong int32_t startFrame, int32_t rampDurationFrames, 104f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong uint8_t *data, size_t bytes); 105f1ae1963f5028a670573b50a9c1cfb504fc426b4James Dong 106b575ddce78d266fa218006f90306158dda5c8f56James Dong void queueInputBuffer_l(MediaBuffer *buffer, int64_t timeUs); 1076b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong void releaseQueuedFrames_l(); 1086b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong void waitOutstandingEncodingFrames_l(); 109b44c9d2bdc0d5b9cb03254022a58e017b516e9e6James Dong status_t reset(); 1106b61f4355db1974cd0f0dfaa4effdd7117b9f09bJames Dong 11120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber AudioSource(const AudioSource &); 11220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber AudioSource &operator=(const AudioSource &); 11320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 11420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 11520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} // namespace android 11620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 11720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif // AUDIO_SOURCE_H_ 118