Java Clip!!!

Hoàng_Long

New Member
7/11/19
8
1
3
20
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.
 

Joe

Thành viên VIP
21/1/13
2,963
1,307
113
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 = (SourceDataLine) AudioSystem.
	  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
	  ....
 

Hoàng_Long

New Member
7/11/19
8
1
3
20
đâ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?
 

Hoàng_Long

New Member
7/11/19
8
1
3
20
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.
 

Joe

Thành viên VIP
21/1/13
2,963
1,307
113
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.
 

Hoàng_Long

New Member
7/11/19
8
1
3
20
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();
	 }
}
 

Joe

Thành viên VIP
21/1/13
2,963
1,307
113
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(530, 555);
	setVisible(true);
	setLocation(30, 30);
	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()
 
Sửa lần cuối:

Hoàng_Long

New Member
7/11/19
8
1
3
20
That's not what i really need, but that's a solution. Thank you.
I found another solution. But thanks for your help. :)
 

Joe

Thành viên VIP
21/1/13
2,963
1,307
113
That's not what i really need, but that's a solution. Thank you.
I found another solution. But thanks for your help. :)
Then please post your solution here and share it with the others. That's the true purpose of a forum and also of Congdongjava
 

Hoàng_Long

New Member
7/11/19
8
1
3
20
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.
 
  • Like
Reactions: Joe

Joe

Thành viên VIP
21/1/13
2,963
1,307
113
@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
 
Sửa lần cuối: