waveOut API出现意外波形

时间:2013-06-12 14:15:35

标签: waveout

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

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

在setSample方法中,我将float样本转换为0到2 ^(8 * sampleSize)范围内的unsigned int,然后将unsigned int转换为unsigned char。我也可以直接使用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的无符号整数(1&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; (这只是一种更快的方式做2 ^(sampleSize * 8 - 1)) 因此,当sampleSize为1时,这将评估为127,当sampleSize为2时,为32767(或者,通常为大约一半的最大值)。

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

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

My weird waveform

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

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

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

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

有谁知道发生了什么事?

1 个答案:

答案 0 :(得分:1)

这看起来像一个正弦波,它的值被反转。换句话说,如果你将正数值从1调整到.5到0到-.5,负数从-1到-.5调整到0到.5,你就会有一个正弦波。

相关问题