(Я сам искал приложение, которое делало это, надеясь, что мне не придется писать его самостоятельно, когда я наткнулся на этот вопрос.)
Обзор
Вы вводите немного задержки буфера и используете сетевой протокол синхронизации времени для выравнивания потоков. То есть вы разделяете поток на пакеты и ставите временную метку для каждого пакета с помощью «воспроизведения позже в момент времени T», где T составляет, например, 50–100 мс в будущем (или больше, если сеть работает с ошибками). Вы отправляете (или многоадресно) пакеты в локальной сети на все компьютеры в хоре. Все компьютеры будут воспроизводить звук одновременно, потому что часы приложения синхронизированы.
Обратите внимание, что могут быть и другие факторы, такие как задержка ОС / драйвера / звуковой карты, которые могут быть учтены в протоколе синхронизации времени. Если вы не слишком разборчивы, протокол синхронизации может быть таким же простым, как один компьютер, подающий звуковой сигнал каждую секунду, плюс вы нажимаете клавишу на другом компьютере в такт. Это имеет то преимущество, что учитывает любой другой источник задержки на уровнях ОС / драйвера / звуковой карты, но имеет тот недостаток, что необходимо ручное вмешательство, если часы становятся десинхронизированными.
гибридная ручная сетевая синхронизация
Одним из способов учета других источников задержки без постоянного ручного вмешательства является объединение этого подхода со стандартным протоколом синхронизации сетевых часов; при первом запуске протокола на новых машинах:
- синхронизация машин с ручным вмешательством в стиле ритма
- синхронизация машин с протоколом синхронизации по сети
- для каждой машины в хоре, возьмите разницу двух синхронизаций; это задержка ОС / драйвера / звуковой карты каждой машины, которую каждый из них отслеживает
Теперь, когда изменяется сетевая магистраль, все, что нужно сделать, это выполнить повторную синхронизацию с использованием протокола синхронизации сетевых часов (#2
) и вычесть задержки ОС / драйвера / звуковой карты, устраняя необходимость ручного вмешательства (если только вы смени ОС / драйверы / звуковые карты).
синхронизация светлячка, имитирующая природу
Если вы делаете это в тихой комнате, и на всех машинах есть микрофоны, вам даже не нужно вмешиваться вручную (#1
), потому что вы можете заставить их всех следовать алгоритму синхронизации «в стиле светлячка». Многие виды светлячков в природе все будут мигать в унисон. http://tinkerlog.com/2007/05/11/synchronizing-fireflies/ описывает алгоритм, используемый этими светлячками: «Если светлячок получает вспышку соседнего светлячка, он мигает немного раньше». Вспышки соответствуют звуковым сигналам или гудкам (через звуковую карту, а не зуммер mobo пьезо!), А зрение соответствует прослушиванию через микрофон.
Это может быть немного неудобно на очень больших расстояниях в комнате из-за скорости звука, но я сомневаюсь, что это будет проблемой (если так, уменьшите частоту звукового сигнала).