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