SDL logo

Проблему решил, но дабы пояснить суть вопроса начну сначала.

В одном из проектов используется 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);

Моё решение проблемы:

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

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

Изначально данный вопрос поднимал на GameDev.ru.