2014-02-15 47 views
1

我正在開發一個項目,這個項目涉及通過fft處理PCM音頻數據,因爲它正在播放,最好是同步播放。我正在使用linux g ++編譯器,並且正在使用OpenAL讀取和播放音頻數據。C++使用OpenAL進行實況PCM fft音頻處理?

我的問題是這樣的:有沒有更好的方式來處理PCM音頻數據與fft現場音頻播放,然後使用線程?如果沒有,那麼線程庫最適合用於這些目的。

這是我的函數,它將波形數據加載到一個字節數組中,稍後可以將它們轉換爲整數進行處理,我用來播放數據的所有數據都是OpenAL。

char* loadWAV(const char* fn, int& chan, int& samplerate, int& bps, int& size){ 
     char buffer[4]; 
     ifstream in(fn, ios::binary); 
     in.read(buffer, 4);                //ChunkID "RIFF" 
     if(strncmp(buffer, "RIFF", 4) != 0){ 
       cerr << "this is not a valid wave file"; 
       return NULL; 
     } 
     in.read(buffer,4);                //ChunkSize 
     in.read(buffer,4);                //Format "WAVE" 
     in.read(buffer,4);                // "fmt " 
     in.read(buffer,4);                // 16 
     in.read(buffer,2);                // 1 
     in.read(buffer,2);                // NUMBER OF CHANNELS 
     chan = convertToInt(buffer,2); 
     in.read(buffer,4);                // SAMPLE RATE 
     samplerate = convertToInt(buffer,4); 
     in.read(buffer,4);                // ByteRate 
     in.read(buffer,2);                // BlockAlign 
     in.read(buffer,2);                // bits per sample 
     bps = convertToInt(buffer,2); 
     in.read(buffer,4);                // "data" 
     in.read(buffer,4); 
     size = convertToInt(buffer,4); 
     char * data = new char[size]; 
     in.read(data,size); 
     return data; 
} 

感謝您的任何和所有幫助。

編輯:任何人誰可能有興趣,我寫使用this作爲參考知道 WAV文件是如何格式化

+0

爲什麼你擔心線程不起作用?你究竟在擔心什麼? – Pace

回答

1

功能你希望使用執行了的OpenAL FFT?我不知道這是否可能。您的代碼可能會執行FFT。

您不需要明確設置任何線程。但是,您的音頻輸出庫可能會代表您這樣做。我對OpenAL並不熟悉,但許多音頻庫的操作方式是讓您指定一個回調,將更多音頻輸入到輸出中。因此,您的主程序將從音頻文件加載音頻,將其放入緩衝區(可能受互斥體保護),以供音頻回調讀取,在音頻窗口計算FFT,並可能爲用戶可視化數據。

此外,音頻庫可能會管理線程,因此您無需擔心確切的線程實現或庫。但一定要用互斥體正確管理共享數據。

+0

謝謝!這有助於。 –

+0

btw你會碰巧知道我是否可以將PCM數據的字節數組按照原樣傳遞給FFT算法? –

+1

這一切都取決於FFT功能希望看到的內容。如果函數需要一組C短路(帶符號16位數量),那麼假設你有一個小端CPU(可能你會這樣做),那麼這個數據可能與來自位於磁盤上的WAV文件的數據匹配得很好。但是,如果FFT函數需要一個C浮點數組(32位單精度浮點數),則需要先執行一系列轉換。 –