MVH/NAudio-2.2.1/NAudio.Wasapi/CoreAudioApi/AudioCaptureClient.cs
2024-06-07 00:47:07 +02:00

80 lines
2.7 KiB
C#

using System;
using System.Runtime.InteropServices;
using NAudio.CoreAudioApi.Interfaces;
namespace NAudio.CoreAudioApi
{
/// <summary>
/// Audio Capture Client
/// </summary>
public class AudioCaptureClient : IDisposable
{
IAudioCaptureClient audioCaptureClientInterface;
internal AudioCaptureClient(IAudioCaptureClient audioCaptureClientInterface)
{
this.audioCaptureClientInterface = audioCaptureClientInterface;
}
/// <summary>
/// Gets a pointer to the buffer
/// </summary>
/// <returns>Pointer to the buffer</returns>
public IntPtr GetBuffer(
out int numFramesToRead,
out AudioClientBufferFlags bufferFlags,
out long devicePosition,
out long qpcPosition)
{
Marshal.ThrowExceptionForHR(audioCaptureClientInterface.GetBuffer(out var bufferPointer, out numFramesToRead, out bufferFlags, out devicePosition, out qpcPosition));
return bufferPointer;
}
/// <summary>
/// Gets a pointer to the buffer
/// </summary>
/// <param name="numFramesToRead">Number of frames to read</param>
/// <param name="bufferFlags">Buffer flags</param>
/// <returns>Pointer to the buffer</returns>
public IntPtr GetBuffer(
out int numFramesToRead,
out AudioClientBufferFlags bufferFlags)
{
Marshal.ThrowExceptionForHR(audioCaptureClientInterface.GetBuffer(out var bufferPointer, out numFramesToRead, out bufferFlags, out _, out _));
return bufferPointer;
}
/// <summary>
/// Gets the size of the next packet
/// </summary>
public int GetNextPacketSize()
{
Marshal.ThrowExceptionForHR(audioCaptureClientInterface.GetNextPacketSize(out var numFramesInNextPacket));
return numFramesInNextPacket;
}
/// <summary>
/// Release buffer
/// </summary>
/// <param name="numFramesWritten">Number of frames written</param>
public void ReleaseBuffer(int numFramesWritten)
{
Marshal.ThrowExceptionForHR(audioCaptureClientInterface.ReleaseBuffer(numFramesWritten));
}
/// <summary>
/// Release the COM object
/// </summary>
public void Dispose()
{
if (audioCaptureClientInterface != null)
{
// although GC would do this for us, we want it done now
// to let us reopen WASAPI
Marshal.ReleaseComObject(audioCaptureClientInterface);
audioCaptureClientInterface = null;
GC.SuppressFinalize(this);
}
}
}
}