From 26dc361d316f1e9a6aef8db46c0d7b4437b62f6f Mon Sep 17 00:00:00 2001 From: cosmonaut Date: Tue, 22 Feb 2022 21:14:32 -0800 Subject: [PATCH] Formatting pass --- AudioDevice.cs | 444 ++++++++++++++++++------------------- AudioEmitter.cs | 32 +-- AudioListener.cs | 30 +-- AudioResource.cs | 76 +++---- SoundInstance.cs | 486 ++++++++++++++++++++--------------------- SoundState.cs | 14 +- StaticSound.cs | 132 +++++------ StaticSoundInstance.cs | 164 +++++++------- StreamingSound.cs | 300 ++++++++++++------------- StreamingSoundOgg.cs | 144 ++++++------ 10 files changed, 912 insertions(+), 910 deletions(-) diff --git a/AudioDevice.cs b/AudioDevice.cs index ebff250..9dbb52b 100644 --- a/AudioDevice.cs +++ b/AudioDevice.cs @@ -1,277 +1,277 @@ -using System; +using System; using System.Collections.Generic; using System.Runtime.InteropServices; namespace MoonWorks.Audio { - public class AudioDevice : IDisposable - { - public IntPtr Handle { get; } - public byte[] Handle3D { get; } - public IntPtr MasteringVoice { get; } - public FAudio.FAudioDeviceDetails DeviceDetails { get; } - public IntPtr ReverbVoice { get; } + public class AudioDevice : IDisposable + { + public IntPtr Handle { get; } + public byte[] Handle3D { get; } + public IntPtr MasteringVoice { get; } + public FAudio.FAudioDeviceDetails DeviceDetails { get; } + public IntPtr ReverbVoice { get; } - public float CurveDistanceScalar = 1f; - public float DopplerScale = 1f; - public float SpeedOfSound = 343.5f; + public float CurveDistanceScalar = 1f; + public float DopplerScale = 1f; + public float SpeedOfSound = 343.5f; - internal FAudio.FAudioVoiceSends ReverbSends; + internal FAudio.FAudioVoiceSends ReverbSends; - private readonly List> resources = new List>(); - private readonly List> streamingSounds = new List>(); + private readonly List> resources = new List>(); + private readonly List> streamingSounds = new List>(); - private bool IsDisposed; + private bool IsDisposed; - public unsafe AudioDevice() - { - FAudio.FAudioCreate(out var handle, 0, 0); - Handle = handle; + public unsafe AudioDevice() + { + FAudio.FAudioCreate(out var handle, 0, 0); + Handle = handle; - /* Find a suitable device */ + /* Find a suitable device */ - FAudio.FAudio_GetDeviceCount(Handle, out var devices); + FAudio.FAudio_GetDeviceCount(Handle, out var devices); - if (devices == 0) - { - Logger.LogError("No audio devices found!"); - Handle = IntPtr.Zero; - FAudio.FAudio_Release(Handle); - return; - } + if (devices == 0) + { + Logger.LogError("No audio devices found!"); + Handle = IntPtr.Zero; + FAudio.FAudio_Release(Handle); + return; + } - FAudio.FAudioDeviceDetails deviceDetails; + FAudio.FAudioDeviceDetails deviceDetails; - uint i = 0; - for (i = 0; i < devices; i++) - { - FAudio.FAudio_GetDeviceDetails( - Handle, - i, - out deviceDetails - ); - if ((deviceDetails.Role & FAudio.FAudioDeviceRole.FAudioDefaultGameDevice) == FAudio.FAudioDeviceRole.FAudioDefaultGameDevice) - { - DeviceDetails = deviceDetails; - break; - } - } + uint i = 0; + for (i = 0; i < devices; i++) + { + FAudio.FAudio_GetDeviceDetails( + Handle, + i, + out deviceDetails + ); + if ((deviceDetails.Role & FAudio.FAudioDeviceRole.FAudioDefaultGameDevice) == FAudio.FAudioDeviceRole.FAudioDefaultGameDevice) + { + DeviceDetails = deviceDetails; + break; + } + } - if (i == devices) - { - i = 0; /* whatever we'll just use the first one I guess */ - FAudio.FAudio_GetDeviceDetails( - Handle, - i, - out deviceDetails - ); - DeviceDetails = deviceDetails; - } + if (i == devices) + { + i = 0; /* whatever we'll just use the first one I guess */ + FAudio.FAudio_GetDeviceDetails( + Handle, + i, + out deviceDetails + ); + DeviceDetails = deviceDetails; + } - /* Init Mastering Voice */ - IntPtr masteringVoice; + /* Init Mastering Voice */ + IntPtr masteringVoice; - if (FAudio.FAudio_CreateMasteringVoice( - Handle, - out masteringVoice, - FAudio.FAUDIO_DEFAULT_CHANNELS, - FAudio.FAUDIO_DEFAULT_SAMPLERATE, - 0, - i, - IntPtr.Zero - ) != 0) - { - Logger.LogError("No mastering voice found!"); - Handle = IntPtr.Zero; - FAudio.FAudio_Release(Handle); - return; - } + if (FAudio.FAudio_CreateMasteringVoice( + Handle, + out masteringVoice, + FAudio.FAUDIO_DEFAULT_CHANNELS, + FAudio.FAUDIO_DEFAULT_SAMPLERATE, + 0, + i, + IntPtr.Zero + ) != 0) + { + Logger.LogError("No mastering voice found!"); + Handle = IntPtr.Zero; + FAudio.FAudio_Release(Handle); + return; + } - MasteringVoice = masteringVoice; + MasteringVoice = masteringVoice; - /* Init 3D Audio */ + /* Init 3D Audio */ - Handle3D = new byte[FAudio.F3DAUDIO_HANDLE_BYTESIZE]; - FAudio.F3DAudioInitialize( - DeviceDetails.OutputFormat.dwChannelMask, - SpeedOfSound, - Handle3D - ); + Handle3D = new byte[FAudio.F3DAUDIO_HANDLE_BYTESIZE]; + FAudio.F3DAudioInitialize( + DeviceDetails.OutputFormat.dwChannelMask, + SpeedOfSound, + Handle3D + ); - /* Init reverb */ + /* Init reverb */ - IntPtr reverbVoice; + IntPtr reverbVoice; - IntPtr reverb; - FAudio.FAudioCreateReverb(out reverb, 0); + IntPtr reverb; + FAudio.FAudioCreateReverb(out reverb, 0); - IntPtr chainPtr; - chainPtr = Marshal.AllocHGlobal( - Marshal.SizeOf() - ); + IntPtr chainPtr; + chainPtr = Marshal.AllocHGlobal( + Marshal.SizeOf() + ); - FAudio.FAudioEffectChain* reverbChain = (FAudio.FAudioEffectChain*) chainPtr; - reverbChain->EffectCount = 1; - reverbChain->pEffectDescriptors = Marshal.AllocHGlobal( - Marshal.SizeOf() - ); + FAudio.FAudioEffectChain* reverbChain = (FAudio.FAudioEffectChain*) chainPtr; + reverbChain->EffectCount = 1; + reverbChain->pEffectDescriptors = Marshal.AllocHGlobal( + Marshal.SizeOf() + ); - FAudio.FAudioEffectDescriptor* reverbDescriptor = - (FAudio.FAudioEffectDescriptor*) reverbChain->pEffectDescriptors; + FAudio.FAudioEffectDescriptor* reverbDescriptor = + (FAudio.FAudioEffectDescriptor*) reverbChain->pEffectDescriptors; - reverbDescriptor->InitialState = 1; - reverbDescriptor->OutputChannels = (uint) ( - (DeviceDetails.OutputFormat.Format.nChannels == 6) ? 6 : 1 - ); - reverbDescriptor->pEffect = reverb; + reverbDescriptor->InitialState = 1; + reverbDescriptor->OutputChannels = (uint) ( + (DeviceDetails.OutputFormat.Format.nChannels == 6) ? 6 : 1 + ); + reverbDescriptor->pEffect = reverb; - FAudio.FAudio_CreateSubmixVoice( - Handle, - out reverbVoice, - 1, /* omnidirectional reverb */ - DeviceDetails.OutputFormat.Format.nSamplesPerSec, - 0, - 0, - IntPtr.Zero, - chainPtr - ); - FAudio.FAPOBase_Release(reverb); + FAudio.FAudio_CreateSubmixVoice( + Handle, + out reverbVoice, + 1, /* omnidirectional reverb */ + DeviceDetails.OutputFormat.Format.nSamplesPerSec, + 0, + 0, + IntPtr.Zero, + chainPtr + ); + FAudio.FAPOBase_Release(reverb); - Marshal.FreeHGlobal(reverbChain->pEffectDescriptors); - Marshal.FreeHGlobal(chainPtr); + Marshal.FreeHGlobal(reverbChain->pEffectDescriptors); + Marshal.FreeHGlobal(chainPtr); - ReverbVoice = reverbVoice; + ReverbVoice = reverbVoice; - /* Init reverb params */ - // Defaults based on FAUDIOFX_I3DL2_PRESET_GENERIC + /* Init reverb params */ + // Defaults based on FAUDIOFX_I3DL2_PRESET_GENERIC - IntPtr reverbParamsPtr = Marshal.AllocHGlobal( - Marshal.SizeOf() - ); + IntPtr reverbParamsPtr = Marshal.AllocHGlobal( + Marshal.SizeOf() + ); - FAudio.FAudioFXReverbParameters* reverbParams = (FAudio.FAudioFXReverbParameters*) reverbParamsPtr; - reverbParams->WetDryMix = 100.0f; - reverbParams->ReflectionsDelay = 7; - reverbParams->ReverbDelay = 11; - reverbParams->RearDelay = FAudio.FAUDIOFX_REVERB_DEFAULT_REAR_DELAY; - reverbParams->PositionLeft = FAudio.FAUDIOFX_REVERB_DEFAULT_POSITION; - reverbParams->PositionRight = FAudio.FAUDIOFX_REVERB_DEFAULT_POSITION; - reverbParams->PositionMatrixLeft = FAudio.FAUDIOFX_REVERB_DEFAULT_POSITION_MATRIX; - reverbParams->PositionMatrixRight = FAudio.FAUDIOFX_REVERB_DEFAULT_POSITION_MATRIX; - reverbParams->EarlyDiffusion = 15; - reverbParams->LateDiffusion = 15; - reverbParams->LowEQGain = 8; - reverbParams->LowEQCutoff = 4; - reverbParams->HighEQGain = 8; - reverbParams->HighEQCutoff = 6; - reverbParams->RoomFilterFreq = 5000f; - reverbParams->RoomFilterMain = -10f; - reverbParams->RoomFilterHF = -1f; - reverbParams->ReflectionsGain = -26.0200005f; - reverbParams->ReverbGain = 10.0f; - reverbParams->DecayTime = 1.49000001f; - reverbParams->Density = 100.0f; - reverbParams->RoomSize = FAudio.FAUDIOFX_REVERB_DEFAULT_ROOM_SIZE; - FAudio.FAudioVoice_SetEffectParameters( - ReverbVoice, - 0, - reverbParamsPtr, - (uint) Marshal.SizeOf(), - 0 - ); - Marshal.FreeHGlobal(reverbParamsPtr); + FAudio.FAudioFXReverbParameters* reverbParams = (FAudio.FAudioFXReverbParameters*) reverbParamsPtr; + reverbParams->WetDryMix = 100.0f; + reverbParams->ReflectionsDelay = 7; + reverbParams->ReverbDelay = 11; + reverbParams->RearDelay = FAudio.FAUDIOFX_REVERB_DEFAULT_REAR_DELAY; + reverbParams->PositionLeft = FAudio.FAUDIOFX_REVERB_DEFAULT_POSITION; + reverbParams->PositionRight = FAudio.FAUDIOFX_REVERB_DEFAULT_POSITION; + reverbParams->PositionMatrixLeft = FAudio.FAUDIOFX_REVERB_DEFAULT_POSITION_MATRIX; + reverbParams->PositionMatrixRight = FAudio.FAUDIOFX_REVERB_DEFAULT_POSITION_MATRIX; + reverbParams->EarlyDiffusion = 15; + reverbParams->LateDiffusion = 15; + reverbParams->LowEQGain = 8; + reverbParams->LowEQCutoff = 4; + reverbParams->HighEQGain = 8; + reverbParams->HighEQCutoff = 6; + reverbParams->RoomFilterFreq = 5000f; + reverbParams->RoomFilterMain = -10f; + reverbParams->RoomFilterHF = -1f; + reverbParams->ReflectionsGain = -26.0200005f; + reverbParams->ReverbGain = 10.0f; + reverbParams->DecayTime = 1.49000001f; + reverbParams->Density = 100.0f; + reverbParams->RoomSize = FAudio.FAUDIOFX_REVERB_DEFAULT_ROOM_SIZE; + FAudio.FAudioVoice_SetEffectParameters( + ReverbVoice, + 0, + reverbParamsPtr, + (uint) Marshal.SizeOf(), + 0 + ); + Marshal.FreeHGlobal(reverbParamsPtr); - /* Init reverb sends */ + /* Init reverb sends */ - ReverbSends = new FAudio.FAudioVoiceSends - { - SendCount = 2, - pSends = Marshal.AllocHGlobal( - 2 * Marshal.SizeOf() - ) - }; - FAudio.FAudioSendDescriptor* sendDesc = (FAudio.FAudioSendDescriptor*) ReverbSends.pSends; - sendDesc[0].Flags = 0; - sendDesc[0].pOutputVoice = MasteringVoice; - sendDesc[1].Flags = 0; - sendDesc[1].pOutputVoice = ReverbVoice; - } + ReverbSends = new FAudio.FAudioVoiceSends + { + SendCount = 2, + pSends = Marshal.AllocHGlobal( + 2 * Marshal.SizeOf() + ) + }; + FAudio.FAudioSendDescriptor* sendDesc = (FAudio.FAudioSendDescriptor*) ReverbSends.pSends; + sendDesc[0].Flags = 0; + sendDesc[0].pOutputVoice = MasteringVoice; + sendDesc[1].Flags = 0; + sendDesc[1].pOutputVoice = ReverbVoice; + } - public void Update() - { - for (var i = streamingSounds.Count - 1; i >= 0; i--) - { - var weakReference = streamingSounds[i]; - if (weakReference.TryGetTarget(out var streamingSound)) - { - streamingSound.Update(); - } - else - { - streamingSounds.RemoveAt(i); - } - } - } + public void Update() + { + for (var i = streamingSounds.Count - 1; i >= 0; i--) + { + var weakReference = streamingSounds[i]; + if (weakReference.TryGetTarget(out var streamingSound)) + { + streamingSound.Update(); + } + else + { + streamingSounds.RemoveAt(i); + } + } + } - internal void AddDynamicSoundInstance(StreamingSound instance) - { - streamingSounds.Add(new WeakReference(instance)); - } + internal void AddDynamicSoundInstance(StreamingSound instance) + { + streamingSounds.Add(new WeakReference(instance)); + } - internal void AddResourceReference(WeakReference resourceReference) - { - lock (resources) - { - resources.Add(resourceReference); - } - } + internal void AddResourceReference(WeakReference resourceReference) + { + lock (resources) + { + resources.Add(resourceReference); + } + } - internal void RemoveResourceReference(WeakReference resourceReference) - { - lock (resources) - { - resources.Remove(resourceReference); - } - } + internal void RemoveResourceReference(WeakReference resourceReference) + { + lock (resources) + { + resources.Remove(resourceReference); + } + } - protected virtual void Dispose(bool disposing) - { - if (!IsDisposed) - { - if (disposing) - { + protected virtual void Dispose(bool disposing) + { + if (!IsDisposed) + { + if (disposing) + { for (var i = streamingSounds.Count - 1; i >= 0; i--) { var weakReference = streamingSounds[i]; if (weakReference.TryGetTarget(out var streamingSound)) - { - streamingSound.Dispose(); - } + { + streamingSound.Dispose(); + } } streamingSounds.Clear(); - } + } FAudio.FAudioVoice_DestroyVoice(ReverbVoice); FAudio.FAudioVoice_DestroyVoice(MasteringVoice); - FAudio.FAudio_Release(Handle); + FAudio.FAudio_Release(Handle); - IsDisposed = true; - } - } + IsDisposed = true; + } + } - // TODO: override finalizer only if 'Dispose(bool disposing)' has code to free unmanaged resources - ~AudioDevice() - { - // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method - Dispose(disposing: false); - } + // TODO: override finalizer only if 'Dispose(bool disposing)' has code to free unmanaged resources + ~AudioDevice() + { + // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + Dispose(disposing: false); + } - public void Dispose() - { - // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method - Dispose(disposing: true); - GC.SuppressFinalize(this); - } - } + public void Dispose() + { + // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + } } diff --git a/AudioEmitter.cs b/AudioEmitter.cs index 51a9576..c23becd 100644 --- a/AudioEmitter.cs +++ b/AudioEmitter.cs @@ -1,12 +1,12 @@ -using System; +using System; using System.Runtime.InteropServices; using MoonWorks.Math; namespace MoonWorks.Audio { - public class AudioEmitter : AudioResource - { - internal FAudio.F3DAUDIO_EMITTER emitterData; + public class AudioEmitter : AudioResource + { + internal FAudio.F3DAUDIO_EMITTER emitterData; public float DopplerScale { @@ -107,17 +107,17 @@ namespace MoonWorks.Audio GCHandleType.Pinned ); - public AudioEmitter(AudioDevice device) : base(device) - { - emitterData = new FAudio.F3DAUDIO_EMITTER(); + public AudioEmitter(AudioDevice device) : base(device) + { + emitterData = new FAudio.F3DAUDIO_EMITTER(); - DopplerScale = 1f; - Forward = Vector3.Forward; - Position = Vector3.Zero; - Up = Vector3.Up; - Velocity = Vector3.Zero; + DopplerScale = 1f; + Forward = Vector3.Forward; + Position = Vector3.Zero; + Up = Vector3.Up; + Velocity = Vector3.Zero; - /* Unexposed variables, defaults based on XNA behavior */ + /* Unexposed variables, defaults based on XNA behavior */ emitterData.pCone = IntPtr.Zero; emitterData.ChannelCount = 1; emitterData.ChannelRadius = 1.0f; @@ -128,8 +128,8 @@ namespace MoonWorks.Audio emitterData.pLPFReverbCurve = IntPtr.Zero; emitterData.pReverbCurve = IntPtr.Zero; emitterData.CurveDistanceScaler = 1.0f; - } + } - protected override void Destroy() { } - } + protected override void Destroy() { } + } } diff --git a/AudioListener.cs b/AudioListener.cs index 67e44ba..0f9e515 100644 --- a/AudioListener.cs +++ b/AudioListener.cs @@ -1,11 +1,11 @@ -using System; +using System; using MoonWorks.Math; namespace MoonWorks.Audio { - public class AudioListener : AudioResource - { - internal FAudio.F3DAUDIO_LISTENER listenerData; + public class AudioListener : AudioResource + { + internal FAudio.F3DAUDIO_LISTENER listenerData; public Vector3 Forward { @@ -80,18 +80,18 @@ namespace MoonWorks.Audio } } - public AudioListener(AudioDevice device) : base(device) - { - listenerData = new FAudio.F3DAUDIO_LISTENER(); - Forward = Vector3.Forward; - Position = Vector3.Zero; - Up = Vector3.Up; - Velocity = Vector3.Zero; + public AudioListener(AudioDevice device) : base(device) + { + listenerData = new FAudio.F3DAUDIO_LISTENER(); + Forward = Vector3.Forward; + Position = Vector3.Zero; + Up = Vector3.Up; + Velocity = Vector3.Zero; - /* Unexposed variables, defaults based on XNA behavior */ + /* Unexposed variables, defaults based on XNA behavior */ listenerData.pCone = IntPtr.Zero; - } + } - protected override void Destroy() { } - } + protected override void Destroy() { } + } } diff --git a/AudioResource.cs b/AudioResource.cs index e74166f..edf8b49 100644 --- a/AudioResource.cs +++ b/AudioResource.cs @@ -1,52 +1,52 @@ -using System; +using System; namespace MoonWorks.Audio { - public abstract class AudioResource : IDisposable - { - public AudioDevice Device { get; } + public abstract class AudioResource : IDisposable + { + public AudioDevice Device { get; } - public bool IsDisposed { get; private set; } + public bool IsDisposed { get; private set; } - private WeakReference selfReference; + private WeakReference selfReference; - public AudioResource(AudioDevice device) - { - Device = device; + public AudioResource(AudioDevice device) + { + Device = device; - selfReference = new WeakReference(this); - Device.AddResourceReference(selfReference); - } + selfReference = new WeakReference(this); + Device.AddResourceReference(selfReference); + } - protected abstract void Destroy(); + protected abstract void Destroy(); - protected virtual void Dispose(bool disposing) - { - if (!IsDisposed) - { - Destroy(); + protected virtual void Dispose(bool disposing) + { + if (!IsDisposed) + { + Destroy(); - if (selfReference != null) - { - Device.RemoveResourceReference(selfReference); - selfReference = null; - } + if (selfReference != null) + { + Device.RemoveResourceReference(selfReference); + selfReference = null; + } - IsDisposed = true; - } - } + IsDisposed = true; + } + } - ~AudioResource() - { - // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method - Dispose(disposing: false); - } + ~AudioResource() + { + // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + Dispose(disposing: false); + } - public void Dispose() - { - // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method - Dispose(disposing: true); - GC.SuppressFinalize(this); - } - } + public void Dispose() + { + // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + } } diff --git a/SoundInstance.cs b/SoundInstance.cs index bf4c028..9d99697 100644 --- a/SoundInstance.cs +++ b/SoundInstance.cs @@ -1,271 +1,271 @@ -using System; +using System; using System.Runtime.InteropServices; using MoonWorks.Math; namespace MoonWorks.Audio { - public abstract class SoundInstance : AudioResource - { - internal IntPtr Handle { get; } - internal FAudio.FAudioWaveFormatEx Format { get; } - public bool Loop { get; } + public abstract class SoundInstance : AudioResource + { + internal IntPtr Handle { get; } + internal FAudio.FAudioWaveFormatEx Format { get; } + public bool Loop { get; } - protected FAudio.F3DAUDIO_DSP_SETTINGS dspSettings; + protected FAudio.F3DAUDIO_DSP_SETTINGS dspSettings; - protected bool is3D; + protected bool is3D; - public abstract SoundState State { get; protected set; } + public abstract SoundState State { get; protected set; } - private float _pan = 0; - public float Pan - { - get => _pan; - set - { - _pan = value; + private float _pan = 0; + public float Pan + { + get => _pan; + set + { + _pan = value; - if (_pan < -1f) - { - _pan = -1f; - } - if (_pan > 1f) - { - _pan = 1f; - } + if (_pan < -1f) + { + _pan = -1f; + } + if (_pan > 1f) + { + _pan = 1f; + } - if (is3D) { return; } + if (is3D) { return; } - SetPanMatrixCoefficients(); - FAudio.FAudioVoice_SetOutputMatrix( - Handle, - Device.MasteringVoice, - dspSettings.SrcChannelCount, - dspSettings.DstChannelCount, - dspSettings.pMatrixCoefficients, - 0 - ); - } - } + SetPanMatrixCoefficients(); + FAudio.FAudioVoice_SetOutputMatrix( + Handle, + Device.MasteringVoice, + dspSettings.SrcChannelCount, + dspSettings.DstChannelCount, + dspSettings.pMatrixCoefficients, + 0 + ); + } + } - private float _pitch = 1; - public float Pitch - { - get => _pitch; - set - { - _pitch = MathHelper.Clamp(value, -1f, 1f); - UpdatePitch(); - } - } + private float _pitch = 1; + public float Pitch + { + get => _pitch; + set + { + _pitch = MathHelper.Clamp(value, -1f, 1f); + UpdatePitch(); + } + } - private float _volume = 1; - public float Volume - { - get => _volume; - set - { - _volume = value; - FAudio.FAudioVoice_SetVolume(Handle, _volume, 0); - } - } + private float _volume = 1; + public float Volume + { + get => _volume; + set + { + _volume = value; + FAudio.FAudioVoice_SetVolume(Handle, _volume, 0); + } + } - private float _reverb; - public unsafe float Reverb - { - get => _reverb; - set - { - _reverb = value; + private float _reverb; + public unsafe float Reverb + { + get => _reverb; + set + { + _reverb = value; - float* outputMatrix = (float*) dspSettings.pMatrixCoefficients; - outputMatrix[0] = _reverb; - if (dspSettings.SrcChannelCount == 2) - { - outputMatrix[1] = _reverb; - } + float* outputMatrix = (float*) dspSettings.pMatrixCoefficients; + outputMatrix[0] = _reverb; + if (dspSettings.SrcChannelCount == 2) + { + outputMatrix[1] = _reverb; + } - FAudio.FAudioVoice_SetOutputMatrix( - Handle, - Device.ReverbVoice, - dspSettings.SrcChannelCount, - 1, - dspSettings.pMatrixCoefficients, - 0 - ); - } - } + FAudio.FAudioVoice_SetOutputMatrix( + Handle, + Device.ReverbVoice, + dspSettings.SrcChannelCount, + 1, + dspSettings.pMatrixCoefficients, + 0 + ); + } + } - private float _lowPassFilter; - public float LowPassFilter - { - get => _lowPassFilter; - set - { - _lowPassFilter = value; + private float _lowPassFilter; + public float LowPassFilter + { + get => _lowPassFilter; + set + { + _lowPassFilter = value; - FAudio.FAudioFilterParameters p = new FAudio.FAudioFilterParameters - { - Type = FAudio.FAudioFilterType.FAudioLowPassFilter, - Frequency = _lowPassFilter, - OneOverQ = 1f - }; - FAudio.FAudioVoice_SetFilterParameters( - Handle, - ref p, - 0 - ); - } - } + FAudio.FAudioFilterParameters p = new FAudio.FAudioFilterParameters + { + Type = FAudio.FAudioFilterType.FAudioLowPassFilter, + Frequency = _lowPassFilter, + OneOverQ = 1f + }; + FAudio.FAudioVoice_SetFilterParameters( + Handle, + ref p, + 0 + ); + } + } - private float _highPassFilter; - public float HighPassFilter - { - get => _highPassFilter; - set - { - _highPassFilter = value; + private float _highPassFilter; + public float HighPassFilter + { + get => _highPassFilter; + set + { + _highPassFilter = value; - FAudio.FAudioFilterParameters p = new FAudio.FAudioFilterParameters - { - Type = FAudio.FAudioFilterType.FAudioHighPassFilter, - Frequency = _highPassFilter, - OneOverQ = 1f - }; - FAudio.FAudioVoice_SetFilterParameters( - Handle, - ref p, - 0 - ); - } - } + FAudio.FAudioFilterParameters p = new FAudio.FAudioFilterParameters + { + Type = FAudio.FAudioFilterType.FAudioHighPassFilter, + Frequency = _highPassFilter, + OneOverQ = 1f + }; + FAudio.FAudioVoice_SetFilterParameters( + Handle, + ref p, + 0 + ); + } + } - private float _bandPassFilter; - public float BandPassFilter - { - get => _bandPassFilter; - set - { - _bandPassFilter = value; + private float _bandPassFilter; + public float BandPassFilter + { + get => _bandPassFilter; + set + { + _bandPassFilter = value; - FAudio.FAudioFilterParameters p = new FAudio.FAudioFilterParameters - { - Type = FAudio.FAudioFilterType.FAudioBandPassFilter, - Frequency = _bandPassFilter, - OneOverQ = 1f - }; - FAudio.FAudioVoice_SetFilterParameters( - Handle, - ref p, - 0 - ); - } - } + FAudio.FAudioFilterParameters p = new FAudio.FAudioFilterParameters + { + Type = FAudio.FAudioFilterType.FAudioBandPassFilter, + Frequency = _bandPassFilter, + OneOverQ = 1f + }; + FAudio.FAudioVoice_SetFilterParameters( + Handle, + ref p, + 0 + ); + } + } - public SoundInstance( - AudioDevice device, - ushort channels, - uint samplesPerSecond, - bool is3D, - bool loop - ) : base(device) - { - var blockAlign = (ushort)(4 * channels); - var format = new FAudio.FAudioWaveFormatEx - { - wFormatTag = 3, - wBitsPerSample = 32, - nChannels = channels, - nBlockAlign = blockAlign, - nSamplesPerSec = samplesPerSecond, - nAvgBytesPerSec = blockAlign * samplesPerSecond - }; + public SoundInstance( + AudioDevice device, + ushort channels, + uint samplesPerSecond, + bool is3D, + bool loop + ) : base(device) + { + var blockAlign = (ushort) (4 * channels); + var format = new FAudio.FAudioWaveFormatEx + { + wFormatTag = 3, + wBitsPerSample = 32, + nChannels = channels, + nBlockAlign = blockAlign, + nSamplesPerSec = samplesPerSecond, + nAvgBytesPerSec = blockAlign * samplesPerSecond + }; - Format = format; + Format = format; - FAudio.FAudio_CreateSourceVoice( - Device.Handle, - out var handle, - ref format, - FAudio.FAUDIO_VOICE_USEFILTER, - FAudio.FAUDIO_DEFAULT_FREQ_RATIO, - IntPtr.Zero, - IntPtr.Zero, - IntPtr.Zero - ); + FAudio.FAudio_CreateSourceVoice( + Device.Handle, + out var handle, + ref format, + FAudio.FAUDIO_VOICE_USEFILTER, + FAudio.FAUDIO_DEFAULT_FREQ_RATIO, + IntPtr.Zero, + IntPtr.Zero, + IntPtr.Zero + ); - if (handle == IntPtr.Zero) - { - Logger.LogError("SoundInstance failed to initialize!"); - return; - } + if (handle == IntPtr.Zero) + { + Logger.LogError("SoundInstance failed to initialize!"); + return; + } - Handle = handle; - this.is3D = is3D; - InitDSPSettings(Format.nChannels); + Handle = handle; + this.is3D = is3D; + InitDSPSettings(Format.nChannels); - FAudio.FAudioVoice_SetOutputVoices( - handle, - ref Device.ReverbSends - ); + FAudio.FAudioVoice_SetOutputVoices( + handle, + ref Device.ReverbSends + ); - Loop = loop; - State = SoundState.Stopped; - } + Loop = loop; + State = SoundState.Stopped; + } - public void Apply3D(AudioListener listener, AudioEmitter emitter) - { - is3D = true; + public void Apply3D(AudioListener listener, AudioEmitter emitter) + { + is3D = true; - emitter.emitterData.CurveDistanceScaler = Device.CurveDistanceScalar; - emitter.emitterData.ChannelCount = dspSettings.SrcChannelCount; + emitter.emitterData.CurveDistanceScaler = Device.CurveDistanceScalar; + emitter.emitterData.ChannelCount = dspSettings.SrcChannelCount; - FAudio.F3DAudioCalculate( - Device.Handle3D, - ref listener.listenerData, - ref emitter.emitterData, - FAudio.F3DAUDIO_CALCULATE_MATRIX | FAudio.F3DAUDIO_CALCULATE_DOPPLER, - ref dspSettings - ); + FAudio.F3DAudioCalculate( + Device.Handle3D, + ref listener.listenerData, + ref emitter.emitterData, + FAudio.F3DAUDIO_CALCULATE_MATRIX | FAudio.F3DAUDIO_CALCULATE_DOPPLER, + ref dspSettings + ); - UpdatePitch(); - FAudio.FAudioVoice_SetOutputMatrix( - Handle, - Device.MasteringVoice, - dspSettings.SrcChannelCount, - dspSettings.DstChannelCount, - dspSettings.pMatrixCoefficients, - 0 - ); - } + UpdatePitch(); + FAudio.FAudioVoice_SetOutputMatrix( + Handle, + Device.MasteringVoice, + dspSettings.SrcChannelCount, + dspSettings.DstChannelCount, + dspSettings.pMatrixCoefficients, + 0 + ); + } - public abstract void Play(); - public abstract void Pause(); - public abstract void Stop(bool immediate); + public abstract void Play(); + public abstract void Pause(); + public abstract void Stop(bool immediate); - private void InitDSPSettings(uint srcChannels) - { - dspSettings = new FAudio.F3DAUDIO_DSP_SETTINGS(); - dspSettings.DopplerFactor = 1f; - dspSettings.SrcChannelCount = srcChannels; - dspSettings.DstChannelCount = Device.DeviceDetails.OutputFormat.Format.nChannels; + private void InitDSPSettings(uint srcChannels) + { + dspSettings = new FAudio.F3DAUDIO_DSP_SETTINGS(); + dspSettings.DopplerFactor = 1f; + dspSettings.SrcChannelCount = srcChannels; + dspSettings.DstChannelCount = Device.DeviceDetails.OutputFormat.Format.nChannels; - int memsize = ( - 4 * - (int) dspSettings.SrcChannelCount * - (int) dspSettings.DstChannelCount - ); + int memsize = ( + 4 * + (int) dspSettings.SrcChannelCount * + (int) dspSettings.DstChannelCount + ); - dspSettings.pMatrixCoefficients = Marshal.AllocHGlobal(memsize); - unsafe - { - byte* memPtr = (byte*) dspSettings.pMatrixCoefficients; - for (int i = 0; i < memsize; i += 1) - { - memPtr[i] = 0; - } - } - SetPanMatrixCoefficients(); - } + dspSettings.pMatrixCoefficients = Marshal.AllocHGlobal(memsize); + unsafe + { + byte* memPtr = (byte*) dspSettings.pMatrixCoefficients; + for (int i = 0; i < memsize; i += 1) + { + memPtr[i] = 0; + } + } + SetPanMatrixCoefficients(); + } private void UpdatePitch() { @@ -287,10 +287,10 @@ namespace MoonWorks.Audio ); } - // Taken from https://github.com/FNA-XNA/FNA/blob/master/src/Audio/SoundEffectInstance.cs - private unsafe void SetPanMatrixCoefficients() - { - /* Two major things to notice: + // Taken from https://github.com/FNA-XNA/FNA/blob/master/src/Audio/SoundEffectInstance.cs + private unsafe void SetPanMatrixCoefficients() + { + /* Two major things to notice: * 1. The spec assumes any speaker count >= 2 has Front Left/Right. * 2. Stereo panning is WAY more complicated than you think. * The main thing is that hard panning does NOT eliminate an @@ -307,7 +307,7 @@ namespace MoonWorks.Audio else { outputMatrix[0] = (_pan > 0.0f) ? (1.0f - _pan) : 1.0f; - outputMatrix[1] = (_pan < 0.0f) ? (1.0f + _pan) : 1.0f; + outputMatrix[1] = (_pan < 0.0f) ? (1.0f + _pan) : 1.0f; } } else @@ -339,14 +339,14 @@ namespace MoonWorks.Audio } } } - } + } - protected override void Destroy() - { - Stop(true); + protected override void Destroy() + { + Stop(true); - FAudio.FAudioVoice_DestroyVoice(Handle); - Marshal.FreeHGlobal(dspSettings.pMatrixCoefficients); - } - } + FAudio.FAudioVoice_DestroyVoice(Handle); + Marshal.FreeHGlobal(dspSettings.pMatrixCoefficients); + } + } } diff --git a/SoundState.cs b/SoundState.cs index 2a82ea2..4fb9cb2 100644 --- a/SoundState.cs +++ b/SoundState.cs @@ -1,9 +1,9 @@ -namespace MoonWorks.Audio +namespace MoonWorks.Audio { - public enum SoundState - { - Playing, - Paused, - Stopped - } + public enum SoundState + { + Playing, + Paused, + Stopped + } } diff --git a/StaticSound.cs b/StaticSound.cs index 9d03dd8..526c384 100644 --- a/StaticSound.cs +++ b/StaticSound.cs @@ -1,82 +1,82 @@ -using System; +using System; using System.Runtime.InteropServices; namespace MoonWorks.Audio { - public class StaticSound : AudioResource - { - internal FAudio.FAudioBuffer Handle; - public ushort Channels { get; } - public uint SamplesPerSecond { get; } + public class StaticSound : AudioResource + { + internal FAudio.FAudioBuffer Handle; + public ushort Channels { get; } + public uint SamplesPerSecond { get; } - public uint LoopStart { get; set; } = 0; - public uint LoopLength { get; set; } = 0; + public uint LoopStart { get; set; } = 0; + public uint LoopLength { get; set; } = 0; - public static StaticSound LoadOgg(AudioDevice device, string filePath) - { - var filePointer = FAudio.stb_vorbis_open_filename(filePath, out var error, IntPtr.Zero); + public static StaticSound LoadOgg(AudioDevice device, string filePath) + { + var filePointer = FAudio.stb_vorbis_open_filename(filePath, out var error, IntPtr.Zero); - if (error != 0) - { - throw new AudioLoadException("Error loading file!"); - } - var info = FAudio.stb_vorbis_get_info(filePointer); - var bufferSize = FAudio.stb_vorbis_stream_length_in_samples(filePointer) * info.channels; - var buffer = new float[bufferSize]; + if (error != 0) + { + throw new AudioLoadException("Error loading file!"); + } + var info = FAudio.stb_vorbis_get_info(filePointer); + var bufferSize = FAudio.stb_vorbis_stream_length_in_samples(filePointer) * info.channels; + var buffer = new float[bufferSize]; - FAudio.stb_vorbis_get_samples_float_interleaved( - filePointer, - info.channels, - buffer, - (int) bufferSize - ); + FAudio.stb_vorbis_get_samples_float_interleaved( + filePointer, + info.channels, + buffer, + (int) bufferSize + ); - FAudio.stb_vorbis_close(filePointer); + FAudio.stb_vorbis_close(filePointer); - return new StaticSound( - device, - (ushort) info.channels, - info.sample_rate, - buffer, - 0, - (uint) buffer.Length - ); - } + return new StaticSound( + device, + (ushort) info.channels, + info.sample_rate, + buffer, + 0, + (uint) buffer.Length + ); + } - public StaticSound( - AudioDevice device, - ushort channels, - uint samplesPerSecond, - float[] buffer, - uint bufferOffset, /* in floats */ - uint bufferLength /* in floats */ - ) : base(device) - { - Channels = channels; - SamplesPerSecond = samplesPerSecond; + public StaticSound( + AudioDevice device, + ushort channels, + uint samplesPerSecond, + float[] buffer, + uint bufferOffset, /* in floats */ + uint bufferLength /* in floats */ + ) : base(device) + { + Channels = channels; + SamplesPerSecond = samplesPerSecond; - var bufferLengthInBytes = (int) (bufferLength * sizeof(float)); - Handle = new FAudio.FAudioBuffer(); - Handle.Flags = FAudio.FAUDIO_END_OF_STREAM; - Handle.pContext = IntPtr.Zero; - Handle.AudioBytes = (uint) bufferLengthInBytes; - Handle.pAudioData = Marshal.AllocHGlobal(bufferLengthInBytes); - Marshal.Copy(buffer, (int) bufferOffset, Handle.pAudioData, (int) bufferLength); - Handle.PlayBegin = 0; - Handle.PlayLength = 0; + var bufferLengthInBytes = (int) (bufferLength * sizeof(float)); + Handle = new FAudio.FAudioBuffer(); + Handle.Flags = FAudio.FAUDIO_END_OF_STREAM; + Handle.pContext = IntPtr.Zero; + Handle.AudioBytes = (uint) bufferLengthInBytes; + Handle.pAudioData = Marshal.AllocHGlobal(bufferLengthInBytes); + Marshal.Copy(buffer, (int) bufferOffset, Handle.pAudioData, (int) bufferLength); + Handle.PlayBegin = 0; + Handle.PlayLength = 0; - LoopStart = 0; - LoopLength = 0; - } + LoopStart = 0; + LoopLength = 0; + } - public StaticSoundInstance CreateInstance(bool loop = false) - { - return new StaticSoundInstance(Device, this, false, loop); - } + public StaticSoundInstance CreateInstance(bool loop = false) + { + return new StaticSoundInstance(Device, this, false, loop); + } - protected override void Destroy() - { - Marshal.FreeHGlobal(Handle.pAudioData); - } - } + protected override void Destroy() + { + Marshal.FreeHGlobal(Handle.pAudioData); + } + } } diff --git a/StaticSoundInstance.cs b/StaticSoundInstance.cs index 646adc5..7fac5e8 100644 --- a/StaticSoundInstance.cs +++ b/StaticSoundInstance.cs @@ -1,96 +1,96 @@ -using System; +using System; namespace MoonWorks.Audio { - public class StaticSoundInstance : SoundInstance - { - public StaticSound Parent { get; } + public class StaticSoundInstance : SoundInstance + { + public StaticSound Parent { get; } - private SoundState _state = SoundState.Stopped; - public override SoundState State - { - get - { - FAudio.FAudioSourceVoice_GetState( - Handle, - out var state, - FAudio.FAUDIO_VOICE_NOSAMPLESPLAYED - ); - if (state.BuffersQueued == 0) - { - Stop(true); - } + private SoundState _state = SoundState.Stopped; + public override SoundState State + { + get + { + FAudio.FAudioSourceVoice_GetState( + Handle, + out var state, + FAudio.FAUDIO_VOICE_NOSAMPLESPLAYED + ); + if (state.BuffersQueued == 0) + { + Stop(true); + } - return _state; - } + return _state; + } - protected set - { - _state = value; - } - } + protected set + { + _state = value; + } + } - internal StaticSoundInstance( - AudioDevice device, - StaticSound parent, - bool is3D, - bool loop - ) : base(device, parent.Channels, parent.SamplesPerSecond, is3D, loop) - { - Parent = parent; - } + internal StaticSoundInstance( + AudioDevice device, + StaticSound parent, + bool is3D, + bool loop + ) : base(device, parent.Channels, parent.SamplesPerSecond, is3D, loop) + { + Parent = parent; + } - public override void Play() - { - if (State == SoundState.Playing) - { - return; - } + public override void Play() + { + if (State == SoundState.Playing) + { + return; + } - if (Loop) - { - Parent.Handle.LoopCount = 255; - Parent.Handle.LoopBegin = Parent.LoopStart; - Parent.Handle.LoopLength = Parent.LoopLength; - } - else - { - Parent.Handle.LoopCount = 0; - Parent.Handle.LoopBegin = 0; - Parent.Handle.LoopLength = 0; - } + if (Loop) + { + Parent.Handle.LoopCount = 255; + Parent.Handle.LoopBegin = Parent.LoopStart; + Parent.Handle.LoopLength = Parent.LoopLength; + } + else + { + Parent.Handle.LoopCount = 0; + Parent.Handle.LoopBegin = 0; + Parent.Handle.LoopLength = 0; + } - FAudio.FAudioSourceVoice_SubmitSourceBuffer( - Handle, - ref Parent.Handle, - IntPtr.Zero - ); + FAudio.FAudioSourceVoice_SubmitSourceBuffer( + Handle, + ref Parent.Handle, + IntPtr.Zero + ); - FAudio.FAudioSourceVoice_Start(Handle, 0, 0); - State = SoundState.Playing; - } + FAudio.FAudioSourceVoice_Start(Handle, 0, 0); + State = SoundState.Playing; + } - public override void Pause() - { - if (State == SoundState.Paused) - { - FAudio.FAudioSourceVoice_Stop(Handle, 0, 0); - State = SoundState.Paused; - } - } + public override void Pause() + { + if (State == SoundState.Paused) + { + FAudio.FAudioSourceVoice_Stop(Handle, 0, 0); + State = SoundState.Paused; + } + } - public override void Stop(bool immediate = true) - { - if (immediate) - { - FAudio.FAudioSourceVoice_Stop(Handle, 0, 0); - FAudio.FAudioSourceVoice_FlushSourceBuffers(Handle); - State = SoundState.Stopped; - } - else - { - FAudio.FAudioSourceVoice_ExitLoop(Handle, 0); - } - } - } + public override void Stop(bool immediate = true) + { + if (immediate) + { + FAudio.FAudioSourceVoice_Stop(Handle, 0, 0); + FAudio.FAudioSourceVoice_FlushSourceBuffers(Handle); + State = SoundState.Stopped; + } + else + { + FAudio.FAudioSourceVoice_ExitLoop(Handle, 0); + } + } + } } diff --git a/StreamingSound.cs b/StreamingSound.cs index aa46e04..238a001 100644 --- a/StreamingSound.cs +++ b/StreamingSound.cs @@ -1,178 +1,178 @@ -using System; +using System; using System.Collections.Generic; using System.Runtime.InteropServices; namespace MoonWorks.Audio { - /// - /// For streaming long playback. - /// Can be extended to support custom decoders. - /// - public abstract class StreamingSound : SoundInstance - { - private readonly List queuedBuffers = new List(); - private readonly List queuedSizes = new List(); - private const int MINIMUM_BUFFER_CHECK = 3; + /// + /// For streaming long playback. + /// Can be extended to support custom decoders. + /// + public abstract class StreamingSound : SoundInstance + { + private readonly List queuedBuffers = new List(); + private readonly List queuedSizes = new List(); + private const int MINIMUM_BUFFER_CHECK = 3; - public int PendingBufferCount => queuedBuffers.Count; + public int PendingBufferCount => queuedBuffers.Count; - public StreamingSound( - AudioDevice device, - ushort channels, - uint samplesPerSecond, - bool is3D, - bool loop - ) : base(device, channels, samplesPerSecond, is3D, loop) { } + public StreamingSound( + AudioDevice device, + ushort channels, + uint samplesPerSecond, + bool is3D, + bool loop + ) : base(device, channels, samplesPerSecond, is3D, loop) { } - public override void Play() - { - if (State == SoundState.Playing) - { - return; - } + public override void Play() + { + if (State == SoundState.Playing) + { + return; + } - State = SoundState.Playing; - Update(); - FAudio.FAudioSourceVoice_Start(Handle, 0, 0); - } + State = SoundState.Playing; + Update(); + FAudio.FAudioSourceVoice_Start(Handle, 0, 0); + } - public override void Pause() - { - if (State == SoundState.Playing) - { - FAudio.FAudioSourceVoice_Stop(Handle, 0, 0); - State = SoundState.Paused; - } - } + public override void Pause() + { + if (State == SoundState.Playing) + { + FAudio.FAudioSourceVoice_Stop(Handle, 0, 0); + State = SoundState.Paused; + } + } - public override void Stop(bool immediate = true) - { - if (immediate) - { - FAudio.FAudioSourceVoice_Stop(Handle, 0, 0); - FAudio.FAudioSourceVoice_FlushSourceBuffers(Handle); - ClearBuffers(); - } + public override void Stop(bool immediate = true) + { + if (immediate) + { + FAudio.FAudioSourceVoice_Stop(Handle, 0, 0); + FAudio.FAudioSourceVoice_FlushSourceBuffers(Handle); + ClearBuffers(); + } - State = SoundState.Stopped; - } + State = SoundState.Stopped; + } - internal void Update() - { - if (State != SoundState.Playing) - { - return; - } + internal void Update() + { + if (State != SoundState.Playing) + { + return; + } - FAudio.FAudioSourceVoice_GetState( - Handle, - out var state, - FAudio.FAUDIO_VOICE_NOSAMPLESPLAYED - ); + FAudio.FAudioSourceVoice_GetState( + Handle, + out var state, + FAudio.FAUDIO_VOICE_NOSAMPLESPLAYED + ); - while (PendingBufferCount > state.BuffersQueued) - lock (queuedBuffers) - { - Marshal.FreeHGlobal(queuedBuffers[0]); - queuedBuffers.RemoveAt(0); - } + while (PendingBufferCount > state.BuffersQueued) + lock (queuedBuffers) + { + Marshal.FreeHGlobal(queuedBuffers[0]); + queuedBuffers.RemoveAt(0); + } - QueueBuffers(); - } + QueueBuffers(); + } - protected void QueueBuffers() - { - for ( - int i = MINIMUM_BUFFER_CHECK - PendingBufferCount; - i > 0; - i -= 1 - ) - { - AddBuffer(); - } - } + protected void QueueBuffers() + { + for ( + int i = MINIMUM_BUFFER_CHECK - PendingBufferCount; + i > 0; + i -= 1 + ) + { + AddBuffer(); + } + } - protected void ClearBuffers() - { - lock (queuedBuffers) - { - foreach (IntPtr buf in queuedBuffers) - { - Marshal.FreeHGlobal(buf); - } - queuedBuffers.Clear(); - queuedSizes.Clear(); - } - } + protected void ClearBuffers() + { + lock (queuedBuffers) + { + foreach (IntPtr buf in queuedBuffers) + { + Marshal.FreeHGlobal(buf); + } + queuedBuffers.Clear(); + queuedSizes.Clear(); + } + } - protected void AddBuffer() - { - AddBuffer( - out var buffer, - out var bufferOffset, - out var bufferLength, - out var reachedEnd - ); + protected void AddBuffer() + { + AddBuffer( + out var buffer, + out var bufferOffset, + out var bufferLength, + out var reachedEnd + ); - var lengthInBytes = bufferLength * sizeof(float); + var lengthInBytes = bufferLength * sizeof(float); - IntPtr next = Marshal.AllocHGlobal((int) lengthInBytes); - Marshal.Copy(buffer, (int) bufferOffset, next, (int) bufferLength); + IntPtr next = Marshal.AllocHGlobal((int) lengthInBytes); + Marshal.Copy(buffer, (int) bufferOffset, next, (int) bufferLength); - lock (queuedBuffers) - { - queuedBuffers.Add(next); - if (State != SoundState.Stopped) - { - FAudio.FAudioBuffer buf = new FAudio.FAudioBuffer - { - AudioBytes = lengthInBytes, - pAudioData = next, - PlayLength = ( - lengthInBytes / - Format.nChannels / - (uint)(Format.wBitsPerSample / 8) - ) - }; + lock (queuedBuffers) + { + queuedBuffers.Add(next); + if (State != SoundState.Stopped) + { + FAudio.FAudioBuffer buf = new FAudio.FAudioBuffer + { + AudioBytes = lengthInBytes, + pAudioData = next, + PlayLength = ( + lengthInBytes / + Format.nChannels / + (uint) (Format.wBitsPerSample / 8) + ) + }; - FAudio.FAudioSourceVoice_SubmitSourceBuffer( - Handle, - ref buf, - IntPtr.Zero - ); - } - else - { - queuedSizes.Add(lengthInBytes); - } - } + FAudio.FAudioSourceVoice_SubmitSourceBuffer( + Handle, + ref buf, + IntPtr.Zero + ); + } + else + { + queuedSizes.Add(lengthInBytes); + } + } - /* We have reached the end of the file, what do we do? */ - if (reachedEnd) - { - if (Loop) - { - SeekStart(); - } - else - { - Stop(false); - } - } - } + /* We have reached the end of the file, what do we do? */ + if (reachedEnd) + { + if (Loop) + { + SeekStart(); + } + else + { + Stop(false); + } + } + } - protected abstract void AddBuffer( - out float[] buffer, - out uint bufferOffset, /* in floats */ - out uint bufferLength, /* in floats */ - out bool reachedEnd - ); + protected abstract void AddBuffer( + out float[] buffer, + out uint bufferOffset, /* in floats */ + out uint bufferLength, /* in floats */ + out bool reachedEnd + ); - protected abstract void SeekStart(); + protected abstract void SeekStart(); - protected override void Destroy() - { - Stop(true); - } - } + protected override void Destroy() + { + Stop(true); + } + } } diff --git a/StreamingSoundOgg.cs b/StreamingSoundOgg.cs index caf5151..b962d40 100644 --- a/StreamingSoundOgg.cs +++ b/StreamingSoundOgg.cs @@ -1,89 +1,91 @@ -using System; +using System; using System.IO; namespace MoonWorks.Audio { - public class StreamingSoundOgg : StreamingSound - { - // FIXME: what should this value be? - public const int BUFFER_SIZE = 1024 * 128; + public class StreamingSoundOgg : StreamingSound + { + // FIXME: what should this value be? + public const int BUFFER_SIZE = 1024 * 128; - internal IntPtr FileHandle { get; } - internal FAudio.stb_vorbis_info Info { get; } + internal IntPtr FileHandle { get; } + internal FAudio.stb_vorbis_info Info { get; } - private readonly float[] buffer; + private readonly float[] buffer; - public override SoundState State { get; protected set; } + public override SoundState State { get; protected set; } - public static StreamingSoundOgg Load( - AudioDevice device, - string filePath, - bool is3D = false, - bool loop = false - ) { - var fileHandle = FAudio.stb_vorbis_open_filename(filePath, out var error, IntPtr.Zero); - if (error != 0) - { - Logger.LogError("Error opening OGG file!"); - throw new AudioLoadException("Error opening OGG file!"); - } + public static StreamingSoundOgg Load( + AudioDevice device, + string filePath, + bool is3D = false, + bool loop = false + ) + { + var fileHandle = FAudio.stb_vorbis_open_filename(filePath, out var error, IntPtr.Zero); + if (error != 0) + { + Logger.LogError("Error opening OGG file!"); + throw new AudioLoadException("Error opening OGG file!"); + } - var info = FAudio.stb_vorbis_get_info(fileHandle); + var info = FAudio.stb_vorbis_get_info(fileHandle); - return new StreamingSoundOgg( - device, - fileHandle, - info, - is3D, - loop - ); - } + return new StreamingSoundOgg( + device, + fileHandle, + info, + is3D, + loop + ); + } - internal StreamingSoundOgg( - AudioDevice device, - IntPtr fileHandle, - FAudio.stb_vorbis_info info, - bool is3D, - bool loop - ) : base(device, (ushort) info.channels, info.sample_rate, is3D, loop) - { - FileHandle = fileHandle; - Info = info; - buffer = new float[BUFFER_SIZE]; + internal StreamingSoundOgg( + AudioDevice device, + IntPtr fileHandle, + FAudio.stb_vorbis_info info, + bool is3D, + bool loop + ) : base(device, (ushort) info.channels, info.sample_rate, is3D, loop) + { + FileHandle = fileHandle; + Info = info; + buffer = new float[BUFFER_SIZE]; - device.AddDynamicSoundInstance(this); - } + device.AddDynamicSoundInstance(this); + } - protected override void AddBuffer( - out float[] buffer, - out uint bufferOffset, - out uint bufferLength, - out bool reachedEnd - ) { - buffer = this.buffer; + protected override void AddBuffer( + out float[] buffer, + out uint bufferOffset, + out uint bufferLength, + out bool reachedEnd + ) + { + buffer = this.buffer; - /* NOTE: this function returns samples per channel, not total samples */ - var samples = FAudio.stb_vorbis_get_samples_float_interleaved( - FileHandle, - Info.channels, - buffer, - buffer.Length - ); + /* NOTE: this function returns samples per channel, not total samples */ + var samples = FAudio.stb_vorbis_get_samples_float_interleaved( + FileHandle, + Info.channels, + buffer, + buffer.Length + ); - var sampleCount = samples * Info.channels; - bufferOffset = 0; - bufferLength = (uint) sampleCount; - reachedEnd = sampleCount < buffer.Length; - } + var sampleCount = samples * Info.channels; + bufferOffset = 0; + bufferLength = (uint) sampleCount; + reachedEnd = sampleCount < buffer.Length; + } - protected override void SeekStart() - { - FAudio.stb_vorbis_seek_start(FileHandle); - } + protected override void SeekStart() + { + FAudio.stb_vorbis_seek_start(FileHandle); + } - protected override void Destroy() - { - FAudio.stb_vorbis_close(FileHandle); - } - } + protected override void Destroy() + { + FAudio.stb_vorbis_close(FileHandle); + } + } }