【问题标题】:How to minimalize multiple Audio Codes如何最小化多个音频代码
【发布时间】:2021-10-14 01:32:07
【问题描述】:

我正在尝试将我的代码最小化以处理多个音频。这看起来很糟糕。我怎样才能将这么多代码最小化为一个清晰易读的代码。

public class Sound {
    public static int playerSound (char[][] gameBoard) {
        try (AudioInputStream inStream = AudioSystem.getAudioInputStream(Sound.class.getResourceAsStream("Spieler x.wav")) ){
            Clip clip = AudioSystem.getClip();
            clip.open(inStream);
            clip.start();
        } catch (LineUnavailableException lue) {
            System.out.println("Spieler x.wav" + lue.getMessage());
            lue.printStackTrace();
        } catch (UnsupportedAudioFileException uafe) {
            System.out.println("Spieler x.wav" + uafe.getMessage());
            uafe.printStackTrace();
        } catch (IOException ioe) {
            System.out.println("Spieler x.wav" + ioe.getMessage());
            ioe.printStackTrace();
        }
        return 0;
    }
    public static int computerSound (char[][] gameBoard) {
        try (AudioInputStream inStream = AudioSystem.getAudioInputStream(Sound.class.getResourceAsStream("Bot.wav")) ){
            Clip clip = AudioSystem.getClip();
            clip.open(inStream);
            clip.start();
        } catch (LineUnavailableException lue) {
            System.out.println("Bot.wav" + lue.getMessage());
            lue.printStackTrace();
        } catch (UnsupportedAudioFileException uafe) {
            System.out.println("Bot.wav" + uafe.getMessage());
            uafe.printStackTrace();
        } catch (IOException ioe) {
            System.out.println("Bot.wav" + ioe.getMessage());
            ioe.printStackTrace();
        }
        return 0;
    } 

【问题讨论】:

    标签: java audio


    【解决方案1】:

    首先,结合您的例外情况:

    try (AudioInputStream inStream = AudioSystem.getAudioInputStream(Sound.class.getResourceAsStream("Spieler x.wav")) ){
        Clip clip = AudioSystem.getClip();
        clip.open(inStream);
        clip.start();
    } catch (LineUnavailableException | UnsupportedAudioFileException | IOException e) {
        System.out.println("Spieler x.wav " + e);
        e.printStackTrace();
    }
    

    其次,将两个方法中相同的代码移到单独的private方法中:

    private static void play(String resourcePath) {
        try (AudioInputStream inStream = AudioSystem.getAudioInputStream(Sound.class.getResourceAsStream(resourcePath)) ){
            Clip clip = AudioSystem.getClip();
            clip.open(inStream);
            clip.start();
        } catch (LineUnavailableException | UnsupportedAudioFileException | IOException e) {
            System.out.println(resourcePath + ": " + e);
            e.printStackTrace();
        }
    }
    
    public static int playerSound(char[][] gameBoard) {
        play("Spieler x.wav");
        return 0;
    }
    
    public static int computerSound(char[][] gameBoard) {
        play("Bot.wav");
        return 0;
    }
    

    第三,由于您总是返回相同的值(零),因此根本没有返回值:

    public static void playerSound(char[][] gameBoard) {
        play("Spieler x.wav");
    }
    
    public static void computerSound(char[][] gameBoard) {
        play("Bot.wav");
    }
    

    您永远不会使用gameBoard,因此可以从方法中删除该参数:

    public static void playerSound() {
        play("Spieler x.wav");
    }
    
    public static void computerSound() {
        play("Bot.wav");
    }
    

    附带说明一下,您可能不应该在 Clip 完成播放之前自动关闭 AudioInputStream,因为 Clip 可能仍在从中读取:

    private static void play(String resourcePath) {
        try {
            AudioInputStream inStream = AudioSystem.getAudioInputStream(
                Sound.class.getResourceAsStream(resourcePath));
    
            Clip clip = AudioSystem.getClip();
            clip.addLineListener(e -> {
                if (e.getType().equals(LineEvent.Type.STOP)) {
                    clip.close();
                    try {
                        inStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            });
            clip.open(inStream);
            clip.start();
        } catch (LineUnavailableException | UnsupportedAudioFileException | IOException e) {
            System.out.println(resourcePath + ": " + e);
            e.printStackTrace();
        }
    }
    

    【讨论】:

    • 大多数情况下是一个非常有用的答案,但如果一个给定的Clip 被多次播放,每次播放时重复从文件中加载数据是非常浪费的。在冗余打开操作完成之前,Clip 甚至不会开始播放,这可能会增加延迟。您应该创建Clips 实例变量并且只打开一次,或者使用SourceDataLine 来播放而不是Clip(对于更长的音频文件)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多