求助:如何用raylib的AudioStream播放原始音频?白噪声生成异常
raylib AudioStream API无法持续生成白噪声问题
我正在尝试使用raylib的AudioStream API生成白噪声,但只能听到程序启动时约100ms的短暂噪声爆发,之后就完全静音了。
目前raylib仅提供一个官方音频流生成示例,找不到关于AudioStream API的其他文档。我写了一个极简C程序,本该在显示静态文本的同时持续输出白噪声,但实际只有启动初期的短暂声音,文本渲染正常,且raylib没有返回任何错误信息(所有操作均显示成功)。
我使用的是48KHz、单声道、32位整数采样格式,本来更倾向用浮点数,但官方示例用的是整数(short),所以暂时采用该格式。
代码如下:
/* ==================================================================== WARNING: LOWER YOUR SPEAKERS - THEY WILL POP WHEN THIS PROGRAM EXECUTES ======================================================================= */ #include "raylib.h" #include <stdlib.h> // required for `rand` and `RAND_MAX` #define U32_MAX 4294967296 #define U31_MAX 2147483648 int randomSample() { /* This helper returns a random, signed 32-bit sample. */ double randomFraction = rand() / (double)(RAND_MAX); return randomFraction * U32_MAX - U31_MAX; } void generateSamples(void * buffer, unsigned int frames) { /* This audio callback fills a mono buffer with white noise. */ int * samples = (int *)buffer; for (unsigned int i = 0; i < frames; i++) samples[i] = randomSample(); } int main(void) { /* This is a textbook raylib main function. It sets up an audio callback, then loops while the window stays open, before tearing down the window, audio device, stream etc. */ InitWindow(800, 480, "playlib"); InitAudioDevice(); AudioStream stream = LoadAudioStream(48000, 32, 1); SetAudioStreamBufferSizeDefault(1024); SetAudioStreamVolume(stream, 1.0f); SetAudioStreamCallback(stream, generateSamples); PlayAudioStream(stream); SetTargetFPS(60); while (!WindowShouldClose()) { // loop just redraws the same text BeginDrawing(); ClearBackground(RAYWHITE); DrawText("MUSIC SHOULD BE PLAYING!", 245, 150, 20, LIGHTGRAY); EndDrawing(); } UnloadAudioStream(stream); CloseAudioDevice(); CloseWindow(); return 0; }
通过LLDB调试确认,回调函数被反复调用,样本已生成并写入缓冲区,但就是没有持续声音输出。我尝试将缓冲区大小改为256到4096之间的2的幂值,均无效果。
另外,程序启动时我笔记本上的所有其他音频都会被静音,关闭程序后才恢复正常,raylib是否默认会独占输出设备?
运行环境:最新版本的M1 Mac。
内容的提问来源于stack exchange,提问作者user21916482
相关产品推荐
相关产品推荐

