Bye J2ME - Hello J2SE Games

oneof6

Mitglied
Also,

die Sound-API muss ich austauschen und ne MP3 lib benutzen. Ich hab' gedacht die Sound-API is schön klein, die kannst'e nehmen...is wohl net!
 
S

SE

Tja ... Wave Sounds würden es für den Anfang ja auch erstmal tun ... die werden von Java native unterstützt ... und das auch definitiv in v7 und auf Unix ... aber WIE das geht ... tja ... Google

// EDIT

http://download.oracle.com/javase/tutorial/sound/index.html


Ich werd mich mal ran machen und n Sample bauen ... hoffe das haut hin.
 
Zuletzt bearbeitet von einem Moderator:
S

SE

Ok ... ich hab n funktionierend Code für WAV-Files ... er läuft unter meinem System und der VM ohne Probleme ... ich würde aber genode mal bitte das unter Linux auszuprobieren ... und du 1of6 kannst es ja unter Mac testen.

WICHTIG : NUR WAV FILES ... und ich weis auch nicht welche Formate alle unterstützt werde ... das müssen wir durch testen herrausbekommen.

Java:
import java.io.*;
import javax.sound.sampled.*;
public class TestSound
{
	public static void main(String[] args) throws Exception { new TestSound(args); }
	private TestSound(String[] args) throws Exception
	{
		File soundFile=new File(args[0]);
		AudioInputStream audioInputStream=AudioSystem.getAudioInputStream(soundFile);
		Clip clip=AudioSystem.getClip();
		clip.open(audioInputStream);
		clip.start();
		while(clip.getFramePosition()<clip.getFrameLength()) { }
	}
}
 

oneof6

Mitglied
Bin jetzt nicht am Rechner, aber bevor Du das Rad neu erfindest schau' dir mal die Klasse SoundEffect an. Die benutzt wav.
 
S

SE

// EDIT

Du meinst deine Klasse , richtig ?
Das wäre mir zu umständlich da noch mit den AudioLines rumzubateln ... meins is relativ sauber und einfach ... und überlässt dem System die arbeit.
 
Zuletzt bearbeitet von einem Moderator:

Fabio Hellmann

Erfahrenes Mitglied
Du kannst über die native Java-Library auch MP3 abspielen, du musst dafür nur das AudioFormat anpassen. Ich habe das auch schon mal gemacht, allerdings habe ich den Code zu Hause. Ich habe dir hier mal einen kleinen Code getipselt, weiß aber nicht ob er funktioniert, da ich es nicht testen kann. Aber so in der Art habe ich das glaube ich auch zu Hause gemacht:

Java:
import java.io.File;
import java.io.IOException;

import javax.sound.sampled.*;

public class MP3
{
	public static Clip loadClip(File file)
	{
		try {
			AudioInputStream in = AudioSystem.getAudioInputStream(file);
			
			AudioFormat baseFormat = in.getFormat();
			AudioFormat decodedFormat = new AudioFormat(
					AudioFormat.Encoding.PCM_SIGNED, 
					baseFormat.getSampleRate(), 
					16,
					baseFormat.getChannels(),
					baseFormat.getChannels() * 2, 
					baseFormat.getSampleRate(),
					false
			);

			AudioInputStream inputStream = AudioSystem.getAudioInputStream(decodedFormat, in);
			
			DataLine.Info info = new DataLine.Info(Clip.class, inputStream.getFormat());
			
			Clip clip = (Clip) AudioSystem.getLine(info);
			clip.open(in);
			clip.addLineListener(new ClipLineListener());
			
			return clip;
		} catch (UnsupportedAudioFileException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (LineUnavailableException e) {
			e.printStackTrace();
		}
		return null;
	}

	private static class ClipLineListener implements LineListener
	{
		/* (non-Javadoc)
		 * @see javax.sound.sampled.LineListener#update(javax.sound.sampled.LineEvent)
		 */
		public void update(LineEvent event)
		{
			if(LineEvent.Type.STOP == event.getType()) {
				event.getLine().close();
			}
		}
	}
}

Gruß

Fabio
 

oneof6

Mitglied
OK,

erstmal...super Resonanz Gentlemen!!
Ich hatte noch nicht viel Zeit, hab' aber beide Versionen (Spikee und Fabio) mal quick'n dirty implementiert.

@Spikee
Dein Code ist wirklich kompakt. Allerdings scheint mit dem Java Mixer nur eine bestimmte Buffer größe abspielbar zu sein. Wenn ich ein WAV für Hintergrundmusik (ca. 3MB) reinlade, haut er mir folgende exception um die Ohren:

Java:
SCHWERWIEGEND: null
javax.sound.sampled.LineUnavailableException: Failed to allocate clip data: Requested buffer too large.
        at com.sun.media.sound.MixerClip.implOpen(MixerClip.java:561)
        at com.sun.media.sound.MixerClip.open(MixerClip.java:165)
        at com.sun.media.sound.MixerClip.open(MixerClip.java:256)
        at jonny_0_5.MusicBox.<init>(MusicBox.java:52)
        at jonny_0_5.Board.preloader(Board.java:96)

Im Netz hab' ich nach kurzer Suche das gefunden:
1048576 bytes (that's the current limit imposed by MixerClip)
http://codeidol.com/java/swing/Audio/Play-Non-Trivial-Audio/

Man muss für größere Dateien also, wohl oder übel, DataLines benutzen.


@Fabio
Sobald ich versuche ne mp3 als Stream in den AudioInputStream zu schieben, wirft er folgende exception:
Java:
javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input stream
        at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1102)

schieb' ich ne normale WAV rein, läuft's rund?
 
S

SE

@1one6
Öhm ... verdammt ... ok ... DAS wusste ich natürlich nicht , weil ich auch keine WAV dieser Größe zum Testen hatte. Dann ist meine Lösung also doch nur für SFX verwendbar ... für BGM muss man dann halt DataLines nutzen ... 1:0 für die API xD.

@Fabio
Also ohne dich jetzt selbst angreifen zu wollen ... aber so KANN das schon mal gar nicht funktionieren. MP3 ist eigentlich ein NICHT-OpenSource Format. Lediglich die DE-Kodierung ist public ... für EN-Kodierung muss man eigentlich Lizenzkosten zahlen ... auch wenn es mit dem LAME MP3 Codec einen komplett freien Codec gibt ... dieser ist aber gerade in Deutschland mehr geduldet als legal. Auch kann man mit ihm nur relativ geringe EN-Kodierungen durchführen ... will man bessere Ergebnisse muss man sich eine Lizenz holen.
Auf Grund dessen hat Java KEINEN MP3-DE-Koder ... und desshalb kannst du aus Java auch ohne sowas kein MP3 laden ... weil Java nur für RAW-Formate *WAV* gebaut wurde.
Es gibt zwar auf der DL-Seite vom JMF auch einen MP3-DE-Koder ... aber ich hab gerade erlich gesagt keine Zeit um das zu testen da ich gleich los muss ... und ich wär erst in 1 1/2 Stunden wieder da. Der Link dazu wäre hier : http://www.oracle.com/technetwork/java/javase/download-137625.html
Kurz zusammen gefasst : man braucht JMF und muss den MP3-Codec irgendwie installieren / registrieren ... und funktioniert halt scheinbar nur in einer JMF Applikation ... aber ich denke das wir es schaffen das alles soweit aus ein andere zu nehmen das wir nachher ne MP3-Lib-Jar zusammen haben und damit einfach über AudioSystem.getAudioInputStream() laden können ... ich guck mir das nachher mal intensiv an.
 

Fabio Hellmann

Erfahrenes Mitglied
Ja wie gesagt, ich habe den Code zu Hause und habe diesen auch schon laufen lassen und es hat auch funkioniert. Wenn ich später zu Hause bin, werde ich mal den Code reinstellen.
 

Neue Beiträge