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