Java AudioSystem. WAV несоответствие в поведении - PullRequest
0 голосов
/ 08 января 2012

У меня есть несколько файлов .wav, которые я играю с Java. В этом урезанном примере слышно «drip», а «swish» - нет, даже если они запускаются с использованием одного и того же кода. В «swish» нет ничего необычного: он воспроизводится с рабочего стола Gnome. У меня есть похожее приложение, не совсем урезанное, которое воспроизводит «swish», но не «drop», поэтому опять же, похоже, это не проблема, связанная с характером данных.

Есть идеи, что здесь происходит? Эта ошибка была замечена после того, как код, который, как было известно, работал, был «повторно развернут» в перестроенной системе: переустановил Ubuntu 10.10 и Eclipse Indigo. Эта ошибка возникает как с Sun JDK 6, так и с OpenJDK 6. Редактировать"Перестроенная" система на самом деле также отличается от аппаратного: Intel E6500 (2 ядра, 2,93 ГГц). Я только установил Ubuntu, Eclipse, OpenJDK, Sun JDK. Предыдущая система была AMD 630 (4 ядра, 2,8 ГГц) с Ubuntu, Eclipse, OpenJDK (я думаю).

Редактировать После некоторых экспериментов кажется, что первый загруженный клип будет работать. Конструктор TestSounder загружает их таким образом, чтобы порядок был обратным. Возможно, использование статического метода AudioSystem.getLine как-то связано с этим, поскольку это, очевидно, здесь не объектно-ориентированная операция.

import java.io.IOException;

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.Clip;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.sound.sampled.LineUnavailableException;

public class TestSounder
{
    String resourcePathFromBin = "/resources/";

    Clip dripClip;
    Clip swishClip;

    public TestSounder()
    {
        dripClip = setupClip("drip.wav");
        swishClip = setupClip("swish.wav");
    }

    public void close()
    {
        dripClip.close();
        swishClip.close();
    }

    private Clip setupClip(String fileName)
    {
        Clip clip = null;
        try
        {
            AudioInputStream ais = 
                AudioSystem.getAudioInputStream(this.getClass().getResourceAsStream(resourcePathFromBin + 
                                                                                    fileName));
            AudioFormat af = ais.getFormat();
            DataLine.Info lineInfo = new DataLine.Info(Clip.class, af);
            clip = (Clip)AudioSystem.getLine(lineInfo);
            clip.open(ais);
        }
        catch (UnsupportedAudioFileException e)
        {
            assert false: "bug";
        }
        catch (IOException e)
        {
            assert false: "bug";
        }
        catch (LineUnavailableException e)
        {
            assert false: "bug";
        }
        return clip;
    }

    public void go(UtilityK.Sounds s)
    {
        Clip clip = null;
        if (s == UtilityK.Sounds.drip)
            clip = dripClip;
        if (s == UtilityK.Sounds.swish)
            clip = swishClip;

        clip.stop();
        clip.setFramePosition(0);
        clip.start();
        //while (clip.isRunning())
        //    TestSounder.delay();
    }

    public static void main(String[] args)
    {
        TestSounder obj = new TestSounder();

        obj.go(UtilityK.Sounds.swish);
        TestSounder.delay();

        obj.go(UtilityK.Sounds.drip);
        TestSounder.delay();

        obj.go(UtilityK.Sounds.swish);
        TestSounder.delay();

        obj.go(UtilityK.Sounds.drip);
        TestSounder.delay();

        obj.close();
    }

    private static void delay()
    {
        Thread.sleep(5000);
    }
}

public interface UtilityK
{
    enum Sounds { drip, swish };
}

1 Ответ

0 голосов
/ 09 января 2012

Вот альтернативный подход.Кажется, он хорошо подходит для коротких звуков, которые, возможно, придется воспроизводить часто или по очереди, как отзывы пользователей.

ссылка на способ воспроизведения двух видов звуковых сигналов из файлов .wav

...