mirror of
https://github.com/digital-jellyfish/Virtu.git
synced 2024-06-02 12:41:31 +00:00
2ba3146299
Cosmetic changes including using C# 4 named and optional parameters. --HG-- extra : convert_revision : svn%3Affd33b8c-2492-42e0-bdc5-587b920b7d6d/trunk%4046806
67 lines
1.9 KiB
C#
67 lines
1.9 KiB
C#
using System;
|
|
using System.Threading;
|
|
|
|
namespace Jellyfish.Virtu.Services
|
|
{
|
|
public class AudioService : MachineService
|
|
{
|
|
public AudioService(Machine machine) :
|
|
base(machine)
|
|
{
|
|
}
|
|
|
|
public void Output(int data) // machine thread
|
|
{
|
|
_buffer[_index + 0] = (byte)(data & 0xFF);
|
|
_buffer[_index + 1] = (byte)((data >> 8) & 0xFF);
|
|
_index = (_index + 2) % SampleSize;
|
|
if (_index == 0)
|
|
{
|
|
_readEvent.Set();
|
|
if (Machine.Settings.Cpu.IsThrottled)
|
|
{
|
|
_writeEvent.WaitOne();
|
|
}
|
|
}
|
|
}
|
|
|
|
public void Reset()
|
|
{
|
|
Buffer.BlockCopy(SampleZero, 0, _buffer, 0, SampleSize);
|
|
}
|
|
|
|
public override void Stop() // main thread
|
|
{
|
|
_readEvent.Set(); // signal events; avoids deadlock
|
|
_writeEvent.Set();
|
|
}
|
|
|
|
protected void Update(int bufferSize, Action<byte[], int> updateBuffer) // audio thread
|
|
{
|
|
if (Machine.State == MachineState.Running)
|
|
{
|
|
_readEvent.WaitOne();
|
|
}
|
|
if (updateBuffer != null)
|
|
{
|
|
updateBuffer(_buffer, bufferSize);
|
|
}
|
|
_writeEvent.Set();
|
|
}
|
|
|
|
public const int SampleRate = 44100; // hz
|
|
public const int SampleChannels = 1;
|
|
public const int SampleBits = 16;
|
|
public const int SampleLatency = 40; // ms
|
|
public const int SampleSize = (SampleRate * SampleLatency / 1000) * SampleChannels * (SampleBits / 8);
|
|
|
|
protected static readonly byte[] SampleZero = new byte[SampleSize];
|
|
|
|
private byte[] _buffer = new byte[SampleSize];
|
|
private int _index;
|
|
|
|
private AutoResetEvent _readEvent = new AutoResetEvent(false);
|
|
private AutoResetEvent _writeEvent = new AutoResetEvent(false);
|
|
}
|
|
}
|