提交 bbc2e29f 编写于 作者: D DCloud_LXH

feat(App): InnerAudioContext、BackgroundAudioManager支持倍速

上级 fe9cc31f
......@@ -19,12 +19,24 @@ type ExtendAudio = {
startTime?: number
isStopped?: boolean
initStateChage?: boolean
playbackRate?: (rate: number) => void
}
type Audio = PlusAudioAudioPlayer & ExtendAudio
type AudioEvnets = NonNullable<
Parameters<PlusAudioAudioPlayer['addEventListener']>[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<string, Audio> = {}
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']
/**
* 事件监听
*/
......
......@@ -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<Audio>) {
function setMusicState(args: Partial<Audio>, name?: string) {
initMusic()
const props = [
'src',
......@@ -212,7 +213,14 @@ function setMusicState(args: Partial<Audio>) {
'epname',
'title',
]
const style = {}
if (name && name === 'playbackRate') {
let val = (args as any)[name]
audio.playbackRate && audio.playbackRate(parseFloat(val as string))
return
}
const style: PlusAudioAudioPlayerStyles = {}
Object.keys(args).forEach((key) => {
if (props.indexOf(key) >= 0) {
let val = (args as any)[key]
......@@ -363,6 +371,11 @@ const props = [
readonly: true,
default: 'http',
},
{
name: 'playbackRate',
default: 1,
cache: true,
},
]
class BackgroundAudioManager implements UniApp.BackgroundAudioManager {
......@@ -378,6 +391,7 @@ class BackgroundAudioManager implements UniApp.BackgroundAudioManager {
'coverImgUrl': UniApp.BackgroundAudioManager['coverImgUrl']
'webUrl': UniApp.BackgroundAudioManager['webUrl']
'protocol': UniApp.BackgroundAudioManager['protocol']
'playbackRate': UniApp.BackgroundAudioManager['playbackRate']
_options: Data
constructor() {
......@@ -394,7 +408,7 @@ class BackgroundAudioManager implements UniApp.BackgroundAudioManager {
? undefined
: (value) => {
this._options[name] = value
setMusicState(this._options as any)
setMusicState(this._options as any, name)
},
})
})
......
......@@ -5,7 +5,7 @@ importers:
.:
specifiers:
'@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
......@@ -53,7 +53,7 @@ importers:
yorkie: ^2.0.0
devDependencies:
'@babel/preset-env': 7.16.11
'@dcloudio/types': 2.5.19
'@dcloudio/types': 2.6.2
'@dcloudio/uni-api': link:packages/uni-api
'@dcloudio/uni-app': link:packages/uni-app
'@jest/types': 27.4.2
......@@ -2324,8 +2324,8 @@ packages:
lodash.once: 4.1.1
dev: true
/@dcloudio/types/2.5.19:
resolution: {integrity: sha512-wwUKwS9LD0tvHytNZde6Dm2w2JAlPZcbf+DkxW2aQOgYaC0kqblgHKRQP6N7/4yhuV04XxpfpKhSZYSPCazBjQ==}
/@dcloudio/types/2.6.2:
resolution: {integrity: sha512-i2N9LZs5NZ/ixLYylwqS4gu18VRb6alLanbdamLh4q0Zj6nPxWkDN5SZnR0qq26QamiEErjzqGMpalX4g6BPnQ==}
dev: true
/@dcloudio/uni-cli-i18n/2.0.0-alpha-33020211130001:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册