diff --git a/src/core/service/api/context/background-audio.js b/src/core/service/api/context/background-audio.js index a62e07f946d4463aee602f56021984d0a6fac632..2d1c539abb5a57d74fe3adfa6292b4104ae81e56 100644 --- a/src/core/service/api/context/background-audio.js +++ b/src/core/service/api/context/background-audio.js @@ -20,7 +20,7 @@ eventNames.forEach(name => { callbacks[name] = [] }) -const props = [ +const props = [ { name: 'duration', readonly: true @@ -70,10 +70,15 @@ const props = [ name: 'protocol', readonly: true, default: 'http' + }, + { + name: 'playbackRate', + default: 1, + cache: true, } ] - -const backgroundEvents = ['prev', 'next'] + +const backgroundEvents = ['prev', 'next'] class BackgroundAudioManager { constructor () { @@ -91,15 +96,15 @@ class BackgroundAudioManager { } : {}) } }) - }) - backgroundEvents.forEach((name) => { - onMethod(`onBackgroundAudio${name[0].toUpperCase() + name.substr(1)}`, () => { - callbacks[name].forEach(callback => { - if (typeof callback === 'function') { - callback({}) - } - }) - }) + }) + backgroundEvents.forEach((name) => { + onMethod(`onBackgroundAudio${name[0].toUpperCase() + name.substr(1)}`, () => { + callbacks[name].forEach(callback => { + if (typeof callback === 'function') { + callback({}) + } + }) + }) }) props.forEach(item => { const name = item.name @@ -114,30 +119,30 @@ class BackgroundAudioManager { this._options[name] = value invokeMethod('setBackgroundAudioState', Object.assign({}, this._options, { audioId: this.id - })) + }), name) } } Object.defineProperty(this, name, data) }) - } + } play () { this._operate('play') - } + } pause () { this._operate('pause') - } + } stop () { this._operate('stop') - } + } seek (position) { this._operate('seek', { currentTime: position }) - } + } _operate (type, options) { invokeMethod('operateBackgroundAudio', Object.assign({}, options, { @@ -157,4 +162,4 @@ let backgroundAudioManager export function getBackgroundAudioManager () { return backgroundAudioManager || (backgroundAudioManager = new BackgroundAudioManager()) -} +} diff --git a/src/core/service/api/context/inner-audio.js b/src/core/service/api/context/inner-audio.js index f29c7e3d76e255efb4421d63883bf0a9991d3348..0f6502b6d50307422ba4448a3f656cbaf9ff957d 100644 --- a/src/core/service/api/context/inner-audio.js +++ b/src/core/service/api/context/inner-audio.js @@ -60,9 +60,13 @@ const props = [ }, { name: 'volume' - }, - { - name: 'sessionCategory' + }, + { + name: 'sessionCategory' + }, + { + name: 'playbackRate', + cache: true, } ] @@ -95,25 +99,25 @@ class InnerAudioContext { } Object.defineProperty(this, name, data) }) - } + } play () { this._operate('play') - } + } pause () { this._operate('pause') - } + } stop () { this._operate('stop') - } + } seek (position) { this._operate('seek', { currentTime: position * 1e3 }) - } + } destroy () { clearInterval(this.__timing) @@ -121,7 +125,7 @@ class InnerAudioContext { audioId: this.id }) delete innerAudioContexts[this.id] - } + } _operate (type, options) { invokeMethod('operateAudio', Object.assign({}, options, { diff --git a/src/platforms/app-plus/service/api/context/background-audio.js b/src/platforms/app-plus/service/api/context/background-audio.js index 41bd55346004c28feb08673d843bc90505644be1..40f070c5a94696c642c697b665802232763a9b98 100644 --- a/src/platforms/app-plus/service/api/context/background-audio.js +++ b/src/platforms/app-plus/service/api/context/background-audio.js @@ -86,9 +86,16 @@ function stopTimeUpdateTimer () { } } -function setMusicState (args) { +function setMusicState (args, name) { initMusic() const props = ['src', 'startTime', 'coverImgUrl', 'webUrl', 'singer', 'epname', 'title'] + + if (name && name === 'playbackRate') { + let val = args[name] + audio.playbackRate && audio.playbackRate(parseFloat(val)) + return + } + const style = {} Object.keys(args).forEach(key => { if (props.indexOf(key) >= 0) { @@ -150,8 +157,8 @@ export function operateMusicPlayer ({ errMsg: `${api}:ok` } } -export function setBackgroundAudioState (args) { - setMusicState(args) +export function setBackgroundAudioState (args, name) { + setMusicState(args, name) return { errMsg: 'setBackgroundAudioState:ok' } diff --git a/src/platforms/app-plus/service/api/context/inner-audio.js b/src/platforms/app-plus/service/api/context/inner-audio.js index ec0e6bb1228a3ea05f20af478c5ad262b8adf737..cca7bb84980b2b0a61b0b0112e3032e61312a8f2 100644 --- a/src/platforms/app-plus/service/api/context/inner-audio.js +++ b/src/platforms/app-plus/service/api/context/inner-audio.js @@ -5,7 +5,7 @@ import { import { publish } from '../../bridge' - + const AUDIO_DEFAULT_SESSION_CATEGORY = 'playback' const audios = {} @@ -14,7 +14,7 @@ const evts = ['play', 'canplay', 'ended', 'stop', 'waiting', 'seeking', 'seeked' const publishAudioStateChange = (state, res = {}) => publish('onAudioStateChange', Object.assign({ state -}, res)) +}, res)) const initStateChage = audioId => { const audio = audios[audioId] @@ -48,12 +48,12 @@ const initStateChage = audioId => { } } -export function createAudioInstance () { +export function createAudioInstance() { const audioId = `${Date.now()}${Math.random()}` - const audio = audios[audioId] = plus.audio.createPlayer('') + const audio = audios[audioId] = plus.audio.createPlayer('') audio.src = '' audio.volume = 1 - audio.startTime = 0 + audio.startTime = 0 audio.setSessionCategory(AUDIO_DEFAULT_SESSION_CATEGORY) return { errMsg: 'createAudioInstance:ok', @@ -61,7 +61,7 @@ export function createAudioInstance () { } } -export function destroyAudioInstance ({ +export function destroyAudioInstance({ audioId }) { if (audios[audioId]) { @@ -74,15 +74,16 @@ export function destroyAudioInstance ({ } } -export function setAudioState ({ +export function setAudioState({ audioId, src, startTime, autoplay = false, loop = false, obeyMuteSwitch, - volume, - sessionCategory = AUDIO_DEFAULT_SESSION_CATEGORY + volume, + sessionCategory = AUDIO_DEFAULT_SESSION_CATEGORY, + playbackRate }) { const audio = audios[audioId] if (audio) { @@ -91,7 +92,9 @@ export 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 @@ -99,9 +102,12 @@ export function setAudioState ({ if (typeof volume === 'number') { audio.volume = style.volume = volume } - audio.setStyles(style) - if (sessionCategory) { - audio.setSessionCategory(sessionCategory) + audio.setStyles(style) + if (sessionCategory) { + audio.setSessionCategory(sessionCategory) + } + if (playbackRate && audio.playbackRate) { + audio.playbackRate(playbackRate) } initStateChage(audioId) } @@ -110,7 +116,7 @@ export function setAudioState ({ } } -export function getAudioState ({ +export function getAudioState({ audioId }) { const audio = audios[audioId] @@ -137,7 +143,7 @@ export function getAudioState ({ } } -export function operateAudio ({ +export function operateAudio({ operationType, audioId, currentTime