2016-01-20 50 views
1

通過閱讀SDL2音頻文檔(這是一種令人悲哀的),我可以看到有各種音頻格式可用 - 包括未簽名的& signed 8bit,16bit,32bitfloat。到現在爲止還挺好。 我被困在這個項目中使用SDL,我想在16bit中做一些簡單的音頻合成。所以,我給自己定的我SDL_AudioSpec結構中的格式AUDIO_U16SYS按本頁面 https://wiki.libsdl.org/SDL_AudioSpecSDL2音頻回撥限制爲8位?

然而,當我在看同一頁上的回調文件(實際上其他地方我看了網絡上)在回調音頻緩衝區* UINT8:

void SDL_AudioCallback(void* userdata, 
         Uint8* stream, 
         int len) 

這是我看不到我怎麼會實際上傳遞的16位音頻SDL的情況。它看起來總是會以8bit的速度接收音頻,並且庫只是上傳到所需的比特率。但這聽起來很瘋狂。這是正確的,還是我錯過了一些東西。例如,是否有(不知何故)一個替代回調原型對應於例如。 AUDIO_U16SYS,還是我必須使用其他方法來獲得更高的比特率?

回答

1

雖然stream確實是一個指向8位整數的指針,但您可以將其轉換爲正確的類型。它只是一個指向字節流的通用指針,應該如何解釋這些字節(例如,將每兩個字節組合爲一個16位字)取決於您。

所以在回調函數中,

Uint16 *stream16 = (Uint16 *) stream; 
+0

啊,太好了。感謝你及時的答覆。 當你指出,但我的大腦速度緩慢時,這一點相當明顯。 – DanBennett

+1

其實這似乎並不是整個故事 - 再一次,我可以找到的文檔中沒有任何內容涵蓋它。如果我切換到AUDIO_U16SYS,請將音頻範圍從(0-255)更改爲(0-65535),並使用上面的投影指針方法,我會聽到失真的音頻。也許我需要發佈更多的代碼,也許最好在這一點上提出一個新問題。無論如何感謝您的幫助 - 它確實回答了我原來的問題。我只是比我想象的更困惑:) – DanBennett

+1

啊!好的,所以我錯過了len參數是緩衝區的長度*(以字節爲單位)。因此,除了更改格式,更改音頻範圍並將流轉換爲16位整數,我還需要通過sizeof(Uint16)/ sizeof(Uint8)來劃分緩衝區的長度。 (以及len以字節爲單位的事實在文檔中已經涵蓋 - 我只是錯過了它) – DanBennett