В одном из проектов используется SDL_mixer для проигрывания музыки (ogg) и звуковых эффектов (тот же ogg, wav).
В целом качество звука устраивает, но на некоторых музыкальных треках при наступлении loop слышится треск и хрип. Это не допустимо. Ладно, попробовал использовать OpenAL - все чудно, никаких нареканий нет. Но работа с OpenAL у меня еще не отлажена, посему переводить уже готовый проект на него очень боязно.
Проблемы с SDL_mixer происходят и под Linux, и под Windows, и под Mac OS X (хотя тут особо не тестировалось).
Может есть какие то методы или обходные пути для решения моей проблемы?
Инициализация и работа выполняется так (лишнее поскипано):
// --------------------------------------------------- // инициализация подсистемы (видео уже инициализировано) SDL_InitSubSystem(SDL_INIT_AUDIO); int sample_rate = 44100; // изначально использовался AUDIO_S16, разницы не заметно Uint16 audio_format = AUDIO_S16SYS; int audio_channels = 2; // размер буфера менялся в широких пределах, // но он влияет только на задержку перед проигрыванием эффекта if( Mix_OpenAudio( sample_rate, audio_format, audio_channels, 4096)) { // ошибка, уходим } Mix_QuerySpec( &sample_rate, &audio_format, &audio_channels); // тут получаем, а затем пишем в лог реально установленные значения // (значения запрошенные не отличаются от реально установленных) // --------------------------------------------------- // загружаем музыкальный трек // тут передается путь к музыкальному треку на диске handle = Mix_LoadMUS( filename); // --------------------------------------------------- // говорим играть музыкальный трек, // его громкость плавно нарастает за время fadeinms. Mix_FadeInMusic( handle, -1, fadeinms);
Собрал консольное приложение. Инициализировал только аудио-подсистему. Хрипов нет. Теперь не знаю, что и делать :(
andreyu
может быть у тебя звук разжевывает проц, а когда он загружен чем-то другим появляется треск? Попробуй потестировать на машинах с разным быстродействием, если характер тресков изменится - именно тут собака и порылась. Я не знаток SDL, поэтому как решить проблему ее средствами не скажу.
Woland
На разных конфигурациях одинаковый рез-т. Пробовал загружать ядро (правда только одно) - один фиг. Кроме того, под Linux та же фигня.
Видимо придется рискнуть и перескочить на OpenAL.
Woland
Попробуй использовать другую версию SDL - новее или старше. Можно при сборке (SDL) поиграться ключиками компилятора - глядишь, что и родится)
Woland
Дело явно не в ключиках компилятора и не в версии SDL_mixer.
Решил проблему иначе. Может кому то пригодится.
Запускаю трек играться только ОДИН раз - Mix_FadeInMusic(handle, 0, fadeinms). Если был запрос на бесконечное проигрывание трека, то запоминаю его хэндл.
В главном цикле движка проверяю, есть ли хэндл на музыкальный трек, который должен проигрываться бесконечно. Если хэндл есть, а проигрывание трека прекратилось, то я просто запускаю проигрывание трека заново.
Вот такой вот костыль пришлось использовать. Работоспособность данного костыля была проверена на Linux и Windows. Mac OS X пока не проверял.
andreyu
А звучит именно хрип, или щелчок? Может, дело в том, что сама мелодия имеет излом на стыке конца и начала?
RPGman
Хрип, трески. Как только начинается новый луп, то хрипы не прекращаются. Это не проблема стыка.
Хрипит на всех мелодиях без исключений? А, вижу. На некоторых.
Образец в студию можно?
RPGman
Пока нет, игрушка ещё у издателя. Но могу сказать, что при проигрывании этих треков любым другим плеером, не использующим SDL_mixer, проблем нет. Под любой ОС.
Тема в архиве.