У меня проблемы с SDL_Mixer (мой недостаток опыта). Чанки и музыка воспроизводятся очень хорошо (используя Mix_PlayChannel и Mix_PlayMusic), и одновременное воспроизведение двух разных чанков не представляет проблемы.
Моя проблема в том, что я хотел бы сыграть немного chunk1, а затем воспроизвести вторую итерацию chunk1, перекрывая первую. Я пытаюсь воспроизвести один фрагмент в быстрой последовательности, но вместо этого он воспроизводит звук многократно с гораздо более длительным интервалом (не так быстро, как я хочу). Я протестировал вывод на консоль, и мой метод воспроизведения / зацикливания не является ошибочным, так как я вижу печать сообщений консоли, зацикленных с правильной скоростью.
У меня есть массив чанков, которые я периодически загружаю во время инициализации, используя Mix_LoadWAV ();
Mix_Chunk *sounds[32];
У меня также есть функция, зарезервированная для воспроизведения этих кусков:
void PlaySound(int snd_id)
{
if(snd_id >= 0 && snd_id < 32)
{
if(Mix_PlayChannel(-1, sounds[snd_id], 0) == -1)
{
printf("Mix_PlayChannel: %s\n",Mix_GetError());
}
}
}
Пытаясь воспроизвести один и тот же звук несколько раз подряд (скажем, с задержкой 100 мс / 10 бит / с), мне дается звук, воспроизводимый с установленным, более медленным интервалом (около 500 мс или около того / 2 бит / с), несмотря на то, что функция вызывается со скоростью 10 бит / с.
Я уже использовал «Mix_AllocateChannels (16);» чтобы убедиться, что я выделил каналы (дайте мне знать, если я использую это неправильно), и тем не менее, один кусок из массива отказывается играть с определенной скоростью.
Любые идеи / помощь приветствуется, а также критика того, как я разместил этот вопрос.
Как сказано в документации SDL_Mixer (https://www.libsdl.org/projects/SDL_mixer/docs/SDL_mixer_28.html):
«… -1 для первого свободно незарезервированный канал «.
Поэтому, если ваш чанк длиннее 1,6 секунды (16 каналов * 100 мс), у вас не хватит каналов через 1,6 секунды, и поэтому у вас не будет возможности воспроизводить новые чанки, пока один из каналов не завершит воспроизведение.
Итак, есть в основном 2 решения:
Других решений пока нет …