Последовательное воспроизведение клипов с возможными прерываниями из других клипов (с использованием javax.sound) - PullRequest
0 голосов
/ 04 ноября 2011

Я хотел бы создать простой класс PlayClipManager для управления воспроизведением аудиоклипов. Это будет иметь следующие два метода:

public void addAndPlay(Clip clip)
 {
  ...
 }

public void interruptAndPlay(Clip clip)
 {
  ...
 }

Первый метод должен добавить клип в очередь и воспроизвести его, как только закончатся другие клипы в очереди. Второй метод принимает клип, который прерывает текущее воспроизведение, сбрасывает очередь и добавляет себя в нее (где он воспроизводится немедленно, потому что это единственный клип в очереди).

Это было бы легко, если бы у кого-то был доступ к потоку Java, управляющему воспроизведением аудио, но, если я не ошибаюсь, я не думаю, что он есть (есть класс AudioSystem, но он не помогает для этой цели). Я видел, что здесь были сообщения, показывающие, как можно использовать LineListener для проверки окончания воспроизведения клипа, но я не уверен, как я могу использовать это конкретно в моем примере. Кроме того, с помощью метода прерывания клипа, я думаю, могут также быть некоторые проблемы с параллелизмом.

Любая помощь в том, как я могу справиться с этим, очень ценится.

Спасибо.

1 Ответ

0 голосов
/ 11 ноября 2011

Если я не ошибаюсь, клип связывает строку воспроизведения с аудиоданными.

Планируете ли вы поставить в очередь реальные клипы?Насколько они большие?Это может занять много памяти.Если вы сохраняете адреса звуковых файлов и делаете / загружаете новые клипы во время воспроизведения, вам может быть лучше использовать SourceDataLine, поскольку он будет запускаться быстрее.Клип должен загрузить весь файл в память, прежде чем он сможет начать воспроизведение.

Выше учебник для добавления слушателя строки.Я думаю, что это просто myClip.addLineListener (YourLineListener).Вы можете закодировать LineListener для оповещения любого управляющего Очередью, чтобы запустить следующий клип, и использовать этот же LineListener для всех клипов.

Или, может быть, что-то подобное будет полезно, вызвать его в новом потокекогда вы готовы воспроизвести очередь и хотите, чтобы LineListener был частью исполняемого файла, который воспроизводит клип.

class PlayClipRunnable implements Runnable, LineListener {
    private Clip currentClip;
    private QueueManager queueManager;

    public PlayPadRunnable (Clip currentClip, 
            QueueManager myQueueManager) {
        this.currentClip = currentClip;
        this.myQueueManager = myQueueManager;
    }

    public void run() 
    {
        try 
        {
            currentClip.addLineListener(this);
            currentClip.start();
        } 
        catch (Exception e) 
        {
            e.printStackTrace();
        }
    }

    @Override
    public void update(LineEvent event) {
        if (event.getType() == LineEvent.Type.STOP) {

            queueManager.clipIsStopped();
        }
    }
}

Я не уверен, когда клип должен быть открыт.Я также не уверен, как вставить крючок для прерывания клипа.Может быть, если QueueManager сделает currentClip.close (), который будет работать?В этом случае полезно использовать currentClip, который будет изменчивым.Но я выхожу из своей глубины.

Я надеюсь, что идеи заслуживают изучения и приведут вас к вашему решению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...