声音要么循环,要么只播放一次

时间:2014-08-22 10:23:35

标签: loops audio

好的,所以我在尽可能以最有效的方式播放我的wav声音时遇到了问题。如果我摆脱了'clip.setFramePosition'在我的Audio类中,然后声音循环(显然因为剪辑保持反转回到第0帧)。如果我带走了'clip.setFramePosition'方法,声音播放ONCE,只播放一次(可能因为需要将其设置回原来的帧位置)。

涉及两个类:

/**
 * Initalise sound clips
 */

public static Clip reverb = loadClip("/SFX_Intro/reverb.wav");
public static Clip glitch = loadClip("/SFX_Intro/glitch.wav");
public static Clip menu = loadClip("/SFX_Ambience/menu.wav");

/*
 * audio input to enable sound
 */

private static AudioInputStream ais;

/**
 * load sound clip
 */

private static Clip loadClip(String resourceName) {
    try {
        ais = AudioSystem.getAudioInputStream(Audio.class.getResource(resourceName));
        DataLine.Info info = new DataLine.Info(Clip.class, ais.getFormat());

        Clip clip = (Clip) AudioSystem.getLine(info);
        clip.open(ais);

        return clip;

    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

/**
 * play sound clip
 */
public static void play(Clip clip) {
    if (clip != null) {
        try {
            clip.rewind();
            clip.setFramePosition(0);
            clip.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

/**
 * loop sound
 */

public static void loop(Clip clip, int amount) {
    if (clip != null) {
        try {
            clip.loop(amount);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

/**
 * Stop sound
 */

public static void stop(Clip clip) {
    clip.stop();
}

和...

/**
 * alpha vars
 */

private int alpha = 220;
private final int MIN_ALPHA = 0;
private Color c;
private Rectangle r;

/**
 * class importations
 */

private Counter[] delay;

/**
 * Constructor
 */

public Intro(GameStateManager gsm) {
    super(gsm);

    delay = new Counter[3];
    delay[0] = new Counter();
    delay[1] = new Counter();
    delay[2] = new Counter();
}

/**
 * Update
 */

public void update() {
    Cursor.setCursor(Cursor.INVISIBLE);
}

/**
 * Draw
 */

public void draw(Graphics2D g) {

    delay[2].count(2);

    if (delay[2].bFinished) {

        r = new Rectangle(0, 0, GamePanel.WIDTH, GamePanel.HEIGHT);
        c = new Color(0, 0, 0, alpha);

        g.drawImage(Texture.plogo_01, GamePanel.WIDTH / 2
                - Texture.plogo_01.getWidth() / 2, GamePanel.HEIGHT / 2
                - Texture.plogo_01.getHeight() / 2, null);

        if (alpha != MIN_ALPHA) {
            alpha -= 1;
        }

        else if (alpha == MIN_ALPHA) {  // Once faded in...

            g.drawImage(Texture.plogo_02, GamePanel.WIDTH / 2
                    - Texture.plogo_02.getWidth() / 2, GamePanel.HEIGHT / 2
                    - Texture.plogo_02.getHeight() / 2, null);
            delay[0].count(0.005);  // set delay time
            Audio.play(Audio.glitch);  // Play glitch sound 
        }

        if (delay[0].bFinished) {  // Once delay time has finished...

            g.setColor(Color.BLACK);
            g.fill(r);
            delay[1].count(3);  // set another delay time
            if (delay[1].bFinished) {
                gsm.setState(GameStateManager.MENU);  // change to menu state
                return;
            }
        }
        g.setColor(c);
        g.fill(r);
    }
}

/**
 * Key input
 */

public void keyPressed(int key) {
}

public void keyReleased(int key) {
}

我希望有人可以帮助解决这个问题。提前谢谢。

1 个答案:

答案 0 :(得分:0)

解决。我在'Play'方法中添加了一个'if'语句:

public static void play(Clip clip) {
    try {
        clip.start();

        int MAX_FRAMES = clip.getFrameLength();
        if (clip.getFramePosition() == MAX_FRAMES) {
                clip.setFramePosition(0);
                stop(clip);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return;
}