녹음은 ASIO를 사용하려 합니다.
NAudio에서 지원하고 있으며, ASIO를 지원하는 사운드 드라이버가 필요합니다. (대부분 되는 것으로 알고 있습니다.) 낮은 레이턴시와 높은 해상도를 지원하는 장점이 있는데, 사실 녹음기 만드는데 큰 이점은 없어 보입니다. 경험이 없어 사용해 보는 것입니다.
NAudio에서 ASIO를 사용하는 방법은 너무나 간단합니다.
먼저 AsioOut.GetDriverNames()
를 통해 ASIO 목록을 받습니다. 이 목록에 선택해서, AsioOut
개체를 생성합니다.
ar drivers = AsioOut.GetDriverNames();
foreach (var driver in drivers)
{
Console.WriteLine(driver);
}
var driverName = "Focusrite USB ASIO";
var sampleRate = 96000;
using var asioOut = new AsioOut(driverName);
asioOut.InputChannelOffset = 0;
asioOut.InitRecordAndPlayback(null, 1, sampleRate);
여러 채널을 지원하는 장비를 위해 InputChannelOffset
및 InitRecordAndPlayback()
함수를 통해 총 채널 중 몇번째 부터 몇개의 채널로 녹음할지를 결정합니다. 저는 단일 채널의 마이크이므로 InputChannelOffset
을 0
으로, 그리고 InitRecordAndPlayback(null, 1, sampleRate)
로 해서 하나의 채널로 설정 합니다.
그 다음 마이크로 입력된 정보를 처리하기 위해 AudioAvalidable
에 이벤트를 걸어 줍니다.
asioOut.AudioAvailable += (s, e) =>
{
var count = e.GetAsInterleavedSamples(buffer);
writer.WriteSamples(buffer, 0, count);
};
여기서 writer는 비압축 WAV Writer로,
var buffer = new float[512];
using var writer = new WaveFileWriter(@"W:\output.wav", new WaveFormat(sampleRate, 1));
다음처럼 생성 후 사용할 수 있습니다.
그런 후, asioOut.Player()
를 하면 콘솔에서 해당 장치로 녹음을 할 수 있습니다.
using NAudio.Wave;
Thread.CurrentThread.SetApartmentState(ApartmentState.Unknown);
Thread.CurrentThread.SetApartmentState(ApartmentState.STA);
var drivers = AsioOut.GetDriverNames();
foreach (var driver in drivers)
{
Console.WriteLine(driver);
}
var driverName = "Focusrite USB ASIO";
var sampleRate = 96000;
using var asioOut = new AsioOut(driverName);
asioOut.InputChannelOffset = 0;
asioOut.InitRecordAndPlayback(null, 1, sampleRate);
var buffer = new float[512];
using var writer = new WaveFileWriter(@"W:\output.wav", new WaveFormat(sampleRate, 1));
asioOut.AudioAvailable += (s, e) =>
{
var count = e.GetAsInterleavedSamples(buffer);
writer.WriteSamples(buffer, 0, count);
};
asioOut.Play();
Console.ReadLine();
그런데 NAudio는 결국엔 윈도우에서 제공하는 ASIO 관련 COM 개체를 사용하는 것인데, 최상위문
에서는 [STAThread]
속성을 사용할 수가 없으므로
다음 처럼,
Thread.CurrentThread.SetApartmentState(ApartmentState.Unknown);
Thread.CurrentThread.SetApartmentState(ApartmentState.STA);
설정 후 사용할 수 있게 됩니다.
NAudio는 다양한 사운드 확장자(wav, mp4, wma, mp3, flac, m4a)를 지원합니다.