Spezialwiedergabe von Sound vorzeitig beenden

Zettelkasten

Aktives Mitglied
Hallo!
Ich bin gerade dabei, einen Drumcomputer bzw. Drummaker zu schreiben. Das Programm bestitzt 5 x 16 JCheckboxen. (siehe Bild 1) Diese kann man an- und abwählen. Auf jeder Zeile läuft ein anderes Instrument, sprich wenn ich jetzt bei Zeile 3 die erste JRadioButton anclicke, wird die boolean Variable Sound3[1] (SoundZeile[Spalte]) auf "true" gesetzt. So geht das jetzt mit allen JCheckboxen und natürlich kann man sie auch wieder abwählen.
Jetzt habe ich eine Funktion geschrieben, mit der man das dann abspielen kann, hier der Code von void playAll(Anzahl der Wiederholungen):
Java:
	public void playAll(int Nr)
	{
		for(int NR = 1; NR <= Nr; NR++)
		{
			for(int i = 1; i < 17; i++)
			{
				try
				{
					Thread.sleep(Tempo); // Länge festlegen
		
					if(Sound1[i] == true){
						MyFile = 1;
						playSound(1,"false");
					}
					if(Sound2[i] == true)
						{
						MyFile = 2;
						playSound(2,"false");
					}
					if(Sound3[i] == true)
					{
						MyFile = 3;
						playSound(3,"false");
					}
					if(Sound4[i] == true)
					{
						MyFile = 4;
						playSound(4,"false");
					}
					if(Sound5[i] == true)
					{
						MyFile = 5;
						playSound(5,"false");
					}
				}
				catch(Exception x)
				{
				}
			}
		}
	}
Die Funktion playSound(int Soundnummer,String Soundfile), Soundfile ist der "File", wenn ein anderer Sounds als der in
Code:
String Soundfiles = new String { "","Kick","Snare","HiHat","Ride","Stick" };
definierten Sound abgespielt wird (das ist aber eher unwichtig), die Funktion sieht so aus:
Java:
	public void playSound(int MyFile,String File)
	{
		if(File.equals("false"))
		{
			try
			{
				AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File(Pfad+Soundfiles[MyFile]+".wav"));
				AudioFormat af = audioInputStream.getFormat();
				int size = (int) (af.getFrameSize() * audioInputStream.getFrameLength());
				byte[] audio = new byte[size];
				DataLine.Info info = new DataLine.Info(Clip.class, af, size);
				audioInputStream.read(audio, 0, size);
				//for(int i = 0; i < 1001; i++)
				//{
					Clip clip = (Clip) AudioSystem.getLine(info);
					clip.open(af,audio,0,size);
					clip.start();
				//}
			}
			catch(Exception e)
			{
			}
		}
		else
		{
			try
			{
				AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File(Pfad+File+".wav"));
				AudioFormat af = audioInputStream.getFormat();
				int size = (int) (af.getFrameSize() * audioInputStream.getFrameLength());
				byte[] audio = new byte[size];
				DataLine.Info info = new DataLine.Info(Clip.class, af, size);
				audioInputStream.read(audio, 0, size);
				//for(int i = 0; i < 1001; i++)
				//{
					Clip clip = (Clip) AudioSystem.getLine(info);
					clip.open(af,audio,0,size);
					clip.start();
				//}
			}
			catch(Exception e)
			{
			}
		}
	}
Die Sounds werden problemlos abgespielt.

Jetzt aber zu meinem eigentlichen Problem: Ich will, das man die Wiedergabe vorzeitig abbrechen kann. Wenn man jetzt einen Button "Stopp" einbaut, und auf diesen clickt, wird die Funktion erst nach der Funktion vom Button "Abspielen" ausgeführt, und ist damit sinnlos.

Vielleicht kann mir ja jemand helfen, Zettelkasten.
 

Anhänge

  • Bild 1.jpg
    Bild 1.jpg
    27,2 KB · Aufrufe: 44
Zuletzt bearbeitet:
Dass die Fkt Stopp erst nach der Fkt Abspielen aufgerufen wird, klingt danach, dass du es mit Threads versuchen solltest (ohne den Code genau angeschaut zu haben 😉). Also dass du das Abspielen in einem anderen Thread laufen lässt, und wenn du Stopp geklickt hast, wird diesem Thread mitgeteilt dass er aufhören kann abzuspielen.

Übrigens auf dem Bild sehe ich nur Radio-Buttons 😉 Oder sehe ich das nur falsch?
 
Dass die Fkt Stopp erst nach der Fkt Abspielen aufgerufen wird, klingt danach, dass du es mit Threads versuchen solltest (ohne den Code genau angeschaut zu haben 😉). Also dass du das Abspielen in einem anderen Thread laufen lässt, und wenn du Stopp geklickt hast, wird diesem Thread mitgeteilt dass er aufhören kann abzuspielen.
Ich habe mich mal über Threads kundig gemacht: Java ist auch eine Insel - Threads. Ich habe noch nicht alles gelesen, aber bei diesem Abschnitt steht ja ein Beispiel. Dort werden die einzelnen run()-Funktionen aber nacheinander abgespielt, und das hilft mir ja nicht viel.
(Es könnte aber auch sein, das ich einen Fehler gemacht habe 🙁)
Übrigens auf dem Bild sehe ich nur Radio-Buttons 😉 Oder sehe ich das nur falsch?
Ja, das stimmt - habe es gleich umgeändert 🙂
 
Zuletzt bearbeitet:
Naja, mein Programmcode sieht so aus.

DateCommand.java
Java:
import java.util.Date;
public class DateCommand   implements Runnable
  {
    public void run()
    {
    for ( int i = 0; i < 20; i++ )
      System.out.println( new Date() );
  }
}

CounterCommand.java
Java:
class CounterCommand   implements Runnable
  {
    public void run()
    {
    for ( int i = 0; i < 20; i++ )
      System.out.println( i );
  }
}

FirstThread.java
Java:
public class FirstThread
{
  public static void main( String[] args )
  {
    Thread t1 =   new Thread( new DateCommand() );
      t1.  start();
      Thread t2 =   new Thread( new CounterCommand() );
      t2.  start();
    }

}

Die Ausgabe der Console sieht dann so aus:
Code:
Sat Dec 25 08:47:05 CET 2010
Sat Dec 25 08:47:05 CET 2010
Sat Dec 25 08:47:05 CET 2010
Sat Dec 25 08:47:05 CET 2010
Sat Dec 25 08:47:05 CET 2010
Sat Dec 25 08:47:05 CET 2010
Sat Dec 25 08:47:05 CET 2010
Sat Dec 25 08:47:05 CET 2010
Sat Dec 25 08:47:05 CET 2010
Sat Dec 25 08:47:05 CET 2010
Sat Dec 25 08:47:05 CET 2010
Sat Dec 25 08:47:05 CET 2010
Sat Dec 25 08:47:05 CET 2010
Sat Dec 25 08:47:05 CET 2010
Sat Dec 25 08:47:05 CET 2010
Sat Dec 25 08:47:05 CET 2010
Sat Dec 25 08:47:05 CET 2010
Sat Dec 25 08:47:05 CET 2010
Sat Dec 25 08:47:05 CET 2010
Sat Dec 25 08:47:05 CET 2010
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

Soweit ich das aber will, müssten die Zahlen und das Datum ineinander verschachtelt sein, sprich:
Code:
Sat Dec 25 08:47:05 CET 2010
0
Sat Dec 25 08:47:05 CET 2010
1
Sat Dec 25 08:47:05 CET 2010
2
Sat Dec 25 08:47:05 CET 2010
3
Sat Dec 25 08:47:05 CET 2010
4
Sat Dec 25 08:47:05 CET 2010
...

Ich hoffe mir kann jetzt jemand helfen... vielen Dank schon einmal im Voraus, Zettelkasten.
 

Zurück
Oben