diff --git a/zh-cn/application-dev/media/audio-capturer.md b/zh-cn/application-dev/media/audio-capturer.md new file mode 100644 index 0000000000000000000000000000000000000000..f04137a3504c76ab983a91c4a28424f2d8230cca --- /dev/null +++ b/zh-cn/application-dev/media/audio-capturer.md @@ -0,0 +1,161 @@ +# AudioCapturer音频录制开发指南 + +--- +## ***注意***: + 1. 本文档适用于JavaScript。 +--- +## **摘要** +指南提供 JS 应用程序如何使用 AudioCapturer 来录制音频。 +应用程序可以使用本文档中提供的方法来录制原始音频文件。 + +## **音频录制框架** +AudioCapturer 接口是音频框架中最重要的组件之一。 +### **音频录制:** +AudioCapturer 框架提供了用于获取原始音频文件的方法。 + +## **使用步骤** +- 这是一个如何使用 AudioCapturer 获取原始音频文件的示例。 + +1. 使用 **createAudioCapturer()** 创建一个 AudioCapturer 实例。 音频录制器参数可以在**audioCapturerOptions**中设置。 + 该实例可用于录制、控制和获取录制状态,以及注册通知回调。 + + ``` + var audioStreamInfo = { + samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_44100, + channels: audio.AudioChannel.CHANNEL_1, + sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE, + encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW + } + + var audioCapturerInfo = { + source: audio.SourceType.SOURCE_TYPE_MIC, + capturerFlags: 1 + } + + var audioCapturerOptions = { + streamInfo: audioStreamInfo, + capturerInfo: audioCapturerInfo + } + + let audioCapturer = await audio.createAudioCapturer(audioCapturerOptions); + var state = audioRenderer.state; + ``` + +2. (可选)使用 **on('stateChange')** API 订阅音频录制器状态更改事件。 + 如果应用程序想根据录制器中的状态更新采取行动,应用程序可以订阅状态更改事件。 + 应用程序还可以订阅更多事件,例如“markReach”和“periodReach”。 参考[**js-apis-audio.md**](https://gitee.com/openharmony/docs/blob/master/en/application-dev/reference/apis/js-apis-audio.md) 更多详细信息。 + + ``` + audioCapturer.on('stateChange',(state) => { + console.info('AudioCapturerLog: Changed State to : ' + state) + switch (state) { + case audio.AudioState.STATE_PREPARED: + console.info('--------CHANGE IN AUDIO STATE----------PREPARED--------------'); + console.info('Audio State is : Prepared'); + break; + case audio.AudioState.STATE_RUNNING: + console.info('--------CHANGE IN AUDIO STATE----------RUNNING--------------'); + console.info('Audio State is : Running'); + break; + case audio.AudioState.STATE_STOPPED: + console.info('--------CHANGE IN AUDIO STATE----------STOPPED--------------'); + console.info('Audio State is : stopped'); + break; + case audio.AudioState.STATE_RELEASED: + console.info('--------CHANGE IN AUDIO STATE----------RELEASED--------------'); + console.info('Audio State is : released'); + break; + default: + console.info('--------CHANGE IN AUDIO STATE----------INVALID--------------'); + console.info('Audio State is : invalid'); + break; + } + }); + ``` + +3. 在 AudioCapturer 实例上调用 **start()** 方法来启动/恢复录制任务。 + 启动完成后,录制器状态将为 STATE_RUNNING。 然后应用程序可以开始读取缓冲区。 + + ``` + await audioCapturer.start(); + if (audioCapturer.state == audio.AudioState.STATE_RUNNING) { + console.info('AudioRecLog: Capturer started'); + } else { + console.info('AudioRecLog: Capturer start failed'); + } + ``` + +4. 使用 **getBufferSize()** 方法获取要读取的最小缓冲区大小。 + + ``` + var bufferSize = await audioCapturer.getBufferSize(); + console.info('AudioRecLog: buffer size: ' + bufferSize); + ``` + +5. 读取录制器的音频数据并将其转换为字节流。 重复调用**read()** 方法读取数据,直到应用程序想要停止录制。 + + 以下示例显示如何将记录的数据写入文件。 + + ``` + import fileio from '@ohos.fileio'; + + const path = '/data/data/.pulse_dir/capture_js.wav'; + let fd = fileio.openSync(path, 0o102, 0o777); + if (fd !== null) { + console.info('AudioRecLog: file fd created'); + } + else{ + console.info('AudioRecLog: file fd create : FAILED'); + return; + } + + fd = fileio.openSync(path, 0o2002, 0o666); + if (fd !== null) { + console.info('AudioRecLog: file fd opened in append mode'); + } + + var numBuffersToCapture = 150; + while (numBuffersToCapture) { + var buffer = await audioCapturer.read(bufferSize, true); + if (typeof(buffer) == undefined) { + console.info('read buffer failed'); + } else { + var number = fileio.writeSync(fd, buffer); + console.info('AudioRecLog: data written: ' + number); + } + + numBuffersToCapture--; + } + ``` + +6. 录制完成后,调用 AudioCapturer 的 **stop()** 方法 停止录制。 + + ``` + await audioCapturer.stop(); + if (audioCapturer.state == audio.AudioState.STATE_STOPPED) { + console.info('AudioRecLog: Capturer stopped'); + } else { + console.info('AudioRecLog: Capturer stop failed'); + } + ``` + +7. 录制任务完成后,调用AudioCapturer的**release()** 方法释放流资源。 + + ``` + await audioCapturer.release(); + if (audioCapturer.state == audio.AudioState.STATE_RELEASED) { + console.info('AudioRecLog: Capturer released'); + } else { + console.info('AudioRecLog: Capturer release failed'); + } + ``` +## **状态检查的重要性** + +应用程序开发人员应该记住,AudioCapturer 是基于状态的。 + +也就是说,AudioCapturer 有一个内部状态,应用程序在调用录制器控制 API 时必须始终检查该状态,因为某些操作仅在录制器处于给定状态时才可接受。 +如果应用程序在录制器处于不正确状态时执行操作,系统可能会抛出错误/异常或生成其他未定义的行为。 + +## **其他方法** + +更多有用的方法详见[**js api audio.md**](https://gitee.com/openharmony/docs/blob/master/en/application-dev/reference/apis/js-apis-audio.md),如**getAudioTime**、**getCapturerInfo**和**getStreamInfo**。 diff --git a/zh-cn/application-dev/media/audio-renderer.md b/zh-cn/application-dev/media/audio-renderer.md new file mode 100644 index 0000000000000000000000000000000000000000..390ae77c0ac77334fe2095f6f248478237b93d11 --- /dev/null +++ b/zh-cn/application-dev/media/audio-renderer.md @@ -0,0 +1,294 @@ +# AudioRenderer音频播放开发指南 + +--- + +## ***注意***: + + 1. 本文档适用于JavaScript。 + +--- + +## **摘要** + +本指南将向您展示如何使用AudioRenderer创建音频播放器应用程序。 +您可以使用本文档中提供的API在输出设备中播放音频文件,并管理播放任务。 + +## **音频播放框架** + +AudioRenderer接口是音频框架中最重要的组件之一。 + +### **音频播放:** + +AudioRenderer框架提供了用于播放音频文件和控制播放的接口。 + +### **音频中断:** + +当较高优先级的流想要播放时,AudioRenderer 框架会中断较低优先级的流。 +例如,如果您在听音乐时有来电,则音乐播放作为较低优先级的流将被暂停。 +通过下面的示例代码,我们将详细了解 AudioInterrupt 的工作原理。 +
+请参阅 [**js-apis-audio.md**](https://gitee.com/openharmony/docs/blob/master/en/application-dev/reference/apis/js-apis-audio.md) 获取支持的音频流类型和格式的列表,例如 AudioSampleFormat、AudioChannel、AudioSampleFormat 和 AudioEncodingType。 + + +## **使用步骤** + +- 下面是一个如何使用AudioRenderer播放原始音频文件的示例。 + +1. 使用 **createAudioRenderer** 创建一个 AudioRenderer 实例。播放器参数可以在**audioRendererOptions**中设置。 + 该对象可用于播放、控制和获取播放状态,以及接收回调通知。 + + ``` + var audioStreamInfo = { + samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_44100, + channels: audio.AudioChannel.CHANNEL_1, + sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE, + encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW + } + + var audioRendererInfo = { + content: audio.ContentType.CONTENT_TYPE_SPEECH, + usage: audio.StreamUsage.STREAM_USAGE_VOICE_COMMUNICATION, + rendererFlags: 1 + } + + var audioRendererOptions = { + streamInfo: audioStreamInfo, + rendererInfo: audioRendererInfo + } + + let audioRenderer = await audio.createAudioRenderer(audioRendererOptions); + ``` + +2. 使用 **on** 方法订阅音频中断事件。 + 当优先级更高或相等的 Stream-B 请求激活并使用输出设备时,Stream-A 被中断。 + 在某些情况下,框架会采取暂停和降低音量等强制操作,并使用 **InterruptEvent** 通知应用程序。 在其他情况下,应用程序可以自行选择对 **InterruptEvent** 做出响应。 当应用程序被强制操作中断时,它应该处理状态、更新用户界面等。 + + 在音频中断的情况下,应用程序可能会遇到写入失败,不感知、不处理中断的应用程序在写入音频数据之前可以使用 **audioRenderer.state** 方法检查播放器状态,而中断可通过此监听获取到更多详细信息。 + + 中断事件信息: + + 1) **eventType:**中断是开始还是结束。 + + | 名称 | 描述 | + | -------------------- | ------------------ | + | INTERRUPT_TYPE_BEGIN | 表示中断已经开始。 | + | INTERRUPT_TYPE_END | 表示中断已经结束。 | + + 2) **forceType:**框架是否已经采取行动,或者是否建议应用程序采取行动。 + + | 名称 | 描述 | + | :-------------- | :------------------------- | + | INTERRUPT_FORCE | 音频状态已被框架更改。 | + | INTERRUPT_SHARE | 应用程序可以决定是否响应。 | + + 3) **hintType:**中断事件类型。 + + | 名称 | 描述 | + | :-------------------- | :----------------- | + | INTERRUPT_HINT_PAUSE | 暂停播放。 | + | INTERRUPT_HINT_RESUME | 恢复播放。 | + | INTERRUPT_HINT_STOP | 停止播放。 | + | INTERRUPT_HINT_DUCK | 降低播放流的音量。 | + | INTERRUPT_HINT_UNDUCK | 恢复播放流的音量。 | + + 4) **某些操作是完全强制或共享的**,分别代表,强制表示框架执行,共享表示应用执行。 + 例如,当音乐流正在进行时收到呼叫时,框架会强制音乐流暂停。调用结束后框架不会强制恢复音乐流.相反,它会提醒应用程序恢复播放。 + + | 名称 | 描述 | + | --------------------- | -------------------------------------------------------- | + | INTERRUPT_HINT_RESUME | forceType类型为:INTERRUPT_SHARE。它只能由应用程序完成。 | + | INTERRUPT_HINT_DUCK | forceType类型为:INTERRUPT_FORCE。它只能由框架来完成。 | + | INTERRUPT_HINT_UNDUCK | forceType类型为:INTERRUPT_FORCE。它只能由框架来完成。 | + + ``` + audioRenderer.on('interrupt', (interruptEvent) => { + console.info('InterruptEvent Received'); + console.info('InterruptType: ' + interruptEvent.eventType); + console.info('InterruptForceType: ' + interruptEvent.forceType); + console.info('AInterruptHint: ' + interruptEvent.hintType); + + if (interruptEvent.forceType == audio.InterruptForceType.INTERRUPT_FORCE) { + switch (interruptEvent.hintType) { + // Force Pause: Action was taken by framework. + // Halt the write calls to avoid data loss. + case audio.InterruptHint.INTERRUPT_HINT_PAUSE: + isPlay = false; + break; + // Force Stop: Action was taken by framework. + // Halt the write calls to avoid data loss. + case audio.InterruptHint.INTERRUPT_HINT_STOP: + isPlay = false; + break; + // Force Duck: Action was taken by framework, + // just notifying the app that volume has been reduced. + case audio.InterruptHint.INTERRUPT_HINT_DUCK: + break; + // Force Unduck: Action was taken by framework, + // just notifying the app that volume has been restored. + case audio.InterruptHint.INTERRUPT_HINT_UNDUCK: + break; + } + } else if (interruptEvent.forceType == audio.InterruptForceType.INTERRUPT_SHARE) { + switch (interruptEvent.hintType) { + // Share Resume: Action is to be taken by App. + // Resume the force paused stream if required. + case audio.InterruptHint.INTERRUPT_HINT_RESUME: + startRenderer(); + break; + // Share Pause: Stream has been interrupted, + // It can choose to pause or play concurrently. + case audio.InterruptHint.INTERRUPT_HINT_PAUSE: + isPlay = false; + pauseRenderer(); + break; + } + } + }); +``` + +3. 在 AudioRenderer 实例上调用 **start()** 函数来启动/恢复播放任务。 + 启动完成后,渲染器状态将为 STATE_RUNNING。 然后您可以开始写入缓冲区。 + + ``` + async function startRenderer() { + var state = audioRenderer.state; + // state should be prepared, paused or stopped. + if (state != audio.AudioState.STATE_PREPARED || state != audio.AudioState.STATE_PAUSED || + state != audio.AudioState.STATE_STOPPED) { + console.info('Renderer is not in a correct state to start'); + return; + } + + await audioRenderer.start(); + + state = audioRenderer.state; + if (state == audio.AudioState.STATE_RUNNING) { + console.info('Renderer started'); + } else { + console.error('Renderer start failed'); + } + } + ``` + +4. 调用 **write** 开始向缓冲区写入数据。 + 将要播放的音频数据读入缓冲区。 反复调用write方法写入数据。 + + ``` + async function writeBuffer(buf) { + var state = audioRenderer.state; + if (state != audio.AudioState.STATE_RUNNING) { + console.error('Renderer is not running, do not write'); + isPlay = false; + return; + } + let writtenbytes = await audioRenderer.write(buf); + + console.info('Actual written bytes: ' + writtenbytes); + if (writtenbytes < 0) { + console.error('Write buffer failed. check the state of renderer'); + } + } + + // Reasonable minimum buffer size for renderer. However, the renderer can accept other read sizes as well. + const bufferSize = await audioRenderer.getBufferSize(); + const path = '/data/file_example_WAV_2MG.wav'; + let ss = fileio.createStreamSync(path, 'r'); + const totalSize = 2146166; // file_example_WAV_2MG.wav + let rlen = 0; + let discardHeader = new ArrayBuffer(44); + ss.readSync(discardHeader); + rlen += 44; + + var id = setInterval(() => { + if (isPlay || isRelease) { + if (rlen >= totalSize || isRelease) { + ss.closeSync(); + stopRenderer(); + clearInterval(id); + } + let buf = new ArrayBuffer(bufferSize); + rlen += ss.readSync(buf); + console.info('Total bytes read from file: ' + rlen); + writeBuffer(buf); + } else { + console.info('check after next interval'); + } + } , 30); // interval to be set based on audio file format + ``` + +5. (可选)在 AudioRenderer 实例上调用 **pause()** 或 **stop()**。 + + ``` + async function pauseRenderer() { + var state = audioRenderer.state; + if (state != audio.AudioState.STATE_RUNNING) { + console.info('Renderer is not running'); + return; + } + + await audioRenderer.pause(); + + state = audioRenderer.state; + if (state == audio.AudioState.STATE_PAUSED) { + console.info('Renderer paused'); + } else { + console.error('Renderer pause failed'); + } + } + + async function stopRenderer() { + var state = audioRenderer.state; + if (state != audio.AudioState.STATE_RUNNING || state != audio.AudioState.STATE_PAUSED) { + console.info('Renderer is not running or paused'); + return; + } + + await audioRenderer.stop(); + + state = audioRenderer.state; + if (state == audio.AudioState.STATE_STOPPED) { + console.info('Renderer stopped'); + } else { + console.error('Renderer stop failed'); + } + } + ``` + +6. 播放任务完成后,调用AudioRenderer实例上的**release()** 函数释放资源。 + AudioRenderer 可以使用大量的系统资源。因此,只要不再需要资源,就必须释放它们。为确保分配给它的任何系统资源都得到适当释放, 您应该始终调用**release()**。 + + ``` + async function releaseRenderer() { + if (state_ == RELEASED || state_ == NEW) { + console.info('Resourced already released'); + return; + } + + await audioRenderer.release(); + + state = audioRenderer.state; + if (state == STATE_RELEASED) { + console.info('Renderer released'); + } else { + console.info('Renderer release failed'); + } + + } + ``` + +## **状态检查的重要性:** + +您还应该记住,AudioRenderer 是基于状态的。 +也就是说,AudioRenderer 有一个内部状态,在调用播放控制 API 时必须始终检查它,因为某些操作仅在音频播放器处于给定状态时才可接受。 +如果您在不正确的状态下执行操作,系统可能会抛出错误/异常或生成其他未定义的行为。 + +## **异步操作:** + +大多数AudioRenderer调用都是异步的。因此,UI线程不会被阻塞。 + +对于每个API,框架都提供callback函数和promise函数。 +在本例中,为了简单起见,使用了promise函数。[**js api audio.md**](https://gitee.com/openharmony/docs/blob/master/en/application-dev/reference/apis/js-apis-audio.md)为callback和promise提供参考。 + +## **其他 APIs 接口:** + +详见[**js api audio.md**](https://gitee.com/openharmony/docs/blob/master/en/application-dev/reference/apis/js-apis-audio.md)获取更有用的API,如getAudioTime、drain和getBufferSize。 \ No newline at end of file diff --git a/zh-cn/application-dev/reference/apis/js-apis-audio.md b/zh-cn/application-dev/reference/apis/js-apis-audio.md index 607758131ea1a1cf097668faf3f64b466abba8f8..d41375211629ad489b7a4d4f23025ec48f2b5417 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-audio.md +++ b/zh-cn/application-dev/reference/apis/js-apis-audio.md @@ -1,7 +1,11 @@ # 音频管理 +<<<<<<< HEAD +该模块提供以下功能:音频管理、音频播放、系统声音管理。 +======= > **说明:** > 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 +>>>>>>> fa9ed42f82b05774857a54cc011927699ad85740 ## 导入模块 @@ -9,8 +13,11 @@ import audio from '@ohos.multimedia.audio'; ``` +## 权限 -## getAudioManager +无 + +## audioManager getAudioManager(): AudioManager @@ -19,6 +26,7 @@ getAudioManager(): AudioManager **系统能力:** SystemCapability.Multimedia.Audio.Core **返回值:** + | 类型 | 说明 | | -------- | -------- | | [AudioManager](#audiomanager) | 音频管理类。 | @@ -28,6 +36,69 @@ getAudioManager(): AudioManager var audioManager = audio.getAudioManager(); ``` +## audioRenderer + +createAudioRenderer(options: AudioRendererOptions): AudioRenderer + +获取音频播放器。 + +**参数**: + +| 参数名 | 类型 | 必填 | 说明 | +| ------- | --------------------------------------------- | ---- | ----------- | +| options | [AudioRendererOptions](#audiorendereroptions) | 是 | 配置播放器. | + +**返回值**: + +| 类型 | 说明 | +| ------------- | ---------------- | +| AudioRenderer | 音频播放器对象。 | + +**示例:** + +``` +var audioStreamInfo = { + samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_44100, + channels: audio.AudioChannel.CHANNEL_1, + sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE, + encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW +} + +var audioRendererInfo = { + content: audio.ContentType.CONTENT_TYPE_SPEECH, + usage: audio.StreamUsage.STREAM_USAGE_VOICE_COMMUNICATION, + rendererFlags: 1 +} + +var audioRendererOptions = { + streamInfo: audioStreamInfo, + rendererInfo: audioRendererInfo +} + +let audioRenderer = await audio.createAudioRenderer(audioRendererOptions); +``` + +## systemSoundManager + +getSystemSoundManager(): SystemSoundManager + +获取 **SystemSoundManager**实例对象。 + +**参数** + +无 + +**返回值** + +| Type | Description | +| ------------------ | -------------- | +| SystemSoundManager | 系统声音管理器 | + +**示例:** + +``` +const systemSoundManager = audio.getSystemSoundManager(); +``` ## AudioVolumeType @@ -64,6 +135,18 @@ var audioManager = audio.getAudioManager(); 枚举,设备类型。 +<<<<<<< HEAD +| 名称 | 默认值 | 描述 | +| -------------- | ------ | ------------------------------------------------------- | +| INVALID | 0 | 无效设备。 | +| SPEAKER | 2 | 扬声器。 | +| WIRED_HEADSET | 3 | 有线耳机。 | +| BLUETOOTH_SCO | 7 | 蓝牙设备SCO连接(Synchronous Connection Oriented)。 | +| BLUETOOTH_A2DP | 8 | 蓝牙设备A2DP连接(Advanced Audio Distribution Profile)。 | +| MIC | 15 | 麦克风。 | + +## AudioRingMode7+ +======= | 名称 | 默认值 | 描述 | | -------------- | ------ | ------------------------------------------------------------ | | INVALID | 0 | 无效设备。
**系统能力:** SystemCapability.Multimedia.Audio.Device | @@ -84,6 +167,7 @@ var audioManager = audio.getAudioManager(); | BLUETOOTH_SCO | 7 | 蓝牙设备SCO连接(Synchronous Connection Oriented)。
**系统能力:** SystemCapability.Multimedia.Audio.Device | ## AudioRingMode +>>>>>>> fa9ed42f82b05774857a54cc011927699ad85740 枚举,铃声模式。 @@ -93,12 +177,200 @@ var audioManager = audio.getAudioManager(); | RINGER_MODE_VIBRATE | 1 | 震动模式。
**系统能力:** SystemCapability.Multimedia.Audio.Communication | | RINGER_MODE_NORMAL | 2 | 响铃模式。
**系统能力:** SystemCapability.Multimedia.Audio.Communication | +## AudioSampleFormat8+ + +枚举,音频采样格式。 + +| 名称 | 默认值 | 描述 | +| --------------------- | ------ | ------------------------ | +| SAMPLE_FORMAT_INVALID | -1 | 无效格式。 | +| SAMPLE_FORMAT_U8 | 0 | 无符号8位整数。 | +| SAMPLE_FORMAT_S16LE | 1 | 带符号的16位整数,小尾数 | +| SAMPLE_FORMAT_S24LE | 2 | 带符号的24位整数,小尾数 | +| SAMPLE_FORMAT_S32LE | 3 | 带符号的24位整数,小尾数 | + +## AudioChannel8+ + +枚举, 音频声道。 + +| 名称 | 默认值 | 描述 | +| --------- | -------- | -------- | +| CHANNEL_1 | 0x1 << 0 | 单声道。 | +| CHANNEL_2 | 0x1 << 1 | 双声道。 | + +## AudioSamplingRate8+ + +枚举,音频采样率。 + +| 名称 | 默认值 | 描述 | +| ----------------- | ------ | -------------- | +| SAMPLE_RATE_8000 | 8000 | 采样率8000。 | +| SAMPLE_RATE_11025 | 11025 | 采样率11025。 | +| SAMPLE_RATE_12000 | 12000 | 采样率12000。 | +| SAMPLE_RATE_16000 | 16000 | 采样率16000。 | +| SAMPLE_RATE_22050 | 22050 | 采样率22050。 | +| SAMPLE_RATE_24000 | 24000 | 采样率24000。 | +| SAMPLE_RATE_32000 | 32000 | 采样率32000。 | +| SAMPLE_RATE_44100 | 44100 | 采样率 44100。 | +| SAMPLE_RATE_48000 | 48000 | 采样率48000。 | +| SAMPLE_RATE_64000 | 64000 | 采样率64000。 | +| SAMPLE_RATE_96000 | 96000 | 采样率96000。 | + +## AudioEncodingType8+ + +枚举,音频编码类型。 + +| 名称 | 默认值 | 描述 | +| --------------------- | ------ | ---------- | +| ENCODING_TYPE_INVALID | -1 | 无效类型。 | +| ENCODING_TYPE_RAW | 0 | RAW类型。 | + +## ContentType8+ + +枚举,媒体类型。 + +| 名称 | 默认值 | 描述 | +| ------------------------- | ------ | ---------------- | +| CONTENT_TYPE_UNKNOWN | 0 | 表示类型为未知。 | +| CONTENT_TYPE_SPEECH | 1 | 表示类型为语音。 | +| CONTENT_TYPE_MUSIC | 2 | 表示类型为音乐。 | +| CONTENT_TYPE_MOVIE | 3 | 表示类型为电影。 | +| CONTENT_TYPE_SONIFICATION | 4 | 表示类型为加密。 | +| CONTENT_TYPE_RINGTONE | 5 | 表示类型为铃声。 | + +## StreamUsage8+ + +枚举,音频流使用类型。 + +| 名称 | 默认值 | 描述 | +| ---------------------------------- | ------ | -------------- | +| STREAM_USAGE_UNKNOWN | 0 | 表示未知。 | +| STREAM_USAGE_MEDIA | 1 | 表示音频。 | +| STREAM_USAGE_VOICE_COMMUNICATION | 2 | 表示语音通信。 | +| STREAM_USAGE_NOTIFICATION_RINGTONE | 3 | 表示通知铃声。 | + +## AudioState8+ + +枚举,音频状态。 + +| 名称 | 默认值 | 描述 | +| -------------- | ------ | ---------------- | +| STATE_INVALID | -1 | 无效状态。 | +| STATE_NEW | 0 | 创建新实例状态。 | +| STATE_PREPARED | 1 | 准备状态。 | +| STATE_RUNNING | 2 | 可运行状态。 | +| STATE_STOPPED | 3 | 停止状态。 | +| STATE_RELEASED | 4 | 释放状态。 | +| STATE_PAUSED | 5 | 暂停状态。 | + +## AudioRendererRate8+ + +枚举,渲染速度。 + +| 名称 | 默认值 | 描述 | +| ------------------ | ------ | ----------- | +| RENDER_RATE_NORMAL | 0 | 正常速度。 | +| RENDER_RATE_DOUBLE | 1 | 双倍速度。 | +| RENDER_RATE_HALF | 2 | 1/2的速度。 | + +## InterruptType8+ + +枚举,中断类型。 + +| 名称 | 默认值 | 描述 | +| -------------------- | ------ | ------------------ | +| INTERRUPT_TYPE_BEGIN | 1 | 音频播放中断开始。 | +| INTERRUPT_TYPE_END | 2 | 音频播放中断结束。 | + +## InterruptForceType8+ + +枚举,强制打断类型。 + +| 名称 | 默认值 | 描述 | +| --------------- | ------ | ------------------------- | +| INTERRUPT_FORCE | 0 | 由系统采取强制操作。 | +| INTERRUPT_SHARE | 1 | App可以选择采取行动或忽略 | + +## InterruptHint8+ + + 枚举,中断提示。 + +| 名称 | 默认值 | 描述 | +| --------------------- | ------ | ---------------------------------------- | +| INTERRUPT_HINT_NONE | 0 | 无。 | +| INTERRUPT_HINT_RESUME | 1 | 恢复播放。 | +| INTERRUPT_HINT_PAUSE | 2 | 暂停/被暂停播放。 | +| INTERRUPT_HINT_STOP | 3 | 停止/被停止播放。 | +| INTERRUPT_HINT_DUCK | 4 | 音频躲避。(躲避:音量减弱,而不会停止) | +| INTERRUPT_HINT_UNDUCK | 5 | 恢复音量。 | + +## AudioStreamInfo8+ + +描述音频流信息。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------------ | --------------------------------------- | ---- | -------------------------- | +| samplingRate | [AudioSamplingRate](#audiosamplingrate) | 是 | 表示播放音频文件的采样率。 | +| channels | [AudioChannel](#audiochannel) | 是 | 表示播放音频文件的通道数。 | +| sampleFormat | [AudioSampleFormat](#audiosampleformat) | 是 | 表示音频采样格式。 | +| encodingType | [AudioEncodingType](#audioencodingtype) | 是 | 表示音频编码格式。 | + +## AudioRendererInfo8+ + +描述音频渲染器信息。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------------- | --------------------------- | ---- | -------------------- | +| contentType | [ContentType](#contenttype) | 是 | 表示媒体类型。 | +| usage | [StreamUsage](#streamusage) | 是 | 表示音频流使用类型。 | +| rendererFlags | number | 是 | 表示音频渲染器标志。 | + +## AudioRendererOptions8+ + +描述音频渲染器信息。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------------ | --------------------------------------- | ---- | ---------------- | +| streamInfo | [AudioStreamInfo](#audiostreaminfo) | 是 | 表示音频流信息。 | +| rendererInfo | [AudioRendererInfo](#audiorendererinfo) | 是 | 表示播放器信息。 | + +## InterruptEvent8+ + +描述播放中断时应用程序接收的中断事件。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| --------- | ----------------------------------------- | ---- | ------------------------------------------ | +| eventType | [InterruptType](#interrupttype) | 是 | 表示指示中断是开始还是结束。 | +| forceType | [InterruptForceType](#interruptforcetype) | 是 | 表示指示操作是由系统执行还是由应用程序执行 | +| hintType | [InterruptHint](#interrupthint) | 是 | 表示系统已采取或应用程序将采取的操作。 | -## AudioManager +## VolumeEvent8+ + +描述应用程序在音量发生更改时接收的事件。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ---------- | ----------------------------------- | ---- | -------------------------------------------------------- | +| volumeType | [AudioVolumeType](#AudioVolumeType) | 是 | 音量流类型。 | +| volume | number | 是 | 音量等级,可设置范围通过getMinVolume和getMaxVolume获取。 | +| updateUi | boolean | 是 | 在Ui中显示音量变化。 | + + + +# AudioManager 管理音频音量和音频设备。 -### setVolume +## audioManager.setVolume setVolume(volumeType: AudioVolumeType, volume: number, callback: AsyncCallback<void>): void @@ -114,10 +386,13 @@ setVolume(volumeType: AudioVolumeType, volume: number, callback: AsyncCallback&l | volume | number | 是 | 音量等级,可设置范围通过getMinVolume和getMaxVolume获取。 | | callback | AsyncCallback<void> | 是 | 回调表示成功还是失败。 | +**返回值:** + +无 + **示例:** ``` -var audioManager = audio.getAudioManager(); audioManager.setVolume(audio.AudioVolumeType.MEDIA, 10, (err)=>{ if (err) { console.error('Failed to set the volume. ${err.message}'); @@ -127,7 +402,7 @@ audioManager.setVolume(audio.AudioVolumeType.MEDIA, 10, (err)=>{ }) ``` -### setVolume +## audioManager.setVolume setVolume(volumeType: AudioVolumeType, volume: number): Promise<void> @@ -151,13 +426,12 @@ setVolume(volumeType: AudioVolumeType, volume: number): Promise<void> **示例:** ``` -var audioManager = audio.getAudioManager(); audioManager.setVolume(audio.AudioVolumeType.MEDIA, 10).then(()=> console.log('Promise returned to indicate a successful volume setting.'); ) ``` -### getVolume +## audioManager.getVolume getVolume(volumeType: AudioVolumeType, callback: AsyncCallback<number>): void @@ -172,10 +446,13 @@ getVolume(volumeType: AudioVolumeType, callback: AsyncCallback<number>): v | volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | | callback | AsyncCallback<number> | 是 | 回调返回音量大小。 | +**返回值:** + +无 + **示例:** ``` -var audioManager = audio.getAudioManager(); audioManager.getVolume(audio.AudioVolumeType.MEDIA, (err, value) => { if (err) { console.error('Failed to obtain the volume. ${err.message}'); @@ -185,7 +462,7 @@ audioManager.getVolume(audio.AudioVolumeType.MEDIA, (err, value) => { }) ``` -### getVolume +## audioManager.getVolume getVolume(volumeType: AudioVolumeType): Promise<number> @@ -208,13 +485,12 @@ getVolume(volumeType: AudioVolumeType): Promise<number> **示例:** ``` -var audioManager = audio.getAudioManager(); audioManager.getVolume(audio.AudioVolumeType.MEDIA).then((value) => console.log('Promise returned to indicate that the volume is obtained.' + value); ) ``` -### getMinVolume +## audioManager.getMinVolume getMinVolume(volumeType: AudioVolumeType, callback: AsyncCallback<number>): void @@ -229,10 +505,13 @@ getMinVolume(volumeType: AudioVolumeType, callback: AsyncCallback<number>) | volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | | callback | AsyncCallback<number> | 是 | 回调返回最小音量。 | +**返回值:** + +无 + **示例:** ``` -var audioManager = audio.getAudioManager(); audioManager.getMinVolume(audio.AudioVolumeType.MEDIA, (err, value) => { if (err) { console.error('Failed to obtain the minimum volume. ${err.message}'); @@ -242,7 +521,7 @@ audioManager.getMinVolume(audio.AudioVolumeType.MEDIA, (err, value) => { }) ``` -### getMinVolume +## audioManager.getMinVolume getMinVolume(volumeType: AudioVolumeType): Promise<number> @@ -265,13 +544,12 @@ getMinVolume(volumeType: AudioVolumeType): Promise<number> **示例:** ``` -var audioManager = audio.getAudioManager(); audioManager.getMinVolume(audio.AudioVolumeType.MEDIA).then((value) => console.log('Promised returned to indicate that the minimum volume is obtained.' + value); ) ``` -### getMaxVolume +## audioManager.getMaxVolume getMaxVolume(volumeType: AudioVolumeType, callback: AsyncCallback<number>): void @@ -286,10 +564,13 @@ getMaxVolume(volumeType: AudioVolumeType, callback: AsyncCallback<number>) | volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | | callback | AsyncCallback<number> | 是 | 回调返回最大音量大小。 | +**返回值:** + +无 + **示例:** ``` -var audioManager = audio.getAudioManager(); audioManager.getMaxVolume(audio.AudioVolumeType.MEDIA, (err, value) => { if (err) { console.error('Failed to obtain the maximum volume. ${err.message}'); @@ -299,7 +580,7 @@ audioManager.getMaxVolume(audio.AudioVolumeType.MEDIA, (err, value) => { }) ``` -### getMaxVolume +## audioManager.getMaxVolume getMaxVolume(volumeType: AudioVolumeType): Promise<number> @@ -322,13 +603,20 @@ getMaxVolume(volumeType: AudioVolumeType): Promise<number> **示例:** ``` -var audioManager = audio.getAudioManager(); -audioManager.getMaxVolume(audio.AudioVolumeType.MEDIA).then((data)=> - console.log('Promised returned to indicate that the maximum volume is obtained.'); -) +audioManager.mute(audio.AudioVolumeType.MEDIA, true, (err) => { + if (err) { + console.error('Failed to mute the stream. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the stream is muted.'); +}) ``` +<<<<<<< HEAD +## audioManager.mute +======= ### mute +>>>>>>> fa9ed42f82b05774857a54cc011927699ad85740 mute(volumeType: AudioVolumeType, mute: boolean, callback: AsyncCallback<void>): void @@ -344,20 +632,27 @@ mute(volumeType: AudioVolumeType, mute: boolean, callback: AsyncCallback<void | mute | boolean | 是 | 静音状态,true为静音,false为非静音。 | | callback | AsyncCallback<void> | 是 | 回调表示成功还是失败。 | +**返回值:** + +无 + **示例:** ``` -var audioManager = audio.getAudioManager(); -audioManager.mute(audio.AudioVolumeType.MEDIA, true, (err) => { - if (err) { - console.error('Failed to mute the stream. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the stream is muted.'); +audioManager.getVolume(audio.AudioVolumeType.MEDIA, (err, value) => { + if (err) { + console.error('Failed to obtain the volume. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the volume is obtained.'); }) ``` +<<<<<<< HEAD +## audioManager.mute +======= ### mute +>>>>>>> fa9ed42f82b05774857a54cc011927699ad85740 mute(volumeType: AudioVolumeType, mute: boolean): Promise<void> @@ -382,14 +677,17 @@ mute(volumeType: AudioVolumeType, mute: boolean): Promise<void> ``` -var audioManager = audio.getAudioManager(); audioManager.mute(audio.AudioVolumeType.MEDIA, true).then(() => console.log('Promise returned to indicate that the stream is muted.'); ) ``` +<<<<<<< HEAD +## audioManager.isMute +======= ### isMute +>>>>>>> fa9ed42f82b05774857a54cc011927699ad85740 isMute(volumeType: AudioVolumeType, callback: AsyncCallback<boolean>): void @@ -404,10 +702,13 @@ isMute(volumeType: AudioVolumeType, callback: AsyncCallback<boolean>): voi | volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | | callback | AsyncCallback<boolean> | 是 | 回调返回流静音状态,true为静音,false为非静音。 | +**返回值:** + +无 + **示例:** ``` -var audioManager = audio.getAudioManager(); audioManager.isMute(audio.AudioVolumeType.MEDIA, (err, value) => { if (err) { console.error('Failed to obtain the mute status. ${err.message}'); @@ -418,7 +719,11 @@ audioManager.isMute(audio.AudioVolumeType.MEDIA, (err, value) => { ``` +<<<<<<< HEAD +## audioManager.isMute +======= ### isMute +>>>>>>> fa9ed42f82b05774857a54cc011927699ad85740 isMute(volumeType: AudioVolumeType): Promise<boolean> @@ -441,13 +746,16 @@ isMute(volumeType: AudioVolumeType): Promise<boolean> **示例:** ``` -var audioManager = audio.getAudioManager(); audioManager.isMute(audio.AudioVolumeType.MEDIA).then((value) => console.log('Promise returned to indicate that the mute status of the stream is obtained.' + value); ) ``` +<<<<<<< HEAD +## audioManager.isActive +======= ### isActive +>>>>>>> fa9ed42f82b05774857a54cc011927699ad85740 isActive(volumeType: AudioVolumeType, callback: AsyncCallback<boolean>): void @@ -462,10 +770,13 @@ isActive(volumeType: AudioVolumeType, callback: AsyncCallback<boolean>): v | volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | | callback | AsyncCallback<boolean> | 是 | 回调返回流的活跃状态,true为活跃,false为不活跃。 | +**返回值:** + +无 + **示例:** ``` -var audioManager = audio.getAudioManager(); audioManager.isActive(audio.AudioVolumeType.MEDIA, (err, value) => { if (err) { console.error('Failed to obtain the active status of the stream. ${err.message}'); @@ -475,7 +786,11 @@ audioManager.isActive(audio.AudioVolumeType.MEDIA, (err, value) => { }) ``` +<<<<<<< HEAD +## audioManager.isActive +======= ### isActive +>>>>>>> fa9ed42f82b05774857a54cc011927699ad85740 isActive(volumeType: AudioVolumeType): Promise<boolean> @@ -498,13 +813,16 @@ isActive(volumeType: AudioVolumeType): Promise<boolean> **示例:** ``` -var audioManager = audio.getAudioManager(); audioManager.isActive(audio.AudioVolumeType.MEDIA).then((value) => console.log('Promise returned to indicate that the active status of the stream is obtained.' + value); ) ``` +<<<<<<< HEAD +## audioManager.setRingerMode +======= ### setRingerMode +>>>>>>> fa9ed42f82b05774857a54cc011927699ad85740 setRingerMode(mode: AudioRingMode, callback: AsyncCallback<void>): void @@ -516,13 +834,16 @@ setRingerMode(mode: AudioRingMode, callback: AsyncCallback<void>): void | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| mode | [AudioRingMode](#audioringmode) | 是 | 音频铃声模式。 | +| mode | [AudioRingMode](#section14948916131018) | 是 | 音频铃声模式。 | | callback | AsyncCallback<void> | 是 | 回调返回设置成功或失败。 | +**返回值:** + +无 + **示例:** ``` -var audioManager = audio.getAudioManager(); audioManager.setRingerMode(audio.AudioRingMode.RINGER_MODE_NORMAL, (err) => { if (err) { console.error('Failed to set the ringer mode.​ ${err.message}'); @@ -532,7 +853,11 @@ audioManager.setRingerMode(audio.AudioRingMode.RINGER_MODE_NORMAL, (err) => { }) ``` +<<<<<<< HEAD +## audioManager.setRingerMode +======= ### setRingerMode +>>>>>>> fa9ed42f82b05774857a54cc011927699ad85740 setRingerMode(mode: AudioRingMode): Promise<void> @@ -544,7 +869,7 @@ setRingerMode(mode: AudioRingMode): Promise<void> | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| mode | [AudioRingMode](#audioringmode) | 是 | 音频铃声模式。 | +| mode | [AudioRingMode](#audioringmode7+) | 是 | 音频铃声模式。 | **返回值:** @@ -555,14 +880,17 @@ setRingerMode(mode: AudioRingMode): Promise<void> **示例:** ``` -var audioManager = audio.getAudioManager(); audioManager.setRingerMode(audio.AudioRingMode.RINGER_MODE_NORMAL).then(() => console.log('Promise returned to indicate a successful setting of the ringer mode.'); ) ``` +<<<<<<< HEAD +## audioManager.getRingerMode +======= ### getRingerMode +>>>>>>> fa9ed42f82b05774857a54cc011927699ad85740 getRingerMode(callback: AsyncCallback<AudioRingMode>): void @@ -574,12 +902,15 @@ getRingerMode(callback: AsyncCallback<AudioRingMode>): void | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | -| callback | AsyncCallback<[AudioRingMode](#audioringmode)> | 是 | 回调返回系统的铃声模式。 | +| callback | AsyncCallback<[AudioRingMode](#audioringmode7+)> | 是 | 回调返回系统的铃声模式。 | + +**返回值:** + +无 **示例:** ``` -var audioManager = audio.getAudioManager(); audioManager.getRingerMode((err, value) => { if (err) { console.error('Failed to obtain the ringer mode.​ ${err.message}'); @@ -590,7 +921,11 @@ audioManager.getRingerMode((err, value) => { ``` +<<<<<<< HEAD +## audioManager.getRingerMode +======= ### getRingerMode +>>>>>>> fa9ed42f82b05774857a54cc011927699ad85740 getRingerMode(): Promise<AudioRingMode> @@ -602,18 +937,21 @@ getRingerMode(): Promise<AudioRingMode> | 类型 | 说明 | | -------- | -------- | -| Promise<[AudioRingMode](#audioringmode)> | Promise回调返回系统的铃声模式。 | +| Promise<[AudioRingMode](#audioringmode7+)> | Promise回调返回系统的铃声模式。 | **示例:** ``` -var audioManager = audio.getAudioManager(); audioManager.getRingerMode().then((value) => console.log('Promise returned to indicate that the ringer mode is obtained.' + value); ) ``` +<<<<<<< HEAD +## audioManager.setAudioParameter +======= ### setAudioParameter +>>>>>>> fa9ed42f82b05774857a54cc011927699ad85740 setAudioParameter(key: string, value: string, callback: AsyncCallback<void>): void @@ -629,10 +967,13 @@ setAudioParameter(key: string, value: string, callback: AsyncCallback<void> | value | string | 是 | 被设置的音频参数的值。 | | callback | AsyncCallback<void> | 是 | 回调返回设置成功或失败。 | +**返回值:** + +无 + **示例:** ``` -var audioManager = audio.getAudioManager(); audioManager.setAudioParameter('PBits per sample', '8 bit', (err) => { if (err) { console.error('Failed to set the audio parameter. ${err.message}'); @@ -642,7 +983,11 @@ audioManager.setAudioParameter('PBits per sample', '8 bit', (err) => { }) ``` +<<<<<<< HEAD +## audioManager.setAudioParameter +======= ### setAudioParameter +>>>>>>> fa9ed42f82b05774857a54cc011927699ad85740 setAudioParameter(key: string, value: string): Promise<void> @@ -666,13 +1011,16 @@ setAudioParameter(key: string, value: string): Promise<void> **示例:** ``` -var audioManager = audio.getAudioManager(); audioManager.setAudioParameter('PBits per sample', '8 bit').then(() => console.log('Promise returned to indicate a successful setting of the audio parameter.'); ) ``` +<<<<<<< HEAD +## audioManager.getAudioParameter +======= ### getAudioParameter +>>>>>>> fa9ed42f82b05774857a54cc011927699ad85740 getAudioParameter(key: string, callback: AsyncCallback<string>): void @@ -687,10 +1035,13 @@ getAudioParameter(key: string, callback: AsyncCallback<string>): void | key | string | 是 | 待获取的音频参数的键。 | | callback | AsyncCallback<string> | 是 | 回调返回获取的音频参数的值。 | +**返回值:** + +无 + **示例:** ``` -var audioManager = audio.getAudioManager(); audioManager.getAudioParameter('PBits per sample', (err, value) => { if (err) { console.error('Failed to obtain the value of the audio parameter. ${err.message}'); @@ -700,7 +1051,11 @@ audioManager.getAudioParameter('PBits per sample', (err, value) => { }) ``` +<<<<<<< HEAD +## audioManager.getAudioParameter +======= ### getAudioParameter +>>>>>>> fa9ed42f82b05774857a54cc011927699ad85740 getAudioParameter(key: string): Promise<string> @@ -723,13 +1078,12 @@ getAudioParameter(key: string): Promise<string> **示例:** ``` -var audioManager = audio.getAudioManager(); audioManager.getAudioParameter('PBits per sample').then((value) => console.log('Promise returned to indicate that the value of the audio parameter is obtained.' + value); ) ``` -### getDevices +## audioManager.getDevices getDevices(deviceFlag: DeviceFlag, callback: AsyncCallback<AudioDeviceDescriptors>): void @@ -744,9 +1098,13 @@ getDevices(deviceFlag: DeviceFlag, callback: AsyncCallback<AudioDeviceDescrip | deviceFlag | [DeviceFlag](#deviceflag) | 是 | 设备类型的flag。 | | callback | AsyncCallback<[AudioDeviceDescriptors](#audiodevicedescriptors)> | 是 | 回调,返回设备列表。 | +**返回值:** + +无 + **示例:** + ``` -var audioManager = audio.getAudioManager(); audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG, (err, value)=>{ if (err) { console.error('Failed to obtain the device list. ${err.message}'); @@ -756,7 +1114,7 @@ audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG, (err, value)=>{ }) ``` -### getDevices +## audioManager.getDevices (deviceFlag: DeviceFlag): Promise<AudioDeviceDescriptors> @@ -779,13 +1137,16 @@ audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG, (err, value)=>{ **示例:** ``` -var audioManager = audio.getAudioManager(); audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG).then((data)=> console.log('Promise returned to indicate that the device list is obtained.'); ) ``` +<<<<<<< HEAD +## audioManager.setDeviceActive +======= ### setDeviceActive +>>>>>>> fa9ed42f82b05774857a54cc011927699ad85740 setDeviceActive(deviceType: DeviceType, active: boolean, callback: AsyncCallback<void>): void @@ -801,10 +1162,13 @@ setDeviceActive(deviceType: DeviceType, active: boolean, callback: AsyncCallback | active | boolean | 是 | 设备激活状态。 | | callback | AsyncCallback<void> | 是 | 回调返回设置成功或失败。 | +**返回值:** + +无 + **示例:** ``` -var audioManager = audio.getAudioManager(); audioManager.setDeviceActive(audio.DeviceType.SPEAKER, true, (err)=> { if (err) { console.error('Failed to set the active status of the device. ${err.message}'); @@ -814,7 +1178,11 @@ audioManager.setDeviceActive(audio.DeviceType.SPEAKER, true, (err)=> { }) ``` +<<<<<<< HEAD +## audioManager.setDeviceActive +======= ### setDeviceActive +>>>>>>> fa9ed42f82b05774857a54cc011927699ad85740 setDeviceActive(deviceType: DeviceType, active: boolean): Promise<void> @@ -839,13 +1207,16 @@ setDeviceActive(deviceType: DeviceType, active: boolean): Promise<void> ``` -var audioManager = audio.getAudioManager(); audioManager.setDeviceActive(audio.DeviceType.SPEAKER, true).then(()=> console.log('Promise returned to indicate that the device is set to the active status.'); ) ``` +<<<<<<< HEAD +## audioManager.isDeviceActive +======= ### isDeviceActive +>>>>>>> fa9ed42f82b05774857a54cc011927699ad85740 isDeviceActive(deviceType: DeviceType, callback: AsyncCallback<boolean>): void @@ -860,10 +1231,13 @@ isDeviceActive(deviceType: DeviceType, callback: AsyncCallback<boolean>): | deviceType | [DeviceType](#devicetype) | 是 | 音频设备类型。 | | callback | AsyncCallback<boolean> | 是 | 回调返回设备的激活状态。 | +**返回值** + +无 + **示例:** ``` -var audioManager = audio.getAudioManager(); audioManager.isDeviceActive(audio.DeviceType.SPEAKER, (err, value) => { if (err) { console.error('Failed to obtain the active status of the device. ${err.message}'); @@ -874,7 +1248,11 @@ audioManager.isDeviceActive(audio.DeviceType.SPEAKER, (err, value) => { ``` +<<<<<<< HEAD +## audioManager.isDeviceActive +======= ### isDeviceActive +>>>>>>> fa9ed42f82b05774857a54cc011927699ad85740 isDeviceActive(deviceType: DeviceType): Promise<boolean> @@ -897,13 +1275,16 @@ isDeviceActive(deviceType: DeviceType): Promise<boolean> **示例:** ``` -var audioManager = audio.getAudioManager(); audioManager.isDeviceActive(audio.DeviceType.SPEAKER).then((value) => console.log('Promise returned to indicate that the active status of the device is obtained.' + value); ) ``` +<<<<<<< HEAD +## audioManager.setMicrophoneMute +======= ### setMicrophoneMute +>>>>>>> fa9ed42f82b05774857a54cc011927699ad85740 setMicrophoneMute(mute: boolean, callback: AsyncCallback<void>): void @@ -918,10 +1299,13 @@ setMicrophoneMute(mute: boolean, callback: AsyncCallback<void>): void | mute | boolean | 是 | 待设置的静音状态,true为静音,false为非静音。 | | callback | AsyncCallback<void> | 是 | 回调返回设置成功或失败。 | +**返回值** + +无 + **示例:** ``` -var audioManager = audio.getAudioManager(); audioManager.setMicrophoneMute(true, (err) => { if (err) { console.error('Failed to mute the microphone. ${err.message}'); @@ -931,7 +1315,11 @@ audioManager.setMicrophoneMute(true, (err) => { }) ``` +<<<<<<< HEAD +## audioManager.setMicrophoneMute +======= ### setMicrophoneMute +>>>>>>> fa9ed42f82b05774857a54cc011927699ad85740 setMicrophoneMute(mute: boolean): Promise<void> @@ -960,7 +1348,11 @@ audioManager.setMicrophoneMute(true).then(() => ) ``` +<<<<<<< HEAD +## audioManager.isMicrophoneMute +======= ### isMicrophoneMute +>>>>>>> fa9ed42f82b05774857a54cc011927699ad85740 isMicrophoneMute(callback: AsyncCallback<boolean>): void @@ -974,10 +1366,13 @@ isMicrophoneMute(callback: AsyncCallback<boolean>): void | -------- | -------- | -------- | -------- | | callback | AsyncCallback<boolean> | 是 | 回调返回系统麦克风静音状态,true为静音,false为非静音。 | +**返回值** + +无 + **示例:** ``` -var audioManager = audio.getAudioManager(); audioManager.isMicrophoneMute((err, value) => { if (err) { console.error('Failed to obtain the mute status of the microphone. ${err.message}'); @@ -987,7 +1382,11 @@ audioManager.isMicrophoneMute((err, value) => { }) ``` +<<<<<<< HEAD +## audioManager.isMicrophoneMute +======= ### isMicrophoneMute +>>>>>>> fa9ed42f82b05774857a54cc011927699ad85740 isMicrophoneMute(): Promise<boolean> @@ -1005,25 +1404,764 @@ isMicrophoneMute(): Promise<boolean> ``` -var audioManager = audio.getAudioManager(); audioManager.isMicrophoneMute().then((value) => console.log('Promise returned to indicate that the mute status of the microphone is obtained.', + value); ) ``` +## audioManager.on + +on(type: 'volumeChange', callback: Callback): void8+ + + 监听系统音量更改事件, 使用Callback来获取音量更改事件。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------ | ---- | ------------------------ | +| type | string | 是 | 监听的音量改变事件类型。 | +| callback | Callback<[VolumeEvent](#volumevent)> | 是 | 音量改变事件回调方法。 | + +**返回值:** + +无 + +**示例:** + +``` +audioManager.on('volumeChange', (volumeEvent) => { + console.log('VolumeType of stream: ' + volumeEvent.volumeType); + console.log('Volume level: ' + volumeEvent.volume); + console.log('Whether to updateUI: ' + volumeEvent.updateUi); +}) +``` + + + +## audioManager.on + +on(type: 'ringerModeChange', callback: Callback): void8+ + +监听铃声模式更改事件。使用callback来获得铃声模式更改。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------- | ---- | ------------------------------ | +| type | string | 是 | 要监听的事件的类型。 | +| callback | Callback<[AudioRingMode](#audioringmode7+)> | 是 | 用于获取更新的铃声模式的回调。 | + +**返回值:** + +无 + +**示例:** + +``` +audioManager.on('ringerModeChange', (ringerMode) => { + console.log('Updated ringermode: ' + ringerMode); +}) +``` -## AudioDeviceDescriptor +# AudioDeviceDescriptor 描述音频设备。 +<<<<<<< HEAD +======= | 名称 | 参数型 | 可读 | 可写 | 说明 | | -------- | -------- | -------- | -------- | -------- | | deviceRole | [DeviceRole](#devicerole) | 是 | 否 | 设备角色。
**系统能力:** SystemCapability.Multimedia.Audio.Device | | deviceType | [DeviceType](#devicetype) | 是 | 否 | 设备类型。
**系统能力:** SystemCapability.Multimedia.Audio.Device | +>>>>>>> fa9ed42f82b05774857a54cc011927699ad85740 ## AudioDeviceDescriptors | 名称 | 描述 | | -------- | -------- | +<<<<<<< HEAD +| 设备属性数组 | AudioDeviceDescriptor的数组,只读。 | + +## audioDeviceDescriptor.deviceRole + +定义的设备角色( DeviceRole :只读)。 + +| 名称 | 参数型 | 可读 | 可写 | 说明 | +| :--------- | :------------------------ | :--- | :--- | ---------- | +| deviceRole | [DeviceRole](#devicerole) | 是 | 否 | 设备角色。 | + +## audioDeviceDescriptor.deviceType + +定义的设备类型( DeviceType:只读)。 + +| 名称 | 参数型 | 可读 | 可写 | 说明 | +| :--------- | :------------------------ | :--- | :--- | ---------- | +| deviceType | [DeviceType](#devicetype) | 是 | 否 | 设备类型。 | + +``` +function deviceProp(audioDeviceDescriptor, index, array) { + deviceRoleValue = audioDeviceDescriptor.deviceRole; + deviceTypeValue = audioDeviceDescriptor.deviceType; +} + +deviceRoleValue = null; +deviceTypeValue = null; +const promise = audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG); +promise.then(async function (audioDeviceDescriptors) { + console.info('getDevices OUTPUT_DEVICES_FLAG'); + audioDeviceDescriptors.forEach(deviceProp); + if (deviceTypeValue != null && deviceRoleValue != null){ + console.info('OUTPUT_DEVICES_FLAG : Pass'); + expect(true).assertTrue(); + } + else{ + console.error('OUTPUT_DEVICES_FLAG : fail'); + expect(false).assertTrue(); + } + }); + await promise; + done(); +}) +``` + +# AudioRenderer + +提供音频播放的API接口。 + +## audioRenderer.state + +readonly state: AudioState 8+ + +定义当前播放器的状态。 + +**参数:** + +| 名称 | 参数型 | 可读 | 可写 | 说明 | +| ----- | ------------------------- | ---- | ---- | ------------------ | +| state | [AudioState](#audiostate) | 是 | 否 | 音频播放器的状态。 | + +**示例:** + +``` +var state = audioRenderer.state; +``` + +## audioRenderer.getRendererInfo + +getRendererInfo(callback: AsyncCallback): void8+ + +获取当前被创建的音频播放器的信息,使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| :------- | :-------------------------------------------------------- | :--- | :------------------------- | +| callback | AsyncCallback<[AudioRendererInfo](#AudioRendererInfo8+)\> | 是 | 回调返回音频播放器的信息。 | + +**返回值:** + +无 + +**示例:** + +``` +audioRenderer.getRendererInfo((err, rendererInfo)=>{ + console.log('Renderer GetRendererInfo:'); + console.log('Renderer content:' + rendererInfo.content); + console.log('Renderer usage:' + rendererInfo.usage); + console.log('Renderer flags:' + rendererInfo.rendererFlags); +}) +``` + + +## audioRenderer.getRendererInfo + +getParams(): Promise8+ + +获取当前被创建的音频播放器的信息,使用promise方式返回异步结果。 + +**参数:** + +无 + +**返回值:** + +| 类型 | 说明 | +| -------------------------------------------------- | ------------------------------- | +| Promise<[AudioRendererInfo](#AudioRendererInfo8+)> | Promise用于返回音频播放器信息。 | + +**示例:** + +``` +let streamInfo = await audioRenderer.getStreamInfo(); +console.log('Renderer GetStreamInfo:'); +console.log('Renderer sampling rate:' + streamInfo.samplingRate); +console.log('Renderer channel:' + streamInfo.AudioChannel); +console.log('Renderer format:' + streamInfo.AudioSampleFormat); +console.log('Renderer encoding type:' + streamInfo.AudioEncodingType); +``` + +## audioRenderer.start + +start(callback: AsyncCallback): void8+ + +启动音频播放器。使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------- | ---- | ---------------- | +| callback | AsyncCallback | 是 | 返回回调的结果。 | + +**返回值:** + +无 + +**示例:** + +``` +audioRenderer.start((err)=>{ + if (err) { + console.error('Renderer start failed.'); + } else { + console.info('Renderer start success.'); + } +}) +``` + +## audioRenderer.start + +start(): Promise8+ + +启动音频播放器。使用promise方式返回异步结果。 + +**参数:** + +无 + +**返回值:** + +| 类型 | 说明 | +| ------------- | ------------------------- | +| Promise | promise方式返回异步结果。 | + +**示例:** + +``` +await audioRenderer.start(); +``` + +## audioRenderer.pause + +pause(callback: AsyncCallback): void8+ + +暂停音频播放器。使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------- | ---- | ---------------- | +| callback | AsyncCallback | 是 | 返回回调的结果。 | + +**返回值:** + +无 + +**示例:** + +``` +audioRenderer.pause((err)=>{ + if (err) { + console.error('Renderer pause failed'); + } else { + console.log('Renderer paused.'); + } +}) +``` + +## audioRenderer.pause + +pause(): Promise8+ + +暂停音频播放器。使用promise方式返回异步结果。 + +**参数:** + +无 + +**返回值:** + +| 类型 | 说明 | +| ------------- | ------------------------- | +| Promise | promise方式返回异步结果。 | + +**示例:** + +``` +await audioRenderer.pause(); +``` + +## audioRenderer.drain + +drain(callback: AsyncCallback): void8+ + +播放缓冲区是否已被耗尽。使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------- | ---- | ---------------- | +| callback | AsyncCallback | 是 | 返回回调的结果。 | + +**返回值:** + +无 + +**示例:** + +``` +audioRenderer.drain((err)=>{ + if (err) { + console.error('Renderer drain failed'); + } else { + console.log('Renderer drained.'); + } +}) +``` + + + +## audioRenderer.drain + +drain(): Promise8+ + +播放缓冲区是否已被耗尽。使用promise方式返回异步结果。 + +**参数:** + +无 + +**返回值:** + +| 类型 | 说明 | +| ------------- | ------------------------- | +| Promise | promise方式返回异步结果。 | + +**示例:** + +``` +await audioRenderer.drain(); +``` + +## audioRenderer.stop + +stop(callback: AsyncCallback): void8+ + +停止播放。使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------- | ---- | ---------------- | +| callback | AsyncCallback | 是 | 返回回调的结果。 | + +**返回值:** + +无 + +**示例:** + +``` +audioRenderer.stop((err)=>{ + if (err) { + console.error('Renderer stop failed'); + } else { + console.log('Renderer stopped.'); + } +}) +``` + +## audioRenderer.stop + +stop(): Promise8+ + +停止播放。使用promise方式返回异步结果。 + +**参数:** + +无 + +**返回值:** + +| 类型 | 说明 | +| ------------- | ------------------------- | +| Promise | promise方式返回异步结果。 | + +**示例:** + +``` +await audioRenderer.stop(); +``` + +## audioRenderer.release + +release(callback: AsyncCallback): void8+ + +释放音频播放器。使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------- | ---- | ---------------- | +| callback | AsyncCallback | 是 | 返回回调的结果。 | + +**返回值:** + +无 + +**示例:** + +``` +audioRenderer.release((err)=>{ + if (err) { + console.error('Renderer release failed'); + } else { + console.log('Renderer released.'); + } +}) +``` + +## audioRenderer.release + +release(): Promise8+ + +释放渲染器。使用promise方式返回异步结果。 + +**参数:** + +无 + +**返回值:** + +| 类型 | 说明 | +| ------------- | ------------------------- | +| Promise | promise方式返回异步结果。 | + +**示例:** + +``` +await audioRenderer.release(); +``` + +## audioRenderer.write + +write(buffer: ArrayBuffer, callback: AsyncCallback): void8+ + +写入缓冲区。使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------------- | ---- | --------------------------------------------------- | +| buffer | ArrayBuffer | 是 | 要写入缓冲区的数据。 | +| callback | AsyncCallback | 是 | 回调如果成功,返回写入的字节数,否则返回errorcode。 | + +**返回值:** + +无 + +**示例:** + +``` +let ss = fileio.createStreamSync(filePath, 'r'); +let buf = new ArrayBuffer(bufferSize); +ss.readSync(buf); +audioRenderer.write(buf, (err, writtenbytes)=>{ + if (writtenbytes < 0) { + console.error('write failed.'); + } else { + console.log('Actual written bytes: ' + writtenbytes); + } +}) +``` + +## audioRenderer.write + +write(buffer: ArrayBuffer): Promise8+ + +写入缓冲区。使用promise方式返回异步结果。 + +**参数:** + +无 + +**返回值:** + +| 类型 | 说明 | +| --------------- | ---------------------------------------------------------- | +| Promise | promise回调如果成功,返回写入的字节数,否则返回errorcode。 | + +**Example** + +``` +let ss = fileio.createStreamSync(filePath, 'r'); +let buf = new ArrayBuffer(bufferSize); +ss.readSync(buf); +let writtenbytes = await audioRenderer.write(buf); +if (writtenbytes < 0) { + console.error('write failed.'); +} else { + console.log('Actual written bytes: ' + writtenbytes); +} +``` + +## audioRenderer.getAudioTime + +getAudioTime(callback: AsyncCallback): void8+ + +获取时间戳。使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | --------------------- | ---- | ---------------- | +| callback | AsyncCallback | 是 | 回调返回时间戳。 | + +**返回值:** + +无 + +**示例:** + +``` +audioRenderer.getAudioTime((err, timestamp)=>{ + console.log('Current timestamp: ' + timestamp); +}) +``` + +## audioRenderer.getAudioTime + +getAudioTime(): Promise8+ + +获取时间戳。使用promise方式返回异步结果。 + +**参数:** + +无 + +**返回值:** + +| 类型 | 描述 | +| --------------- | ----------------------- | +| Promise | Promise回调返回时间戳。 | + +**示例:** + +``` +let timestamp = await audioRenderer.getAudioTime(); +console.log('Current timestamp: ' + timestamp); +``` + +## audioRenderer.getBufferSize + +getBufferSize(callback: AsyncCallback): void8+ + +获取音频播放器的最小缓冲区大小。使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | --------------------- | ---- | -------------------- | +| callback | AsyncCallback | 是 | 回调返回缓冲区大小。 | + +**返回值:** + +无 + +**示例:** + +``` +audioRenderer.getBufferSize((err, bufferSize)=>{ + if (err) { + console.error('getBufferSize error'); + } +}) +let buf = new ArrayBuffer(bufferSize); +ss.readSync(buf); +``` + +## audioRenderer.getBufferSize + +getBufferSize(): Promise8+ + +获取音频播放器的最小缓冲区大小。使用promise方式返回异步结果。 + +**参数:** + +无 + +**返回值:** + +| 类型 | 说明 | +| --------------- | --------------------------- | +| Promise | promise回调返回缓冲区大小。 | + +**示例:** + +``` +var bufferSize = await audioRenderer.getBufferSize(); +let buf = new ArrayBuffer(bufferSize); +ss.readSync(buf); +``` + +## audioRenderer.setRenderRate + +setRenderRate(rate: AudioRendererRate, callback: AsyncCallback): voidvoid8+ + +设置音频播放速率。使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | --------------------------------------- | ---- | ------------------------ | +| rate | [AudioRendererRate](#audiorendererrate) | 是 | 播放的速率。 | +| callback | AsyncCallback | 是 | 用于返回执行结果的回调。 | + +**返回值:** + +无 + +**示例:** + +``` +audioRenderer.setRenderRate(audio.AudioRendererRate.RENDER_RATE_NORMAL, (err)=> { + if (err) { + console.error('Failed to set params'); + } else { + console.log('Callback invoked to indicate a successful render rate setting.'); + } +}) +``` + +## audioRenderer.setRenderRate + +setRenderRate(rate: AudioRendererRate): Promise8+ + +设置音频播放速率。使用promise方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ----------------------------------------- | ---- | ------------ | +| rate | [AudioRendererRate](#AudioRendererRate8+) | 是 | 播放的速率。 | + +**返回值:** + +| 类型 | 说明 | +| ------------- | ------------------------- | +| Promise | Promise用于返回执行结果。 | + +**示例:** + +``` +await audioRenderer.setRenderRate(audio.AudioRendererRate.RENDER_RATE_NORMAL); +``` + +## audioRenderer.getRenderRate + +getRenderRate(callback: AsyncCallback): void8+ + +获取当前播放速率。使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------------------------------------------- | ---- | ------------------ | +| callback | AsyncCallback<[AudioRendererRate](#AudioRendererRate8+)> | 是 | 回调返回播放速率。 | + +**返回值:** + +无 + +**示例:** + +``` +audioRenderer.getRenderRate((err, renderrate)=>{ + console.log('getRenderRate: ' + renderrate); +}) +``` + +## audioRenderer.getRenderRate + +getRenderRate(): Promise8+ + +获取当前播放速率。使用promise方式返回异步结果。 + +**参数:** + +无 + +**返回值:** + +| 类型 | 说明 | +| ------------------------------------------------ | ------------------------- | +| Promise<[AudioRendererRate](#audiorendererrate)> | Promise回调返回播放速率。 | + +**示例:** + +``` +let renderRate = await audioRenderer.getRenderRate(); +console.log('getRenderRate: ' + renderrate); +``` + +## audioRenderer.on + +on(type: 'interrupt', callback: Callback): void8+ + +监听音频中断事件。使用callback获取中断事件。中断事件被触发,音频播放被中断。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------- | ---- | ------------------------ | +| type | string | 是 | 被监听的播放事件的类型。 | +| callback | Callback<[InterruptEvent](#interruptevent)> | 是 | 被监听的中断事件的回调。 | + +**返回值:** + +无 + +**示例:** + +``` +audioRenderer.on('interrupt', (interruptEvent) => { + if (interruptEvent.forceType == audio.InterruptForceType.INTERRUPT_FORCE) { + switch (interruptEvent.hintType) { + case audio.InterruptHint.INTERRUPT_HINT_PAUSE: + console.log('Force paused. Stop writing'); + isPlay = false; + break; + case audio.InterruptHint.INTERRUPT_HINT_STOP: + console.log('Force stopped. Stop writing'); + isPlay = false; + break; + } + } else if (interruptEvent.forceType == audio.InterruptForceType.INTERRUPT_SHARE) { + switch (interruptEvent.hintType) { + case audio.InterruptHint.INTERRUPT_HINT_RESUME: + console.log('Resume force paused renderer or ignore'); + startRenderer(); + break; + case audio.InterruptHint.INTERRUPT_HINT_PAUSE: + console.log('Choose to pause or ignore'); + pauseRenderer(); + break; + } + } +}) +``` + +======= | 设备属性数组 | AudioDeviceDescriptor的数组,只读。
**系统能力:** SystemCapability.Multimedia.Audio.Device | +>>>>>>> fa9ed42f82b05774857a54cc011927699ad85740