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