• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 使用TonePlayer开发音频播放功能(仅对系统应用开放)
2
3TonePlayer<sup>9+</sup>提供播放和管理DTMF(Dual Tone Multi Frequency,双音多频)音调的方法,包括各种系统监听音调、专有音调,如拨号音、通话回铃音等。主要工作是将需要生成音调的[ToneType](../../reference/apis-audio-kit/js-apis-audio-sys.md#tonetype9)类型,通过自带算法生成多个不同频率的正弦波叠加形成声音数据,通过[AudioRenderer](../../reference/apis-audio-kit/js-apis-audio.md#audiorenderer8)进行播放,同时对播放任务进行管理。包含加载DTMF音调配置、启动DTMF音调播放、停止当前正在播放的音调、释放与此TonePlayer对象关联的资源等流程。详细API说明请参考[TonePlayer API文档](../../reference/apis-audio-kit/js-apis-audio-sys.md#toneplayer9)。
4
5## 支持的播放音调类型
6
7播放音调类型[ToneType](../../reference/apis-audio-kit/js-apis-audio-sys.md#tonetype9)信息(如下表所示),可通过"audio.ToneType.指定类型" 作为参数调用load()方法加载指定类型的音调资源。
8
9| 播放音调类型 | 值 | 说明 |
10| -------- | -------- | -------- |
11| TONE_TYPE_DIAL_0 | 0 | 键0的DTMF音。 |
12| TONE_TYPE_DIAL_1 | 1 | 键1的DTMF音。 |
13| TONE_TYPE_DIAL_2 | 2 | 键2的DTMF音。 |
14| TONE_TYPE_DIAL_3 | 3 | 键3的DTMF音。 |
15| TONE_TYPE_DIAL_4 | 4 | 键4的DTMF音。 |
16| TONE_TYPE_DIAL_5 | 5 | 键5的DTMF音。 |
17| TONE_TYPE_DIAL_6 | 6 | 键6的DTMF音。 |
18| TONE_TYPE_DIAL_7 | 7 | 键7的DTMF音。 |
19| TONE_TYPE_DIAL_8 | 8 | 键8的DTMF音。 |
20| TONE_TYPE_DIAL_9 | 9 | 键9的DTMF音。 |
21| TONE_TYPE_DIAL_S | 10 | 键\*的DTMF音。 |
22| TONE_TYPE_DIAL_P | 11 | 键\#的DTMF音。 |
23| TONE_TYPE_DIAL_A | 12 | 键A的DTMF音。 |
24| TONE_TYPE_DIAL_B | 13 | 键B的DTMF音。 |
25| TONE_TYPE_DIAL_C | 14 | 键C的DTMF音。 |
26| TONE_TYPE_DIAL_D | 15 | 键D的DTMF音。 |
27| TONE_TYPE_COMMON_SUPERVISORY_DIAL | 100 | 呼叫监管音调,拨号音。 |
28| TONE_TYPE_COMMON_SUPERVISORY_BUSY | 101 | 呼叫监管音调,忙。 |
29| TONE_TYPE_COMMON_SUPERVISORY_CONGESTION | 102 | 呼叫监管音调,拥塞。 |
30| TONE_TYPE_COMMON_SUPERVISORY_RADIO_ACK | 103 | 呼叫监管音调,无线电&nbsp;ACK。 |
31| TONE_TYPE_COMMON_SUPERVISORY_RADIO_NOT_AVAILABLE | 104 | 呼叫监管音调,无线电不可用。 |
32| TONE_TYPE_COMMON_SUPERVISORY_CALL_WAITING | 106 | 呼叫监管音调,呼叫等待。 |
33| TONE_TYPE_COMMON_SUPERVISORY_RINGTONE | 107 | 呼叫监管音调,铃声。 |
34| TONE_TYPE_COMMON_SUPERVISORY_CALL_HOLDING<sup>18+</sup> | 108 | 呼叫保持音调。 |
35| TONE_TYPE_COMMON_PROPRIETARY_BEEP | 200 | 专有声调,一般蜂鸣声。 |
36| TONE_TYPE_COMMON_PROPRIETARY_ACK | 201 | 专有声调,ACK。 |
37| TONE_TYPE_COMMON_PROPRIETARY_PROMPT | 203 | 专有声调,PROMPT。 |
38| TONE_TYPE_COMMON_PROPRIETARY_DOUBLE_BEEP | 204 | 专有声调,双重蜂鸣声。 |
39
40## 开发步骤及注意事项
41
42以下步骤描述了TonePlayer接口实现播放功能流程:
43
441. 创建DTMF播放器 ,获取tonePlayer实例。
45
46```ts
47import { audio } from '@kit.AudioKit';
48
49let audioRendererInfo: audio.AudioRendererInfo = {
50  usage: audio.StreamUsage.STREAM_USAGE_DTMF, // 音频流使用类型:拨号音。根据业务场景配置,参考StreamUsage。
51  rendererFlags: 0 // 音频渲染器标志。
52};
53
54async function createTonePlayer() {
55  let tonePlayerPromise = await audio.createTonePlayer(audioRendererInfo);
56}
57```
58
592. 加载指定类型DTMF音调配置。
60
61```ts
62async function load() {
63  await tonePlayerPromise.load(audio.ToneType.TONE_TYPE_DIAL_0);
64}
65```
66
673. 启动DTMF音调播放。
68
69```ts
70async function start() {
71  await tonePlayerPromise.start();
72}
73```
74
754. 停止当前正在播放的音调。
76
77```ts
78async function stop() {
79  await tonePlayerPromise.stop();
80}
81```
82
835. 释放与此TonePlayer对象关联的资源。
84
85```ts
86async function release() {
87  await tonePlayerPromise.release();
88}
89```
90
91在接口未按此正常调用时序调用时,接口会返回错误码6800301 NAPI_ERR_SYSTEM。
92
93## 完整示例
94
95参考以下示例,点击键盘拨号按键,并启动对应的DTMF音调播放。
96
97为保证UI线程不被阻塞,大部分TonePlayer调用都是异步的。对于每个API均提供了callback函数和Promise函数,以下示例均采用Promise函数,更多方式可参考API文档[TonePlayer](../../reference/apis-audio-kit/js-apis-audio-sys.md#toneplayer9)。
98
99```ts
100import { audio } from '@kit.AudioKit';
101import { BusinessError } from '@kit.BasicServicesKit';
102
103let timerPro : number;
104// promise调用方式
105async function testTonePlayerPromise(type: audio.ToneType) {
106  console.info('testTonePlayerPromise start');
107  if (timerPro) clearTimeout(timerPro);
108  let tonePlayerPromise: audio.TonePlayer;
109  let audioRendererInfo: audio.AudioRendererInfo = {
110    usage: audio.StreamUsage.STREAM_USAGE_DTMF, // 音频流使用类型:拨号音。根据业务场景配置,参考StreamUsage。
111    rendererFlags: 0 // 音频渲染器标志。
112  };
113  timerPro = setTimeout(async () => {
114    try {
115      console.info('testTonePlayerPromise: createTonePlayer');
116      // 创建DTMF播放器。
117      tonePlayerPromise = await audio.createTonePlayer(audioRendererInfo);
118      console.info('testTonePlayerPromise: createTonePlayer-success');
119      console.info(`testTonePlayerPromise: load type: ${type}`);
120      // 加载type类型音调。
121      await tonePlayerPromise.load(type);
122      console.info('testTonePlayerPromise: load-success');
123      console.info(`testTonePlayerPromise: start type: ${type}`);
124      // 启动DTMF音调播放。
125      await tonePlayerPromise.start();
126      console.info('testTonePlayerPromise: start-success');
127      console.info(`testTonePlayerPromise: stop type: ${type}`);
128      setTimeout(async()=>{
129        // 停止当前正在播放的音调。
130        await tonePlayerPromise.stop();
131        console.info('testTonePlayerPromise: stop-success');
132        console.info(`testTonePlayerPromise: release type: ${type}`);
133        // 释放与此TonePlayer对象关联的资源。
134        await tonePlayerPromise.release();
135        console.info('testTonePlayerPromise: release-success');
136      }, 30)
137    } catch(err) {
138      let error = err as BusinessError;
139      console.error(`testTonePlayerPromise err : ${error}`);
140    }
141  }, 200)
142};
143
144async function testTonePlayer() {
145   testTonePlayerPromise(audio.ToneType.TONE_TYPE_DIAL_0);
146}
147```
148