2013-12-02 3 views
1

Я довольно новичок в использовании звуков, и я могу воспроизводить звук, но у меня возникают проблемы со всеми потоками звукового клипа, которые создает java при воспроизведении звука. Я хотел бы знать, как я получаю все звуки для запуска в одном потоке или умереть, как только это будет сделано.Убивание аудиоролика Заклинание

Я в настоящее время работает этот код, чтобы играть на самом деле звук, создавая новый экземпляр все, когда я называю play() метод:

private AudioInputStream as; 
private Clip c; 

public synchronized void play(final SoundType type) { 
    reset(); 
    try { 
     as = AudioSystem.getAudioInputStream(getSound(type)); 
     c = AudioSystem.getClip(); 
     c.open(as); 
     c.start(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Что я могу сделать с этим, это он позволяет мне воспроизводить сразу несколько звуков, создавая новый экземпляр каждого элемента одновременно. Единственная проблема заключается в том, что он создает несколько потоков в процессе, и программа заканчивается таким количеством потоков при воспроизведении разных звуков.

Есть ли более эффективный метод или одобрение, которое я мог бы выполнить с моим текущим методом, который позволит мне воспроизводить сразу несколько звуков, но в конце он убьет этот поток клипов или, возможно, будет иметь один поток, который обрабатывает все звуки?

ответ

0

Вы можете написать свой собственный аудиомикшер. Это не так сложно. Аудиоданные извлекаются из аудиофайлов, а кадры суммируются до вывода на одну SourceDataLine.

Или вы можете использовать TinySound (код доступен на github). Это хорошая чистая реализация именно такого рода смешивания.

Одно из преимуществ смешивания с одним выходом: некоторые системы (некоторые Linux) не поддерживают несколько выходов.

+0

Я должен был упомянуть пару других альтернатив: (1) использовать SourceDataLines вместо Clips, поскольку они могут быть настроены для закрытия всех необходимых ресурсов; (2) есть поддержка прослушивания событий, которая будет уведомлять о завершении клипа или SourceDataLine, которые могут быть использованы для закрытия данного потока. Кроме того, если вы только собираетесь воспроизводить звук один раз, лучше использовать SourceDataLine, чем Clip. –