Проблемы со звуком SDL2 в C-программировании (не в микшере) - PullRequest
0 голосов
/ 28 февраля 2019

Я борюсь с воспроизведением звука в 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 Ответ

0 голосов
/ 04 марта 2019

я нашел

это может помочь: в .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);
    }
}
...