SDL_Mixer воспроизводит одиночный кусок над собой, возможно?

У меня проблемы с 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);» чтобы убедиться, что я выделил каналы (дайте мне знать, если я использую это неправильно), и тем не менее, один кусок из массива отказывается играть с определенной скоростью.

Любые идеи / помощь приветствуется, а также критика того, как я разместил этот вопрос.

0

Решение

Как сказано в документации SDL_Mixer (https://www.libsdl.org/projects/SDL_mixer/docs/SDL_mixer_28.html):
«… -1 для первого свободно незарезервированный канал «.

Поэтому, если ваш чанк длиннее 1,6 секунды (16 каналов * 100 мс), у вас не хватит каналов через 1,6 секунды, и поэтому у вас не будет возможности воспроизводить новые чанки, пока один из каналов не завершит воспроизведение.

Итак, есть в основном 2 решения:

  1. Выделите больше каналов (больше чем: ChunkDuration (в секундах) / Delay (в секундах))
  2. Остановите канал, чтобы вы могли его использовать. (и чтобы сделать это правильно, вы не должны использовать -1 в качестве канала, а переменную, которую вы увеличиваете при каждом воспроизведении фрагмента (не забудьте установить его обратно в 0, когда он равен вашему количеству каналов))
1

Другие решения

Других решений пока нет …