Нет звука при использовании SDL_mixer
По какой-то очень странной причине с SDL_mixer не воспроизводится абсолютно никакой звук. Я перепробовал все: переустановил библиотеку, проверил, действительно ли музыка воспроизводима, используя Mix_FadeInMusic и Mix_FadeOutMusic, чтобы АБСОЛЮТНО НЕ ПОЛУЧИТЬ. Это говорит мне, что музыка загружается, и это говорит мне, что она играет. Я использую Windows 8.1 64 бит с VC 2013.
Код:
SDL_Init(SDL_INIT_EVERYTHING);
// Create window
Mix_Init(MIX_INIT_MP3 | MIX_INIT_OGG | MIX_INIT_FLAC | MIX_INIT_FLUIDSYNTH | MIX_INIT_MOD | MIX_INIT_MODPLUG);
if (Mix_OpenAudio(22050, MIX_DEFAULT_FORMAT, 2, 4096)) {
printf("Unable to open audio!\n");
ovr_Shutdown();
SDL_Quit();
exit(1);
}
music = Mix_LoadMUS(tmpLoc);
if (music == NULL) SDL_ShowSimpleMessageBox(NULL, "", "Music is null", window);
Mix_PlayMusic(music, -1,1000);
if (!Mix_PlayingMusic()) SDL_ShowSimpleMessageBox(NULL, "", "No music playing", window);
// OpenGL stuff
while (quit == false)
{
// Loop
}
Mix_HaltMusic();
Mix_FreeMusic(music);
Mix_CloseAudio();
Mix_Quit();
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
1 ответ
Удивительно, но для SDL требуется переменная окружения под Windows (артефакт, изначально предназначенный для Linux), чтобы фактически выводить звук.
Попробуйте установить SDL_AUDIODRIVER=waveout (или вы можете использовать =dsound).
Или вы можете вызвать SDL_AudioInit("waveout") или SDL_AudioInit("dsound") сразу после вашего вызова SDL_Init(). (Чтобы быть эффективными, вы можете изменить аргумент flags на SDL_Init(), чтобы указать все, кроме звука).
SDL_AudioInit () комментируется авторами как "внутренний" API. В другом месте в библиотеке это вызывается, чтобы... угадайте, что... инициализировать ваше аудио, используя строку, полученную из переменной окружения.
Я столкнулся с этой проблемой при работе с ffplay ffmpeg, который использует (статически связанный) SDL для вывода звука (и который затем не может выводить звук, если / пока я не установлю переменную env вручную).
Я предполагаю, что у авторов SDL есть некоторые значения по умолчанию, которые разумны под Linux, но делают для snafu под Windows:
Клиентский код, подобный вашему (и ffplay), не возвращает никаких ошибок, не исключение, просто SDL с удовольствием выталкивает звук в пустоту.