c - SDL2 音频问题 C 编程(不是混音器)

标签 c audio sdl sdl-2

我很难用 C 语言播放声音。

这是我的功能:

void playSound(char* path)
{
    SDL_AudioSpec wavSpec;
    Uint32 wavLength;
    Uint8 *wavBuffer;

    SDL_LoadWAV(path, &wavSpec, &wavBuffer, &wavLength);
    SDL_AudioDeviceID deviceId = SDL_OpenAudioDevice(NULL, 0, &wavSpec, NULL, 0);
    SDL_QueueAudio(deviceId, wavBuffer, wavLength);
    SDL_PauseAudioDevice(deviceId, 0);

    if (SDL_GetQueuedAudioSize(deviceId) == 0) {

        SDL_CloseAudioDevice(deviceId);
        SDL_FreeWAV(wavBuffer);
    }
}

声音会播放几次,然后就不会再播放。

我检查了SDL_GetQueuedAudioSize,当他达到0时,不再播放声音。

我认为它是关于缓冲区何时为空的..不知道我误解了某些点。

我不允许使用其他库。

最佳答案

我发现了

它可能会有所帮助: 在.h中

typedef struct son_s {
    SDL_AudioSpec wavSpec;
    Uint32 wavLength;
    Uint8 *wavBuffer;
    SDL_AudioDeviceID deviceId;

}son_t;

如果声音很多,你就制作一个结构数组。

在.c文件中

void closeAudio(son_t* son)
{
    SDL_CloseAudioDevice(son->deviceId);
}

son_t* initAudio(char* path)
{
    son_t* son = malloc(sizeof(son_t));
    if (!son) {
        return NULL ;
    }
    SDL_LoadWAV(path, &son->wavSpec, &son->wavBuffer, &son->wavLength);
    son->deviceId = SDL_OpenAudioDevice(NULL, 0, &son->wavSpec, NULL, 0);
    return son;
}

void playSound(son_t* son)
{
    SDL_QueueAudio(son->deviceId, son->wavBuffer, son->wavLength);
    SDL_PauseAudioDevice(son->deviceId, 0);

   if (SDL_GetQueuedAudioSize(son->deviceId) == 0) {
        SDL_FreeWAV(son->wavBuffer);
    }
}

关于c - SDL2 音频问题 C 编程(不是混音器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54922843/

相关文章:

c++ - 使用内存文件

谁能解释一下这个程序的输出

audio - FFMPEG:正确 sidechain_compress 立体声背景与立体声侧链成立体声输出

c++ - 将可执行文件重命名为 game.exe 会导致运行时延迟 15 秒——奇怪的问题

c++ - 我应该如何针对 SDL 中的多个按钮缩放此值?

C- 参数输入

c - 在结构中初始化结构数组

python - 从使用 librosa.feature.mfcc 生成的 MFCC 获取计时信息

javascript - 动态加载的自定义 javascript/jQuery/HTML5 音频播放器的问题

C++ 从另一个类调用( vector )指针返回空大小