如何在 C# 中制作音频流? (一般的)

How to make an audio stream in C#? (general)

我一直在使用 C++ 在 Atmel 微控制器上做一个合成器项目,但我缺乏时序知识,因为 ctime 库使用整数毫秒参数(如果它甚至可以在 Atmel 上工作),但我需要输出(例如)频率高达 44100Hz 的方波,这显然会将输出状态从 -1 更改为 1,周期比毫秒短 88.2 倍。

现在我正在学习使用 C# 构建 PC 音频应用程序。那么,我的问题是:

  1. 你如何在 C# 中使用时间比较函数和仅本地库(如果这实际上可能的话)来计时应用程序以精确地执行 1/88.2 毫秒?
  2. 如何将您的 Steam(例如 1-1 任何响度的值)输出到 PC 的声音设备?

基本步骤:

准备一个(在内存中)"sound file",例如两个通道(每个通道 16 位)和 44.1 kHz(CD 速率)的采样率。

将这些字节发送到 DC 转换器,通常称为 "audio device"

您可以使用像 NAudio 这样的库来执行此操作。

通常 PC 音频设备要求您以特定的缓冲区大小(例如 200 毫秒)发送 PCM 数据包。

对于 44100 的采样率,您将 11025 个样本(每个通道)放入缓冲区并通过 API 直接将其发送到音频设备,例如 DirectSound for which managed libraries exist. Alternatively you can use the Windows Core Audi API。还有很多。

无需单独控制每个样品

样本可以是 8/16/24/32/64 位列表中的任何内容,并以特定数据类型存储,例如:

  • unsigned byte 对于 8 位样本
  • shortInt16 对于 16 位样本
  • C# 原生支持 24 位整数
  • Int32float 用于 32 位样本
  • 等等

本质上,您必须告诉您的音频设备您将在多少通道 (ChannelNum) 上发送多少样本 (SampleRate) 是什么类型 (SampleSize),同意缓冲区大小并开始!