0

waveOut 接口有问题。我想编写一个简单的类结构,其中我有一个 AudioStream 类,它使音频输出变得非常简单。我有一个构造函数,它采用以下参数: AudioStream32(int sampleRate, int sampleSize, bool stereo, int bufferSize) (sampleSize 是以字节为单位的样本大小,其余部分希望不言自明)

这个想法是我初始化 AudioStream 一次,然后调用 setSample(float sample) 来设置音频流。该类处于开始阶段,因此当前仅实现双缓冲和单声道声音。

在 setSample 方法中,我将浮点样本转换为 0 到 2^(8*sampleSize) 范围内的无符号整数,然后将该无符号整数转换为无符号字符。我也可以直接使用 unsigned int,但是这样我就不能重用我用于其他 sampleSizes 的代码。代码:

void AudioStream32::setSample(float sample)
{
unsigned int discreteSample = 1 + mid + ((float)mid * sample);

for (unsigned int i = 0; i < sampleSize; i++)
{
    data[pointr++] = (char)(discreteSample & 255);
    discreteSample = discreteSample >> 8;
    // (same as dividing by 256)
}

//... Non-relevant code that makes sure the buffer is sent to the audio device

mid 是一个无符号整数,已分配值 (1 << (sampleSize * 8 - 1)) - 1 (这只是执行 2^(sampleSize * 8 - 1) 的更快方法)所以当 sampleSize 为 1 时,这将评估为 127,当 sampleSize 为 2 时,评估为 32767(或者,一般来说,大约是最大值的一半)。

当我使用 1 作为 sampleSize 时,这很好用(所以,当我使用单个字符作为样本时)。但是,当我使用 2 作为 sampleSize (或 2 个字节或一个短整数作为样本的大小)时,我得到了非常奇怪的结果。

我尝试流式传输一个简单的正弦波。当我使用 1 作为 sampleSize 我确实得到一个正弦波作为波形。但是,当我使用 2 作为 sampleSize 时,我得到以下奇怪的波形:

我奇怪的波形

我通过连接音频输出和麦克风输入的迷你插孔电缆在 Audacity 中记录了波形,并将其记录为 32 位浮点流。输出实际上是一个 16 位的 int 流。

这似乎表明存在溢出问题,或者在无符号和有符号整数或字符之间转换存在问题。更奇怪的行为发生了:缩放(或改变音量,不管你怎么称呼它)我发送给 setSample 方法的样本似乎并不重要,除非我将它设置为 0 或非常接近于零(0.0001 仍然产生相同的结果波形,0.00001 产生静音)。

一件非常奇怪的事情是,当我尝试除以 512 而不是 256(即在 setSample 方法中将“>> 8”更改为“>> 9”)时,一切似乎都有效(包括更改声音) . 声音比我使用 1 作为 sampleSize 时要弱,所以看起来这仍然不是正确的方法。

很遗憾,我无法以简单的方式将我写入声音设备的样本与声音设备的输出进行比较。这样,我至少可以弄清楚问题出在字节格式上还是在我所做的转换中。

有谁知道发生了什么?

4

1 回答 1

1

这看起来像一个正弦波,它的值是倒置的。换句话说,如果您将正值从 1 调整到 0.5 到 0 到 -.5,将负值从 -1 调整到 -.5 到 0 到 0.5,您将得到一个正弦波。

于 2013-06-12T14:25:03.333 回答