SDL 音频回叫不起作用?
Posted
技术标签:
【中文标题】SDL 音频回叫不起作用?【英文标题】:SDL audio call back not working? 【发布时间】:2013-10-07 13:48:54 【问题描述】:我有以下 sn-p 代码。我需要在哪里获取音频样本并相应地播放它们。
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);
在我的主目录中,我有这些代码。
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);
不做回调可能是什么问题?
【问题讨论】:
非常简单的c++音频播放器:github.com/abdullahfarwees/Wav_Audio_player_SDL 【参考方案1】:如果您从未使用SDL_OpenAudio()
打开实际的音频输出设备,那么实际上没有任何东西试图播放音频,所以当然没有任何东西会调用您的缓冲区填充回调。
如果打开音频设备失败,那就是你需要解决的问题。 SDL_LoadWav()
调用不会打开设备,它会填写规范,因此您可以将其交给SDL_OpenAudio()
。
【讨论】:
@我想了解回调实际上应该做什么来获取每个样本?那么意味着它得到一个模拟的数据流吗?并在这里取样? @user2711681 SDL 将在需要更多音频数据时调用您的回调,因为在播放期间它会消耗数据(通过将其发送到扬声器)。您的应用程序将在回调中运行以生成更多数据,以保持声音播放。 .wav 已经是数字格式了,对吗?那么回调会做什么是让每个数据位或字节播放? 我已经设法解决了 SDL_openAudio 问题,但我的文件不到一秒,但它在这里调用我的回调是我迷路的地方?在我的回调中,我有这一行 printf("infillup:%d",wave.soundlen);并且它继续打印为填充:8343?以上是关于SDL 音频回叫不起作用?的主要内容,如果未能解决你的问题,请参考以下文章