@wolf-9830

Почему SDL_mixer выводит ошибку при Mix_OpenAudio?

Добрый день уважаемые пользователи сайта toster.ru . Я хочу научиться работать с библиотекой SDL_mixer и у меня возникли вопросы. Вот в чем суть моей проблемы:
(Для простоты сделал скриншот, т.к. код очень маленький)
%D0%B4%D0%BB%D1%8F%20%D1%82%D0%BE%D1%81%
При компиляции и запуске моего приложения мне выдаёт ошибку, которая наглядно представлена на скриншоте, и как мнее ее исправить?
  • Вопрос задан
  • 2782 просмотра
Решения вопроса 1
EXL
@EXL
Энтузиаст
@wolf-9830 Раз SDL_mixer ставился из исходного кода, тогда вы где-то ошиблись с зависимостями. Как я понял, вы собираете не старую версию SDL_mixer 1.2, которая сейчас используется огромным количеством софта, а новую SDL_mixer 2.0, пакеты которой пока отсутствуют в репозиториях.

Смотрите: SDL_mixer является лишь враппером и для проигрывания файлов формата *.ogg, *.flac и *.mp3 использует сторонние библиотеки, такие как libogg/libvorbis, libflac и libmad соответственно.

С такими зависимостями собрана библиотека SDL_mixer 1.2 в моей системе (она была установлена из репозитория):

Depends: libflac-dev (>= 1.2.1)
Depends: libmad0-dev (>= 0.15.1b)
Depends: libmikmod2-dev (>= 3.1.11)
Depends: libogg-dev (>= 1.2.0)
Depends: libsdl-mixer1.2 (= 1.2.12-3)
Depends: libsdl1.2-dev (>= 1.2.14~)
Depends: libvorbis-dev (>= 1.2.0)

Я вижу два выхода из вашей ситуации:

1. Установить необходимые зависимости из репозиториев:

sudo apt-get install libflac-dev libmad0-dev libogg-dev libvorbis-dev libmikmod2-dev

Затем пересобрать SDL_mixer 2.0:

./configure --enable-music-mod-mikmod --enable-music-mod-mikmod-shared --enable-music-mp3-mad-gpl --enable-music-ogg --enable-music-flac
make -j4
sudo make install

Обратите внимание на то, что во время конфигурирования необходимые библиотеки (libogg, libflac libmad и др.) определились нормально.

checking for libmikmod-config... /usr/bin/libmikmod-config
checking for libmikmod - version >= 3.1.10... yes
-- dynamic libmikmod -> libmikmod.so.2

...

checking vorbis/vorbisfile.h usability... yes
checking vorbis/vorbisfile.h presence... yes
checking for vorbis/vorbisfile.h... yes
checking for ov_open_callbacks in -lvorbisfile -lvorbis -logg -lm... yes
-- dynamic libvorbisfile -> libvorbisfile.so.3

...

checking for FLAC__stream_decoder_new in -lFLAC... yes
-- dynamic libFLAC -> libFLAC.so.8

...

checking for libmad headers... yes

Это самый простой выход из вашей ситуации.

2. Второй способ заключается в том, что вы должны скомпилировать самостоятельно все зависимости, необходимые SDL_Mixer 2.0. Я однажды сталкивался с подобным и написал как правильно собирать SDL_mixer (правда версии 1.2 и для MinGW (Windows)), но шаги для GNU/Linux и SDL_mixer 2.0 будут те же самые.
Это наиболее сложный и времязатратный способ.

После того, как библиотека с зависимостями собрана, с ее помощью можно проигрывать файлы различных форматов.

В вашем случае:
#include <SDL.h>
#include <SDL_mixer.h>

#include <iostream>

int main(int argc, char *argv[]) {
    SDL_Init(SDL_INIT_EVERYTHING);

    Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 1024);
    std::cout << Mix_GetError() << std::endl;
    Mix_Music *mus;
    mus = Mix_LoadMUS("m.ogg");
    std::cout << Mix_GetError() << std::endl;
    Mix_PlayMusic(mus, 1);

    SDL_Event event;
    int done = 0;

    while(!done && Mix_PlayingMusic()) {
        while (SDL_PollEvent(&event)) {
            if (event.type == SDL_QUIT) {
                done = 1;
            }
            if (event.type == SDL_KEYDOWN) {
                if (event.key.keysym.sym == SDLK_ESCAPE) {
                    done = 1;
                }
            }
        }
    }

    Mix_FreeMusic(mus);
    Mix_Quit();
    SDL_Quit();
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@wladimirmir64
Ваша картинка не отображается. Помогу.
image.png
Ответ написан
Комментировать
EXL
@EXL
Энтузиаст
А SDL_Mixer ставился в систему как? Из исходного кода или из пакетов репозитория?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы