diff --git a/package.json b/package.json index 89a3658c3fa8defd397884fed1cf30b9da95f46a..b8002d9b4f8d691b9e41d8f8a54f0836e7138455 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ }, "devDependencies": { "@babel/preset-env": "^7.16.11", - "@dcloudio/types": "^2.5.19", + "@dcloudio/types": "^2.6.2", "@dcloudio/uni-api": "3.0.0-alpha-3040420220402005", "@dcloudio/uni-app": "3.0.0-alpha-3040420220402005", "@jest/types": "^27.0.2", diff --git a/packages/uni-app-plus/src/service/api/context/createInnerAudioContext.ts b/packages/uni-app-plus/src/service/api/context/createInnerAudioContext.ts index 4ee2ef609b0f674e6c2fde1cc286d5bd5001918a..d4554d776384564a24b571e1a10123d40bb8d473 100644 --- a/packages/uni-app-plus/src/service/api/context/createInnerAudioContext.ts +++ b/packages/uni-app-plus/src/service/api/context/createInnerAudioContext.ts @@ -19,12 +19,24 @@ type ExtendAudio = { startTime?: number isStopped?: boolean initStateChage?: boolean + playbackRate?: (rate: number) => void } type Audio = PlusAudioAudioPlayer & ExtendAudio type AudioEvnets = NonNullable< Parameters[0] > type OperationType = 'play' | 'pause' | 'stop' | 'seek' +type AudioState = { + audioId: string + autoplay?: boolean + loop?: boolean + obeyMuteSwitch?: boolean + src?: string + startTime?: number + volume?: number + sessionCategory?: string + playbackRate?: number +} const audios: Record = {} const evts: AudioEvnets[] = [ @@ -96,16 +108,8 @@ function setAudioState({ obeyMuteSwitch, volume, sessionCategory = AUDIO_DEFAULT_SESSION_CATEGORY, -}: { - audioId: string - autoplay?: boolean - loop?: boolean - obeyMuteSwitch?: boolean - src?: string - startTime?: number - volume?: number - sessionCategory?: string -}) { + playbackRate, +}: AudioState) { const audio = audios[audioId] if (audio) { const style: { loop: boolean; autoplay: boolean } & ExtendAudio = { @@ -113,7 +117,9 @@ function setAudioState({ autoplay, } if (src) { - audio.src = style.src = getRealPath(src) + // iOS 设置 src 会重新播放 + const realSrc = getRealPath(src) + if (audio.src !== realSrc) audio.src = style.src = realSrc } if (startTime) { audio.startTime = style.startTime = startTime @@ -125,6 +131,10 @@ function setAudioState({ if (sessionCategory) { audio.setSessionCategory(sessionCategory) } + if (playbackRate && audio.playbackRate) { + // @ts-ignore + audio.playbackRate(playbackRate) + } initStateChage(audioId) } return { @@ -256,6 +266,10 @@ const props = [ { name: 'volume', }, + { + name: 'playbackRate', + cache: true, + }, ] class InnerAudioContext implements UniApp.InnerAudioContext { @@ -299,6 +313,10 @@ class InnerAudioContext implements UniApp.InnerAudioContext { * 音量。范围 0~1。 */ 'volume': UniApp.InnerAudioContext['volume'] + /** + * 播放的倍率。可取值: 0.5/0.8/1.0/1.25/1.5/2.0,默认值为1.0。(仅 App 支持)。 + */ + 'playbackRate': UniApp.InnerAudioContext['playbackRate'] /** * 事件监听 */ diff --git a/packages/uni-app-plus/src/service/api/context/getBackgroundAudioManager.ts b/packages/uni-app-plus/src/service/api/context/getBackgroundAudioManager.ts index 6cb1715a6d6c9716f816c6adee773e0dc9996cdf..02eb8f91327789788997160f77e7518239cb6c01 100644 --- a/packages/uni-app-plus/src/service/api/context/getBackgroundAudioManager.ts +++ b/packages/uni-app-plus/src/service/api/context/getBackgroundAudioManager.ts @@ -49,6 +49,7 @@ type Audio = PlusAudioAudioPlayer & { webUrl?: string startTime?: number isStopped?: boolean + playbackRate?: (rate: number) => void } const eventNames: eventNames[] = [ @@ -201,7 +202,7 @@ function getBackgroundAudioState() { return data } -function setMusicState(args: Partial