【问题标题】:SDL2 audio issues C programming (not mixer)SDL2 音频问题 C 编程(不是混音器)
【发布时间】:2019-02-28 09:56:29
【问题描述】:

我很难用 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 时,不再播放声音。

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

我不允许使用其他库。

【问题讨论】:

    标签: c audio sdl sdl-2


    【解决方案1】:

    我找到了

    它可能会有所帮助: 在.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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-03-20
      • 1970-01-01
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      • 2016-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多