# Spezialwiedergabe von Sound vorzeitig beenden



## Zettelkasten (22. Dez 2010)

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):

```
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 
	
	
	
	





```
String Soundfiles = new String { "","Kick","Snare","HiHat","Ride","Stick" };
```
 definierten Sound abgespielt wird (das ist aber eher unwichtig), die Funktion sieht so aus:

```
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.


----------



## AlexSpritze (22. Dez 2010)

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?


----------



## Zettelkasten (23. Dez 2010)

AlexSpritze hat gesagt.:


> 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 )


AlexSpritze hat gesagt.:


> Übrigens auf dem Bild sehe ich nur Radio-Buttons  Oder sehe ich das nur falsch?


Ja, das stimmt - habe es gleich umgeändert


----------



## Zettelkasten (25. Dez 2010)

Naja, mein Programmcode sieht so aus.

DateCommand.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

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

FirstThread.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:

```
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:

```
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.


----------

