From 0b7a11291c613c07b9aeda301ac8992b0064b84e Mon Sep 17 00:00:00 2001 From: sin365 <353374337@qq.com> Date: Sun, 12 Oct 2025 00:59:50 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9A=82=E6=97=B6MAME=E8=BF=98=E6=98=AF?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E7=8B=AC=E7=AB=8BDSP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UniInterface/UniSoundPlayer.cs | 134 +++++++++--------- .../UniInterface/UniSoundPlayer.cs | 132 ++++++++--------- 2 files changed, 127 insertions(+), 139 deletions(-) diff --git a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Emulator/MameEmulator/UniInterface/UniSoundPlayer.cs b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Emulator/MameEmulator/UniInterface/UniSoundPlayer.cs index 6312cd4a..b4c8da7c 100644 --- a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Emulator/MameEmulator/UniInterface/UniSoundPlayer.cs +++ b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Emulator/MameEmulator/UniInterface/UniSoundPlayer.cs @@ -4,7 +4,7 @@ using MAME.Core; using System; using UnityEngine; -public class UniSoundPlayer : MonoBehaviour, ISoundPlayer, AxiAudioPull +public class UniSoundPlayer : MonoBehaviour, ISoundPlayer /*, AxiAudioPull*/ { [SerializeField] private AudioSource m_as; @@ -15,24 +15,69 @@ public class UniSoundPlayer : MonoBehaviour, ISoundPlayer, AxiAudioPull void Awake() { - ////TODO 采样率需要更准确,而且和clip并没有关系 - //var dummy = AudioClip.Create("dummy", 1, 1, AudioSettings.outputSampleRate, false); - //dummy.SetData(new float[] { 1 }, 0); - //m_as.clip = dummy; //just to let unity play the audiosource - //m_as.loop = true; - //m_as.spatialBlend = 1; - //m_as.Play(); - } - private void OnEnable() - { - App.audioMgr.RegisterStream(nameof(UMAME), AudioSettings.outputSampleRate, this); + //TODO 采样率需要更准确,而且和clip并没有关系 + var dummy = AudioClip.Create("dummy", 1, 1, AudioSettings.outputSampleRate, false); + dummy.SetData(new float[] { 1 }, 0); + m_as.clip = dummy; //just to let unity play the audiosource + m_as.loop = true; + m_as.spatialBlend = 1; + m_as.Play(); } + //private void OnEnable() + //{ + // App.audioMgr.RegisterStream(nameof(UMAME), AudioSettings.outputSampleRate, this); + //} + //void OnDisable() + //{ + // App.audioMgr.ClearAudioData(nameof(UMAME)); + //} + //public unsafe void PullAudio(float[] data, int channels) + //{ + // if (!UMAME.bInGame) return; - void OnDisable() - { - App.audioMgr.ClearAudioData(nameof(UMAME)); - } + // //fixed (float* pData = data) + // //{ + // // float* current = pData; + // // float* end = pData + data.Length; + // // float currentSample = lastData; + // // while (current < end) + // // { + // // // 尝试从缓冲区读取新样本 + // // float newSample; + // // if (_buffer.TryRead(out newSample)) + // // { + // // currentSample = newSample; + // // } + + // // // 为所有声道写入相同样本 + // // for (int channel = 0; channel < channels; channel++) + // // { + // // *current = currentSample; + // // current++; + // // } + // // } + + // // // 保存最后一个样本用于下次调用 + // // lastData = currentSample; + // //} + // // 非指针版本 + // int step = channels; + // for (int i = 0; i < data.Length; i += step) + // { + // float rawFloat = lastData; + // float rawData; + // if (_buffer.TryRead(out rawData)) + // { + // rawFloat = rawData; + // } + + // data[i] = rawFloat; + // for (int fill = 1; fill < step; fill++) + // data[i + fill] = rawFloat; + // lastData = rawFloat; + // } + //} public void GetAudioParams(out int frequency, out int channels) { frequency = m_as.clip.samples; @@ -50,45 +95,14 @@ public class UniSoundPlayer : MonoBehaviour, ISoundPlayer, AxiAudioPull public void StopPlay() { if (m_as.isPlaying) - { + { m_as.Stop(); } } - public unsafe void PullAudio(float[] data, int channels) + void OnAudioFilterRead(float[] data, int channels) { if (!UMAME.bInGame) return; - - fixed (float* pData = data) - { - float* outputPtr = pData; // 指向数组起始位置的指针 - int dataLength = data.Length; - - for (int i = 0; i < dataLength; i += channels) - { - float rawFloat = lastData; - float rawData; - - if (_buffer.TryRead(out rawData)) - { - rawFloat = rawData; - } - - *outputPtr = rawFloat; - outputPtr++; // 指针移动到下一个位置 - - // 填充剩余声道(模拟立体声或多声道) - for (int fill = 1; fill < channels; fill++) - { - *outputPtr = rawFloat; - outputPtr++; // 指针移动到下一个位置 - } - - lastData = rawFloat; - } - } - - /* 非指针版本,代码保留 int step = channels; for (int i = 0; i < data.Length; i += step) { @@ -103,27 +117,8 @@ public class UniSoundPlayer : MonoBehaviour, ISoundPlayer, AxiAudioPull for (int fill = 1; fill < step; fill++) data[i + fill] = rawFloat; lastData = rawFloat; - }*/ + } } - /*void OnAudioFilterRead(float[] data, int channels) - { - if (!UMAME.bInGame) return; - int step = channels; - for (int i = 0; i < data.Length; i += step) - { - float rawFloat = lastData; - float rawData; - if (_buffer.TryRead(out rawData)) - { - rawFloat = rawData; - } - - data[i] = rawFloat; - for (int fill = 1; fill < step; fill++) - data[i + fill] = rawFloat; - lastData = rawFloat; - } - }*/ public void SubmitSamples(byte[] buffer, int samples_a) { @@ -158,5 +153,4 @@ public class UniSoundPlayer : MonoBehaviour, ISoundPlayer, AxiAudioPull return; m_as.volume = Vol; } - } diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/MameEmulator/UniInterface/UniSoundPlayer.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/MameEmulator/UniInterface/UniSoundPlayer.cs index 6312cd4a..52579a62 100644 --- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/MameEmulator/UniInterface/UniSoundPlayer.cs +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/MameEmulator/UniInterface/UniSoundPlayer.cs @@ -4,7 +4,7 @@ using MAME.Core; using System; using UnityEngine; -public class UniSoundPlayer : MonoBehaviour, ISoundPlayer, AxiAudioPull +public class UniSoundPlayer : MonoBehaviour, ISoundPlayer /*, AxiAudioPull*/ { [SerializeField] private AudioSource m_as; @@ -15,24 +15,69 @@ public class UniSoundPlayer : MonoBehaviour, ISoundPlayer, AxiAudioPull void Awake() { - ////TODO 采样率需要更准确,而且和clip并没有关系 - //var dummy = AudioClip.Create("dummy", 1, 1, AudioSettings.outputSampleRate, false); - //dummy.SetData(new float[] { 1 }, 0); - //m_as.clip = dummy; //just to let unity play the audiosource - //m_as.loop = true; - //m_as.spatialBlend = 1; - //m_as.Play(); - } - private void OnEnable() - { - App.audioMgr.RegisterStream(nameof(UMAME), AudioSettings.outputSampleRate, this); + //TODO 采样率需要更准确,而且和clip并没有关系 + var dummy = AudioClip.Create("dummy", 1, 1, AudioSettings.outputSampleRate, false); + dummy.SetData(new float[] { 1 }, 0); + m_as.clip = dummy; //just to let unity play the audiosource + m_as.loop = true; + m_as.spatialBlend = 1; + m_as.Play(); } + //private void OnEnable() + //{ + // App.audioMgr.RegisterStream(nameof(UMAME), AudioSettings.outputSampleRate, this); + //} + //void OnDisable() + //{ + // App.audioMgr.ClearAudioData(nameof(UMAME)); + //} + //public unsafe void PullAudio(float[] data, int channels) + //{ + // if (!UMAME.bInGame) return; - void OnDisable() - { - App.audioMgr.ClearAudioData(nameof(UMAME)); - } + // //fixed (float* pData = data) + // //{ + // // float* current = pData; + // // float* end = pData + data.Length; + // // float currentSample = lastData; + // // while (current < end) + // // { + // // // 尝试从缓冲区读取新样本 + // // float newSample; + // // if (_buffer.TryRead(out newSample)) + // // { + // // currentSample = newSample; + // // } + + // // // 为所有声道写入相同样本 + // // for (int channel = 0; channel < channels; channel++) + // // { + // // *current = currentSample; + // // current++; + // // } + // // } + + // // // 保存最后一个样本用于下次调用 + // // lastData = currentSample; + // //} + // // 非指针版本 + // int step = channels; + // for (int i = 0; i < data.Length; i += step) + // { + // float rawFloat = lastData; + // float rawData; + // if (_buffer.TryRead(out rawData)) + // { + // rawFloat = rawData; + // } + + // data[i] = rawFloat; + // for (int fill = 1; fill < step; fill++) + // data[i + fill] = rawFloat; + // lastData = rawFloat; + // } + //} public void GetAudioParams(out int frequency, out int channels) { frequency = m_as.clip.samples; @@ -55,40 +100,9 @@ public class UniSoundPlayer : MonoBehaviour, ISoundPlayer, AxiAudioPull } } - public unsafe void PullAudio(float[] data, int channels) + void OnAudioFilterRead(float[] data, int channels) { if (!UMAME.bInGame) return; - - fixed (float* pData = data) - { - float* outputPtr = pData; // 指向数组起始位置的指针 - int dataLength = data.Length; - - for (int i = 0; i < dataLength; i += channels) - { - float rawFloat = lastData; - float rawData; - - if (_buffer.TryRead(out rawData)) - { - rawFloat = rawData; - } - - *outputPtr = rawFloat; - outputPtr++; // 指针移动到下一个位置 - - // 填充剩余声道(模拟立体声或多声道) - for (int fill = 1; fill < channels; fill++) - { - *outputPtr = rawFloat; - outputPtr++; // 指针移动到下一个位置 - } - - lastData = rawFloat; - } - } - - /* 非指针版本,代码保留 int step = channels; for (int i = 0; i < data.Length; i += step) { @@ -103,27 +117,8 @@ public class UniSoundPlayer : MonoBehaviour, ISoundPlayer, AxiAudioPull for (int fill = 1; fill < step; fill++) data[i + fill] = rawFloat; lastData = rawFloat; - }*/ + } } - /*void OnAudioFilterRead(float[] data, int channels) - { - if (!UMAME.bInGame) return; - int step = channels; - for (int i = 0; i < data.Length; i += step) - { - float rawFloat = lastData; - float rawData; - if (_buffer.TryRead(out rawData)) - { - rawFloat = rawData; - } - - data[i] = rawFloat; - for (int fill = 1; fill < step; fill++) - data[i + fill] = rawFloat; - lastData = rawFloat; - } - }*/ public void SubmitSamples(byte[] buffer, int samples_a) { @@ -158,5 +153,4 @@ public class UniSoundPlayer : MonoBehaviour, ISoundPlayer, AxiAudioPull return; m_as.volume = Vol; } - }