gpt4 book ai didi

c - SDL 音频回拨不起作用?

转载 作者:行者123 更新时间:2023-11-30 15:45:06 26 4
gpt4 key购买 nike

我有以下代码片段。我需要在哪里获取音频样本并相应地播放它们。

struct {
SDL_AudioSpec spec; /* SDL Audio Spec Structure */
Uint8 *sound; /* Pointer to wave data */
Uint32 soundlen; /* Length of wave data */
int soundpos; /* Current play position */
} wave;

这是我的回调函数。

void fillerup(void *unused, Uint8 *stream, int len)
{
Uint8 *waveptr;
int waveleft=0;
printf("in fillerup");
waveptr = wave.sound + wave.soundpos;
waveleft = wave.soundlen - wave.soundpos;
while ( waveleft <= len ) {
/* Process samples */
Uint8 *process_buf = (Uint8 *)malloc(waveleft * sizeof(Uint8));
if(process_buf == 0) {
// do something here
}
SDL_memcpy(process_buf, waveptr, waveleft);
/* do processing here, e.g. */
/* processing the audio samples in process_buf[*] */
// play the processed audio samples
SDL_memcpy(stream, process_buf, waveleft);
stream += waveleft;
len -= waveleft;
// ready to repeat play the audio
waveptr = wave.sound;
waveleft = wave.soundlen;
wave.soundpos = 0;
free(process_buf);
}
}

在我的 main 中,我有这些代码。

if ( SDL_LoadWAV("file1.wav",&wave.spec, &wave.sound, &wave.soundlen) == NULL ) {
fprintf(stderr, "Couldn't load %s: %s\n", "file1.wav", SDL_GetError());
//quit(1);
}
// set up the callback function
wave.spec.callback = fillerup;

我已经评论了这段代码,因为每当我打开它时,它都会给我错误无法打开音频。顶部 LOADWav 没有给我错误并检查 wav 文件是否存在。

/*if ( SDL_OpenAudio(&wave.spec, NULL) < 0 ) {
fprintf(stderr, "Couldn't open audio: %s\n", SDL_GetError());
SDL_FreeWAV(wave.sound);
//quit(2);
}*/
// start playing
SDL_PauseAudio(0);

不执行回调可能是什么问题?

最佳答案

如果您从未使用 SDL_OpenAudio() 打开实际的音频输出设备,那么就没有任何东西实际尝试播放音频,所以当然没有任何东西可以调用您的缓冲区填充回调。

如果打开音频设备失败,那么这就是您需要解决的问题。 SDL_LoadWav() 调用不会打开设备,它会填充规范,以便您可以将其交给 SDL_OpenAudio()

关于c - SDL 音频回拨不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19226627/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com