You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
2.1 KiB
109 lines
2.1 KiB
3 months ago
|
let instance = null;
|
||
|
|
||
|
class AudioManager {
|
||
|
constructor() {
|
||
|
if (instance) {
|
||
|
return instance;
|
||
|
}
|
||
|
|
||
|
this.audioContext = null;
|
||
|
this.isPlaying = false;
|
||
|
this.userDisabled = false;
|
||
|
this.initialized = false;
|
||
|
|
||
|
try {
|
||
|
const musicState = uni.getStorageSync('musicState') || {};
|
||
|
this.userDisabled = musicState.userDisabled === true;
|
||
|
} catch (e) {
|
||
|
console.error('读取音乐状态失败:', e);
|
||
|
}
|
||
|
|
||
|
instance = this;
|
||
|
}
|
||
|
|
||
|
init() {
|
||
|
if (this.initialized) return this;
|
||
|
|
||
|
this.audioContext = uni.createInnerAudioContext();
|
||
|
this.audioContext.src = 'https://static.ticket.sz-trip.com/epicSoul/taozi/bg.m4a';
|
||
|
this.audioContext.loop = true;
|
||
|
|
||
|
this.audioContext.onPlay(() => {
|
||
|
this.isPlaying = true;
|
||
|
this._notifyStateChange();
|
||
|
});
|
||
|
|
||
|
this.audioContext.onPause(() => {
|
||
|
this.isPlaying = false;
|
||
|
this._notifyStateChange();
|
||
|
});
|
||
|
|
||
|
this.audioContext.onStop(() => {
|
||
|
this.isPlaying = false;
|
||
|
this._notifyStateChange();
|
||
|
});
|
||
|
|
||
|
this.audioContext.onError((res) => {
|
||
|
this.isPlaying = false;
|
||
|
this._notifyStateChange();
|
||
|
});
|
||
|
|
||
|
this.initialized = true;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
play() {
|
||
|
if (this.userDisabled) return;
|
||
|
|
||
|
this.init();
|
||
|
if (!this.isPlaying) {
|
||
|
this.audioContext.play();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
pause() {
|
||
|
if (!this.initialized || !this.isPlaying) return;
|
||
|
|
||
|
this.audioContext.pause();
|
||
|
}
|
||
|
|
||
|
togglePlay() {
|
||
|
this.init();
|
||
|
|
||
|
if (this.isPlaying) {
|
||
|
this.pause();
|
||
|
this.userDisabled = true;
|
||
|
} else {
|
||
|
this.userDisabled = false;
|
||
|
this.play();
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
uni.setStorageSync('musicState', {
|
||
|
userDisabled: this.userDisabled
|
||
|
});
|
||
|
} catch (e) {
|
||
|
console.error('保存音乐状态失败:', e);
|
||
|
}
|
||
|
|
||
|
return this.isPlaying;
|
||
|
}
|
||
|
|
||
|
_notifyStateChange() {
|
||
|
uni.$emit('audioStateChanged', {
|
||
|
isPlaying: this.isPlaying,
|
||
|
userDisabled: this.userDisabled
|
||
|
});
|
||
|
}
|
||
|
|
||
|
getPlayingStatus() {
|
||
|
return this.isPlaying;
|
||
|
}
|
||
|
|
||
|
getUserDisabled() {
|
||
|
return this.userDisabled;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export default new AudioManager();
|