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 ×tamp, 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