Как зациклить звук с помощью SDL_audio? - PullRequest
0 голосов
/ 16 июня 2019

Я могу легко воспроизводить аудио, используя эти файлы с SDL_QueueAudio() и SDL_PauseAudioDevice(). Как я могу сделать звуковую петлю? например повторить звук при включении и прекратить воспроизведение при отключении? Желательно, чтобы я не использовал SDL_mixer, потому что я пытаюсь изучить его внутреннюю работу.

audio.hpp

#include <SDL.h>
#include <cstdint>
#include <string>

class Wav
{
    public:
    explicit Wav(const std::string &s);
    ~Wav();

    bool play();

    private:
    SDL_AudioSpec spec_;
    SDL_AudioDeviceID dev_;
    uint8_t *buf_;
    uint32_t len_;
};

audio.cpp

#include "audio.hpp"
#include <SDL.h>

Wav::Wav(const std::string &s)
    : spec_ {}, buf_ {nullptr}, len_ {0}
{
    std::string path {s + ".wav"};
    auto success {SDL_LoadWAV(path.c_str(), &spec_, &buf_, &len_)};
    if (success == NULL)
        SDL_Log("Failed to load WAV: %s", path.c_str(), SDL_GetError());
    SDL_AudioSpec obtained; // format obtained
    dev_ = SDL_OpenAudioDevice(nullptr, 0, &spec_, &obtained, 0);
    if (dev_ == 0)
        SDL_Log("Failed to open audio: %s", SDL_GetError());
}

Wav::~Wav()
{
    SDL_CloseAudioDevice(dev_);
    SDL_FreeWAV(buf_);
}

bool Wav::play()
{
    int success {SDL_QueueAudio(dev_, buf_, len_)};
    SDL_PauseAudioDevice(dev_, 0);
    return success;
}
...