Toggle Theme Editor
Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Charcoal
Tags:
  1. Hoàng_Long

    Hoàng_Long New Member

    hiện tại em đang làm 1 chương trình game cần có âm thanh.
    lúc bắt đầu khởi động chương trình em có mở 1 file âm thanh làm nhạc nền. trong khi file âm thanh đó đang phát thì em có mở thêm nhiều file âm thanh khác như tiếng bắn súng, tiếng nói chuyện...
    chương trình vẫn đang chạy nhưng em muốn tắt file nhạc nền trước khi file đó tự chạy hết thì phải làm sao ạ?
    và nếu không thể hoặc quá phức tạp thì em muốn tắt tất cả file âm thanh đang chạy thì phải là thế nào ạ?
    Em đang rất rất cần giải pháp. mọi người giúp em với. em cảm ơn.
     
  2. Joe

    Joe Thành viên VIP

    It depends on what kind of APIs you work with. Because you don't post the codes here so I have to guess. If it's the implementation (or derivation) of SourceDataLine you could use the method "stop()" to stop it anytime and anywhere you want. Example:

    .wav music files:
    PHP:
    import javax.sound.sampled.*;
    ...
          
    AudioInputStream as = AudioSystem.getAudioInputStream(inp);
          
    AudioFormat af = as.getFormat();
          
    // get the Info of wav.file
          
    SourceDataLine sl = (SourceDataLineAudioSystem.
          
    getLine(new DataLine.Info(SourceDataLine.class, af));
          
    sl.open(af);
          
    sl.start();
          ....
          
    sl.stop(); // <------STOP the music
          
    ....
    .au music files.
    PHP:
    import sun.audio.*;
    ...
          
    InputStream in = new FileInputStream(file);
          
    AudioStream as = new AudioStream(in);
          
    AudioPlayer.player.start(as);
          ....
          
    AudioPlayer.player.stop(as); // <------STOP the music
          
    ....
     
  3. Hoàng_Long

    Hoàng_Long New Member

    đây là class để tôi tải file nhạc .wav vào các JFrame tôi cần
    PHP:
    public class SoundLoader {
    public static 
    void play(String name){
    try{
         
    File f = new File(name);
         
    AudioInputStream stream AudioSystem.getAudioInputStream(f);
         
    Clip clip AudioSystem.getClip();
         
    clip.open(stream);
         
    clip.start();
    }catch (
    Exception e){
         
    System.out.println("File " name " Not Found");
         
    e.printStackTrace();
    }
    }
    }
    và tôi đã thử dùng stop() nhưng không được.
    ở 1 JFrame khác tôi cũng phát 1 file nhạc nền và không phát thêm file âm thanh nào khác thì stop() hoạt động.
    với JFrame này tôi phát 1 file nhạc nền nhưng lại mở nhiều file âm thanh khác thì stop() lại không hoạt động như tôi muốn.
    tôi nghĩ vấn đề là do tôi mở cùng lúc nhiều file âm thanh.
    vậy tôi muốn hỏi là muốn tắt 1 file âm thanh trong nhiều file âm thanh đang mở cùng lúc hoặc tắt tất cả file âm thanh đó thì tôi phải là sao?
     
  4. Hoàng_Long

    Hoàng_Long New Member

    cho dù tôi đã thử như thế này nhưng nó vẫn không hoạt động như tôi mong đợi
    PHP:
        ...
        
    SoundLoader bgMusic = new SoundLoader();
        
    bgMusic.play("bgmusic.wav");
        ...
        ...
        
    SoundLoader.play("sound1.wav");
        ...
         
    SoundLoader.play("sound2.wav");
        ...
         
    SoundLoader.play("sound3.wav");
        ...
         
    SoundLoader.play("sound4.wav");
        ...
        ...
        
    bgMusic.stop(); // tôi đã cài thêm phương thức stop() ở class SoundLoader
    file bgMusic vẫn phát :((
    chứng tỏ stop() của tôi không hoạt động hoặc nó đã dừng 1 file âm thanh nào trong 4 file sound kia.
     
  5. Joe

    Joe Thành viên VIP

    Where is the method bgMusic.stop() and it looks like? It isn't usual that you ask for help, but give this forum so few information.
     
  6. Hoàng_Long

    Hoàng_Long New Member

    PHP:
    public class SoundLoader {
    public static 
    Clip clip;
         public static 
    void play(String name){
             try{
                 
    File f = new File(name);
                 
    AudioInputStream stream AudioSystem.getAudioInputStream(f);
                 
    clip AudioSystem.getClip();
                 
    clip.open(stream);
                 
    clip.start();
             }catch (
    Exception e){
                 
    System.out.println("File " name " Not Found");
                 
    e.printStackTrace();
             }
         }
         public static 
    void stop() {
             
    clip.stop();
             
    clip.close();
         }
    }
     
  7. Joe

    Joe Thành viên VIP

    I think you confuse static with dynamic. It never works with
    PHP:
        ...
        
    SoundLoader bgMusic = new SoundLoader(); // <------------?????? why ?????
        
    bgMusic.play("bgmusic.wav");
        ...
        
    bgMusic.stop(); // tôi đã cài thêm phương thức stop() ở class SoundLoader
    try with this normal way such as:
    PHP:
    public class SoundLoader {
       private 
    Clip clip;
       public 
    SoundLoader(String name) {
             try{
                 
    File f = new File(name);
                 
    AudioInputStream stream AudioSystem.getAudioInputStream(f);
                 
    clip AudioSystem.getClip();
                 
    clip.open(stream);
                 
    clip.start();
             }catch (
    Exception e){
                 
    System.out.println("File " name " Not Found");
                 
    e.printStackTrace();
             }
        }
        public 
    void stop() {
             
    clip.stop();
             
    clip.close();
        }
    }
    Example:
    PHP:
    import javax.swing.*;
    import java.awt.event.*;
    // Joe Nartca (C)
    public class MusicSWING extends JFrame implements ActionListener {
      
    JButton but;
      
    boolean on false;
      
    SoundLoader sl;
      
    String name;
      public 
    MusicSWING(String name) {
        
    this.name name;
        
    setTitle("100% SWING");
        
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
    but = new JButton("START");
        
    but.addActionListener(this);
        
    add("Center"but);
        
    setSize(530555);
        
    setVisible(true);
        
    setLocation(3030);
        
    setResizable(false);
      }
      public 
    void actionPerformed(ActionEvent ev) {
        if (!
    on) {
          
    on true;
          
    but.setText("STOP");
          
    sl = new SoundLoader(name);
          return;
        }
        
    sl.stop();
        
    but.setText("START");
        
    on false;
      }
      public static 
    void main(String... args) {
        try {
          
    UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
          new 
    MusicSWING(args[0]);
        } catch (
    Exception ex) { }
      }
    }
    it works perfectly with the stop()
     
    Last edited: 16/11/19
  8. Hoàng_Long

    Hoàng_Long New Member

    That's not what i really need, but that's a solution. Thank you.
    I found another solution. But thanks for your help. :)
     
  9. Joe

    Joe Thành viên VIP

    Then please post your solution here and share it with the others. That's the true purpose of a forum and also of Congdongjava
     
  10. Hoàng_Long

    Hoàng_Long New Member

    it's simple.
    I created another class to open soundtrack and the first class to open other sounds.
    PHP:
    public class SoundLoader {
        public static 
    Clip clip;
      public static 
    void play(String name){
         try{
             
    File f = new File(name);
             
    AudioInputStream stream AudioSystem.getAudioInputStream(f);
             
    clip AudioSystem.getClip();
             
    clip.open(stream);
             
    clip.start();
         }catch (
    Exception e){
             
    System.out.println("File " name " Not Found");
             
    e.printStackTrace();
          }
      }
      public static 
    void stop() {
         
    clip.stop();
         
    clip.close();
      }
    }
     
    pubic class SoundTrack(){
    ... 
    // giống class SoundLoader.
    }
    và khi tôi sử dụng stop() như thế này :
    PHP:
        ...
        
    SoundTrack.play("bgmusic.wav");
         ...
         ...
         
    SoundLoader.play("sound1.wav");
         ...
         
    SoundLoader.play("sound2.wav");
         ...
         
    SoundLoader.play("sound3.wav");
         ...
         
    SoundLoader.play("sound4.wav");
         ...
         ...
         
    SoundTrack.stop();
    tuyệt vời file bgmusic.wav đã dừng.
    và vấn đề của tôi là khi tôi mở file bgmusic.wav làm nhạc nền. sau đó tôi mở thêm các file tiếng động như sound1.wav , sound2.wav ... thì nếu tôi dùng chung class thì khi tôi dùng SoundLoader.stop(); thì hệ thống sẽ tắt file sound tôi vừa mở gần nhất chứ không phải file nhạc nền mà tôi mở từ đầu. kể cả có sử dụng giống bạn cũng vậy.
    nên tôi thử tạo thêm 1 class SoundTrack để mở file nhạc nền và thật may là nó đã hoạt động như tôi mong muốn.
     
    Joe likes this.
  11. Joe

    Joe Thành viên VIP

    @Hoàng_Long
    That is what I told you about "confuse between static and dynamic". I'm going to write a topic about this theme.
    UPDATE: read THIS
     
    Last edited: 17/11/19

Chia sẻ trang này

Loading...