Я разрабатываю язык музыкального программирования и используя JVM (через Clojure) для воспроизведения музыкальных партитур, написанных на этом языке. До сих пор мы просто используем javax.sound.midi MidiSynthesizer для воспроизведения баллов.
Поскольку Clojure имеет медленное время запуска, и мы хотим иметь возможность сыграть оценку из командной строки и немедленно ее услышать, мы решили структурировать интерпретатор оценки в качестве фонового сервера и взаимодействовать с он использует более легкий клиент командной строки, написанный на Java.
Все это отлично работает по большей части, однако есть странная проблема, что мы видим, где, если вы запустите сервер, затем закройте свой ноутбук * и позвольте ему спящий режим, затем откройте его снова и сервер играет оценку, звук не происходит сразу, но задерживается на несколько секунд. Запустив сервер с протоколом отладки, я действительно вижу, что события вкл/выкл MIDI-событий происходят немедленно (и правильно настроены), но звук задерживается.
* Это может быть или не быть специфичным для платформы. Я вижу проблему на своем MacBook Pro 2014 под управлением OS X 10.9.5 Mavericks.
Чтобы сузить его, я собрал этот простой пример (используя Java, а не Clojure), который демонстрирует проблему:
https://github.com/daveyarwood/java-midi-delayed-audio-example
Я уже немного почесываю голову над этим. Почему звук задерживается, и есть ли что-нибудь, что мы можем с этим сделать?