SDL音频回叫不起作用?

时间:2013-10-07 13:48:55

标签: c audio sdl

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

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);

什么可能是没有回调的问题?

1 个答案:

答案 0 :(得分:1)

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

如果打开音频设备失败,那么这是您需要解决的问题。 SDL_LoadWav()来电不会打开设备,它会填写规范,因此您可以将其发送到SDL_OpenAudio()