我已經寫了一小塊的代碼的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;
}
感謝您的閱讀!