2015-04-24 8 views
1

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(), чтобы исправить мою предыдущую проблему? Кроме того, почему у меня была проблема в первую очередь?

ответ

4

Линия данных, такая как Clip, имеет внутренний буфер данных, возможно, byte[]. Буфер обычно заполняется кусками, впереди позиции воспроизведения.

Пусть в некоторый момент мы имеем:

  playback position 
        v 
buffer:   [..|.....] 
    file: [..........|.....................] 

Так что, если мы остановить линию, буфер до сих пор в нем данные — данные, которые впереди позиции воспроизведения.

Если все, что мы делаем, задает позицию воспроизведения, данные все еще присутствуют и будут воспроизведены при следующем запуске. Промывка строки отбрасывает эти данные.

Мы также можем позвонить drain, чтобы дождаться, пока эти данные не будут воспроизведены.

+0

@Kootling Вы прочитали мой ответ? Отвечает ли это на ваш вопрос? Есть ли еще что-то, чего вы не понимаете? – Radiodef

+0

Вижу, спасибо. Как долго длится буфер? – Kootling

+0

Это будет зависеть от реализации. Вы можете узнать с помощью ['getBufferSize'] (http://docs.oracle.com/javase/8/docs/api/javax/sound/sampled/DataLine.html#getBufferSize--). Некоторые перегрузки 'open' также позволяют указать его. Я ткнул в исходный код и казалось бы, что значение по умолчанию (найдено в 'com.sun.media.sound.AbstractDataLine') имеет размер до 500 мс аудио для данного формата. – Radiodef