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
76e2ffd5b583da9d30d96710b0e8879e90b2b51d30Glenn Kasten    sp<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