From e17c6938d42dae9579178738133ea38352b8babe Mon Sep 17 00:00:00 2001 From: CodingGorit <5571237+CodingGorit@user.noreply.gitee.com> Date: Fri, 25 Oct 2024 06:11:21 +0000 Subject: [PATCH] feat: add SoundPool demo based on api12 Signed-off-by: CodingGorit <5571237+CodingGorit@user.noreply.gitee.com> --- SoundPool/SoundPoolPage.ets | 125 ++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 SoundPool/SoundPoolPage.ets diff --git a/SoundPool/SoundPoolPage.ets b/SoundPool/SoundPoolPage.ets new file mode 100644 index 0000000..6e95aa3 --- /dev/null +++ b/SoundPool/SoundPoolPage.ets @@ -0,0 +1,125 @@ +import { media } from '@kit.MediaKit'; +import { audio } from '@kit.AudioKit'; +import { BusinessError } from '@kit.BasicServicesKit'; +import { common } from '@kit.AbilityKit'; + +let soundPool: media.SoundPool; +let streamId: number = 0; +let soundId: number = 0; +let audioRendererInfo: audio.AudioRendererInfo = { + usage : audio.StreamUsage.STREAM_USAGE_MUSIC, + rendererFlags : 0 +} + +let playParameters: media.PlayParameters = { + loop: 0, // 循环4次 + rate: audio.AudioRendererRate.RENDER_RATE_NORMAL, // 正常倍速 + leftVolume: 0.5, // range = 0.0-1.0 + rightVolume: 0.5, // range = 0.0-1.0 + priority: 0, // 最低优先级 +} +let uri: string = ""; + +async function create() { + //创建soundPool实例 + soundPool = await media.createSoundPool(5, audioRendererInfo); + //注册监听 + loadCallback(); + finishPlayCallback(); + setErrorCallback(); + // 加载音频资源 + // await fs.open('/test_01.mp3', fs.OpenMode.READ_ONLY).then((file: fs.File) => { + // console.info("file fd: " + file.fd); + // uri = 'fd://' + (file.fd).toString() + // }); // '/test_01.mp3' 作为样例,使用时需要传入文件对应路径。 + let context = getContext() as common.UIAbilityContext; + let fileDescriptor = await context.resourceManager.getRawFd('scan_success.mp3'); + soundId = await soundPool.load(fileDescriptor.fd, fileDescriptor.offset, fileDescriptor.length); +} +function loadCallback() { + // 加载完成回调 + soundPool.on('loadComplete', (soundId_: number) => { + console.info('loadComplete, soundId: ' + soundId_); + }) +} +//设置播放完成监听 +function finishPlayCallback() { + // 播放完成回调 + soundPool.on('playFinished', () => { + console.info("receive play finished message"); + // 可进行下次播放 + }) +} +//设置错误类型监听 +function setErrorCallback() { + soundPool.on('error', (error: BusinessError) => { + console.info('error happened,message is :' + error.message); + }) +} +async function PlaySoundPool() { + // 开始播放,这边play也可带播放播放的参数PlayParameters,请在音频资源加载完毕,即收到loadComplete回调之后再执行play操作 + soundPool.play(soundId, playParameters, (error, streamID: number) => { + if (error) { + console.info(`play sound Error: errCode is ${error.code}, errMessage is ${error.message}`) + } else { + streamId = streamID; + console.info('play success soundid:' + streamId); + } + }); + // 设置循环播放次数 + await soundPool.setLoop(streamId, 0); // 播放3次 + // 设置对应流的优先级 + await soundPool.setPriority(streamId, 1); + // 设置音量 + await soundPool.setVolume(streamId, 0.5, 0.5); +} +async function release() { + // 终止指定流的播放 + await soundPool.stop(streamId); + // 卸载音频资源 + await soundPool.unload(soundId); + //关闭监听 + setOffCallback(); + // 释放SoundPool + await soundPool.release(); +} +//关闭监听 +function setOffCallback() { + soundPool.off('loadComplete'); + soundPool.off('playFinished'); + soundPool.off('error'); +} +@Entry +@Component +struct SoundPoolPage { + @State message: string = 'Hello World'; + + aboutToAppear(): void { + create(); + } + + build() { + RelativeContainer() { + Text(this.message) + .id('SoundPoolPageHelloWorld') + .fontSize(50) + .fontWeight(FontWeight.Bold) + .alignRules({ + center: { anchor: '__container__', align: VerticalAlign.Center }, + middle: { anchor: '__container__', align: HorizontalAlign.Center } + }) + + Button("play audio") + .id("id_play_btn") + .onClick(() => { + PlaySoundPool() + }) + .alignRules({ + top: { anchor: 'SoundPoolPageHelloWorld', align: VerticalAlign.Bottom }, + middle: { anchor: '__container__', align: HorizontalAlign.Center } + }) + } + .height('100%') + .width('100%') + } +} \ No newline at end of file -- Gitee