• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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