2024-07-30 17:38:24 +08:00
|
|
|
|
using MAME.Core.run_interface;
|
|
|
|
|
using System;
|
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
|
|
public class UniSoundPlayer : MonoBehaviour, ISoundPlayer
|
|
|
|
|
{
|
|
|
|
|
public int mWrite_position = 0;
|
|
|
|
|
public int mPlay_position =0;
|
|
|
|
|
|
|
|
|
|
[SerializeField]
|
|
|
|
|
private AudioSource m_as;
|
|
|
|
|
private RingBuffer<float> _buffer = new RingBuffer<float>(4096);
|
|
|
|
|
private TimeSpan lastElapsed;
|
|
|
|
|
public double audioFPS { get; private set; }
|
|
|
|
|
float lastData = 0;
|
|
|
|
|
|
2024-08-07 18:23:55 +08:00
|
|
|
|
|
|
|
|
|
void Awake()
|
2024-07-30 17:38:24 +08:00
|
|
|
|
{
|
|
|
|
|
AudioClip dummy = AudioClip.Create("dummy", 1, 1, AudioSettings.outputSampleRate, false);
|
2024-08-07 18:23:55 +08:00
|
|
|
|
dummy.SetData(new float[] { 1, 1 }, 0);
|
2024-07-30 17:38:24 +08:00
|
|
|
|
m_as.clip = dummy;
|
|
|
|
|
m_as.loop = true;
|
|
|
|
|
m_as.spatialBlend = 1;
|
2024-08-07 18:23:55 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void Initialize()
|
|
|
|
|
{
|
2024-07-30 17:38:24 +08:00
|
|
|
|
m_as.Play();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void OnAudioFilterRead(float[] data, int channels)
|
|
|
|
|
{
|
|
|
|
|
if (!UMAME.bStart) return;
|
|
|
|
|
int step = channels;
|
|
|
|
|
mWrite_position = 0;
|
|
|
|
|
for (int i = 0; i < data.Length; i += step)
|
|
|
|
|
{
|
|
|
|
|
float rawFloat = lastData;
|
|
|
|
|
if (_buffer.TryRead(out float rawData))
|
|
|
|
|
{
|
|
|
|
|
rawFloat = rawData;
|
|
|
|
|
mWrite_position++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
data[i] = rawFloat;
|
|
|
|
|
for (int fill = 1; fill < step; fill++)
|
|
|
|
|
data[i + fill] = rawFloat;
|
|
|
|
|
lastData = rawFloat;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void SubmitSamples(byte[] buffer, int samples_a)
|
|
|
|
|
{
|
|
|
|
|
var current = UMAME.sw.Elapsed;
|
|
|
|
|
var delta = current - lastElapsed;
|
|
|
|
|
lastElapsed = current;
|
|
|
|
|
audioFPS = 1d / delta.TotalSeconds;
|
|
|
|
|
float[] floatdata = ConvertByteArrayToFloatArray(buffer, samples_a,2);
|
|
|
|
|
for (int i = 0; i < samples_a; i++)
|
|
|
|
|
{
|
|
|
|
|
_buffer.Write(floatdata[i]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
public float[] ConvertByteArrayToFloatArray(byte[] bytes, int sampleRate, int channels)
|
|
|
|
|
{
|
|
|
|
|
int sampleCount = bytes.Length / (channels * 2); // 16λ<36><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD>ֽ<EFBFBD>
|
|
|
|
|
float[] floatArray = new float[sampleCount * channels];
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < sampleCount; i++)
|
|
|
|
|
{
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
short left = BitConverter.ToInt16(bytes, i * channels * 2);
|
|
|
|
|
short right = BitConverter.ToInt16(bytes, i * channels * 2 + 2);
|
|
|
|
|
|
|
|
|
|
//short left = (short)BitConverter.ToUInt16(bytes, i * channels * 2);
|
|
|
|
|
//short right = (short)BitConverter.ToUInt16(bytes, i * channels * 2 + 2);
|
|
|
|
|
|
|
|
|
|
// ת<><D7AA>Ϊ-1.0<EFBFBD><EFBFBD>1.0<EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
floatArray[i] = left / 32767.0f; // 32767<36><37>16λ<36><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|
|
|
|
floatArray[i + 1] = right / 32767.0f;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return floatArray;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void BufferWirte(int Off, byte[] Data)
|
|
|
|
|
{
|
|
|
|
|
//var current = sw.Elapsed;
|
|
|
|
|
//var delta = current - lastElapsed;
|
|
|
|
|
//lastElapsed = current;
|
|
|
|
|
|
|
|
|
|
//FPS = 1d / delta.TotalSeconds;
|
|
|
|
|
|
|
|
|
|
//for (int i = Off; i < Data.Length; i++)
|
|
|
|
|
//{
|
|
|
|
|
// _buffer.Write(Data[i]);
|
|
|
|
|
//}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void GetCurrentPosition(out int play_position, out int write_position)
|
|
|
|
|
{
|
|
|
|
|
play_position = mPlay_position;
|
|
|
|
|
write_position = mWrite_position;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void SetVolume(int Vol)
|
|
|
|
|
{
|
2024-08-07 18:23:55 +08:00
|
|
|
|
if (m_as)
|
|
|
|
|
return;
|
|
|
|
|
m_as.volume = Vol;
|
2024-07-30 17:38:24 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|