80 lines
2.7 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
} |