185 lines
6.0 KiB
JavaScript
185 lines
6.0 KiB
JavaScript
const WEBAudio = {
|
||
audioInstances: [],
|
||
audioContext: {},
|
||
audioWebEnabled: 0,
|
||
audioBufferInstances: [],
|
||
};
|
||
const disableAudio = false;
|
||
const disableAudioOptimization = false;
|
||
const UnityAdapter = {};
|
||
UnityAdapter._JS_Sound_Init = function () {
|
||
WEBAudio.audioWebEnabled = 0;
|
||
};
|
||
UnityAdapter._JS_Sound_Load = function (ptr, length) {
|
||
const sound = wx.createInnerAudioContext();
|
||
let soundIndex = -1;
|
||
for (let i = 0; i < WEBAudio.audioInstances.length; ++i) {
|
||
const audio = WEBAudio.audioInstances[i];
|
||
if (!audio) {
|
||
WEBAudio.audioInstances[i] = sound;
|
||
soundIndex = i;
|
||
break;
|
||
}
|
||
}
|
||
if (soundIndex === -1) {
|
||
soundIndex = WEBAudio.audioInstances.push(sound) - 1;
|
||
}
|
||
let soundBufferIndex = -1;
|
||
for (let i = 0; i < WEBAudio.audioBufferInstances.length; ++i) {
|
||
const audioBuffer = WEBAudio.audioBufferInstances[i];
|
||
if (audioBuffer.ptr === ptr && audioBuffer.length === length) {
|
||
sound.buffer = audioBuffer.filePath;
|
||
soundBufferIndex = i;
|
||
break;
|
||
}
|
||
}
|
||
if (soundBufferIndex === -1) {
|
||
soundBufferIndex =
|
||
WEBAudio.audioBufferInstances.push({
|
||
ptr,
|
||
length,
|
||
filePath: null,
|
||
}) - 1;
|
||
}
|
||
if (!WEBAudio.audioBufferInstances[soundBufferIndex].filePath) {
|
||
if (wx.createBufferURL && typeof wx.createBufferURL === 'function') {
|
||
const url = wx.createBufferURL(GameGlobal.unityNamespace.Module.HEAPU8.buffer.slice(ptr, ptr + length));
|
||
sound.buffer = url;
|
||
WEBAudio.audioBufferInstances[soundBufferIndex].filePath = url;
|
||
}
|
||
else {
|
||
const filePath = `${wx.env.USER_DATA_PATH}/audiowxgameaudio${soundBufferIndex}`;
|
||
wx.getFileSystemManager().writeFile({
|
||
filePath,
|
||
data: GameGlobal.unityNamespace.Module.HEAPU8.buffer.slice(ptr, ptr + length),
|
||
encoding: 'binary',
|
||
success() {
|
||
sound.buffer = filePath;
|
||
WEBAudio.audioBufferInstances[soundBufferIndex].filePath = filePath;
|
||
},
|
||
fail() {
|
||
sound.error = true;
|
||
},
|
||
});
|
||
}
|
||
}
|
||
return soundIndex;
|
||
};
|
||
UnityAdapter._JS_Sound_Create_Channel = function (_callback, _userData) {
|
||
if (disableAudio) {
|
||
return false;
|
||
}
|
||
let channelIndex = -1;
|
||
for (let i = 0; i < WEBAudio.audioInstances.length; ++i) {
|
||
const channel = WEBAudio.audioInstances[i];
|
||
if (!channel) {
|
||
WEBAudio.audioContext[i] = wx.createInnerAudioContext();
|
||
channelIndex = i;
|
||
break;
|
||
}
|
||
}
|
||
if (channelIndex === -1) {
|
||
channelIndex = WEBAudio.audioInstances.push(wx.createInnerAudioContext()) - 1;
|
||
}
|
||
return channelIndex;
|
||
};
|
||
UnityAdapter._JS_Sound_Play = function (bufferInstance, channelInstance, _offset, _delay) {
|
||
if (disableAudio) {
|
||
return false;
|
||
}
|
||
// stop sound which is playing in the channel currently.
|
||
// UnityAdapter._JS_Sound_Stop(channelInstance, 0);
|
||
let sound = WEBAudio.audioInstances[bufferInstance];
|
||
if (sound.buffer) {
|
||
sound = WEBAudio.audioInstances[bufferInstance];
|
||
const channel = WEBAudio.audioInstances[channelInstance];
|
||
channel.src = sound.buffer;
|
||
sound.duration = channel.duration;
|
||
if (channel.play) {
|
||
channel.play();
|
||
}
|
||
}
|
||
else {
|
||
console.log('play with null buffer');
|
||
}
|
||
return;
|
||
};
|
||
UnityAdapter._JS_Sound_SetLoop = function (channelInstance, loop) {
|
||
if (disableAudio) {
|
||
return false;
|
||
}
|
||
WEBAudio.audioInstances[channelInstance].loop = Boolean(loop);
|
||
return;
|
||
};
|
||
UnityAdapter._JS_Sound_Set3D = function (_channelInstance, _threeD) {
|
||
// console.log("not support in wxgame");
|
||
};
|
||
UnityAdapter._JS_Sound_Stop = function (channelInstance, delay) {
|
||
if (disableAudio) {
|
||
return false;
|
||
}
|
||
const audioInstance = WEBAudio.audioInstances[channelInstance];
|
||
if (delay === 0) {
|
||
if (audioInstance.stop) {
|
||
audioInstance.stop();
|
||
}
|
||
audioInstance.onEnded = function () { };
|
||
}
|
||
else {
|
||
setTimeout(() => {
|
||
if (audioInstance.stop) {
|
||
audioInstance.stop();
|
||
}
|
||
}, delay);
|
||
}
|
||
return;
|
||
};
|
||
const soundVolumeHandler = {};
|
||
UnityAdapter._JS_Sound_SetVolume = function (channelInstance, v) {
|
||
if (disableAudio) {
|
||
return false;
|
||
}
|
||
if (disableAudioOptimization) {
|
||
WEBAudio.audioInstances[channelInstance].volume = Number(v.toFixed(2));
|
||
return false;
|
||
}
|
||
if (soundVolumeHandler[channelInstance] === Number(v.toFixed(2))) {
|
||
return false;
|
||
}
|
||
soundVolumeHandler[channelInstance] = Number(v.toFixed(2));
|
||
WEBAudio.audioInstances[channelInstance].volume = Number(soundVolumeHandler[channelInstance]);
|
||
return;
|
||
};
|
||
UnityAdapter._JS_Sound_SetPitch = function (channelInstance, v) {
|
||
return; // todo 客户端有bug,先屏蔽,等客户端修复再打开
|
||
WEBAudio.audioInstances[channelInstance].playbackRate = v;
|
||
return;
|
||
};
|
||
UnityAdapter._JS_Sound_GetLoadState = function (bufferInstance) {
|
||
if (disableAudio) {
|
||
return false;
|
||
}
|
||
const sound = WEBAudio.audioInstances[bufferInstance];
|
||
if (sound.buffer)
|
||
return 0;
|
||
if (sound.error)
|
||
return 2;
|
||
return 1;
|
||
};
|
||
UnityAdapter._JS_Sound_ResumeIfNeeded = function () {
|
||
// 这里是页面点击的时候会来检查,这里不需要
|
||
};
|
||
UnityAdapter._JS_Sound_GetLength = function (bufferInstance) {
|
||
if (disableAudio) {
|
||
return false;
|
||
}
|
||
const sound = WEBAudio.audioInstances[bufferInstance];
|
||
return sound.duration;
|
||
};
|
||
UnityAdapter._JS_Sound_ReleaseInstance = function (instance) {
|
||
let audioInstance = WEBAudio.audioInstances[instance];
|
||
audioInstance.destroy && audioInstance.destroy();
|
||
audioInstance = null;
|
||
};
|
||
GameGlobal.unityNamespace.UnityAdapter = UnityAdapter;
|