ПрограммированиеФорумОбщее

[SOLVED] SDL_mixer - треск

#0
16:23, 12 авг 2008

В одном из проектов используется 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);
#1
18:30, 12 авг 2008

Собрал консольное приложение. Инициализировал только аудио-подсистему. Хрипов нет. Теперь не знаю, что и делать :(

#2
20:43, 12 авг 2008

andreyu
может быть у тебя звук разжевывает проц, а когда он загружен чем-то другим появляется треск? Попробуй потестировать на машинах с разным быстродействием, если характер тресков изменится - именно тут собака и порылась. Я не знаток SDL, поэтому как решить проблему ее средствами не скажу.

#3
23:13, 12 авг 2008

Woland
На разных конфигурациях одинаковый рез-т. Пробовал загружать ядро (правда только одно) - один фиг. Кроме того, под Linux та же фигня.
Видимо придется рискнуть и перескочить на OpenAL.

#4
7:44, 13 авг 2008

Woland
Попробуй использовать другую версию SDL - новее или старше. Можно при сборке (SDL) поиграться ключиками компилятора - глядишь, что и родится)

#5
13:28, 13 авг 2008

Woland
Дело явно не в ключиках компилятора и не в версии SDL_mixer.

#6
21:17, 13 авг 2008

Решил проблему иначе. Может кому то пригодится.

Запускаю трек играться только ОДИН раз - Mix_FadeInMusic(handle, 0, fadeinms). Если был запрос на бесконечное проигрывание трека, то запоминаю его хэндл.
В главном цикле движка проверяю, есть ли хэндл на музыкальный трек, который должен проигрываться бесконечно. Если хэндл есть, а проигрывание трека прекратилось, то я просто запускаю проигрывание трека заново.

Вот такой вот костыль пришлось использовать. Работоспособность данного костыля была проверена на Linux и Windows. Mac OS X пока не проверял.

#7
22:05, 13 авг 2008

andreyu
А звучит именно хрип, или щелчок? Может, дело в том, что сама мелодия имеет излом на стыке конца и начала?

#8
23:24, 13 авг 2008

RPGman
Хрип, трески. Как только начинается новый луп, то хрипы не прекращаются. Это не проблема стыка.

#9
0:55, 14 авг 2008

Хрипит на всех мелодиях без исключений? А, вижу. На некоторых.
Образец в студию можно?

#10
2:53, 14 авг 2008

RPGman
Пока нет, игрушка ещё у издателя. Но могу сказать, что при проигрывании этих треков любым другим плеером, не использующим SDL_mixer, проблем нет. Под любой ОС.

ПрограммированиеФорумОбщее

Тема в архиве.