1d5a2a63bSopenharmony_ci/*
2d5a2a63bSopenharmony_ci * Copyright (c) 2020-2021 Huawei Device Co., Ltd.
3d5a2a63bSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4d5a2a63bSopenharmony_ci * you may not use this file except in compliance with the License.
5d5a2a63bSopenharmony_ci * You may obtain a copy of the License at
6d5a2a63bSopenharmony_ci *
7d5a2a63bSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8d5a2a63bSopenharmony_ci *
9d5a2a63bSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10d5a2a63bSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11d5a2a63bSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12d5a2a63bSopenharmony_ci * See the License for the specific language governing permissions and
13d5a2a63bSopenharmony_ci * limitations under the License.
14d5a2a63bSopenharmony_ci */
15d5a2a63bSopenharmony_ci
16d5a2a63bSopenharmony_ci/**
17d5a2a63bSopenharmony_ci * @addtogroup MultiMedia_AudioCapturer
18d5a2a63bSopenharmony_ci * @{
19d5a2a63bSopenharmony_ci *
20d5a2a63bSopenharmony_ci * @brief Declares APIs in the <b>AudioCapturer</b> class for audio capture.
21d5a2a63bSopenharmony_ci *
22d5a2a63bSopenharmony_ci *
23d5a2a63bSopenharmony_ci * @since 1.0
24d5a2a63bSopenharmony_ci * @version 1.0
25d5a2a63bSopenharmony_ci */
26d5a2a63bSopenharmony_ci
27d5a2a63bSopenharmony_ci/**
28d5a2a63bSopenharmony_ci * @file audio_capturer.h
29d5a2a63bSopenharmony_ci *
30d5a2a63bSopenharmony_ci * @brief Provides the <b>AudioCapturer</b> class to implement operations related to audio capture.
31d5a2a63bSopenharmony_ci *
32d5a2a63bSopenharmony_ci *
33d5a2a63bSopenharmony_ci * @since 1.0
34d5a2a63bSopenharmony_ci * @version 1.0
35d5a2a63bSopenharmony_ci */
36d5a2a63bSopenharmony_ci
37d5a2a63bSopenharmony_ci#ifndef AUDIO_CAPTURER_H
38d5a2a63bSopenharmony_ci#define AUDIO_CAPTURER_H
39d5a2a63bSopenharmony_ci
40d5a2a63bSopenharmony_ci#include <cstddef>
41d5a2a63bSopenharmony_ci#include <cstdint>
42d5a2a63bSopenharmony_ci#include <time.h>
43d5a2a63bSopenharmony_ci#include <memory>
44d5a2a63bSopenharmony_ci
45d5a2a63bSopenharmony_ci#include "media_errors.h"
46d5a2a63bSopenharmony_ci#include "media_info.h"
47d5a2a63bSopenharmony_ci
48d5a2a63bSopenharmony_cinamespace OHOS {
49d5a2a63bSopenharmony_cinamespace Audio {
50d5a2a63bSopenharmony_ci/**
51d5a2a63bSopenharmony_ci * @brief Defines information about audio capture parameters, including the input source, audio codec format,sampling
52d5a2a63bSopenharmony_ci * rate (Hz), number of audio channels, bit rate, and bit width.
53d5a2a63bSopenharmony_ci *
54d5a2a63bSopenharmony_ci * @since 1.0
55d5a2a63bSopenharmony_ci * @version 1.0
56d5a2a63bSopenharmony_ci */
57d5a2a63bSopenharmony_cistruct AudioCapturerInfo {
58d5a2a63bSopenharmony_ci    /** Audio source type */
59d5a2a63bSopenharmony_ci    AudioSourceType inputSource = AUDIO_MIC;
60d5a2a63bSopenharmony_ci    /** Audio codec format */
61d5a2a63bSopenharmony_ci    AudioCodecFormat audioFormat = AUDIO_DEFAULT;
62d5a2a63bSopenharmony_ci    /** Sampling rate */
63d5a2a63bSopenharmony_ci    int32_t sampleRate = 0;
64d5a2a63bSopenharmony_ci    /** Number of audio channels */
65d5a2a63bSopenharmony_ci    int32_t channelCount = 0;
66d5a2a63bSopenharmony_ci    /** Bit rate */
67d5a2a63bSopenharmony_ci    int32_t bitRate = 0;
68d5a2a63bSopenharmony_ci    /** Audio stream type */
69d5a2a63bSopenharmony_ci    AudioStreamType streamType = TYPE_MEDIA;
70d5a2a63bSopenharmony_ci    /** Bit width */
71d5a2a63bSopenharmony_ci    AudioBitWidth bitWidth = BIT_WIDTH_16;
72d5a2a63bSopenharmony_ci};
73d5a2a63bSopenharmony_ci
74d5a2a63bSopenharmony_ci/**
75d5a2a63bSopenharmony_ci * @brief Represents timestamp information, including the frame position information and high-resolution time source.
76d5a2a63bSopenharmony_ci *
77d5a2a63bSopenharmony_ci * @since 1.0
78d5a2a63bSopenharmony_ci * @version 1.0
79d5a2a63bSopenharmony_ci */
80d5a2a63bSopenharmony_ciclass Timestamp {
81d5a2a63bSopenharmony_cipublic:
82d5a2a63bSopenharmony_ci    Timestamp() : framePosition(0)
83d5a2a63bSopenharmony_ci    {
84d5a2a63bSopenharmony_ci        time.tv_sec = 0;
85d5a2a63bSopenharmony_ci        time.tv_nsec = 0;
86d5a2a63bSopenharmony_ci    }
87d5a2a63bSopenharmony_ci    ~Timestamp() = default;
88d5a2a63bSopenharmony_ci    uint32_t framePosition;
89d5a2a63bSopenharmony_ci    struct timespec time;
90d5a2a63bSopenharmony_ci
91d5a2a63bSopenharmony_ci    /**
92d5a2a63bSopenharmony_ci     * @brief Enumerates the time base of this <b>Timestamp</b>. Different timing methods are supported.
93d5a2a63bSopenharmony_ci     *
94d5a2a63bSopenharmony_ci     */
95d5a2a63bSopenharmony_ci    enum class Timebase : int32_t {
96d5a2a63bSopenharmony_ci        /** Monotonically increasing time, excluding the system sleep time */
97d5a2a63bSopenharmony_ci        MONOTONIC = 0,
98d5a2a63bSopenharmony_ci        /** Monotonically increasing time, including the system sleep time */
99d5a2a63bSopenharmony_ci        BOOTTIME = 1
100d5a2a63bSopenharmony_ci        };
101d5a2a63bSopenharmony_ci};
102d5a2a63bSopenharmony_ci
103d5a2a63bSopenharmony_ci/**
104d5a2a63bSopenharmony_ci * @brief Enumerates the recording states of the current device.
105d5a2a63bSopenharmony_ci *
106d5a2a63bSopenharmony_ci * @since 1.0
107d5a2a63bSopenharmony_ci * @version 1.0
108d5a2a63bSopenharmony_ci */
109d5a2a63bSopenharmony_cienum State : uint32_t {
110d5a2a63bSopenharmony_ci    /** Initialized */
111d5a2a63bSopenharmony_ci    INITIALIZED,
112d5a2a63bSopenharmony_ci    /** Prepared */
113d5a2a63bSopenharmony_ci    PREPARED,
114d5a2a63bSopenharmony_ci    /** Recording */
115d5a2a63bSopenharmony_ci    RECORDING,
116d5a2a63bSopenharmony_ci    /** Stopped */
117d5a2a63bSopenharmony_ci    STOPPED,
118d5a2a63bSopenharmony_ci    /** Released */
119d5a2a63bSopenharmony_ci    RELEASED
120d5a2a63bSopenharmony_ci};
121d5a2a63bSopenharmony_ci
122d5a2a63bSopenharmony_ci/**
123d5a2a63bSopenharmony_ci * @brief Provides functions for applications to implement audio capturing.
124d5a2a63bSopenharmony_ci *
125d5a2a63bSopenharmony_ci * @since 1.0
126d5a2a63bSopenharmony_ci * @version 1.0
127d5a2a63bSopenharmony_ci */
128d5a2a63bSopenharmony_ciclass AudioCapturer {
129d5a2a63bSopenharmony_cipublic:
130d5a2a63bSopenharmony_ci    AudioCapturer();
131d5a2a63bSopenharmony_ci    virtual ~AudioCapturer();
132d5a2a63bSopenharmony_ci
133d5a2a63bSopenharmony_ci    /**
134d5a2a63bSopenharmony_ci     * @brief Obtains the minimum number of frames required in a specified condition, in bytes per sample.
135d5a2a63bSopenharmony_ci     *
136d5a2a63bSopenharmony_ci     * @param sampleRate Indicates the audio sampling rate, in Hz.
137d5a2a63bSopenharmony_ci     * @param channelCount Indicates the number of audio recording channels.
138d5a2a63bSopenharmony_ci     * @param audioFormat Indicates the audio data format.
139d5a2a63bSopenharmony_ci     * @param frameCount Indicates the minimum number of frames, in bytes per sample.
140d5a2a63bSopenharmony_ci     * @return Returns <b>true</b> if the minimum number of frames is successfully obtained; returns <b>false</b>
141d5a2a63bSopenharmony_ci     * otherwise.
142d5a2a63bSopenharmony_ci     * @since 1.0
143d5a2a63bSopenharmony_ci     * @version 1.0
144d5a2a63bSopenharmony_ci     */
145d5a2a63bSopenharmony_ci    static bool GetMinFrameCount(int32_t sampleRate, int32_t channelCount, AudioCodecFormat audioFormat,
146d5a2a63bSopenharmony_ci                                size_t &frameCount);
147d5a2a63bSopenharmony_ci
148d5a2a63bSopenharmony_ci    /**
149d5a2a63bSopenharmony_ci     * @brief Obtains the number of frames required in the current condition, in bytes per sample.
150d5a2a63bSopenharmony_ci     *
151d5a2a63bSopenharmony_ci     * @return Returns the number of frames (in bytes per sample) if the operation is successful; returns <b>-1</b>
152d5a2a63bSopenharmony_ci     * if an exception occurs.
153d5a2a63bSopenharmony_ci     * @since 1.0
154d5a2a63bSopenharmony_ci     * @version 1.0
155d5a2a63bSopenharmony_ci     */
156d5a2a63bSopenharmony_ci    uint64_t GetFrameCount();
157d5a2a63bSopenharmony_ci
158d5a2a63bSopenharmony_ci    /**
159d5a2a63bSopenharmony_ci     * @brief Sets audio capture parameters.
160d5a2a63bSopenharmony_ci     *
161d5a2a63bSopenharmony_ci     * @param info Indicates information about audio capture parameters to set. For details, see
162d5a2a63bSopenharmony_ci     * {@link AudioCapturerInfo}.
163d5a2a63bSopenharmony_ci     * @return Returns {@link SUCCESS} if the setting is successful; returns an error code defined
164d5a2a63bSopenharmony_ci     * in {@link media_errors.h} otherwise.
165d5a2a63bSopenharmony_ci     * @since 1.0
166d5a2a63bSopenharmony_ci     * @version 1.0
167d5a2a63bSopenharmony_ci     */
168d5a2a63bSopenharmony_ci    int32_t SetCapturerInfo(const AudioCapturerInfo info);
169d5a2a63bSopenharmony_ci
170d5a2a63bSopenharmony_ci    /**
171d5a2a63bSopenharmony_ci     * @brief Obtains audio capture parameters.
172d5a2a63bSopenharmony_ci     *
173d5a2a63bSopenharmony_ci     * This function can be called after {@link SetCapturerInfo} is successful.
174d5a2a63bSopenharmony_ci     *
175d5a2a63bSopenharmony_ci     * @param info Indicates information about audio capture parameters. For details, see {@link AudioCapturerInfo}.
176d5a2a63bSopenharmony_ci     * @return Returns {@link SUCCESS} if the parameter information is successfully obtained; returns an error code
177d5a2a63bSopenharmony_ci     * defined in {@link media_errors.h} otherwise.
178d5a2a63bSopenharmony_ci     * @since 1.0
179d5a2a63bSopenharmony_ci     * @version 1.0
180d5a2a63bSopenharmony_ci     */
181d5a2a63bSopenharmony_ci    int32_t GetCapturerInfo(AudioCapturerInfo &info);
182d5a2a63bSopenharmony_ci
183d5a2a63bSopenharmony_ci    /**
184d5a2a63bSopenharmony_ci     * @brief Starts audio recording.
185d5a2a63bSopenharmony_ci     *
186d5a2a63bSopenharmony_ci     * @return Returns <b>true</b> if the recording is successfully started; returns <b>false</b> otherwise.
187d5a2a63bSopenharmony_ci     * @since 1.0
188d5a2a63bSopenharmony_ci     * @version 1.0
189d5a2a63bSopenharmony_ci     */
190d5a2a63bSopenharmony_ci    bool Start();
191d5a2a63bSopenharmony_ci
192d5a2a63bSopenharmony_ci    /**
193d5a2a63bSopenharmony_ci     * @brief Reads audio data.
194d5a2a63bSopenharmony_ci     *
195d5a2a63bSopenharmony_ci     * @param buffer Indicates the pointer to the buffer into which the audio data is to be written.
196d5a2a63bSopenharmony_ci     * @param userSize Indicates the size of the buffer into which the audio data is to be written, in bytes.
197d5a2a63bSopenharmony_ci     * <b>userSize >= frameCount * channelCount * BytesPerSample</b> must evaluate to <b>true</b>. You can call
198d5a2a63bSopenharmony_ci     * {@link GetFrameCount} to obtain the <b>frameCount</b> value.
199d5a2a63bSopenharmony_ci     * @param isBlockingRead Specifies whether data reading will be blocked.
200d5a2a63bSopenharmony_ci     * @return Returns the size of the audio data read from the device. The value ranges from <b>0</b> to
201d5a2a63bSopenharmony_ci     * <b>userSize</b>. If the reading fails, one of the following error codes is returned:
202d5a2a63bSopenharmony_ci     * <b>ERR_INVALID_PARAM</b>: The input parameter is incorrect.
203d5a2a63bSopenharmony_ci     * <b>ERR_ILLEGAL_STATE</b>: The <b>AudioCapturer</b> instance is not initialized.
204d5a2a63bSopenharmony_ci     * <b>ERR_SOURCE_NOT_SET</b>: The state of hardware device instance is abnormal.
205d5a2a63bSopenharmony_ci     * @since 1.0
206d5a2a63bSopenharmony_ci     * @version 1.0
207d5a2a63bSopenharmony_ci     */
208d5a2a63bSopenharmony_ci    int32_t Read(uint8_t *buffer, size_t userSize, bool isBlockingRead);
209d5a2a63bSopenharmony_ci
210d5a2a63bSopenharmony_ci    /**
211d5a2a63bSopenharmony_ci     * @brief Obtains the audio capture state.
212d5a2a63bSopenharmony_ci     *
213d5a2a63bSopenharmony_ci     * @return Returns the audio capture state defined in {@link State}.
214d5a2a63bSopenharmony_ci     * @since 1.0
215d5a2a63bSopenharmony_ci     * @version 1.0
216d5a2a63bSopenharmony_ci     */
217d5a2a63bSopenharmony_ci    State GetStatus();
218d5a2a63bSopenharmony_ci
219d5a2a63bSopenharmony_ci    /**
220d5a2a63bSopenharmony_ci     * @brief Obtains the timestamp.
221d5a2a63bSopenharmony_ci     *
222d5a2a63bSopenharmony_ci     * @param timestamp Indicates a {@link Timestamp} instance reference provided by the caller.
223d5a2a63bSopenharmony_ci     * @param base Indicates the time base, which can be {@link Timestamp.Timebase#BOOTTIME Timestamp.Timebase.BOOTTIME}
224d5a2a63bSopenharmony_ci     * or {@link Timestamp.Timebase#MONOTONIC Timestamp.Timebase.MONOTONIC}.
225d5a2a63bSopenharmony_ci     * @return Returns <b>true</b> if the timestamp is successfully obtained; returns <b>false</b> otherwise.
226d5a2a63bSopenharmony_ci     * @since 1.0
227d5a2a63bSopenharmony_ci     * @version 1.0
228d5a2a63bSopenharmony_ci     */
229d5a2a63bSopenharmony_ci    bool GetAudioTime(Timestamp &timestamp, Timestamp::Timebase base);
230d5a2a63bSopenharmony_ci
231d5a2a63bSopenharmony_ci    /**
232d5a2a63bSopenharmony_ci     * @brief Stops audio recording.
233d5a2a63bSopenharmony_ci     *
234d5a2a63bSopenharmony_ci     * @return Returns <b>true</b> if the recording is successfully stopped; returns <b>false</b> otherwise.
235d5a2a63bSopenharmony_ci     * @since 1.0
236d5a2a63bSopenharmony_ci     * @version 1.0
237d5a2a63bSopenharmony_ci     */
238d5a2a63bSopenharmony_ci    bool Stop();
239d5a2a63bSopenharmony_ci
240d5a2a63bSopenharmony_ci    /**
241d5a2a63bSopenharmony_ci     * @brief Releases a local <b>AudioCapturer</b> object.
242d5a2a63bSopenharmony_ci     *
243d5a2a63bSopenharmony_ci     * @return Returns <b>true</b> if the object is successfully released; returns <b>false</b> otherwise.
244d5a2a63bSopenharmony_ci     * @since 1.0
245d5a2a63bSopenharmony_ci     * @version 1.0
246d5a2a63bSopenharmony_ci     */
247d5a2a63bSopenharmony_ci    bool Release();
248d5a2a63bSopenharmony_ci
249d5a2a63bSopenharmony_ciprivate:
250d5a2a63bSopenharmony_ci    class AudioCapturerClient;
251d5a2a63bSopenharmony_ci    std::unique_ptr<AudioCapturerClient> impl_;
252d5a2a63bSopenharmony_ci};
253d5a2a63bSopenharmony_ci}  // namespace Audio
254d5a2a63bSopenharmony_ci}  // namespace OHOS
255d5a2a63bSopenharmony_ci#endif  // AUDIO_CAPTURER_H
256