1# 空间音频管理(仅对系统应用开放)
2
3空间音频管理主要包含空间音频相关状态和能力的查询、设置与监听。
4
5空间音频管理仅开放给系统级应用,主要包括空间音频相关状态(空间音频渲染的开启与关闭、头动跟踪的开启与关闭)的查询、设置与监听,空间音频相关能力(空间音频渲染能力、头动跟踪能力)的查询,空间化设备状态的更新,以及空间音频渲染场景类型的查询与设置。
6
7对于播放音频类的系统级应用,开发者可以查询空间音频渲染与头动跟踪的开关状态,系统/指定设备是否支持空间音频渲染与头动跟踪能力,以及当前使用的空间音频渲染场景类型。
8
9对于空间音频控制类的系统级应用(比如空间音频UX等),开发者在查询上述状态和能力之外,还可以对空间音频渲染开关、头动跟踪开关以及空间音频渲染场景类型进行设置,以及更新空间化设备的状态,指明特定空间化设备是否支持空间音频渲染和头动跟踪能力。
10在使用此功能前,应用需要先申请权限`ohos.permission.MANAGE_SYSTEM_AUDIO_EFFECTS`,申请方式请参考:[申请应用权限](../../security/AccessToken/determine-application-mode.md#system_basic等级应用申请权限的方式)。
11
12## 获取空间音频管理接口
13
14创建AudioSpatializationManager实例。在使用AudioSpatializationManager的API前,需要使用getSpatializationManager()创建一个AudioSpatializationManager实例。
15
16  ```ts
17  import { audio } from '@kit.AudioKit';
18
19  let audioManager = audio.getAudioManager();
20  let audioSpatializationManager = audioManager.getSpatializationManager();
21  ```
22
23## 查询系统是否支持空间音频渲染能力
24
25系统应用开发者可以通过[isSpatializationSupported](../../reference/apis-audio-kit/js-apis-audio-sys.md#isspatializationsupported11)接口查询当前系统是否具有空间音频渲染的能力。
26
27  ```ts
28  import { BusinessError } from '@kit.BasicServicesKit';
29
30  try {
31    let isSpatializationSupported: boolean = audioSpatializationManager.isSpatializationSupported();
32    console.info(`AudioSpatializationManager isSpatializationSupported: ${isSpatializationSupported}`);
33  } catch (err) {
34    let error = err as BusinessError;
35    console.error(`ERROR: ${error}`);
36  }
37  ```
38
39## 查询指定设备是否支持空间音频渲染能力
40
41系统应用开发者可以通过[isSpatializationSupportedForDevice](../../reference/apis-audio-kit/js-apis-audio-sys.md#isspatializationsupportedfordevice11)接口查询指定设备是否具有空间音频渲染的能力,开发者需要使用AudioDeviceDescriptor作为入参来指定设备,建议通过音频框架中其他接口来获取当前已连接设备或当前发声设备的AudioDeviceDescriptor。AudioDeviceDescriptor的具体信息可以参考[AudioDeviceDescriptor](../../reference/apis-audio-kit/js-apis-audio.md#audiodevicedescriptor)。
42
43  ```ts
44  import { audio } from '@kit.AudioKit';
45  import { BusinessError } from '@kit.BasicServicesKit';
46
47  let deviceDescriptor: audio.AudioDeviceDescriptor = {
48    deviceRole : audio.DeviceRole.OUTPUT_DEVICE,
49    deviceType : audio.DeviceType.BLUETOOTH_A2DP,
50    id : 1,
51    name : "",
52    address : "123",
53    sampleRates : [44100],
54    channelCounts : [2],
55    channelMasks : [0],
56    networkId : audio.LOCAL_NETWORK_ID,
57    interruptGroupId : 1,
58    volumeGroupId : 1,
59    displayName : ""
60  };
61  try {
62    let isSpatializationSupportedForDevice: boolean = audioSpatializationManager.isSpatializationSupportedForDevice(deviceDescriptor);
63    console.info(`AudioSpatializationManager isSpatializationSupportedForDevice: ${isSpatializationSupportedForDevice}`);
64  } catch (err) {
65    let error = err as BusinessError;
66    console.error(`ERROR: ${error}`);
67  }
68  ```
69
70## 查询系统是否支持头动跟踪能力
71
72系统应用开发者可以通过[isHeadTrackingSupported](../../reference/apis-audio-kit/js-apis-audio-sys.md#isheadtrackingsupported11)接口查询当前系统是否具有头动跟踪的能力。
73
74  ```ts
75  import { BusinessError } from '@kit.BasicServicesKit';
76
77  try {
78    let isHeadTrackingSupported: boolean = audioSpatializationManager.isHeadTrackingSupported();
79    console.info(`AudioSpatializationManager isHeadTrackingSupported: ${isHeadTrackingSupported}`);
80  } catch (err) {
81    let error = err as BusinessError;
82    console.error(`ERROR: ${error}`);
83  }
84  ```
85
86## 查询指定设备是否支持头动跟踪能力
87
88系统应用开发者可以通过[isHeadTrackingSupportedForDevice](../../reference/apis-audio-kit/js-apis-audio-sys.md#isheadtrackingsupportedfordevice11)接口查询指定设备是否具有头动跟踪的能力,开发者需要使用AudioDeviceDescriptor作为入参来指定设备,建议通过音频框架中其他接口来获取当前已连接设备或当前发声设备的AudioDeviceDescriptor。AudioDeviceDescriptor的具体信息可以参考[AudioDeviceDescriptor](../../reference/apis-audio-kit/js-apis-audio.md#audiodevicedescriptor)。
89
90  ```ts
91  import { audio } from '@kit.AudioKit';
92  import { BusinessError } from '@kit.BasicServicesKit';
93
94  let deviceDescriptor: audio.AudioDeviceDescriptor = {
95    deviceRole : audio.DeviceRole.OUTPUT_DEVICE,
96    deviceType : audio.DeviceType.BLUETOOTH_A2DP,
97    id : 1,
98    name : "",
99    address : "123",
100    sampleRates : [44100],
101    channelCounts : [2],
102    channelMasks : [0],
103    networkId : audio.LOCAL_NETWORK_ID,
104    interruptGroupId : 1,
105    volumeGroupId : 1,
106    displayName : ""
107  };
108
109  try {
110    let isHeadTrackingSupportedForDevice: boolean = audioSpatializationManager.isHeadTrackingSupportedForDevice(deviceDescriptor);
111    console.info(`AudioSpatializationManager isHeadTrackingSupportedForDevice: ${isHeadTrackingSupportedForDevice}`);
112  } catch (err) {
113    let error = err as BusinessError;
114    console.error(`ERROR: ${error}`);
115  }
116  ```
117
118## 开启/关闭指定设备的空间音频渲染效果
119
120系统应用开发者可以通过[setSpatializationEnabled](../../reference/apis-audio-kit/js-apis-audio-sys.md#setspatializationenabled12)接口开启/关闭指定设备的空间音频渲染效果,该接口需要传递两个参数:AudioDeviceDescriptor和enabled。
121
122AudioDeviceDescriptor:用于指定音频设备。建议通过音频框架中其他接口来获取当前已连接设备或当前发声设备的AudioDeviceDescriptor。AudioDeviceDescriptor的具体信息可以参考[AudioDeviceDescriptor](../../reference/apis-audio-kit/js-apis-audio.md#audiodevicedescriptor)。
123enabled:布尔值类型,用于控制指定设备的空间音频渲染开关。入参为true时为开启空间音频渲染,入参为false时为关闭空间音频渲染。
124
125在使用此功能前,应用需要先申请权限`ohos.permission.MANAGE_SYSTEM_AUDIO_EFFECTS`,申请方式请参考:[申请应用权限](../../security/AccessToken/determine-application-mode.md#system_basic等级应用申请权限的方式)。
126
127在开启空间音频渲染时,需要先确保系统和指定设备都具有空间音频渲染的能力。
128
129  ```ts
130  import { audio } from '@kit.AudioKit';
131  import { BusinessError } from '@kit.BasicServicesKit';
132
133  let deviceDescriptor: audio.AudioDeviceDescriptor = {
134    deviceRole : audio.DeviceRole.OUTPUT_DEVICE,
135    deviceType : audio.DeviceType.BLUETOOTH_A2DP,
136    id : 1,
137    name : "",
138    address : "123",
139    sampleRates : [44100],
140    channelCounts : [2],
141    channelMasks : [0],
142    networkId : audio.LOCAL_NETWORK_ID,
143    interruptGroupId : 1,
144    volumeGroupId : 1,
145    displayName : ""
146  };
147  let enabled: boolean = true;
148
149  audioSpatializationManager.setSpatializationEnabled(deviceDescriptor, enabled).then(() => {
150    console.info(`setSpatializationEnabled success`);
151  }).catch((err: BusinessError) => {
152    console.error(`Result ERROR: ${err}`);
153  });
154  ```
155
156## 查询指定设备的空间音频渲染效果开关状态
157
158系统应用开发者可以通过[isSpatializationEnabled](../../reference/apis-audio-kit/js-apis-audio-sys.md#isspatializationenabled12)接口查询指定设备的空间音频渲染效果开关状态,开发者需要使用AudioDeviceDescriptor作为入参来指定设备,建议通过音频框架中其他接口来获取当前已连接设备或当前发声设备的AudioDeviceDescriptor。AudioDeviceDescriptor的具体信息可以参考[AudioDeviceDescriptor](../../reference/apis-audio-kit/js-apis-audio.md#audiodevicedescriptor)。该接口返回为true表示空间音频渲染开启,false表示空间音频渲染关闭。返回值为setSpatializationEnabled接口中成功设置的指定设备空间音频渲染开关状态,默认为关闭。该状态仅为开关状态,实际是否生效还需依赖系统和指定设备是否支持空间音频渲染。
159
160  ```ts
161  import { audio } from '@kit.AudioKit';
162  import { BusinessError } from '@kit.BasicServicesKit';
163
164  let deviceDescriptor: audio.AudioDeviceDescriptor = {
165    deviceRole : audio.DeviceRole.OUTPUT_DEVICE,
166    deviceType : audio.DeviceType.BLUETOOTH_A2DP,
167    id : 1,
168    name : "",
169    address : "123",
170    sampleRates : [44100],
171    channelCounts : [2],
172    channelMasks : [0],
173    networkId : audio.LOCAL_NETWORK_ID,
174    interruptGroupId : 1,
175    volumeGroupId : 1,
176    displayName : ""
177  }
178
179  try {
180    let isSpatializationEnabled: boolean = audioSpatializationManager.isSpatializationEnabled(deviceDescriptor);
181    console.info(`AudioSpatializationManager isSpatializationEnabled: ${isSpatializationEnabled}`);
182  } catch (err) {
183    let error = err as BusinessError;
184    console.error(`ERROR: ${error}`);
185  }
186  ```
187
188## 订阅空间音频渲染效果的开关状态变化事件
189
190系统应用开发者可以通过[on('spatializationEnabledChangeForAnyDevice')](../../reference/apis-audio-kit/js-apis-audio-sys.md#onspatializationenabledchangeforanydevice12)接口订阅空间音频渲染效果的开关状态变化事件,回调包含AudioSpatialEnabledStateForDevice参数,AudioSpatialEnabledStateForDevice包含deviceDescriptor和enabled属性,其中deviceDescriptor为被改变设备的描述信息,enabled为true表示空间音频渲染被开启,false表示空间音频渲染被关闭,具体信息可以参考[AudioSpatialEnabledStateForDevice](../../reference/apis-audio-kit/js-apis-audio-sys.md#audiospatialenabledstatefordevice12)。当开发者通过setSpatializationEnabled接口成功地改变了任一设备的空间音频渲染开关状态时,回调将被触发。
191
192  ```ts
193  import { audio } from '@kit.AudioKit';
194
195  audioSpatializationManager.on('spatializationEnabledChangeForAnyDevice', (audioSpatialEnabledStateForDevice: audio.AudioSpatialEnabledStateForDevice) => {
196    console.info(`deviceDescriptor: ${audioSpatialEnabledStateForDevice.deviceDescriptor}`);
197    console.info(`isSpatializationEnabled: ${audioSpatialEnabledStateForDevice.enabled}`);
198  });
199  ```
200
201## 取消订阅空间音频渲染效果的开关状态变化事件
202
203系统应用开发者可以通过[off('spatializationEnabledChangeForAnyDevice')](../../reference/apis-audio-kit/js-apis-audio-sys.md#offspatializationenabledchangeforanydevice12)接口取消订阅空间音频渲染效果的开关状态变化事件。
204
205  ```ts
206  import { audio } from '@kit.AudioKit';
207  audioSpatializationManager.off('spatializationEnabledChangeForAnyDevice');
208  ```
209
210## 开启/关闭指定设备的头动跟踪效果
211
212系统应用开发者可以通过[setHeadTrackingEnabled](../../reference/apis-audio-kit/js-apis-audio-sys.md#setheadtrackingenabled12)接口开启/关闭指定设备的空间音频渲染效果,该接口需要传递两个参数:AudioDeviceDescriptor和enabled。
213
214AudioDeviceDescriptor:用于指定音频设备。建议通过音频框架中其他接口来获取当前已连接设备或当前发声设备的AudioDeviceDescriptor。AudioDeviceDescriptor的具体信息可以参考[AudioDeviceDescriptor](../../reference/apis-audio-kit/js-apis-audio.md#audiodevicedescriptor)。
215enabled:布尔值类型,用于控制指定设备的头动跟踪开关。入参为true时为开启头动跟踪,入参为false时为关闭头动跟踪。
216
217在使用此功能前,应用需要先申请权限`ohos.permission.MANAGE_SYSTEM_AUDIO_EFFECTS`,申请方式请参考:[申请应用权限](../../security/AccessToken/determine-application-mode.md#system_basic等级应用申请权限的方式)。
218
219在开启头动跟踪时,需要先确保系统和指定设备都具有头动跟踪的能力,同时头动跟踪效果的生效依赖于空间音频渲染开关打开。
220
221  ```ts
222  import { audio } from '@kit.AudioKit';
223  import { BusinessError } from '@kit.BasicServicesKit';
224
225  let deviceDescriptor: audio.AudioDeviceDescriptor = {
226    deviceRole : audio.DeviceRole.OUTPUT_DEVICE,
227    deviceType : audio.DeviceType.BLUETOOTH_A2DP,
228    id : 1,
229    name : "",
230    address : "123",
231    sampleRates : [44100],
232    channelCounts : [2],
233    channelMasks : [0],
234    networkId : audio.LOCAL_NETWORK_ID,
235    interruptGroupId : 1,
236    volumeGroupId : 1,
237    displayName : ""
238  };
239  let enable: boolean = true;
240
241  audioSpatializationManager.setHeadTrackingEnabled(deviceDescriptor, enable).then(() => {
242    console.info(`setHeadTrackingEnabled success`);
243  }).catch((err: BusinessError) => {
244    console.error(`Result ERROR: ${err}`);
245  });
246  ```
247
248## 查询指定设备的头动跟踪效果开关状态
249
250系统应用开发者可以通过[isHeadTrackingEnabled](../../reference/apis-audio-kit/js-apis-audio-sys.md#isheadtrackingenabled12)接口查询指定设备的头动跟踪效果开关状态,开发者需要使用AudioDeviceDescriptor作为入参来指定设备,建议通过音频框架中其他接口来获取当前已连接设备或当前发声设备的AudioDeviceDescriptor。AudioDeviceDescriptor的具体信息可以参考[AudioDeviceDescriptor](../../reference/apis-audio-kit/js-apis-audio.md#audiodevicedescriptor)。该接口返回为true表示头动跟踪开启,false表示头动跟踪关闭。返回值为setHeadTrackingEnabled接口中成功设置的指定设备头动跟踪开关状态,默认为关闭。该状态仅为开关状态,实际是否生效还需依赖系统和指定设备是否支持头动跟踪,以及指定设备空间音频渲染开关是否打开。
251
252  ```ts
253  import { audio } from '@kit.AudioKit';
254  import { BusinessError } from '@kit.BasicServicesKit';
255
256  let deviceDescriptor: audio.AudioDeviceDescriptor = {
257    deviceRole : audio.DeviceRole.OUTPUT_DEVICE,
258    deviceType : audio.DeviceType.BLUETOOTH_A2DP,
259    id : 1,
260    name : "",
261    address : "123",
262    sampleRates : [44100],
263    channelCounts : [2],
264    channelMasks : [0],
265    networkId : audio.LOCAL_NETWORK_ID,
266    interruptGroupId : 1,
267    volumeGroupId : 1,
268    displayName : ""
269  };
270
271  try {
272    let isHeadTrackingEnabled: boolean = audioSpatializationManager.isHeadTrackingEnabled(deviceDescriptor);
273    console.info(`AudioSpatializationManager isHeadTrackingEnabled: ${isHeadTrackingEnabled}`);
274  } catch (err) {
275    let error = err as BusinessError;
276    console.error(`ERROR: ${error}`);
277  }
278  ```
279
280## 订阅头动跟踪效果的开关状态变化事件
281
282系统应用开发者可以通过[on('headTrackingEnabledChangeForAnyDevice')](../../reference/apis-audio-kit/js-apis-audio-sys.md#onheadtrackingenabledchangeforanydevice12)接口订阅头动跟踪效果的开关状态变化事件,回调包含AudioSpatialEnabledStateForDevice参数,AudioSpatialEnabledStateForDevice包含deviceDescriptor和enabled属性,其中deviceDescriptor为被改变设备的描述信息,enabled为true表示头动跟踪被开启,false表示头动跟踪被关闭。具体信息可以参考[AudioSpatialEnabledStateForDevice](../../reference/apis-audio-kit/js-apis-audio-sys.md#audiospatialenabledstatefordevice12)。当开发者通过setHeadTrackingEnabled接口成功地改变了任一设备的头动跟踪开关状态时,回调将被触发。
283
284  ```ts
285  import { audio } from '@kit.AudioKit';
286
287  audioSpatializationManager.on('headTrackingEnabledChangeForAnyDevice', (audioSpatialEnabledStateForDevice: audio.AudioSpatialEnabledStateForDevice) => {
288    console.info(`deviceDescriptor: ${audioSpatialEnabledStateForDevice.deviceDescriptor}`);
289    console.info(`isSpatializationEnabled: ${audioSpatialEnabledStateForDevice.enabled}`);
290  });
291  ```
292
293## 取消订阅头动跟踪效果的开关状态变化事件
294
295系统应用开发者可以通过[off('headTrackingEnabledChangeForAnyDevice')](../../reference/apis-audio-kit/js-apis-audio-sys.md#offheadtrackingenabledchangeforanydevice12)接口取消订阅头动跟踪效果的开关状态变化事件。
296
297  ```ts
298  import { audio } from '@kit.AudioKit';
299  audioSpatializationManager.off('headTrackingEnabledChangeForAnyDevice');
300  ```
301
302## 更新空间化设备状态
303
304系统应用开发者可以通过[updateSpatialDeviceState](../../reference/apis-audio-kit/js-apis-audio-sys.md#updatespatialdevicestate11)接口更新空间化设备状态,空间化设备状态包含设备的地址、是否具有空间音频渲染的能力、是否具有头动跟踪的能力和设备的形态类型。
305
306在使用此功能前,应用需要先申请权限`ohos.permission.MANAGE_SYSTEM_AUDIO_EFFECTS`,申请方式请参考:[申请应用权限](../../security/AccessToken/determine-application-mode.md#system_basic等级应用申请权限的方式)。
307
308空间化设备状态AudioSpatialDeviceState的具体信息可以参考[AudioSpatialDeviceState](../../reference/apis-audio-kit/js-apis-audio-sys.md#audiospatialdevicestate11)。
309
310  ```ts
311  import { audio } from '@kit.AudioKit';
312  import { BusinessError } from '@kit.BasicServicesKit';
313
314  let spatialDeviceState: audio.AudioSpatialDeviceState = {
315    address: "123",
316    isSpatializationSupported: true,
317    isHeadTrackingSupported: true,
318    spatialDeviceType: audio.AudioSpatialDeviceType.SPATIAL_DEVICE_TYPE_IN_EAR_HEADPHONE
319  };
320
321  try {
322    audioSpatializationManager.updateSpatialDeviceState(spatialDeviceState);
323    console.info(`AudioSpatializationManager updateSpatialDeviceState success`);
324  } catch (err) {
325    let error = err as BusinessError;
326    console.error(`ERROR: ${error}`);
327  }
328  ```
329
330## 设置空间音频渲染场景类型
331
332系统应用开发者可以通过[setSpatializationSceneType](../../reference/apis-audio-kit/js-apis-audio-sys.md#setspatializationscenetype12)接口设置空间音频渲染场景类型,可以选择默认场景、音乐场景、电影场景或有声读物场景,默认为默认场景。空间音频渲染场景类型的生效依赖空间音频渲染开关的打开。
333
334在使用此功能前,应用需要先申请权限`ohos.permission.MANAGE_SYSTEM_AUDIO_EFFECTS`,申请方式请参考:[申请应用权限](../../security/AccessToken/determine-application-mode.md#system_basic等级应用申请权限的方式)。
335
336空间音频渲染场景类型AudioSpatializationSceneType的具体信息可以参考[AudioSpatializationSceneType](../../reference/apis-audio-kit/js-apis-audio-sys.md#audiospatializationscenetype12)。
337
338  ```ts
339  import { audio } from '@kit.AudioKit';
340  import { BusinessError } from '@kit.BasicServicesKit';
341
342  try {
343    audioSpatializationManager.setSpatializationSceneType(audio.AudioSpatializationSceneType.DEFAULT);
344    console.info(`AudioSpatializationManager setSpatializationSceneType success`);
345  } catch (err) {
346    let error = err as BusinessError;
347    console.error(`ERROR: ${error}`);
348  }
349  ```
350
351## 查询空间音频渲染场景类型
352
353系统应用开发者可以通过[getSpatializationSceneType](../../reference/apis-audio-kit/js-apis-audio-sys.md#getspatializationscenetype12)接口查询当前空间音频渲染场景类型。该接口将返回setSpatializationSceneType()接口中成功设置的值,默认为默认场景。
354
355空间音频渲染场景类型AudioSpatializationSceneType的具体信息可以参考[AudioSpatializationSceneType](../../reference/apis-audio-kit/js-apis-audio-sys.md#audiospatializationscenetype12)。
356
357  ```ts
358  import { audio } from '@kit.AudioKit';
359  import { BusinessError } from '@kit.BasicServicesKit';
360
361  try {
362    let spatializationSceneType: audio.AudioSpatializationSceneType = audioSpatializationManager.getSpatializationSceneType();
363    console.info(`AudioSpatializationManager spatializationSceneType: ${spatializationSceneType}`);
364  } catch (err) {
365    let error = err as BusinessError;
366    console.error(`ERROR: ${error}`);
367  }
368  ```