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 编程(不是混音器)的主要内容,如果未能解决你的问题,请参考以下文章