From 83fcc63eb0be80a2cb587f72aa68c9c422c603e0 Mon Sep 17 00:00:00 2001 From: zengyawen Date: Thu, 5 Aug 2021 15:46:46 +0800 Subject: [PATCH] update media english docs Signed-off-by: zengyawen --- .../js-reference/audio-management.md | 1912 ++++++++++++++--- .../js-reference/audio-playback.md | 386 ++-- ...evelopment-guidelines-on-audio-playback.md | 100 +- .../media/figures/playback-status.png | Bin 44061 -> 23062 bytes 4 files changed, 1873 insertions(+), 525 deletions(-) diff --git a/en/application-dev/js-reference/audio-management.md b/en/application-dev/js-reference/audio-management.md index 28550f1bc4f..e538c610ff6 100644 --- a/en/application-dev/js-reference/audio-management.md +++ b/en/application-dev/js-reference/audio-management.md @@ -1,61 +1,78 @@ -# Audio Management - -- [Modules to Import](#en-us_topic_0000001149807881_s56d19203690d4782bfc74069abb6bd71) -- [Required Permissions](#en-us_topic_0000001149807881_section11257113618419) -- [Functions](#en-us_topic_0000001149807881_section1580114415416) -- [getAudioManager\(\)](#en-us_topic_0000001149807881_section84581011418) -- [Enums](#en-us_topic_0000001149807881_section115029181495) -- [AudioVolumeType](#en-us_topic_0000001149807881_section92261857172218) -- [DeviceFlag](#en-us_topic_0000001149807881_section11285183164210) -- [DeviceRole](#en-us_topic_0000001149807881_section380038142619) -- [DeviceType](#en-us_topic_0000001149807881_section11727420122710) -- [Appendixes](#en-us_topic_0000001149807881_section1933416317165) -- [AudioManager](#en-us_topic_0000001149807881_section8265143814015) - - [setVolume\(AudioVolumeType, number, AsyncCallback\)](#en-us_topic_0000001149807881_section189141826104616) - - [setVolume\(AudioVolumeType, number\)](#en-us_topic_0000001149807881_section102021249114612) - - [getVolume\(AudioVolumeType, AsyncCallback\)](#en-us_topic_0000001149807881_section4387320194714) - - [getVolume\(AudioVolumeType\)](#en-us_topic_0000001149807881_section04121965119) - - [getMinVolume\(AudioVolumeType, AsyncCallback\)](#en-us_topic_0000001149807881_section188714283511) - - [getMinVolume\(AudioVolumeType\)](#en-us_topic_0000001149807881_section41556389511) - - [getMaxVolume\(AudioVolumeType, AsyncCallback\)](#en-us_topic_0000001149807881_section690395418516) - - [getMaxVolume\(AudioVolumeType\)](#en-us_topic_0000001149807881_section155151345217) - - [getDevices\(DeviceFlag, AsyncCallback\)](#en-us_topic_0000001149807881_section11536182020523) - - [getDevices\(DeviceFlag\)](#en-us_topic_0000001149807881_section181733125210) - -- [AudioDeviceDescriptor](#en-us_topic_0000001149807881_section17427121913310) -- [AudioDeviceDescriptors](#en-us_topic_0000001149807881_section5181155710523) - ->![](public_sys-resources/icon-note.gif) **NOTE:** ->Due to permission issues, these feature are temporarily unavailable for the standard system. - -## Modules to Import +# Audio Management + +- [Modules to Import](#s56d19203690d4782bfc74069abb6bd71) +- [Required Permissions](#section11257113618419) +- [getAudioManager\(\): AudioManager](#section84581011418) +- [AudioVolumeType](#section92261857172218) +- [DeviceFlag](#section11285183164210) +- [DeviceRole](#section380038142619) +- [DeviceType](#section11727420122710) +- [AudioRingMode7+](#section14948916131018) +- [AudioManager](#section8265143814015) + - [setVolume\(volumeType: AudioVolumeType, volume: number, callback: AsyncCallback\): void](#section189141826104616) + - [setVolume\(volumeType: AudioVolumeType, volume: number\): Promise](#section102021249114612) + - [getVolume\(volumeType: AudioVolumeType, callback: AsyncCallback\): void](#section4387320194714) + - [getVolume\(volumeType: AudioVolumeType\): Promise](#section04121965119) + - [getMinVolume\(volumeType: AudioVolumeType, callback: AsyncCallback\): void](#section188714283511) + - [getMinVolume\(volumeType: AudioVolumeType\): Promise](#section41556389511) + - [getMaxVolume\(volumeType: AudioVolumeType, callback: AsyncCallback\): void](#section690395418516) + - [getMaxVolume\(volumeType: AudioVolumeType\): Promise](#section155151345217) + - [mute\(volumeType: AudioVolumeType, mute: boolean, callback: AsyncCallback\): void7+](#section13516136134613) + - [mute\(volumeType: AudioVolumeType, mute: boolean\): Promise7+](#section7519036144616) + - [isMute\(volumeType: AudioVolumeType, callback: AsyncCallback\): void7+](#section10684183819585) + - [isMute\(volumeType: AudioVolumeType\): Promise7+](#section6920211145610) + - [isActive\(volumeType: AudioVolumeType, callback: AsyncCallback\): void7+](#section380012544121) + - [isActive\(volumeType: AudioVolumeType\): Promise7+](#section1880315481216) + - [setRingerMode\(mode: AudioRingMode, callback: AsyncCallback\): void7+](#section18572131483613) + - [setRingerMode\(mode: AudioRingMode\): Promise7+](#section55741914143615) + - [getRingerMode\(callback: AsyncCallback\): void7+](#section149044108162) + - [getRingerMode\(\): Promise7+](#section13908210101620) + - [setAudioParameter\(key: string, value: string, callback: AsyncCallback\): void7+](#section1691957174818) + - [setAudioParameter\(key: string, value: string\): Promise7+](#section18121057174820) + - [getAudioParameter\(key: string, callback: AsyncCallback\): void7+](#section1415145714812) + - [getAudioParameter\(key: string\): Promise7+](#section3185577485) + - [getDevices\(deviceFlag: DeviceFlag, callback: AsyncCallback\): void](#section11536182020523) + - [getDevices\(deviceFlag: DeviceFlag\): Promise](#section181733125210) + - [setDeviceActive\(deviceType: DeviceType, active: boolean, callback: AsyncCallback\): void7+](#section103558400222) + - [setDeviceActive\(deviceType: DeviceType, active: boolean\): Promise7+](#section1235914401228) + - [isDeviceActive\(deviceType: DeviceType, callback: AsyncCallback\): void7+](#section12363240122219) + - [isDeviceActive\(deviceType: DeviceType\): Promise7+](#section18366184012213) + - [setMicrophoneMute\(mute: boolean, callback: AsyncCallback\): void7+](#section14703163618122) + - [setMicrophoneMute\(mute: boolean\): Promise7+](#section56287111791) + - [isMicrophoneMute\(callback: AsyncCallback\): void7+](#section6632141119912) + - [isMicrophoneMute\(\): Promise7+](#section196363111918) + +- [AudioDeviceDescriptor](#section164657411927) + - [Attributes](#section4947115405) + +- [AudioDeviceDescriptors](#section5181155710523) + +## Modules to Import ``` import audio from '@ohos.multimedia.audio'; ``` -## Required Permissions +## Required Permissions None -## Functions - -## getAudioManager\(\) +## getAudioManager\(\): AudioManager Obtains an **AudioManager** instance. -**Return Values** +**Return values** - -

Type

+ + - - - @@ -67,278 +84,315 @@ Obtains an **AudioManager** instance. var audioManager = audio.getAudioManager(); ``` -## Enums - -## AudioVolumeType +## AudioVolumeType Enumerates audio stream types. - -

Type

Description

+

Description

AudioManager

+

AudioManager

Audio manager

+

Audio manager

Name

+ + - - - - - - - -

Name

Default Value

+

Default Value

Description

+

Description

MEDIA

+

RINGTONE

1

+

2

Audio streams for media purpose

+

Audio stream for ringtones

RINGTONE

+

MEDIA

2

+

3

Audio streams for ring tones

+

Audio stream for media purpose

-## DeviceFlag +## DeviceFlag Enumerates audio device flags. - -

Name

+ + - - - - - - - - - - -

Name

Default Value

+

Default Value

Description

+

Description

OUTPUT_DEVICES_FLAG

+

OUTPUT_DEVICES_FLAG

1

+

1

Output devices

+

Output device

INPUT_DEVICES_FLAG

+

INPUT_DEVICES_FLAG

2

+

2

Input devices

+

Input device

ALL_DEVICES_FLAG

+

ALL_DEVICES_FLAG

3

+

3

All devices

+

All devices

-## DeviceRole +## DeviceRole -Enumerates device roles. +Enumerates audio device roles. - -

Name

+ + - - - - - - - -

Name

Default Value

+

Default Value

Description

+

Description

INPUT_DEVICE

+

INPUT_DEVICE

1

+

1

Input role

+

Input role

OUTPUT_DEVICE

+

OUTPUT_DEVICE

2

+

2

Output role

+

Output role

-## DeviceType +## DeviceType -Enumerates device types. +Enumerates audio device types. - -

Name

+ + - - - - - - - - - - - - - - - - - - - -

Name

Default Value

+

Default Value

Description

+

Description

INVALID

+

INVALID

0

+

0

Invalid device

+

Invalid device

SPEAKER

+

SPEAKER

1

+

1

Speaker

+

Speaker

WIRED_HEADSET

+

WIRED_HEADSET

2

+

2

Wired headset

+

Wired headset

BLUETOOTH_SCO

+

BLUETOOTH_SCO

3

+

3

Bluetooth device using the synchronous connection oriented link (SCO)

+

Bluetooth device using the synchronous connection oriented (SCO) link

BLUETOOTH_A2DP

+

BLUETOOTH_A2DP

4

+

4

Bluetooth device using advanced audio distribution profile (A2DP)

+

Bluetooth device using the advanced audio distribution profile (A2DP)

MIC

+

MIC

5

+

5

Microphone

+

Microphone

-## Appendixes +## AudioRingMode7+ + +Enumerates ringer modes. + + + + + + + + + + + + + + + + + + + + +

Name

+

Default Value

+

Description

+

RINGER_MODE_SILENT

+

0

+

Silence mode

+

RINGER_MODE_VIBRATE

+

1

+

Vibration mode

+

RINGER_MODE_NORMAL

+

2

+

Normal mode

+
-## AudioManager +## AudioManager -Manages audio volume and audio device information. +Implements audio volume and audio device management. -### setVolume\(AudioVolumeType, number, AsyncCallback\) +### setVolume\(volumeType: AudioVolumeType, volume: number, callback: AsyncCallback\): void -Sets volume for a stream. This method uses an asynchronous callback to return the execution result. +Sets the volume for a stream. This method uses an asynchronous callback to return the execution result. **Parameters** - -

Name

+ + - - - - - - - - - - - - - - -

Name

Type

+

Type

Mandatory

+

Mandatory

Description

+

Description

audioType

+

volumeType

AudioVolumeType

+

AudioVolumeType

Yes

+

Yes

Audio stream type

+

Audio stream type

volume

+

volume

number

+

number

Yes

+

Yes

Volume to set

+

Volume to set. The value range can be obtained by calling getMinVolume and getMaxVolume.

callback

+

callback

AsyncCallback<void>

+

AsyncCallback<void>

Yes

+

Yes

Callback used to return whether the setting is successful

+

Callback used to return the execution result

+**Return values** + +None + **Example** ``` -audioManager.setVolume(audio.AudioVolumeType.MEDIA, 30, (err)=>{ +audioManager.setVolume(audio.AudioVolumeType.MEDIA, 10, (err)=>{ if (err) { - console.error(`failed to set volume ${err.message}`); + console.error('Failed to set the volume. ${err.message}'); return; } - console.log(`Media setVolume successful callback`); + console.log('Callback invoked to indicate a successful volume setting.'); }) ``` -### setVolume\(AudioVolumeType, number\) +### setVolume\(volumeType: AudioVolumeType, volume: number\): Promise -Sets volume for a stream. This method uses a promise to return the execution result. +Sets the volume for a stream. This method uses a promise to return the execution result. **Parameters** - -

Name

+ + - - - - - - - - - - -

Name

Type

+

Type

Mandatory

+

Mandatory

Description

+

Description

audioType

+

volumeType

AudioVolumeType

+

AudioVolumeType

Yes

+

Yes

Audio stream type

+

Audio stream type

volume

+

volume

number

+

number

Yes

+

Yes

Volume to set

+

Volume to set. The value range can be obtained by calling getMinVolume and getMaxVolume.

-**Return Values** +**Return values** - -

Type

+ + - - - @@ -347,102 +401,106 @@ Sets volume for a stream. This method uses a promise to return the execution res **Example** ``` -audioManager.setVolume(audio.AudioVolumeType.MEDIA, 30).then(()=> - console.log(`Media setVolume successful callback`); +audioManager.setVolume(audio.AudioVolumeType.MEDIA, 10).then(()=> + console.log('Promise returned to indicate a successful volume setting.'); ) ``` -### getVolume\(AudioVolumeType, AsyncCallback\) +### getVolume\(volumeType: AudioVolumeType, callback: AsyncCallback\): void -Obtains volume of a stream. This method uses an asynchronous callback to return the execution result. +Obtains the volume of a stream. This method uses an asynchronous callback to return the query result. **Parameters** - -

Type

Description

+

Description

Promise<void>

+

Promise<void>

Promise used to return whether the setting is successful

+

Promise used to return the execution result

Name

+ + - - - - - - - - - - -

Name

Type

+

Type

Mandatory

+

Mandatory

Description

+

Description

audioType

+

volumeType

AudioVolumeType

+

AudioVolumeType

Yes

+

Yes

Audio stream type

+

Audio stream type

callback

+

callback

AsyncCallback<number>

+

AsyncCallback<number>

Yes

+

Yes

Callback used to return the volume

+

Callback used to return the volume

+**Return values** + +None + **Example** ``` -audioManager.getVolume(audio.AudioVolumeType.MEDIA, (err, value)=>{ +audioManager.getVolume(audio.AudioVolumeType.MEDIA, (err, value) => { if (err) { - console.error(`failed to get volume ${err.message}`); + console.error('Failed to obtain the volume. ${err.message}'); return; } - console.log(`Media getVolume successful callback`); + console.log('Callback invoked to indicate that the volume is obtained.'); }) ``` -### getVolume\(AudioVolumeType\) +### getVolume\(volumeType: AudioVolumeType\): Promise -Obtains the volume of a stream. This method uses a promise to return the execution result. +Obtains the volume of a stream. This method uses a promise to return the query result. **Parameters** - -

Name

+ + - - - - - - -

Name

Type

+

Type

Mandatory

+

Mandatory

Description

+

Description

audioType

+

volumeType

AudioVolumeType

+

AudioVolumeType

Yes

+

Yes

Audio stream type

+

Audio stream type

-**Return Values** +**Return values** - -

Type

+ + - - - @@ -451,102 +509,106 @@ Obtains the volume of a stream. This method uses a promise to return the executi **Example** ``` -audioManager.getVolume(audio.AudioVolumeType.MEDIA).then((data)=> - console.log(`Media getVolume successful callback`); +audioManager.getVolume(audio.AudioVolumeType.MEDIA).then((value) => + console.log('Promise returned to indicate that the volume is obtained.' + value); ) ``` -### getMinVolume\(AudioVolumeType, AsyncCallback\) +### getMinVolume\(volumeType: AudioVolumeType, callback: AsyncCallback\): void -Obtains the minimum volume allowed for a stream. This method uses an asynchronous callback to return the execution result. +Obtains the minimum volume allowed for a stream. This method uses an asynchronous callback to return the query result. **Parameters** - -

Type

Description

+

Description

Promise<number>

+

Promise<number>

Promise used to return stream volume

+

Promise used to return the volume

Name

+ + - - - - - - - - - - -

Name

Type

+

Type

Mandatory

+

Mandatory

Description

+

Description

audioType

+

volumeType

AudioVolumeType

+

AudioVolumeType

Yes

+

Yes

Audio stream type

+

Audio stream type

callback

+

callback

AsyncCallback<number>

+

AsyncCallback<number>

Yes

+

Yes

Callback used to return the minimum volume

+

Callback used to return the minimum volume

+**Return values** + +None + **Example** ``` -audioManager.getMinVolume(audio.AudioVolumeType.MEDIA, (err, value)=>{ - if (err) { - console.error(`failed to get minvolume ${err.message}`); - return; - } - console.log(`Media getMinVolume successful callback`); +audioManager.getMinVolume(audio.AudioVolumeType.MEDIA, (err, value) => { + if (err) { + console.error('Failed to obtain the minimum volume. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the minimum volume is obtained.' + value); }) ``` -### getMinVolume\(AudioVolumeType\) +### getMinVolume\(volumeType: AudioVolumeType\): Promise -Obtains the minimum volume allowed for a stream. This method uses a promise to return the execution result. +Obtains the minimum volume allowed for a stream. This method uses a promise to return the query result. **Parameters** - -

Name

+ + - - - - - - -

Name

Type

+

Type

Mandatory

+

Mandatory

Description

+

Description

audioType

+

volumeType

AudioVolumeType

+

AudioVolumeType

Yes

+

Yes

Audio stream type

+

Audio stream type

-**Return Values** +**Return values** - -

Type

+ + - - - @@ -555,102 +617,106 @@ Obtains the minimum volume allowed for a stream. This method uses a promise to r **Example** ``` -audioManager.getMinVolume(audio.AudioVolumeType.MEDIA).then((data)=> - console.log(`Media getMinVolume successful callback`); +audioManager.getMinVolume(audio.AudioVolumeType.MEDIA).then((value) => + console.log('Promised returned to indicate that the minimum volume is obtained.' + value); ) ``` -### getMaxVolume\(AudioVolumeType, AsyncCallback\) +### getMaxVolume\(volumeType: AudioVolumeType, callback: AsyncCallback\): void -Obtains the maximum volume allowed for a stream. This method uses an asynchronous callback to return the execution result. +Obtains the maximum volume allowed for a stream. This method uses an asynchronous callback to return the query result. **Parameters** - -

Type

Description

+

Description

Promise<number>

+

Promise<number>

Promise used to return the minimum volume

+

Promise used to return the minimum volume

Name

+ + - - - - - - - - - - -

Name

Type

+

Type

Mandatory

+

Mandatory

Description

+

Description

audioType

+

volumeType

AudioVolumeType

+

AudioVolumeType

Yes

+

Yes

Audio stream type

+

Audio stream type

callback

+

callback

AsyncCallback<number>

+

AsyncCallback<number>

Yes

+

Yes

Callback used to return the maximum volume

+

Callback used to return the maximum volume

+**Return values** + +None + **Example** ``` -audioManager.getMaxVolume(audio.AudioVolumeType.MEDIA, (err, value)=>{ - if (err) { - console.error(`failed to get maxvolume ${err.message}`); - return; - } - console.log(`Media getMaxVolume successful callback`); +audioManager.getMaxVolume(audio.AudioVolumeType.MEDIA, (err, value) => { + if (err) { + console.error('Failed to obtain the maximum volume. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the maximum volume is obtained.' + value); }) ``` -### getMaxVolume\(AudioVolumeType\) +### getMaxVolume\(volumeType: AudioVolumeType\): Promise -Obtains the maximum volume allowed for a stream. This method uses a promise to return the execution result. +Obtains the maximum volume allowed for a stream. This method uses a promise to return the query result. **Parameters** - -

Name

+ + - - - - - - -

Name

Type

+

Type

Mandatory

+

Mandatory

Description

+

Description

audioType

+

volumeType

AudioVolumeType

+

AudioVolumeType

Yes

+

Yes

Audio stream type

+

Audio stream type

-**Return Values** +**Return values** - -

Type

+ + - - - @@ -660,101 +726,231 @@ Obtains the maximum volume allowed for a stream. This method uses a promise to r ``` audioManager.getMaxVolume(audio.AudioVolumeType.MEDIA).then((data)=> - console.log(`Media getMaxVolume successful callback`); + console.log('Promised returned to indicate that the maximum volume is obtained.'); ) ``` -### getDevices\(DeviceFlag, AsyncCallback\) +### mute\(volumeType: AudioVolumeType, mute: boolean, callback: AsyncCallback\): void7+ -Obtains the audio devices of a specified flag. This method uses an asynchronous callback to return the execution result. +Mutes a stream. This method uses an asynchronous callback to return the execution result. **Parameters** - -

Type

Description

+

Description

Promise<number>

+

Promise<number>

Promise used to return the maximum volume

+

Promise used to return the maximum volume

Name

+ + - - - - + + + - + + - - - - - -

Name

Type

+

Type

Mandatory

+

Mandatory

Description

+

Description

deviceFlag

+

volumeType

+

AudioVolumeType

+

Yes

+

Audio stream type

DeviceFlag

+

mute

+

boolean

Yes

+

Yes

Audio device flag

+

Mute status to set. The value true means to mute the stream, and false means the opposite.

callback

+

callback

AsyncCallback<AudioDeviceDescriptors>

+

AsyncCallback<void>

Yes

+

Yes

Callback used to return the device list

+

Callback used to return the execution result

+**Return values** + +None + **Example** ``` -audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG, (err, value)=>{ +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.'); +}) +``` + +### mute\(volumeType: AudioVolumeType, mute: boolean\): Promise7+ + +Mutes a stream. This method uses a promise to return the execution result. + +**Parameters** + + + + + + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

volumeType

+

AudioVolumeType

+

Yes

+

Audio stream type

+

mute

+

boolean

+

Yes

+

Mute status to set. The value true means to mute the stream, and false means the opposite.

+
+ +**Return values** + + + + + + + + + + +

Type

+

Description

+

Promise<void>

+

Promise used to return the execution result

+
+ +**Example** + +``` +audioManager.mute(audio.AudioVolumeType.MEDIA, true).then(() => + console.log('Promise returned to indicate that the stream is muted.'); +) +``` + +### isMute\(volumeType: AudioVolumeType, callback: AsyncCallback\): void7+ + +Checks whether a stream is muted. This method uses an asynchronous callback to return the query result. + +**Parameters** + + + + + + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

volumeType

+

AudioVolumeType

+

Yes

+

Audio stream type

+

callback

+

AsyncCallback<boolean>

+

Yes

+

Callback used to return the mute status of the stream. The value true means that the stream is muted, and false means the opposite.

+
+ +**Return values** + +None + +**Example** + +``` +audioManager.isMute(audio.AudioVolumeType.MEDIA, (err, value) => { if (err) { - console.error(`failed to get getdevices ${err.message}`); + console.error('Failed to obtain the mute status. ${err.message}'); return; } - console.log(`Media getDevices successful callback`); + console.log('Callback invoked to indicate that the mute status of the stream is obtained.' + value); }) ``` -### getDevices\(DeviceFlag\) +### isMute\(volumeType: AudioVolumeType\): Promise7+ -Obtains the audio devices with a specified flag. This method uses a promise to return the execution result. +Checks whether a stream is muted. This method uses a promise to return the execution result. **Parameters** - -

Name

+ + - - - - - - -

Name

Type

+

Type

Mandatory

+

Mandatory

Description

+

Description

deviceFlag

+

volumeType

DeviceFlag

+

AudioVolumeType

Yes

+

Yes

Audio device flag

+

Audio stream type

-**Return Values** +**Return values** - -

Type

+ + - - - @@ -763,59 +959,1123 @@ Obtains the audio devices with a specified flag. This method uses a promise to r **Example** ``` -audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG).then((data)=> - console.log(`Media getDevices successful callback`); +audioManager.isMute(audio.AudioVolumeType.MEDIA).then((value) => + console.log('Promise returned to indicate that the mute status of the stream is obtained.' + value); +) +``` + +### isActive\(volumeType: AudioVolumeType, callback: AsyncCallback\): void7+ + +Checks whether a stream is active. This method uses an asynchronous callback to return the query result. + +**Parameters** + + +

Type

Description

+

Description

Promise<AudioDeviceDescriptors>

+

Promise<boolean>

Promise used to return the obtained device list

+

Promise used to return the mute status of the stream. The value true means that the stream is muted, and false means the opposite.

+ + + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

volumeType

+

AudioVolumeType

+

Yes

+

Audio stream type

+

callback

+

AsyncCallback<boolean>

+

Yes

+

Callback used to return the active status of the stream. The value true means that the stream is active, and false means the opposite.

+
+ +**Return values** + +None + +**Example** + +``` +audioManager.isActive(audio.AudioVolumeType.MEDIA, (err, value) => { + if (err) { + console.error('Failed to obtain the active status of the stream. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the active status of the stream is obtained.' + value); +}) +``` + +### isActive\(volumeType: AudioVolumeType\): Promise7+ + +Checks whether a stream is active. This method uses a promise to return the query result. + +**Parameters** + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

volumeType

+

AudioVolumeType

+

Yes

+

Audio stream type

+
+ +**Return values** + + + + + + + + + + +

Type

+

Description

+

Promise<boolean>

+

Promise used to return the active status of the stream. The value true means that the stream is active, and false means the opposite.

+
+ +**Example** + +``` +audioManager.isActive(audio.AudioVolumeType.MEDIA).then((value) => + console.log('Promise returned to indicate that the active status of the stream is obtained.' + value); ) ``` -## AudioDeviceDescriptor +### setRingerMode\(mode: AudioRingMode, callback: AsyncCallback\): void7+ + +Sets the ringer mode. This method uses an asynchronous callback to return the execution result. + +**Parameters** + + + + + + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

mode

+

AudioRingMode

+

Yes

+

Ringer mode

+

callback

+

AsyncCallback<void>

+

Yes

+

Callback used to return the execution result

+
+ +**Return values** + +None + +**Example** + +``` +audioManager.setRingerMode(audio.AudioRingMode.RINGER_MODE_NORMAL, (err) => { + if (err) { + console.error('Failed to set the ringer mode.​ ${err.message}'); + return; + } + console.log('Callback invoked to indicate a successful setting of the ringer mode.'); +}) +``` + +### setRingerMode\(mode: AudioRingMode\): Promise7+ + +Sets the ringer mode. This method uses a promise to return the execution result. -Describes audio devices. +**Parameters** - -

Name

+ + - - - - + - - + + +

Name

Type

+

Type

Mandatory

+

Mandatory

Description

+

Description

deviceRole

+

mode

+

AudioRingMode

DeviceRole

+

Yes

No

+

Ringer mode

+
+ +**Return values** + + + + + + + - - +

Type

+

Description

+

Promise<void>

Audio device role

+

Promise used to return the execution result

deviceType

+
+ +**Example** + +``` +audioManager.setRingerMode(audio.AudioRingMode.RINGER_MODE_NORMAL).then(() => + console.log('Promise returned to indicate a successful setting of the ringer mode.'); +) +``` + +### getRingerMode\(callback: AsyncCallback\): void7+ + +Obtains the ringer mode. This method uses an asynchronous callback to return the query result. + +**Parameters** + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

callback

+

AsyncCallback<AudioRingMode>

+

Yes

+

Callback used to return the ringer mode

+
+ +**Return values** + +None + +**Example** + +``` +audioManager.getRingerMode((err, value) => { + if (err) { + console.error('Failed to obtain the ringer mode.​ ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the ringer mode is obtained.' + value); +}) +``` + +### getRingerMode\(\): Promise7+ + +Obtains the ringer mode. This method uses a promise to return the query result. + +**Parameters** + +None + +**Return values** + + + + + + + + + + +

Type

+

Description

+

Promise<AudioRingMode>

+

Promise used to return the ringer mode

+
+ +**Example** + +``` +audioManager.getRingerMode().then((value) => + console.log('Promise returned to indicate that the ringer mode is obtained.' + value); +) +``` + +### setAudioParameter\(key: string, value: string, callback: AsyncCallback\): void7+ + +Sets an audio parameter. This method uses an asynchronous callback to return the execution result. + +**Parameters** + + + + + + + + + + + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

key

+

string

+

Yes

+

Key of the audio parameter to set

+

value

+

string

+

Yes

+

Value of the audio parameter to set

+

callback

+

AsyncCallback<void>

+

Yes

+

Callback used to return the execution result

+
+ +**Return values** + +None + +**Example** + +``` +audioManager.setAudioParameter('PBits per sample', '8 bit', (err) => { + if (err) { + console.error('Failed to set the audio parameter. ${err.message}'); + return; + } + console.log('Callback invoked to indicate a successful setting of the audio parameter.'); +}) +``` + +### setAudioParameter\(key: string, value: string\): Promise7+ + +Sets an audio parameter. This method uses a promise to return the execution result. + +**Parameters** + + + + + + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

key

+

string

+

Yes

+

Key of the audio parameter to set

+

value

+

string

+

Yes

+

Value of the audio parameter to set

+
+ +**Return values** + + + + + + + + + + +

Type

+

Description

+

Promise<void>

+

Promise used to return the execution result

+
+ +**Example** + +``` +audioManager.setAudioParameter('PBits per sample', '8 bit').then(() => + console.log('Promise returned to indicate a successful setting of the audio parameter.'); +) +``` + +### getAudioParameter\(key: string, callback: AsyncCallback\): void7+ + +Obtains the value of an audio parameter. This method uses an asynchronous callback to return the query result. + +**Parameters** + + + + + + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

key

+

string

+

Yes

+

Key of the audio parameter whose value is to be obtained

+

callback

+

AsyncCallback<string>

+

Yes

+

Callback used to return the value of the audio parameter

+
+ +**Return values** + +None + +**Example** + +``` +audioManager.getAudioParameter('PBits per sample', (err, value) => { + if (err) { + console.error('Failed to obtain the value of the audio parameter. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the value of the audio parameter is obtained.' + value); +}) +``` + +### getAudioParameter\(key: string\): Promise7+ + +Obtains the value of an audio parameter. This method uses a promise to return the query result. + +**Parameters** + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

key

+

string

+

Yes

+

Key of the audio parameter whose value is to be obtained

+
+ +**Return values** + + + + + + + + + + +

Type

+

Description

+

Promise<string>

+

Promise used to return the value of the audio parameter

+
+ +**Example** + +``` +audioManager.getAudioParameter('PBits per sample').then((value) => + console.log('Promise returned to indicate that the value of the audio parameter is obtained.' + value); +) +``` + +### getDevices\(deviceFlag: DeviceFlag, callback: AsyncCallback\): void + +Obtains the audio devices with a specific flag. This method uses an asynchronous callback to return the query result. + +**Parameters** + + + + + + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

deviceFlag

+

DeviceFlag

+

Yes

+

Audio device flag

+

callback

+

AsyncCallback<AudioDeviceDescriptors>

+

Yes

+

Callback used to return the device list

+
+ +**Return values** + +None + +**Example** + +``` +audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG, (err, value)=>{ + if (err) { + console.error('Failed to obtain the device list. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the device list is obtained.'); +}) +``` + +### getDevices\(deviceFlag: DeviceFlag\): Promise + +Obtains the audio devices with a specific flag. This method uses a promise to return the query result. + +**Parameters** + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

deviceFlag

+

DeviceFlag

+

Yes

+

Audio device flag

+
+ +**Return values** + + + + + + + + + + +

Type

+

Description

+

Promise<AudioDeviceDescriptors>

+

Promise used to return the device list

+
+ +**Example** + +``` +audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG).then((data)=> + console.log('Promise returned to indicate that the device list is obtained.'); +) +``` + +### setDeviceActive\(deviceType: DeviceType, active: boolean, callback: AsyncCallback\): void7+ + +Sets a device to the active state. This method uses an asynchronous callback to return the execution result. + +**Parameters** + + + + + + + + + + + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

deviceType

+

DeviceType

+

Yes

+

Audio device type

+

active

+

boolean

+

Yes

+

Active status to set. The value true means to set the device to the active status, and false means the opposite.

+

callback

+

AsyncCallback<void>

+

Yes

+

Callback used to return the execution result

+
+ +**Return values** + +None + +**Example** + +``` +audioManager.setDeviceActive(audio.DeviceType.SPEAKER, true, (err)=> { + if (err) { + console.error('Failed to set the active status of the device. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the device is set to the active status.'); +}) +``` + +### setDeviceActive\(deviceType: DeviceType, active: boolean\): Promise7+ + +Sets a device to the active state. This method uses a promise to return the execution result. + +**Parameters** + + + + + + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

deviceType

+

DeviceType

+

Yes

+

Audio device type

+

active

+

boolean

+

Yes

+

Active status to set. The value true means to set the device to the active status, and false means the opposite.

+
+ +**Return values** + + + + + + + + + + +

Type

+

Description

+

Promise<void>

+

Promise used to return the execution result

+
+ +**Example** + +``` +audioManager.setDeviceActive(audio.DeviceType.SPEAKER, true).then(()=> + console.log('Promise returned to indicate that the device is set to the active status.'); +) +``` + +### isDeviceActive\(deviceType: DeviceType, callback: AsyncCallback\): void7+ + +Checks whether a device is active. This method uses an asynchronous callback to return the query result. + +**Parameters** + + + + + + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

deviceType

+

DeviceType

+

Yes

+

Audio device type

+

callback

+

AsyncCallback<boolean>

+

Yes

+

Callback used to return the active status of the device

+
+ +**Return values** + +None + +**Example** + +``` +audioManager.isDeviceActive(audio.DeviceType.SPEAKER, (err, value) => { + if (err) { + console.error('Failed to obtain the active status of the device. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the active status of the device is obtained.'); +}) +``` + +### isDeviceActive\(deviceType: DeviceType\): Promise7+ + +Checks whether a device is active. This method uses a promise to return the query result. + +**Parameters** + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

deviceType

+

DeviceType

+

Yes

+

Audio device type

+
+ +**Return values** + + + + + + + + + + +

Type

+

Description

+

Promise<boolean>

+

Promise used to return the active status of the device

+
+ +**Example** + +``` +audioManager.isDeviceActive(audio.DeviceType.SPEAKER).then((value) => + console.log('Promise returned to indicate that the active status of the device is obtained.' + value); +) +``` + +### setMicrophoneMute\(mute: boolean, callback: AsyncCallback\): void7+ + +Mutes or unmutes the microphone. This method uses an asynchronous callback to return the execution result. + +**Parameters** + + + + + + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

mute

+

boolean

+

Yes

+

Mute status to set. The value true means to mute the microphone, and false means the opposite.

+

callback

+

AsyncCallback<void>

+

Yes

+

Callback used to return the execution result

+
+ +**Return values** + +None + +**Example** + +``` +audioManager.setMicrophoneMute(true, (err) => { + if (err) { + console.error('Failed to mute the microphone. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the microphone is muted.'); +}) +``` + +### setMicrophoneMute\(mute: boolean\): Promise7+ + +Mutes or unmutes the microphone. This method uses a promise to return the execution result. + +**Parameters** + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

mute

+

boolean

+

Yes

+

Mute status to set. The value true means to mute the microphone, and false means the opposite.

+
+ +**Return values** + + + + + + + + + + +

Type

+

Description

+

Promise<void>

+

Promise used to return the execution result

+
+ +**Example** + +``` +audioManager.setMicrophoneMute(true).then(() => + console.log('Promise returned to indicate that the microphone is muted.'); +) +``` + +### isMicrophoneMute\(callback: AsyncCallback\): void7+ + +Checks whether the microphone is muted. This method uses an asynchronous callback to return the query result. + +**Parameters** + + + + + + + + + + + + + + +

Name

+

Type

+

Mandatory

+

Description

+

callback

+

AsyncCallback<boolean>

+

Yes

+

Callback used to return the mute status of the microphone. The value true means that the microphone is muted, and false means the opposite.

+
+ +**Return values** + +None + +**Example** + +``` +audioManager.isMicrophoneMute((err, value) => { + if (err) { + console.error('Failed to obtain the mute status of the microphone. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the mute status of the microphone is obtained.' + value); +}) +``` + +### isMicrophoneMute\(\): Promise7+ + +Checks whether the microphone is muted. This method uses a promise to return the query result. + +**Parameters** + +None + +**Return values** + + + + + + + + + + +

Type

+

Description

+

Promise<boolean>

+

Promise used to return the mute status of the microphone. The value true means that the microphone is muted, and false means the opposite.

+
+ +**Example** + +``` +audioManager.isMicrophoneMute().then((value) => + console.log('Promise returned to indicate that the mute status of the microphone is obtained.', + value); +) +``` + +## AudioDeviceDescriptor + +Describes an audio device. + +### Attributes + + + + + + + + + + + + + + + + + - - -

Name

+

Type

+

Readable

+

Writable

+

Description

+

deviceRole

+

DeviceRole

+

Yes

+

No

+

Audio device role

+

deviceType

+

DeviceType

DeviceType

+

Yes

No

+

No

Audio device type

+

Audio device type

-## AudioDeviceDescriptors +## AudioDeviceDescriptors - -

Name

+ + - - - diff --git a/en/application-dev/js-reference/audio-playback.md b/en/application-dev/js-reference/audio-playback.md index da51b198073..4bb9a494caa 100644 --- a/en/application-dev/js-reference/audio-playback.md +++ b/en/application-dev/js-reference/audio-playback.md @@ -1,61 +1,59 @@ -# Audio Playback - -- [Modules to Import](#en-us_topic_0000001103383404_s56d19203690d4782bfc74069abb6bd71) -- [Required Permissions](#en-us_topic_0000001103383404_section11257113618419) -- [Methods](#en-us_topic_0000001103383404_section125675489541) -- [createAudioPlayer\(\)](#en-us_topic_0000001103383404_section582314017253) -- [Appendixes](#en-us_topic_0000001103383404_section1933416317165) -- [AudioPlayer](#en-us_topic_0000001103383404_section5174142818365) - - [Attributes](#en-us_topic_0000001103383404_section4947115405) - - [play\(\)](#en-us_topic_0000001103383404_section964512672913) - - [pause\(\)](#en-us_topic_0000001103383404_section78173258296) - - [stop\(\)](#en-us_topic_0000001103383404_section122114334296) - - [seek\(number\)](#en-us_topic_0000001103383404_section1387113816298) - - [setVolume\(number\)](#en-us_topic_0000001103383404_section164235176552) - - [release\(\)](#en-us_topic_0000001103383404_section9224621145512) - - [Events](#en-us_topic_0000001103383404_section5453721192911) - - [play](#en-us_topic_0000001103383404_section87307411494) - - [pause](#en-us_topic_0000001103383404_section198217471590) - - [stop](#en-us_topic_0000001103383404_section437616531910) - - [dataLoad](#en-us_topic_0000001103383404_section982114219106) - - [timeUpdate](#en-us_topic_0000001103383404_section13687114181014) - - [volumeChange](#en-us_topic_0000001103383404_section139227715717) - - [finish](#en-us_topic_0000001103383404_section15181321181018) - - [error](#en-us_topic_0000001103383404_section5593132921016) - -- [AudioState](#en-us_topic_0000001103383404_section5181155710523) - ->![](public_sys-resources/icon-note.gif) **NOTE:** ->Due to permission issues, these feature are temporarily unavailable for the standard system. - -## Modules to Import +# Audio Playback + +- [Modules to Import](#s56d19203690d4782bfc74069abb6bd71) +- [Required Permissions](#section11257113618419) +- [Methods](#section125675489541) +- [createAudioPlayer\(\)](#section582314017253) +- [Appendixes](#section1933416317165) +- [AudioPlayer](#section5174142818365) + - [Attributes](#section4947115405) + - [play\(\)](#section964512672913) + - [pause\(\)](#section78173258296) + - [stop\(\)](#section122114334296) + - [seek\(number\)](#section1387113816298) + - [setVolume\(number\)](#section164235176552) + - [reset\(\)7+](#section1473283011356) + - [release\(\)](#section9224621145512) + - [Events](#section5453721192911) + - [play](#section87307411494) + - [pause](#section198217471590) + - [stop](#section437616531910) + - [dataLoad](#section982114219106) + - [timeUpdate](#section13687114181014) + - [volumeChange](#section139227715717) + - [finish](#section15181321181018) + - [error](#section5593132921016) + +- [AudioState](#section5181155710523) + +## Modules to Import ``` import audio from '@ohos.multimedia.media'; ``` -## Required Permissions +## Required Permissions None -## Methods +## Methods -## createAudioPlayer\(\) +## createAudioPlayer\(\) Creates an **AudioPlayer** instance to control audio playback. **Return Values** - -

Name

Description

+

Description

Device property queue

+

Device attribute array

A queue of AudioDeviceDescriptor, which is read-only.

+

Array of AudioDeviceDescriptors, which is read-only

Type

+ + - - - @@ -67,164 +65,201 @@ Creates an **AudioPlayer** instance to control audio playback. var audioplayer = audio.createAudioPlayer(); ``` -## Appendixes +## Appendixes -## AudioPlayer +## AudioPlayer Represents an audio player. -### Attributes +### Attributes - -

Type

Description

+

Description

AudioPlayer

+

AudioPlayer

Returns the AudioPlayer instance if the operation is successful; returns null otherwise.

+

Returns the AudioPlayer instance if the operation is successful; returns null otherwise.

Name

+ + - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Type

+

Type

Readable

+

Readable

Writable

+

Writable

Description

+

Description

src

+

src

string

+

string

Yes

+

Yes

Yes

+

Yes

URI of the audio resources

+

URI of the audio resources

loop

+

loop

boolean

+

boolean

Yes

+

Yes

Yes

+

Yes

Whether to loop audio playback

+

Whether to loop audio playback

currentTime

+

currentTime

number

+

number

Yes

+

Yes

No

+

No

Current playback position

+

Current playback position

duration

+

duration

number

+

number

Yes

+

Yes

No

+

No

Playback duration

+

Playback duration

state

+

state

AudioState

+

AudioState

Yes

+

Yes

No

+

No

Playback status

+

Playback status

-### play\(\) +### play\(\) Starts audio playback. **Example** ``` -audioplayer.src = 'common/mydream.mp3'; +audioplayer.on('dataload', (err, action) => { + if (err) { + console.info('Error returned in the prepare() callback.'); + return; + } + console.info('Start to play the audio.'); + audioplayer.play(); +}; + audioplayer.on('play', (err, action) => { if (err) { - console.log(`err returned in play() callback`); + console.info('Error returned in the play() callback.'); return; } - console.log('start to play'); - audioplayer.pause(); + console.info('Succeeded in playing the audio.'); }; -audioplayer.play(); +audioplayer.src = 'common/mydream.mp3'; ``` -### pause\(\) +### pause\(\) Pauses audio playback. **Example** ``` -audioplayer.src = 'common/mydream.mp3'; +audioplayer.on('dataload', (err, action) => { + if (err) { + console.info('Error returned in the prepare() callback.'); + return; + } + console.info('Start to play the audio.'); + audioplayer.play(); +} +audioplayer.on('play', (err, action) => { + if (err) { + console.info('Error returned in the play() callback.'); + return; + } + console.info('Start to pause audio playback.'); + audioplayer.pause(); +}; audioplayer.on('pause', (err, action) => { if (err) { - console.log(`err returned in pause() callback`); + console.info('Error returned in the pause() callback.'); return; } - console.log('playback pause'); + console.info('Succeeded in pausing audio playback.'); }; -audioplayer.pause(); +audioplayer.src = 'common/mydream.mp3'; ``` -### stop\(\) +### stop\(\) Stops audio playback. **Example** ``` -audioplayer.src = 'common/mydream.mp3'; -audioplayer.on('stop',(err, action) => { +audioplayer.on('dataload', (err, action) => { if (err) { - console.log(`err returned in stop() callback`); + console.info('Error returned in the prepare() callback.'); return; } - console.log('playback stop'); + console.info('Start to play the audio.'); + audioplayer.play(); }; -audioplayer.stop(); +audioplayer.on('play', (err, action) => { + if (err) { + console.info('Error returned in the play() callback.'); + return; + } + console.info('Start to pause audio playback.'); + audioplayer.pause(); +}; +audioplayer.on('stop', (err, action) => { + if (err) { + console.info('Error returned in the stop() callback.'); + return; + } + console.info('Succeeded in stopping audio playback.'); +}; +audioplayer.src = 'common/mydream.mp3'; ``` -### seek\(number\) +### seek\(number\) Goes to a specified playback position. **Parameters** - -

Name

+ + - - - - - - - @@ -233,46 +268,58 @@ Goes to a specified playback position. **Example** ``` -audioplayer.src = 'common/mydream.mp3'; -audioplayer.on('timeupdate', (err, action) => { +audioplayer.on('dataload', (err, action) => { if (err) { - console.log(`err returned in seek() callback`); + console.info('Error returned in the prepare() callback.'); return; } + console.info('Start to play the audio.'); + audioplayer.play(); +}; +audioplayer.on('play', (err, action) => { + if (err) { + console.info('Error returned in the play() callback.'); + return; + } + console.info('Succeeded in playing the audio.') +}; +audioplayer.on('timeUpdate', (seekTime, action) => { + console.info('Seek time returned in the seek() callback: ' + seekTime); var newTime = audioplayer.currenTime; - if(newTime = 30000) { - console.info('Seek success, new time : ' + newTime); + if(newTime == 30000) { + console.info('Seek succeeded. New time: ' + newTime); } else { - console.info('Seek Failed'); + console.info('Seek failed.'); } }; +audioplayer.src = 'common/mydream.mp3'; audioplayer.seek(30000); ``` -### setVolume\(number\) +### setVolume\(number\) Sets the volume. **Parameters** - -

Name

Type

+

Type

Mandatory

+

Mandatory

Description

+

Description

timeMs

+

timeMs

number

+

number

Yes

+

Yes

Target playback position

+

Target playback position

Name

+ + - - - - - - - @@ -281,18 +328,58 @@ Sets the volume. **Example** ``` -audioplayer.src = 'common/mydream.mp3'; +audioplayer.on('dataload', (err, action) => { + if (err) { + console.error('Error returned in the prepare() callback.'); + return; + } + console.info('Start to play the audio.'); + audioplayer.play(); +}; +audioplayer.on('play', (err, action) => { + if (err) { + console.error('Error returned in the play() callback.'); + return; + } + console.info('Succeeded in playing the audio.') +}; audioplayer.on('volumeChange', (err, action) => { if (err) { - console.log(`err returned in setVolume() callback`); + console.error('Error returned in the setVolume() callback.'); + return; + } + console.info('Playback volume changed.'); +}; +audioplayer.src = 'common/mydream.mp3'; +audioplayer.setVolume(0.5); +``` + +### reset\(\)7+ + +Switches the audio resource to be played. + +**Example** + +``` +audioplayer.on('dataload', (err, action) => { + if (err) { + console.error('Error returned in the prepare() callback.'); return; } - console.log('playback volume change'); + console.info('Start to reset audio playback.'); + audioplayer.reset(); }; -audioplayer.setVolume(30); +audioplayer.on('reset', (err, action) => { + if (err) { + console.error('Error returned in the reset() callback.'); + return; + } + console.info('Reset succeeded.'); +}; +audioplayer.src = 'common/mydream.mp3'; ``` -### release\(\) +### release\(\) Releases audio resources. @@ -302,83 +389,88 @@ Releases audio resources. audioplay.release(); ``` -### Events +### Events -### play +### play Triggered when **play\(\)** is called -### pause +### pause Triggered when **pause\(\)** is called -### stop +### stop Triggered when **stop\(\)** is called -### dataLoad +### dataLoad Triggered when audio data is loaded -### timeUpdate +### timeUpdate Triggered when the playback position changes -### volumeChange +### volumeChange Triggered when playback volume changes -### finish +### finish Triggered when playback is finished -### error +### error Triggered when a playback error occurs - -

Name

Type

+

Type

Mandatory

+

Mandatory

Description

+

Description

vol

+

vol

number

+

number

Yes

+

Yes

Volume to set

+

Volume to set. The value ranges from 0 to 1.

Parameter

+ + - - - - -

Name

Type

+

Type

Description

+

Description

callback

+

callback

ErrorCallback

+

ErrorCallback

Callback function for handling this event

+

Callback function for handling this event

-## AudioState +## AudioState Describes playback status. - -

Parameter

+ + - - + + + - - - - - diff --git a/en/application-dev/media/development-guidelines-on-audio-playback.md b/en/application-dev/media/development-guidelines-on-audio-playback.md index 724dda64ec9..e9b79f166c2 100755 --- a/en/application-dev/media/development-guidelines-on-audio-playback.md +++ b/en/application-dev/media/development-guidelines-on-audio-playback.md @@ -63,6 +63,11 @@ You use audio playback APIs to convert audio data into audible analog signals, p + + + - - - - - @@ -103,11 +103,6 @@ You use audio playback APIs to convert audio data into audible analog signals, p - - - - + + + @@ -133,7 +133,7 @@ You use audio playback APIs to convert audio data into audible analog signals, p - @@ -143,7 +143,7 @@ You use audio playback APIs to convert audio data into audible analog signals, p - @@ -162,73 +162,70 @@ You use audio playback APIs to convert audio data into audible analog signals, p ``` player.on('play', (err, action) => { if (err) { - console.log(`err returned in play() callback`); + console.error('Error returned in the play() callback.'); return; } - console.info('Current Song duration: '+duration); - console.log(`In play callback current time: ${player.currentTime}`); - console.info('Current Player Status: '+player.state); - console.info('Pause Mp3'); + console.info('Current player duration: '+ player.duration); + console.info('Current player time: ' + player.currentTime); + console.info('Current player status: '+player.state); + console.info('Pause MP3'); player.pause(); }); player.on('pause', (err, action) => { if (err) { - console.log(`err returned in pause() callback`); + console.error('Error returned in the pause() callback.'); return; } - console.log(`pause callback, state: ${player.state}`); - console.info('Current Player Status: '+player.state); - var currentTime = player.currenTime; - console.info('Current Player Time: '+currentTime); - player.seek(30000); //seek for 30 seconds + console.info('Current player status: ' + player.state); + console.info('Current player time: ' + player.currentTime); + player.seek(30000); // Seek for 30 seconds. }); player.on('stop', (err, action) => { if (err) { - console.log(`err returned in stop() callback`); + console.error('Error returned in the stop() callback.'); return; } - console.log(`stop callback, state: ${player.state}`); + console.info('stop callback invoked. State:' + player.state); + player.reset(); }); player.on('dataLoad', (err, action) => { if (err) { - console.log(`err returned in dataLoad() callback`); + console.error('Error returned in the dataLoad() callback.'); return; } - console.log(`dataLoad callback is called, current time: ${player.currentTime}`); - console.log(`Duration of the source: ${player.duration}`); + console.info('dataLoad callback invoked. Current time: ' + player.currentTime); + console.info('Duration of the source:' + player.duration); + player.play(); + }); + player.on('reset', (err, action) => { + if (err) { + console.error('Error returned in the reset() callback.'); + return; + } + console.info('reset callback invoked.'); + player.release(); }); player.on('finish', (err, action) => { if (err) { - console.log(`err returned in finish() callback`); + console.error('Error returned in the finish() callback.'); return; } - console.log(`Player finish callback is called`); + console.info('finish callback invoked.'); }); - player.on('timeUpdate', (err, action) => { - if (err) { - console.log(`err returned in timeUpdate() callback`); - return; - } - console.log(`In timeupdate callback current time: ${player.currentTime}`); + player.on('timeUpdate', (seekTime, action) => { + console.info('Seek time: ' + seekTime); + console.info('Current player time: ' + player.currentTime); var newTime = player.currentTime; - if(newTime = 30000) { - console.info('Seek success, new time : '+newTime); + if(newTime == 30000) { + console.info('Seek succeeded. New time: ' + newTime); } else { - console.info('Seek Failed'); + console.error('Seek failed: ', + newTime); } player.stop(); }); - player.on('durationchange', (err, action) => { - if (err) { - console.log(`err returned in durationchange callback`); - return; - } - console.log(`Durationchange callback is called`); - }); player.on('error', (err) => { - console.error(`player error: ${err.message}`); + console.error('Player error: ${err.message}'); }); - ``` 3. Start playback. @@ -237,7 +234,6 @@ You use audio playback APIs to convert audio data into audible analog signals, p var audioSourceMp3 = 'file://test.mp3'; player.src = audioSourceMp3; player.loop = true; - player.play(); ``` diff --git a/en/application-dev/media/figures/playback-status.png b/en/application-dev/media/figures/playback-status.png index 8723a59a5edcbadec16133c71bc772907882c54a..e0777e28838f6d2455233f2068339f8548f50c67 100755 GIT binary patch literal 23062 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 -- Gitee

Name

Description

+

Description

playing

+

idle

+

Audio playback is idle.

+

playing

The audio is being played.

+

The audio is being played.

paused

+

paused

Audio playback is paused.

+

Audio playback is paused.

stopped

+

stopped

Audio playback is stopped.

+

Audio playback is stopped.

Stops playback.

reset()7+

+

Resets the audio source to be played.

+

setVolume(vol: number)

Sets playback volume.

@@ -78,17 +83,12 @@ You use audio playback APIs to convert audio data into audible analog signals, p

Defines the URI of an audio file to play.

state:string

+

state:AudioState

Defines a playback state.

autoplay:boolean

-

Defines whether playback starts automatically.

-

currenttime:number

+

currentTime:number

Defines the current playback position.

Defines whether to loop audio playback.

muted:boolean

-

Defines whether to mute the audio.

-

on('play', function callback)

Listens for the playback start event.

@@ -123,7 +118,12 @@ You use audio playback APIs to convert audio data into audible analog signals, p

Listens for the playback stop event.

on('ended',function callback)

+

on('reset', function callback)

+

Listens for the playback reset event.

+

on('finish',function callback)

Listens for the playback end event.

Listens for the playback error event.

on('loaderdata', function callback)

+

on('dataload', function callback)

Listens for the data loading event.

Listens for the volume change event.

on('timeupdate', function callback)

+

on('timeUpdate', function callback)

Listens for the progress change event.