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

185 lines
6.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;