1e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber/*
2e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * Copyright (C) 2009 The Android Open Source Project
3e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber *
4e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * you may not use this file except in compliance with the License.
6e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * You may obtain a copy of the License at
7e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber *
8e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber *
10e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * Unless required by applicable law or agreed to in writing, software
11e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * See the License for the specific language governing permissions and
14e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * limitations under the License.
15e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber */
16e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
17e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#ifndef AUDIO_SOURCE_H_
18e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
19e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#define AUDIO_SOURCE_H_
20e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
2107bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber#include <media/AudioSystem.h>
22e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <media/stagefright/MediaSource.h>
23e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
24e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubernamespace android {
25e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
26e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass AudioRecord;
2707bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huberstruct MediaBufferGroup;
28e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
2907bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huberstruct AudioSource : public MediaSource {
3007bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    // Note that the "channels" parameter is _not_ the number of channels,
3107bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    // but a bitmask of AudioSystem::audio_channels constants.
3207bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    AudioSource(
3307bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber            int inputSource, uint32_t sampleRate,
3407bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber            uint32_t channels = AudioSystem::CHANNEL_IN_MONO);
35e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
36e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    status_t initCheck() const;
37e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
38e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual status_t start(MetaData *params = NULL);
39e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual status_t stop();
40e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual sp<MetaData> getFormat();
41e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
4257e7f83c0336db3f03666f077bce4c2692a88cf6James Dong    // Returns the maximum amplitude since last call.
4357e7f83c0336db3f03666f077bce4c2692a88cf6James Dong    int16_t getMaxAmplitude();
4457e7f83c0336db3f03666f077bce4c2692a88cf6James Dong
45e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual status_t read(
46e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            MediaBuffer **buffer, const ReadOptions *options = NULL);
47e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
4807bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huberprotected:
4907bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    virtual ~AudioSource();
5007bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber
51e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberprivate:
52d7f1c3d69274fef8772a663ce1c792fd0466fcc5James Dong    enum {
53d7f1c3d69274fef8772a663ce1c792fd0466fcc5James Dong        kMaxBufferSize = 2048,
54d7f1c3d69274fef8772a663ce1c792fd0466fcc5James Dong
55d7f1c3d69274fef8772a663ce1c792fd0466fcc5James Dong        // After the initial mute, we raise the volume linearly
56d7f1c3d69274fef8772a663ce1c792fd0466fcc5James Dong        // over kAutoRampDurationUs.
57a7ac739b74428539ad8087a389c9de81081d1a93James Dong        kAutoRampDurationUs = 700000,
58d7f1c3d69274fef8772a663ce1c792fd0466fcc5James Dong
59d7f1c3d69274fef8772a663ce1c792fd0466fcc5James Dong        // This is the initial mute duration to suppress
60d7f1c3d69274fef8772a663ce1c792fd0466fcc5James Dong        // the video recording signal tone
61a7ac739b74428539ad8087a389c9de81081d1a93James Dong        kAutoRampStartUs = 1000000,
62d7f1c3d69274fef8772a663ce1c792fd0466fcc5James Dong      };
6307bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber
64e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    AudioRecord *mRecord;
65e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    status_t mInitCheck;
6607bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    bool mStarted;
67dae9fd31907c62712f7a96bb2a8e288b0cca57c2James Dong
68dae9fd31907c62712f7a96bb2a8e288b0cca57c2James Dong    bool mCollectStats;
6957e7f83c0336db3f03666f077bce4c2692a88cf6James Dong    bool mTrackMaxAmplitude;
7036e573bf7db5888f92c52eda26e0771aaa2406e4James Dong    int64_t mStartTimeUs;
7157e7f83c0336db3f03666f077bce4c2692a88cf6James Dong    int16_t mMaxAmplitude;
72c3ae937a95cbaf4afbe8aa006dc3db4c27f0ad44James Dong    int64_t mPrevSampleTimeUs;
73afe5305855e2f3d830337f768028615a44d4aa16James Dong    int64_t mTotalLostFrames;
74afe5305855e2f3d830337f768028615a44d4aa16James Dong    int64_t mPrevLostBytes;
754c23815c3986e50f0cfad3976d748e600f1befa2James Dong    int64_t mInitialReadTimeUs;
76dae9fd31907c62712f7a96bb2a8e288b0cca57c2James Dong
7707bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    MediaBufferGroup *mGroup;
78e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
7957e7f83c0336db3f03666f077bce4c2692a88cf6James Dong    void trackMaxAmplitude(int16_t *data, int nSamples);
8057e7f83c0336db3f03666f077bce4c2692a88cf6James Dong
81d7f1c3d69274fef8772a663ce1c792fd0466fcc5James Dong    // This is used to raise the volume from mute to the
82d7f1c3d69274fef8772a663ce1c792fd0466fcc5James Dong    // actual level linearly.
83d7f1c3d69274fef8772a663ce1c792fd0466fcc5James Dong    void rampVolume(
84d7f1c3d69274fef8772a663ce1c792fd0466fcc5James Dong        int32_t startFrame, int32_t rampDurationFrames,
85d7f1c3d69274fef8772a663ce1c792fd0466fcc5James Dong        uint8_t *data,   size_t bytes);
86d7f1c3d69274fef8772a663ce1c792fd0466fcc5James Dong
87e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    AudioSource(const AudioSource &);
88e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    AudioSource &operator=(const AudioSource &);
89e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber};
90e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
91e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber}  // namespace android
92e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
93e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#endif  // AUDIO_SOURCE_H_
94