1 /*
2 * Copyright (c) 2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #ifndef LOG_TAG
17 #define LOG_TAG "OHAudioStreamManager"
18 #endif
19
20 #include "OHAudioCommon.h"
21 #include "OHAudioStreamManager.h"
22
23 namespace {
24 const std::set<OH_AudioStream_SourceType> VALID_OH_SOURCE_TYPES = {
25 AUDIOSTREAM_SOURCE_TYPE_MIC,
26 AUDIOSTREAM_SOURCE_TYPE_VOICE_RECOGNITION,
27 AUDIOSTREAM_SOURCE_TYPE_PLAYBACK_CAPTURE,
28 AUDIOSTREAM_SOURCE_TYPE_VOICE_CALL,
29 AUDIOSTREAM_SOURCE_TYPE_VOICE_COMMUNICATION,
30 AUDIOSTREAM_SOURCE_TYPE_VOICE_MESSAGE,
31 AUDIOSTREAM_SOURCE_TYPE_CAMCORDER,
32 AUDIOSTREAM_SOURCE_TYPE_UNPROCESSED,
33 AUDIOSTREAM_SOURCE_TYPE_LIVE
34 };
35
36 const std::set<OH_AudioStream_Usage> VALID_OH_STREAM_USAGES = {
37 AUDIOSTREAM_USAGE_UNKNOWN,
38 AUDIOSTREAM_USAGE_MUSIC,
39 AUDIOSTREAM_USAGE_VOICE_COMMUNICATION,
40 AUDIOSTREAM_USAGE_VOICE_ASSISTANT,
41 AUDIOSTREAM_USAGE_ALARM,
42 AUDIOSTREAM_USAGE_VOICE_MESSAGE,
43 AUDIOSTREAM_USAGE_RINGTONE,
44 AUDIOSTREAM_USAGE_NOTIFICATION,
45 AUDIOSTREAM_USAGE_ACCESSIBILITY,
46 AUDIOSTREAM_USAGE_MOVIE,
47 AUDIOSTREAM_USAGE_GAME,
48 AUDIOSTREAM_USAGE_AUDIOBOOK,
49 AUDIOSTREAM_USAGE_NAVIGATION,
50 AUDIOSTREAM_USAGE_VIDEO_COMMUNICATION
51 };
52 }
53
54 using OHOS::AudioStandard::OHAudioStreamManager;
55 using OHOS::AudioStandard::AudioStreamManager;
56 using OHOS::AudioStandard::AudioStreamInfo;
57 using OHOS::AudioStandard::AudioSamplingRate;
58 using OHOS::AudioStandard::AudioEncodingType;
59 using OHOS::AudioStandard::AudioSampleFormat;
60 using OHOS::AudioStandard::AudioChannel;
61 using OHOS::AudioStandard::AudioChannelLayout;
62 using OHOS::AudioStandard::StreamUsage;
63 using OHOS::AudioStandard::DirectPlaybackMode;
64 using OHOS::AudioStandard::SourceType;
65
convertManager(OH_AudioStreamManager * manager)66 static OHOS::AudioStandard::OHAudioStreamManager *convertManager(OH_AudioStreamManager *manager)
67 {
68 return (OHAudioStreamManager*) manager;
69 }
70
OH_AudioManager_GetAudioStreamManager(OH_AudioStreamManager ** streamManager)71 OH_AudioCommon_Result OH_AudioManager_GetAudioStreamManager(OH_AudioStreamManager **streamManager)
72 {
73 CHECK_AND_RETURN_RET_LOG(streamManager != nullptr, AUDIOCOMMON_RESULT_ERROR_SYSTEM,
74 "streamManager is nullptr");
75 OHAudioStreamManager *ohAudioStreamManager = OHAudioStreamManager::GetInstance();
76 *streamManager = reinterpret_cast<OH_AudioStreamManager*>(ohAudioStreamManager);
77 return AUDIOCOMMON_RESULT_SUCCESS;
78 }
79
convertStreamInfo(OH_AudioStreamInfo * streamInfo)80 static OHOS::AudioStandard::AudioStreamInfo convertStreamInfo(OH_AudioStreamInfo *streamInfo)
81 {
82 return AudioStreamInfo(static_cast<AudioSamplingRate>(streamInfo->samplingRate),
83 static_cast<AudioEncodingType>(streamInfo->encodingType),
84 static_cast<AudioSampleFormat>(streamInfo->sampleFormat),
85 OHOS::AudioStandard::OHAudioCommon::ConvertLayoutToChannel(streamInfo->channelLayout),
86 static_cast<AudioChannelLayout>(streamInfo->channelLayout));
87 }
88
OH_AudioStreamManager_GetDirectPlaybackSupport(OH_AudioStreamManager * audioStreamManager,OH_AudioStreamInfo * streamInfo,OH_AudioStream_Usage usage,OH_AudioStream_DirectPlaybackMode * directPlaybackMode)89 OH_AudioCommon_Result OH_AudioStreamManager_GetDirectPlaybackSupport(
90 OH_AudioStreamManager *audioStreamManager, OH_AudioStreamInfo *streamInfo,
91 OH_AudioStream_Usage usage, OH_AudioStream_DirectPlaybackMode *directPlaybackMode)
92 {
93 OHAudioStreamManager *ohAudioStreamManager = convertManager(audioStreamManager);
94 CHECK_AND_RETURN_RET_LOG(ohAudioStreamManager != nullptr,
95 AUDIOCOMMON_RESULT_ERROR_INVALID_PARAM, "ohAudioStreamManager is nullptr");
96 CHECK_AND_RETURN_RET_LOG(streamInfo != nullptr, AUDIOCOMMON_RESULT_ERROR_INVALID_PARAM, "streamInfo is nullptr");
97 CHECK_AND_RETURN_RET_LOG(usage > AUDIOSTREAM_USAGE_UNKNOWN, AUDIOCOMMON_RESULT_ERROR_INVALID_PARAM,
98 "usage is invalid");
99 CHECK_AND_RETURN_RET_LOG(directPlaybackMode != nullptr, AUDIOCOMMON_RESULT_ERROR_INVALID_PARAM,
100 "directPlaybackMode is nullptr");
101 AudioStreamInfo info = convertStreamInfo(streamInfo);
102 *directPlaybackMode = ohAudioStreamManager->GetDirectPlaybackSupport(info, static_cast<StreamUsage>(usage));
103 return AUDIOCOMMON_RESULT_SUCCESS;
104 }
105
OH_AudioStreamManager_IsAcousticEchoCancelerSupported(OH_AudioStreamManager * audioStreamManager,OH_AudioStream_SourceType sourceType,bool * supported)106 OH_AudioCommon_Result OH_AudioStreamManager_IsAcousticEchoCancelerSupported(OH_AudioStreamManager *audioStreamManager,
107 OH_AudioStream_SourceType sourceType, bool *supported)
108 {
109 CHECK_AND_RETURN_RET_LOG(supported != nullptr, AUDIOCOMMON_RESULT_ERROR_INVALID_PARAM, "supported is nullptr");
110 OHAudioStreamManager *ohAudioStreamManager = convertManager(audioStreamManager);
111 CHECK_AND_RETURN_RET_LOG(ohAudioStreamManager != nullptr,
112 AUDIOCOMMON_RESULT_ERROR_INVALID_PARAM, "ohAudioStreamManager is nullptr");
113 CHECK_AND_RETURN_RET_LOG(VALID_OH_SOURCE_TYPES.count(sourceType) != 0,
114 AUDIOCOMMON_RESULT_ERROR_INVALID_PARAM, "sourceType is invalid");
115 SourceType type = static_cast<SourceType>(sourceType);
116 *supported = ohAudioStreamManager->IsAcousticEchoCancelerSupported(type);
117 return AUDIOCOMMON_RESULT_SUCCESS;
118 }
119
OH_AudioStreamManager_IsFastPlaybackSupported(OH_AudioStreamManager * streamManager,OH_AudioStreamInfo * streamInfo,OH_AudioStream_Usage usage)120 bool OH_AudioStreamManager_IsFastPlaybackSupported(
121 OH_AudioStreamManager *streamManager, OH_AudioStreamInfo *streamInfo, OH_AudioStream_Usage usage)
122 {
123 OHAudioStreamManager* ohAudioStreamManager = convertManager(streamManager);
124 if (ohAudioStreamManager == nullptr || streamInfo == nullptr || !VALID_OH_STREAM_USAGES.count(usage)) {
125 AUDIO_ERR_LOG("Invalid params!");
126 return false;
127 }
128
129 StreamUsage streamUsage = static_cast<StreamUsage>(usage);
130 AudioStreamInfo audioStreamInfo = {
131 (AudioSamplingRate)streamInfo->samplingRate,
132 (AudioEncodingType)streamInfo->encodingType,
133 (AudioSampleFormat)streamInfo->sampleFormat,
134 AudioChannel::STEREO,
135 (AudioChannelLayout)streamInfo->channelLayout
136 };
137 return ohAudioStreamManager->IsFastPlaybackSupported(audioStreamInfo, streamUsage);
138 }
139
OH_AudioStreamManager_IsFastRecordingSupported(OH_AudioStreamManager * streamManager,OH_AudioStreamInfo * streamInfo,OH_AudioStream_SourceType source)140 bool OH_AudioStreamManager_IsFastRecordingSupported(
141 OH_AudioStreamManager *streamManager, OH_AudioStreamInfo *streamInfo, OH_AudioStream_SourceType source)
142 {
143 OHAudioStreamManager* ohAudioStreamManager = convertManager(streamManager);
144 if (ohAudioStreamManager == nullptr || streamInfo == nullptr || !VALID_OH_SOURCE_TYPES.count(source)) {
145 AUDIO_ERR_LOG("Invalid params!");
146 return false;
147 }
148
149 SourceType sourceType = static_cast<SourceType>(source);
150 AudioStreamInfo audioStreamInfo = {
151 (AudioSamplingRate)streamInfo->samplingRate,
152 (AudioEncodingType)streamInfo->encodingType,
153 (AudioSampleFormat)streamInfo->sampleFormat,
154 AudioChannel::STEREO,
155 (AudioChannelLayout)streamInfo->channelLayout
156 };
157 return ohAudioStreamManager->IsFastRecordingSupported(audioStreamInfo, sourceType);
158 }
159
160 namespace OHOS {
161 namespace AudioStandard {
162
OHAudioStreamManager()163 OHAudioStreamManager::OHAudioStreamManager()
164 {
165 AUDIO_INFO_LOG("OHAudioStreamManager created!");
166 }
167
~OHAudioStreamManager()168 OHAudioStreamManager::~OHAudioStreamManager()
169 {
170 AUDIO_INFO_LOG("OHAudioStreamManager destroyed!");
171 }
172
GetDirectPlaybackSupport(AudioStreamInfo streamInfo,StreamUsage usage)173 OH_AudioStream_DirectPlaybackMode OHAudioStreamManager::GetDirectPlaybackSupport(AudioStreamInfo streamInfo,
174 StreamUsage usage)
175 {
176 CHECK_AND_RETURN_RET_LOG(audioStreamManager_ != nullptr, AUDIOSTREAM_DIRECT_PLAYBACK_NOT_SUPPORTED,
177 "failed, audioStreamManager_ is null");
178 DirectPlaybackMode mode = audioStreamManager_->GetDirectPlaybackSupport(streamInfo, usage);
179 return static_cast<OH_AudioStream_DirectPlaybackMode>(mode);
180 }
181
IsAcousticEchoCancelerSupported(SourceType sourceType)182 bool OHAudioStreamManager::IsAcousticEchoCancelerSupported(SourceType sourceType)
183 {
184 CHECK_AND_RETURN_RET_LOG(audioStreamManager_ != nullptr, false, "failed, audioStreamManager_ is null");
185 return audioStreamManager_->IsAcousticEchoCancelerSupported(sourceType);
186 }
187
IsFastPlaybackSupported(AudioStreamInfo & streamInfo,StreamUsage usage)188 bool OHAudioStreamManager::IsFastPlaybackSupported(AudioStreamInfo &streamInfo, StreamUsage usage)
189 {
190 CHECK_AND_RETURN_RET_LOG(audioStreamManager_ != nullptr, false, "failed, audioStreamManager_ is null");
191 return audioStreamManager_->IsFastPlaybackSupported(streamInfo, usage);
192 }
193
IsFastRecordingSupported(AudioStreamInfo & streamInfo,SourceType source)194 bool OHAudioStreamManager::IsFastRecordingSupported(AudioStreamInfo &streamInfo, SourceType source)
195 {
196 CHECK_AND_RETURN_RET_LOG(audioStreamManager_ != nullptr, false, "failed, audioStreamManager_ is null");
197 return audioStreamManager_->IsFastRecordingSupported(streamInfo, source);
198 }
199 } // namespace AudioStandard
200 } // namespace OHOS
201