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;
 |