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

Posted

技术标签:

【中文标题】SDL2 音频问题 C 编程(不是混音器)【英文标题】:SDL2 audio issues C programming (not mixer) 【发布时间】: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 时,不再播放声音。

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

我不允许使用其他库。

【问题讨论】:

【参考方案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);
    

【讨论】:

以上是关于SDL2 音频问题 C 编程(不是混音器)的主要内容,如果未能解决你的问题,请参考以下文章

使用 C 和 Windows 从混音器录制声音

windows编程:在没有支持“立体声混音”的驱动程序的情况下抓取音频

c_cpp 音频混音器:缩混5.1到立体声或重映射通道

音频混音是啥

pygame混音器将音频保存到磁盘?

Python3+叠加两个音频文件,实现混音