chicken_dy/Assets/WX-WASM-SDK/wechat-default/unity-sdk/unity-adapter.js

185 lines
6.0 KiB
JavaScript
Raw Normal View History

2022-08-01 03:47:37 +00:00
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;