1 /*
2 * Copyright (c) 2021-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 #include "audio_service_log.h"
17 #include "audio_device_descriptor.h"
18
19 namespace OHOS {
20 namespace AudioStandard {
AudioDeviceDescriptor(int32_t descriptorType)21 AudioDeviceDescriptor::AudioDeviceDescriptor(int32_t descriptorType)
22 : AudioDeviceDescriptor(DeviceType::DEVICE_TYPE_NONE, DeviceRole::DEVICE_ROLE_NONE)
23 {
24 descriptorType_ = descriptorType;
25 if (descriptorType_ == DEVICE_INFO) {
26 deviceType_ = DeviceType(0);
27 deviceRole_ = DeviceRole(0);
28 networkId_ = "";
29 }
30 }
31
AudioDeviceDescriptor(DeviceType type,DeviceRole role)32 AudioDeviceDescriptor::AudioDeviceDescriptor(DeviceType type, DeviceRole role)
33 : deviceType_(type), deviceRole_(role)
34 {
35 deviceId_ = 0;
36 audioStreamInfo_ = {};
37 channelMasks_ = 0;
38 channelIndexMasks_ = 0;
39 deviceName_ = "";
40 macAddress_ = "";
41 volumeGroupId_ = 0;
42 interruptGroupId_ = 0;
43 networkId_ = LOCAL_NETWORK_ID;
44 displayName_ = "";
45 deviceCategory_ = CATEGORY_DEFAULT;
46 connectTimeStamp_ = 0;
47 connectState_ = CONNECTED;
48 pairDeviceDescriptor_ = nullptr;
49 isScoRealConnected_ = false;
50 isEnable_ = true;
51 exceptionFlag_ = false;
52 isLowLatencyDevice_ = false;
53 a2dpOffloadFlag_ = 0;
54 descriptorType_ = AUDIO_DEVICE_DESCRIPTOR;
55 }
56
AudioDeviceDescriptor(DeviceType type,DeviceRole role,int32_t interruptGroupId,int32_t volumeGroupId,std::string networkId)57 AudioDeviceDescriptor::AudioDeviceDescriptor(DeviceType type, DeviceRole role, int32_t interruptGroupId,
58 int32_t volumeGroupId, std::string networkId)
59 : deviceType_(type), deviceRole_(role), interruptGroupId_(interruptGroupId), volumeGroupId_(volumeGroupId),
60 networkId_(networkId)
61 {
62 deviceId_ = 0;
63 audioStreamInfo_ = {};
64 channelMasks_ = 0;
65 channelIndexMasks_ = 0;
66 deviceName_ = "";
67 macAddress_ = "";
68 displayName_ = "";
69 deviceCategory_ = CATEGORY_DEFAULT;
70 connectTimeStamp_ = 0;
71 connectState_ = CONNECTED;
72 pairDeviceDescriptor_ = nullptr;
73 isScoRealConnected_ = false;
74 isEnable_ = true;
75 exceptionFlag_ = false;
76 isLowLatencyDevice_ = false;
77 a2dpOffloadFlag_ = 0;
78 descriptorType_ = AUDIO_DEVICE_DESCRIPTOR;
79 }
80
AudioDeviceDescriptor(const AudioDeviceDescriptor & deviceDescriptor)81 AudioDeviceDescriptor::AudioDeviceDescriptor(const AudioDeviceDescriptor &deviceDescriptor)
82 {
83 deviceId_ = deviceDescriptor.deviceId_;
84 deviceName_ = deviceDescriptor.deviceName_;
85 macAddress_ = deviceDescriptor.macAddress_;
86 deviceType_ = deviceDescriptor.deviceType_;
87 deviceRole_ = deviceDescriptor.deviceRole_;
88 audioStreamInfo_.channels = deviceDescriptor.audioStreamInfo_.channels;
89 audioStreamInfo_.encoding = deviceDescriptor.audioStreamInfo_.encoding;
90 audioStreamInfo_.format = deviceDescriptor.audioStreamInfo_.format;
91 audioStreamInfo_.samplingRate = deviceDescriptor.audioStreamInfo_.samplingRate;
92 channelMasks_ = deviceDescriptor.channelMasks_;
93 channelIndexMasks_ = deviceDescriptor.channelIndexMasks_;
94 volumeGroupId_ = deviceDescriptor.volumeGroupId_;
95 interruptGroupId_ = deviceDescriptor.interruptGroupId_;
96 networkId_ = deviceDescriptor.networkId_;
97 displayName_ = deviceDescriptor.displayName_;
98 deviceCategory_ = deviceDescriptor.deviceCategory_;
99 connectTimeStamp_ = deviceDescriptor.connectTimeStamp_;
100 connectState_ = deviceDescriptor.connectState_;
101 pairDeviceDescriptor_ = deviceDescriptor.pairDeviceDescriptor_;
102 isScoRealConnected_ = deviceDescriptor.isScoRealConnected_;
103 isEnable_ = deviceDescriptor.isEnable_;
104 exceptionFlag_ = deviceDescriptor.exceptionFlag_;
105 // DeviceInfo
106 isLowLatencyDevice_ = deviceDescriptor.isLowLatencyDevice_;
107 a2dpOffloadFlag_ = deviceDescriptor.a2dpOffloadFlag_;
108 // Other
109 descriptorType_ = deviceDescriptor.descriptorType_;
110 }
111
AudioDeviceDescriptor(const sptr<AudioDeviceDescriptor> & deviceDescriptor)112 AudioDeviceDescriptor::AudioDeviceDescriptor(const sptr<AudioDeviceDescriptor> &deviceDescriptor)
113 {
114 CHECK_AND_RETURN_LOG(deviceDescriptor != nullptr, "Error input parameter");
115 deviceId_ = deviceDescriptor->deviceId_;
116 deviceName_ = deviceDescriptor->deviceName_;
117 macAddress_ = deviceDescriptor->macAddress_;
118 deviceType_ = deviceDescriptor->deviceType_;
119 deviceRole_ = deviceDescriptor->deviceRole_;
120 audioStreamInfo_.channels = deviceDescriptor->audioStreamInfo_.channels;
121 audioStreamInfo_.encoding = deviceDescriptor->audioStreamInfo_.encoding;
122 audioStreamInfo_.format = deviceDescriptor->audioStreamInfo_.format;
123 audioStreamInfo_.samplingRate = deviceDescriptor->audioStreamInfo_.samplingRate;
124 channelMasks_ = deviceDescriptor->channelMasks_;
125 channelIndexMasks_ = deviceDescriptor->channelIndexMasks_;
126 volumeGroupId_ = deviceDescriptor->volumeGroupId_;
127 interruptGroupId_ = deviceDescriptor->interruptGroupId_;
128 networkId_ = deviceDescriptor->networkId_;
129 displayName_ = deviceDescriptor->displayName_;
130 deviceCategory_ = deviceDescriptor->deviceCategory_;
131 connectTimeStamp_ = deviceDescriptor->connectTimeStamp_;
132 connectState_ = deviceDescriptor->connectState_;
133 pairDeviceDescriptor_ = deviceDescriptor->pairDeviceDescriptor_;
134 isScoRealConnected_ = deviceDescriptor->isScoRealConnected_;
135 isEnable_ = deviceDescriptor->isEnable_;
136 exceptionFlag_ = deviceDescriptor->exceptionFlag_;
137 // DeviceInfo
138 isLowLatencyDevice_ = deviceDescriptor->isLowLatencyDevice_;
139 a2dpOffloadFlag_ = deviceDescriptor->a2dpOffloadFlag_;
140 // Other
141 descriptorType_ = deviceDescriptor->descriptorType_;
142 }
143
~AudioDeviceDescriptor()144 AudioDeviceDescriptor::~AudioDeviceDescriptor()
145 {
146 pairDeviceDescriptor_ = nullptr;
147 }
148
getType() const149 DeviceType AudioDeviceDescriptor::getType() const
150 {
151 return deviceType_;
152 }
153
getRole() const154 DeviceRole AudioDeviceDescriptor::getRole() const
155 {
156 return deviceRole_;
157 }
158
IsAudioDeviceDescriptor() const159 bool AudioDeviceDescriptor::IsAudioDeviceDescriptor() const
160 {
161 return descriptorType_ == AUDIO_DEVICE_DESCRIPTOR;
162 }
163
Marshalling(Parcel & parcel) const164 bool AudioDeviceDescriptor::Marshalling(Parcel &parcel) const
165 {
166 if (IsAudioDeviceDescriptor()) {
167 return MarshallingToDeviceDescriptor(parcel);
168 }
169
170 return MarshallingToDeviceInfo(parcel);
171 }
172
MarshallingToDeviceDescriptor(Parcel & parcel) const173 bool AudioDeviceDescriptor::MarshallingToDeviceDescriptor(Parcel &parcel) const
174 {
175 parcel.WriteInt32(deviceType_ == DEVICE_TYPE_USB_ARM_HEADSET ? DEVICE_TYPE_USB_HEADSET : deviceType_);
176 parcel.WriteInt32(deviceRole_);
177 parcel.WriteInt32(deviceId_);
178 audioStreamInfo_.Marshalling(parcel);
179 parcel.WriteInt32(channelMasks_);
180 parcel.WriteInt32(channelIndexMasks_);
181 parcel.WriteString(deviceName_);
182 parcel.WriteString(macAddress_);
183 parcel.WriteInt32(interruptGroupId_);
184 parcel.WriteInt32(volumeGroupId_);
185 parcel.WriteString(networkId_);
186 parcel.WriteString(displayName_);
187 parcel.WriteInt32(deviceCategory_);
188 return true;
189 }
190
MarshallingToDeviceInfo(Parcel & parcel) const191 bool AudioDeviceDescriptor::MarshallingToDeviceInfo(Parcel &parcel) const
192 {
193 return parcel.WriteInt32(static_cast<int32_t>(deviceType_)) &&
194 parcel.WriteInt32(static_cast<int32_t>(deviceRole_)) &&
195 parcel.WriteInt32(deviceId_) &&
196 parcel.WriteInt32(channelMasks_) &&
197 parcel.WriteInt32(channelIndexMasks_) &&
198 parcel.WriteString(deviceName_) &&
199 parcel.WriteString(macAddress_) &&
200 audioStreamInfo_.Marshalling(parcel) &&
201 parcel.WriteString(networkId_) &&
202 parcel.WriteString(displayName_) &&
203 parcel.WriteInt32(interruptGroupId_) &&
204 parcel.WriteInt32(volumeGroupId_) &&
205 parcel.WriteBool(isLowLatencyDevice_) &&
206 parcel.WriteInt32(a2dpOffloadFlag_) &&
207 parcel.WriteInt32(static_cast<int32_t>(deviceCategory_));
208 }
209
Marshalling(Parcel & parcel,bool hasBTPermission,bool hasSystemPermission,int32_t apiVersion) const210 bool AudioDeviceDescriptor::Marshalling(Parcel &parcel, bool hasBTPermission, bool hasSystemPermission,
211 int32_t apiVersion) const
212 {
213 return MarshallingToDeviceInfo(parcel, hasBTPermission, hasSystemPermission, apiVersion);
214 }
215
MarshallingToDeviceInfo(Parcel & parcel,bool hasBTPermission,bool hasSystemPermission,int32_t apiVersion) const216 bool AudioDeviceDescriptor::MarshallingToDeviceInfo(Parcel &parcel, bool hasBTPermission, bool hasSystemPermission,
217 int32_t apiVersion) const
218 {
219 DeviceType devType = deviceType_;
220 int32_t devId = deviceId_;
221 DeviceStreamInfo streamInfo = audioStreamInfo_;
222
223 // If api target version < 11 && does not set deviceType, fix api compatibility.
224 if (apiVersion < API_11 && (deviceType_ == DEVICE_TYPE_NONE || deviceType_ == DEVICE_TYPE_INVALID)) {
225 // DeviceType use speaker or mic instead.
226 if (deviceRole_ == OUTPUT_DEVICE) {
227 devType = DEVICE_TYPE_SPEAKER;
228 devId = 1; // 1 default speaker device id.
229 } else if (deviceRole_ == INPUT_DEVICE) {
230 devType = DEVICE_TYPE_MIC;
231 devId = 2; // 2 default mic device id.
232 }
233
234 //If does not set sampleRates use SAMPLE_RATE_44100 instead.
235 if (streamInfo.samplingRate.empty()) {
236 streamInfo.samplingRate.insert(SAMPLE_RATE_44100);
237 }
238 // If does not set channelCounts use STEREO instead.
239 if (streamInfo.channels.empty()) {
240 streamInfo.channels.insert(STEREO);
241 }
242 }
243
244 return parcel.WriteInt32(static_cast<int32_t>(devType)) &&
245 parcel.WriteInt32(static_cast<int32_t>(deviceRole_)) &&
246 parcel.WriteInt32(devId) &&
247 parcel.WriteInt32(channelMasks_) &&
248 parcel.WriteInt32(channelIndexMasks_) &&
249 parcel.WriteString((!hasBTPermission && (deviceType_ == DEVICE_TYPE_BLUETOOTH_A2DP ||
250 deviceType_ == DEVICE_TYPE_BLUETOOTH_SCO)) ? "" : deviceName_) &&
251 parcel.WriteString((!hasBTPermission && (deviceType_ == DEVICE_TYPE_BLUETOOTH_A2DP ||
252 deviceType_ == DEVICE_TYPE_BLUETOOTH_SCO)) ? "" : macAddress_) &&
253 streamInfo.Marshalling(parcel) &&
254 parcel.WriteString(hasSystemPermission ? networkId_ : "") &&
255 parcel.WriteString(displayName_) &&
256 parcel.WriteInt32(hasSystemPermission ? interruptGroupId_ : INVALID_GROUP_ID) &&
257 parcel.WriteInt32(hasSystemPermission ? volumeGroupId_ : INVALID_GROUP_ID) &&
258 parcel.WriteBool(isLowLatencyDevice_) &&
259 parcel.WriteInt32(a2dpOffloadFlag_) &&
260 parcel.WriteInt32(static_cast<int32_t>(deviceCategory_));
261 }
262
Unmarshalling(Parcel & parcel)263 void AudioDeviceDescriptor::Unmarshalling(Parcel &parcel)
264 {
265 return UnmarshallingToDeviceInfo(parcel);
266 }
267
UnmarshallingPtr(Parcel & parcel)268 sptr<AudioDeviceDescriptor> AudioDeviceDescriptor::UnmarshallingPtr(Parcel &parcel)
269 {
270 sptr<AudioDeviceDescriptor> audioDeviceDescriptor = new(std::nothrow) AudioDeviceDescriptor();
271 if (audioDeviceDescriptor == nullptr) {
272 return nullptr;
273 }
274
275 audioDeviceDescriptor->UnmarshallingToDeviceDescriptor(parcel);
276 return audioDeviceDescriptor;
277 }
278
UnmarshallingToDeviceDescriptor(Parcel & parcel)279 void AudioDeviceDescriptor::UnmarshallingToDeviceDescriptor(Parcel &parcel)
280 {
281 deviceType_ = static_cast<DeviceType>(parcel.ReadInt32());
282 deviceRole_ = static_cast<DeviceRole>(parcel.ReadInt32());
283 deviceId_ = parcel.ReadInt32();
284 audioStreamInfo_.Unmarshalling(parcel);
285 channelMasks_ = parcel.ReadInt32();
286 channelIndexMasks_ = parcel.ReadInt32();
287 deviceName_ = parcel.ReadString();
288 macAddress_ = parcel.ReadString();
289 interruptGroupId_ = parcel.ReadInt32();
290 volumeGroupId_ = parcel.ReadInt32();
291 networkId_ = parcel.ReadString();
292 displayName_ = parcel.ReadString();
293 deviceCategory_ = static_cast<DeviceCategory>(parcel.ReadInt32());
294 }
295
UnmarshallingToDeviceInfo(Parcel & parcel)296 void AudioDeviceDescriptor::UnmarshallingToDeviceInfo(Parcel &parcel)
297 {
298 deviceType_ = static_cast<DeviceType>(parcel.ReadInt32());
299 deviceRole_ = static_cast<DeviceRole>(parcel.ReadInt32());
300 deviceId_ = parcel.ReadInt32();
301 channelMasks_ = parcel.ReadInt32();
302 channelIndexMasks_ = parcel.ReadInt32();
303 deviceName_ = parcel.ReadString();
304 macAddress_ = parcel.ReadString();
305 audioStreamInfo_.Unmarshalling(parcel);
306 networkId_ = parcel.ReadString();
307 displayName_ = parcel.ReadString();
308 interruptGroupId_ = parcel.ReadInt32();
309 volumeGroupId_ = parcel.ReadInt32();
310 isLowLatencyDevice_ = parcel.ReadBool();
311 a2dpOffloadFlag_ = parcel.ReadInt32();
312 deviceCategory_ = static_cast<DeviceCategory>(parcel.ReadInt32());
313 }
314
SetDeviceInfo(std::string deviceName,std::string macAddress)315 void AudioDeviceDescriptor::SetDeviceInfo(std::string deviceName, std::string macAddress)
316 {
317 deviceName_ = deviceName;
318 macAddress_ = macAddress;
319 }
320
SetDeviceCapability(const DeviceStreamInfo & audioStreamInfo,int32_t channelMask,int32_t channelIndexMasks)321 void AudioDeviceDescriptor::SetDeviceCapability(const DeviceStreamInfo &audioStreamInfo, int32_t channelMask,
322 int32_t channelIndexMasks)
323 {
324 audioStreamInfo_.channels = audioStreamInfo.channels;
325 audioStreamInfo_.encoding = audioStreamInfo.encoding;
326 audioStreamInfo_.format = audioStreamInfo.format;
327 audioStreamInfo_.samplingRate = audioStreamInfo.samplingRate;
328 channelMasks_ = channelMask;
329 channelIndexMasks_ = channelIndexMasks;
330 }
331
IsSameDeviceDesc(const AudioDeviceDescriptor & deviceDescriptor) const332 bool AudioDeviceDescriptor::IsSameDeviceDesc(const AudioDeviceDescriptor &deviceDescriptor) const
333 {
334 return deviceDescriptor.deviceType_ == deviceType_ &&
335 deviceDescriptor.macAddress_ == macAddress_ &&
336 deviceDescriptor.networkId_ == networkId_;
337 }
338
IsSameDeviceInfo(const AudioDeviceDescriptor & deviceInfo) const339 bool AudioDeviceDescriptor::IsSameDeviceInfo(const AudioDeviceDescriptor &deviceInfo) const
340 {
341 return deviceType_ == deviceInfo.deviceType_ &&
342 deviceRole_ == deviceInfo.deviceRole_ &&
343 macAddress_ == deviceInfo.macAddress_ &&
344 networkId_ == deviceInfo.networkId_;
345 }
346 } // AudioStandard
347 } // namespace OHOS
348