Нет звука при использовании SDL_Mixer в C ++ / Linux - PullRequest
2 голосов
/ 19 апреля 2020

Я пытаюсь использовать SDL_mixer в C ++ под Linux для воспроизведения звуков асинхронно, но это как-то не работает. Когда я выполняю его, звук не воспроизводится вообще. Я не совсем знаком с SDL и классами, поэтому было бы очень полезно, если бы кто-то мог определить, где находится ошибка в моем коде.

Мой заголовочный файл (sample.h):

#pragma once
#include <string>
#include <memory>
#include "SDL_mixer.h"

class sample {
public:
    sample(const std::string &path, int volume);
    void play();
    void play(int times);
    void set_volume(int volume);

private:
    std::unique_ptr<Mix_Chunk, void (*)(Mix_Chunk *)> chunk;
};

Моя основная программа (. cpp):

#include "sample.h"
#include <iostream>

sample::sample(const std::string &path, int volume) : chunk(Mix_LoadWAV(path.c_str()), Mix_FreeChunk) {
    if (!chunk.get()) {
        std::cout << "Could not load audio sample: " << path << std::endl;
    }
    Mix_VolumeChunk(chunk.get(), volume);
}

void sample::play() {
    Mix_PlayChannel(-1, chunk.get(), 0);
}

void sample::play(int times) {
    Mix_PlayChannel(-1, chunk.get(), times - 1);
}

void sample::set_volume(int volume) {
    Mix_VolumeChunk(chunk.get(), volume);
}

int main() {
    if (Mix_Init(MIX_INIT_FLAC | MIX_INIT_MP3 | MIX_INIT_OGG) < 0) {
        return -1;
    }

    if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 1024) < 0) {
        std::cout << "Can not initialize mixer!" << std::endl;
        return -1;
    }

    // Amount of channels (Max amount of sounds playing at the same time)
    Mix_AllocateChannels(32);

    sample s("Snare-Drum-1.wav", MIX_MAX_VOLUME / 2);

    s.play();

    Mix_Quit();
    return 0;
}

1 Ответ

2 голосов
/ 19 апреля 2020

Ваш двоичный файл запускается и завершает свою работу до того, как произойдет примерно столько времени, сколько нужно для воспроизведения звука, поэтому решение состоит в том, чтобы заставить код работать дольше ... Я получил ваш код, добавив в заголовок этот

s.play();

std::chrono::milliseconds timespan(2000); // or whatever
std::this_thread::sleep_for(timespan);

замените

#include "SDL_mixer.h"

на

#include <SDL2/SDL_mixer.h>
#include <chrono>
#include <thread>

, поэтому теперь он скомпилирован с использованием SDL2, а не SDL

g++ -o sample sample.cpp -lSDL2   -lSDL2_mixer 

Итак ... что такое реальное решение SDL2? Ну, я бы сказал, что типичный вариант использования - SDL2 - это часть игры, которая продолжает работать, поэтому в кодовой базе есть событие l oop, которое остается активным достаточно долго, чтобы слышать, как воспроизводится звук. Другое решение, за исключением явного использования режима сна или gui, заключается в том, чтобы поместить код на сервер ... У самого API SDL2 также должна быть одна строчка

...