2014-04-07 22 views
0

我已經寫了一小塊的代碼的Intent讀取WAV文件,並通過portaudio播放它。C++和portaudio,可怕的失真輸出

我約束自己一些特定wav文件:線性PCM(無壓縮),不超過2個信道。正如我所看到的,wav文件解碼工作得很好,我相信後來在通過portaudio播放時遇到了麻煩。

對於我的測試我選用一種過於簡單的wav文件(簡稱:8位位深度,11025採樣率,單和大約3秒長)。

所以,一旦我把所有的樣品準備好了,我都給了他們portaudio(縮小它們,使它們介於-1.0f和1.0f之間,如教程示例中所示),並且我可以識別聲音,但它被嚴重扭曲...

我認爲這可能是因爲採樣率(11025赫茲相當標準),並重新採樣到Pa_getDeviceInfo-> getDefaultSampleRate(44100hz)給出的速率。

但我還是得到同樣的結果。我也嘗試選擇另一個設備BT仍然沒有變好。

我從比約恩羅氏(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; 
    } 

感謝您的閱讀!

回答

2

聲音失真的原因如下:樣本以無符號8位格式存儲,但靜默定義爲樣本值爲255,因爲我認爲它是0.整個縮放都是相反的順序。

我改了行:

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

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

,這一切就很好。

以防萬一它可以幫助別人。