change AudioDevice to run on a background thread
parent
f8b14ea94f
commit
f891586801
|
@ -1,6 +1,6 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Runtime.InteropServices;
|
using System.Threading;
|
||||||
|
|
||||||
namespace MoonWorks.Audio
|
namespace MoonWorks.Audio
|
||||||
{
|
{
|
||||||
|
@ -29,10 +29,17 @@ namespace MoonWorks.Audio
|
||||||
private readonly List<WeakReference<AudioResource>> resources = new List<WeakReference<AudioResource>>();
|
private readonly List<WeakReference<AudioResource>> resources = new List<WeakReference<AudioResource>>();
|
||||||
private readonly List<WeakReference<StreamingSound>> streamingSounds = new List<WeakReference<StreamingSound>>();
|
private readonly List<WeakReference<StreamingSound>> streamingSounds = new List<WeakReference<StreamingSound>>();
|
||||||
|
|
||||||
|
private const int Step = 200;
|
||||||
|
private TimeSpan UpdateInterval;
|
||||||
|
private Thread Thread;
|
||||||
|
private AutoResetEvent WakeSignal;
|
||||||
|
|
||||||
private bool IsDisposed;
|
private bool IsDisposed;
|
||||||
|
|
||||||
public unsafe AudioDevice()
|
public unsafe AudioDevice()
|
||||||
{
|
{
|
||||||
|
UpdateInterval = TimeSpan.FromTicks(TimeSpan.TicksPerSecond / Step);
|
||||||
|
|
||||||
FAudio.FAudioCreate(out var handle, 0, FAudio.FAUDIO_DEFAULT_PROCESSOR);
|
FAudio.FAudioCreate(out var handle, 0, FAudio.FAUDIO_DEFAULT_PROCESSOR);
|
||||||
Handle = handle;
|
Handle = handle;
|
||||||
|
|
||||||
|
@ -105,9 +112,26 @@ namespace MoonWorks.Audio
|
||||||
SpeedOfSound,
|
SpeedOfSound,
|
||||||
Handle3D
|
Handle3D
|
||||||
);
|
);
|
||||||
|
|
||||||
|
Logger.LogInfo("Setting up audio thread...");
|
||||||
|
WakeSignal = new AutoResetEvent(true);
|
||||||
|
|
||||||
|
Thread = new Thread(ThreadMain);
|
||||||
|
Thread.IsBackground = true;
|
||||||
|
Thread.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void Update()
|
private void ThreadMain()
|
||||||
|
{
|
||||||
|
while (!IsDisposed)
|
||||||
|
{
|
||||||
|
ThreadMainTick();
|
||||||
|
|
||||||
|
WakeSignal.WaitOne(UpdateInterval);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ThreadMainTick()
|
||||||
{
|
{
|
||||||
for (var i = streamingSounds.Count - 1; i >= 0; i--)
|
for (var i = streamingSounds.Count - 1; i >= 0; i--)
|
||||||
{
|
{
|
||||||
|
@ -123,6 +147,11 @@ namespace MoonWorks.Audio
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal void WakeThread()
|
||||||
|
{
|
||||||
|
WakeSignal.Set();
|
||||||
|
}
|
||||||
|
|
||||||
public void SyncPlay()
|
public void SyncPlay()
|
||||||
{
|
{
|
||||||
FAudio.FAudio_CommitChanges(Handle, 1);
|
FAudio.FAudio_CommitChanges(Handle, 1);
|
||||||
|
|
|
@ -168,9 +168,8 @@ namespace MoonWorks
|
||||||
while (accumulatedUpdateTime >= Timestep)
|
while (accumulatedUpdateTime >= Timestep)
|
||||||
{
|
{
|
||||||
Inputs.Update();
|
Inputs.Update();
|
||||||
AudioDevice.Update();
|
|
||||||
|
|
||||||
Update(Timestep);
|
Update(Timestep);
|
||||||
|
AudioDevice.WakeThread();
|
||||||
|
|
||||||
accumulatedUpdateTime -= Timestep;
|
accumulatedUpdateTime -= Timestep;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue