c ++和portaudio,可怕的扭曲输出

时间:2014-04-07 14:23:11

标签: c++ audio portaudio

我编写了一小段代码,用于读取wav文件并通过portaudio播放。

我限制自己使用某些特定的wav文件:线性pcm(无压缩),不超过2个通道。正如我所看到的,wav文件解码工作得很好,我相信以后通过portaudio播放时会遇到麻烦。

对于我的测试,我选择了一个过于简单的wav文件(简短:8位bit深度,11025采样率,单声道和大约3秒长)。

所以,一旦我准备好我的所有样品,我确实将它们交给了portaudio(将它们放在-1.0f和1.0f之间,如教程示例中那样)我可以识别声音,但它却被严重扭曲。 ..

我认为这可能是因为采样率(相当于11025 hz非常标准)并重新采样到Pa_getDeviceInfo-> getDefaultSampleRate(44100hz)给出的速率。

但我得到的结果相同。我也试过选择另一台设备但仍然没有好转。

我在Bjorn Roche(http://blog.bjornroche.com/2011/11/slides-from-fundamentals-of-audio.html)的一些幻灯片中读到我的缩放方法并不好但我找不到其他选择。

可能是配置问题吗?还是我错过了关于采样和音频播放的重要事项? (这是我在音频节目中的第一次拍摄)

顺便说一句,我正在使用linux和alsa与portaudio,我在初始化portaudio时收到这些错误消息:

    ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
    ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
    ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
    bt_audio_service_open: connect() failed: Connection refused (111)
    bt_audio_service_open: connect() failed: Connection refused (111)
    bt_audio_service_open: connect() failed: Connection refused (111)
    bt_audio_service_open: connect() failed: Connection refused (111)

我将回调函数定义如下:(仅播放此特定文件)

    unsigned int actualSample;        

    static int patestCallback( const void *inputBuffer, void *outputBuffer,
                       unsigned long framesPerBuffer,
                       const PaStreamCallbackTimeInfo* timeInfo,
                       PaStreamCallbackFlags statusFlags,
                       void *userData )
    {
        /* Cast data passed through stream to my wav file. */
        WavSound *data = (WavSound*)userData; 
        float *out = (float*)outputBuffer;
        unsigned int i;
        (void) inputBuffer; /* Prevent unused variable warning. */

        for( i=0; i<framesPerBuffer; i++ )
        {    
             *out++ = (float) ((data->getSample(::actualSample)-127)/128);
             ::actualSample = ::actualSample + 1;
             if(::actualSample >= data->getSamplesSize())
                 ::actualSample = 0;
        }
        return 0;
    }

感谢阅读!

1 个答案:

答案 0 :(得分:3)

声音失真的原因如下:样本以无符号8位格式存储,但是静音定义为样本值beign 255,因为我认为它是0.整个缩放是相反的顺序。

我换了一行:

*out++ = (float) ((data->getSample(::actualSample)-127)/128);

*out++ = (float) (((-1)*data->getSample(::actualSample)+127)/128);

这一切都很顺利。

以防它可以帮助某人。