Объявите летучее логическое значение. Почему летучий? Потому что он должен обновляться между потоками.
private volatile boolean playing;
Включить логическое значение в предложение while.
while(playing && nBytesRead != -1)
Сделать логическое значение доступным извне потока воспроизведения.
public void setPlaying(boolean) {
this.playing = playing;
}
Если вы хотите отключить звук, позвоните setPlaying(false)
. Не забудьте сделать логическое значение истинным до запуска звука.
Единственным недостатком здесь является то, что звук может заканчиваться щелчком, поскольку он будет мгновенным. Добавление затухания включает в себя настройку и вызов объекта javax.sound.sampled.Control (мне с этим не повезло) или манипулирование данными самого PCM.
По крайней мере с SourceDataLine
у нас есть доступ к байтам (в вашем массиве abData
). Данные могут быть собраны в PCM в соответствии с вашим аудиоформатом, затем умножены на значение фейдера, которое изменяется от 1 до 0 в течение примерно 64 кадров, постепенно набирая значения PCM до 0, а затем принимая эти новые значения PCM и преобразовать их обратно в байты и записать это. Да, много проблем, чтобы избавиться от клика. Но оно того стоит.