Вернуть переменную из класса, определенного в другом потоке

mindoverflow спросил: 14 ноября 2017 в 07:23 в: java

Я программирую аудио-визуализатор. Чтобы синхронизировать данные, которые должны отображаться с самой музыкой, мне нужно получить текущую позицию клипа / плеера в аудиофайле, вызвав clip.getMicrosecondPosition() / player.getPosition(). Это нормально работает для клипа. Проблема в том, что мне нужно определить объект проигрывателя в другом потоке, так как вызов player.play() останавливает все выполнение в текущем потоке до тех пор, пока файл не будет воспроизведен до конца. Player - это класс из библиотеки MP3SPI (javazoom.jl.player.Player).

Code:

public class AudioTools implements Runnable {public File file;
public boolean isMP3 = false;
public Player player;
public Clip clip;public AudioTools(File file) {
    this.file = file;
    determineFilyType();
}   private void determineFileType() {
    if (file.getAbsolutePath().endsWith(".mp3")) {
        this.isMP3 = true;
    } else if (file.getAbsolutePath().endsWith(".wav")) {
        this.isMP3 = false;
    } else {
        System.err.println("Invalid File Type!");
        System.exit(0);
    }}public void play() {
    if (isMP3) {
        Thread t = new Thread(this);
        t.start(); // play MP3 using Player class
    } else {
        playWav(file); // play WAV using Clip class
    }}protected void playMP3(File file){
    try {
        player = new Player(new FileInputStream(file));
        player.play();
    } catch (Exception e) {
        System.out.println("Invalid MP3 File!");
        e.printStackTrace();
        System.exit(0);
    }}@Override
public void run() {
    playMP3(file);
}private void playWav(File file) {
    try {
        AudioInputStream ais = AudioSystem.getAudioInputStream(file);
        DataLine.Info dataInfo = new DataLine.Info(Clip.class, null);
        clip = (Clip) AudioSystem.getLine(dataInfo);
        clip.open(ais);
        clip.start();
    } catch (Exception e) {
        e.printStackTrace();
        System.err.println("Invalid .wav file!");
        System.exit(0);
    }
}

}

Основной класс:

public static void main(String[] args) {File file = new File(/*PATH_TO_FILE_HERE*/);
AudioTools at = new AudioTools(file);
at.play();
// at.clip.getMicrosecondPosition() works here if loaded file is .wav.
// at.player.getPosition() returns null if loaded file is .mp3.
}

Из основного класса я бы хотел получить текущую позицию игрока. В настоящее время попытка это вернет null.

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

РЕДАКТИРОВАТЬ: должен содержать весь код, необходимый для запуска примера.

0 ответов