Предполагаемый способ - вызвать stop()
на SourceDataLine, чтобы приостановить его, и start()
, чтобы возобновить его. Если вы прекратите загружать SourceDataLine аудиоданными при запуске, это приведет к переполнению буфера, что обычно рассматривается как состояние ошибки. Прекращать подачу данных, только когда они остановлены.
drain()
следует вызывать в конце, если вы хотите убедиться, что все данные, которые вы записали в SourceDataLine, воспроизводятся. Не называйте это для функциональности "паузы"!
Правильно, что вы должны записывать небольшие буферы в строку исходных данных для лучшего контроля. Хороший размер эквивалентен 50 мс буферам - используйте метод open(AudioFormat, bufferSize)
, чтобы указать размер буфера в байтах (например, 8820 байт для 44100 Гц, 16-битное стерео).
Также я бы сказал, что использование Clip является предпочтительным решением. Используйте start () и stop () на Clip, и он не должен сильно глотать. Большинство реализаций Java Sound используют SourceDataLine внутри для Clip, поэтому функциональных различий не должно быть. Java Sound должен убедиться, что вы можете воспроизводить несколько клипов одновременно.