AxibugEmuOnline/AxibugEmuOnline.Client/Assets/Script/Emu/AudioProvider.cs

97 lines
2.2 KiB
C#
Raw Normal View History

2024-07-04 21:06:41 +08:00
using MyNes.Core;
using System;
using System.Collections;
using System.Collections.Generic;
2024-07-05 11:24:59 +08:00
using System.IO;
using System.IO.Pipes;
2024-07-04 21:06:41 +08:00
using System.Linq;
2024-07-05 11:24:59 +08:00
using System.Threading;
2024-07-04 21:06:41 +08:00
using UnityEditor.PackageManager.UI;
using UnityEngine;
namespace AxibugEmuOnline.Client
{
public class AudioProvider : IAudioProvider
{
public string Name => nameof(AudioProvider);
public string ID => Name.GetHashCode().ToString();
public bool AllowBufferChange => true;
public bool AllowFrequencyChange => true;
private bool m_isPlaying;
2024-07-05 11:24:59 +08:00
private AudioSource m_as;
2024-07-04 21:06:41 +08:00
private int samples_added;
2024-07-05 11:24:59 +08:00
private Queue<float> _buffer = new Queue<float>();
2024-07-04 21:06:41 +08:00
public void Initialize()
{
2024-07-05 11:24:59 +08:00
m_as = NesCoreProxy.Instance.AS;
m_as.clip = AudioClip.Create("nes wav", 48000 * 2, 1, 48000, true, OnAudioFilterRead);
m_as.loop = true;
m_as.playOnAwake = false;
m_as.spatialBlend = 0f;
m_as.Play();
2024-07-04 21:06:41 +08:00
}
2024-07-05 11:24:59 +08:00
public void Update() { }
private void OnAudioFilterRead(float[] data)
2024-07-04 21:06:41 +08:00
{
2024-07-05 11:24:59 +08:00
lock (_buffer)
{
for (int i = 0; i < data.Length; i++)
{
data[i] = _buffer.Count > 0 ? _buffer.Dequeue() : 0;
}
}
2024-07-04 21:06:41 +08:00
}
2024-07-05 11:24:59 +08:00
public void SubmitSamples(ref short[] buffer, ref int samples_a)
2024-07-04 21:06:41 +08:00
{
2024-07-05 11:24:59 +08:00
lock (_buffer)
{
foreach (var a in buffer.Take(samples_a).ToArray())
{
var floatData = (float)a / 124;
_buffer.Enqueue(floatData);
}
}
2024-07-04 21:06:41 +08:00
}
public void TogglePause(bool paused)
{
m_isPlaying = !paused;
}
public void GetIsPlaying(out bool playing)
{
playing = m_isPlaying;
}
public void ShutDown()
{
}
public void Reset()
{
}
public void SignalToggle(bool started)
{
}
public void SetVolume(int Vol)
{
}
}
}