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