The Javadoc for DataLine.flush() состоянияПерезапуск объект клипа - метод Flush()
Приливы в очередь данные из линии. Сброшенные данные отбрасываются. В некоторых случаях не все данные в очереди могут быть отброшены. Например, микшер может сбросить данные из буфера для конкретной строки ввода, но все неиграемые данные, уже находящиеся в выходном буфере (результат микса), будут по-прежнему воспроизводиться. Вы можете вызвать этот метод после приостановки строки (нормальный случай), если вы хотите пропустить «устаревшие» данные при перезапуске воспроизведения или записи. (Законный промывать линию, которая не останавливается, но при этом на активную линии, вероятно, вызовет разрыв в данных, что приводит к заметным мышам.)
Что именно это означает?
Кроме того, для перезапуска Clip
объекта, многие люди на этом сайте, предложил использовать это:
clip.stop();
clip.setFramePosition(0);
clip.start();
При использовании приведенного выше кода, я заметил, что образец клипа (который длится около 15 секунд, если это имеет значение) не перезапускается в начале и несовместимо в «перезапуске». Однако, когда я попробовал
clip.stop();
clip.flush();
clip.setFramePosition(0);
clip.start();
Клип работал отлично и перезагружался прямо в начале звука. Мой вопрос: что сделал метод flush(), чтобы исправить мою предыдущую проблему? Кроме того, почему у меня была проблема в первую очередь?
@Kootling Вы прочитали мой ответ? Отвечает ли это на ваш вопрос? Есть ли еще что-то, чего вы не понимаете? – Radiodef
Вижу, спасибо. Как долго длится буфер? – Kootling
Это будет зависеть от реализации. Вы можете узнать с помощью ['getBufferSize'] (http://docs.oracle.com/javase/8/docs/api/javax/sound/sampled/DataLine.html#getBufferSize--). Некоторые перегрузки 'open' также позволяют указать его. Я ткнул в исходный код и казалось бы, что значение по умолчанию (найдено в 'com.sun.media.sound.AbstractDataLine') имеет размер до 500 мс аудио для данного формата. – Radiodef