C ++和PortAudio,可怕的失真输出

c++ and portaudio, horribly distorted output

本文关键字:失真 输出 PortAudio      更新时间:2023-10-16

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

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

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

所以,

一旦我准备好了所有的样本,我就把它们交给了portaudio(调用它们,所以它们在-1.0f和1.0f之间,如教程示例中所示),我可以识别声音,但它被严重扭曲了......

我认为这可能是因为采样率(虽然 11025 Hz 是相当标准的),并将其重新采样为 Pa_getDeviceInfo->getDefaultSampleRate (44100hz) 给出的速率。

但我只是得到相同的结果。我还尝试选择另一个设备bt,但它并没有变得更好。

我在 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;
    }

感谢您的阅读!

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

我更改了行:

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

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

一切都很顺利。

以防万一它可以帮助某人。