diff --git a/AudioWaveOutClassLibrary/AudioWaveOutClassLibrary.csproj b/AudioWaveOutClassLibrary/AudioWaveOutClassLibrary.csproj
new file mode 100644
index 0000000..bd44ee5
--- /dev/null
+++ b/AudioWaveOutClassLibrary/AudioWaveOutClassLibrary.csproj
@@ -0,0 +1,10 @@
+
+
+
+ net8.0
+ enable
+ enable
+ true
+
+
+
diff --git a/AudioWaveOutClassLibrary/Buffer.cs b/AudioWaveOutClassLibrary/Buffer.cs
new file mode 100644
index 0000000..1f2c6b6
--- /dev/null
+++ b/AudioWaveOutClassLibrary/Buffer.cs
@@ -0,0 +1,198 @@
+//----------------------------------------------------------------------------
+// File Name: Buffer.cs
+//
+// Description:
+// This element reorders and removes duplicate RTP packets as they are
+// received from a network source. instantiates Number of packets in the buffer
+// and Add Data to a buffer
+//
+// The element needs the clock-rate of the RTP payload in order to estimate the delay.
+// Initialize and start Timer and provides Interval In Milliseconds
+//
+//
+// Author(s):
+// Egor Waken
+//
+// History:
+// 06 May 2024 Egor Waken Created.
+//
+// License:
+// BSD 3-Clause "New" or "Revised" License, see included LICENSE.md file.
+//----------------------------------------------------------------------------
+
+namespace AudioWaveOut
+{
+ // Buffer
+ public class Buffer
+ {
+ // Constructor
+ public Buffer(Object sender, uint maxRTPPackets, uint timerIntervalInMilliseconds)
+ {
+ // Maintain minimum number
+ if (maxRTPPackets < 2)
+ {
+ throw new Exception("Wrong Arguments. Minimum maxRTPPackets is 2");
+ }
+
+ m_Sender = sender;
+ m_MaxRTPPackets = maxRTPPackets;
+ m_TimerIntervalInMilliseconds = timerIntervalInMilliseconds;
+
+ Init();
+ }
+
+ // Variables
+ private Object m_Sender = null;
+ private uint m_MaxRTPPackets = 10;
+ private uint m_TimerIntervalInMilliseconds = 20;
+ private global::AudioWaveOut.EventTimer m_Timer = new global::AudioWaveOut.EventTimer();
+ private System.Collections.Generic.Queue m_Buffer = new Queue();
+ private RTPPacket m_LastRTPPacket = new RTPPacket();
+ private bool m_Underflow = true;
+ private bool m_Overflow = false;
+
+ // Delegates And Event
+ public delegate void DelegateDataAvailable(Object sender, RTPPacket packet);
+ public event DelegateDataAvailable DataAvailable;
+
+ // Number of packets in the buffer
+ public int Length
+ {
+ get
+ {
+ return m_Buffer.Count;
+ }
+ }
+
+ // Maximum number of RTP packets
+ public uint Maximum
+ {
+ get
+ {
+ return m_MaxRTPPackets;
+ }
+ }
+
+ // Interval In Milliseconds
+ public uint IntervalInMilliseconds
+ {
+ get
+ {
+ return m_TimerIntervalInMilliseconds;
+ }
+ }
+
+ // Init
+ private void Init()
+ {
+ InitTimer();
+ }
+
+ // InitTimer
+ private void InitTimer()
+ {
+ m_Timer.TimerTick += new EventTimer.DelegateTimerTick(OnTimerTick);
+ }
+
+ // Start
+ public void Start()
+ {
+ m_Timer.Start(m_TimerIntervalInMilliseconds, 0);
+ m_Underflow = true;
+ }
+
+ // Stop
+ public void Stop()
+ {
+ m_Timer.Stop();
+ m_Buffer.Clear();
+ }
+
+ // OnTimerTick
+ private void OnTimerTick()
+ {
+ try
+ {
+ if (DataAvailable != null)
+ {
+ // If data exists
+ if (m_Buffer.Count > 0)
+ {
+ // If overflow
+ if (m_Overflow)
+ {
+ // Wait until buffer is half empty
+ if (m_Buffer.Count <= m_MaxRTPPackets / 2)
+ {
+ m_Overflow = false;
+ }
+ }
+
+ // If underflow
+ if (m_Underflow)
+ {
+ // Wait until buffer is half full
+ if (m_Buffer.Count < m_MaxRTPPackets / 2)
+ {
+ return;
+ }
+ else
+ {
+ m_Underflow = false;
+ }
+ }
+
+ // Send data
+ m_LastRTPPacket = m_Buffer.Dequeue();
+ DataAvailable(m_Sender, m_LastRTPPacket);
+ }
+ else
+ {
+ // No overflow
+ m_Overflow = false;
+
+ // If buffer empty
+ if (m_LastRTPPacket != null && m_Underflow == false)
+ {
+ if (m_LastRTPPacket.Data != null)
+ {
+ // Underflow present
+ m_Underflow = true;
+ }
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine(String.Format("JitterBuffer.cs | OnTimerTick() | {0}", ex.Message));
+ }
+ }
+
+ // AddData
+ public void AddData(RTPPacket packet)
+ {
+ try
+ {
+ // If no overflow
+ if (m_Overflow == false)
+ {
+ // No maximum size
+ if (m_Buffer.Count <= m_MaxRTPPackets)
+ {
+ m_Buffer.Enqueue(packet);
+ }
+ else
+ {
+ // Buffer overflow
+ m_Overflow = true;
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine(String.Format("JitterBuffer.cs | AddData() | {0}", ex.Message));
+ }
+ }
+ }
+}
diff --git a/AudioWaveOutClassLibrary/Mixer.cs b/AudioWaveOutClassLibrary/Mixer.cs
new file mode 100644
index 0000000..55b4a3e
--- /dev/null
+++ b/AudioWaveOutClassLibrary/Mixer.cs
@@ -0,0 +1,269 @@
+//----------------------------------------------------------------------------
+// File Name: Mixer.cs
+//
+// Description:
+// Recorder is responsible for creating WaveIn Headers, their allocation,
+// initialization, and releasing WaveIn headers, creating a stream for recording,
+// opening WaveIn, defining the format, WaveIn device.
+//
+// Initializing and opening OpenWaveIn and its starting, stopping and closing
+// Responsible for creating and behaving a stream for WaveIn devices, creating a
+// playback buffer and copying and playing data from this buffer
+// and monitors changes in WaveIn Devices.
+//
+//
+// Author(s):
+// Egor Waken
+//
+// History:
+// 06 May 2024 Egor Waken Created.
+//
+// License:
+// BSD 3-Clause "New" or "Revised" License, see included LICENSE.md file.
+//----------------------------------------------------------------------------
+
+namespace AudioWaveOut
+{
+ // Mixer
+ public class Mixer
+ {
+ // MixBytes
+ public static List MixBytes(List> listList, int BitsPerSample)
+ {
+ // Result
+ List list16 = new List();
+ List list16Abs = new List();
+ int maximum = 0;
+
+ // Ready
+ return MixBytes_Intern(listList, BitsPerSample, out list16, out list16Abs, out maximum);
+ }
+
+ // MixBytes
+ public static List MixBytes(List> listList, int BitsPerSample, out List listLinear, out List listLinearAbs, out int maximum)
+ {
+ // Ready
+ return MixBytes_Intern(listList, BitsPerSample, out listLinear, out listLinearAbs, out maximum);
+ }
+
+ // MixBytes_Intern
+ private static List MixBytes_Intern(List> listList, int BitsPerSample, out List listLinear, out List listLinearAbs, out int maximum)
+ {
+
+ // Set default value
+ listLinear = new List();
+ listLinearAbs = new List();
+ maximum = 0;
+
+ // Determine maximum number of bytes for mixing
+ int maxBytesCount = 0;
+ foreach (List l in listList)
+ {
+ if (l.Count > maxBytesCount)
+ {
+ maxBytesCount = l.Count;
+ }
+ }
+
+ // If data exists
+ if (listList.Count > 0 && maxBytesCount > 0)
+ {
+
+ // Depending on BitsPerSample
+ switch (BitsPerSample)
+ {
+ // 8 Bits
+ case 8:
+ return MixBytes_8Bit(listList, maxBytesCount, out listLinear, out listLinearAbs, out maximum);
+
+ // 16 Bits
+ case 16:
+ return MixBytes_16Bit(listList, maxBytesCount, out listLinear, out listLinearAbs, out maximum);
+ }
+ }
+
+ // Mistake
+ return new List();
+ }
+
+ // MixBytes_16Bit
+ private static List MixBytes_16Bit(List> listList, int maxBytesCount, out List listLinear, out List listLinearAbs, out int maximum)
+ {
+ // Result
+ maximum = 0;
+
+ // Create array with linear and byte values
+ int linearCount = maxBytesCount / 2;
+ Int32[] bytesLinear = new Int32[linearCount];
+ Int32[] bytesLinearAbs = new Int32[linearCount];
+ Byte[] bytesRaw = new Byte[maxBytesCount];
+
+ // For each byte list
+ for (int v = 0; v < listList.Count; v++)
+ {
+ // Convert to array
+ Byte[] bytes = listList[v].ToArray();
+
+ // For every 16bit value
+ for (int i = 0, a = 0; i < linearCount; i++, a += 2)
+ {
+ // If there are values to mix
+ if (i < bytes.Length && a < bytes.Length - 1)
+ {
+ // Determine value
+ Int16 value16 = BitConverter.ToInt16(bytes, a);
+ int value32 = bytesLinear[i] + value16;
+
+ // Add value (catch overflows)
+ if (value32 < Int16.MinValue)
+ {
+ value32 = Int16.MinValue;
+ }
+ else if (value32 > Int16.MaxValue)
+ {
+ value32 = Int16.MaxValue;
+ }
+
+ // Set values
+ bytesLinear[i] = value32;
+ bytesLinearAbs[i] = Math.Abs(value32);
+ Int16 mixed16 = Convert.ToInt16(value32);
+ Array.Copy(BitConverter.GetBytes(mixed16), 0, bytesRaw, a, 2);
+
+ // Calculate maximum
+ if (value32 > maximum)
+ {
+ maximum = value32;
+ }
+ }
+ else
+ {
+ // Leave silent
+ }
+ }
+ }
+
+ // Out result
+ listLinear = new List(bytesLinear);
+ listLinearAbs = new List(bytesLinearAbs);
+
+ // Ready
+ return new List(bytesRaw);
+ }
+
+ // MixBytes_8Bit
+ private static List MixBytes_8Bit(List> listList, int maxBytesCount, out List listLinear, out List listLinearAbs, out int maximum)
+ {
+ // Result
+ maximum = 0;
+
+ // Create array with linear and byte values
+ int linearCount = maxBytesCount;
+ Int32[] bytesLinear = new Int32[linearCount];
+ Byte[] bytesRaw = new Byte[maxBytesCount];
+
+ // For each byte list
+ for (int v = 0; v < listList.Count; v++)
+ {
+ // Convert to array
+ Byte[] bytes = listList[v].ToArray();
+
+ // For every 8 bit value
+ for (int i = 0; i < linearCount; i++)
+ {
+ // If there are values to mix
+ if (i < bytes.Length)
+ {
+ // Determine value
+ Byte value8 = bytes[i];
+ int value32 = bytesLinear[i] + value8;
+
+ // Add value (catch overflows)
+ if (value32 < Byte.MinValue)
+ {
+ value32 = Byte.MinValue;
+ }
+ else if (value32 > Byte.MaxValue)
+ {
+ value32 = Byte.MaxValue;
+ }
+
+ // Set values
+ bytesLinear[i] = value32;
+ bytesRaw[i] = BitConverter.GetBytes(value32)[0];
+
+ // Calculate maximum
+ if (value32 > maximum)
+ {
+ maximum = value32;
+ }
+ }
+ else
+ {
+ // Leave silent
+ }
+ }
+ }
+
+ // Out results
+ listLinear = new List(bytesLinear);
+ listLinearAbs = new List(bytesLinear);
+
+ // Ready
+ return new List(bytesRaw);
+ }
+
+ // SubsctractBytes_16Bit
+ public static List SubsctractBytes_16Bit(List listSource, List listToSubstract)
+ {
+ // Result
+ List list = new List(listSource.Count);
+
+ // Create array with linear values (16bit)
+ int value16Count = listSource.Count / 2;
+ List list16Mixed = new List(new Int16[value16Count]);
+
+ // Convert to array
+ Byte[] bytesSource = listSource.ToArray();
+ Byte[] bytesSubstract = listToSubstract.ToArray();
+
+ // For every 16bit value
+ for (int i = 0, a = 0; i < value16Count; i++, a += 2)
+ {
+ // If values exist
+ if (i < bytesSource.Length && a < bytesSource.Length - 1)
+ {
+ // Determine values
+ Int16 value16Source = BitConverter.ToInt16(bytesSource, a);
+ Int16 value16Substract = BitConverter.ToInt16(bytesSubstract, a);
+ int value32 = value16Source - value16Substract;
+
+ // Add value (catch overflows)
+ if (value32 < Int16.MinValue)
+ {
+ value32 = Int16.MinValue;
+ }
+ else if (value32 > Int16.MaxValue)
+ {
+ value32 = Int16.MaxValue;
+ }
+
+ // Set value
+ list16Mixed[i] = Convert.ToInt16(value32);
+ }
+ }
+
+ // For every value
+ foreach (Int16 v16 in list16Mixed)
+ {
+ // Convert integers to bytes
+ Byte[] bytes = BitConverter.GetBytes(v16);
+ list.AddRange(bytes);
+
+ }
+
+ // Ready
+ return list;
+ }
+ }
+}
diff --git a/AudioWaveOutClassLibrary/Player.cs b/AudioWaveOutClassLibrary/Player.cs
new file mode 100644
index 0000000..e7cabb1
--- /dev/null
+++ b/AudioWaveOutClassLibrary/Player.cs
@@ -0,0 +1,708 @@
+//----------------------------------------------------------------------------
+// File Name: Player.cs
+//
+// Description:
+// Responsible for playing data bytes and dividing them into equal parts,
+// responsible for playing Wave files, as well as closing them
+//
+//
+//
+// Author(s):
+// Egor Waken
+//
+// History:
+// 06 May 2024 Egor Waken Created.
+//
+// License:
+// BSD 3-Clause "New" or "Revised" License, see included LICENSE.md file.
+//----------------------------------------------------------------------------
+
+using System.Runtime.InteropServices;
+
+namespace AudioWaveOut
+{
+ // Player
+ unsafe public class Player
+ {
+ // Constructor
+ public Player()
+ {
+ delegateWaveOutProc = new Win32.DelegateWaveOutProc(waveOutProc);
+ }
+
+ // Variables
+ private LockerClass Locker = new LockerClass();
+ private LockerClass LockerCopy = new LockerClass();
+ private IntPtr hWaveOut = IntPtr.Zero;
+ private String WaveOutDeviceName = "";
+ private bool IsWaveOutOpened = false;
+ private bool IsThreadPlayWaveOutRunning = false;
+ private bool IsClosed = false;
+ private bool IsPaused = false;
+ private bool IsStarted = false;
+ private bool IsBlocking = false;
+ private int SamplesPerSecond = 8000;
+ private int BitsPerSample = 16;
+ private int Channels = 1;
+ private int BufferCount = 8;
+ private int BufferLength = 1024;
+ private Win32.WAVEHDR*[] WaveOutHeaders;
+ private Win32.DelegateWaveOutProc delegateWaveOutProc;
+ private System.Threading.Thread ThreadPlayWaveOut;
+ private System.Threading.AutoResetEvent AutoResetEventDataPlayed = new System.Threading.AutoResetEvent(false);
+
+ // Delegates And Events
+ public delegate void DelegateStopped();
+ public event DelegateStopped PlayerClosed;
+ public event DelegateStopped PlayerStopped;
+
+ // Paused
+ public bool Paused
+ {
+ get
+ {
+ return IsPaused;
+ }
+ }
+
+ // Opened
+ public bool Opened
+ {
+ get
+ {
+ return IsWaveOutOpened & IsClosed == false;
+ }
+ }
+
+ // Playing
+ public bool Playing
+ {
+ get
+ {
+ if (Opened && IsStarted)
+ {
+ foreach (Win32.WAVEHDR* pHeader in WaveOutHeaders)
+ {
+ if (IsHeaderInqueue(*pHeader))
+ {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+ }
+
+ // CreateWaveOutHeaders
+ private bool CreateWaveOutHeaders()
+ {
+ // Create buffer
+ WaveOutHeaders = new Win32.WAVEHDR*[BufferCount];
+ int createdHeaders = 0;
+
+ // For every buffer
+ for (int i = 0; i < BufferCount; i++)
+ {
+ // Allocate headers
+ WaveOutHeaders[i] = (Win32.WAVEHDR*)Marshal.AllocHGlobal(sizeof(Win32.WAVEHDR));
+
+ // Set header
+ WaveOutHeaders[i]->dwLoops = 0;
+ WaveOutHeaders[i]->dwUser = IntPtr.Zero;
+ WaveOutHeaders[i]->lpNext = IntPtr.Zero;
+ WaveOutHeaders[i]->reserved = IntPtr.Zero;
+ WaveOutHeaders[i]->lpData = Marshal.AllocHGlobal(BufferLength);
+ WaveOutHeaders[i]->dwBufferLength = (uint)BufferLength;
+ WaveOutHeaders[i]->dwBytesRecorded = 0;
+ WaveOutHeaders[i]->dwFlags = 0;
+
+ // If the buffer could be prepared
+ Win32.MMRESULT hr = Win32.waveOutPrepareHeader(hWaveOut, WaveOutHeaders[i], sizeof(Win32.WAVEHDR));
+ if (hr == Win32.MMRESULT.MMSYSERR_NOERROR)
+ {
+ createdHeaders++;
+ }
+ }
+
+ // Ready
+ return (createdHeaders == BufferCount);
+ }
+
+ // FreeWaveInHeaders
+ private void FreeWaveOutHeaders()
+ {
+ try
+ {
+ if (WaveOutHeaders != null)
+ {
+ for (int i = 0; i < WaveOutHeaders.Length; i++)
+ {
+ // Release handles
+ Win32.MMRESULT hr = Win32.waveOutUnprepareHeader(hWaveOut, WaveOutHeaders[i], sizeof(Win32.WAVEHDR));
+
+ // Wait until finished playing
+ int count = 0;
+ while (count <= 100 && (WaveOutHeaders[i]->dwFlags & Win32.WaveHdrFlags.WHDR_INQUEUE) == Win32.WaveHdrFlags.WHDR_INQUEUE)
+ {
+ System.Threading.Thread.Sleep(20);
+ count++;
+ }
+
+ // When data is played
+ if ((WaveOutHeaders[i]->dwFlags & Win32.WaveHdrFlags.WHDR_INQUEUE) != Win32.WaveHdrFlags.WHDR_INQUEUE)
+ {
+ // Share data
+ if (WaveOutHeaders[i]->lpData != IntPtr.Zero)
+ {
+ Marshal.FreeHGlobal(WaveOutHeaders[i]->lpData);
+ WaveOutHeaders[i]->lpData = IntPtr.Zero;
+ }
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.Write(ex.Message);
+ }
+ }
+
+ // StartThreadRecording
+ private void StartThreadPlayWaveOut()
+ {
+ if (IsThreadPlayWaveOutRunning == false)
+ {
+ ThreadPlayWaveOut = new System.Threading.Thread(new System.Threading.ThreadStart(OnThreadPlayWaveOut));
+ IsThreadPlayWaveOutRunning = true;
+ ThreadPlayWaveOut.Name = "PlayWaveOut";
+ ThreadPlayWaveOut.Priority = System.Threading.ThreadPriority.Highest;
+ ThreadPlayWaveOut.Start();
+ }
+ }
+
+ // PlayBytes. Divide bytes into equal pieces and play them individually
+ private bool PlayBytes(Byte[] bytes)
+ {
+ if (bytes.Length > 0)
+ {
+ // Size of the byte pieces
+ int byteSize = bytes.Length / BufferCount;
+ int currentPos = 0;
+
+ // For every possible buffer
+ for (int count = 0; count < BufferCount; count++)
+ {
+ // Determine the next free buffer
+ int index = GetNextFreeWaveOutHeaderIndex();
+ if (index != -1)
+ {
+ try
+ {
+ // Copy part
+ Byte[] partByte = new Byte[byteSize];
+ Array.Copy(bytes, currentPos, partByte, 0, byteSize);
+ currentPos += byteSize;
+
+ // If different file size
+ if (WaveOutHeaders[index]->dwBufferLength != partByte.Length)
+ {
+ // Create new data storage
+ Marshal.FreeHGlobal(WaveOutHeaders[index]->lpData);
+ WaveOutHeaders[index]->lpData = Marshal.AllocHGlobal(partByte.Length);
+ WaveOutHeaders[index]->dwBufferLength = (uint)partByte.Length;
+ }
+
+ // Copy data
+ WaveOutHeaders[index]->dwUser = (IntPtr)index;
+ Marshal.Copy(partByte, 0, WaveOutHeaders[index]->lpData, partByte.Length);
+ }
+ catch (Exception ex)
+ {
+ // Error while copying
+ System.Diagnostics.Debug.WriteLine(String.Format("CopyBytesToFreeWaveOutHeaders() | {0}", ex.Message));
+ AutoResetEventDataPlayed.Set();
+ return false;
+ }
+
+ // If still open
+ if (hWaveOut != null)
+ {
+ // Play
+ Win32.MMRESULT hr = Win32.waveOutWrite(hWaveOut, WaveOutHeaders[index], sizeof(Win32.WAVEHDR));
+ if (hr != Win32.MMRESULT.MMSYSERR_NOERROR)
+ {
+ // Error while playing
+ AutoResetEventDataPlayed.Set();
+ return false;
+ }
+ }
+ else
+ {
+ // WaveOut invalid
+ return false;
+ }
+ }
+ else
+ {
+ // Not enough free buffers available
+ return false;
+ }
+ }
+ return true;
+ }
+ // No data available
+ return false;
+ }
+
+ // OpenWaveOut
+ private bool OpenWaveOut()
+ {
+ if (hWaveOut == IntPtr.Zero)
+ {
+ // If not already open
+ if (IsWaveOutOpened == false)
+ {
+ // Determine format
+ Win32.WAVEFORMATEX waveFormatEx = new Win32.WAVEFORMATEX();
+ waveFormatEx.wFormatTag = (ushort)Win32.WaveFormatFlags.WAVE_FORMAT_PCM;
+ waveFormatEx.nChannels = (ushort)Channels;
+ waveFormatEx.nSamplesPerSec = (ushort)SamplesPerSecond;
+ waveFormatEx.wBitsPerSample = (ushort)BitsPerSample;
+ waveFormatEx.nBlockAlign = (ushort)((waveFormatEx.wBitsPerSample * waveFormatEx.nChannels) >> 3);
+ waveFormatEx.nAvgBytesPerSec = (uint)(waveFormatEx.nBlockAlign * waveFormatEx.nSamplesPerSec);
+
+ // Determine WaveOut device
+ int deviceId = WinSound.GetWaveOutDeviceIdByName(WaveOutDeviceName);
+
+ // Open WaveIn device
+ Win32.MMRESULT hr = Win32.waveOutOpen(ref hWaveOut, deviceId, ref waveFormatEx, delegateWaveOutProc, 0, (int)Win32.WaveProcFlags.CALLBACK_FUNCTION);
+
+ // If not successful
+ if (hr != Win32.MMRESULT.MMSYSERR_NOERROR)
+ {
+ IsWaveOutOpened = false;
+ return false;
+ }
+
+ // Lock handle
+ GCHandle.Alloc(hWaveOut, GCHandleType.Pinned);
+ }
+ }
+
+ IsWaveOutOpened = true;
+ return true;
+ }
+
+ // Open
+ public bool Open(string waveOutDeviceName, int samplesPerSecond, int bitsPerSample, int channels, int bufferCount)
+ {
+ try
+ {
+ lock (Locker)
+ {
+ // If not already open
+ if (Opened == false)
+ {
+
+ // Take over data
+ WaveOutDeviceName = waveOutDeviceName;
+ SamplesPerSecond = samplesPerSecond;
+ BitsPerSample = bitsPerSample;
+ Channels = channels;
+ BufferCount = Math.Max(bufferCount, 1);
+
+ // If WaveOut could be opened
+ if (OpenWaveOut())
+ {
+ // If all buffers could be created
+ if (CreateWaveOutHeaders())
+ {
+ // Start thread
+ StartThreadPlayWaveOut();
+ IsClosed = false;
+ return true;
+ }
+ }
+ }
+
+ // Already opened
+ return false;
+ }
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine(String.Format("Start | {0}", ex.Message));
+ return false;
+ }
+ }
+
+ // PlayData
+ public bool PlayData(Byte[] datas, bool isBlocking)
+ {
+ try
+ {
+ if (Opened)
+ {
+ int index = GetNextFreeWaveOutHeaderIndex();
+ if (index != -1)
+ {
+ // Take values
+ this.IsBlocking = isBlocking;
+
+ // If different file size
+ if (WaveOutHeaders[index]->dwBufferLength != datas.Length)
+ {
+ // Create new data storage
+ Marshal.FreeHGlobal(WaveOutHeaders[index]->lpData);
+ WaveOutHeaders[index]->lpData = Marshal.AllocHGlobal(datas.Length);
+ WaveOutHeaders[index]->dwBufferLength = (uint)datas.Length;
+ }
+
+ // Copy data
+ WaveOutHeaders[index]->dwBufferLength = (uint)datas.Length;
+ WaveOutHeaders[index]->dwUser = (IntPtr)index;
+ Marshal.Copy(datas, 0, WaveOutHeaders[index]->lpData, datas.Length);
+
+ // Play
+ this.IsStarted = true;
+ Win32.MMRESULT hr = Win32.waveOutWrite(hWaveOut, WaveOutHeaders[index], sizeof(Win32.WAVEHDR));
+ if (hr == Win32.MMRESULT.MMSYSERR_NOERROR)
+ {
+ // If blocking
+ if (isBlocking)
+ {
+ AutoResetEventDataPlayed.WaitOne();
+ AutoResetEventDataPlayed.Set();
+ }
+ return true;
+ }
+ else
+ {
+ // Error while playing
+ AutoResetEventDataPlayed.Set();
+ return false;
+ }
+ }
+ else
+ {
+ // No free output buffer available
+ System.Diagnostics.Debug.WriteLine(String.Format("No free WaveOut Buffer found | {0}", DateTime.Now.ToLongTimeString()));
+ return false;
+ }
+ }
+ else
+ {
+ // Not open
+ return false;
+ }
+
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine(String.Format("PlayData | {0}", ex.Message));
+ return false;
+ }
+ }
+
+ // PlayFile (Wave Files)
+ public bool PlayFile(string fileName, string waveOutDeviceName)
+ {
+ lock (Locker)
+ {
+ try
+ {
+ // WaveFile Read
+ WaveFileHeader header = WaveFile.Read(fileName);
+
+ // If data exists
+ if (header.Payload.Length > 0)
+ {
+ // When open
+ if (Open(waveOutDeviceName, (int)header.SamplesPerSecond, (int)header.BitsPerSample, (int)header.Channels, 8))
+ {
+ int index = GetNextFreeWaveOutHeaderIndex();
+ if (index != -1)
+ {
+ // Bytes Partially played in output buffer
+ this.IsStarted = true;
+ return PlayBytes(header.Payload);
+ }
+ else
+ {
+ // No free output buffer available
+ AutoResetEventDataPlayed.Set();
+ return false;
+ }
+ }
+ else
+ {
+ // Not open
+ AutoResetEventDataPlayed.Set();
+ return false;
+ }
+ }
+ else
+ {
+ // Bad file
+ AutoResetEventDataPlayed.Set();
+ return false;
+ }
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine(String.Format("PlayFile | {0}", ex.Message));
+ AutoResetEventDataPlayed.Set();
+ return false;
+ }
+ }
+ }
+
+ // Close
+ public bool Close()
+ {
+ try
+ {
+ lock (Locker)
+ {
+ // When open
+ if (Opened)
+ {
+ // Set as manual ended
+ IsClosed = true;
+
+ // Wait until all data has finished playing
+ int count = 0;
+ while (Win32.waveOutReset(hWaveOut) != Win32.MMRESULT.MMSYSERR_NOERROR && count <= 100)
+ {
+ System.Threading.Thread.Sleep(50);
+ count++;
+ }
+
+ // Share headers and data
+ FreeWaveOutHeaders();
+
+ // Wait until all data has finished playing
+ count = 0;
+ while (Win32.waveOutClose(hWaveOut) != Win32.MMRESULT.MMSYSERR_NOERROR && count <= 100)
+ {
+ System.Threading.Thread.Sleep(50);
+ count++;
+ }
+
+ // Set variables
+ IsWaveOutOpened = false;
+ AutoResetEventDataPlayed.Set();
+ return true;
+ }
+ return false;
+ }
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine(String.Format("Close | {0}", ex.Message));
+ return false;
+ }
+ }
+
+ // StartPause
+ public bool StartPause()
+ {
+ try
+ {
+ lock (Locker)
+ {
+ // When open
+ if (Opened)
+ {
+ // If not already paused
+ if (IsPaused == false)
+ {
+ // Pause
+ Win32.MMRESULT hr = Win32.waveOutPause(hWaveOut);
+ if (hr == Win32.MMRESULT.MMSYSERR_NOERROR)
+ {
+ // Save
+ IsPaused = true;
+ AutoResetEventDataPlayed.Set();
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine(String.Format("StartPause | {0}", ex.Message));
+ return false;
+ }
+ }
+
+ // EndPause
+ public bool EndPause()
+ {
+ try
+ {
+ lock (Locker)
+ {
+ // When open
+ if (Opened)
+ {
+ // When paused
+ if (IsPaused)
+ {
+ // Pause
+ Win32.MMRESULT hr = Win32.waveOutRestart(hWaveOut);
+ if (hr == Win32.MMRESULT.MMSYSERR_NOERROR)
+ {
+ // Save
+ IsPaused = false;
+ AutoResetEventDataPlayed.Set();
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine(String.Format("EndPause | {0}", ex.Message));
+ return false;
+ }
+ }
+
+ // GetNextFreeWaveOutHeaderIndex
+ private int GetNextFreeWaveOutHeaderIndex()
+ {
+ for (int i = 0; i < WaveOutHeaders.Length; i++)
+ {
+ if (IsHeaderPrepared(*WaveOutHeaders[i]) && !IsHeaderInqueue(*WaveOutHeaders[i]))
+ {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ // IsHeaderPrepared
+ private bool IsHeaderPrepared(Win32.WAVEHDR header)
+ {
+ return (header.dwFlags & Win32.WaveHdrFlags.WHDR_PREPARED) > 0;
+ }
+
+ /// IsHeaderInqueue
+ private bool IsHeaderInqueue(Win32.WAVEHDR header)
+ {
+ return (header.dwFlags & Win32.WaveHdrFlags.WHDR_INQUEUE) > 0;
+ }
+
+ // waveOutProc
+ private void waveOutProc(IntPtr hWaveOut, Win32.WOM_Messages msg, IntPtr dwInstance, Win32.WAVEHDR* pWaveHeader, IntPtr lParam)
+ {
+ try
+ {
+ switch (msg)
+ {
+ // Open
+ case Win32.WOM_Messages.OPEN:
+ break;
+
+ // Done
+ case Win32.WOM_Messages.DONE:
+
+ // No that data arrives
+ IsStarted = true;
+ AutoResetEventDataPlayed.Set();
+ break;
+
+ // Close
+ case Win32.WOM_Messages.CLOSE:
+ IsStarted = false;
+ IsWaveOutOpened = false;
+ IsPaused = false;
+ IsClosed = true;
+ AutoResetEventDataPlayed.Set();
+ this.hWaveOut = IntPtr.Zero;
+ break;
+ }
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine(String.Format("Player.cs | waveOutProc() | {0}", ex.Message));
+ AutoResetEventDataPlayed.Set();
+ }
+ }
+
+ // OnThreadRecording
+ private void OnThreadPlayWaveOut()
+ {
+ while (Opened && !IsClosed)
+ {
+ // Wait until recording is finished
+ AutoResetEventDataPlayed.WaitOne();
+
+ lock (Locker)
+ {
+ if (Opened && !IsClosed)
+ {
+ // Set variables
+ IsThreadPlayWaveOutRunning = true;
+
+ // When no more data is played
+ if (!Playing)
+ {
+ // When data has been played
+ if (IsStarted)
+ {
+ IsStarted = false;
+
+ // Submit event
+ if (PlayerStopped != null)
+ {
+ try
+ {
+ PlayerStopped();
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine(String.Format("Player Stopped | {0}", ex.Message));
+ }
+ finally
+ {
+ AutoResetEventDataPlayed.Set();
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // If blocking
+ if (IsBlocking)
+ {
+ AutoResetEventDataPlayed.Set();
+ }
+ }
+
+ lock (Locker)
+ {
+ // Set variables
+ IsThreadPlayWaveOutRunning = false;
+ }
+
+ // Send event
+ if (PlayerClosed != null)
+ {
+ try
+ {
+ PlayerClosed();
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine(String.Format("Player Closed | {0}", ex.Message));
+ }
+ }
+ }
+ }
+}
diff --git a/AudioWaveOutClassLibrary/Protocols.cs b/AudioWaveOutClassLibrary/Protocols.cs
new file mode 100644
index 0000000..2855727
--- /dev/null
+++ b/AudioWaveOutClassLibrary/Protocols.cs
@@ -0,0 +1,140 @@
+//----------------------------------------------------------------------------
+// File Name: Protocols.cs
+//
+// Description:
+// Determine the Transport protocols types on which the RTP protocol will be based.
+//
+// Responsible for serializing data into bytes and processing information retrieval.
+//
+//
+// Author(s):
+// Egor Waken
+//
+// History:
+// 06 May 2024 Egor Waken Created.
+//
+// License:
+// BSD 3-Clause "New" or "Revised" License, see included LICENSE.md file.
+//----------------------------------------------------------------------------
+
+using System.Text;
+
+namespace AudioWaveOut
+{
+ // Protocols Types
+ public enum ProtocolsTypes
+ {
+ TCP
+ }
+
+ // Protocol
+ public class Protocol
+ {
+ // Constructor
+ public Protocol(ProtocolsTypes type, Encoding encoding)
+ {
+ this.m_ProtocolType = type;
+ this.m_Encoding = encoding;
+ }
+
+ // Variables
+ private List m_DataBuffer = new List();
+ private const int m_MaxBufferLength = 10000;
+ private ProtocolsTypes m_ProtocolType = ProtocolsTypes.TCP;
+ private Encoding m_Encoding = Encoding.Default;
+ public Object m_LockerReceive = new object();
+
+ //Delegates And Events
+ public delegate void DelegateDataComplete(Object sender, Byte[] data);
+ public delegate void DelegateExceptionAppeared(Object sender, Exception ex);
+ public event DelegateDataComplete DataComplete;
+ public event DelegateExceptionAppeared ExceptionAppeared;
+
+
+ // ToBytes
+ public Byte[] ToBytes(Byte[] data)
+ {
+ try
+ {
+ // Bytes length
+ Byte[] bytesLength = BitConverter.GetBytes(data.Length);
+
+ // Putting it all together
+ Byte[] allBytes = new Byte[bytesLength.Length + data.Length];
+ Array.Copy(bytesLength, allBytes, bytesLength.Length);
+ Array.Copy(data, 0, allBytes, bytesLength.Length, data.Length);
+
+ // Ready
+ return allBytes;
+ }
+ catch (Exception ex)
+ {
+ ExceptionAppeared(null, ex);
+ }
+
+ // Mistake
+ return data;
+ }
+
+ // Receive_TCP_STX_ETX
+ public void Receive_TCP(Object sender, Byte[] data)
+ {
+ lock (m_LockerReceive)
+ {
+ try
+ {
+ // Append data to buffer
+ m_DataBuffer.AddRange(data);
+
+ // Prevent buffer overflow
+ if (m_DataBuffer.Count > m_MaxBufferLength)
+ {
+ m_DataBuffer.Clear();
+ }
+
+ // Read bytes
+ Byte[] bytes = m_DataBuffer.Take(4).ToArray();
+
+ // Determine length
+ int length = (int)BitConverter.ToInt32(bytes.ToArray(), 0);
+
+ // Ensure maximum length
+ if (length > m_MaxBufferLength)
+ {
+ m_DataBuffer.Clear();
+ }
+
+ // As long as data is available
+ while (m_DataBuffer.Count >= length + 4)
+ {
+ // Extract data
+ Byte[] message = m_DataBuffer.Skip(4).Take(length).ToArray();
+
+ // Complete data notification
+ if (DataComplete != null)
+ {
+ DataComplete(sender, message);
+ }
+
+ // Remove data from buffer
+ m_DataBuffer.RemoveRange(0, length + 4);
+
+ // If further data is available
+ if (m_DataBuffer.Count > 4)
+ {
+ // Calculate new length
+ bytes = m_DataBuffer.Take(4).ToArray();
+ length = (int)BitConverter.ToInt32(bytes.ToArray(), 0);
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ // Empty buffer
+ m_DataBuffer.Clear();
+ ExceptionAppeared(null, ex);
+ }
+ }
+ }
+ }
+}
diff --git a/AudioWaveOutClassLibrary/RTP.cs b/AudioWaveOutClassLibrary/RTP.cs
new file mode 100644
index 0000000..f608e15
--- /dev/null
+++ b/AudioWaveOutClassLibrary/RTP.cs
@@ -0,0 +1,177 @@
+//----------------------------------------------------------------------------
+// File Name: RTP.cs
+//
+// Description:
+// Implementing RTP Packet Class that w`ll be using at the OSI application level
+//
+// Responsible for parsing incoming data, checking their headers, deserializing the
+// received data (since they arrive serialized in bits) and contains a method for
+// serialization
+//
+//
+// Author(s):
+// Egor Waken
+//
+// History:
+// 06 May 2024 Egor Waken Created.
+//
+// License:
+// BSD 3-Clause "New" or "Revised" License, see included LICENSE.md file.
+//----------------------------------------------------------------------------
+
+
+namespace AudioWaveOut
+{
+ // RTPPacket
+ public class RTPPacket
+ {
+ // Constructor
+ public RTPPacket()
+ {
+
+ }
+
+ // Constructor
+ public RTPPacket(byte[] data)
+ {
+ Parse(data);
+ }
+
+ // Variables
+ public static int MinHeaderLength = 12;
+ public int HeaderLength = MinHeaderLength;
+ public int Version = 0;
+ public bool Padding = false;
+ public bool Extension = false;
+ public int CSRCCount = 0;
+ public bool Marker = false;
+ public int PayloadType = 0;
+ public UInt16 SequenceNumber = 0;
+ public uint Timestamp = 0;
+ public uint SourceId = 0;
+ public Byte[] Data;
+ public UInt16 ExtensionHeaderId = 0;
+ public UInt16 ExtensionLengthAsCount = 0;
+ public Int32 ExtensionLengthInBytes = 0;
+
+ // Parse
+ private void Parse(Byte[] data)
+ {
+ if (data.Length >= MinHeaderLength)
+ {
+ Version = ValueFromByte(data[0], 6, 2);
+ Padding = Convert.ToBoolean(ValueFromByte(data[0], 5, 1));
+ Extension = Convert.ToBoolean(ValueFromByte(data[0], 4, 1));
+ CSRCCount = ValueFromByte(data[0], 0, 4);
+ Marker = Convert.ToBoolean(ValueFromByte(data[1], 7, 1));
+ PayloadType = ValueFromByte(data[1], 0, 7);
+ HeaderLength = MinHeaderLength + (CSRCCount * 4);
+
+ //Sequence Number
+ Byte[] seqNum = new Byte[2];
+ seqNum[0] = data[3];
+ seqNum[1] = data[2];
+ SequenceNumber = System.BitConverter.ToUInt16(seqNum, 0);
+
+ //TimeStamp
+ Byte[] timeStmp = new Byte[4];
+ timeStmp[0] = data[7];
+ timeStmp[1] = data[6];
+ timeStmp[2] = data[5];
+ timeStmp[3] = data[4];
+ Timestamp = System.BitConverter.ToUInt32(timeStmp, 0);
+
+ //SourceId
+ Byte[] srcId = new Byte[4];
+ srcId[0] = data[8];
+ srcId[1] = data[9];
+ srcId[2] = data[10];
+ srcId[3] = data[11];
+ SourceId = System.BitConverter.ToUInt32(srcId, 0);
+
+ // If Extension Header
+ if (Extension)
+ {
+ //ExtensionHeaderId
+ Byte[] extHeaderId = new Byte[2];
+ extHeaderId[1] = data[HeaderLength + 0];
+ extHeaderId[0] = data[HeaderLength + 1];
+ ExtensionHeaderId = System.BitConverter.ToUInt16(extHeaderId, 0);
+
+ //ExtensionHeaderLength
+ Byte[] extHeaderLength16 = new Byte[2];
+ extHeaderLength16[1] = data[HeaderLength + 2];
+ extHeaderLength16[0] = data[HeaderLength + 3];
+ ExtensionLengthAsCount = System.BitConverter.ToUInt16(extHeaderLength16.ToArray(), 0);
+
+ // Adjust header length (length times 4 bytes or Int32)
+ ExtensionLengthInBytes = ExtensionLengthAsCount * 4;
+ HeaderLength += ExtensionLengthInBytes + 4;
+ }
+
+ // Copy data
+ Data = new Byte[data.Length - HeaderLength];
+ Array.Copy(data, HeaderLength, this.Data, 0, data.Length - HeaderLength);
+ }
+ }
+
+ // GetValueFromByte
+ private Int32 ValueFromByte(Byte value, int startPos, int length)
+ {
+ Byte mask = 0;
+ // Create mask
+ for (int i = 0; i < length; i++)
+ {
+ mask = (Byte)(mask | 0x1 << startPos + i);
+ }
+
+ // Result
+ Byte result = (Byte)((value & mask) >> startPos);
+
+ // Ready
+ return Convert.ToInt32(result);
+ }
+
+ // ToBytes
+ public Byte[] ToBytes()
+ {
+ // Result
+ Byte[] bytes = new Byte[this.HeaderLength + Data.Length];
+
+ // Byte 0
+ bytes[0] = (Byte)(Version << 6);
+ bytes[0] |= (Byte)(Convert.ToInt32(Padding) << 5);
+ bytes[0] |= (Byte)(Convert.ToInt32(Extension) << 4);
+ bytes[0] |= (Byte)(Convert.ToInt32(CSRCCount));
+
+ // Byte 1
+ bytes[1] = (Byte)(Convert.ToInt32(Marker) << 7);
+ bytes[1] |= (Byte)(Convert.ToInt32(PayloadType));
+
+ // Byte 2 + 3
+ Byte[] bytesSequenceNumber = BitConverter.GetBytes(SequenceNumber);
+ bytes[2] = bytesSequenceNumber[1];
+ bytes[3] = bytesSequenceNumber[0];
+
+ // Byte 4 until 7
+ Byte[] bytesTimeStamp = BitConverter.GetBytes(Timestamp);
+ bytes[4] = bytesTimeStamp[3];
+ bytes[5] = bytesTimeStamp[2];
+ bytes[6] = bytesTimeStamp[1];
+ bytes[7] = bytesTimeStamp[0];
+
+ // Byte 8 until 11
+ Byte[] bytesSourceId = BitConverter.GetBytes(SourceId);
+ bytes[8] = bytesSourceId[3];
+ bytes[9] = bytesSourceId[2];
+ bytes[10] = bytesSourceId[1];
+ bytes[11] = bytesSourceId[0];
+
+ // Data
+ Array.Copy(this.Data, 0, bytes, this.HeaderLength, this.Data.Length);
+
+ // Ready
+ return bytes;
+ }
+ }
+}
diff --git a/AudioWaveOutClassLibrary/Recorder.cs b/AudioWaveOutClassLibrary/Recorder.cs
new file mode 100644
index 0000000..e0cbe70
--- /dev/null
+++ b/AudioWaveOutClassLibrary/Recorder.cs
@@ -0,0 +1,431 @@
+//----------------------------------------------------------------------------
+// File Name: Recorder.cs
+//
+// Description:
+// Recorder is responsible for creating WaveIn Headers, their allocation,
+// initialization, and releasing WaveIn headers, creating a stream for recording,
+// opening WaveIn, defining the format, WaveIn device.
+//
+// Initializing and opening OpenWaveIn and its starting, stopping and closing
+// Responsible for creating and behaving a stream for WaveIn devices, creating a
+// playback buffer and copying and playing data from this buffer
+// and monitors changes in WaveIn Devices.
+//
+//
+// Author(s):
+// Egor Waken
+//
+// History:
+// 06 May 2024 Egor Waken Created.
+//
+// License:
+// BSD 3-Clause "New" or "Revised" License, see included LICENSE.md file.
+//----------------------------------------------------------------------------
+
+using System.Runtime.InteropServices;
+
+namespace AudioWaveOut
+{
+ unsafe public class Recorder
+ {
+ // Constructor
+ public Recorder()
+ {
+ delegateWaveInProc = new Win32.DelegateWaveInProc(waveInProc);
+ }
+
+ // Variables
+ private LockerClass Locker = new LockerClass();
+ private LockerClass LockerCopy = new LockerClass();
+ private IntPtr hWaveIn = IntPtr.Zero;
+ private String WaveInDeviceName = "";
+ private bool IsWaveInOpened = false;
+ private bool IsWaveInStarted = false;
+ private bool IsThreadRecordingRunning = false;
+ private bool IsDataIncomming = false;
+ private bool Stopped = false;
+ private int SamplesPerSecond = 8000;
+ private int BitsPerSample = 16;
+ private int Channels = 1;
+ private int BufferCount = 8;
+ private int BufferSize = 1024;
+ private Win32.WAVEHDR*[] WaveInHeaders;
+ private Win32.WAVEHDR* CurrentRecordedHeader;
+ private Win32.DelegateWaveInProc delegateWaveInProc;
+ private System.Threading.Thread ThreadRecording;
+ private System.Threading.AutoResetEvent AutoResetEventDataRecorded = new System.Threading.AutoResetEvent(false);
+
+ // Delegates And Events
+ public delegate void DelegateStopped();
+ public delegate void DelegateDataRecorded(Byte[] bytes);
+ public event DelegateStopped RecordingStopped;
+ public event DelegateDataRecorded DataRecorded;
+
+ // Started
+ public bool Started
+ {
+ get
+ {
+ return IsWaveInStarted && IsWaveInOpened && IsThreadRecordingRunning;
+ }
+ }
+
+ // CreateWaveInHeaders
+ private bool CreateWaveInHeaders()
+ {
+ // Create buffer
+ WaveInHeaders = new Win32.WAVEHDR*[BufferCount];
+ int createdHeaders = 0;
+
+ // For every buffer
+ for (int i = 0; i < BufferCount; i++)
+ {
+ // Allocate headers
+ WaveInHeaders[i] = (Win32.WAVEHDR*)Marshal.AllocHGlobal(sizeof(Win32.WAVEHDR));
+
+ // Set header
+ WaveInHeaders[i]->dwLoops = 0;
+ WaveInHeaders[i]->dwUser = IntPtr.Zero;
+ WaveInHeaders[i]->lpNext = IntPtr.Zero;
+ WaveInHeaders[i]->reserved = IntPtr.Zero;
+ WaveInHeaders[i]->lpData = Marshal.AllocHGlobal(BufferSize);
+ WaveInHeaders[i]->dwBufferLength = (uint)BufferSize;
+ WaveInHeaders[i]->dwBytesRecorded = 0;
+ WaveInHeaders[i]->dwFlags = 0;
+
+ // If the buffer could be prepared
+ Win32.MMRESULT hr = Win32.waveInPrepareHeader(hWaveIn, WaveInHeaders[i], sizeof(Win32.WAVEHDR));
+ if (hr == Win32.MMRESULT.MMSYSERR_NOERROR)
+ {
+ // Add first header to recording
+ if (i == 0)
+ {
+ hr = Win32.waveInAddBuffer(hWaveIn, WaveInHeaders[i], sizeof(Win32.WAVEHDR));
+ }
+ createdHeaders++;
+ }
+ }
+
+ // Ready
+ return (createdHeaders == BufferCount);
+ }
+
+ // FreeWaveInHeaders
+ private void FreeWaveInHeaders()
+ {
+ try
+ {
+ if (WaveInHeaders != null)
+ {
+ for (int i = 0; i < WaveInHeaders.Length; i++)
+ {
+ // Release handle
+ Win32.MMRESULT hr = Win32.waveInUnprepareHeader(hWaveIn, WaveInHeaders[i], sizeof(Win32.WAVEHDR));
+
+ // Wait until finished
+ int count = 0;
+ while (count <= 100 && (WaveInHeaders[i]->dwFlags & Win32.WaveHdrFlags.WHDR_INQUEUE) == Win32.WaveHdrFlags.WHDR_INQUEUE)
+ {
+ System.Threading.Thread.Sleep(20);
+ count++;
+ }
+
+ // When data is no longer in queue
+ if ((WaveInHeaders[i]->dwFlags & Win32.WaveHdrFlags.WHDR_INQUEUE) != Win32.WaveHdrFlags.WHDR_INQUEUE)
+ {
+ // Share data
+ if (WaveInHeaders[i]->lpData != IntPtr.Zero)
+ {
+ Marshal.FreeHGlobal(WaveInHeaders[i]->lpData);
+ WaveInHeaders[i]->lpData = IntPtr.Zero;
+ }
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.Write(ex.Message);
+ }
+ }
+
+ // StartThreadRecording
+ private void StartThreadRecording()
+ {
+ if (Started == false)
+ {
+ ThreadRecording = new System.Threading.Thread(new System.Threading.ThreadStart(OnThreadRecording));
+ IsThreadRecordingRunning = true;
+ ThreadRecording.Name = "Recording";
+ ThreadRecording.Priority = System.Threading.ThreadPriority.Highest;
+ ThreadRecording.Start();
+ }
+ }
+
+ // StartWaveIn
+ private bool OpenWaveIn()
+ {
+ if (hWaveIn == IntPtr.Zero)
+ {
+ // If not already open
+ if (IsWaveInOpened == false)
+ {
+ // Determine format
+ Win32.WAVEFORMATEX waveFormatEx = new Win32.WAVEFORMATEX();
+ waveFormatEx.wFormatTag = (ushort)Win32.WaveFormatFlags.WAVE_FORMAT_PCM;
+ waveFormatEx.nChannels = (ushort)Channels;
+ waveFormatEx.nSamplesPerSec = (ushort)SamplesPerSecond;
+ waveFormatEx.wBitsPerSample = (ushort)BitsPerSample;
+ waveFormatEx.nBlockAlign = (ushort)((waveFormatEx.wBitsPerSample * waveFormatEx.nChannels) >> 3);
+ waveFormatEx.nAvgBytesPerSec = (uint)(waveFormatEx.nBlockAlign * waveFormatEx.nSamplesPerSec);
+
+ // Determine WaveIn device
+ int deviceId = WinSound.GetWaveInDeviceIdByName(WaveInDeviceName);
+
+ // Open WaveIn device
+ Win32.MMRESULT hr = Win32.waveInOpen(ref hWaveIn, deviceId, ref waveFormatEx, delegateWaveInProc, 0, (int)Win32.WaveProcFlags.CALLBACK_FUNCTION);
+
+ // If not successful
+ if (hWaveIn == IntPtr.Zero)
+ {
+ IsWaveInOpened = false;
+ return false;
+ }
+
+ // Lock handle
+ GCHandle.Alloc(hWaveIn, GCHandleType.Pinned);
+ }
+ }
+
+ IsWaveInOpened = true;
+ return true;
+ }
+
+ // Start
+ public bool Start(string waveInDeviceName, int samplesPerSecond, int bitsPerSample, int channels, int bufferCount, int bufferSize)
+ {
+ try
+ {
+ lock (Locker)
+ {
+ // If not already started
+ if (Started == false)
+ {
+
+ // Take over data
+ WaveInDeviceName = waveInDeviceName;
+ SamplesPerSecond = samplesPerSecond;
+ BitsPerSample = bitsPerSample;
+ Channels = channels;
+ BufferCount = bufferCount;
+ BufferSize = bufferSize;
+
+ // If WaveIn could be opened
+ if (OpenWaveIn())
+ {
+ // If all buffers could be created
+ if (CreateWaveInHeaders())
+ {
+ // When recording could start
+ Win32.MMRESULT hr = Win32.waveInStart(hWaveIn);
+ if (hr == Win32.MMRESULT.MMSYSERR_NOERROR)
+ {
+ IsWaveInStarted = true;
+
+ // Start thread
+ StartThreadRecording();
+ Stopped = false;
+ return true;
+ }
+ else
+ {
+ // Error starting
+ return false;
+ }
+ }
+ }
+ }
+
+ // Repeater is already running
+ return false;
+ }
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine(String.Format("Start | {0}", ex.Message));
+ return false;
+ }
+ }
+
+ // Stop
+ public bool Stop()
+ {
+ try
+ {
+ lock (Locker)
+ {
+ // When started
+ if (Started)
+ {
+ // Set as manual ended
+ Stopped = true;
+ IsThreadRecordingRunning = false;
+
+ // Close WaveIn
+ CloseWaveIn();
+
+ // Set variables
+ AutoResetEventDataRecorded.Set();
+ return true;
+ }
+ return false;
+ }
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine(String.Format("Stop | {0}", ex.Message));
+ return false;
+ }
+ }
+
+ // CloseWaveIn
+ private void CloseWaveIn()
+ {
+ // Set buffer as processed
+ Win32.MMRESULT hr = Win32.waveInStop(hWaveIn);
+
+ int resetCount = 0;
+ while (IsAnyWaveInHeaderInState(Win32.WaveHdrFlags.WHDR_INQUEUE) & resetCount < 20)
+ {
+ hr = Win32.waveInReset(hWaveIn);
+ System.Threading.Thread.Sleep(50);
+ resetCount++;
+ }
+
+ // Release header handles (before waveInClose)
+ FreeWaveInHeaders();
+
+ // Close
+ hr = Win32.waveInClose(hWaveIn);
+ }
+
+ // IsAnyWaveInHeaderInState
+ private bool IsAnyWaveInHeaderInState(Win32.WaveHdrFlags state)
+ {
+ for (int i = 0; i < WaveInHeaders.Length; i++)
+ {
+ if ((WaveInHeaders[i]->dwFlags & state) == state)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ // waveInProc
+ private void waveInProc(IntPtr hWaveIn, Win32.WIM_Messages msg, IntPtr dwInstance, Win32.WAVEHDR* pWaveHdr, IntPtr lParam)
+ {
+ switch (msg)
+ {
+ // Open
+ case Win32.WIM_Messages.OPEN:
+ break;
+
+ // Data
+ case Win32.WIM_Messages.DATA:
+
+ // No incoming data
+ IsDataIncomming = true;
+
+ // Remember recorded buffer
+ CurrentRecordedHeader = pWaveHdr;
+
+ // Set event
+ AutoResetEventDataRecorded.Set();
+ break;
+
+ // Close
+ case Win32.WIM_Messages.CLOSE:
+ IsDataIncomming = false;
+ IsWaveInOpened = false;
+ AutoResetEventDataRecorded.Set();
+ this.hWaveIn = IntPtr.Zero;
+ break;
+ }
+ }
+
+ // OnThreadRecording
+ private void OnThreadRecording()
+ {
+ while (Started && !Stopped)
+ {
+ // Wait until recording is finished
+ AutoResetEventDataRecorded.WaitOne();
+
+ try
+ {
+ // If active
+ if (Started && !Stopped)
+ {
+ // If data exists
+ if (CurrentRecordedHeader->dwBytesRecorded > 0)
+ {
+ // When data is requested
+ if (DataRecorded != null && IsDataIncomming)
+ {
+ try
+ {
+ // Copy data
+ Byte[] bytes = new Byte[CurrentRecordedHeader->dwBytesRecorded];
+ Marshal.Copy(CurrentRecordedHeader->lpData, bytes, 0, (int)CurrentRecordedHeader->dwBytesRecorded);
+
+ // Submit event
+ DataRecorded(bytes);
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine(String.Format("Recorder.cs | OnThreadRecording() | {0}", ex.Message));
+ }
+ }
+
+ // Keep recording
+ for (int i = 0; i < WaveInHeaders.Length; i++)
+ {
+ if ((WaveInHeaders[i]->dwFlags & Win32.WaveHdrFlags.WHDR_INQUEUE) == 0)
+ {
+ Win32.MMRESULT hr = Win32.waveInAddBuffer(hWaveIn, WaveInHeaders[i], sizeof(Win32.WAVEHDR));
+ }
+ }
+
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine(ex.Message);
+ }
+ }
+
+
+ lock (Locker)
+ {
+ // Set variables
+ IsWaveInStarted = false;
+ IsThreadRecordingRunning = false;
+ }
+
+ // Send event
+ if (RecordingStopped != null)
+ {
+ try
+ {
+ RecordingStopped();
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine(String.Format("Recording Stopped | {0}", ex.Message));
+ }
+ }
+ }
+ }
+}
diff --git a/AudioWaveOutClassLibrary/Repeater.cs b/AudioWaveOutClassLibrary/Repeater.cs
new file mode 100644
index 0000000..c026ad6
--- /dev/null
+++ b/AudioWaveOutClassLibrary/Repeater.cs
@@ -0,0 +1,707 @@
+//----------------------------------------------------------------------------
+// File Name: Repeater.cs
+//
+// Description:
+// Repeater is responsible for creating WaveIn/ WaveOut Headers, their memory
+// allocation, and its release, and monitors changes in WaveIn / WaveOut Devices.
+//
+// Responsible for creating and behaving a stream for WaveIn / WaveOut devices,
+// creating a playback buffer and copying and playing data from this buffer
+//
+//
+// Author(s):
+// Egor Waken
+//
+// History:
+// 06 May 2024 Egor Waken Created.
+//
+// License:
+// BSD 3-Clause "New" or "Revised" License, see included LICENSE.md file.
+//----------------------------------------------------------------------------
+using System.Runtime.InteropServices;
+
+namespace AudioWaveOut
+{
+ unsafe public class Repeater
+ {
+ // Constructor
+ public Repeater()
+ {
+ delegateWaveInProc = new Win32.DelegateWaveInProc(waveInProc);
+ delegateWaveOutProc = new Win32.DelegateWaveOutProc(waveOutProc);
+ }
+
+ // Variables
+ private LockerClass Locker = new LockerClass();
+ private LockerClass LockerCopy = new LockerClass();
+ private IntPtr hWaveIn = IntPtr.Zero;
+ private IntPtr hWaveOut = IntPtr.Zero;
+ private String WaveInDeviceName = "";
+ private String WaveOutDeviceName = "";
+ private bool IsWaveInOpened = false;
+ private bool IsWaveOutOpened = false;
+ private bool IsWaveInStarted = false;
+ private bool IsThreadPlayWaveInRunning = false;
+ private bool IsMute = false;
+ private bool Stopped = false;
+ private bool IsDataIncomming = false;
+ private int SamplesPerSecond = 8000;
+ private int BitsPerSample = 16;
+ private int Channels = 1;
+ private int BufferCount = 8;
+ private int BufferSize = 1024;
+ private Win32.WAVEHDR*[] WaveInHeaders;
+ private Win32.WAVEHDR*[] WaveOutHeaders;
+ private Win32.WAVEHDR* CurrentRecordedHeader;
+ private Win32.DelegateWaveInProc delegateWaveInProc;
+ private Win32.DelegateWaveOutProc delegateWaveOutProc;
+ private System.Threading.Thread ThreadPlayWaveIn;
+ private System.Threading.AutoResetEvent AutoResetEventDataRecorded = new System.Threading.AutoResetEvent(false);
+ private System.Threading.AutoResetEvent AutoResetEventThreadPlayWaveInEnd = new System.Threading.AutoResetEvent(false);
+ private Byte[] CopyDataBuffer;
+ private GCHandle GCCopyDataBuffer;
+
+ // Delegates And Events
+ public delegate void DelegateStopped();
+ public event DelegateStopped RepeaterStopped;
+
+ // Started
+ public bool Started
+ {
+ get
+ {
+ return IsWaveInStarted && IsWaveInOpened && IsWaveOutOpened && IsThreadPlayWaveInRunning;
+ }
+ }
+
+ // IsMute
+ public bool Mute
+ {
+ get
+ {
+ return IsMute;
+ }
+ set
+ {
+ IsMute = value;
+ }
+ }
+
+ // CreateWaveInHeaders
+ private bool CreateWaveInHeaders()
+ {
+ // Create buffer
+ WaveInHeaders = new Win32.WAVEHDR*[BufferCount];
+ int createdHeaders = 0;
+
+ // For every buffer
+ for (int i = 0; i < BufferCount; i++)
+ {
+ // Allocate headers
+ WaveInHeaders[i] = (Win32.WAVEHDR*)Marshal.AllocHGlobal(sizeof(Win32.WAVEHDR));
+
+ // Set header
+ WaveInHeaders[i]->dwLoops = 0;
+ WaveInHeaders[i]->dwUser = IntPtr.Zero;
+ WaveInHeaders[i]->lpNext = IntPtr.Zero;
+ WaveInHeaders[i]->reserved = IntPtr.Zero;
+ WaveInHeaders[i]->lpData = Marshal.AllocHGlobal(BufferSize);
+ WaveInHeaders[i]->dwBufferLength = (uint)BufferSize;
+ WaveInHeaders[i]->dwBytesRecorded = 0;
+ WaveInHeaders[i]->dwFlags = 0;
+
+ // If the buffer could be prepared
+ Win32.MMRESULT hr = Win32.waveInPrepareHeader(hWaveIn, WaveInHeaders[i], sizeof(Win32.WAVEHDR));
+ if (hr == Win32.MMRESULT.MMSYSERR_NOERROR)
+ {
+ // Add first header to recording
+ if (i == 0)
+ {
+ hr = Win32.waveInAddBuffer(hWaveIn, WaveInHeaders[i], sizeof(Win32.WAVEHDR));
+ }
+ createdHeaders++;
+ }
+ }
+
+ // Ready
+ return (createdHeaders == BufferCount);
+ }
+
+ // CreateWaveOutHeaders
+ private bool CreateWaveOutHeaders()
+ {
+ // Create buffer
+ WaveOutHeaders = new Win32.WAVEHDR*[BufferCount];
+ int createdHeaders = 0;
+
+ // For every buffer
+ for (int i = 0; i < BufferCount; i++)
+ {
+ // Allocate headers
+ WaveOutHeaders[i] = (Win32.WAVEHDR*)Marshal.AllocHGlobal(sizeof(Win32.WAVEHDR));
+
+ // Set header
+ WaveOutHeaders[i]->dwLoops = 0;
+ WaveOutHeaders[i]->dwUser = IntPtr.Zero;
+ WaveOutHeaders[i]->lpNext = IntPtr.Zero;
+ WaveOutHeaders[i]->reserved = IntPtr.Zero;
+ WaveOutHeaders[i]->lpData = Marshal.AllocHGlobal(BufferSize);
+ WaveOutHeaders[i]->dwBufferLength = (uint)BufferSize;
+ WaveOutHeaders[i]->dwBytesRecorded = 0;
+ WaveOutHeaders[i]->dwFlags = 0;
+
+ // If the buffer could be prepared
+ Win32.MMRESULT hr = Win32.waveOutPrepareHeader(hWaveOut, WaveOutHeaders[i], sizeof(Win32.WAVEHDR));
+ if (hr == Win32.MMRESULT.MMSYSERR_NOERROR)
+ {
+ createdHeaders++;
+ }
+ }
+
+ // Ready
+ return (createdHeaders == BufferCount);
+ }
+
+ // FreeWaveInHeaders
+ private void FreeWaveInHeaders()
+ {
+ try
+ {
+ if (WaveInHeaders != null)
+ {
+ for (int i = 0; i < WaveInHeaders.Length; i++)
+ {
+ // Release handle
+ Win32.MMRESULT hr = Win32.waveInUnprepareHeader(hWaveIn, WaveInHeaders[i], sizeof(Win32.WAVEHDR));
+
+ // Wait until finished
+ int count = 0;
+ while (count <= 100 && (WaveInHeaders[i]->dwFlags & Win32.WaveHdrFlags.WHDR_INQUEUE) == Win32.WaveHdrFlags.WHDR_INQUEUE)
+ {
+ System.Threading.Thread.Sleep(20);
+ count++;
+ }
+
+ // When data is no longer in queue
+ if ((WaveInHeaders[i]->dwFlags & Win32.WaveHdrFlags.WHDR_INQUEUE) != Win32.WaveHdrFlags.WHDR_INQUEUE)
+ {
+ // Share data
+ if (WaveInHeaders[i]->lpData != IntPtr.Zero)
+ {
+ Marshal.FreeHGlobal(WaveInHeaders[i]->lpData);
+ WaveInHeaders[i]->lpData = IntPtr.Zero;
+ }
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.Write(ex.Message);
+ }
+ }
+
+ // FreeWaveOutHeaders
+ private void FreeWaveOutHeaders()
+ {
+ try
+ {
+ if (WaveOutHeaders != null)
+ {
+ for (int i = 0; i < WaveOutHeaders.Length; i++)
+ {
+ // Release handles
+ Win32.MMRESULT hr = Win32.waveOutUnprepareHeader(hWaveOut, WaveOutHeaders[i], sizeof(Win32.WAVEHDR));
+
+ // Wait until finished playing
+ int count = 0;
+ while (count <= 100 && (WaveOutHeaders[i]->dwFlags & Win32.WaveHdrFlags.WHDR_INQUEUE) == Win32.WaveHdrFlags.WHDR_INQUEUE)
+ {
+ System.Threading.Thread.Sleep(20);
+ count++;
+ }
+
+ // When data is played
+ if ((WaveOutHeaders[i]->dwFlags & Win32.WaveHdrFlags.WHDR_INQUEUE) != Win32.WaveHdrFlags.WHDR_INQUEUE)
+ {
+ // Share data
+ if (WaveOutHeaders[i]->lpData != IntPtr.Zero)
+ {
+ Marshal.FreeHGlobal(WaveOutHeaders[i]->lpData);
+ WaveOutHeaders[i]->lpData = IntPtr.Zero;
+ }
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.Write(ex.Message);
+ }
+ }
+
+ // StartThreadRecording
+ private void StartThreadPlayWaveIn()
+ {
+ if (Started == false)
+ {
+ ThreadPlayWaveIn = new System.Threading.Thread(new System.Threading.ThreadStart(OnThreadPlayWaveIn));
+ IsThreadPlayWaveInRunning = true;
+ ThreadPlayWaveIn.Name = "PlayWaveIn";
+ ThreadPlayWaveIn.Priority = System.Threading.ThreadPriority.Highest;
+ ThreadPlayWaveIn.Start();
+ }
+ }
+
+ // OpenWaveIn
+ private bool OpenWaveIn()
+ {
+ if (hWaveIn == IntPtr.Zero)
+ {
+ // If not already open
+ if (IsWaveInOpened == false)
+ {
+ // Determine format
+ Win32.WAVEFORMATEX waveFormatEx = new Win32.WAVEFORMATEX();
+ waveFormatEx.wFormatTag = (ushort)Win32.WaveFormatFlags.WAVE_FORMAT_PCM;
+ waveFormatEx.nChannels = (ushort)Channels;
+ waveFormatEx.nSamplesPerSec = (ushort)SamplesPerSecond;
+ waveFormatEx.wBitsPerSample = (ushort)BitsPerSample;
+ waveFormatEx.nBlockAlign = (ushort)((waveFormatEx.wBitsPerSample * waveFormatEx.nChannels) >> 3);
+ waveFormatEx.nAvgBytesPerSec = (uint)(waveFormatEx.nBlockAlign * waveFormatEx.nSamplesPerSec);
+
+ // Determine WaveIn device
+ int deviceId = WinSound.GetWaveInDeviceIdByName(WaveInDeviceName);
+
+ // Open WaveIn device
+ Win32.MMRESULT hr = Win32.waveInOpen(ref hWaveIn, deviceId, ref waveFormatEx, delegateWaveInProc, 0, (int)Win32.WaveProcFlags.CALLBACK_FUNCTION);
+
+ // If not successful
+ if (hWaveIn == IntPtr.Zero)
+ {
+ IsWaveInOpened = false;
+ return false;
+ }
+
+ // Lock handle
+ GCHandle.Alloc(hWaveIn, GCHandleType.Pinned);
+ }
+ }
+
+ IsWaveInOpened = true;
+ return true;
+ }
+
+ // OpenWaveOut
+ private bool OpenWaveOut()
+ {
+ if (hWaveOut == IntPtr.Zero)
+ {
+ // If not already open
+ if (IsWaveOutOpened == false)
+ {
+ // Determine format
+ Win32.WAVEFORMATEX waveFormatEx = new Win32.WAVEFORMATEX();
+ waveFormatEx.wFormatTag = (ushort)Win32.WaveFormatFlags.WAVE_FORMAT_PCM;
+ waveFormatEx.nChannels = (ushort)Channels;
+ waveFormatEx.nSamplesPerSec = (ushort)SamplesPerSecond;
+ waveFormatEx.wBitsPerSample = (ushort)BitsPerSample;
+ waveFormatEx.nBlockAlign = (ushort)((waveFormatEx.wBitsPerSample * waveFormatEx.nChannels) >> 3);
+ waveFormatEx.nAvgBytesPerSec = (uint)(waveFormatEx.nBlockAlign * waveFormatEx.nSamplesPerSec);
+
+ // Determine WaveOut device
+ int deviceId = WinSound.GetWaveOutDeviceIdByName(WaveOutDeviceName);
+
+ // Open WaveIn device
+ Win32.MMRESULT hr = Win32.waveOutOpen(ref hWaveOut, deviceId, ref waveFormatEx, delegateWaveOutProc, 0, (int)Win32.WaveProcFlags.CALLBACK_FUNCTION);
+
+ // If not successful
+ if (hr != Win32.MMRESULT.MMSYSERR_NOERROR)
+ {
+ IsWaveOutOpened = false;
+ return false;
+ }
+
+ // Lock handle
+ GCHandle.Alloc(hWaveOut, GCHandleType.Pinned);
+ }
+ }
+
+ IsWaveOutOpened = true;
+ return true;
+ }
+
+ // Start
+ public bool Start(string waveInDeviceName, string waveOutDeviceName, int samplesPerSecond, int bitsPerSample, int channels, int bufferCount, int bufferSize)
+ {
+ try
+ {
+ lock (Locker)
+ {
+ // If the thread is still running
+ if (IsThreadPlayWaveInRunning)
+ {
+ // Wait until thread ends
+ IsThreadPlayWaveInRunning = false;
+ AutoResetEventDataRecorded.Set();
+ AutoResetEventThreadPlayWaveInEnd.WaitOne(5000);
+ }
+
+ // If not already started
+ if (Started == false)
+ {
+
+ // take over data
+ WaveInDeviceName = waveInDeviceName;
+ WaveOutDeviceName = waveOutDeviceName;
+ SamplesPerSecond = samplesPerSecond;
+ BitsPerSample = bitsPerSample;
+ Channels = channels;
+ BufferCount = bufferCount;
+ BufferSize = bufferSize;
+ CopyDataBuffer = new Byte[BufferSize];
+ GCCopyDataBuffer = GCHandle.Alloc(CopyDataBuffer, GCHandleType.Pinned);
+
+ // WaveOut
+ if (StartWaveOut())
+ {
+ // WaveIn
+ return StartWaveIn();
+ }
+ // Error opening WaveOut
+ return false;
+ }
+
+ // Repeater is already running
+ return false;
+ }
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine(String.Format("Start | {0}", ex.Message));
+ return false;
+ }
+ }
+
+ // ChangeWaveIn
+ public bool ChangeWaveIn(string waveInDeviceName)
+ {
+ try
+ {
+ // Change
+ this.WaveInDeviceName = waveInDeviceName;
+
+ // Restart
+ if (Started)
+ {
+ CloseWaveIn();
+ return StartWaveIn();
+ }
+ return true;
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine(String.Format("ChangeWaveIn() | {0}", ex.Message));
+ return false;
+ }
+ }
+
+ // ChangeWaveOut
+ public bool ChangeWaveOut(string waveOutDeviceName)
+ {
+ try
+ {
+ // Change
+ this.WaveOutDeviceName = waveOutDeviceName;
+
+ // Restart
+ if (Started)
+ {
+ CloseWaveOut();
+ return StartWaveOut();
+ }
+ return true;
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine(String.Format("ChangeWaveOut() | {0}", ex.Message));
+ return false;
+ }
+ }
+
+ // StartWaveIn
+ private bool StartWaveIn()
+ {
+ // If WaveIn could become
+ if (OpenWaveIn())
+ {
+ // If all buffers could be created
+ if (CreateWaveInHeaders())
+ {
+ // When recording could start
+ Win32.MMRESULT hr = Win32.waveInStart(hWaveIn);
+ if (hr == Win32.MMRESULT.MMSYSERR_NOERROR)
+ {
+ IsWaveInStarted = true;
+ Stopped = false;
+
+ // Start thread
+ StartThreadPlayWaveIn();
+ return true;
+ }
+ else
+ {
+ // Error starting
+ return false;
+ }
+ }
+ }
+ // WaveIn could not be opened
+ return false;
+ }
+
+ // OpenWaveOut
+ private bool StartWaveOut()
+ {
+ if (OpenWaveOut())
+ {
+ return CreateWaveOutHeaders();
+ }
+ return false;
+ }
+
+ // Stop
+ public bool Stop()
+ {
+ try
+ {
+ lock (Locker)
+ {
+ // When started
+ if (GCCopyDataBuffer.IsAllocated)
+ {
+ // End WaveIn
+ CloseWaveIn();
+
+ // Quit WaveOut
+ CloseWaveOut();
+
+ // Free up memory
+ GCCopyDataBuffer.Free();
+
+ // Ready
+ return true;
+ }
+ return false;
+ }
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine(String.Format("Stop | {0}", ex.Message));
+ return false;
+ }
+ }
+
+ // CloseWaveIn
+ private void CloseWaveIn()
+ {
+ // Set as manually ended
+ Stopped = true;
+ IsThreadPlayWaveInRunning = false;
+ AutoResetEventDataRecorded.Set();
+
+ // Stop WaveIn
+ Win32.MMRESULT hResult = Win32.waveInStop(hWaveIn);
+
+ // Set buffer as processed
+ int resetCount = 0;
+ while (IsAnyWaveInHeaderInState(Win32.WaveHdrFlags.WHDR_INQUEUE) & resetCount < 20)
+ {
+ Win32.MMRESULT hr = Win32.waveInReset(hWaveIn);
+ System.Threading.Thread.Sleep(50);
+ resetCount++;
+ }
+
+ // Release header handles (before waveInClose)
+ FreeWaveInHeaders();
+
+ // Close
+ while (Win32.waveInClose(hWaveIn) == Win32.MMRESULT.WAVERR_STILLPLAYING)
+ {
+ System.Threading.Thread.Sleep(50);
+ }
+ }
+
+ // CloseWaveOut
+ private void CloseWaveOut()
+ {
+ // Stop
+ IsWaveOutOpened = false;
+ Win32.MMRESULT hr = Win32.waveOutReset(hWaveOut);
+
+ // Wait until everything plays
+ while (IsAnyWaveOutHeaderInState(Win32.WaveHdrFlags.WHDR_INQUEUE))
+ {
+ System.Threading.Thread.Sleep(50);
+ }
+
+ // Release header handles
+ FreeWaveOutHeaders();
+
+ // Close
+ hr = Win32.waveOutClose(hWaveOut);
+ }
+
+ // IsAnyWaveInHeaderInState
+ private bool IsAnyWaveInHeaderInState(Win32.WaveHdrFlags state)
+ {
+ for (int i = 0; i < WaveInHeaders.Length; i++)
+ {
+ if ((WaveInHeaders[i]->dwFlags & state) == state)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ // IsAnyWaveOutHeaderInState
+ private bool IsAnyWaveOutHeaderInState(Win32.WaveHdrFlags state)
+ {
+ for (int i = 0; i < WaveOutHeaders.Length; i++)
+ {
+ if ((WaveOutHeaders[i]->dwFlags & state) == state)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ // waveOutProc
+ private void waveOutProc(IntPtr hWaveOut, Win32.WOM_Messages msg, IntPtr dwInstance, Win32.WAVEHDR* pWaveHeader, IntPtr lParam)
+ {
+ switch (msg)
+ {
+ // Open
+ case Win32.WOM_Messages.OPEN:
+ break;
+
+ // Close
+ case Win32.WOM_Messages.CLOSE:
+ IsWaveOutOpened = false;
+ AutoResetEventDataRecorded.Set();
+ this.hWaveOut = IntPtr.Zero;
+ break;
+ }
+ }
+
+ // waveInProc
+ private void waveInProc(IntPtr hWaveIn, Win32.WIM_Messages msg, IntPtr dwInstance, Win32.WAVEHDR* waveHeader, IntPtr lParam)
+ {
+
+ switch (msg)
+ {
+ // Open
+ case Win32.WIM_Messages.OPEN:
+ break;
+
+ // Data
+ case Win32.WIM_Messages.DATA:
+
+ // Data has arrived
+ IsDataIncomming = true;
+
+ // Remember recorded buffer
+ CurrentRecordedHeader = waveHeader;
+
+ // Set event
+ AutoResetEventDataRecorded.Set();
+ break;
+
+ //Close
+ case Win32.WIM_Messages.CLOSE:
+ IsDataIncomming = false;
+ IsWaveInOpened = false;
+ Stopped = true;
+ AutoResetEventDataRecorded.Set();
+ this.hWaveIn = IntPtr.Zero;
+ break;
+ }
+ }
+
+ // OnThreadRecording
+ private void OnThreadPlayWaveIn()
+ {
+ while (IsThreadPlayWaveInRunning && !Stopped)
+ {
+ // Wait until recording is finished
+ AutoResetEventDataRecorded.WaitOne();
+
+ try
+ {
+
+ if (IsThreadPlayWaveInRunning && IsDataIncomming && IsWaveOutOpened && IsMute == false)
+ {
+ // Determine the next free playback buffer
+ for (int i = 0; i < WaveOutHeaders.Length; i++)
+ {
+ if ((WaveOutHeaders[i]->dwFlags & Win32.WaveHdrFlags.WHDR_INQUEUE) == 0)
+ {
+ try
+ {
+ // Copy data to playback buffer
+ Marshal.Copy(CurrentRecordedHeader->lpData, CopyDataBuffer, 0, CopyDataBuffer.Length);
+ Marshal.Copy(CopyDataBuffer, 0, WaveOutHeaders[i]->lpData, CopyDataBuffer.Length);
+
+ // Play data
+ Win32.MMRESULT hr = Win32.waveOutWrite(hWaveOut, WaveOutHeaders[i], sizeof(Win32.WAVEHDR));
+ break;
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine(ex.Message);
+ }
+ }
+ }
+ }
+
+ if (IsThreadPlayWaveInRunning && !Stopped)
+ {
+ // Keep recording
+ for (int i = 0; i < WaveInHeaders.Length; i++)
+ {
+ if ((WaveInHeaders[i]->dwFlags & Win32.WaveHdrFlags.WHDR_INQUEUE) == 0)
+ {
+ Win32.MMRESULT hr = Win32.waveInAddBuffer(hWaveIn, WaveInHeaders[i], sizeof(Win32.WAVEHDR));
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine(ex.Message);
+ }
+ }
+
+
+ // Set variables
+ IsWaveInStarted = false;
+ IsThreadPlayWaveInRunning = false;
+ AutoResetEventThreadPlayWaveInEnd.Set();
+
+ // Send event
+ if (RepeaterStopped != null)
+ {
+ try
+ {
+ RepeaterStopped();
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine(String.Format("Repeater Stopped | {0}", ex.Message));
+ }
+ }
+ }
+ }
+}
diff --git a/AudioWaveOutClassLibrary/Timer.cs b/AudioWaveOutClassLibrary/Timer.cs
new file mode 100644
index 0000000..b802e77
--- /dev/null
+++ b/AudioWaveOutClassLibrary/Timer.cs
@@ -0,0 +1,339 @@
+//----------------------------------------------------------------------------
+// File Name: Timer.cs
+//
+// Description:
+// Implement various types of timers, That based && defined into Win32.cs Class
+// Timers: QueueTimer, EventTimer, Stopwatch
+// Timer resolution - the smallest unit of time that can be accurately measured by
+// that timer
+//
+// Author(s):
+// Egor Waken
+//
+// History:
+// 06 May 2024 Egor Waken Created.
+//
+// License:
+// BSD 3-Clause "New" or "Revised" License, see included LICENSE.md file.
+//----------------------------------------------------------------------------
+
+using System.Runtime.InteropServices;
+
+namespace AudioWaveOut
+{
+ // QueueTimer
+ public class QueueTimer
+ {
+ // Constructor
+ public QueueTimer()
+ {
+ m_DelegateTimerProc = new global::AudioWaveOut.Win32.DelegateTimerProc(OnTimer);
+ }
+
+ // Variables
+ private bool m_IsRunning = false;
+ private uint m_Milliseconds = 20;
+ private IntPtr m_HandleTimer = IntPtr.Zero;
+ private GCHandle m_GCHandleTimer;
+ private uint m_ResolutionInMilliseconds = 0;
+ private IntPtr m_HandleTimerQueue;
+ private GCHandle m_GCHandleTimerQueue;
+
+ //Delegates And Events
+ private global::AudioWaveOut.Win32.DelegateTimerProc m_DelegateTimerProc;
+ public delegate void DelegateTimerTick();
+ public event DelegateTimerTick TimerTick;
+
+ // IsRunning
+ public bool IsRunning
+ {
+ get
+ {
+ return m_IsRunning;
+ }
+ }
+
+ // Milliseconds
+ public uint Milliseconds
+ {
+ get
+ {
+ return m_Milliseconds;
+ }
+ }
+
+ // ResolutionInMilliseconds
+ public uint ResolutionInMilliseconds
+ {
+ get
+ {
+ return m_ResolutionInMilliseconds;
+ }
+ }
+
+ // SetBestResolution
+ public static void SetBestResolution()
+ {
+ // QueueTimer Determine resolution
+ global::AudioWaveOut.Win32.TimeCaps tc = new global::AudioWaveOut.Win32.TimeCaps();
+ global::AudioWaveOut.Win32.TimeGetDevCaps(ref tc, (uint)Marshal.SizeOf(typeof(global::AudioWaveOut.Win32.TimeCaps)));
+ uint resolution = Math.Max(tc.wPeriodMin, 0);
+
+ // QueueTimer Set resolution
+ global::AudioWaveOut.Win32.TimeBeginPeriod(resolution);
+ }
+
+ // ResetResolution
+ public static void ResetResolution()
+ {
+ // QueueTimer Determine resolution
+ global::AudioWaveOut.Win32.TimeCaps tc = new global::AudioWaveOut.Win32.TimeCaps();
+ global::AudioWaveOut.Win32.TimeGetDevCaps(ref tc, (uint)Marshal.SizeOf(typeof(global::AudioWaveOut.Win32.TimeCaps)));
+ uint resolution = Math.Max(tc.wPeriodMin, 0);
+
+ // QueueTimer Resolution deactivate
+ global::AudioWaveOut.Win32.TimeBeginPeriod(resolution);
+ }
+
+ // Start
+ public void Start(uint milliseconds, uint dueTimeInMilliseconds)
+ {
+ // Take Values
+ m_Milliseconds = milliseconds;
+
+ // Determine QueueTimer resolution
+ global::AudioWaveOut.Win32.TimeCaps tc = new global::AudioWaveOut.Win32.TimeCaps();
+ global::AudioWaveOut.Win32.TimeGetDevCaps(ref tc, (uint)Marshal.SizeOf(typeof(global::AudioWaveOut.Win32.TimeCaps)));
+ m_ResolutionInMilliseconds = Math.Max(tc.wPeriodMin, 0);
+
+ // Set QueueTimer Resolution
+ global::AudioWaveOut.Win32.TimeBeginPeriod(m_ResolutionInMilliseconds);
+
+ // QueueTimer Create queue
+ m_HandleTimerQueue = global::AudioWaveOut.Win32.CreateTimerQueue();
+ m_GCHandleTimerQueue = GCHandle.Alloc(m_HandleTimerQueue);
+
+ // Try starting QueueTimer
+ bool resultCreate = global::AudioWaveOut.Win32.CreateTimerQueueTimer(out m_HandleTimer, m_HandleTimerQueue, m_DelegateTimerProc, IntPtr.Zero, dueTimeInMilliseconds, m_Milliseconds, global::AudioWaveOut.Win32.WT_EXECUTEINTIMERTHREAD);
+ if (resultCreate)
+ {
+ // Hold handle in memory
+ m_GCHandleTimer = GCHandle.Alloc(m_HandleTimer, GCHandleType.Pinned);
+
+ // QueueTimer has started
+ m_IsRunning = true;
+ }
+ }
+
+ // Stop
+ public void Stop()
+ {
+ if (m_HandleTimer != IntPtr.Zero)
+ {
+ // End QueueTimer
+ global::AudioWaveOut.Win32.DeleteTimerQueueTimer(IntPtr.Zero, m_HandleTimer, IntPtr.Zero);
+
+ // End QueueTimer Resolution
+ global::AudioWaveOut.Win32.TimeEndPeriod(m_ResolutionInMilliseconds);
+
+ // QueueTimer Delete queue
+ if (m_HandleTimerQueue != IntPtr.Zero)
+ {
+ global::AudioWaveOut.Win32.DeleteTimerQueue(m_HandleTimerQueue);
+ }
+
+ // Release handles
+ if (m_GCHandleTimer.IsAllocated)
+ {
+ m_GCHandleTimer.Free();
+ }
+ if (m_GCHandleTimerQueue.IsAllocated)
+ {
+ m_GCHandleTimerQueue.Free();
+ }
+
+ // Set variables
+ m_HandleTimer = IntPtr.Zero;
+ m_HandleTimerQueue = IntPtr.Zero;
+ m_IsRunning = false;
+ }
+ }
+
+ // OnTimer
+ private void OnTimer(IntPtr lpParameter, bool TimerOrWaitFired)
+ {
+ if (TimerTick != null)
+ {
+ TimerTick();
+ }
+ }
+ }
+
+ // EventTimer
+ public class EventTimer
+ {
+ // Constructor
+ public EventTimer()
+ {
+ m_DelegateTimeEvent = new global::AudioWaveOut.Win32.TimerEventHandler(OnTimer);
+ }
+
+ // Variables
+ private bool m_IsRunning = false;
+ private uint m_Milliseconds = 20;
+ private UInt32 m_TimerId = 0;
+ private GCHandle m_GCHandleTimer;
+ private UInt32 m_UserData = 0;
+ private uint m_ResolutionInMilliseconds = 0;
+
+ // Delegates And Events
+ private global::AudioWaveOut.Win32.TimerEventHandler m_DelegateTimeEvent;
+ public delegate void DelegateTimerTick();
+ public event DelegateTimerTick TimerTick;
+
+ // IsRunning
+ public bool IsRunning
+ {
+ get
+ {
+ return m_IsRunning;
+ }
+ }
+
+ // Milliseconds
+ public uint Milliseconds
+ {
+ get
+ {
+ return m_Milliseconds;
+ }
+ }
+
+ // ResolutionInMilliseconds
+ public uint ResolutionInMilliseconds
+ {
+ get
+ {
+ return m_ResolutionInMilliseconds;
+ }
+ }
+
+ // SetBestResolution
+ public static void SetBestResolution()
+ {
+ // Determine QueueTimer resolution
+ global::AudioWaveOut.Win32.TimeCaps tc = new global::AudioWaveOut.Win32.TimeCaps();
+ global::AudioWaveOut.Win32.TimeGetDevCaps(ref tc, (uint)Marshal.SizeOf(typeof(global::AudioWaveOut.Win32.TimeCaps)));
+ uint resolution = Math.Max(tc.wPeriodMin, 0);
+
+ // Set QueueTimer Resolution
+ global::AudioWaveOut.Win32.TimeBeginPeriod(resolution);
+ }
+
+ // ResetResolution
+ public static void ResetResolution()
+ {
+ // Determine QueueTimer resolution
+ global::AudioWaveOut.Win32.TimeCaps tc = new global::AudioWaveOut.Win32.TimeCaps();
+ global::AudioWaveOut.Win32.TimeGetDevCaps(ref tc, (uint)Marshal.SizeOf(typeof(global::AudioWaveOut.Win32.TimeCaps)));
+ uint resolution = Math.Max(tc.wPeriodMin, 0);
+
+ // Disable QueueTimer Resolution
+ global::AudioWaveOut.Win32.TimeEndPeriod(resolution);
+ }
+
+ // Start
+ public void Start(uint milliseconds, uint dueTimeInMilliseconds)
+ {
+ // Take values
+ m_Milliseconds = milliseconds;
+
+ // Determine timer resolution
+ global::AudioWaveOut.Win32.TimeCaps tc = new global::AudioWaveOut.Win32.TimeCaps();
+ global::AudioWaveOut.Win32.TimeGetDevCaps(ref tc, (uint)Marshal.SizeOf(typeof(global::AudioWaveOut.Win32.TimeCaps)));
+ m_ResolutionInMilliseconds = Math.Max(tc.wPeriodMin, 0);
+
+ // Set timer resolution
+ global::AudioWaveOut.Win32.TimeBeginPeriod(m_ResolutionInMilliseconds);
+
+ // Try starting EventTimer
+ m_TimerId = global::AudioWaveOut.Win32.TimeSetEvent(m_Milliseconds, m_ResolutionInMilliseconds, m_DelegateTimeEvent, ref m_UserData, (UInt32)Win32.TIME_PERIODIC);
+ if (m_TimerId > 0)
+ {
+ // Hold handle in memory
+ m_GCHandleTimer = GCHandle.Alloc(m_TimerId, GCHandleType.Pinned);
+
+ // QueueTimer has started
+ m_IsRunning = true;
+ }
+ }
+
+ // Stop
+ public void Stop()
+ {
+ if (m_TimerId > 0)
+ {
+ // End timer
+ global::AudioWaveOut.Win32.TimeKillEvent(m_TimerId);
+
+ // End timer resolution
+ global::AudioWaveOut.Win32.TimeEndPeriod(m_ResolutionInMilliseconds);
+
+ // Release handles
+ if (m_GCHandleTimer.IsAllocated)
+ {
+ m_GCHandleTimer.Free();
+ }
+
+ // Set variables
+ m_TimerId = 0;
+ m_IsRunning = false;
+ }
+ }
+
+ // OnTimer
+ private void OnTimer(UInt32 id, UInt32 msg, ref UInt32 userCtx, UInt32 rsv1, UInt32 rsv2)
+ {
+ if (TimerTick != null)
+ {
+ TimerTick();
+ }
+ }
+ }
+
+ // Stopwatch
+ public class Stopwatch
+ {
+ // Constructor
+ public Stopwatch()
+ {
+ // Check
+ if (Win32.QueryPerformanceFrequency(out m_Frequency) == false)
+ {
+ throw new Exception("High Performance counter not supported");
+ }
+ }
+
+ // Variables
+ private long m_StartTime = 0;
+ private long m_DurationTime = 0;
+ private long m_Frequency;
+
+ // Start
+ public void Start()
+ {
+ Win32.QueryPerformanceCounter(out m_StartTime);
+ m_DurationTime = m_StartTime;
+ }
+
+ // ElapsedMilliseconds
+ public double ElapsedMilliseconds
+ {
+ get
+ {
+ Win32.QueryPerformanceCounter(out m_DurationTime);
+ return (double)(m_DurationTime - m_StartTime) / (double)m_Frequency * 1000;
+ }
+ }
+ }
+}
diff --git a/AudioWaveOutClassLibrary/Utils.cs b/AudioWaveOutClassLibrary/Utils.cs
new file mode 100644
index 0000000..0c5fe2f
--- /dev/null
+++ b/AudioWaveOutClassLibrary/Utils.cs
@@ -0,0 +1,316 @@
+//----------------------------------------------------------------------------
+// File Name: Utils.cs
+//
+// Description:
+// Convert audio data from mu-law to linear and linear to mu-law
+//
+// Implementing an audio `sample' that represent is a single output value from an A/D converter,
+// i.e., a small integer number (usually 8 or 16 bits), and audio data is just a series of such
+// samples. It can be characterized by three parameters: the sampling rate (measured in samples
+// per second or Hz, e.g., 8000 or 44100), the number of bits per sample (e.g., 8 or 16),
+// and the number of channels (1 for mono, 2 for stereo, etc.)
+//
+// For more detailed information, read the Article
+// https://www.dm.unibo.it/~achilles/calc/octave.html/Audio-Processing.html
+//
+// Author(s):
+// Egor Waken
+//
+// History:
+// 06 May 2024 Egor Waken Created.
+//
+// License:
+// BSD 3-Clause "New" or "Revised" License, see included LICENSE.md file.
+//----------------------------------------------------------------------------
+
+namespace AudioWaveOut
+{
+ // Utils
+ public class Utils
+ {
+ // Constructor
+ public Utils()
+ {
+
+ }
+
+ // Const Data
+ const int SIGN_BIT = (0x80);
+ const int QUANT_MASK = (0xf);
+ const int NSEGS = (8);
+ const int SEG_SHIFT = (4);
+ const int SEG_MASK = (0x70);
+ const int BIAS = (0x84);
+ const int CLIP = 8159;
+ static short[] seg_uend = new short[] { 0x3F, 0x7F, 0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF };
+
+ // GetBytesPerInterval
+ public static int GetBytesPerInterval(uint SamplesPerSecond, int BitsPerSample, int Channels)
+ {
+ int blockAlign = ((BitsPerSample * Channels) >> 3);
+ int bytesPerSec = (int)(blockAlign * SamplesPerSecond);
+ uint sleepIntervalFactor = 1000 / 20; //20 Milliseconds
+ int bytesPerInterval = (int)(bytesPerSec / sleepIntervalFactor);
+
+ // Ready
+ return bytesPerInterval;
+ }
+
+ // Mu-law To Linear
+ // Convert audio data from mu-law to linear
+ public static Int32 MulawToLinear(Int32 ulaw)
+ {
+ ulaw = ~ulaw;
+ int t = ((ulaw & QUANT_MASK) << 3) + BIAS;
+ t <<= (ulaw & SEG_MASK) >> SEG_SHIFT;
+ return ((ulaw & SIGN_BIT) > 0 ? (BIAS - t) : (t - BIAS));
+ }
+
+ // Help Method to Search, Using with Convert the scaled magnitude to segment number
+ static short Search(short val, short[] table, short size)
+ {
+ short i;
+ int index = 0;
+ for (i = 0; i < size; i++)
+ {
+ if (val <= table[index])
+ {
+ return (i);
+ }
+ index++;
+ }
+ return (size);
+ }
+
+ // Linear To Mu-law.
+ // Convert audio data from mu-law to linear
+ public static Byte LinearToMulaw(short pcm_val)
+ {
+ short mask = 0;
+ short seg = 0;
+ Byte uval = 0;
+
+ // Get the sign and the magnitude of the value.
+ pcm_val = (short)(pcm_val >> 2);
+ if (pcm_val < 0)
+ {
+ pcm_val = (short)-pcm_val;
+ mask = 0x7F;
+ }
+ else
+ {
+ mask = 0xFF;
+ }
+
+ // Clip the Magnitude
+ if (pcm_val > CLIP)
+ {
+ pcm_val = CLIP;
+ }
+ pcm_val += (BIAS >> 2);
+
+ // Convert the scaled magnitude to segment number.
+ seg = Search(pcm_val, seg_uend, (short)8);
+
+
+ // Combine the sign, segment, quantization bits;
+ // and complement the code word.
+
+ // Out of range, return maximum value.
+ if (seg >= 8)
+ {
+ return (Byte)(0x7F ^ mask);
+ }
+ else
+ {
+ uval = (Byte)((seg << 4) | ((pcm_val >> (seg + 1)) & 0xF));
+ return ((Byte)(uval ^ mask));
+ }
+ }
+
+ // Mu-Law To Linear
+ public static Byte[] MuLawToLinear(Byte[] bytes, int bitsPerSample, int channels)
+ {
+ // Number of tracks
+ int blockAlign = channels * bitsPerSample / 8;
+
+ // For every value
+ Byte[] result = new Byte[bytes.Length * blockAlign];
+ for (int i = 0, counter = 0; i < bytes.Length; i++, counter += blockAlign)
+ {
+ // Convert to bytes
+ int value = MulawToLinear(bytes[i]);
+ Byte[] values = BitConverter.GetBytes(value);
+
+ switch (bitsPerSample)
+ {
+ case 8:
+ switch (channels)
+ {
+ // 8 Bit 1 Channel
+ case 1:
+ result[counter] = values[0];
+ break;
+
+ // 8 Bit 2 Channel
+ case 2:
+ result[counter] = values[0];
+ result[counter + 1] = values[0];
+ break;
+ }
+ break;
+
+ case 16:
+ switch (channels)
+ {
+ // 16 Bit 1 Channel
+ case 1:
+ result[counter] = values[0];
+ result[counter + 1] = values[1];
+ break;
+
+ // 16 Bit 2 Channels
+ case 2:
+ result[counter] = values[0];
+ result[counter + 1] = values[1];
+ result[counter + 2] = values[0];
+ result[counter + 3] = values[1];
+ break;
+ }
+ break;
+ }
+ }
+
+ // Ready
+ return result;
+ }
+
+ /// Mu-Law To Linear with the number of bits per sample 32
+ public static int[] MuLawToLinear32(Byte[] bytes, int bitsPerSample, int channels)
+ {
+ // Number of tracks
+ int blockAlign = channels;
+
+ // For every value
+ int[] result = new int[bytes.Length * blockAlign];
+ for (int i = 0, counter = 0; i < bytes.Length; i++, counter += blockAlign)
+ {
+ // Convert to Int32
+ int value = MulawToLinear(bytes[i]);
+
+ switch (bitsPerSample)
+ {
+ case 8:
+ switch (channels)
+ {
+ // 8 Bit 1 Channel
+ case 1:
+ result[counter] = value;
+ break;
+
+ // 8 Bit 2 Channel
+ case 2:
+ result[counter] = value;
+ result[counter + 1] = value;
+ break;
+ }
+ break;
+
+ case 16:
+ switch (channels)
+ {
+ // 16 Bit 1 Channel
+ case 1:
+ result[counter] = value;
+ break;
+
+ // 16 Bit 2 Channels
+ case 2:
+ result[counter] = value;
+ result[counter + 1] = value;
+ break;
+ }
+ break;
+ }
+ }
+
+ // Ready
+ return result;
+ }
+
+ // Linear To Mu-Law
+ public static Byte[] LinearToMulaw(Byte[] bytes, int bitsPerSample, int channels)
+ {
+ // Number of tracks
+ int blockAlign = channels * bitsPerSample / 8;
+
+ // Result
+ Byte[] result = new Byte[bytes.Length / blockAlign];
+ int resultIndex = 0;
+ for (int i = 0; i < result.Length; i++)
+ {
+ // Depending on the resolution
+ switch (bitsPerSample)
+ {
+ case 8:
+ switch (channels)
+ {
+ // 8 Bit 1 Channel
+ case 1:
+ result[i] = LinearToMulaw(bytes[resultIndex]);
+ resultIndex += 1;
+ break;
+
+ // 8 Bit 2 Channel
+ case 2:
+ result[i] = LinearToMulaw(bytes[resultIndex]);
+ resultIndex += 2;
+ break;
+ }
+ break;
+
+ case 16:
+ switch (channels)
+ {
+ // 16 Bit 1 Channel
+ case 1:
+ result[i] = LinearToMulaw(BitConverter.ToInt16(bytes, resultIndex));
+ resultIndex += 2;
+ break;
+
+ // 16 Bit 2 Channels
+ case 2:
+ result[i] = LinearToMulaw(BitConverter.ToInt16(bytes, resultIndex));
+ resultIndex += 4;
+ break;
+ }
+ break;
+ }
+ }
+
+ // Ready
+ return result;
+ }
+
+ // Get Standard Derivation
+ public static double GetStandardDerivation(System.Collections.Generic.List list)
+ {
+ // Copy
+ List listCopy = new List(list);
+
+ // Calculate average
+ double average = listCopy.Average();
+
+ // Sums of squares of improvements
+ double sum = 0;
+ foreach (double value in listCopy)
+ {
+ double diff = average - value;
+ sum += Math.Pow(diff, 2);
+ }
+
+ // Result
+ return Math.Sqrt(sum / (listCopy.Count - 1));
+ }
+ }
+}
diff --git a/AudioWaveOutClassLibrary/WaveFile.cs b/AudioWaveOutClassLibrary/WaveFile.cs
new file mode 100644
index 0000000..ade605e
--- /dev/null
+++ b/AudioWaveOutClassLibrary/WaveFile.cs
@@ -0,0 +1,325 @@
+//----------------------------------------------------------------------------
+// File Name: WaveFile.cs
+//
+// Description:
+// The WAVE file format is a subset of Microsoft's RIFF specification for the storage
+// of multimedia files. A RIFF file starts out with a file header followed by a sequence
+// of data chunks
+//
+// For more detailed information, read the documentation
+// http://soundfile.sapp.org/doc/WaveFormat/
+//
+// Author(s):
+// Egor Waken
+//
+// History:
+// 05 May 2024 Egor Waken Created.
+//
+// License:
+// BSD 3-Clause "New" or "Revised" License, see included LICENSE.md file.
+//----------------------------------------------------------------------------
+
+using System.Text;
+
+namespace AudioWaveOut
+{
+ // WaveFile
+ public class WaveFile
+ {
+ // Constructor
+ public WaveFile()
+ {
+
+ }
+
+ // Const Data
+ public const int WAVE_FORMAT_PCM = 1;
+
+ // Create New WaveFile
+ public static void Create(string fileName, uint samplesPerSecond, short bitsPerSample, short channels, Byte[] data)
+ {
+ // Delete existing file
+ if (System.IO.File.Exists(fileName))
+ {
+ System.IO.File.Delete(fileName);
+ }
+
+ // Create header
+ WaveFileHeader header = CreateNewWaveFileHeader(samplesPerSecond, bitsPerSample, channels, (uint)(data.Length), 44 + data.Length);
+
+ // Write header
+ WriteHeader(fileName, header);
+
+ // Write data
+ WriteData(fileName, header.DATAPos, data);
+ }
+
+
+ // Append Data To existing file
+ public static void AppendData(string fileName, Byte[] data)
+ {
+ AppendData(fileName, data, false);
+ }
+
+ // Append Data To existing file
+ public static void AppendData(string fileName, Byte[] data, bool forceWriting)
+ {
+ // Read header
+ WaveFileHeader header = ReadHeader(fileName);
+
+ // If data exists
+ if (header.DATASize > 0 || forceWriting)
+ {
+ // Add data
+ WriteData(fileName, (int)(header.DATAPos + header.DATASize), data);
+
+ // Update headers
+ header.DATASize += (uint)data.Length;
+ header.RiffSize += (uint)data.Length;
+
+ // Overwrite header
+ WriteHeader(fileName, header);
+ }
+ }
+
+ // Read
+ public static WaveFileHeader Read(string fileName)
+ {
+ // Read headers
+ WaveFileHeader header = ReadHeader(fileName);
+
+ // Ready
+ return header;
+ }
+
+ // CreateWaveFileHeader
+ private static WaveFileHeader CreateNewWaveFileHeader(uint SamplesPerSecond, short BitsPerSample, short Channels, uint dataSize, long fileSize)
+ {
+ // Create header
+ WaveFileHeader Header = new WaveFileHeader();
+
+ // Set values
+ Array.Copy("RIFF".ToArray(), Header.RIFF, 4);
+ Header.RiffSize = (uint)(fileSize - 8);
+ Array.Copy("WAVE".ToArray(), Header.RiffFormat, 4);
+ Array.Copy("fmt ".ToArray(), Header.FMT, 4);
+ Header.FMTSize = 16;
+ Header.AudioFormat = WAVE_FORMAT_PCM;
+ Header.Channels = (short)Channels;
+ Header.SamplesPerSecond = (uint)SamplesPerSecond;
+ Header.BitsPerSample = (short)BitsPerSample;
+ Header.BlockAlign = (short)((BitsPerSample * Channels) >> 3);
+ Header.BytesPerSecond = (uint)(Header.BlockAlign * Header.SamplesPerSecond);
+ Array.Copy("data".ToArray(), Header.DATA, 4);
+ Header.DATASize = dataSize;
+
+ // Ready
+ return Header;
+ }
+
+ // Read Header
+ private static WaveFileHeader ReadHeader(string fileName)
+ {
+ // Result
+ WaveFileHeader header = new WaveFileHeader();
+
+ // If the file exists
+ if (File.Exists(fileName))
+ {
+ // Open file
+ FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
+ System.IO.BinaryReader rd = new System.IO.BinaryReader(fs, Encoding.UTF8);
+
+ // To read
+ if (fs.CanRead)
+ {
+ // Chunk 1
+ header.RIFF = rd.ReadChars(4);
+ header.RiffSize = (uint)rd.ReadInt32();
+ header.RiffFormat = rd.ReadChars(4);
+
+ // Chunk 2
+ header.FMT = rd.ReadChars(4);
+ header.FMTSize = (uint)rd.ReadInt32();
+ header.FMTPos = fs.Position;
+ header.AudioFormat = (short)rd.ReadInt16();
+ header.Channels = (short)rd.ReadInt16();
+ header.SamplesPerSecond = (uint)rd.ReadInt32();
+ header.BytesPerSecond = (uint)rd.ReadInt32();
+ header.BlockAlign = (short)rd.ReadInt16();
+ header.BitsPerSample = (short)rd.ReadInt16();
+
+ // Go to the beginning of Chunk3
+ fs.Seek(header.FMTPos + header.FMTSize, SeekOrigin.Begin);
+
+ // Chunk 3
+ header.DATA = rd.ReadChars(4);
+ header.DATASize = (uint)rd.ReadInt32();
+ header.DATAPos = (int)fs.Position;
+
+ // If not DATA
+ if (new String(header.DATA).ToUpper() != "DATA")
+ {
+ uint DataChunkSize = header.DATASize + 8;
+ fs.Seek(DataChunkSize, SeekOrigin.Current);
+ header.DATASize = (uint)(fs.Length - header.DATAPos - DataChunkSize);
+ }
+
+ // Read payload
+ if (header.DATASize <= fs.Length - header.DATAPos)
+ {
+ header.Payload = rd.ReadBytes((int)header.DATASize);
+ }
+ }
+
+ // Close
+ rd.Close();
+ fs.Close();
+ }
+
+ // Ready
+ return header;
+ }
+
+ // WriteHeader
+ public static void WriteHeader(string fileName, WaveFileHeader header)
+ {
+ // Open file
+ FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite);
+ System.IO.BinaryWriter wr = new System.IO.BinaryWriter(fs, Encoding.UTF8);
+
+ // Chunk 1
+ wr.Write(header.RIFF);
+ wr.Write(Int32ToBytes((int)header.RiffSize));
+ wr.Write(header.RiffFormat);
+
+ // Chunk 2
+ wr.Write(header.FMT);
+ wr.Write(Int32ToBytes((int)header.FMTSize));
+ wr.Write(Int16ToBytes(header.AudioFormat));
+ wr.Write(Int16ToBytes(header.Channels));
+ wr.Write(Int32ToBytes((int)header.SamplesPerSecond));
+ wr.Write(Int32ToBytes((int)header.BytesPerSecond));
+ wr.Write(Int16ToBytes((short)header.BlockAlign));
+ wr.Write(Int16ToBytes((short)header.BitsPerSample));
+
+ // Chunk 3
+ wr.Write(header.DATA);
+ wr.Write(Int32ToBytes((int)header.DATASize));
+
+ // Close file
+ wr.Close();
+ fs.Close();
+ }
+
+ // WriteData
+ public static void WriteData(string fileName, int pos, Byte[] data)
+ {
+ // Open file
+ FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite);
+ System.IO.BinaryWriter wr = new System.IO.BinaryWriter(fs, Encoding.UTF8);
+
+ // Go to writing position
+ wr.Seek(pos, System.IO.SeekOrigin.Begin);
+
+ // Write data
+ wr.Write(data);
+
+ //Ready
+ wr.Close();
+ fs.Close();
+ }
+
+ // BytesToInt32
+ private static int BytesToInt32(ref Byte[] bytes)
+ {
+ int Int32 = 0;
+ Int32 = (Int32 << 8) + bytes[3];
+ Int32 = (Int32 << 8) + bytes[2];
+ Int32 = (Int32 << 8) + bytes[1];
+ Int32 = (Int32 << 8) + bytes[0];
+ return Int32;
+ }
+
+ // BytesToInt16
+ private static short BytesToInt16(ref Byte[] bytes)
+ {
+ short Int16 = 0;
+ Int16 = (short)((Int16 << 8) + bytes[1]);
+ Int16 = (short)((Int16 << 8) + bytes[0]);
+ return Int16;
+ }
+
+ // Int32ToByte
+ private static Byte[] Int32ToBytes(int value)
+ {
+ Byte[] bytes = new Byte[4];
+ bytes[0] = (Byte)(value & 0xFF);
+ bytes[1] = (Byte)(value >> 8 & 0xFF);
+ bytes[2] = (Byte)(value >> 16 & 0xFF);
+ bytes[3] = (Byte)(value >> 24 & 0xFF);
+ return bytes;
+ }
+
+ // Int16ToBytes
+ private static Byte[] Int16ToBytes(short value)
+ {
+ Byte[] bytes = new Byte[2];
+ bytes[0] = (Byte)(value & 0xFF);
+ bytes[1] = (Byte)(value >> 8 & 0xFF);
+ return bytes;
+ }
+ }
+
+ // WaveFileHeader
+ public class WaveFileHeader
+ {
+ // Constructor
+ public WaveFileHeader()
+ {
+
+ }
+
+ // Chunk 1
+ public Char[] RIFF = new Char[4];
+ public uint RiffSize = 8;
+ public Char[] RiffFormat = new Char[4];
+
+ // Chunk 2
+ public Char[] FMT = new Char[4];
+ public uint FMTSize = 16;
+ public short AudioFormat;
+ public short Channels;
+ public uint SamplesPerSecond;
+ public uint BytesPerSecond;
+ public short BlockAlign;
+ public short BitsPerSample;
+
+ // Chunk 3
+ public Char[] DATA = new Char[4];
+ public uint DATASize;
+
+ // Data
+ public Byte[] Payload = new Byte[0];
+
+ // Header Length
+ public int DATAPos = 44;
+ // Position FormatSize
+ public long FMTPos = 20;
+
+
+ // Duration
+ public TimeSpan Duration
+ {
+ get
+ {
+ int blockAlign = ((BitsPerSample * Channels) >> 3);
+ int bytesPerSec = (int)(blockAlign * SamplesPerSecond);
+ double value = (double)Payload.Length / (double)bytesPerSec;
+
+ // Ready
+ return new TimeSpan(0, 0, (int)value);
+ }
+ }
+ }
+}
diff --git a/AudioWaveOutClassLibrary/Win32.cs b/AudioWaveOutClassLibrary/Win32.cs
new file mode 100644
index 0000000..3ac08dd
--- /dev/null
+++ b/AudioWaveOutClassLibrary/Win32.cs
@@ -0,0 +1,554 @@
+//----------------------------------------------------------------------------
+// File Name: Win32.cs
+//
+// Description:
+// Win32 provides an audio handling using standart windows API WaveOut
+// define necessary Win32 API Calls and classes
+//
+// Author(s):
+// Egor Waken
+//
+// History:
+// 30 Apr 2024 Egor Waken Created.
+// 04 May 2024 Egor Waken Added Necessary Calls and classes.
+//
+// License:
+// BSD 3-Clause "New" or "Revised" License, see included LICENSE.md file.
+//----------------------------------------------------------------------------
+
+using System.Runtime.InteropServices;
+using System.Text;
+
+namespace AudioWaveOut
+{
+ // Win32 Class
+ unsafe public class Win32
+ {
+ // Const Data
+ public const int WAVE_MAPPER = -1;
+ public const int WT_EXECUTEDEFAULT = 0x00000000;
+ public const int WT_EXECUTEINIOTHREAD = 0x00000001;
+ public const int WT_EXECUTEINTIMERTHREAD = 0x00000020;
+ public const int WT_EXECUTEINPERSISTENTTHREAD = 0x00000080;
+ public const int TIME_ONESHOT = 0;
+ public const int TIME_PERIODIC = 1;
+
+ // Events
+ public delegate void DelegateWaveOutProc(IntPtr hWaveOut, WOM_Messages msg, IntPtr dwInstance, Win32.WAVEHDR* pWaveHdr, IntPtr lParam);
+ public delegate void DelegateWaveInProc(IntPtr hWaveIn, WIM_Messages msg, IntPtr dwInstance, Win32.WAVEHDR* pWaveHdr, IntPtr lParam);
+ public delegate void DelegateTimerProc(IntPtr lpParameter, bool TimerOrWaitFired);
+ public delegate void TimerEventHandler(UInt32 id, UInt32 msg, ref UInt32 userCtx, UInt32 rsv1, UInt32 rsv2);
+
+ // Constructor
+ public Win32()
+ {
+ //RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
+
+ }
+
+ // This struct provides windows native waveOut implementation.
+ [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Auto)]
+ public struct WAVEOUTCAPS
+ {
+ ///
+ /// Manufacturer identifier for the device driver for the device.
+ ///
+ public short wMid;
+ ///
+ /// Product identifier for the device.
+ ///
+ public short wPid;
+ ///
+ /// Version number of the device driver for the device.
+ ///
+ public int vDriverVersion;
+ ///
+ /// Product name in a null-terminated string.
+ ///
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
+ public string szPname;
+ ///
+ /// Standard formats that are supported.
+ ///
+ public uint dwFormats;
+ ///
+ /// Number specifying whether the device supports mono (1) or stereo (2) output.
+ ///
+ public short wChannels;
+ ///
+ /// Packing.
+ ///
+ public short wReserved;
+ ///
+ /// Optional functionality supported by the device.
+ ///
+ public int dwSupport;
+ }
+
+ // Describes the capabilities of the audio input device.
+ [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Auto)]
+ public struct WAVEINCAPS
+ {
+ public short wMid;
+ public short wPid;
+ public int vDriverVersion;
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
+ public string szPname;
+ public uint dwFormats;
+ public short wChannels;
+ public short wReserved;
+ public int dwSupport;
+ }
+
+ // This Struct represents WAVEFORMATEX structure.
+ [StructLayout(LayoutKind.Sequential)]
+ public struct WAVEFORMATEX
+ {
+ public ushort wFormatTag;
+ ///
+ /// Number of channels in the waveform-audio data. Monaural data uses one channel and stereo data
+ /// uses two channels.
+ ///
+ public ushort nChannels;
+ ///
+ /// Sample rate, in samples per second (hertz). If wFormatTag is WAVE_FORMAT_PCM, then common
+ /// values for nSamplesPerSec are 8.0 kHz, 11.025 kHz, 22.05 kHz, and 44.1 kHz.
+ ///
+ public uint nSamplesPerSec;
+ ///
+ /// Required average data-transfer rate, in bytes per second, for the format tag. If wFormatTag
+ /// is WAVE_FORMAT_PCM, nAvgBytesPerSec should be equal to the product of nSamplesPerSec and nBlockAlign.
+ ///
+ public uint nAvgBytesPerSec;
+ ///
+ /// Block alignment, in bytes. The block alignment is the minimum atomic unit of data for the wFormatTag
+ /// format type. If wFormatTag is WAVE_FORMAT_PCM or WAVE_FORMAT_EXTENSIBLE, nBlockAlign must be equal
+ /// to the product of nChannels and wBitsPerSample divided by 8 (bits per byte).
+ ///
+ public ushort nBlockAlign;
+ ///
+ /// Bits per sample for the wFormatTag format type. If wFormatTag is WAVE_FORMAT_PCM, then
+ /// wBitsPerSample should be equal to 8 or 16.
+ ///
+ public ushort wBitsPerSample;
+ ///
+ /// Size, in bytes, of extra format information appended to the end of the WAVEFORMATEX structure.
+ ///
+ public ushort cbSize;
+ }
+
+
+ // This Struct represents MMRESULT structure.
+ public enum MMRESULT : uint
+ {
+ MMSYSERR_NOERROR = 0,
+ MMSYSERR_ERROR = 1,
+ MMSYSERR_BADDEVICEID = 2,
+ MMSYSERR_NOTENABLED = 3,
+ MMSYSERR_ALLOCATED = 4,
+ MMSYSERR_INVALHANDLE = 5,
+ MMSYSERR_NODRIVER = 6,
+ MMSYSERR_NOMEM = 7,
+ MMSYSERR_NOTSUPPORTED = 8,
+ MMSYSERR_BADERRNUM = 9,
+ MMSYSERR_INVALFLAG = 10,
+ MMSYSERR_INVALPARAM = 11,
+ MMSYSERR_HANDLEBUSY = 12,
+ MMSYSERR_INVALIDALIAS = 13,
+ MMSYSERR_BADDB = 14,
+ MMSYSERR_KEYNOTFOUND = 15,
+ MMSYSERR_READERROR = 16,
+ MMSYSERR_WRITEERROR = 17,
+ MMSYSERR_DELETEERROR = 18,
+ MMSYSERR_VALNOTFOUND = 19,
+ MMSYSERR_NODRIVERCB = 20,
+ WAVERR_BADFORMAT = 32,
+ WAVERR_STILLPLAYING = 33,
+ WAVERR_UNPREPARED = 34
+ }
+
+ // This struct provides windows native waveOut Errors.
+ public enum MMSYSERR : uint
+ {
+ // Add MMSYSERR's here!
+
+ MMSYSERR_BASE = 0x0000,
+ MMSYSERR_NOERROR = 0x0000
+ }
+
+ [Flags]
+ public enum WaveHdrFlags : uint
+ {
+ WHDR_DONE = 1,
+ WHDR_PREPARED = 2,
+ WHDR_BEGINLOOP = 4,
+ WHDR_ENDLOOP = 8,
+ WHDR_INQUEUE = 16
+ }
+
+ [Flags]
+ public enum WaveProcFlags : int
+ {
+ CALLBACK_NULL = 0,
+ CALLBACK_FUNCTION = 0x30000,
+ CALLBACK_EVENT = 0x50000,
+ CALLBACK_WINDOW = 0x10000,
+ CALLBACK_THREAD = 0x20000,
+ WAVE_FORMAT_QUERY = 1,
+ WAVE_MAPPED = 4,
+ WAVE_FORMAT_DIRECT = 8
+ }
+
+ [Flags]
+ public enum HRESULT : long
+ {
+ S_OK = 0L,
+ S_FALSE = 1L
+ }
+
+ [Flags]
+ public enum WaveFormatFlags : int
+ {
+ WAVE_FORMAT_PCM = 0x0001
+ }
+
+ // This Struct represents WAVEHDR structure.
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
+ public struct WAVEHDR
+ {
+ ///
+ /// Long pointer to the address of the waveform buffer.
+ ///
+ public IntPtr lpData; // pointer to locked data buffer
+ ///
+ /// Specifies the length, in bytes, of the buffer.
+ ///
+ public uint dwBufferLength; // length of data buffer
+ ///
+ /// When the header is used in input, this member specifies how much data is in the buffer.
+ /// When the header is used in output, this member specifies the number of bytes played from the buffer.
+ ///
+ public uint dwBytesRecorded; // used for input only
+ ///
+ /// Specifies user data.
+ ///
+ public IntPtr dwUser; // for client's use
+ ///
+ /// Specifies information about the buffer.
+ ///
+ public WaveHdrFlags dwFlags; // assorted flags (see defines)
+ ///
+ /// Specifies the number of times to play the loop.
+ ///
+ public uint dwLoops; // loop control counter
+ ///
+ /// Reserved. This member is used within the audio driver to maintain a first-in, first-out linked list of headers awaiting playback.
+ ///
+ public IntPtr lpNext; // PWaveHdr, reserved for driver
+ ///
+ /// Reserved.
+ ///
+ public IntPtr reserved; // reserved for driver
+ }
+
+ // TimeCaps
+ [StructLayout(LayoutKind.Sequential)]
+ public struct TimeCaps
+ {
+ public UInt32 wPeriodMin;
+ public UInt32 wPeriodMax;
+ };
+
+ // WOM_Messages
+ public enum WOM_Messages : int
+ {
+ OPEN = 0x03BB,
+ CLOSE = 0x03BC,
+ DONE = 0x03BD
+ }
+
+ // WIM_Messages
+ public enum WIM_Messages : int
+ {
+ OPEN = 0x03BE,
+ CLOSE = 0x03BF,
+ DATA = 0x03C0
+ }
+
+ // Writes the number of cycles of the Performance Counter to a variable lpPerformanceCount
+ /// Performance Counter
+ [DllImport("Kernel32.dll", EntryPoint = "QueryPerformanceCounter")]
+ public static extern bool QueryPerformanceCounter(out long lpPerformanceCount);
+
+
+ // Writes the number of cycles of the Performance Frequency to a variable lpFrequency
+ /// Performance Frequency
+ [DllImport("Kernel32.dll", EntryPoint = "QueryPerformanceFrequency")]
+ public static extern bool QueryPerformanceFrequency(out long lpFrequency);
+
+
+ // The timeSetEvent function fires the specified media timer event.
+ // The media timer runs in its own thread. Once an event is fired, it calls the
+ // specified callback function or sets or causes the specified event to fire.
+ /// delay in ms
+ /// resolution(0 is the maximum available for a given PC), set in ms.
+ /// pointer to a procedure that will be called after a specified time interval has elapsed
+ /// This parameter is passed to the lpTimeProc handler and can be used at the discretion of the programmer
+ /// timer type.Two meanings possible
+ [DllImport("winmm.dll", SetLastError = true, EntryPoint = "timeSetEvent")]
+ public static extern UInt32 TimeSetEvent(UInt32 msDelay, UInt32 msResolution, TimerEventHandler handler, ref UInt32 userCtx, UInt32 eventType);
+
+
+ // After finishing working with the timer, you need to delete it using the timeKillEvent function:
+ /// number assigned to the timer when it was created using timeSetEvent
+ [DllImport("winmm.dll", SetLastError = true, EntryPoint = "timeKillEvent")]
+ public static extern UInt32 TimeKillEvent(UInt32 timerId);
+
+
+ // Create Timer Queue
+ [DllImport("kernel32.dll", EntryPoint = "CreateTimerQueue")]
+ public static extern IntPtr CreateTimerQueue();
+
+
+ // Delete Timer Queue
+ /// number assigned to the Timer Queue when it was created using CreateTimerQueue
+ [DllImport("kernel32.dll", EntryPoint = "DeleteTimerQueue")]
+ public static extern bool DeleteTimerQueue(IntPtr TimerQueue);
+
+
+ // Create Timer Queue Timer
+ /// Pointer to a buffer that receives the timer queue's timer handle when returning
+ /// Handle to the timer queue. This handle is returned by the CreateTimerQueue function.
+ /// Pointer to an application-defined function to execute when the timer expires
+ /// The value of a single parameter that will be passed to the callback function.
+ /// The time in milliseconds relative to the current time that must pass before the first timer signal.
+ /// Timer period in milliseconds. If this parameter is zero, the timer receives the signal once
+ /// Timer Flags
+ [DllImport("kernel32.dll", EntryPoint = "CreateTimerQueueTimer")]
+ public static extern bool CreateTimerQueueTimer(out IntPtr phNewTimer, IntPtr TimerQueue, DelegateTimerProc Callback, IntPtr Parameter, uint DueTime, uint Period, uint Flags);
+
+
+ // Removes a timer from the timer queue and optionally waits for the current timer callbacks to complete before deleting the timer.
+ /// Handle to the timer queue. This handle is returned by the CreateTimerQueue function.
+ /// Queue timer handle. This handle is returned by the CreateTimerQueueTimer function
+ /// Handle to an event object that will signal when the system has canceled the timer and all callback functions have completed
+ [DllImport("kernel32.dll")]
+ public static extern bool DeleteTimerQueueTimer(IntPtr TimerQueue, IntPtr Timer, IntPtr CompletionEvent);
+
+
+ // function queries the timer device to determine its resolution.
+ ///
+ /// A pointer to a structure.
+ /// This structure is filled with information about the resolution of the timer device.
+ ///
+ ///
+ /// The size, in bytes, of the structure.
+ ///
+ ///
+ /// Returns if successful or an error code otherwise.
+ /// Possible error codes include the following.
+ /// : General error code.
+ /// : The parameter is ,
+ /// or the parameter is invalid, or some other error occurred.
+ ///
+ [DllImport("winmm.dll", SetLastError = true, EntryPoint = "timeGetDevCaps")]
+ public static extern MMRESULT TimeGetDevCaps(ref TimeCaps timeCaps, UInt32 sizeTimeCaps);
+
+
+ // function requests a minimum resolution for periodic timers
+ /// Minimum timer resolution, in milliseconds, for the application or device driver. A lower value specifies a higher (more accurate) resolution.
+ ///
+ /// Returns if successful or
+ /// if the resolution specified in is out of range.
+ ///
+ [DllImport("winmm.dll", SetLastError = true, EntryPoint = "timeBeginPeriod")]
+ public static extern MMRESULT TimeBeginPeriod(UInt32 uPeriod);
+
+
+ // function clears a previously set minimum timer resolution.
+ ///
+ /// Minimum timer resolution specified in the previous call to the function.
+ ///
+ ///
+ /// Returns if successful or
+ /// if the resolution specified in is out of range.
+ ///
+ [DllImport("winmm.dll", SetLastError = true, EntryPoint = "timeEndPeriod")]
+ public static extern MMRESULT TimeEndPeriod(UInt32 uPeriod);
+
+
+ // The waveOutOpen function opens the given waveform-audio output device for playback.
+ /// Pointer to a buffer that receives a handle identifying the open waveform-audio output device. Use the handle to identify the device when calling other waveform-audio output functions. This parameter might be NULL if the WAVE_FORMAT_QUERY flag is specified for fdwOpen.
+ /// Identifier of the waveform-audio output device to open. It can be either a device identifier or a handle of an open waveform-audio input device.
+ /// Pointer to a WAVEFORMATEX structure that identifies the format of the waveform-audio data to be sent to the device. You can free this structure immediately after passing it to waveOutOpen.
+ /// Pointer to a fixed callback function, an event handle, a handle to a window, or the identifier of a thread to be called during waveform-audio playback to process messages related to the progress of the playback. If no callback function is required, this value can be zero.
+ /// User-instance data passed to the callback mechanism.
+ /// Flags for opening the device.
+ /// Returns value of MMSYSERR.
+ [DllImport("winmm.dll", SetLastError = true, CharSet = CharSet.Auto)]
+ public static extern MMRESULT waveOutOpen(ref IntPtr hWaveOut, int uDeviceID, ref WAVEFORMATEX lpFormat, DelegateWaveOutProc dwCallBack, int dwInstance, int dwFlags);
+
+
+ // The waveInOpen function opens the given waveform-audio input device for recording.
+ /// Pointer to a buffer that receives a handle identifying the open waveform-audio input device.
+ /// Identifier of the waveform-audio input device to open. It can be either a device identifier or a handle of an open waveform-audio input device. You can use the following flag instead of a device identifier.
+ /// Pointer to a WAVEFORMATEX structure that identifies the desired format for recording waveform-audio data. You can free this structure immediately after waveInOpen returns.
+ /// Pointer to a fixed callback function, an event handle, a handle to a window,
+ /// or the identifier of a thread to be called during waveform-audio recording to process messages related
+ /// to the progress of recording. If no callback function is required, this value can be zero.
+ /// For more information on the callback function, see waveInProc.
+ /// User-instance data passed to the callback mechanism.
+ /// Flags for opening the device.
+ /// Returns value of MMSYSERR.
+ [DllImport("winmm.dll")]
+ public static extern MMRESULT waveInOpen(ref IntPtr hWaveIn, int deviceId, ref WAVEFORMATEX wfx, DelegateWaveInProc dwCallBack, int dwInstance, int dwFlags);
+
+
+ [DllImport("winmm.dll", SetLastError = true, EntryPoint = "waveInOpen")]
+ public static extern MMRESULT waveInOpen2(ref IntPtr hWaveIn, int deviceId, ref WAVEFORMATEX wfx, Microsoft.Win32.SafeHandles.SafeWaitHandle callBackEvent, int dwInstance, int dwFlags);
+
+
+ // Starts input on the given waveform-audio input device.
+ /// Handle to the waveform-audio input device.
+ /// Returns value of MMSYSERR.
+ [DllImport("winmm.dll", SetLastError = true)]
+ public static extern MMRESULT waveInStart(IntPtr hWaveIn);
+
+
+ // Queries a specified waveform device to determine its capabilities.
+ /// Identifier of the waveform-audio input device. It can be either a device identifier or a Handle to an open waveform-audio output device.
+ /// Pointer to a WAVEOUTCAPS structure to be filled with information about the capabilities of the device.
+ /// Size, in bytes, of the WAVEOUTCAPS structure.
+ /// Returns value of MMSYSERR.
+ [DllImport("winmm.dll", SetLastError = true, CharSet = CharSet.Auto)]
+ public static extern uint waveInGetDevCaps(int index, ref WAVEINCAPS pwic, int cbwic);
+
+
+ // Get the waveInGetNumDevs function returns the number of waveform-audio input devices present in the system.
+ /// Returns the waveInGetNumDevs function returns the number of waveform-audio input devices present in the system.
+ ///
+ [DllImport("winmm.dll", SetLastError = true)]
+ public static extern uint waveInGetNumDevs();
+
+
+ // Queries a specified waveform device to determine its capabilities.
+ /// Identifier of the waveform-audio output device. It can be either a device identifier or a Handle to an open waveform-audio output device.
+ /// Pointer to a WAVEOUTCAPS structure to be filled with information about the capabilities of the device.
+ /// Size, in bytes, of the WAVEOUTCAPS structure.
+ /// Returns value of MMSYSERR.
+ [DllImport("winmm.dll", SetLastError = true, CharSet = CharSet.Auto)]
+ public static extern uint waveOutGetDevCaps(int index, ref WAVEOUTCAPS pwoc, int cbwoc);
+
+
+ // Retrieves the number of waveform output devices present in the system.
+ /// The number of devices indicates success. Zero indicates that no devices are present or that an error occurred.
+ [DllImport("winmm.dll", SetLastError = true)]
+ public static extern uint waveOutGetNumDevs();
+
+
+ // Sends a data block to the specified waveform output device.
+ /// Handle to the waveform-audio output device.
+ /// Pointer to a WAVEHDR structure containing information about the data block.
+ /// Size, in bytes, of the WAVEHDR structure.
+ /// Returns value of MMSYSERR.
+ [DllImport("winmm.dll", SetLastError = true, CharSet = CharSet.Auto)]
+ public static extern MMRESULT waveOutWrite(IntPtr hWaveOut, WAVEHDR* pwh, int cbwh);
+
+
+ // Prepares a waveform data block for playback.
+ /// Handle to the waveform-audio output device.
+ /// Pointer to a WAVEHDR structure that identifies the data block to be prepared. The buffer's base address must be aligned with the respect to the sample size.
+ /// Size, in bytes, of the WAVEHDR structure.
+ /// Returns value of MMSYSERR.
+ [DllImport("winmm.dll", SetLastError = true, EntryPoint = "waveOutPrepareHeader", CharSet = CharSet.Auto)]
+ public static extern MMRESULT waveOutPrepareHeader(IntPtr hWaveOut, WAVEHDR* lpWaveOutHdr, int uSize);
+
+
+ // Cleans up the preparation performed by waveOutPrepareHeader.
+ /// Handle to the waveform-audio output device.
+ /// Pointer to a WAVEHDR structure identifying the data block to be cleaned up.
+ /// Size, in bytes, of the WAVEHDR structure.
+ /// Returns value of MMSYSERR.
+ [DllImport("winmm.dll", SetLastError = true, EntryPoint = "waveOutUnprepareHeader", CharSet = CharSet.Auto)]
+ public static extern MMRESULT waveOutUnprepareHeader(IntPtr hWaveOut, WAVEHDR* lpWaveOutHdr, int uSize);
+
+
+ // Stops input on the given waveform-audio input device.
+ /// Handle to the waveform-audio input device.
+ /// Returns value of MMSYSERR.
+ [DllImport("winmm.dll", EntryPoint = "waveInStop", SetLastError = true)]
+ public static extern MMRESULT waveInStop(IntPtr hWaveIn);
+
+
+ // Stops input on a specified waveform output device and resets the current position to 0.
+ /// Handle to the waveform-audio input device.
+ /// Returns value of MMSYSERR.
+ [DllImport("winmm.dll", EntryPoint = "waveInReset", SetLastError = true)]
+ public static extern MMRESULT waveInReset(IntPtr hWaveIn);
+
+
+ // Stops playback on a specified waveform output device and resets the current position to 0.
+ /// Handle to the waveform-audio output device.
+ /// Returns value of MMSYSERR.
+ [DllImport("winmm.dll", EntryPoint = "waveOutReset", SetLastError = true)]
+ public static extern MMRESULT waveOutReset(IntPtr hWaveOut);
+
+
+ // Prepares a waveform data block for recording.
+ /// Handle to the waveform-audio input device.
+ /// Pointer to a WAVEHDR structure that identifies the data block to be prepared.
+ /// The buffer's base address must be aligned with the respect to the sample size.
+ /// Size, in bytes, of the WAVEHDR structure.
+ /// Returns value of MMSYSERR.
+ [DllImport("winmm.dll", SetLastError = true)]
+ public static extern MMRESULT waveInPrepareHeader(IntPtr hWaveIn, WAVEHDR* pwh, int cbwh);
+
+
+ // Cleans up the preparation performed by waveInPrepareHeader.
+ /// Handle to the waveform-audio input device.
+ /// Pointer to a WAVEHDR structure identifying the data block to be cleaned up.
+ /// Size, in bytes, of the WAVEHDR structure.
+ /// Returns value of MMSYSERR.
+ [DllImport("winmm.dll", SetLastError = true)]
+ public static extern MMRESULT waveInUnprepareHeader(IntPtr hWaveIn, WAVEHDR* pwh, int cbwh);
+
+
+ // The waveInAddBuffer function sends an input buffer to the given waveform-audio input device. When the buffer is filled, the application is notified.
+ /// Handle to the waveform-audio input device.
+ /// Pointer to a WAVEHDR structure that identifies the buffer.
+ /// Size, in bytes, of the WAVEHDR structure.
+ /// Returns value of MMSYSERR.
+ [DllImport("winmm.dll", EntryPoint = "waveInAddBuffer", SetLastError = true)]
+ public static extern MMRESULT waveInAddBuffer(IntPtr hWaveIn, WAVEHDR* pwh, int cbwh);
+
+
+ // Closes the specified waveform input device.
+ /// Handle to the waveform-audio input device. If the function succeeds, the handle is no longer valid after this call.
+ /// Returns value of MMSYSERR.
+ [DllImport("winmm.dll", SetLastError = true)]
+ public static extern Win32.MMRESULT waveInClose(IntPtr hWaveIn);
+
+
+ // Closes the specified waveform output device.
+ /// Handle to the waveform-audio output device. If the function succeeds, the handle is no longer valid after this call.
+ /// Returns value of MMSYSERR.
+ [DllImport("winmm.dll", SetLastError = true, CharSet = CharSet.Auto)]
+ public static extern Win32.MMRESULT waveOutClose(IntPtr hWaveOut);
+
+
+ // Pauses playback on a specified waveform output device.
+ /// Handle to the waveform-audio output device.
+ /// Returns value of MMSYSERR.
+ [DllImport("winmm.dll")]
+ public static extern Win32.MMRESULT waveOutPause(IntPtr hWaveOut);
+
+
+ // Restarts a paused waveform output device.
+ /// Handle to the waveform-audio output device.
+ /// Returns value of MMSYSERR.
+ [DllImport("winmm.dll", EntryPoint = "waveOutRestart", SetLastError = true)]
+ public static extern Win32.MMRESULT waveOutRestart(IntPtr hWaveOut);
+
+
+ }
+}
\ No newline at end of file
diff --git a/AudioWaveOutClassLibrary/WinSound.cs b/AudioWaveOutClassLibrary/WinSound.cs
new file mode 100644
index 0000000..1b85c59
--- /dev/null
+++ b/AudioWaveOutClassLibrary/WinSound.cs
@@ -0,0 +1,144 @@
+//----------------------------------------------------------------------------
+// File Name: Win32.cs
+//
+// Description:
+// WinSound provides an audio WaveIn Devices using API Calls, Show All Playback
+// Names and WaveOut Devices By Name
+//
+// Author(s):
+// Egor Waken
+//
+// History:
+// 05 May 2024 Egor Waken Created.
+//
+// License:
+// BSD 3-Clause "New" or "Revised" License, see included LICENSE.md file.
+//----------------------------------------------------------------------------
+
+using System.Runtime.InteropServices;
+using System.Text;
+
+namespace AudioWaveOut
+{
+ // LockerClass
+ class LockerClass
+ {
+
+ }
+
+ // WinSound
+ public class WinSound
+ {
+ // Constructor
+ public WinSound()
+ {
+
+ }
+
+ // Show All Playback Names
+ public static List GetPlaybackNames()
+ {
+ // Result
+ List list = new List();
+ Win32.WAVEOUTCAPS waveOutCap = new Win32.WAVEOUTCAPS();
+
+ // Number of devices
+ uint num = Win32.waveOutGetNumDevs();
+ for (int i = 0; i < num; i++)
+ {
+ uint hr = Win32.waveOutGetDevCaps(i, ref waveOutCap, Marshal.SizeOf(typeof(Win32.WAVEOUTCAPS)));
+ if (hr == (int)Win32.HRESULT.S_OK)
+ {
+ list.Add(waveOutCap.szPname);
+ }
+ }
+
+ return list;
+ }
+
+ // View all recording devices
+ public static List GetRecordingNames()
+ {
+ // Result
+ List list = new List();
+ Win32.WAVEINCAPS waveInCap = new Win32.WAVEINCAPS();
+
+ // Number of devices
+ uint num = Win32.waveInGetNumDevs();
+ for (int i = 0; i < num; i++)
+ {
+ uint hr = Win32.waveInGetDevCaps(i, ref waveInCap, Marshal.SizeOf(typeof(Win32.WAVEINCAPS)));
+ if (hr == (int)Win32.HRESULT.S_OK)
+ {
+ list.Add(waveInCap.szPname);
+ }
+ }
+
+ return list;
+ }
+
+ // GetWaveInDeviceIdByName
+ public static int GetWaveInDeviceIdByName(string name)
+ {
+ // Number of devices
+ uint num = Win32.waveInGetNumDevs();
+
+ // WaveIn structure
+ Win32.WAVEINCAPS caps = new Win32.WAVEINCAPS();
+ for (int i = 0; i < num; i++)
+ {
+ Win32.HRESULT hr = (Win32.HRESULT)Win32.waveInGetDevCaps(i, ref caps, Marshal.SizeOf(typeof(Win32.WAVEINCAPS)));
+ if (hr == Win32.HRESULT.S_OK)
+ {
+ if (caps.szPname == name)
+ {
+ // Found
+ return i;
+ }
+ }
+ }
+
+ // Not found
+ return Win32.WAVE_MAPPER;
+ }
+
+ // GetWaveOutDeviceIdByName
+ public static int GetWaveOutDeviceIdByName(string name)
+ {
+ // Number of devices
+ uint num = Win32.waveOutGetNumDevs();
+
+ // WaveIn structure
+ Win32.WAVEOUTCAPS caps = new Win32.WAVEOUTCAPS();
+ for (int i = 0; i < num; i++)
+ {
+ Win32.HRESULT hr = (Win32.HRESULT)Win32.waveOutGetDevCaps(i, ref caps, Marshal.SizeOf(typeof(Win32.WAVEOUTCAPS)));
+ if (hr == Win32.HRESULT.S_OK)
+ {
+ if (caps.szPname == name)
+ {
+ // Found
+ return i;
+ }
+ }
+ }
+
+ // Not found
+ return Win32.WAVE_MAPPER;
+ }
+
+ // Flag To String
+ public static String FlagToString(Win32.WaveHdrFlags flag)
+ {
+ StringBuilder sb = new StringBuilder();
+
+ if ((flag & Win32.WaveHdrFlags.WHDR_PREPARED) > 0) sb.Append("PREPARED ");
+ if ((flag & Win32.WaveHdrFlags.WHDR_BEGINLOOP) > 0) sb.Append("BEGINLOOP ");
+ if ((flag & Win32.WaveHdrFlags.WHDR_ENDLOOP) > 0) sb.Append("ENDLOOP ");
+ if ((flag & Win32.WaveHdrFlags.WHDR_INQUEUE) > 0) sb.Append("INQUEUE ");
+ if ((flag & Win32.WaveHdrFlags.WHDR_DONE) > 0) sb.Append("DONE ");
+
+ return sb.ToString();
+ }
+ }
+}
diff --git a/AudioWaveOutClassLibrary/bin/Debug/net8.0/AudioWaveOutClassLibrary.deps.json b/AudioWaveOutClassLibrary/bin/Debug/net8.0/AudioWaveOutClassLibrary.deps.json
new file mode 100644
index 0000000..deefda0
--- /dev/null
+++ b/AudioWaveOutClassLibrary/bin/Debug/net8.0/AudioWaveOutClassLibrary.deps.json
@@ -0,0 +1,23 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v8.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v8.0": {
+ "AudioWaveOutClassLibrary/1.0.0": {
+ "runtime": {
+ "AudioWaveOutClassLibrary.dll": {}
+ }
+ }
+ }
+ },
+ "libraries": {
+ "AudioWaveOutClassLibrary/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/AudioWaveOutClassLibrary/bin/Debug/net8.0/AudioWaveOutClassLibrary.dll b/AudioWaveOutClassLibrary/bin/Debug/net8.0/AudioWaveOutClassLibrary.dll
new file mode 100644
index 0000000..a6c4926
Binary files /dev/null and b/AudioWaveOutClassLibrary/bin/Debug/net8.0/AudioWaveOutClassLibrary.dll differ
diff --git a/AudioWaveOutClassLibrary/bin/Debug/net8.0/AudioWaveOutClassLibrary.pdb b/AudioWaveOutClassLibrary/bin/Debug/net8.0/AudioWaveOutClassLibrary.pdb
new file mode 100644
index 0000000..004291f
Binary files /dev/null and b/AudioWaveOutClassLibrary/bin/Debug/net8.0/AudioWaveOutClassLibrary.pdb differ
diff --git a/AudioWaveOutClassLibrary/obj/AudioWaveOutClassLibrary.csproj.nuget.dgspec.json b/AudioWaveOutClassLibrary/obj/AudioWaveOutClassLibrary.csproj.nuget.dgspec.json
new file mode 100644
index 0000000..0b57a11
--- /dev/null
+++ b/AudioWaveOutClassLibrary/obj/AudioWaveOutClassLibrary.csproj.nuget.dgspec.json
@@ -0,0 +1,67 @@
+{
+ "format": 1,
+ "restore": {
+ "C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\AudioWaveOutClassLibrary\\AudioWaveOutClassLibrary.csproj": {}
+ },
+ "projects": {
+ "C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\AudioWaveOutClassLibrary\\AudioWaveOutClassLibrary.csproj": {
+ "version": "1.0.0",
+ "restore": {
+ "projectUniqueName": "C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\AudioWaveOutClassLibrary\\AudioWaveOutClassLibrary.csproj",
+ "projectName": "AudioWaveOutClassLibrary",
+ "projectPath": "C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\AudioWaveOutClassLibrary\\AudioWaveOutClassLibrary.csproj",
+ "packagesPath": "C:\\Users\\38096\\.nuget\\packages\\",
+ "outputPath": "C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\AudioWaveOutClassLibrary\\obj\\",
+ "projectStyle": "PackageReference",
+ "fallbackFolders": [
+ "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
+ ],
+ "configFilePaths": [
+ "C:\\Users\\38096\\AppData\\Roaming\\NuGet\\NuGet.Config",
+ "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
+ "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
+ ],
+ "originalTargetFrameworks": [
+ "net8.0"
+ ],
+ "sources": {
+ "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
+ "https://api.nuget.org/v3/index.json": {}
+ },
+ "frameworks": {
+ "net8.0": {
+ "targetAlias": "net8.0",
+ "projectReferences": {}
+ }
+ },
+ "warningProperties": {
+ "warnAsError": [
+ "NU1605"
+ ]
+ }
+ },
+ "frameworks": {
+ "net8.0": {
+ "targetAlias": "net8.0",
+ "imports": [
+ "net461",
+ "net462",
+ "net47",
+ "net471",
+ "net472",
+ "net48",
+ "net481"
+ ],
+ "assetTargetFallback": true,
+ "warn": true,
+ "frameworkReferences": {
+ "Microsoft.NETCore.App": {
+ "privateAssets": "all"
+ }
+ },
+ "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.100/PortableRuntimeIdentifierGraph.json"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/AudioWaveOutClassLibrary/obj/AudioWaveOutClassLibrary.csproj.nuget.g.props b/AudioWaveOutClassLibrary/obj/AudioWaveOutClassLibrary.csproj.nuget.g.props
new file mode 100644
index 0000000..a4c1339
--- /dev/null
+++ b/AudioWaveOutClassLibrary/obj/AudioWaveOutClassLibrary.csproj.nuget.g.props
@@ -0,0 +1,16 @@
+
+
+
+ True
+ NuGet
+ $(MSBuildThisFileDirectory)project.assets.json
+ $(UserProfile)\.nuget\packages\
+ C:\Users\38096\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages
+ PackageReference
+ 6.8.0
+
+
+
+
+
+
\ No newline at end of file
diff --git a/AudioWaveOutClassLibrary/obj/AudioWaveOutClassLibrary.csproj.nuget.g.targets b/AudioWaveOutClassLibrary/obj/AudioWaveOutClassLibrary.csproj.nuget.g.targets
new file mode 100644
index 0000000..3dc06ef
--- /dev/null
+++ b/AudioWaveOutClassLibrary/obj/AudioWaveOutClassLibrary.csproj.nuget.g.targets
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/AudioWaveOutClassLibrary/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs b/AudioWaveOutClassLibrary/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs
new file mode 100644
index 0000000..2217181
--- /dev/null
+++ b/AudioWaveOutClassLibrary/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs
@@ -0,0 +1,4 @@
+//
+using System;
+using System.Reflection;
+[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")]
diff --git a/AudioWaveOutClassLibrary/obj/Debug/net8.0/AudioWaveOutClassLibrary.AssemblyInfo.cs b/AudioWaveOutClassLibrary/obj/Debug/net8.0/AudioWaveOutClassLibrary.AssemblyInfo.cs
new file mode 100644
index 0000000..014a40d
--- /dev/null
+++ b/AudioWaveOutClassLibrary/obj/Debug/net8.0/AudioWaveOutClassLibrary.AssemblyInfo.cs
@@ -0,0 +1,23 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+using System;
+using System.Reflection;
+
+[assembly: System.Reflection.AssemblyCompanyAttribute("AudioWaveOutClassLibrary")]
+[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
+[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
+[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
+[assembly: System.Reflection.AssemblyProductAttribute("AudioWaveOutClassLibrary")]
+[assembly: System.Reflection.AssemblyTitleAttribute("AudioWaveOutClassLibrary")]
+[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
+
+// Generated by the MSBuild WriteCodeFragment class.
+
diff --git a/AudioWaveOutClassLibrary/obj/Debug/net8.0/AudioWaveOutClassLibrary.AssemblyInfoInputs.cache b/AudioWaveOutClassLibrary/obj/Debug/net8.0/AudioWaveOutClassLibrary.AssemblyInfoInputs.cache
new file mode 100644
index 0000000..5cd7648
--- /dev/null
+++ b/AudioWaveOutClassLibrary/obj/Debug/net8.0/AudioWaveOutClassLibrary.AssemblyInfoInputs.cache
@@ -0,0 +1 @@
+fbd9a9b629e2e5f2b967f52e81f02c6be85a33a28dade1d67c5a324bc0958d1c
diff --git a/AudioWaveOutClassLibrary/obj/Debug/net8.0/AudioWaveOutClassLibrary.GeneratedMSBuildEditorConfig.editorconfig b/AudioWaveOutClassLibrary/obj/Debug/net8.0/AudioWaveOutClassLibrary.GeneratedMSBuildEditorConfig.editorconfig
new file mode 100644
index 0000000..9372234
--- /dev/null
+++ b/AudioWaveOutClassLibrary/obj/Debug/net8.0/AudioWaveOutClassLibrary.GeneratedMSBuildEditorConfig.editorconfig
@@ -0,0 +1,13 @@
+is_global = true
+build_property.TargetFramework = net8.0
+build_property.TargetPlatformMinVersion =
+build_property.UsingMicrosoftNETSdkWeb =
+build_property.ProjectTypeGuids =
+build_property.InvariantGlobalization =
+build_property.PlatformNeutralAssembly =
+build_property.EnforceExtendedAnalyzerRules =
+build_property._SupportedPlatformList = Linux,macOS,Windows
+build_property.RootNamespace = AudioWaveOutClassLibrary
+build_property.ProjectDir = C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutClassLibrary\
+build_property.EnableComHosting =
+build_property.EnableGeneratedComInterfaceComImportInterop =
diff --git a/AudioWaveOutClassLibrary/obj/Debug/net8.0/AudioWaveOutClassLibrary.GlobalUsings.g.cs b/AudioWaveOutClassLibrary/obj/Debug/net8.0/AudioWaveOutClassLibrary.GlobalUsings.g.cs
new file mode 100644
index 0000000..8578f3d
--- /dev/null
+++ b/AudioWaveOutClassLibrary/obj/Debug/net8.0/AudioWaveOutClassLibrary.GlobalUsings.g.cs
@@ -0,0 +1,8 @@
+//
+global using global::System;
+global using global::System.Collections.Generic;
+global using global::System.IO;
+global using global::System.Linq;
+global using global::System.Net.Http;
+global using global::System.Threading;
+global using global::System.Threading.Tasks;
diff --git a/AudioWaveOutClassLibrary/obj/Debug/net8.0/AudioWaveOutClassLibrary.assets.cache b/AudioWaveOutClassLibrary/obj/Debug/net8.0/AudioWaveOutClassLibrary.assets.cache
new file mode 100644
index 0000000..19af09b
Binary files /dev/null and b/AudioWaveOutClassLibrary/obj/Debug/net8.0/AudioWaveOutClassLibrary.assets.cache differ
diff --git a/AudioWaveOutClassLibrary/obj/Debug/net8.0/AudioWaveOutClassLibrary.csproj.CoreCompileInputs.cache b/AudioWaveOutClassLibrary/obj/Debug/net8.0/AudioWaveOutClassLibrary.csproj.CoreCompileInputs.cache
new file mode 100644
index 0000000..267d03c
--- /dev/null
+++ b/AudioWaveOutClassLibrary/obj/Debug/net8.0/AudioWaveOutClassLibrary.csproj.CoreCompileInputs.cache
@@ -0,0 +1 @@
+6f30de9def75fa72fcb4da5d0e42bfcd9086aa52a9f02575f85e46e4233d338f
diff --git a/AudioWaveOutClassLibrary/obj/Debug/net8.0/AudioWaveOutClassLibrary.csproj.FileListAbsolute.txt b/AudioWaveOutClassLibrary/obj/Debug/net8.0/AudioWaveOutClassLibrary.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..bc6d7d2
--- /dev/null
+++ b/AudioWaveOutClassLibrary/obj/Debug/net8.0/AudioWaveOutClassLibrary.csproj.FileListAbsolute.txt
@@ -0,0 +1,12 @@
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutClassLibrary\obj\Debug\net8.0\AudioWaveOutClassLibrary.GeneratedMSBuildEditorConfig.editorconfig
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutClassLibrary\obj\Debug\net8.0\AudioWaveOutClassLibrary.AssemblyInfoInputs.cache
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutClassLibrary\obj\Debug\net8.0\AudioWaveOutClassLibrary.AssemblyInfo.cs
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutClassLibrary\obj\Debug\net8.0\AudioWaveOutClassLibrary.csproj.CoreCompileInputs.cache
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutClassLibrary\obj\Debug\net8.0\AudioWaveOutClassLibrary.sourcelink.json
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutClassLibrary\bin\Debug\net8.0\AudioWaveOutClassLibrary.deps.json
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutClassLibrary\bin\Debug\net8.0\AudioWaveOutClassLibrary.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutClassLibrary\bin\Debug\net8.0\AudioWaveOutClassLibrary.pdb
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutClassLibrary\obj\Debug\net8.0\AudioWaveOutClassLibrary.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutClassLibrary\obj\Debug\net8.0\refint\AudioWaveOutClassLibrary.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutClassLibrary\obj\Debug\net8.0\AudioWaveOutClassLibrary.pdb
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutClassLibrary\obj\Debug\net8.0\ref\AudioWaveOutClassLibrary.dll
diff --git a/AudioWaveOutClassLibrary/obj/Debug/net8.0/AudioWaveOutClassLibrary.dll b/AudioWaveOutClassLibrary/obj/Debug/net8.0/AudioWaveOutClassLibrary.dll
new file mode 100644
index 0000000..a6c4926
Binary files /dev/null and b/AudioWaveOutClassLibrary/obj/Debug/net8.0/AudioWaveOutClassLibrary.dll differ
diff --git a/AudioWaveOutClassLibrary/obj/Debug/net8.0/AudioWaveOutClassLibrary.pdb b/AudioWaveOutClassLibrary/obj/Debug/net8.0/AudioWaveOutClassLibrary.pdb
new file mode 100644
index 0000000..004291f
Binary files /dev/null and b/AudioWaveOutClassLibrary/obj/Debug/net8.0/AudioWaveOutClassLibrary.pdb differ
diff --git a/AudioWaveOutClassLibrary/obj/Debug/net8.0/AudioWaveOutClassLibrary.sourcelink.json b/AudioWaveOutClassLibrary/obj/Debug/net8.0/AudioWaveOutClassLibrary.sourcelink.json
new file mode 100644
index 0000000..5e20fcc
--- /dev/null
+++ b/AudioWaveOutClassLibrary/obj/Debug/net8.0/AudioWaveOutClassLibrary.sourcelink.json
@@ -0,0 +1 @@
+{"documents":{"C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\*":"https://raw.githubusercontent.com/VotreWaken/CelestialRTP/14f3d16c9fe2c14675dbc3d2c20ed04315c581a0/*"}}
\ No newline at end of file
diff --git a/AudioWaveOutClassLibrary/obj/Debug/net8.0/ref/AudioWaveOutClassLibrary.dll b/AudioWaveOutClassLibrary/obj/Debug/net8.0/ref/AudioWaveOutClassLibrary.dll
new file mode 100644
index 0000000..5bb3503
Binary files /dev/null and b/AudioWaveOutClassLibrary/obj/Debug/net8.0/ref/AudioWaveOutClassLibrary.dll differ
diff --git a/AudioWaveOutClassLibrary/obj/Debug/net8.0/refint/AudioWaveOutClassLibrary.dll b/AudioWaveOutClassLibrary/obj/Debug/net8.0/refint/AudioWaveOutClassLibrary.dll
new file mode 100644
index 0000000..5bb3503
Binary files /dev/null and b/AudioWaveOutClassLibrary/obj/Debug/net8.0/refint/AudioWaveOutClassLibrary.dll differ
diff --git a/AudioWaveOutClassLibrary/obj/project.assets.json b/AudioWaveOutClassLibrary/obj/project.assets.json
new file mode 100644
index 0000000..67fc522
--- /dev/null
+++ b/AudioWaveOutClassLibrary/obj/project.assets.json
@@ -0,0 +1,73 @@
+{
+ "version": 3,
+ "targets": {
+ "net8.0": {}
+ },
+ "libraries": {},
+ "projectFileDependencyGroups": {
+ "net8.0": []
+ },
+ "packageFolders": {
+ "C:\\Users\\38096\\.nuget\\packages\\": {},
+ "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {}
+ },
+ "project": {
+ "version": "1.0.0",
+ "restore": {
+ "projectUniqueName": "C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\AudioWaveOutClassLibrary\\AudioWaveOutClassLibrary.csproj",
+ "projectName": "AudioWaveOutClassLibrary",
+ "projectPath": "C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\AudioWaveOutClassLibrary\\AudioWaveOutClassLibrary.csproj",
+ "packagesPath": "C:\\Users\\38096\\.nuget\\packages\\",
+ "outputPath": "C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\AudioWaveOutClassLibrary\\obj\\",
+ "projectStyle": "PackageReference",
+ "fallbackFolders": [
+ "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
+ ],
+ "configFilePaths": [
+ "C:\\Users\\38096\\AppData\\Roaming\\NuGet\\NuGet.Config",
+ "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
+ "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
+ ],
+ "originalTargetFrameworks": [
+ "net8.0"
+ ],
+ "sources": {
+ "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
+ "https://api.nuget.org/v3/index.json": {}
+ },
+ "frameworks": {
+ "net8.0": {
+ "targetAlias": "net8.0",
+ "projectReferences": {}
+ }
+ },
+ "warningProperties": {
+ "warnAsError": [
+ "NU1605"
+ ]
+ }
+ },
+ "frameworks": {
+ "net8.0": {
+ "targetAlias": "net8.0",
+ "imports": [
+ "net461",
+ "net462",
+ "net47",
+ "net471",
+ "net472",
+ "net48",
+ "net481"
+ ],
+ "assetTargetFallback": true,
+ "warn": true,
+ "frameworkReferences": {
+ "Microsoft.NETCore.App": {
+ "privateAssets": "all"
+ }
+ },
+ "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.100/PortableRuntimeIdentifierGraph.json"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/AudioWaveOutClassLibrary/obj/project.nuget.cache b/AudioWaveOutClassLibrary/obj/project.nuget.cache
new file mode 100644
index 0000000..fc36740
--- /dev/null
+++ b/AudioWaveOutClassLibrary/obj/project.nuget.cache
@@ -0,0 +1,8 @@
+{
+ "version": 2,
+ "dgSpecHash": "8avNWUuX7O/ALS9cYH/SPHwnFi0EpheDEkZLtzZ4xO4+5lFQoByAFGLPUYvxyyz5xFif1dLEYSogL4N/wY9kOg==",
+ "success": true,
+ "projectFilePath": "C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\AudioWaveOutClassLibrary\\AudioWaveOutClassLibrary.csproj",
+ "expectedPackageFiles": [],
+ "logs": []
+}
\ No newline at end of file
diff --git a/AudioWaveOutUnitTest/AudioWaveOutUnitTest.csproj b/AudioWaveOutUnitTest/AudioWaveOutUnitTest.csproj
new file mode 100644
index 0000000..19c7788
--- /dev/null
+++ b/AudioWaveOutUnitTest/AudioWaveOutUnitTest.csproj
@@ -0,0 +1,32 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+ false
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Always
+
+
+
+
diff --git a/AudioWaveOutUnitTest/BaseSetup.cs b/AudioWaveOutUnitTest/BaseSetup.cs
new file mode 100644
index 0000000..2547af4
--- /dev/null
+++ b/AudioWaveOutUnitTest/BaseSetup.cs
@@ -0,0 +1,38 @@
+//----------------------------------------------------------------------------
+// File Name: BaseSetup.cs
+//
+// Description:
+// BaseSetup is responsible for All Unit Tests Setup, Defines the behavior
+// of the logger, and finalization after all tests done
+//
+//
+// Author(s):
+// Egor Waken
+//
+// History:
+// 07 May 2024 Egor Waken Created.
+//
+// License:
+// BSD 3-Clause "New" or "Revised" License, see included LICENSE.md file.
+//----------------------------------------------------------------------------
+
+namespace AudioWaveOutUnitTest
+{
+ [SetUpFixture]
+ public class BaseSetup
+ {
+ [OneTimeSetUp]
+ public void SetUp()
+ {
+ // Make Build
+ // In NLog.config File need to set Copy To Output Directory
+ LogManager.Configuration = new XmlLoggingConfiguration("nlog.config");
+ }
+
+ [OneTimeTearDown]
+ public void TearDown()
+ {
+ // Finalize
+ }
+ }
+}
diff --git a/AudioWaveOutUnitTest/GlobalUsings.cs b/AudioWaveOutUnitTest/GlobalUsings.cs
new file mode 100644
index 0000000..f9977a9
--- /dev/null
+++ b/AudioWaveOutUnitTest/GlobalUsings.cs
@@ -0,0 +1,5 @@
+global using NUnit.Framework;
+global using AudioWaveOut;
+global using NLog;
+global using NLog.Config;
+global using Moq;
\ No newline at end of file
diff --git a/AudioWaveOutUnitTest/WinSoundTests.cs b/AudioWaveOutUnitTest/WinSoundTests.cs
new file mode 100644
index 0000000..b98b8d2
--- /dev/null
+++ b/AudioWaveOutUnitTest/WinSoundTests.cs
@@ -0,0 +1,113 @@
+//----------------------------------------------------------------------------
+// File Name: WinSoundTests.cs
+//
+// Description:
+// WinSoundTests is responsible for UnitTesting WinSound.cs Class
+//
+//
+// Author(s):
+// Egor Waken
+//
+// History:
+// 07 May 2024 Egor Waken Created.
+//
+// License:
+// BSD 3-Clause "New" or "Revised" License, see included LICENSE.md file.
+//----------------------------------------------------------------------------
+namespace AudioWaveOutUnitTest
+{
+ [TestFixture]
+ public class WinSoundTests : BaseSetup
+ {
+ private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
+
+
+ [Test]
+ public void GetPlaybackNamesNotEmpty()
+ {
+ // Arrange: Prepare the test by obtaining playback device names
+ List playbackNames = WinSound.GetPlaybackNames();
+
+ // Act: Perform the action (calling the method under test)
+ // Assert: Verify the expected behavior
+ Assert.IsNotNull(playbackNames, "Playback names list should not be null");
+ Assert.IsNotEmpty(playbackNames, "Playback names list should not be empty");
+
+ Logger.Info($"Pass GetPlaybackNames_NotEmpty Test");
+ }
+
+ [Test]
+ public void GetRecordingNamesNotEmpty()
+ {
+ // Arrange: Prepare the test by obtaining recording device names
+ List recordingNames = WinSound.GetRecordingNames();
+
+ // Act: Perform the action (calling the method under test)
+ // Assert: Verify the expected behavior
+ Assert.IsNotNull(recordingNames, "Recording names list should not be null");
+ Assert.IsNotEmpty(recordingNames, "Recording names list should not be empty");
+
+ Logger.Info($"Pass GetRecordingNames_NotEmpty Test");
+ }
+
+ /*
+ [Test]
+ public void GetWaveInDeviceIdByNameExistingNameReturnsValidId()
+ {
+ // Arrange: Prepare the test by specifying an existing device name
+ string existingDeviceName = "Device A";
+
+ // Emulate a list of available playback devices
+ List playbackNames = new List { "Device A", "Device B" };
+
+
+ // Create a mock for WinSound
+ var mockWinSound = new Mock();
+
+ // Configure the mock for the static method GetPlaybackNames()
+ mockWinSound.Setup(w => WinSound.GetPlaybackNames()).Returns(playbackNames);
+
+ // Act: Perform the action (calling the method under test)
+ int deviceId = WinSound.GetWaveInDeviceIdByName(existingDeviceName);
+
+ // Assert: Verify the expected behavior
+ Assert.AreNotEqual(-1, deviceId, $"Device ID for '{existingDeviceName}' should not be -1");
+
+ // Log test pass
+ Logger.Info($"Pass GetWaveInDeviceIdByName_ExistingDeviceName_ReturnsValidId Test");
+ }
+ */
+
+ [Test]
+ public void GetWaveInDeviceIdByNameNonExistingNameReturnsWaveMapper()
+ {
+ // Arrange: Prepare the test by specifying a non-existing device name
+ string nonExistingDeviceName = "NonExistingDevice";
+
+ // Act: Perform the action (calling the method under test)
+ int deviceId = WinSound.GetWaveInDeviceIdByName(nonExistingDeviceName);
+
+ // Assert: Verify the expected behavior
+ Assert.AreEqual(Win32.WAVE_MAPPER, deviceId, $"Device ID for '{nonExistingDeviceName}' should be WAVE_MAPPER");
+
+ Logger.Info($"Pass GetWaveInDeviceIdByName_NonExistingName_ReturnsWaveMapper Test");
+ }
+
+ [Test]
+ public void FlagToStringReturnsExpectedString()
+ {
+ // Arrange: Prepare the test by defining the flags
+ var flags = Win32.WaveHdrFlags.WHDR_PREPARED | Win32.WaveHdrFlags.WHDR_DONE;
+
+ // Act: Perform the action (calling the method under test)
+ string result = WinSound.FlagToString(flags);
+
+ // Assert: Verify the expected behavior
+ Assert.AreEqual("PREPARED DONE ", result, "FlagToString result should match the expected string");
+
+ Logger.Info($"Pass FlagToString_CorrectFlags_ReturnsExpectedString Test");
+ }
+
+
+ }
+}
\ No newline at end of file
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/AudioWaveOutClassLibrary.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/AudioWaveOutClassLibrary.dll
new file mode 100644
index 0000000..a6c4926
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/AudioWaveOutClassLibrary.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/AudioWaveOutClassLibrary.pdb b/AudioWaveOutUnitTest/bin/Debug/net8.0/AudioWaveOutClassLibrary.pdb
new file mode 100644
index 0000000..004291f
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/AudioWaveOutClassLibrary.pdb differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/AudioWaveOutUnitTest.deps.json b/AudioWaveOutUnitTest/bin/Debug/net8.0/AudioWaveOutUnitTest.deps.json
new file mode 100644
index 0000000..decd4e1
--- /dev/null
+++ b/AudioWaveOutUnitTest/bin/Debug/net8.0/AudioWaveOutUnitTest.deps.json
@@ -0,0 +1,512 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v8.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v8.0": {
+ "AudioWaveOutUnitTest/1.0.0": {
+ "dependencies": {
+ "AudioWaveOutClassLibrary": "1.0.0",
+ "Microsoft.NET.Test.Sdk": "17.6.0",
+ "Moq": "4.20.70",
+ "NLog": "5.3.2",
+ "NUnit": "3.13.3",
+ "NUnit.Analyzers": "3.6.1",
+ "NUnit3TestAdapter": "4.2.1",
+ "coverlet.collector": "6.0.0"
+ },
+ "runtime": {
+ "AudioWaveOutUnitTest.dll": {}
+ }
+ },
+ "Castle.Core/5.1.1": {
+ "dependencies": {
+ "System.Diagnostics.EventLog": "6.0.0"
+ },
+ "runtime": {
+ "lib/net6.0/Castle.Core.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.1.1.0"
+ }
+ }
+ },
+ "coverlet.collector/6.0.0": {},
+ "Microsoft.CodeCoverage/17.6.0": {
+ "runtime": {
+ "lib/netcoreapp3.1/Microsoft.VisualStudio.CodeCoverage.Shim.dll": {
+ "assemblyVersion": "15.0.0.0",
+ "fileVersion": "17.600.1123.17103"
+ }
+ }
+ },
+ "Microsoft.NET.Test.Sdk/17.6.0": {
+ "dependencies": {
+ "Microsoft.CodeCoverage": "17.6.0",
+ "Microsoft.TestPlatform.TestHost": "17.6.0"
+ }
+ },
+ "Microsoft.NETCore.Platforms/1.1.0": {},
+ "Microsoft.TestPlatform.ObjectModel/17.6.0": {
+ "dependencies": {
+ "NuGet.Frameworks": "5.11.0",
+ "System.Reflection.Metadata": "1.6.0"
+ },
+ "runtime": {
+ "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll": {
+ "assemblyVersion": "15.0.0.0",
+ "fileVersion": "15.0.0.0"
+ },
+ "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll": {
+ "assemblyVersion": "15.0.0.0",
+ "fileVersion": "15.0.0.0"
+ },
+ "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll": {
+ "assemblyVersion": "15.0.0.0",
+ "fileVersion": "15.0.0.0"
+ }
+ },
+ "resources": {
+ "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
+ "locale": "cs"
+ },
+ "lib/netcoreapp3.1/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
+ "locale": "cs"
+ },
+ "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
+ "locale": "de"
+ },
+ "lib/netcoreapp3.1/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
+ "locale": "de"
+ },
+ "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
+ "locale": "es"
+ },
+ "lib/netcoreapp3.1/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
+ "locale": "es"
+ },
+ "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
+ "locale": "fr"
+ },
+ "lib/netcoreapp3.1/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
+ "locale": "fr"
+ },
+ "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
+ "locale": "it"
+ },
+ "lib/netcoreapp3.1/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
+ "locale": "it"
+ },
+ "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
+ "locale": "ja"
+ },
+ "lib/netcoreapp3.1/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
+ "locale": "ja"
+ },
+ "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
+ "locale": "ko"
+ },
+ "lib/netcoreapp3.1/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
+ "locale": "ko"
+ },
+ "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
+ "locale": "pl"
+ },
+ "lib/netcoreapp3.1/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
+ "locale": "pl"
+ },
+ "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
+ "locale": "pt-BR"
+ },
+ "lib/netcoreapp3.1/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
+ "locale": "pt-BR"
+ },
+ "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
+ "locale": "ru"
+ },
+ "lib/netcoreapp3.1/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
+ "locale": "ru"
+ },
+ "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
+ "locale": "tr"
+ },
+ "lib/netcoreapp3.1/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
+ "locale": "tr"
+ },
+ "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
+ "locale": "zh-Hans"
+ },
+ "lib/netcoreapp3.1/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
+ "locale": "zh-Hans"
+ },
+ "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
+ "locale": "zh-Hant"
+ },
+ "lib/netcoreapp3.1/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
+ "locale": "zh-Hant"
+ }
+ }
+ },
+ "Microsoft.TestPlatform.TestHost/17.6.0": {
+ "dependencies": {
+ "Microsoft.TestPlatform.ObjectModel": "17.6.0",
+ "Newtonsoft.Json": "13.0.1"
+ },
+ "runtime": {
+ "lib/netcoreapp3.1/Microsoft.TestPlatform.CommunicationUtilities.dll": {
+ "assemblyVersion": "15.0.0.0",
+ "fileVersion": "15.0.0.0"
+ },
+ "lib/netcoreapp3.1/Microsoft.TestPlatform.CrossPlatEngine.dll": {
+ "assemblyVersion": "15.0.0.0",
+ "fileVersion": "15.0.0.0"
+ },
+ "lib/netcoreapp3.1/Microsoft.TestPlatform.Utilities.dll": {
+ "assemblyVersion": "15.0.0.0",
+ "fileVersion": "15.0.0.0"
+ },
+ "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.Common.dll": {
+ "assemblyVersion": "15.0.0.0",
+ "fileVersion": "15.0.0.0"
+ },
+ "lib/netcoreapp3.1/testhost.dll": {
+ "assemblyVersion": "15.0.0.0",
+ "fileVersion": "15.0.0.0"
+ }
+ },
+ "resources": {
+ "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
+ "locale": "cs"
+ },
+ "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
+ "locale": "cs"
+ },
+ "lib/netcoreapp3.1/cs/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
+ "locale": "cs"
+ },
+ "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
+ "locale": "de"
+ },
+ "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
+ "locale": "de"
+ },
+ "lib/netcoreapp3.1/de/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
+ "locale": "de"
+ },
+ "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
+ "locale": "es"
+ },
+ "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
+ "locale": "es"
+ },
+ "lib/netcoreapp3.1/es/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
+ "locale": "es"
+ },
+ "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
+ "locale": "fr"
+ },
+ "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
+ "locale": "fr"
+ },
+ "lib/netcoreapp3.1/fr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
+ "locale": "fr"
+ },
+ "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
+ "locale": "it"
+ },
+ "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
+ "locale": "it"
+ },
+ "lib/netcoreapp3.1/it/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
+ "locale": "it"
+ },
+ "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
+ "locale": "ja"
+ },
+ "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
+ "locale": "ja"
+ },
+ "lib/netcoreapp3.1/ja/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
+ "locale": "ja"
+ },
+ "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
+ "locale": "ko"
+ },
+ "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
+ "locale": "ko"
+ },
+ "lib/netcoreapp3.1/ko/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
+ "locale": "ko"
+ },
+ "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
+ "locale": "pl"
+ },
+ "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
+ "locale": "pl"
+ },
+ "lib/netcoreapp3.1/pl/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
+ "locale": "pl"
+ },
+ "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
+ "locale": "pt-BR"
+ },
+ "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
+ "locale": "pt-BR"
+ },
+ "lib/netcoreapp3.1/pt-BR/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
+ "locale": "pt-BR"
+ },
+ "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
+ "locale": "ru"
+ },
+ "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
+ "locale": "ru"
+ },
+ "lib/netcoreapp3.1/ru/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
+ "locale": "ru"
+ },
+ "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
+ "locale": "tr"
+ },
+ "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
+ "locale": "tr"
+ },
+ "lib/netcoreapp3.1/tr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
+ "locale": "tr"
+ },
+ "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
+ "locale": "zh-Hans"
+ },
+ "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
+ "locale": "zh-Hans"
+ },
+ "lib/netcoreapp3.1/zh-Hans/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
+ "locale": "zh-Hans"
+ },
+ "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
+ "locale": "zh-Hant"
+ },
+ "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
+ "locale": "zh-Hant"
+ },
+ "lib/netcoreapp3.1/zh-Hant/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
+ "locale": "zh-Hant"
+ }
+ }
+ },
+ "Moq/4.20.70": {
+ "dependencies": {
+ "Castle.Core": "5.1.1"
+ },
+ "runtime": {
+ "lib/net6.0/Moq.dll": {
+ "assemblyVersion": "4.20.70.0",
+ "fileVersion": "4.20.70.0"
+ }
+ }
+ },
+ "NETStandard.Library/2.0.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0"
+ }
+ },
+ "Newtonsoft.Json/13.0.1": {
+ "runtime": {
+ "lib/netstandard2.0/Newtonsoft.Json.dll": {
+ "assemblyVersion": "13.0.0.0",
+ "fileVersion": "13.0.1.25517"
+ }
+ }
+ },
+ "NLog/5.3.2": {
+ "runtime": {
+ "lib/netstandard2.0/NLog.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.3.2.2526"
+ }
+ }
+ },
+ "NuGet.Frameworks/5.11.0": {
+ "runtime": {
+ "lib/netstandard2.0/NuGet.Frameworks.dll": {
+ "assemblyVersion": "5.11.0.10",
+ "fileVersion": "5.11.0.10"
+ }
+ }
+ },
+ "NUnit/3.13.3": {
+ "dependencies": {
+ "NETStandard.Library": "2.0.0"
+ },
+ "runtime": {
+ "lib/netstandard2.0/nunit.framework.dll": {
+ "assemblyVersion": "3.13.3.0",
+ "fileVersion": "3.13.3.0"
+ }
+ }
+ },
+ "NUnit.Analyzers/3.6.1": {},
+ "NUnit3TestAdapter/4.2.1": {},
+ "System.Diagnostics.EventLog/6.0.0": {
+ "runtime": {
+ "lib/net6.0/System.Diagnostics.EventLog.dll": {
+ "assemblyVersion": "6.0.0.0",
+ "fileVersion": "6.0.21.52210"
+ }
+ },
+ "runtimeTargets": {
+ "runtimes/win/lib/net6.0/System.Diagnostics.EventLog.Messages.dll": {
+ "rid": "win",
+ "assetType": "runtime",
+ "assemblyVersion": "6.0.0.0",
+ "fileVersion": "0.0.0.0"
+ },
+ "runtimes/win/lib/net6.0/System.Diagnostics.EventLog.dll": {
+ "rid": "win",
+ "assetType": "runtime",
+ "assemblyVersion": "6.0.0.0",
+ "fileVersion": "6.0.21.52210"
+ }
+ }
+ },
+ "System.Reflection.Metadata/1.6.0": {},
+ "AudioWaveOutClassLibrary/1.0.0": {
+ "runtime": {
+ "AudioWaveOutClassLibrary.dll": {}
+ }
+ }
+ }
+ },
+ "libraries": {
+ "AudioWaveOutUnitTest/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Castle.Core/5.1.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-rpYtIczkzGpf+EkZgDr9CClTdemhsrwA/W5hMoPjLkRFnXzH44zDLoovXeKtmxb1ykXK9aJVODSpiJml8CTw2g==",
+ "path": "castle.core/5.1.1",
+ "hashPath": "castle.core.5.1.1.nupkg.sha512"
+ },
+ "coverlet.collector/6.0.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-tW3lsNS+dAEII6YGUX/VMoJjBS1QvsxqJeqLaJXub08y1FSjasFPtQ4UBUsudE9PNrzLjooClMsPtY2cZLdXpQ==",
+ "path": "coverlet.collector/6.0.0",
+ "hashPath": "coverlet.collector.6.0.0.nupkg.sha512"
+ },
+ "Microsoft.CodeCoverage/17.6.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-5v2GwzpR7JEuQUzupjx3zLwn2FutADW/weLzLt726DR3WXxsM+ICPoJG6pxuKFsumtZp890UrVuudTUhsE8Qyg==",
+ "path": "microsoft.codecoverage/17.6.0",
+ "hashPath": "microsoft.codecoverage.17.6.0.nupkg.sha512"
+ },
+ "Microsoft.NET.Test.Sdk/17.6.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-tHyg4C6c89QvLv6Utz3xKlba4EeoyJyIz59Q1NrjRENV7gfGnSE6I+sYPIbVOzQttoo2zpHDgOK/p6Hw2OlD7A==",
+ "path": "microsoft.net.test.sdk/17.6.0",
+ "hashPath": "microsoft.net.test.sdk.17.6.0.nupkg.sha512"
+ },
+ "Microsoft.NETCore.Platforms/1.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==",
+ "path": "microsoft.netcore.platforms/1.1.0",
+ "hashPath": "microsoft.netcore.platforms.1.1.0.nupkg.sha512"
+ },
+ "Microsoft.TestPlatform.ObjectModel/17.6.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-AA/rrf5zwC5/OBLEOajkhjbVTM3SvxRXy8kcQ8e4mJKojbyZvqqhpfNg362N9vXU94DLg9NUTFOAnoYVT0pTJw==",
+ "path": "microsoft.testplatform.objectmodel/17.6.0",
+ "hashPath": "microsoft.testplatform.objectmodel.17.6.0.nupkg.sha512"
+ },
+ "Microsoft.TestPlatform.TestHost/17.6.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-7YdgUcIeCPVKLC7n7LNKDiEHWc7z3brkkYPdUbDnFsvf6WvY9UfzS0VSUJ8P2NgN0CDSD223GCJFSjSBLZRqOQ==",
+ "path": "microsoft.testplatform.testhost/17.6.0",
+ "hashPath": "microsoft.testplatform.testhost.17.6.0.nupkg.sha512"
+ },
+ "Moq/4.20.70": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-4rNnAwdpXJBuxqrOCzCyICXHSImOTRktCgCWXWykuF1qwoIsVvEnR7PjbMk/eLOxWvhmj5Kwt+kDV3RGUYcNwg==",
+ "path": "moq/4.20.70",
+ "hashPath": "moq.4.20.70.nupkg.sha512"
+ },
+ "NETStandard.Library/2.0.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-7jnbRU+L08FXKMxqUflxEXtVymWvNOrS8yHgu9s6EM8Anr6T/wIX4nZ08j/u3Asz+tCufp3YVwFSEvFTPYmBPA==",
+ "path": "netstandard.library/2.0.0",
+ "hashPath": "netstandard.library.2.0.0.nupkg.sha512"
+ },
+ "Newtonsoft.Json/13.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==",
+ "path": "newtonsoft.json/13.0.1",
+ "hashPath": "newtonsoft.json.13.0.1.nupkg.sha512"
+ },
+ "NLog/5.3.2": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-cQRQZuDMjSyMe9EQBnI9v55YAMMz8GAfFd6fFJ6tc/kXnG7Hze8p1I8MgvWSBG6E36wA8vSxRrlm8uSIG+SENg==",
+ "path": "nlog/5.3.2",
+ "hashPath": "nlog.5.3.2.nupkg.sha512"
+ },
+ "NuGet.Frameworks/5.11.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-eaiXkUjC4NPcquGWzAGMXjuxvLwc6XGKMptSyOGQeT0X70BUZObuybJFZLA0OfTdueLd3US23NBPTBb6iF3V1Q==",
+ "path": "nuget.frameworks/5.11.0",
+ "hashPath": "nuget.frameworks.5.11.0.nupkg.sha512"
+ },
+ "NUnit/3.13.3": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-KNPDpls6EfHwC3+nnA67fh5wpxeLb3VLFAfLxrug6JMYDLHH6InaQIWR7Sc3y75d/9IKzMksH/gi08W7XWbmnQ==",
+ "path": "nunit/3.13.3",
+ "hashPath": "nunit.3.13.3.nupkg.sha512"
+ },
+ "NUnit.Analyzers/3.6.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-RKP9tpKfl3DmRgUDGgh3XM3XzeLMrCXXMZm6vm1nMsObZ6vtQL1L9NrK7+oZh1jWearvNsbMis2+AIOY3NFmow==",
+ "path": "nunit.analyzers/3.6.1",
+ "hashPath": "nunit.analyzers.3.6.1.nupkg.sha512"
+ },
+ "NUnit3TestAdapter/4.2.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-kgH8VKsrcZZgNGQXRpVCrM7TnNz9li3b/snH+YmnXUNqsaWa1Xw9EQWHpbzq4Li2FbTjTE/E5N5HdLNXzZ8BpQ==",
+ "path": "nunit3testadapter/4.2.1",
+ "hashPath": "nunit3testadapter.4.2.1.nupkg.sha512"
+ },
+ "System.Diagnostics.EventLog/6.0.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw==",
+ "path": "system.diagnostics.eventlog/6.0.0",
+ "hashPath": "system.diagnostics.eventlog.6.0.0.nupkg.sha512"
+ },
+ "System.Reflection.Metadata/1.6.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==",
+ "path": "system.reflection.metadata/1.6.0",
+ "hashPath": "system.reflection.metadata.1.6.0.nupkg.sha512"
+ },
+ "AudioWaveOutClassLibrary/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/AudioWaveOutUnitTest.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/AudioWaveOutUnitTest.dll
new file mode 100644
index 0000000..e9d9839
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/AudioWaveOutUnitTest.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/AudioWaveOutUnitTest.pdb b/AudioWaveOutUnitTest/bin/Debug/net8.0/AudioWaveOutUnitTest.pdb
new file mode 100644
index 0000000..6c2fc2b
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/AudioWaveOutUnitTest.pdb differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/AudioWaveOutUnitTest.runtimeconfig.json b/AudioWaveOutUnitTest/bin/Debug/net8.0/AudioWaveOutUnitTest.runtimeconfig.json
new file mode 100644
index 0000000..becfaea
--- /dev/null
+++ b/AudioWaveOutUnitTest/bin/Debug/net8.0/AudioWaveOutUnitTest.runtimeconfig.json
@@ -0,0 +1,12 @@
+{
+ "runtimeOptions": {
+ "tfm": "net8.0",
+ "framework": {
+ "name": "Microsoft.NETCore.App",
+ "version": "8.0.0"
+ },
+ "configProperties": {
+ "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/Castle.Core.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/Castle.Core.dll
new file mode 100644
index 0000000..eb7fd3b
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/Castle.Core.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/CoverletSourceRootsMapping_AudioWaveOutUnitTest b/AudioWaveOutUnitTest/bin/Debug/net8.0/CoverletSourceRootsMapping_AudioWaveOutUnitTest
new file mode 100644
index 0000000..9dddf0c
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/CoverletSourceRootsMapping_AudioWaveOutUnitTest differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/Microsoft.TestPlatform.CommunicationUtilities.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/Microsoft.TestPlatform.CommunicationUtilities.dll
new file mode 100644
index 0000000..e45af4e
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/Microsoft.TestPlatform.CommunicationUtilities.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/Microsoft.TestPlatform.CoreUtilities.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/Microsoft.TestPlatform.CoreUtilities.dll
new file mode 100644
index 0000000..c868e1f
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/Microsoft.TestPlatform.CoreUtilities.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/Microsoft.TestPlatform.CrossPlatEngine.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/Microsoft.TestPlatform.CrossPlatEngine.dll
new file mode 100644
index 0000000..8201a76
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/Microsoft.TestPlatform.CrossPlatEngine.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/Microsoft.TestPlatform.PlatformAbstractions.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/Microsoft.TestPlatform.PlatformAbstractions.dll
new file mode 100644
index 0000000..36c3817
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/Microsoft.TestPlatform.PlatformAbstractions.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/Microsoft.TestPlatform.Utilities.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/Microsoft.TestPlatform.Utilities.dll
new file mode 100644
index 0000000..75e8966
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/Microsoft.TestPlatform.Utilities.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/Microsoft.VisualStudio.CodeCoverage.Shim.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/Microsoft.VisualStudio.CodeCoverage.Shim.dll
new file mode 100644
index 0000000..224bb02
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/Microsoft.VisualStudio.CodeCoverage.Shim.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/Microsoft.VisualStudio.TestPlatform.Common.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/Microsoft.VisualStudio.TestPlatform.Common.dll
new file mode 100644
index 0000000..357b697
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/Microsoft.VisualStudio.TestPlatform.Common.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll
new file mode 100644
index 0000000..4e17acc
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/Moq.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/Moq.dll
new file mode 100644
index 0000000..3c9679c
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/Moq.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/NLog.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/NLog.dll
new file mode 100644
index 0000000..3946f45
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/NLog.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/NUnit3.TestAdapter.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/NUnit3.TestAdapter.dll
new file mode 100644
index 0000000..9c5017b
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/NUnit3.TestAdapter.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/NUnit3.TestAdapter.pdb b/AudioWaveOutUnitTest/bin/Debug/net8.0/NUnit3.TestAdapter.pdb
new file mode 100644
index 0000000..33ab467
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/NUnit3.TestAdapter.pdb differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/Newtonsoft.Json.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/Newtonsoft.Json.dll
new file mode 100644
index 0000000..1ffeabe
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/Newtonsoft.Json.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/NuGet.Frameworks.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/NuGet.Frameworks.dll
new file mode 100644
index 0000000..0fabf0c
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/NuGet.Frameworks.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/System.Diagnostics.EventLog.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/System.Diagnostics.EventLog.dll
new file mode 100644
index 0000000..8a65e71
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/System.Diagnostics.EventLog.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/cs/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/cs/Microsoft.TestPlatform.CommunicationUtilities.resources.dll
new file mode 100644
index 0000000..cb28e97
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/cs/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll
new file mode 100644
index 0000000..b9f081d
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/cs/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/cs/Microsoft.TestPlatform.CrossPlatEngine.resources.dll
new file mode 100644
index 0000000..74ebedb
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/cs/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/cs/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/cs/Microsoft.VisualStudio.TestPlatform.Common.resources.dll
new file mode 100644
index 0000000..98cbcb7
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/cs/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
new file mode 100644
index 0000000..7333544
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/de/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/de/Microsoft.TestPlatform.CommunicationUtilities.resources.dll
new file mode 100644
index 0000000..7bfd5b1
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/de/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/de/Microsoft.TestPlatform.CoreUtilities.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/de/Microsoft.TestPlatform.CoreUtilities.resources.dll
new file mode 100644
index 0000000..6a248d6
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/de/Microsoft.TestPlatform.CoreUtilities.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/de/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/de/Microsoft.TestPlatform.CrossPlatEngine.resources.dll
new file mode 100644
index 0000000..a1861dd
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/de/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/de/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/de/Microsoft.VisualStudio.TestPlatform.Common.resources.dll
new file mode 100644
index 0000000..505dddd
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/de/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
new file mode 100644
index 0000000..4645b6b
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/es/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/es/Microsoft.TestPlatform.CommunicationUtilities.resources.dll
new file mode 100644
index 0000000..1668698
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/es/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/es/Microsoft.TestPlatform.CoreUtilities.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/es/Microsoft.TestPlatform.CoreUtilities.resources.dll
new file mode 100644
index 0000000..6bd079a
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/es/Microsoft.TestPlatform.CoreUtilities.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/es/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/es/Microsoft.TestPlatform.CrossPlatEngine.resources.dll
new file mode 100644
index 0000000..6430c84
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/es/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/es/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/es/Microsoft.VisualStudio.TestPlatform.Common.resources.dll
new file mode 100644
index 0000000..e683698
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/es/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
new file mode 100644
index 0000000..1442ee8
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/fr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/fr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll
new file mode 100644
index 0000000..c7759cf
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/fr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll
new file mode 100644
index 0000000..c207945
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/fr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/fr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll
new file mode 100644
index 0000000..0bc035b
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/fr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/fr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/fr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll
new file mode 100644
index 0000000..8d900d5
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/fr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
new file mode 100644
index 0000000..6f0b7cd
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/it/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/it/Microsoft.TestPlatform.CommunicationUtilities.resources.dll
new file mode 100644
index 0000000..266057d
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/it/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/it/Microsoft.TestPlatform.CoreUtilities.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/it/Microsoft.TestPlatform.CoreUtilities.resources.dll
new file mode 100644
index 0000000..0d3887a
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/it/Microsoft.TestPlatform.CoreUtilities.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/it/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/it/Microsoft.TestPlatform.CrossPlatEngine.resources.dll
new file mode 100644
index 0000000..80d55d5
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/it/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/it/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/it/Microsoft.VisualStudio.TestPlatform.Common.resources.dll
new file mode 100644
index 0000000..f7a9f3d
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/it/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
new file mode 100644
index 0000000..6abdb0f
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/ja/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/ja/Microsoft.TestPlatform.CommunicationUtilities.resources.dll
new file mode 100644
index 0000000..3a39a78
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/ja/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll
new file mode 100644
index 0000000..ea6315e
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/ja/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/ja/Microsoft.TestPlatform.CrossPlatEngine.resources.dll
new file mode 100644
index 0000000..470173a
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/ja/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/ja/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/ja/Microsoft.VisualStudio.TestPlatform.Common.resources.dll
new file mode 100644
index 0000000..0d53bff
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/ja/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
new file mode 100644
index 0000000..b09e823
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/ko/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/ko/Microsoft.TestPlatform.CommunicationUtilities.resources.dll
new file mode 100644
index 0000000..0114575
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/ko/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll
new file mode 100644
index 0000000..a0d681f
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/ko/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/ko/Microsoft.TestPlatform.CrossPlatEngine.resources.dll
new file mode 100644
index 0000000..6ad80ed
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/ko/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/ko/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/ko/Microsoft.VisualStudio.TestPlatform.Common.resources.dll
new file mode 100644
index 0000000..44520a2
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/ko/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
new file mode 100644
index 0000000..9aceed9
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/nlog.config b/AudioWaveOutUnitTest/bin/Debug/net8.0/nlog.config
new file mode 100644
index 0000000..78b60b9
--- /dev/null
+++ b/AudioWaveOutUnitTest/bin/Debug/net8.0/nlog.config
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/nunit.engine.api.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/nunit.engine.api.dll
new file mode 100644
index 0000000..c5a7503
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/nunit.engine.api.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/nunit.engine.core.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/nunit.engine.core.dll
new file mode 100644
index 0000000..0e4c7a1
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/nunit.engine.core.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/nunit.engine.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/nunit.engine.dll
new file mode 100644
index 0000000..d943469
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/nunit.engine.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/nunit.framework.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/nunit.framework.dll
new file mode 100644
index 0000000..16e3f3b
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/nunit.framework.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/nunit_random_seed.tmp b/AudioWaveOutUnitTest/bin/Debug/net8.0/nunit_random_seed.tmp
new file mode 100644
index 0000000..a8bc1cd
--- /dev/null
+++ b/AudioWaveOutUnitTest/bin/Debug/net8.0/nunit_random_seed.tmp
@@ -0,0 +1 @@
+1155998811
\ No newline at end of file
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/pl/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/pl/Microsoft.TestPlatform.CommunicationUtilities.resources.dll
new file mode 100644
index 0000000..7dc061e
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/pl/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll
new file mode 100644
index 0000000..ddce776
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/pl/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/pl/Microsoft.TestPlatform.CrossPlatEngine.resources.dll
new file mode 100644
index 0000000..5d9cc06
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/pl/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/pl/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/pl/Microsoft.VisualStudio.TestPlatform.Common.resources.dll
new file mode 100644
index 0000000..9129485
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/pl/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
new file mode 100644
index 0000000..93dfb6d
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/pt-BR/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/pt-BR/Microsoft.TestPlatform.CommunicationUtilities.resources.dll
new file mode 100644
index 0000000..6f009dc
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/pt-BR/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll
new file mode 100644
index 0000000..a52d361
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/pt-BR/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/pt-BR/Microsoft.TestPlatform.CrossPlatEngine.resources.dll
new file mode 100644
index 0000000..08d86f9
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/pt-BR/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/pt-BR/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/pt-BR/Microsoft.VisualStudio.TestPlatform.Common.resources.dll
new file mode 100644
index 0000000..9e7e899
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/pt-BR/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
new file mode 100644
index 0000000..4841034
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/ru/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/ru/Microsoft.TestPlatform.CommunicationUtilities.resources.dll
new file mode 100644
index 0000000..d4f74e0
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/ru/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll
new file mode 100644
index 0000000..f6b8ea3
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/ru/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/ru/Microsoft.TestPlatform.CrossPlatEngine.resources.dll
new file mode 100644
index 0000000..c926fc1
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/ru/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/ru/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/ru/Microsoft.VisualStudio.TestPlatform.Common.resources.dll
new file mode 100644
index 0000000..9aa81a0
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/ru/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
new file mode 100644
index 0000000..193cfe8
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/runtimes/win/lib/net6.0/System.Diagnostics.EventLog.Messages.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/runtimes/win/lib/net6.0/System.Diagnostics.EventLog.Messages.dll
new file mode 100644
index 0000000..bc23526
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/runtimes/win/lib/net6.0/System.Diagnostics.EventLog.Messages.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/runtimes/win/lib/net6.0/System.Diagnostics.EventLog.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/runtimes/win/lib/net6.0/System.Diagnostics.EventLog.dll
new file mode 100644
index 0000000..03b44f1
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/runtimes/win/lib/net6.0/System.Diagnostics.EventLog.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/testcentric.engine.metadata.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/testcentric.engine.metadata.dll
new file mode 100644
index 0000000..b982b6b
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/testcentric.engine.metadata.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/testhost.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/testhost.dll
new file mode 100644
index 0000000..b15bd81
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/testhost.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/testhost.exe b/AudioWaveOutUnitTest/bin/Debug/net8.0/testhost.exe
new file mode 100644
index 0000000..de9292b
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/testhost.exe differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/tr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/tr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll
new file mode 100644
index 0000000..0103c73
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/tr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll
new file mode 100644
index 0000000..1af1a2b
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/tr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/tr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll
new file mode 100644
index 0000000..8208c4a
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/tr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/tr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/tr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll
new file mode 100644
index 0000000..1e34b72
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/tr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
new file mode 100644
index 0000000..764f76d
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/zh-Hans/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/zh-Hans/Microsoft.TestPlatform.CommunicationUtilities.resources.dll
new file mode 100644
index 0000000..cfbbe73
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/zh-Hans/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll
new file mode 100644
index 0000000..d8b7fb2
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/zh-Hans/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/zh-Hans/Microsoft.TestPlatform.CrossPlatEngine.resources.dll
new file mode 100644
index 0000000..1911bc8
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/zh-Hans/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/zh-Hans/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/zh-Hans/Microsoft.VisualStudio.TestPlatform.Common.resources.dll
new file mode 100644
index 0000000..7de1876
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/zh-Hans/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
new file mode 100644
index 0000000..c7908a2
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/zh-Hant/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/zh-Hant/Microsoft.TestPlatform.CommunicationUtilities.resources.dll
new file mode 100644
index 0000000..edb16db
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/zh-Hant/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll
new file mode 100644
index 0000000..432e72c
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/zh-Hant/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/zh-Hant/Microsoft.TestPlatform.CrossPlatEngine.resources.dll
new file mode 100644
index 0000000..82406ca
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/zh-Hant/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/zh-Hant/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/zh-Hant/Microsoft.VisualStudio.TestPlatform.Common.resources.dll
new file mode 100644
index 0000000..8545af8
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/zh-Hant/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ
diff --git a/AudioWaveOutUnitTest/bin/Debug/net8.0/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/AudioWaveOutUnitTest/bin/Debug/net8.0/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
new file mode 100644
index 0000000..b2092e0
Binary files /dev/null and b/AudioWaveOutUnitTest/bin/Debug/net8.0/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ
diff --git a/AudioWaveOutUnitTest/log.txt b/AudioWaveOutUnitTest/log.txt
new file mode 100644
index 0000000..03a4f71
--- /dev/null
+++ b/AudioWaveOutUnitTest/log.txt
@@ -0,0 +1,4 @@
+2024-05-07 23:26:42.3020 Trace: MethodBaseInvoker.InvokeWithNoArgs => RuntimeMethodHandle.InvokeMethod => WinSoundTests.FlagToStringReturnsExpectedString Pass FlagToString_CorrectFlags_ReturnsExpectedString Test
+2024-05-07 23:26:42.3398 Trace: MethodBaseInvoker.InvokeWithNoArgs => RuntimeMethodHandle.InvokeMethod => WinSoundTests.GetPlaybackNamesNotEmpty Pass GetPlaybackNames_NotEmpty Test
+2024-05-07 23:26:42.3398 Trace: MethodBaseInvoker.InvokeWithNoArgs => RuntimeMethodHandle.InvokeMethod => WinSoundTests.GetRecordingNamesNotEmpty Pass GetRecordingNames_NotEmpty Test
+2024-05-07 23:26:42.3398 Trace: MethodBaseInvoker.InvokeWithNoArgs => RuntimeMethodHandle.InvokeMethod => WinSoundTests.GetWaveInDeviceIdByNameNonExistingNameReturnsWaveMapper Pass GetWaveInDeviceIdByName_NonExistingName_ReturnsWaveMapper Test
diff --git a/AudioWaveOutUnitTest/nlog.config b/AudioWaveOutUnitTest/nlog.config
new file mode 100644
index 0000000..78b60b9
--- /dev/null
+++ b/AudioWaveOutUnitTest/nlog.config
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/AudioWaveOutUnitTest/obj/AudioWaveOutUnitTest.csproj.nuget.dgspec.json b/AudioWaveOutUnitTest/obj/AudioWaveOutUnitTest.csproj.nuget.dgspec.json
new file mode 100644
index 0000000..960ff5f
--- /dev/null
+++ b/AudioWaveOutUnitTest/obj/AudioWaveOutUnitTest.csproj.nuget.dgspec.json
@@ -0,0 +1,160 @@
+{
+ "format": 1,
+ "restore": {
+ "C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\AudioWaveOutUnitTest\\AudioWaveOutUnitTest.csproj": {}
+ },
+ "projects": {
+ "C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\AudioWaveOutClassLibrary\\AudioWaveOutClassLibrary.csproj": {
+ "version": "1.0.0",
+ "restore": {
+ "projectUniqueName": "C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\AudioWaveOutClassLibrary\\AudioWaveOutClassLibrary.csproj",
+ "projectName": "AudioWaveOutClassLibrary",
+ "projectPath": "C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\AudioWaveOutClassLibrary\\AudioWaveOutClassLibrary.csproj",
+ "packagesPath": "C:\\Users\\38096\\.nuget\\packages\\",
+ "outputPath": "C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\AudioWaveOutClassLibrary\\obj\\",
+ "projectStyle": "PackageReference",
+ "fallbackFolders": [
+ "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
+ ],
+ "configFilePaths": [
+ "C:\\Users\\38096\\AppData\\Roaming\\NuGet\\NuGet.Config",
+ "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
+ "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
+ ],
+ "originalTargetFrameworks": [
+ "net8.0"
+ ],
+ "sources": {
+ "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
+ "https://api.nuget.org/v3/index.json": {}
+ },
+ "frameworks": {
+ "net8.0": {
+ "targetAlias": "net8.0",
+ "projectReferences": {}
+ }
+ },
+ "warningProperties": {
+ "warnAsError": [
+ "NU1605"
+ ]
+ }
+ },
+ "frameworks": {
+ "net8.0": {
+ "targetAlias": "net8.0",
+ "imports": [
+ "net461",
+ "net462",
+ "net47",
+ "net471",
+ "net472",
+ "net48",
+ "net481"
+ ],
+ "assetTargetFallback": true,
+ "warn": true,
+ "frameworkReferences": {
+ "Microsoft.NETCore.App": {
+ "privateAssets": "all"
+ }
+ },
+ "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.100/PortableRuntimeIdentifierGraph.json"
+ }
+ }
+ },
+ "C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\AudioWaveOutUnitTest\\AudioWaveOutUnitTest.csproj": {
+ "version": "1.0.0",
+ "restore": {
+ "projectUniqueName": "C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\AudioWaveOutUnitTest\\AudioWaveOutUnitTest.csproj",
+ "projectName": "AudioWaveOutUnitTest",
+ "projectPath": "C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\AudioWaveOutUnitTest\\AudioWaveOutUnitTest.csproj",
+ "packagesPath": "C:\\Users\\38096\\.nuget\\packages\\",
+ "outputPath": "C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\AudioWaveOutUnitTest\\obj\\",
+ "projectStyle": "PackageReference",
+ "fallbackFolders": [
+ "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
+ ],
+ "configFilePaths": [
+ "C:\\Users\\38096\\AppData\\Roaming\\NuGet\\NuGet.Config",
+ "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
+ "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
+ ],
+ "originalTargetFrameworks": [
+ "net8.0"
+ ],
+ "sources": {
+ "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
+ "https://api.nuget.org/v3/index.json": {}
+ },
+ "frameworks": {
+ "net8.0": {
+ "targetAlias": "net8.0",
+ "projectReferences": {
+ "C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\AudioWaveOutClassLibrary\\AudioWaveOutClassLibrary.csproj": {
+ "projectPath": "C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\AudioWaveOutClassLibrary\\AudioWaveOutClassLibrary.csproj"
+ }
+ }
+ }
+ },
+ "warningProperties": {
+ "warnAsError": [
+ "NU1605"
+ ]
+ }
+ },
+ "frameworks": {
+ "net8.0": {
+ "targetAlias": "net8.0",
+ "dependencies": {
+ "Microsoft.NET.Test.Sdk": {
+ "target": "Package",
+ "version": "[17.6.0, )"
+ },
+ "Moq": {
+ "target": "Package",
+ "version": "[4.20.70, )"
+ },
+ "NLog": {
+ "target": "Package",
+ "version": "[5.3.2, )"
+ },
+ "NUnit": {
+ "target": "Package",
+ "version": "[3.13.3, )"
+ },
+ "NUnit.Analyzers": {
+ "target": "Package",
+ "version": "[3.6.1, )"
+ },
+ "NUnit3TestAdapter": {
+ "target": "Package",
+ "version": "[4.2.1, )"
+ },
+ "coverlet.collector": {
+ "target": "Package",
+ "version": "[6.0.0, )"
+ }
+ },
+ "imports": [
+ "net461",
+ "net462",
+ "net47",
+ "net471",
+ "net472",
+ "net48",
+ "net481"
+ ],
+ "assetTargetFallback": true,
+ "warn": true,
+ "frameworkReferences": {
+ "Microsoft.NETCore.App": {
+ "privateAssets": "all"
+ }
+ },
+ "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.100/PortableRuntimeIdentifierGraph.json"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/AudioWaveOutUnitTest/obj/AudioWaveOutUnitTest.csproj.nuget.g.props b/AudioWaveOutUnitTest/obj/AudioWaveOutUnitTest.csproj.nuget.g.props
new file mode 100644
index 0000000..9a0d165
--- /dev/null
+++ b/AudioWaveOutUnitTest/obj/AudioWaveOutUnitTest.csproj.nuget.g.props
@@ -0,0 +1,26 @@
+
+
+
+ True
+ NuGet
+ $(MSBuildThisFileDirectory)project.assets.json
+ $(UserProfile)\.nuget\packages\
+ C:\Users\38096\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages
+ PackageReference
+ 6.8.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+ C:\Users\38096\.nuget\packages\nunit.analyzers\3.6.1
+
+
\ No newline at end of file
diff --git a/AudioWaveOutUnitTest/obj/AudioWaveOutUnitTest.csproj.nuget.g.targets b/AudioWaveOutUnitTest/obj/AudioWaveOutUnitTest.csproj.nuget.g.targets
new file mode 100644
index 0000000..3f88d4a
--- /dev/null
+++ b/AudioWaveOutUnitTest/obj/AudioWaveOutUnitTest.csproj.nuget.g.targets
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/AudioWaveOutUnitTest/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs b/AudioWaveOutUnitTest/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs
new file mode 100644
index 0000000..2217181
--- /dev/null
+++ b/AudioWaveOutUnitTest/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs
@@ -0,0 +1,4 @@
+//
+using System;
+using System.Reflection;
+[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")]
diff --git a/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.AssemblyInfo.cs b/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.AssemblyInfo.cs
new file mode 100644
index 0000000..c87262a
--- /dev/null
+++ b/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.AssemblyInfo.cs
@@ -0,0 +1,23 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+using System;
+using System.Reflection;
+
+[assembly: System.Reflection.AssemblyCompanyAttribute("AudioWaveOutUnitTest")]
+[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
+[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
+[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
+[assembly: System.Reflection.AssemblyProductAttribute("AudioWaveOutUnitTest")]
+[assembly: System.Reflection.AssemblyTitleAttribute("AudioWaveOutUnitTest")]
+[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
+
+// Generated by the MSBuild WriteCodeFragment class.
+
diff --git a/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.AssemblyInfoInputs.cache b/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.AssemblyInfoInputs.cache
new file mode 100644
index 0000000..2a964a0
--- /dev/null
+++ b/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.AssemblyInfoInputs.cache
@@ -0,0 +1 @@
+f2bc05fd2ada56d3ad418f46fed4fc9a24876b84b4dde23d5e45c4453524a630
diff --git a/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.GeneratedMSBuildEditorConfig.editorconfig b/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.GeneratedMSBuildEditorConfig.editorconfig
new file mode 100644
index 0000000..2335d49
--- /dev/null
+++ b/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.GeneratedMSBuildEditorConfig.editorconfig
@@ -0,0 +1,13 @@
+is_global = true
+build_property.TargetFramework = net8.0
+build_property.TargetPlatformMinVersion =
+build_property.UsingMicrosoftNETSdkWeb =
+build_property.ProjectTypeGuids =
+build_property.InvariantGlobalization =
+build_property.PlatformNeutralAssembly =
+build_property.EnforceExtendedAnalyzerRules =
+build_property._SupportedPlatformList = Linux,macOS,Windows
+build_property.RootNamespace = AudioWaveOutUnitTest
+build_property.ProjectDir = C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\
+build_property.EnableComHosting =
+build_property.EnableGeneratedComInterfaceComImportInterop =
diff --git a/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.GlobalUsings.g.cs b/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.GlobalUsings.g.cs
new file mode 100644
index 0000000..8578f3d
--- /dev/null
+++ b/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.GlobalUsings.g.cs
@@ -0,0 +1,8 @@
+//
+global using global::System;
+global using global::System.Collections.Generic;
+global using global::System.IO;
+global using global::System.Linq;
+global using global::System.Net.Http;
+global using global::System.Threading;
+global using global::System.Threading.Tasks;
diff --git a/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.assets.cache b/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.assets.cache
new file mode 100644
index 0000000..d0cb1e6
Binary files /dev/null and b/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.assets.cache differ
diff --git a/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.csproj.AssemblyReference.cache b/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.csproj.AssemblyReference.cache
new file mode 100644
index 0000000..5697f8e
Binary files /dev/null and b/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.csproj.AssemblyReference.cache differ
diff --git a/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.csproj.BuildWithSkipAnalyzers b/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.csproj.BuildWithSkipAnalyzers
new file mode 100644
index 0000000..e69de29
diff --git a/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.csproj.CopyComplete b/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.csproj.CopyComplete
new file mode 100644
index 0000000..e69de29
diff --git a/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.csproj.CoreCompileInputs.cache b/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.csproj.CoreCompileInputs.cache
new file mode 100644
index 0000000..23c192d
--- /dev/null
+++ b/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.csproj.CoreCompileInputs.cache
@@ -0,0 +1 @@
+b45ddb74a9fb1e5d1e6b2fd5445e7efd964744a55725675d6a8c2efa01eb70ec
diff --git a/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.csproj.FileListAbsolute.txt b/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..fd837b2
--- /dev/null
+++ b/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.csproj.FileListAbsolute.txt
@@ -0,0 +1,110 @@
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\CoverletSourceRootsMapping_AudioWaveOutUnitTest
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\testhost.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\testhost.exe
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\NUnit3.TestAdapter.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\NUnit3.TestAdapter.pdb
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\nunit.engine.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\nunit.engine.api.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\nunit.engine.core.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\testcentric.engine.metadata.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\AudioWaveOutUnitTest.deps.json
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\AudioWaveOutUnitTest.runtimeconfig.json
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\AudioWaveOutUnitTest.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\AudioWaveOutUnitTest.pdb
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\Microsoft.VisualStudio.CodeCoverage.Shim.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\Microsoft.TestPlatform.CoreUtilities.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\Microsoft.TestPlatform.PlatformAbstractions.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\Microsoft.VisualStudio.TestPlatform.ObjectModel.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\Microsoft.TestPlatform.CommunicationUtilities.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\Microsoft.TestPlatform.CrossPlatEngine.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\Microsoft.TestPlatform.Utilities.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\Microsoft.VisualStudio.TestPlatform.Common.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\Newtonsoft.Json.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\NuGet.Frameworks.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\nunit.framework.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\cs\Microsoft.TestPlatform.CoreUtilities.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\cs\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\de\Microsoft.TestPlatform.CoreUtilities.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\de\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\es\Microsoft.TestPlatform.CoreUtilities.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\es\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\fr\Microsoft.TestPlatform.CoreUtilities.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\fr\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\it\Microsoft.TestPlatform.CoreUtilities.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\it\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\ja\Microsoft.TestPlatform.CoreUtilities.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\ja\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\ko\Microsoft.TestPlatform.CoreUtilities.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\ko\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\pl\Microsoft.TestPlatform.CoreUtilities.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\pl\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\pt-BR\Microsoft.TestPlatform.CoreUtilities.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\pt-BR\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\ru\Microsoft.TestPlatform.CoreUtilities.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\ru\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\tr\Microsoft.TestPlatform.CoreUtilities.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\tr\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\zh-Hans\Microsoft.TestPlatform.CoreUtilities.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\zh-Hans\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\zh-Hant\Microsoft.TestPlatform.CoreUtilities.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\zh-Hant\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\cs\Microsoft.TestPlatform.CommunicationUtilities.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\cs\Microsoft.TestPlatform.CrossPlatEngine.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\cs\Microsoft.VisualStudio.TestPlatform.Common.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\de\Microsoft.TestPlatform.CommunicationUtilities.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\de\Microsoft.TestPlatform.CrossPlatEngine.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\de\Microsoft.VisualStudio.TestPlatform.Common.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\es\Microsoft.TestPlatform.CommunicationUtilities.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\es\Microsoft.TestPlatform.CrossPlatEngine.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\es\Microsoft.VisualStudio.TestPlatform.Common.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\fr\Microsoft.TestPlatform.CommunicationUtilities.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\fr\Microsoft.TestPlatform.CrossPlatEngine.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\fr\Microsoft.VisualStudio.TestPlatform.Common.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\it\Microsoft.TestPlatform.CommunicationUtilities.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\it\Microsoft.TestPlatform.CrossPlatEngine.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\it\Microsoft.VisualStudio.TestPlatform.Common.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\ja\Microsoft.TestPlatform.CommunicationUtilities.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\ja\Microsoft.TestPlatform.CrossPlatEngine.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\ja\Microsoft.VisualStudio.TestPlatform.Common.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\ko\Microsoft.TestPlatform.CommunicationUtilities.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\ko\Microsoft.TestPlatform.CrossPlatEngine.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\ko\Microsoft.VisualStudio.TestPlatform.Common.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\pl\Microsoft.TestPlatform.CommunicationUtilities.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\pl\Microsoft.TestPlatform.CrossPlatEngine.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\pl\Microsoft.VisualStudio.TestPlatform.Common.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\pt-BR\Microsoft.TestPlatform.CommunicationUtilities.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\pt-BR\Microsoft.TestPlatform.CrossPlatEngine.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\pt-BR\Microsoft.VisualStudio.TestPlatform.Common.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\ru\Microsoft.TestPlatform.CommunicationUtilities.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\ru\Microsoft.TestPlatform.CrossPlatEngine.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\ru\Microsoft.VisualStudio.TestPlatform.Common.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\tr\Microsoft.TestPlatform.CommunicationUtilities.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\tr\Microsoft.TestPlatform.CrossPlatEngine.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\tr\Microsoft.VisualStudio.TestPlatform.Common.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\zh-Hans\Microsoft.TestPlatform.CommunicationUtilities.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\zh-Hans\Microsoft.TestPlatform.CrossPlatEngine.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\zh-Hans\Microsoft.VisualStudio.TestPlatform.Common.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\zh-Hant\Microsoft.TestPlatform.CommunicationUtilities.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\zh-Hant\Microsoft.TestPlatform.CrossPlatEngine.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\zh-Hant\Microsoft.VisualStudio.TestPlatform.Common.resources.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\AudioWaveOutClassLibrary.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\AudioWaveOutClassLibrary.pdb
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\obj\Debug\net8.0\AudioWaveOutUnitTest.csproj.AssemblyReference.cache
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\obj\Debug\net8.0\AudioWaveOutUnitTest.GeneratedMSBuildEditorConfig.editorconfig
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\obj\Debug\net8.0\AudioWaveOutUnitTest.AssemblyInfoInputs.cache
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\obj\Debug\net8.0\AudioWaveOutUnitTest.AssemblyInfo.cs
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\obj\Debug\net8.0\AudioWaveOutUnitTest.csproj.CoreCompileInputs.cache
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\obj\Debug\net8.0\AudioWaveOutUnitTest.sourcelink.json
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\obj\Debug\net8.0\AudioWaveOutUnitTest.csproj.CopyComplete
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\obj\Debug\net8.0\AudioWaveOutUnitTest.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\obj\Debug\net8.0\refint\AudioWaveOutUnitTest.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\obj\Debug\net8.0\AudioWaveOutUnitTest.pdb
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\obj\Debug\net8.0\AudioWaveOutUnitTest.genruntimeconfig.cache
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\obj\Debug\net8.0\ref\AudioWaveOutUnitTest.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\NLog.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\nlog.config
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\Castle.Core.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\Moq.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\System.Diagnostics.EventLog.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\runtimes\win\lib\net6.0\System.Diagnostics.EventLog.Messages.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\AudioWaveOutUnitTest\bin\Debug\net8.0\runtimes\win\lib\net6.0\System.Diagnostics.EventLog.dll
diff --git a/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.dll b/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.dll
new file mode 100644
index 0000000..e9d9839
Binary files /dev/null and b/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.dll differ
diff --git a/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.genruntimeconfig.cache b/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.genruntimeconfig.cache
new file mode 100644
index 0000000..e6b5cd5
--- /dev/null
+++ b/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.genruntimeconfig.cache
@@ -0,0 +1 @@
+437ac9cae6132039ea581f6d5c1e93b93c3c6907deaf992dd6755d663b36f510
diff --git a/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.pdb b/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.pdb
new file mode 100644
index 0000000..6c2fc2b
Binary files /dev/null and b/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.pdb differ
diff --git a/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.sourcelink.json b/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.sourcelink.json
new file mode 100644
index 0000000..5e20fcc
--- /dev/null
+++ b/AudioWaveOutUnitTest/obj/Debug/net8.0/AudioWaveOutUnitTest.sourcelink.json
@@ -0,0 +1 @@
+{"documents":{"C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\*":"https://raw.githubusercontent.com/VotreWaken/CelestialRTP/14f3d16c9fe2c14675dbc3d2c20ed04315c581a0/*"}}
\ No newline at end of file
diff --git a/AudioWaveOutUnitTest/obj/Debug/net8.0/ref/AudioWaveOutUnitTest.dll b/AudioWaveOutUnitTest/obj/Debug/net8.0/ref/AudioWaveOutUnitTest.dll
new file mode 100644
index 0000000..632a6ac
Binary files /dev/null and b/AudioWaveOutUnitTest/obj/Debug/net8.0/ref/AudioWaveOutUnitTest.dll differ
diff --git a/AudioWaveOutUnitTest/obj/Debug/net8.0/refint/AudioWaveOutUnitTest.dll b/AudioWaveOutUnitTest/obj/Debug/net8.0/refint/AudioWaveOutUnitTest.dll
new file mode 100644
index 0000000..632a6ac
Binary files /dev/null and b/AudioWaveOutUnitTest/obj/Debug/net8.0/refint/AudioWaveOutUnitTest.dll differ
diff --git a/AudioWaveOutUnitTest/obj/project.assets.json b/AudioWaveOutUnitTest/obj/project.assets.json
new file mode 100644
index 0000000..de0bc0f
--- /dev/null
+++ b/AudioWaveOutUnitTest/obj/project.assets.json
@@ -0,0 +1,1274 @@
+{
+ "version": 3,
+ "targets": {
+ "net8.0": {
+ "Castle.Core/5.1.1": {
+ "type": "package",
+ "dependencies": {
+ "System.Diagnostics.EventLog": "6.0.0"
+ },
+ "compile": {
+ "lib/net6.0/Castle.Core.dll": {
+ "related": ".xml"
+ }
+ },
+ "runtime": {
+ "lib/net6.0/Castle.Core.dll": {
+ "related": ".xml"
+ }
+ }
+ },
+ "coverlet.collector/6.0.0": {
+ "type": "package",
+ "build": {
+ "build/netstandard1.0/coverlet.collector.targets": {}
+ }
+ },
+ "Microsoft.CodeCoverage/17.6.0": {
+ "type": "package",
+ "compile": {
+ "lib/netcoreapp3.1/Microsoft.VisualStudio.CodeCoverage.Shim.dll": {}
+ },
+ "runtime": {
+ "lib/netcoreapp3.1/Microsoft.VisualStudio.CodeCoverage.Shim.dll": {}
+ },
+ "build": {
+ "build/netstandard2.0/Microsoft.CodeCoverage.props": {},
+ "build/netstandard2.0/Microsoft.CodeCoverage.targets": {}
+ }
+ },
+ "Microsoft.NET.Test.Sdk/17.6.0": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.CodeCoverage": "17.6.0",
+ "Microsoft.TestPlatform.TestHost": "17.6.0"
+ },
+ "compile": {
+ "lib/netcoreapp3.1/_._": {}
+ },
+ "runtime": {
+ "lib/netcoreapp3.1/_._": {}
+ },
+ "build": {
+ "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.props": {},
+ "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.targets": {}
+ },
+ "buildMultiTargeting": {
+ "buildMultiTargeting/Microsoft.NET.Test.Sdk.props": {}
+ }
+ },
+ "Microsoft.NETCore.Platforms/1.1.0": {
+ "type": "package",
+ "compile": {
+ "lib/netstandard1.0/_._": {}
+ },
+ "runtime": {
+ "lib/netstandard1.0/_._": {}
+ }
+ },
+ "Microsoft.TestPlatform.ObjectModel/17.6.0": {
+ "type": "package",
+ "dependencies": {
+ "NuGet.Frameworks": "5.11.0",
+ "System.Reflection.Metadata": "1.6.0"
+ },
+ "compile": {
+ "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll": {},
+ "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll": {},
+ "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll": {}
+ },
+ "runtime": {
+ "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll": {},
+ "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll": {},
+ "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll": {}
+ },
+ "resource": {
+ "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
+ "locale": "cs"
+ },
+ "lib/netcoreapp3.1/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
+ "locale": "cs"
+ },
+ "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
+ "locale": "de"
+ },
+ "lib/netcoreapp3.1/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
+ "locale": "de"
+ },
+ "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
+ "locale": "es"
+ },
+ "lib/netcoreapp3.1/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
+ "locale": "es"
+ },
+ "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
+ "locale": "fr"
+ },
+ "lib/netcoreapp3.1/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
+ "locale": "fr"
+ },
+ "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
+ "locale": "it"
+ },
+ "lib/netcoreapp3.1/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
+ "locale": "it"
+ },
+ "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
+ "locale": "ja"
+ },
+ "lib/netcoreapp3.1/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
+ "locale": "ja"
+ },
+ "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
+ "locale": "ko"
+ },
+ "lib/netcoreapp3.1/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
+ "locale": "ko"
+ },
+ "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
+ "locale": "pl"
+ },
+ "lib/netcoreapp3.1/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
+ "locale": "pl"
+ },
+ "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
+ "locale": "pt-BR"
+ },
+ "lib/netcoreapp3.1/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
+ "locale": "pt-BR"
+ },
+ "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
+ "locale": "ru"
+ },
+ "lib/netcoreapp3.1/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
+ "locale": "ru"
+ },
+ "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
+ "locale": "tr"
+ },
+ "lib/netcoreapp3.1/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
+ "locale": "tr"
+ },
+ "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
+ "locale": "zh-Hans"
+ },
+ "lib/netcoreapp3.1/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
+ "locale": "zh-Hans"
+ },
+ "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
+ "locale": "zh-Hant"
+ },
+ "lib/netcoreapp3.1/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
+ "locale": "zh-Hant"
+ }
+ }
+ },
+ "Microsoft.TestPlatform.TestHost/17.6.0": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.TestPlatform.ObjectModel": "17.6.0",
+ "Newtonsoft.Json": "13.0.1"
+ },
+ "compile": {
+ "lib/netcoreapp3.1/Microsoft.TestPlatform.CommunicationUtilities.dll": {},
+ "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll": {},
+ "lib/netcoreapp3.1/Microsoft.TestPlatform.CrossPlatEngine.dll": {},
+ "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll": {},
+ "lib/netcoreapp3.1/Microsoft.TestPlatform.Utilities.dll": {},
+ "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.Common.dll": {},
+ "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll": {},
+ "lib/netcoreapp3.1/testhost.dll": {
+ "related": ".deps.json"
+ }
+ },
+ "runtime": {
+ "lib/netcoreapp3.1/Microsoft.TestPlatform.CommunicationUtilities.dll": {},
+ "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll": {},
+ "lib/netcoreapp3.1/Microsoft.TestPlatform.CrossPlatEngine.dll": {},
+ "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll": {},
+ "lib/netcoreapp3.1/Microsoft.TestPlatform.Utilities.dll": {},
+ "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.Common.dll": {},
+ "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll": {},
+ "lib/netcoreapp3.1/testhost.dll": {
+ "related": ".deps.json"
+ }
+ },
+ "resource": {
+ "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
+ "locale": "cs"
+ },
+ "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
+ "locale": "cs"
+ },
+ "lib/netcoreapp3.1/cs/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
+ "locale": "cs"
+ },
+ "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
+ "locale": "de"
+ },
+ "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
+ "locale": "de"
+ },
+ "lib/netcoreapp3.1/de/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
+ "locale": "de"
+ },
+ "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
+ "locale": "es"
+ },
+ "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
+ "locale": "es"
+ },
+ "lib/netcoreapp3.1/es/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
+ "locale": "es"
+ },
+ "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
+ "locale": "fr"
+ },
+ "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
+ "locale": "fr"
+ },
+ "lib/netcoreapp3.1/fr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
+ "locale": "fr"
+ },
+ "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
+ "locale": "it"
+ },
+ "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
+ "locale": "it"
+ },
+ "lib/netcoreapp3.1/it/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
+ "locale": "it"
+ },
+ "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
+ "locale": "ja"
+ },
+ "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
+ "locale": "ja"
+ },
+ "lib/netcoreapp3.1/ja/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
+ "locale": "ja"
+ },
+ "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
+ "locale": "ko"
+ },
+ "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
+ "locale": "ko"
+ },
+ "lib/netcoreapp3.1/ko/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
+ "locale": "ko"
+ },
+ "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
+ "locale": "pl"
+ },
+ "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
+ "locale": "pl"
+ },
+ "lib/netcoreapp3.1/pl/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
+ "locale": "pl"
+ },
+ "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
+ "locale": "pt-BR"
+ },
+ "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
+ "locale": "pt-BR"
+ },
+ "lib/netcoreapp3.1/pt-BR/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
+ "locale": "pt-BR"
+ },
+ "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
+ "locale": "ru"
+ },
+ "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
+ "locale": "ru"
+ },
+ "lib/netcoreapp3.1/ru/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
+ "locale": "ru"
+ },
+ "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
+ "locale": "tr"
+ },
+ "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
+ "locale": "tr"
+ },
+ "lib/netcoreapp3.1/tr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
+ "locale": "tr"
+ },
+ "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
+ "locale": "zh-Hans"
+ },
+ "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
+ "locale": "zh-Hans"
+ },
+ "lib/netcoreapp3.1/zh-Hans/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
+ "locale": "zh-Hans"
+ },
+ "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
+ "locale": "zh-Hant"
+ },
+ "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
+ "locale": "zh-Hant"
+ },
+ "lib/netcoreapp3.1/zh-Hant/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
+ "locale": "zh-Hant"
+ }
+ },
+ "build": {
+ "build/netcoreapp3.1/Microsoft.TestPlatform.TestHost.props": {}
+ }
+ },
+ "Moq/4.20.70": {
+ "type": "package",
+ "dependencies": {
+ "Castle.Core": "5.1.1"
+ },
+ "compile": {
+ "lib/net6.0/Moq.dll": {
+ "related": ".xml"
+ }
+ },
+ "runtime": {
+ "lib/net6.0/Moq.dll": {
+ "related": ".xml"
+ }
+ }
+ },
+ "NETStandard.Library/2.0.0": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0"
+ },
+ "compile": {
+ "lib/netstandard1.0/_._": {}
+ },
+ "runtime": {
+ "lib/netstandard1.0/_._": {}
+ },
+ "build": {
+ "build/netstandard2.0/NETStandard.Library.targets": {}
+ }
+ },
+ "Newtonsoft.Json/13.0.1": {
+ "type": "package",
+ "compile": {
+ "lib/netstandard2.0/Newtonsoft.Json.dll": {
+ "related": ".xml"
+ }
+ },
+ "runtime": {
+ "lib/netstandard2.0/Newtonsoft.Json.dll": {
+ "related": ".xml"
+ }
+ }
+ },
+ "NLog/5.3.2": {
+ "type": "package",
+ "compile": {
+ "lib/netstandard2.0/NLog.dll": {
+ "related": ".xml"
+ }
+ },
+ "runtime": {
+ "lib/netstandard2.0/NLog.dll": {
+ "related": ".xml"
+ }
+ }
+ },
+ "NuGet.Frameworks/5.11.0": {
+ "type": "package",
+ "compile": {
+ "lib/netstandard2.0/NuGet.Frameworks.dll": {
+ "related": ".xml"
+ }
+ },
+ "runtime": {
+ "lib/netstandard2.0/NuGet.Frameworks.dll": {
+ "related": ".xml"
+ }
+ }
+ },
+ "NUnit/3.13.3": {
+ "type": "package",
+ "dependencies": {
+ "NETStandard.Library": "2.0.0"
+ },
+ "compile": {
+ "lib/netstandard2.0/nunit.framework.dll": {
+ "related": ".xml"
+ }
+ },
+ "runtime": {
+ "lib/netstandard2.0/nunit.framework.dll": {
+ "related": ".xml"
+ }
+ },
+ "build": {
+ "build/NUnit.props": {}
+ }
+ },
+ "NUnit.Analyzers/3.6.1": {
+ "type": "package"
+ },
+ "NUnit3TestAdapter/4.2.1": {
+ "type": "package",
+ "build": {
+ "build/netcoreapp2.1/NUnit3TestAdapter.props": {}
+ }
+ },
+ "System.Diagnostics.EventLog/6.0.0": {
+ "type": "package",
+ "compile": {
+ "lib/net6.0/System.Diagnostics.EventLog.dll": {
+ "related": ".xml"
+ }
+ },
+ "runtime": {
+ "lib/net6.0/System.Diagnostics.EventLog.dll": {
+ "related": ".xml"
+ }
+ },
+ "build": {
+ "buildTransitive/netcoreapp3.1/_._": {}
+ },
+ "runtimeTargets": {
+ "runtimes/win/lib/net6.0/System.Diagnostics.EventLog.Messages.dll": {
+ "assetType": "runtime",
+ "rid": "win"
+ },
+ "runtimes/win/lib/net6.0/System.Diagnostics.EventLog.dll": {
+ "assetType": "runtime",
+ "rid": "win"
+ }
+ }
+ },
+ "System.Reflection.Metadata/1.6.0": {
+ "type": "package",
+ "compile": {
+ "lib/netstandard2.0/System.Reflection.Metadata.dll": {
+ "related": ".xml"
+ }
+ },
+ "runtime": {
+ "lib/netstandard2.0/System.Reflection.Metadata.dll": {
+ "related": ".xml"
+ }
+ }
+ },
+ "AudioWaveOutClassLibrary/1.0.0": {
+ "type": "project",
+ "framework": ".NETCoreApp,Version=v8.0",
+ "compile": {
+ "bin/placeholder/AudioWaveOutClassLibrary.dll": {}
+ },
+ "runtime": {
+ "bin/placeholder/AudioWaveOutClassLibrary.dll": {}
+ }
+ }
+ }
+ },
+ "libraries": {
+ "Castle.Core/5.1.1": {
+ "sha512": "rpYtIczkzGpf+EkZgDr9CClTdemhsrwA/W5hMoPjLkRFnXzH44zDLoovXeKtmxb1ykXK9aJVODSpiJml8CTw2g==",
+ "type": "package",
+ "path": "castle.core/5.1.1",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "ASL - Apache Software Foundation License.txt",
+ "CHANGELOG.md",
+ "LICENSE",
+ "castle-logo.png",
+ "castle.core.5.1.1.nupkg.sha512",
+ "castle.core.nuspec",
+ "lib/net462/Castle.Core.dll",
+ "lib/net462/Castle.Core.xml",
+ "lib/net6.0/Castle.Core.dll",
+ "lib/net6.0/Castle.Core.xml",
+ "lib/netstandard2.0/Castle.Core.dll",
+ "lib/netstandard2.0/Castle.Core.xml",
+ "lib/netstandard2.1/Castle.Core.dll",
+ "lib/netstandard2.1/Castle.Core.xml",
+ "readme.txt"
+ ]
+ },
+ "coverlet.collector/6.0.0": {
+ "sha512": "tW3lsNS+dAEII6YGUX/VMoJjBS1QvsxqJeqLaJXub08y1FSjasFPtQ4UBUsudE9PNrzLjooClMsPtY2cZLdXpQ==",
+ "type": "package",
+ "path": "coverlet.collector/6.0.0",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "build/netstandard1.0/Microsoft.Bcl.AsyncInterfaces.dll",
+ "build/netstandard1.0/Microsoft.CSharp.dll",
+ "build/netstandard1.0/Microsoft.DotNet.PlatformAbstractions.dll",
+ "build/netstandard1.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll",
+ "build/netstandard1.0/Microsoft.Extensions.DependencyInjection.dll",
+ "build/netstandard1.0/Microsoft.Extensions.DependencyModel.dll",
+ "build/netstandard1.0/Microsoft.Extensions.FileSystemGlobbing.dll",
+ "build/netstandard1.0/Microsoft.TestPlatform.CoreUtilities.dll",
+ "build/netstandard1.0/Microsoft.TestPlatform.PlatformAbstractions.dll",
+ "build/netstandard1.0/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll",
+ "build/netstandard1.0/Mono.Cecil.Mdb.dll",
+ "build/netstandard1.0/Mono.Cecil.Pdb.dll",
+ "build/netstandard1.0/Mono.Cecil.Rocks.dll",
+ "build/netstandard1.0/Mono.Cecil.dll",
+ "build/netstandard1.0/Newtonsoft.Json.dll",
+ "build/netstandard1.0/NuGet.Frameworks.dll",
+ "build/netstandard1.0/System.AppContext.dll",
+ "build/netstandard1.0/System.Collections.Immutable.dll",
+ "build/netstandard1.0/System.Dynamic.Runtime.dll",
+ "build/netstandard1.0/System.IO.FileSystem.Primitives.dll",
+ "build/netstandard1.0/System.Linq.Expressions.dll",
+ "build/netstandard1.0/System.Linq.dll",
+ "build/netstandard1.0/System.ObjectModel.dll",
+ "build/netstandard1.0/System.Reflection.Emit.ILGeneration.dll",
+ "build/netstandard1.0/System.Reflection.Emit.Lightweight.dll",
+ "build/netstandard1.0/System.Reflection.Emit.dll",
+ "build/netstandard1.0/System.Reflection.Metadata.dll",
+ "build/netstandard1.0/System.Reflection.TypeExtensions.dll",
+ "build/netstandard1.0/System.Runtime.CompilerServices.Unsafe.dll",
+ "build/netstandard1.0/System.Runtime.Serialization.Primitives.dll",
+ "build/netstandard1.0/System.Text.RegularExpressions.dll",
+ "build/netstandard1.0/System.Threading.Tasks.Extensions.dll",
+ "build/netstandard1.0/System.Threading.dll",
+ "build/netstandard1.0/System.Xml.ReaderWriter.dll",
+ "build/netstandard1.0/System.Xml.XDocument.dll",
+ "build/netstandard1.0/coverlet.collector.deps.json",
+ "build/netstandard1.0/coverlet.collector.dll",
+ "build/netstandard1.0/coverlet.collector.pdb",
+ "build/netstandard1.0/coverlet.collector.targets",
+ "build/netstandard1.0/coverlet.core.dll",
+ "build/netstandard1.0/coverlet.core.pdb",
+ "coverlet-icon.png",
+ "coverlet.collector.6.0.0.nupkg.sha512",
+ "coverlet.collector.nuspec"
+ ]
+ },
+ "Microsoft.CodeCoverage/17.6.0": {
+ "sha512": "5v2GwzpR7JEuQUzupjx3zLwn2FutADW/weLzLt726DR3WXxsM+ICPoJG6pxuKFsumtZp890UrVuudTUhsE8Qyg==",
+ "type": "package",
+ "path": "microsoft.codecoverage/17.6.0",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "Icon.png",
+ "LICENSE_NET.txt",
+ "ThirdPartyNotices.txt",
+ "build/netstandard2.0/CodeCoverage/CodeCoverage.config",
+ "build/netstandard2.0/CodeCoverage/CodeCoverage.exe",
+ "build/netstandard2.0/CodeCoverage/VanguardInstrumentationProfiler_x86.config",
+ "build/netstandard2.0/CodeCoverage/amd64/CodeCoverage.exe",
+ "build/netstandard2.0/CodeCoverage/amd64/VanguardInstrumentationProfiler_x64.config",
+ "build/netstandard2.0/CodeCoverage/amd64/covrun64.dll",
+ "build/netstandard2.0/CodeCoverage/amd64/msdia140.dll",
+ "build/netstandard2.0/CodeCoverage/arm64/VanguardInstrumentationProfiler_arm64.config",
+ "build/netstandard2.0/CodeCoverage/arm64/covrunarm64.dll",
+ "build/netstandard2.0/CodeCoverage/arm64/msdia140.dll",
+ "build/netstandard2.0/CodeCoverage/codecoveragemessages.dll",
+ "build/netstandard2.0/CodeCoverage/coreclr/Microsoft.VisualStudio.CodeCoverage.Shim.dll",
+ "build/netstandard2.0/CodeCoverage/covrun32.dll",
+ "build/netstandard2.0/CodeCoverage/msdia140.dll",
+ "build/netstandard2.0/InstrumentationEngine/alpine/x64/VanguardInstrumentationProfiler_x64.config",
+ "build/netstandard2.0/InstrumentationEngine/alpine/x64/libCoverageInstrumentationMethod.so",
+ "build/netstandard2.0/InstrumentationEngine/alpine/x64/libInstrumentationEngine.so",
+ "build/netstandard2.0/InstrumentationEngine/arm64/MicrosoftInstrumentationEngine_arm64.dll",
+ "build/netstandard2.0/InstrumentationEngine/macos/x64/VanguardInstrumentationProfiler_x64.config",
+ "build/netstandard2.0/InstrumentationEngine/macos/x64/libCoverageInstrumentationMethod.dylib",
+ "build/netstandard2.0/InstrumentationEngine/macos/x64/libInstrumentationEngine.dylib",
+ "build/netstandard2.0/InstrumentationEngine/ubuntu/x64/VanguardInstrumentationProfiler_x64.config",
+ "build/netstandard2.0/InstrumentationEngine/ubuntu/x64/libCoverageInstrumentationMethod.so",
+ "build/netstandard2.0/InstrumentationEngine/ubuntu/x64/libInstrumentationEngine.so",
+ "build/netstandard2.0/InstrumentationEngine/x64/MicrosoftInstrumentationEngine_x64.dll",
+ "build/netstandard2.0/InstrumentationEngine/x86/MicrosoftInstrumentationEngine_x86.dll",
+ "build/netstandard2.0/Microsoft.CodeCoverage.Core.dll",
+ "build/netstandard2.0/Microsoft.CodeCoverage.Instrumentation.dll",
+ "build/netstandard2.0/Microsoft.CodeCoverage.Interprocess.dll",
+ "build/netstandard2.0/Microsoft.CodeCoverage.props",
+ "build/netstandard2.0/Microsoft.CodeCoverage.targets",
+ "build/netstandard2.0/Microsoft.DiaSymReader.dll",
+ "build/netstandard2.0/Microsoft.VisualStudio.TraceDataCollector.dll",
+ "build/netstandard2.0/Mono.Cecil.Pdb.dll",
+ "build/netstandard2.0/Mono.Cecil.Rocks.dll",
+ "build/netstandard2.0/Mono.Cecil.dll",
+ "build/netstandard2.0/ThirdPartyNotices.txt",
+ "build/netstandard2.0/cs/Microsoft.VisualStudio.TraceDataCollector.resources.dll",
+ "build/netstandard2.0/de/Microsoft.VisualStudio.TraceDataCollector.resources.dll",
+ "build/netstandard2.0/es/Microsoft.VisualStudio.TraceDataCollector.resources.dll",
+ "build/netstandard2.0/fr/Microsoft.VisualStudio.TraceDataCollector.resources.dll",
+ "build/netstandard2.0/it/Microsoft.VisualStudio.TraceDataCollector.resources.dll",
+ "build/netstandard2.0/ja/Microsoft.VisualStudio.TraceDataCollector.resources.dll",
+ "build/netstandard2.0/ko/Microsoft.VisualStudio.TraceDataCollector.resources.dll",
+ "build/netstandard2.0/pl/Microsoft.VisualStudio.TraceDataCollector.resources.dll",
+ "build/netstandard2.0/pt-BR/Microsoft.VisualStudio.TraceDataCollector.resources.dll",
+ "build/netstandard2.0/ru/Microsoft.VisualStudio.TraceDataCollector.resources.dll",
+ "build/netstandard2.0/tr/Microsoft.VisualStudio.TraceDataCollector.resources.dll",
+ "build/netstandard2.0/zh-Hans/Microsoft.VisualStudio.TraceDataCollector.resources.dll",
+ "build/netstandard2.0/zh-Hant/Microsoft.VisualStudio.TraceDataCollector.resources.dll",
+ "lib/net462/Microsoft.VisualStudio.CodeCoverage.Shim.dll",
+ "lib/netcoreapp3.1/Microsoft.VisualStudio.CodeCoverage.Shim.dll",
+ "microsoft.codecoverage.17.6.0.nupkg.sha512",
+ "microsoft.codecoverage.nuspec"
+ ]
+ },
+ "Microsoft.NET.Test.Sdk/17.6.0": {
+ "sha512": "tHyg4C6c89QvLv6Utz3xKlba4EeoyJyIz59Q1NrjRENV7gfGnSE6I+sYPIbVOzQttoo2zpHDgOK/p6Hw2OlD7A==",
+ "type": "package",
+ "path": "microsoft.net.test.sdk/17.6.0",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "Icon.png",
+ "LICENSE_NET.txt",
+ "build/net462/Microsoft.NET.Test.Sdk.props",
+ "build/net462/Microsoft.NET.Test.Sdk.targets",
+ "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.Program.cs",
+ "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.Program.fs",
+ "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.Program.vb",
+ "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.props",
+ "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.targets",
+ "buildMultiTargeting/Microsoft.NET.Test.Sdk.props",
+ "lib/net462/_._",
+ "lib/netcoreapp3.1/_._",
+ "microsoft.net.test.sdk.17.6.0.nupkg.sha512",
+ "microsoft.net.test.sdk.nuspec"
+ ]
+ },
+ "Microsoft.NETCore.Platforms/1.1.0": {
+ "sha512": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==",
+ "type": "package",
+ "path": "microsoft.netcore.platforms/1.1.0",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/netstandard1.0/_._",
+ "microsoft.netcore.platforms.1.1.0.nupkg.sha512",
+ "microsoft.netcore.platforms.nuspec",
+ "runtime.json"
+ ]
+ },
+ "Microsoft.TestPlatform.ObjectModel/17.6.0": {
+ "sha512": "AA/rrf5zwC5/OBLEOajkhjbVTM3SvxRXy8kcQ8e4mJKojbyZvqqhpfNg362N9vXU94DLg9NUTFOAnoYVT0pTJw==",
+ "type": "package",
+ "path": "microsoft.testplatform.objectmodel/17.6.0",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "Icon.png",
+ "LICENSE_NET.txt",
+ "lib/net462/Microsoft.TestPlatform.CoreUtilities.dll",
+ "lib/net462/Microsoft.TestPlatform.PlatformAbstractions.dll",
+ "lib/net462/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll",
+ "lib/net462/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/net462/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/net462/de/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/net462/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/net462/es/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/net462/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/net462/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/net462/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/net462/it/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/net462/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/net462/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/net462/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/net462/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/net462/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/net462/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/net462/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/net462/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/net462/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/net462/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/net462/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/net462/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/net462/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/net462/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/net462/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/net462/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/net462/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll",
+ "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll",
+ "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll",
+ "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/netcoreapp3.1/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/netcoreapp3.1/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/netcoreapp3.1/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/netcoreapp3.1/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/netcoreapp3.1/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/netcoreapp3.1/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/netcoreapp3.1/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/netcoreapp3.1/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/netcoreapp3.1/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/netcoreapp3.1/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/netcoreapp3.1/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/netcoreapp3.1/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/netcoreapp3.1/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/netstandard2.0/Microsoft.TestPlatform.CoreUtilities.dll",
+ "lib/netstandard2.0/Microsoft.TestPlatform.PlatformAbstractions.dll",
+ "lib/netstandard2.0/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll",
+ "lib/netstandard2.0/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/netstandard2.0/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/netstandard2.0/de/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/netstandard2.0/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/netstandard2.0/es/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/netstandard2.0/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/netstandard2.0/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/netstandard2.0/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/netstandard2.0/it/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/netstandard2.0/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/netstandard2.0/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/netstandard2.0/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/netstandard2.0/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/netstandard2.0/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/netstandard2.0/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/netstandard2.0/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/netstandard2.0/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/netstandard2.0/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/netstandard2.0/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/netstandard2.0/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/netstandard2.0/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/netstandard2.0/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/netstandard2.0/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/netstandard2.0/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "lib/netstandard2.0/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll",
+ "lib/netstandard2.0/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll",
+ "microsoft.testplatform.objectmodel.17.6.0.nupkg.sha512",
+ "microsoft.testplatform.objectmodel.nuspec"
+ ]
+ },
+ "Microsoft.TestPlatform.TestHost/17.6.0": {
+ "sha512": "7YdgUcIeCPVKLC7n7LNKDiEHWc7z3brkkYPdUbDnFsvf6WvY9UfzS0VSUJ8P2NgN0CDSD223GCJFSjSBLZRqOQ==",
+ "type": "package",
+ "path": "microsoft.testplatform.testhost/17.6.0",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "Icon.png",
+ "LICENSE_NET.txt",
+ "ThirdPartyNotices.txt",
+ "build/netcoreapp3.1/Microsoft.TestPlatform.TestHost.props",
+ "build/netcoreapp3.1/x64/testhost.dll",
+ "build/netcoreapp3.1/x64/testhost.exe",
+ "build/netcoreapp3.1/x86/testhost.x86.dll",
+ "build/netcoreapp3.1/x86/testhost.x86.exe",
+ "lib/net462/_._",
+ "lib/netcoreapp3.1/Microsoft.TestPlatform.CommunicationUtilities.dll",
+ "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll",
+ "lib/netcoreapp3.1/Microsoft.TestPlatform.CrossPlatEngine.dll",
+ "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll",
+ "lib/netcoreapp3.1/Microsoft.TestPlatform.Utilities.dll",
+ "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.Common.dll",
+ "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll",
+ "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CommunicationUtilities.resources.dll",
+ "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CrossPlatEngine.resources.dll",
+ "lib/netcoreapp3.1/cs/Microsoft.VisualStudio.TestPlatform.Common.resources.dll",
+ "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CommunicationUtilities.resources.dll",
+ "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CrossPlatEngine.resources.dll",
+ "lib/netcoreapp3.1/de/Microsoft.VisualStudio.TestPlatform.Common.resources.dll",
+ "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CommunicationUtilities.resources.dll",
+ "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CrossPlatEngine.resources.dll",
+ "lib/netcoreapp3.1/es/Microsoft.VisualStudio.TestPlatform.Common.resources.dll",
+ "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll",
+ "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll",
+ "lib/netcoreapp3.1/fr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll",
+ "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CommunicationUtilities.resources.dll",
+ "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CrossPlatEngine.resources.dll",
+ "lib/netcoreapp3.1/it/Microsoft.VisualStudio.TestPlatform.Common.resources.dll",
+ "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CommunicationUtilities.resources.dll",
+ "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CrossPlatEngine.resources.dll",
+ "lib/netcoreapp3.1/ja/Microsoft.VisualStudio.TestPlatform.Common.resources.dll",
+ "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CommunicationUtilities.resources.dll",
+ "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CrossPlatEngine.resources.dll",
+ "lib/netcoreapp3.1/ko/Microsoft.VisualStudio.TestPlatform.Common.resources.dll",
+ "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CommunicationUtilities.resources.dll",
+ "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CrossPlatEngine.resources.dll",
+ "lib/netcoreapp3.1/pl/Microsoft.VisualStudio.TestPlatform.Common.resources.dll",
+ "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CommunicationUtilities.resources.dll",
+ "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CrossPlatEngine.resources.dll",
+ "lib/netcoreapp3.1/pt-BR/Microsoft.VisualStudio.TestPlatform.Common.resources.dll",
+ "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CommunicationUtilities.resources.dll",
+ "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CrossPlatEngine.resources.dll",
+ "lib/netcoreapp3.1/ru/Microsoft.VisualStudio.TestPlatform.Common.resources.dll",
+ "lib/netcoreapp3.1/testhost.deps.json",
+ "lib/netcoreapp3.1/testhost.dll",
+ "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll",
+ "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll",
+ "lib/netcoreapp3.1/tr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll",
+ "lib/netcoreapp3.1/x64/msdia140.dll",
+ "lib/netcoreapp3.1/x86/msdia140.dll",
+ "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CommunicationUtilities.resources.dll",
+ "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CrossPlatEngine.resources.dll",
+ "lib/netcoreapp3.1/zh-Hans/Microsoft.VisualStudio.TestPlatform.Common.resources.dll",
+ "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CommunicationUtilities.resources.dll",
+ "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CrossPlatEngine.resources.dll",
+ "lib/netcoreapp3.1/zh-Hant/Microsoft.VisualStudio.TestPlatform.Common.resources.dll",
+ "microsoft.testplatform.testhost.17.6.0.nupkg.sha512",
+ "microsoft.testplatform.testhost.nuspec"
+ ]
+ },
+ "Moq/4.20.70": {
+ "sha512": "4rNnAwdpXJBuxqrOCzCyICXHSImOTRktCgCWXWykuF1qwoIsVvEnR7PjbMk/eLOxWvhmj5Kwt+kDV3RGUYcNwg==",
+ "type": "package",
+ "path": "moq/4.20.70",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "icon.png",
+ "lib/net462/Moq.dll",
+ "lib/net462/Moq.xml",
+ "lib/net6.0/Moq.dll",
+ "lib/net6.0/Moq.xml",
+ "lib/netstandard2.0/Moq.dll",
+ "lib/netstandard2.0/Moq.xml",
+ "lib/netstandard2.1/Moq.dll",
+ "lib/netstandard2.1/Moq.xml",
+ "moq.4.20.70.nupkg.sha512",
+ "moq.nuspec",
+ "readme.md"
+ ]
+ },
+ "NETStandard.Library/2.0.0": {
+ "sha512": "7jnbRU+L08FXKMxqUflxEXtVymWvNOrS8yHgu9s6EM8Anr6T/wIX4nZ08j/u3Asz+tCufp3YVwFSEvFTPYmBPA==",
+ "type": "package",
+ "path": "netstandard.library/2.0.0",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "LICENSE.TXT",
+ "THIRD-PARTY-NOTICES.TXT",
+ "build/NETStandard.Library.targets",
+ "build/netstandard2.0/NETStandard.Library.targets",
+ "build/netstandard2.0/ref/Microsoft.Win32.Primitives.dll",
+ "build/netstandard2.0/ref/System.AppContext.dll",
+ "build/netstandard2.0/ref/System.Collections.Concurrent.dll",
+ "build/netstandard2.0/ref/System.Collections.NonGeneric.dll",
+ "build/netstandard2.0/ref/System.Collections.Specialized.dll",
+ "build/netstandard2.0/ref/System.Collections.dll",
+ "build/netstandard2.0/ref/System.ComponentModel.Composition.dll",
+ "build/netstandard2.0/ref/System.ComponentModel.EventBasedAsync.dll",
+ "build/netstandard2.0/ref/System.ComponentModel.Primitives.dll",
+ "build/netstandard2.0/ref/System.ComponentModel.TypeConverter.dll",
+ "build/netstandard2.0/ref/System.ComponentModel.dll",
+ "build/netstandard2.0/ref/System.Console.dll",
+ "build/netstandard2.0/ref/System.Core.dll",
+ "build/netstandard2.0/ref/System.Data.Common.dll",
+ "build/netstandard2.0/ref/System.Data.dll",
+ "build/netstandard2.0/ref/System.Diagnostics.Contracts.dll",
+ "build/netstandard2.0/ref/System.Diagnostics.Debug.dll",
+ "build/netstandard2.0/ref/System.Diagnostics.FileVersionInfo.dll",
+ "build/netstandard2.0/ref/System.Diagnostics.Process.dll",
+ "build/netstandard2.0/ref/System.Diagnostics.StackTrace.dll",
+ "build/netstandard2.0/ref/System.Diagnostics.TextWriterTraceListener.dll",
+ "build/netstandard2.0/ref/System.Diagnostics.Tools.dll",
+ "build/netstandard2.0/ref/System.Diagnostics.TraceSource.dll",
+ "build/netstandard2.0/ref/System.Diagnostics.Tracing.dll",
+ "build/netstandard2.0/ref/System.Drawing.Primitives.dll",
+ "build/netstandard2.0/ref/System.Drawing.dll",
+ "build/netstandard2.0/ref/System.Dynamic.Runtime.dll",
+ "build/netstandard2.0/ref/System.Globalization.Calendars.dll",
+ "build/netstandard2.0/ref/System.Globalization.Extensions.dll",
+ "build/netstandard2.0/ref/System.Globalization.dll",
+ "build/netstandard2.0/ref/System.IO.Compression.FileSystem.dll",
+ "build/netstandard2.0/ref/System.IO.Compression.ZipFile.dll",
+ "build/netstandard2.0/ref/System.IO.Compression.dll",
+ "build/netstandard2.0/ref/System.IO.FileSystem.DriveInfo.dll",
+ "build/netstandard2.0/ref/System.IO.FileSystem.Primitives.dll",
+ "build/netstandard2.0/ref/System.IO.FileSystem.Watcher.dll",
+ "build/netstandard2.0/ref/System.IO.FileSystem.dll",
+ "build/netstandard2.0/ref/System.IO.IsolatedStorage.dll",
+ "build/netstandard2.0/ref/System.IO.MemoryMappedFiles.dll",
+ "build/netstandard2.0/ref/System.IO.Pipes.dll",
+ "build/netstandard2.0/ref/System.IO.UnmanagedMemoryStream.dll",
+ "build/netstandard2.0/ref/System.IO.dll",
+ "build/netstandard2.0/ref/System.Linq.Expressions.dll",
+ "build/netstandard2.0/ref/System.Linq.Parallel.dll",
+ "build/netstandard2.0/ref/System.Linq.Queryable.dll",
+ "build/netstandard2.0/ref/System.Linq.dll",
+ "build/netstandard2.0/ref/System.Net.Http.dll",
+ "build/netstandard2.0/ref/System.Net.NameResolution.dll",
+ "build/netstandard2.0/ref/System.Net.NetworkInformation.dll",
+ "build/netstandard2.0/ref/System.Net.Ping.dll",
+ "build/netstandard2.0/ref/System.Net.Primitives.dll",
+ "build/netstandard2.0/ref/System.Net.Requests.dll",
+ "build/netstandard2.0/ref/System.Net.Security.dll",
+ "build/netstandard2.0/ref/System.Net.Sockets.dll",
+ "build/netstandard2.0/ref/System.Net.WebHeaderCollection.dll",
+ "build/netstandard2.0/ref/System.Net.WebSockets.Client.dll",
+ "build/netstandard2.0/ref/System.Net.WebSockets.dll",
+ "build/netstandard2.0/ref/System.Net.dll",
+ "build/netstandard2.0/ref/System.Numerics.dll",
+ "build/netstandard2.0/ref/System.ObjectModel.dll",
+ "build/netstandard2.0/ref/System.Reflection.Extensions.dll",
+ "build/netstandard2.0/ref/System.Reflection.Primitives.dll",
+ "build/netstandard2.0/ref/System.Reflection.dll",
+ "build/netstandard2.0/ref/System.Resources.Reader.dll",
+ "build/netstandard2.0/ref/System.Resources.ResourceManager.dll",
+ "build/netstandard2.0/ref/System.Resources.Writer.dll",
+ "build/netstandard2.0/ref/System.Runtime.CompilerServices.VisualC.dll",
+ "build/netstandard2.0/ref/System.Runtime.Extensions.dll",
+ "build/netstandard2.0/ref/System.Runtime.Handles.dll",
+ "build/netstandard2.0/ref/System.Runtime.InteropServices.RuntimeInformation.dll",
+ "build/netstandard2.0/ref/System.Runtime.InteropServices.dll",
+ "build/netstandard2.0/ref/System.Runtime.Numerics.dll",
+ "build/netstandard2.0/ref/System.Runtime.Serialization.Formatters.dll",
+ "build/netstandard2.0/ref/System.Runtime.Serialization.Json.dll",
+ "build/netstandard2.0/ref/System.Runtime.Serialization.Primitives.dll",
+ "build/netstandard2.0/ref/System.Runtime.Serialization.Xml.dll",
+ "build/netstandard2.0/ref/System.Runtime.Serialization.dll",
+ "build/netstandard2.0/ref/System.Runtime.dll",
+ "build/netstandard2.0/ref/System.Security.Claims.dll",
+ "build/netstandard2.0/ref/System.Security.Cryptography.Algorithms.dll",
+ "build/netstandard2.0/ref/System.Security.Cryptography.Csp.dll",
+ "build/netstandard2.0/ref/System.Security.Cryptography.Encoding.dll",
+ "build/netstandard2.0/ref/System.Security.Cryptography.Primitives.dll",
+ "build/netstandard2.0/ref/System.Security.Cryptography.X509Certificates.dll",
+ "build/netstandard2.0/ref/System.Security.Principal.dll",
+ "build/netstandard2.0/ref/System.Security.SecureString.dll",
+ "build/netstandard2.0/ref/System.ServiceModel.Web.dll",
+ "build/netstandard2.0/ref/System.Text.Encoding.Extensions.dll",
+ "build/netstandard2.0/ref/System.Text.Encoding.dll",
+ "build/netstandard2.0/ref/System.Text.RegularExpressions.dll",
+ "build/netstandard2.0/ref/System.Threading.Overlapped.dll",
+ "build/netstandard2.0/ref/System.Threading.Tasks.Parallel.dll",
+ "build/netstandard2.0/ref/System.Threading.Tasks.dll",
+ "build/netstandard2.0/ref/System.Threading.Thread.dll",
+ "build/netstandard2.0/ref/System.Threading.ThreadPool.dll",
+ "build/netstandard2.0/ref/System.Threading.Timer.dll",
+ "build/netstandard2.0/ref/System.Threading.dll",
+ "build/netstandard2.0/ref/System.Transactions.dll",
+ "build/netstandard2.0/ref/System.ValueTuple.dll",
+ "build/netstandard2.0/ref/System.Web.dll",
+ "build/netstandard2.0/ref/System.Windows.dll",
+ "build/netstandard2.0/ref/System.Xml.Linq.dll",
+ "build/netstandard2.0/ref/System.Xml.ReaderWriter.dll",
+ "build/netstandard2.0/ref/System.Xml.Serialization.dll",
+ "build/netstandard2.0/ref/System.Xml.XDocument.dll",
+ "build/netstandard2.0/ref/System.Xml.XPath.XDocument.dll",
+ "build/netstandard2.0/ref/System.Xml.XPath.dll",
+ "build/netstandard2.0/ref/System.Xml.XmlDocument.dll",
+ "build/netstandard2.0/ref/System.Xml.XmlSerializer.dll",
+ "build/netstandard2.0/ref/System.Xml.dll",
+ "build/netstandard2.0/ref/System.dll",
+ "build/netstandard2.0/ref/mscorlib.dll",
+ "build/netstandard2.0/ref/netstandard.dll",
+ "build/netstandard2.0/ref/netstandard.xml",
+ "lib/netstandard1.0/_._",
+ "netstandard.library.2.0.0.nupkg.sha512",
+ "netstandard.library.nuspec"
+ ]
+ },
+ "Newtonsoft.Json/13.0.1": {
+ "sha512": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==",
+ "type": "package",
+ "path": "newtonsoft.json/13.0.1",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "LICENSE.md",
+ "lib/net20/Newtonsoft.Json.dll",
+ "lib/net20/Newtonsoft.Json.xml",
+ "lib/net35/Newtonsoft.Json.dll",
+ "lib/net35/Newtonsoft.Json.xml",
+ "lib/net40/Newtonsoft.Json.dll",
+ "lib/net40/Newtonsoft.Json.xml",
+ "lib/net45/Newtonsoft.Json.dll",
+ "lib/net45/Newtonsoft.Json.xml",
+ "lib/netstandard1.0/Newtonsoft.Json.dll",
+ "lib/netstandard1.0/Newtonsoft.Json.xml",
+ "lib/netstandard1.3/Newtonsoft.Json.dll",
+ "lib/netstandard1.3/Newtonsoft.Json.xml",
+ "lib/netstandard2.0/Newtonsoft.Json.dll",
+ "lib/netstandard2.0/Newtonsoft.Json.xml",
+ "newtonsoft.json.13.0.1.nupkg.sha512",
+ "newtonsoft.json.nuspec",
+ "packageIcon.png"
+ ]
+ },
+ "NLog/5.3.2": {
+ "sha512": "cQRQZuDMjSyMe9EQBnI9v55YAMMz8GAfFd6fFJ6tc/kXnG7Hze8p1I8MgvWSBG6E36wA8vSxRrlm8uSIG+SENg==",
+ "type": "package",
+ "path": "nlog/5.3.2",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "N.png",
+ "lib/net35/NLog.dll",
+ "lib/net35/NLog.xml",
+ "lib/net45/NLog.dll",
+ "lib/net45/NLog.xml",
+ "lib/net46/NLog.dll",
+ "lib/net46/NLog.xml",
+ "lib/netstandard1.3/NLog.dll",
+ "lib/netstandard1.3/NLog.xml",
+ "lib/netstandard1.5/NLog.dll",
+ "lib/netstandard1.5/NLog.xml",
+ "lib/netstandard2.0/NLog.dll",
+ "lib/netstandard2.0/NLog.xml",
+ "nlog.5.3.2.nupkg.sha512",
+ "nlog.nuspec"
+ ]
+ },
+ "NuGet.Frameworks/5.11.0": {
+ "sha512": "eaiXkUjC4NPcquGWzAGMXjuxvLwc6XGKMptSyOGQeT0X70BUZObuybJFZLA0OfTdueLd3US23NBPTBb6iF3V1Q==",
+ "type": "package",
+ "path": "nuget.frameworks/5.11.0",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "icon.png",
+ "lib/net40/NuGet.Frameworks.dll",
+ "lib/net40/NuGet.Frameworks.xml",
+ "lib/net472/NuGet.Frameworks.dll",
+ "lib/net472/NuGet.Frameworks.xml",
+ "lib/netstandard2.0/NuGet.Frameworks.dll",
+ "lib/netstandard2.0/NuGet.Frameworks.xml",
+ "nuget.frameworks.5.11.0.nupkg.sha512",
+ "nuget.frameworks.nuspec"
+ ]
+ },
+ "NUnit/3.13.3": {
+ "sha512": "KNPDpls6EfHwC3+nnA67fh5wpxeLb3VLFAfLxrug6JMYDLHH6InaQIWR7Sc3y75d/9IKzMksH/gi08W7XWbmnQ==",
+ "type": "package",
+ "path": "nunit/3.13.3",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "CHANGES.md",
+ "LICENSE.txt",
+ "NOTICES.txt",
+ "build/NUnit.props",
+ "icon.png",
+ "lib/net35/nunit.framework.dll",
+ "lib/net35/nunit.framework.xml",
+ "lib/net40/nunit.framework.dll",
+ "lib/net40/nunit.framework.xml",
+ "lib/net45/nunit.framework.dll",
+ "lib/net45/nunit.framework.xml",
+ "lib/netstandard2.0/nunit.framework.dll",
+ "lib/netstandard2.0/nunit.framework.xml",
+ "nunit.3.13.3.nupkg.sha512",
+ "nunit.nuspec"
+ ]
+ },
+ "NUnit.Analyzers/3.6.1": {
+ "sha512": "RKP9tpKfl3DmRgUDGgh3XM3XzeLMrCXXMZm6vm1nMsObZ6vtQL1L9NrK7+oZh1jWearvNsbMis2+AIOY3NFmow==",
+ "type": "package",
+ "path": "nunit.analyzers/3.6.1",
+ "hasTools": true,
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "analyzers/dotnet/cs/nunit.analyzers.dll",
+ "docs/README.md",
+ "images/nunit_256.png",
+ "license.txt",
+ "nunit.analyzers.3.6.1.nupkg.sha512",
+ "nunit.analyzers.nuspec",
+ "tools/install.ps1",
+ "tools/uninstall.ps1"
+ ]
+ },
+ "NUnit3TestAdapter/4.2.1": {
+ "sha512": "kgH8VKsrcZZgNGQXRpVCrM7TnNz9li3b/snH+YmnXUNqsaWa1Xw9EQWHpbzq4Li2FbTjTE/E5N5HdLNXzZ8BpQ==",
+ "type": "package",
+ "path": "nunit3testadapter/4.2.1",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "build/net35/NUnit3.TestAdapter.dll",
+ "build/net35/NUnit3.TestAdapter.pdb",
+ "build/net35/NUnit3TestAdapter.props",
+ "build/net35/nunit.engine.api.dll",
+ "build/net35/nunit.engine.core.dll",
+ "build/net35/nunit.engine.dll",
+ "build/net35/testcentric.engine.metadata.dll",
+ "build/netcoreapp2.1/NUnit3.TestAdapter.dll",
+ "build/netcoreapp2.1/NUnit3.TestAdapter.pdb",
+ "build/netcoreapp2.1/NUnit3TestAdapter.props",
+ "build/netcoreapp2.1/nunit.engine.api.dll",
+ "build/netcoreapp2.1/nunit.engine.core.dll",
+ "build/netcoreapp2.1/nunit.engine.dll",
+ "build/netcoreapp2.1/testcentric.engine.metadata.dll",
+ "nunit3testadapter.4.2.1.nupkg.sha512",
+ "nunit3testadapter.nuspec"
+ ]
+ },
+ "System.Diagnostics.EventLog/6.0.0": {
+ "sha512": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw==",
+ "type": "package",
+ "path": "system.diagnostics.eventlog/6.0.0",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "Icon.png",
+ "LICENSE.TXT",
+ "THIRD-PARTY-NOTICES.TXT",
+ "buildTransitive/netcoreapp2.0/System.Diagnostics.EventLog.targets",
+ "buildTransitive/netcoreapp3.1/_._",
+ "lib/net461/System.Diagnostics.EventLog.dll",
+ "lib/net461/System.Diagnostics.EventLog.xml",
+ "lib/net6.0/System.Diagnostics.EventLog.dll",
+ "lib/net6.0/System.Diagnostics.EventLog.xml",
+ "lib/netcoreapp3.1/System.Diagnostics.EventLog.dll",
+ "lib/netcoreapp3.1/System.Diagnostics.EventLog.xml",
+ "lib/netstandard2.0/System.Diagnostics.EventLog.dll",
+ "lib/netstandard2.0/System.Diagnostics.EventLog.xml",
+ "runtimes/win/lib/net6.0/System.Diagnostics.EventLog.Messages.dll",
+ "runtimes/win/lib/net6.0/System.Diagnostics.EventLog.dll",
+ "runtimes/win/lib/net6.0/System.Diagnostics.EventLog.xml",
+ "runtimes/win/lib/netcoreapp3.1/System.Diagnostics.EventLog.Messages.dll",
+ "runtimes/win/lib/netcoreapp3.1/System.Diagnostics.EventLog.dll",
+ "runtimes/win/lib/netcoreapp3.1/System.Diagnostics.EventLog.xml",
+ "system.diagnostics.eventlog.6.0.0.nupkg.sha512",
+ "system.diagnostics.eventlog.nuspec",
+ "useSharedDesignerContext.txt"
+ ]
+ },
+ "System.Reflection.Metadata/1.6.0": {
+ "sha512": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==",
+ "type": "package",
+ "path": "system.reflection.metadata/1.6.0",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "LICENSE.TXT",
+ "THIRD-PARTY-NOTICES.TXT",
+ "lib/netstandard1.1/System.Reflection.Metadata.dll",
+ "lib/netstandard1.1/System.Reflection.Metadata.xml",
+ "lib/netstandard2.0/System.Reflection.Metadata.dll",
+ "lib/netstandard2.0/System.Reflection.Metadata.xml",
+ "lib/portable-net45+win8/System.Reflection.Metadata.dll",
+ "lib/portable-net45+win8/System.Reflection.Metadata.xml",
+ "system.reflection.metadata.1.6.0.nupkg.sha512",
+ "system.reflection.metadata.nuspec",
+ "useSharedDesignerContext.txt",
+ "version.txt"
+ ]
+ },
+ "AudioWaveOutClassLibrary/1.0.0": {
+ "type": "project",
+ "path": "../AudioWaveOutClassLibrary/AudioWaveOutClassLibrary.csproj",
+ "msbuildProject": "../AudioWaveOutClassLibrary/AudioWaveOutClassLibrary.csproj"
+ }
+ },
+ "projectFileDependencyGroups": {
+ "net8.0": [
+ "AudioWaveOutClassLibrary >= 1.0.0",
+ "Microsoft.NET.Test.Sdk >= 17.6.0",
+ "Moq >= 4.20.70",
+ "NLog >= 5.3.2",
+ "NUnit >= 3.13.3",
+ "NUnit.Analyzers >= 3.6.1",
+ "NUnit3TestAdapter >= 4.2.1",
+ "coverlet.collector >= 6.0.0"
+ ]
+ },
+ "packageFolders": {
+ "C:\\Users\\38096\\.nuget\\packages\\": {},
+ "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {}
+ },
+ "project": {
+ "version": "1.0.0",
+ "restore": {
+ "projectUniqueName": "C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\AudioWaveOutUnitTest\\AudioWaveOutUnitTest.csproj",
+ "projectName": "AudioWaveOutUnitTest",
+ "projectPath": "C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\AudioWaveOutUnitTest\\AudioWaveOutUnitTest.csproj",
+ "packagesPath": "C:\\Users\\38096\\.nuget\\packages\\",
+ "outputPath": "C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\AudioWaveOutUnitTest\\obj\\",
+ "projectStyle": "PackageReference",
+ "fallbackFolders": [
+ "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
+ ],
+ "configFilePaths": [
+ "C:\\Users\\38096\\AppData\\Roaming\\NuGet\\NuGet.Config",
+ "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
+ "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
+ ],
+ "originalTargetFrameworks": [
+ "net8.0"
+ ],
+ "sources": {
+ "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
+ "https://api.nuget.org/v3/index.json": {}
+ },
+ "frameworks": {
+ "net8.0": {
+ "targetAlias": "net8.0",
+ "projectReferences": {
+ "C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\AudioWaveOutClassLibrary\\AudioWaveOutClassLibrary.csproj": {
+ "projectPath": "C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\AudioWaveOutClassLibrary\\AudioWaveOutClassLibrary.csproj"
+ }
+ }
+ }
+ },
+ "warningProperties": {
+ "warnAsError": [
+ "NU1605"
+ ]
+ }
+ },
+ "frameworks": {
+ "net8.0": {
+ "targetAlias": "net8.0",
+ "dependencies": {
+ "Microsoft.NET.Test.Sdk": {
+ "target": "Package",
+ "version": "[17.6.0, )"
+ },
+ "Moq": {
+ "target": "Package",
+ "version": "[4.20.70, )"
+ },
+ "NLog": {
+ "target": "Package",
+ "version": "[5.3.2, )"
+ },
+ "NUnit": {
+ "target": "Package",
+ "version": "[3.13.3, )"
+ },
+ "NUnit.Analyzers": {
+ "target": "Package",
+ "version": "[3.6.1, )"
+ },
+ "NUnit3TestAdapter": {
+ "target": "Package",
+ "version": "[4.2.1, )"
+ },
+ "coverlet.collector": {
+ "target": "Package",
+ "version": "[6.0.0, )"
+ }
+ },
+ "imports": [
+ "net461",
+ "net462",
+ "net47",
+ "net471",
+ "net472",
+ "net48",
+ "net481"
+ ],
+ "assetTargetFallback": true,
+ "warn": true,
+ "frameworkReferences": {
+ "Microsoft.NETCore.App": {
+ "privateAssets": "all"
+ }
+ },
+ "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.100/PortableRuntimeIdentifierGraph.json"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/AudioWaveOutUnitTest/obj/project.nuget.cache b/AudioWaveOutUnitTest/obj/project.nuget.cache
new file mode 100644
index 0000000..4949093
--- /dev/null
+++ b/AudioWaveOutUnitTest/obj/project.nuget.cache
@@ -0,0 +1,26 @@
+{
+ "version": 2,
+ "dgSpecHash": "963hzHv7SomkF7Qnbg0UrmTnHGkDXf3KZuWOhROcbJH4Y0tpBWKZvlLrnVvr+xlqhk8t3MlAuKlqmvP3kDZBGw==",
+ "success": true,
+ "projectFilePath": "C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\AudioWaveOutUnitTest\\AudioWaveOutUnitTest.csproj",
+ "expectedPackageFiles": [
+ "C:\\Users\\38096\\.nuget\\packages\\castle.core\\5.1.1\\castle.core.5.1.1.nupkg.sha512",
+ "C:\\Users\\38096\\.nuget\\packages\\coverlet.collector\\6.0.0\\coverlet.collector.6.0.0.nupkg.sha512",
+ "C:\\Users\\38096\\.nuget\\packages\\microsoft.codecoverage\\17.6.0\\microsoft.codecoverage.17.6.0.nupkg.sha512",
+ "C:\\Users\\38096\\.nuget\\packages\\microsoft.net.test.sdk\\17.6.0\\microsoft.net.test.sdk.17.6.0.nupkg.sha512",
+ "C:\\Users\\38096\\.nuget\\packages\\microsoft.netcore.platforms\\1.1.0\\microsoft.netcore.platforms.1.1.0.nupkg.sha512",
+ "C:\\Users\\38096\\.nuget\\packages\\microsoft.testplatform.objectmodel\\17.6.0\\microsoft.testplatform.objectmodel.17.6.0.nupkg.sha512",
+ "C:\\Users\\38096\\.nuget\\packages\\microsoft.testplatform.testhost\\17.6.0\\microsoft.testplatform.testhost.17.6.0.nupkg.sha512",
+ "C:\\Users\\38096\\.nuget\\packages\\moq\\4.20.70\\moq.4.20.70.nupkg.sha512",
+ "C:\\Users\\38096\\.nuget\\packages\\netstandard.library\\2.0.0\\netstandard.library.2.0.0.nupkg.sha512",
+ "C:\\Users\\38096\\.nuget\\packages\\newtonsoft.json\\13.0.1\\newtonsoft.json.13.0.1.nupkg.sha512",
+ "C:\\Users\\38096\\.nuget\\packages\\nlog\\5.3.2\\nlog.5.3.2.nupkg.sha512",
+ "C:\\Users\\38096\\.nuget\\packages\\nuget.frameworks\\5.11.0\\nuget.frameworks.5.11.0.nupkg.sha512",
+ "C:\\Users\\38096\\.nuget\\packages\\nunit\\3.13.3\\nunit.3.13.3.nupkg.sha512",
+ "C:\\Users\\38096\\.nuget\\packages\\nunit.analyzers\\3.6.1\\nunit.analyzers.3.6.1.nupkg.sha512",
+ "C:\\Users\\38096\\.nuget\\packages\\nunit3testadapter\\4.2.1\\nunit3testadapter.4.2.1.nupkg.sha512",
+ "C:\\Users\\38096\\.nuget\\packages\\system.diagnostics.eventlog\\6.0.0\\system.diagnostics.eventlog.6.0.0.nupkg.sha512",
+ "C:\\Users\\38096\\.nuget\\packages\\system.reflection.metadata\\1.6.0\\system.reflection.metadata.1.6.0.nupkg.sha512"
+ ],
+ "logs": []
+}
\ No newline at end of file
diff --git a/CelestialRTP.sln b/CelestialRTP.sln
new file mode 100644
index 0000000..e4ce924
--- /dev/null
+++ b/CelestialRTP.sln
@@ -0,0 +1,47 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.8.34330.188
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CelestialRTP", "CelestialRTP\CelestialRTP.csproj", "{7432B99B-0AFA-477D-B7F8-77E253EB8D33}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AudioWaveOut", "AudioWaveOut", "{766801AD-6F44-4488-963B-166E0EE46902}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AudioWaveOutClassLibrary", "AudioWaveOutClassLibrary\AudioWaveOutClassLibrary.csproj", "{5F70F0F8-0233-49F3-8E94-87FD9B459AC0}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AudioLibraryUnitTests", "AudioLibraryUnitTests", "{BD87B51B-8B84-4352-84E0-51A942C787BB}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AudioWaveOutUnitTest", "AudioWaveOutUnitTest\AudioWaveOutUnitTest.csproj", "{6CBFC9A3-AF84-4903-82E1-3BAAAEB66A3C}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Docs", "Docs", "{7C5450DB-B97C-428F-8875-A3B3F9DADBE4}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {7432B99B-0AFA-477D-B7F8-77E253EB8D33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7432B99B-0AFA-477D-B7F8-77E253EB8D33}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7432B99B-0AFA-477D-B7F8-77E253EB8D33}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7432B99B-0AFA-477D-B7F8-77E253EB8D33}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5F70F0F8-0233-49F3-8E94-87FD9B459AC0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {5F70F0F8-0233-49F3-8E94-87FD9B459AC0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5F70F0F8-0233-49F3-8E94-87FD9B459AC0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {5F70F0F8-0233-49F3-8E94-87FD9B459AC0}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6CBFC9A3-AF84-4903-82E1-3BAAAEB66A3C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6CBFC9A3-AF84-4903-82E1-3BAAAEB66A3C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6CBFC9A3-AF84-4903-82E1-3BAAAEB66A3C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6CBFC9A3-AF84-4903-82E1-3BAAAEB66A3C}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {5F70F0F8-0233-49F3-8E94-87FD9B459AC0} = {766801AD-6F44-4488-963B-166E0EE46902}
+ {6CBFC9A3-AF84-4903-82E1-3BAAAEB66A3C} = {BD87B51B-8B84-4352-84E0-51A942C787BB}
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {DDE883EF-0A40-4BA0-9B46-3A271410918D}
+ EndGlobalSection
+EndGlobal
diff --git a/CelestialRTP/.vs/CelestialRTP/v17/.suo b/CelestialRTP/.vs/CelestialRTP/v17/.suo
new file mode 100644
index 0000000..1dae9ae
Binary files /dev/null and b/CelestialRTP/.vs/CelestialRTP/v17/.suo differ
diff --git a/CelestialRTP/CelestialRTP.csproj b/CelestialRTP/CelestialRTP.csproj
new file mode 100644
index 0000000..2150e37
--- /dev/null
+++ b/CelestialRTP/CelestialRTP.csproj
@@ -0,0 +1,10 @@
+
+
+
+ Exe
+ net8.0
+ enable
+ enable
+
+
+
diff --git a/CelestialRTP/Program.cs b/CelestialRTP/Program.cs
new file mode 100644
index 0000000..2788b43
--- /dev/null
+++ b/CelestialRTP/Program.cs
@@ -0,0 +1,10 @@
+namespace CelestialRTP
+{
+ internal class Program
+ {
+ static void Main(string[] args)
+ {
+
+ }
+ }
+}
diff --git a/CelestialRTP/bin/Debug/net8.0/CelestialRTP.deps.json b/CelestialRTP/bin/Debug/net8.0/CelestialRTP.deps.json
new file mode 100644
index 0000000..9b74393
--- /dev/null
+++ b/CelestialRTP/bin/Debug/net8.0/CelestialRTP.deps.json
@@ -0,0 +1,23 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v8.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v8.0": {
+ "CelestialRTP/1.0.0": {
+ "runtime": {
+ "CelestialRTP.dll": {}
+ }
+ }
+ }
+ },
+ "libraries": {
+ "CelestialRTP/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/CelestialRTP/bin/Debug/net8.0/CelestialRTP.dll b/CelestialRTP/bin/Debug/net8.0/CelestialRTP.dll
new file mode 100644
index 0000000..24a6074
Binary files /dev/null and b/CelestialRTP/bin/Debug/net8.0/CelestialRTP.dll differ
diff --git a/CelestialRTP/bin/Debug/net8.0/CelestialRTP.exe b/CelestialRTP/bin/Debug/net8.0/CelestialRTP.exe
new file mode 100644
index 0000000..c5cd2e1
Binary files /dev/null and b/CelestialRTP/bin/Debug/net8.0/CelestialRTP.exe differ
diff --git a/CelestialRTP/bin/Debug/net8.0/CelestialRTP.pdb b/CelestialRTP/bin/Debug/net8.0/CelestialRTP.pdb
new file mode 100644
index 0000000..cd46c44
Binary files /dev/null and b/CelestialRTP/bin/Debug/net8.0/CelestialRTP.pdb differ
diff --git a/CelestialRTP/bin/Debug/net8.0/CelestialRTP.runtimeconfig.json b/CelestialRTP/bin/Debug/net8.0/CelestialRTP.runtimeconfig.json
new file mode 100644
index 0000000..becfaea
--- /dev/null
+++ b/CelestialRTP/bin/Debug/net8.0/CelestialRTP.runtimeconfig.json
@@ -0,0 +1,12 @@
+{
+ "runtimeOptions": {
+ "tfm": "net8.0",
+ "framework": {
+ "name": "Microsoft.NETCore.App",
+ "version": "8.0.0"
+ },
+ "configProperties": {
+ "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/CelestialRTP/obj/CelestialRTP.csproj.nuget.dgspec.json b/CelestialRTP/obj/CelestialRTP.csproj.nuget.dgspec.json
new file mode 100644
index 0000000..9e536c8
--- /dev/null
+++ b/CelestialRTP/obj/CelestialRTP.csproj.nuget.dgspec.json
@@ -0,0 +1,67 @@
+{
+ "format": 1,
+ "restore": {
+ "C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\CelestialRTP\\CelestialRTP.csproj": {}
+ },
+ "projects": {
+ "C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\CelestialRTP\\CelestialRTP.csproj": {
+ "version": "1.0.0",
+ "restore": {
+ "projectUniqueName": "C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\CelestialRTP\\CelestialRTP.csproj",
+ "projectName": "CelestialRTP",
+ "projectPath": "C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\CelestialRTP\\CelestialRTP.csproj",
+ "packagesPath": "C:\\Users\\38096\\.nuget\\packages\\",
+ "outputPath": "C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\CelestialRTP\\obj\\",
+ "projectStyle": "PackageReference",
+ "fallbackFolders": [
+ "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
+ ],
+ "configFilePaths": [
+ "C:\\Users\\38096\\AppData\\Roaming\\NuGet\\NuGet.Config",
+ "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
+ "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
+ ],
+ "originalTargetFrameworks": [
+ "net8.0"
+ ],
+ "sources": {
+ "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
+ "https://api.nuget.org/v3/index.json": {}
+ },
+ "frameworks": {
+ "net8.0": {
+ "targetAlias": "net8.0",
+ "projectReferences": {}
+ }
+ },
+ "warningProperties": {
+ "warnAsError": [
+ "NU1605"
+ ]
+ }
+ },
+ "frameworks": {
+ "net8.0": {
+ "targetAlias": "net8.0",
+ "imports": [
+ "net461",
+ "net462",
+ "net47",
+ "net471",
+ "net472",
+ "net48",
+ "net481"
+ ],
+ "assetTargetFallback": true,
+ "warn": true,
+ "frameworkReferences": {
+ "Microsoft.NETCore.App": {
+ "privateAssets": "all"
+ }
+ },
+ "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.100/PortableRuntimeIdentifierGraph.json"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/CelestialRTP/obj/CelestialRTP.csproj.nuget.g.props b/CelestialRTP/obj/CelestialRTP.csproj.nuget.g.props
new file mode 100644
index 0000000..a4c1339
--- /dev/null
+++ b/CelestialRTP/obj/CelestialRTP.csproj.nuget.g.props
@@ -0,0 +1,16 @@
+
+
+
+ True
+ NuGet
+ $(MSBuildThisFileDirectory)project.assets.json
+ $(UserProfile)\.nuget\packages\
+ C:\Users\38096\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages
+ PackageReference
+ 6.8.0
+
+
+
+
+
+
\ No newline at end of file
diff --git a/CelestialRTP/obj/CelestialRTP.csproj.nuget.g.targets b/CelestialRTP/obj/CelestialRTP.csproj.nuget.g.targets
new file mode 100644
index 0000000..3dc06ef
--- /dev/null
+++ b/CelestialRTP/obj/CelestialRTP.csproj.nuget.g.targets
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/CelestialRTP/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs b/CelestialRTP/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs
new file mode 100644
index 0000000..2217181
--- /dev/null
+++ b/CelestialRTP/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs
@@ -0,0 +1,4 @@
+//
+using System;
+using System.Reflection;
+[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")]
diff --git a/CelestialRTP/obj/Debug/net8.0/CelestialRTP.AssemblyInfo.cs b/CelestialRTP/obj/Debug/net8.0/CelestialRTP.AssemblyInfo.cs
new file mode 100644
index 0000000..dc9104e
--- /dev/null
+++ b/CelestialRTP/obj/Debug/net8.0/CelestialRTP.AssemblyInfo.cs
@@ -0,0 +1,23 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+using System;
+using System.Reflection;
+
+[assembly: System.Reflection.AssemblyCompanyAttribute("CelestialRTP")]
+[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
+[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
+[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
+[assembly: System.Reflection.AssemblyProductAttribute("CelestialRTP")]
+[assembly: System.Reflection.AssemblyTitleAttribute("CelestialRTP")]
+[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
+
+// Generated by the MSBuild WriteCodeFragment class.
+
diff --git a/CelestialRTP/obj/Debug/net8.0/CelestialRTP.AssemblyInfoInputs.cache b/CelestialRTP/obj/Debug/net8.0/CelestialRTP.AssemblyInfoInputs.cache
new file mode 100644
index 0000000..d98a3f8
--- /dev/null
+++ b/CelestialRTP/obj/Debug/net8.0/CelestialRTP.AssemblyInfoInputs.cache
@@ -0,0 +1 @@
+77fdc5e1b6bdc7082fbe023370f1feba44845ba8457b3c6baa4b46571335e35b
diff --git a/CelestialRTP/obj/Debug/net8.0/CelestialRTP.GeneratedMSBuildEditorConfig.editorconfig b/CelestialRTP/obj/Debug/net8.0/CelestialRTP.GeneratedMSBuildEditorConfig.editorconfig
new file mode 100644
index 0000000..922e370
--- /dev/null
+++ b/CelestialRTP/obj/Debug/net8.0/CelestialRTP.GeneratedMSBuildEditorConfig.editorconfig
@@ -0,0 +1,13 @@
+is_global = true
+build_property.TargetFramework = net8.0
+build_property.TargetPlatformMinVersion =
+build_property.UsingMicrosoftNETSdkWeb =
+build_property.ProjectTypeGuids =
+build_property.InvariantGlobalization =
+build_property.PlatformNeutralAssembly =
+build_property.EnforceExtendedAnalyzerRules =
+build_property._SupportedPlatformList = Linux,macOS,Windows
+build_property.RootNamespace = CelestialRTP
+build_property.ProjectDir = C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\CelestialRTP\
+build_property.EnableComHosting =
+build_property.EnableGeneratedComInterfaceComImportInterop =
diff --git a/CelestialRTP/obj/Debug/net8.0/CelestialRTP.GlobalUsings.g.cs b/CelestialRTP/obj/Debug/net8.0/CelestialRTP.GlobalUsings.g.cs
new file mode 100644
index 0000000..8578f3d
--- /dev/null
+++ b/CelestialRTP/obj/Debug/net8.0/CelestialRTP.GlobalUsings.g.cs
@@ -0,0 +1,8 @@
+//
+global using global::System;
+global using global::System.Collections.Generic;
+global using global::System.IO;
+global using global::System.Linq;
+global using global::System.Net.Http;
+global using global::System.Threading;
+global using global::System.Threading.Tasks;
diff --git a/CelestialRTP/obj/Debug/net8.0/CelestialRTP.assets.cache b/CelestialRTP/obj/Debug/net8.0/CelestialRTP.assets.cache
new file mode 100644
index 0000000..6369d76
Binary files /dev/null and b/CelestialRTP/obj/Debug/net8.0/CelestialRTP.assets.cache differ
diff --git a/CelestialRTP/obj/Debug/net8.0/CelestialRTP.csproj.BuildWithSkipAnalyzers b/CelestialRTP/obj/Debug/net8.0/CelestialRTP.csproj.BuildWithSkipAnalyzers
new file mode 100644
index 0000000..e69de29
diff --git a/CelestialRTP/obj/Debug/net8.0/CelestialRTP.csproj.CoreCompileInputs.cache b/CelestialRTP/obj/Debug/net8.0/CelestialRTP.csproj.CoreCompileInputs.cache
new file mode 100644
index 0000000..40a1c97
--- /dev/null
+++ b/CelestialRTP/obj/Debug/net8.0/CelestialRTP.csproj.CoreCompileInputs.cache
@@ -0,0 +1 @@
+4bef655ab0ddf58b03975c22c0b094f2f450f63faae632c2916694af53cfc45c
diff --git a/CelestialRTP/obj/Debug/net8.0/CelestialRTP.csproj.FileListAbsolute.txt b/CelestialRTP/obj/Debug/net8.0/CelestialRTP.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..758cf9e
--- /dev/null
+++ b/CelestialRTP/obj/Debug/net8.0/CelestialRTP.csproj.FileListAbsolute.txt
@@ -0,0 +1,15 @@
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\CelestialRTP\bin\Debug\net8.0\CelestialRTP.exe
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\CelestialRTP\bin\Debug\net8.0\CelestialRTP.deps.json
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\CelestialRTP\bin\Debug\net8.0\CelestialRTP.runtimeconfig.json
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\CelestialRTP\bin\Debug\net8.0\CelestialRTP.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\CelestialRTP\bin\Debug\net8.0\CelestialRTP.pdb
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\CelestialRTP\obj\Debug\net8.0\CelestialRTP.GeneratedMSBuildEditorConfig.editorconfig
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\CelestialRTP\obj\Debug\net8.0\CelestialRTP.AssemblyInfoInputs.cache
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\CelestialRTP\obj\Debug\net8.0\CelestialRTP.AssemblyInfo.cs
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\CelestialRTP\obj\Debug\net8.0\CelestialRTP.csproj.CoreCompileInputs.cache
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\CelestialRTP\obj\Debug\net8.0\CelestialRTP.sourcelink.json
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\CelestialRTP\obj\Debug\net8.0\CelestialRTP.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\CelestialRTP\obj\Debug\net8.0\refint\CelestialRTP.dll
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\CelestialRTP\obj\Debug\net8.0\CelestialRTP.pdb
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\CelestialRTP\obj\Debug\net8.0\CelestialRTP.genruntimeconfig.cache
+C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\CelestialRTP\obj\Debug\net8.0\ref\CelestialRTP.dll
diff --git a/CelestialRTP/obj/Debug/net8.0/CelestialRTP.dll b/CelestialRTP/obj/Debug/net8.0/CelestialRTP.dll
new file mode 100644
index 0000000..24a6074
Binary files /dev/null and b/CelestialRTP/obj/Debug/net8.0/CelestialRTP.dll differ
diff --git a/CelestialRTP/obj/Debug/net8.0/CelestialRTP.genruntimeconfig.cache b/CelestialRTP/obj/Debug/net8.0/CelestialRTP.genruntimeconfig.cache
new file mode 100644
index 0000000..0995e7d
--- /dev/null
+++ b/CelestialRTP/obj/Debug/net8.0/CelestialRTP.genruntimeconfig.cache
@@ -0,0 +1 @@
+870898f9b8980bd07081b50542c273f13d1b0290561c79e9e043e7fe11665ad5
diff --git a/CelestialRTP/obj/Debug/net8.0/CelestialRTP.pdb b/CelestialRTP/obj/Debug/net8.0/CelestialRTP.pdb
new file mode 100644
index 0000000..cd46c44
Binary files /dev/null and b/CelestialRTP/obj/Debug/net8.0/CelestialRTP.pdb differ
diff --git a/CelestialRTP/obj/Debug/net8.0/CelestialRTP.sourcelink.json b/CelestialRTP/obj/Debug/net8.0/CelestialRTP.sourcelink.json
new file mode 100644
index 0000000..5e20fcc
--- /dev/null
+++ b/CelestialRTP/obj/Debug/net8.0/CelestialRTP.sourcelink.json
@@ -0,0 +1 @@
+{"documents":{"C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\*":"https://raw.githubusercontent.com/VotreWaken/CelestialRTP/14f3d16c9fe2c14675dbc3d2c20ed04315c581a0/*"}}
\ No newline at end of file
diff --git a/CelestialRTP/obj/Debug/net8.0/apphost.exe b/CelestialRTP/obj/Debug/net8.0/apphost.exe
new file mode 100644
index 0000000..c5cd2e1
Binary files /dev/null and b/CelestialRTP/obj/Debug/net8.0/apphost.exe differ
diff --git a/CelestialRTP/obj/Debug/net8.0/ref/CelestialRTP.dll b/CelestialRTP/obj/Debug/net8.0/ref/CelestialRTP.dll
new file mode 100644
index 0000000..c468736
Binary files /dev/null and b/CelestialRTP/obj/Debug/net8.0/ref/CelestialRTP.dll differ
diff --git a/CelestialRTP/obj/Debug/net8.0/refint/CelestialRTP.dll b/CelestialRTP/obj/Debug/net8.0/refint/CelestialRTP.dll
new file mode 100644
index 0000000..c468736
Binary files /dev/null and b/CelestialRTP/obj/Debug/net8.0/refint/CelestialRTP.dll differ
diff --git a/CelestialRTP/obj/Release/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs b/CelestialRTP/obj/Release/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs
new file mode 100644
index 0000000..2217181
--- /dev/null
+++ b/CelestialRTP/obj/Release/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs
@@ -0,0 +1,4 @@
+//
+using System;
+using System.Reflection;
+[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")]
diff --git a/CelestialRTP/obj/Release/net8.0/CelestialRTP.AssemblyInfo.cs b/CelestialRTP/obj/Release/net8.0/CelestialRTP.AssemblyInfo.cs
new file mode 100644
index 0000000..9543b8c
--- /dev/null
+++ b/CelestialRTP/obj/Release/net8.0/CelestialRTP.AssemblyInfo.cs
@@ -0,0 +1,23 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+using System;
+using System.Reflection;
+
+[assembly: System.Reflection.AssemblyCompanyAttribute("CelestialRTP")]
+[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")]
+[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
+[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
+[assembly: System.Reflection.AssemblyProductAttribute("CelestialRTP")]
+[assembly: System.Reflection.AssemblyTitleAttribute("CelestialRTP")]
+[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
+
+// Generated by the MSBuild WriteCodeFragment class.
+
diff --git a/CelestialRTP/obj/Release/net8.0/CelestialRTP.AssemblyInfoInputs.cache b/CelestialRTP/obj/Release/net8.0/CelestialRTP.AssemblyInfoInputs.cache
new file mode 100644
index 0000000..da70c01
--- /dev/null
+++ b/CelestialRTP/obj/Release/net8.0/CelestialRTP.AssemblyInfoInputs.cache
@@ -0,0 +1 @@
+8a1d27c340e9bae14f1a5dc995f7d1b1232d4782180f1d14069d37f16666bb0e
diff --git a/CelestialRTP/obj/Release/net8.0/CelestialRTP.GeneratedMSBuildEditorConfig.editorconfig b/CelestialRTP/obj/Release/net8.0/CelestialRTP.GeneratedMSBuildEditorConfig.editorconfig
new file mode 100644
index 0000000..922e370
--- /dev/null
+++ b/CelestialRTP/obj/Release/net8.0/CelestialRTP.GeneratedMSBuildEditorConfig.editorconfig
@@ -0,0 +1,13 @@
+is_global = true
+build_property.TargetFramework = net8.0
+build_property.TargetPlatformMinVersion =
+build_property.UsingMicrosoftNETSdkWeb =
+build_property.ProjectTypeGuids =
+build_property.InvariantGlobalization =
+build_property.PlatformNeutralAssembly =
+build_property.EnforceExtendedAnalyzerRules =
+build_property._SupportedPlatformList = Linux,macOS,Windows
+build_property.RootNamespace = CelestialRTP
+build_property.ProjectDir = C:\Users\38096\source\repos\CelestialRTP\CelestialRTP\CelestialRTP\
+build_property.EnableComHosting =
+build_property.EnableGeneratedComInterfaceComImportInterop =
diff --git a/CelestialRTP/obj/Release/net8.0/CelestialRTP.GlobalUsings.g.cs b/CelestialRTP/obj/Release/net8.0/CelestialRTP.GlobalUsings.g.cs
new file mode 100644
index 0000000..8578f3d
--- /dev/null
+++ b/CelestialRTP/obj/Release/net8.0/CelestialRTP.GlobalUsings.g.cs
@@ -0,0 +1,8 @@
+//
+global using global::System;
+global using global::System.Collections.Generic;
+global using global::System.IO;
+global using global::System.Linq;
+global using global::System.Net.Http;
+global using global::System.Threading;
+global using global::System.Threading.Tasks;
diff --git a/CelestialRTP/obj/Release/net8.0/CelestialRTP.assets.cache b/CelestialRTP/obj/Release/net8.0/CelestialRTP.assets.cache
new file mode 100644
index 0000000..cd289d1
Binary files /dev/null and b/CelestialRTP/obj/Release/net8.0/CelestialRTP.assets.cache differ
diff --git a/CelestialRTP/obj/project.assets.json b/CelestialRTP/obj/project.assets.json
new file mode 100644
index 0000000..fb292d4
--- /dev/null
+++ b/CelestialRTP/obj/project.assets.json
@@ -0,0 +1,73 @@
+{
+ "version": 3,
+ "targets": {
+ "net8.0": {}
+ },
+ "libraries": {},
+ "projectFileDependencyGroups": {
+ "net8.0": []
+ },
+ "packageFolders": {
+ "C:\\Users\\38096\\.nuget\\packages\\": {},
+ "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {}
+ },
+ "project": {
+ "version": "1.0.0",
+ "restore": {
+ "projectUniqueName": "C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\CelestialRTP\\CelestialRTP.csproj",
+ "projectName": "CelestialRTP",
+ "projectPath": "C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\CelestialRTP\\CelestialRTP.csproj",
+ "packagesPath": "C:\\Users\\38096\\.nuget\\packages\\",
+ "outputPath": "C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\CelestialRTP\\obj\\",
+ "projectStyle": "PackageReference",
+ "fallbackFolders": [
+ "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
+ ],
+ "configFilePaths": [
+ "C:\\Users\\38096\\AppData\\Roaming\\NuGet\\NuGet.Config",
+ "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
+ "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
+ ],
+ "originalTargetFrameworks": [
+ "net8.0"
+ ],
+ "sources": {
+ "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
+ "https://api.nuget.org/v3/index.json": {}
+ },
+ "frameworks": {
+ "net8.0": {
+ "targetAlias": "net8.0",
+ "projectReferences": {}
+ }
+ },
+ "warningProperties": {
+ "warnAsError": [
+ "NU1605"
+ ]
+ }
+ },
+ "frameworks": {
+ "net8.0": {
+ "targetAlias": "net8.0",
+ "imports": [
+ "net461",
+ "net462",
+ "net47",
+ "net471",
+ "net472",
+ "net48",
+ "net481"
+ ],
+ "assetTargetFallback": true,
+ "warn": true,
+ "frameworkReferences": {
+ "Microsoft.NETCore.App": {
+ "privateAssets": "all"
+ }
+ },
+ "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.100/PortableRuntimeIdentifierGraph.json"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/CelestialRTP/obj/project.nuget.cache b/CelestialRTP/obj/project.nuget.cache
new file mode 100644
index 0000000..1e4f5d9
--- /dev/null
+++ b/CelestialRTP/obj/project.nuget.cache
@@ -0,0 +1,8 @@
+{
+ "version": 2,
+ "dgSpecHash": "1IubbOnM9uqAnF4tM37ayA6jqaq+08IP3TLkYqbyrTGvjSi7t1gaHufvfBxfwglkgIfW4jl3eqStgrqFazgpmA==",
+ "success": true,
+ "projectFilePath": "C:\\Users\\38096\\source\\repos\\CelestialRTP\\CelestialRTP\\CelestialRTP\\CelestialRTP.csproj",
+ "expectedPackageFiles": [],
+ "logs": []
+}
\ No newline at end of file
diff --git a/License.txt b/License.txt
new file mode 100644
index 0000000..e69de29
diff --git a/README.md b/README.md
index ce4c0b0..2976395 100644
--- a/README.md
+++ b/README.md
@@ -2,4 +2,4 @@
| CI | win-x64 | linux-x64 | osx-x64 |
|-|-|-|-|
-| GitHub Actions | ![example workflow](https://github.com/VotreWaken/CelestialRTP/actions/workflows/dotnet.yml/badge.svg) | | |
+| GitHub Actions | ![Win Workflow](https://github.com/VotreWaken/CelestialRTP/actions/workflows/dotnet.yml/badge.svg) | | |
diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md
new file mode 100644
index 0000000..e69de29