# Vorstellung: HotSound (Eure Meinung ist gefragt)



## s4ke (25. Sep 2012)

Hallo allerseits,

ich bin derzeit in einem kleinen Coding Spree dabei eine kleine API zu schreiben. Das ganze soll die Verwendung von Java Sound vereinfachen (weil das ist mehr als kompliziert geraten) und trotzdem gut erweiterbar sein. Im Moment gibt es nur die streambasierte Implementierung eines Players, der noch nicht alles kann, was er soll (siehe Code im Repo). Aber mittlerweile traue ich mich das auch hier zu posten  (vor allem wegen der jetzt vorhandenen Doku). Ein kleines Beispielprogramm verdeutlicht die Einfachheit des ganzen:


```
package de.hotware.hotsound.examples;

import java.io.File;
import java.net.MalformedURLException;

import de.hotware.hotsound.audio.player.BasicSong;
import de.hotware.hotsound.audio.player.IMusicPlayer;
import de.hotware.hotsound.audio.player.IMusicPlayer.SongInsertionException;
import de.hotware.hotsound.audio.player.IPlaybackListener;
import de.hotware.hotsound.audio.player.StreamMusicPlayer;

/**
 * Player that plays on the command line and it's 37 lines long
 * 
 * @author Martin Braun
 */
public class SimplePlayer {

	public static void main(String[] args) throws MalformedURLException,
			SongInsertionException {
		if(args.length >= 1) {
			IMusicPlayer player = new StreamMusicPlayer(new IPlaybackListener() {

				@Override
				public void onEnd(PlaybackEndEvent pEvent) {
					System.out.println("Playback ended");
					System.exit(1);
				}

			});
			player.insert(new BasicSong(new File(args[0])));
			player.startPlayback();
		}
	}

}
```

Link zum Repository:
https://github.com/s4ke/HotSound

Was haltet ihr davon? Ist es eine gute Idee sowas zu bauen? Vorschläge? Wünsche?

mfg

s4ke


----------



## Spacerat (26. Sep 2012)

[IRONIE]Nein. Keine gute Idee.[/IRONIE]

Ich kann da immer nur auf mein eigenes "Projekt" verweisen, mit welchem ich die selbe Idee für jedwedes Dateiformat realisieren will und das nicht nur für Soundfiles.
datatypeslibrary - reading first come along files with only one instruction - Google Project Hosting

Stell dir vor, du könntest Bilder, MP3s, Protracker-Module, 3D-Objekte usw. mit nur einer Anweisung laden, wer würde da noch ImageIO, das Java-Sound-SPI oder X verschiedene Loader für Y verschiedene 3D-APIs verwenden? Alles was man benötigt, ist diese DT-Lib und die Codecs für die Dateien, die man verwenden möchte.
z.B. dt-pt2codec - Pro-, Fast- and Screamtracker Format for DataTypes Library - Google Project Hosting

Dachte auch, das wäre 'ne super Idee, aber als Einzelkämpfer hat man da kaum Chancen, weil es immer Leute gibt, die sagen, es gäbe bereits genug APIs zum Laden von ordinären Dateien (recht haben sie ja, allerdings diese für Bilder, die andere für Musik, diese für Java3D, die andere für LWJGL usw. Das Dateiformate im allgemeinen nur stets gleiche "geordnete" Byteansammlungen sind, wird dabei vergessen).

Der Code ist zwar nicht dokumentiert, aber du kannst ihn dir gerne mal ansehen. Zur Zeit befindet sich das Encoder-/Decoder-Konzept jedoch im Umbau, da ich für jeden Codec nur eine Klasse haben möchte, die dann ihrerseits En- bzw. Decoder anbietet.

Die DT-Lib beinhaltet bereits ein MediaEventSystem. Sollte das Projekt irgendwann mal voran kommen, überleg' ich mir, ob ich dann auch einen Player ala Multiview entwickel.

[EDIT]BTW.: Wenn du dein Projekt aber dennoch für 'ne bessere Idee hälst, bin ich der letzte, der sie dir ausreden will. Lass dich nicht aufhalten, viel Glück. [/EDIT]


----------



## s4ke (26. Sep 2012)

Danke für die gute Zurede. 

Ja ich werde das ganze auf jeden Fall weiterführen, weil ich irgendwann meinen mp3 Player endlich rewrited haben will (und das ganze sauber ).

Ich werd mir aber dein Projekt auf jeden Fall anschauen.


----------



## Spacerat (26. Sep 2012)

s4ke hat gesagt.:


> Ich werd mir aber dein Projekt auf jeden Fall anschauen.


Apropos ansehen. Ich habe bei deinem Projekt bemerkt, dass du auch JLayer (Javazoom, MP3 usw) verwendest. Bei mir ist das zwar kein Zwang, aber immerhin kann man bei meiner Lib auch bereits vorhandene SPIs für Sound und ImageIO weiter verwenden. Dafür existieren die Klassen ImageIO- und AidioIOWrapper.

Vllt. sollte ich auch mal was zum Thema "einfaches Handling" schreiben.

```
// Bilder (BufferedImage) auf die simpelste Art, ohne Fehlerbehandlung
BufferedImage img = DataType.load(new File("image.jpg"));

// selbiges mit Sound
AudioClip clip = DataType.load(new File("audio.wav"));

// das lässt sich so fortsetzen...

// Die Lib fängt alle FileNotFound und andere IOExceptions ab und wandelt sie in Errors, damit man nicht
// zum Abfangen dieser Exceptions gezwungen ist. Das bedeutet aber nicht, dass man diese Fehler nicht
// abfangen darf. Darüber hinaus darf man auch eine ClassCastException abfangen, wenn ein anderer
// Datentyp als der geforderte erkannt wurde.

// Eine Art MultiViewer sähe in etwa so aus:

Object o = DataType.load(new File("path"));

if(o instanceof Viewable) {
  // ...anzeigen
}
if(o instanceof Playable) {
  // ...abspielen und evtl. Listener registrieren
}

// XXXable sind Interfaces, mit denen grundlegende Eigenschaften der Dateien beschrieben werden.
// Davon gibt's eine ganze Reihe im Paket "datatypes.interfaces".
// Die Lib unterstützt neben Files auch URLs (Protokolle jar:, file: und http:), URIs und einfachste
// Strings als Pfadangaben. Andere Quellen ausser Files werden auf der Platte zwischengespeichert.
// Zu guter Letzt ist es ein Goal (Vorsatz) der Lib, sämtliche Codecs ohne die Notwendigkeit weiterer
// Libs von Drittanbietern implementieren zu können, ein weiterer, diesen Loader-Wahn für X
// verschiedene APIs, Y verschiedene Loader zu entwickeln zu beenden.
```
[EDIT]Sorry, wegen der Werbung. Muss man bringen, wenn man im Showgeschäft bleiben will. :lol:[/EDIT]


----------



## s4ke (26. Sep 2012)

Bei mir ist es auch kein Zwang JLayer und so zu benutzen. Ich liefer die Dinger nur mit, weil ich an zwei .jars davon rumbasteln musste, dass sie liefen .

Du benutzt aber AudioClips oder? Die Dinger sind nicht so toll wenn es darum geht große Mediendateien abzuspielen (wegen des Vorbufferns). Dafür kann man darin aber skippen. Das wird aber die nächsten Tage auch in meinem StreamMusicPlayer funktionieren (ich muss nur den Buffer noch einbauen ).

Meine Meinung zum "Loaderwahn": Das ist imho das, was JavaSound so stark macht. Was du brauchst XXX Support? Warte ich bastel dir nur schnell mal die lib in den lib Ordner und es geht. Kein neu compilieren, kein gar nichts. Stell dir vor man hat einen Player und bietet den modular an und jemand braucht nur .mp3 support. Naja dann läd er sich nur die .mp3 lib runter und ist glücklich. 

Zur Edit:
Kein Problem. So kriegt man andere Wege das zu implementieren mit. (Hast du schon den jlayer Player angeschaut? also den von javazoom?)


----------



## Spacerat (26. Sep 2012)

s4ke hat gesagt.:


> Du benutzt aber AudioClips oder? Die Dinger sind nicht so toll wenn es darum geht große Mediendateien abzuspielen (wegen des Vorbufferns). Dafür kann man darin aber skippen. Das wird aber die nächsten Tage auch in meinem StreamMusicPlayer funktionieren (ich muss nur den Buffer noch einbauen ).


Nein, ich hab' meine Klasse nur ebenfalls so benannt. Sie erweitert AudioInputStream und implementiert Playable (bzw. Listenable). Skip, Repeat, Loops usw. wird mit der Implementierung entsprechender Interfaces auch möglich, der Pro-/Fasttracker-Codec tut dies z.B.



s4ke hat gesagt.:


> Meine Meinung zum "Loaderwahn": Das ist imho das, was JavaSound so stark macht. Was du brauchst XXX Support? Warte ich bastel dir nur schnell mal die lib in den lib Ordner und es geht. Kein neu compilieren, kein gar nichts. Stell dir vor man hat einen Player und bietet den modular an und jemand braucht nur .mp3 support. Naja dann läd er sich nur die .mp3 lib runter und ist glücklich.


...und dazu stellen wir uns noch vor, dass man zum Sound evtl. 'ne PCX-Slideshow machen will, schon bräuchte man evtl. wieder JavaImage oder ähnliches mit 'nem speziellen Loader. Ich fand es dazumal schöner, eine breitgefächerte Codec-Lib ala "Amiga-Datatypes" zu erstellen (zum nachlesen).



s4ke hat gesagt.:


> Hast du schon den jlayer Player angeschaut? also den von javazoom?


Du meinst jlGUI? Aber sicher doch. Kommt mir sehr bekannt vor. Amiga-AMP, XMMS, WinAmp...


----------



## s4ke (26. Sep 2012)

Hmm okay. Naja dann muss man aber dazu sagen, dass deine API eine ganz andere Zielgruppe hat wie meine, bzw. eine komplett andere Rangehensweise. Ich bin ein kleiner lightweight freak wenn ich anfange und wenn ich nur Sound will dann will ich nur den.


----------



## Network (26. Sep 2012)

An sich finde ich die Idee sehr gut.
Wenn man ein Programm schreibt und ein Sound abspielen will muss man sich erstmal eine Woche damit befassen wie/warum und weshalb funktioniert das alles nicht 
In Java ist das ja eine echte Qual, ich finde solche Projekte super :toll:

Auf der anderen Seite ist die Frage: Wer ist der Nutzerstamm? Bei der normalen Java API würde ich mal wagen zu behaupten, es sind Programmierer die für ihre GUI mal eine kleine Datei abspielen wollen, mehr nicht. Deshalb würde ich es so einfach wie möglich halten ala 2 Codezeilen.
Größere Projekte bei denen Sounds eine relativ wichtige Rolle spielen würde ich jetzt zum Beispiel die mächtigere OpenAL verwenden, das wäre vieleicht auch mal eine Vereinfachung wert 

Gruß
Net


----------



## s4ke (26. Sep 2012)

Die Qual liegt im Grunde darin, dass es keinen gibt, der das irgendwo mal an einer Stelle "idiotensicher" erklärt. Zum anderen entwickel ich das Ding deswegen, weil ich mal einen mp3 Player auf Java Basis geschrieben habe, der eher schlecht als recht war und dabei mir aufgefallen ist wie leidlich das Abspielen von Sounds in Java ist. Man hat entweder die Wahl die Standard Audio Clips zu nehmen (sind ähnlich zu benutzen wie ein Player) oder man muss sofort low-level auf den Streams rumrödeln. Da fehlt einfach das Mid-Level auf der ansonsten guten API mit ihren super SPIs.


----------



## Spacerat (26. Sep 2012)

@Network: Natürlich sind solche Ideen gut. Das Ganze wird sogar noch besser, ob man sich nun auf eine Datei-Kategorie beschränkt oder nicht.
Die Idee die dahinter steckt ist ja, dass man sich als Entwickler nicht mehr allzuviele Gedanken machen muss, wie einzelne Dateiformate einer Karegorie gelesen werden müssen. Man erhält bei Bildern direkten Zugriff auf die Pixeldaten und Farben, bei 3D-Objekten Zugriff auf jeden einzelnen Pixel und in diesem Fall (Sound) halt Zugriff auf komplette Wellenformen nebst Sampleraten und Zeugs. Das ist also bei weitem nicht nur etwas für den kleinen Kreis, der mal eben was simples machen will, sondern kann insbesondere gerade dazu genutzt werden MP3s (oder soll ich gleich mit AC3 auf die K... hauen?) in JOAL-Projekten zu verwenden ohne dass man an den Lade- bzw. Speichermechanismus auch nur den geringsten Gedanken verschwenden muss.
Ferner braucht man als Entwickler von (in diesem Fall) Soundprogrammen auch keine speziellen Soundformate mehr unterstützen. Von dem, was die Lib leistet bzw. neues bringt, profitiert auch die Software die sie nutzt. Die Entwickler des Soundprogramms hätten dann auch mehr Zeit für andere neue Innovationen. Viele renomierte Softwarefirmen, die es dazumal beim Amiga nicht begreifen konnten, verschwanden sang- und klanglos in der Versenkung. Da wurde wohl [IRONIE]geringfügig[/IRONIE] etwas (die Lib nämlich) unterschätzt. Wie gross also, denkst du, ist der Nutzerstamm?
BTW.: Überlegt euch mal einen Grund, warum es so viele Dateiformate geben könnte. Evtl. weil jeder irgendwann mal die glorreichste aller glorreichen Ideen hatte, die es bisher in noch keinem Format gab oder weil man ein anderes Format, dessen Codec lizenzbehaftet war, gar nicht verwenden durfte?


----------



## s4ke (26. Sep 2012)

Hab die API jetzt soweit aufgebohrt, dass man theoretisch auch Dateien schreiben kann (anderes AudioDevice und ab die Katz), in ein x-beliebiges Format konvertieren kann (anderes IAudioFile mit einem anderen AudioDevice). Langsam nimmt hier alles Form an .


----------



## s4ke (27. Sep 2012)

Ein kleines Aufnahmebeispiel (noch ohne korrekte Länge in der Ausgabedatei). Demnächst kommt noch was zu von Mirkofonen aufnehmen.


```
package de.hotware.hotsound.examples;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;

import de.hotware.hotsound.audio.data.SavingAudioDevice;
import de.hotware.hotsound.audio.player.BasicSong;
import de.hotware.hotsound.audio.player.IMusicPlayer;
import de.hotware.hotsound.audio.player.MusicPlayerException;
import de.hotware.hotsound.audio.player.StreamMusicPlayer;


public class SavingSimplePlayer {

    public static void main(String[] args) throws MusicPlayerException, MalformedURLException, InterruptedException {
        if(args.length >= 2) {
            IMusicPlayer player = new StreamMusicPlayer();
            player.insert(new BasicSong(new URL(args[0])), new SavingAudioDevice(new File(args[1])));
            player.startPlayback();
            //wait 10 seconds (equals approx. 10 seconds of saved audio)
            Thread.sleep(10000);
            //always stop for bug avoidance in saving the audiofile
            player.stopPlayback();
        }
    }

}
```


----------



## Spacerat (27. Sep 2012)

Ohoh... This could lead to some missunderstoods.  (oder wie der Engländer sagt.)

Playback und Aufnahme sind zwei verschiedene Dinge. Also entweder, du benennst die Methode "startPlayback()" in ein simples "start()" um oder implementierst eine weitere mit Namen "startRecording()". Selbiges gilt natürlich auch für "stop". Ausserdem liesse sich ein derartiger "Player" nur jeweils in eine Richtung verwenden (schliesse ich aus dem Device-Argument). In vorhandene Dateien etwas einzufügen, zu ändern oder zu löschen wäre so recht umständlich. Nur so als Tipp.


----------



## s4ke (27. Sep 2012)

Jau stimmt. Die Idee mit dem Aufnehmen hatte ich ja erst.


----------



## s4ke (27. Sep 2012)

Das coole an der ganzen Implementierung ist aber mittlerweile, dass man von jeder Quelle aus lesen (welches Format man auch wünscht) kann und auf jedes Ziel schreiben kann. So kann man damit ganz leicht Streaming Programme schreiben, oder was einen sonst noch so reizt.


----------



## Network (27. Sep 2012)

Spacerat hat gesagt.:


> @Network


???:L
Ich suche gerade das Interface von deinem und meinem Beitrag. Dein Beitrag scheint von meinem zu erben, überschreibt jedoch meine Aussagen mit einer Aussage die nochmal das selbe aussagt?

Gruß
Net


----------



## s4ke (27. Sep 2012)

Und noch ein kleines Beispielprogramm:


```
package de.hotware.hotsound.examples;

import java.net.MalformedURLException;
import java.util.List;
import java.util.concurrent.Executors;

import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.Mixer;

import de.hotware.hotsound.audio.data.BasicAudioDevice;
import de.hotware.hotsound.audio.data.RecordAudio;
import de.hotware.hotsound.audio.player.IMusicListener;
import de.hotware.hotsound.audio.player.IMusicPlayer;
import de.hotware.hotsound.audio.player.MusicPlayerException;
import de.hotware.hotsound.audio.player.RecordSong;
import de.hotware.hotsound.audio.player.StreamMusicPlayer;


public class SimpleMicroPhonePlayer {
	
	public static void main(String[] args) throws MusicPlayerException, MalformedURLException, InterruptedException, LineUnavailableException {
			List<Mixer> mixers = RecordAudio.getRecordMixers();
			if(mixers.size() > 0) {
				IMusicPlayer player = new StreamMusicPlayer(new IMusicListener() {

					@Override
					public void onEnd(MusicEvent pEvent) {
						System.out.println("stopped");
					}
					
				}, Executors.newSingleThreadExecutor());
				Mixer mixer = mixers.get(0);
				mixer.open();
				player.insert(new RecordSong(mixers.get(0)), new BasicAudioDevice());
				player.start();
				//wait 10 seconds (equals approx. 10 seconds of saved audio)
				Thread.sleep(10000);
				player.stop();
			}
	}

}
```


----------



## Spacerat (27. Sep 2012)

Network hat gesagt.:


> ???:L
> Ich suche gerade das Interface von deinem und meinem Beitrag. Dein Beitrag scheint von meinem zu erben, überschreibt jedoch meine Aussagen mit einer Aussage die nochmal das selbe aussagt?
> 
> Gruß
> Net


Äh... auch ???:L 
Aus deiner Aussage entnehme ich, dass der Nutzerstamm deiner Meinung nach nur die Entwickler sind, die "mal eben schnell" ein wenig Sound in ihre GUI bringen wollen, von einer solchen Lib profitieren würden, also relativ wenige. Faktisch aber ist gerade das nicht der Fall. Mir stösst bei deiner Aussage eigentlich nur dieses "mehr nicht" übel auf, denn wie gesagt; Genau die Entwickler die einen solchen Mechanismus verschmähen und lieber ihr eigenes Ding drehen, wären die Dummen. Wer ist schon gern der Dumme. Nicht viele nehm' ich an. Von daher haben unsere Aussagen kein gemeinsames Interface, denn sie sind relativ gegensätzlich.


----------



## s4ke (30. Sep 2012)

Und ein SoundCloudPlayer bei dem das meiste des Codes die Abruferei von SoundCloud ist. (Fürs closen des Players hab ich mich jetzt mal gekonnt nicht interessiert ).


```
package de.hotware.soundcloud.test;

import java.io.IOException;
import java.net.URL;

import org.apache.http.HttpResponse;
import org.json.JSONException;
import org.json.JSONObject;

import com.soundcloud.api.ApiWrapper;
import com.soundcloud.api.Env;
import com.soundcloud.api.Http;
import com.soundcloud.api.Request;

import de.hotware.hotsound.audio.player.BasicPlaybackSong;
import de.hotware.hotsound.audio.player.IMusicPlayer;
import de.hotware.hotsound.audio.player.ISong;
import de.hotware.hotsound.audio.player.MusicPlayerException;
import de.hotware.hotsound.audio.player.StreamMusicPlayer;

public class SimpleSoundCloudPlayer {

	public static void main(String[] args) throws ClassNotFoundException,
			IOException, MusicPlayerException, JSONException {
		if(args.length == 3) {
			ApiWrapper wrapper = new ApiWrapper("client_id",
					"client_secret",
					null,
					null,
					Env.LIVE);
			
			wrapper.login(args[0], args[1]);
			
			HttpResponse locationResponse = wrapper.get(Request.to("/resolve").with("url", args[2]));		
			JSONObject locationJSON = Http.getJSON(locationResponse);
			
			HttpResponse streamURLResponse = wrapper.get(Request.to(locationJSON.get("location")+"/stream"));
			JSONObject streamURLJSON = Http.getJSON(streamURLResponse);
			
			IMusicPlayer player = new StreamMusicPlayer();
			ISong song = new BasicPlaybackSong(new URL(streamURLJSON.getString("location")));
			player.insert(song);
			System.out.println("Starting playback of " + args[2]);
			player.start();
		} else {
			System.out.println("Parameters to be set: 0=username, 1=password, 2=SongURL");
		}
	}
	
}
```

Und so funktionieren Playlists mit dem kleinen Programm (Passwörter in bat ftw ):


```
@echo off
java -jar soundcloudtest.jar yourusername yourpassword http://soundcloud.com/e-603/seaweed-song-passion-pit-remix
java -jar soundcloudtest.jar yourusername yourpassword http://soundcloud.com/e-603/dancing-on-my-own-robyn-remix
java -jar soundcloudtest.jar yourusername yourpassword http://soundcloud.com/e-603/what-you-know-two-door-cinema
java -jar soundcloudtest.jar yourusername yourpassword http://soundcloud.com/e-603/murder-room-pepper-rabbit
java -jar soundcloudtest.jar yourusername yourpassword http://soundcloud.com/e-603/wide-eyes-local-natives-remix
java -jar soundcloudtest.jar yourusername yourpassword http://soundcloud.com/e-603/sure-thing-miguel-remix
java -jar soundcloudtest.jar yourusername yourpassword http://soundcloud.com/e-603/say-aah-trey-songz-remix
java -jar soundcloudtest.jar yourusername yourpassword http://soundcloud.com/e-603/lights-ellie-goulding-remix
java -jar soundcloudtest.jar yourusername yourpassword http://soundcloud.com/e-603/lights-ellie-goulding-remix
```


----------



## Spacerat (1. Okt 2012)

So ein SoundCloudPlayer ist schon eine relativ gute Idee, aber ist es notwendig, dass du für jeden Titel eine neue JVM mit Passwort und Nutzernamen starten musst? Wäre es nicht sinnvoller, die JVM einmal zu starten und statt den einzelnen Titeln z.B. eine PLS-Datei (fallen btw. bei der DT_Lib in die Kategorie Verzeichnis) zu übergeben?
Ich würde Playlisten demnach schlicht als Dateiformat (Sammlung von Titeln) definieren und einen Codec dafür schreiben, welcher die Methoden "play", "stop" usw. an den aktuellen Soundfile delegiert, zusätzlich die Titel per "next" und "previous" durchschaltet und evtl. noch "randomPlay", "repeat" sowie selektiven Zugriff anbietet.


----------



## s4ke (1. Okt 2012)

Du verstehst mich falsch. Das war nur ein kleines Testprojekt zur Demonstration...


----------



## Spacerat (2. Okt 2012)

s4ke hat gesagt.:


> Du verstehst mich falsch. Das war nur ein kleines Testprojekt zur Demonstration...


Na ein Glück. Aber mal echt jetzt, als Test war's für mich ein biss'l überzogen .


----------



## Evil-Devil (2. Okt 2012)

So, alles gelesen...

Du sprichst von "einfach" verwenden. Imho sollte der Entwickler dann nicht mehr als 5 Funktionen haben.
Play(), Pause(), stop(), close() und open() bzw load()


//edit: Dinge wie Lautstärke sind natürlich Sonderfälle.


----------



## s4ke (2. Okt 2012)

Ist so.

start() ersetzt play
pause() und unpause() sind die Pausierungsmethoden
close() gibt es (wenn eine Instanz ohne Listener erzeugt wird braucht man das nicht mal aufrufen)
stop().

insert(ISong) inserted einen Song zum abspielen. Das AudioDevice das intern benutzt wird wird beim Aufruf von close geschlossen.
insert(ISong, IAudioDevice) lässt einem ein spezielles AudioDevice übergeben, das verwendet werden soll. Dieses muss aber wieder per Hand geschlossen werden dann.

Die Beispiele im ersten Posting sind vll nicht mehr alle so einfach gehalten wie es sein soll, aber grundsätzlich spielt dieser Codeschnipsel einfach ab und schließt alle Resourcen danach:


```
ISong song = new BasicPlaybackSong(new File("audio.wav")); //oder was auch immer man abspielen will, URL, etc.
            player.insert(song);
            player.start();
```


----------



## Network (2. Okt 2012)

Eine weitere Vereinfachung wäre die implementierung von unpause() in start()


----------



## s4ke (2. Okt 2012)

Das finde ich nicht. Imho verwirrt das nur. Ein initiales Starten ist was anderes als einen bereits gestarteten aber pausierten Player weiterlaufen zu lassen.


----------



## Network (2. Okt 2012)

Inwiefern darf man deinen Code eigentlich verwenden?
-> Verwenden? Kommerziell?
-> Verändern und verwenden? Kommerziell?
-> Gegenleistungen?

Gruß
Net


----------



## s4ke (2. Okt 2012)

Darf kommerziell verwendet werden. Darf verändert werden (auch kommerziell, aber bitte mit Markierungen). Nur Namentliche Nennung ist erforderlich. Ich denke aber über eine Sublizensierung per Beerware nach .

Hier die Lizenz:

[Java]
/**
 * File BasicAudio.java
 * ---------------------------------------------------------
 *
 * Copyright (C) 2012 Martin Braun (martinbraun123@aol.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
 *
 * - The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
 * - The origin of the software must not be misrepresented.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 * TL;DR: As long as you clearly give me credit for this Software, you are free to use as you like, even in commercial software, but don't blame me
 *   if it breaks something.
 */
[/code]

Eine Datei ist aber im Moment noch Apache 2.0 lizensiert (WaveHeaderFile.java), das wird sich aber noch ändern, da ich diese rewriten werde.


----------



## Spacerat (2. Okt 2012)

Was wäre denn an den Methoden "togglePause()" und/oder "pause(true/false)" auszusetzen? Das "start()" intern "pause(false)" aufruft wäre rein obligatorisch. Ich jedenfalls würde das so machen oops: gar nicht wahr... ich mache es bereits so).
Lautstärke, Balance usw. aber sind tatsächlich Sache des Players, sofern es sich bei der geladenen Datei nicht explizit um eine Sequencer-Datei mit mehreren Spuren und/oder Samples handelt.
[OT]Bei dem Thema fällt mir im übrigen auch gleich wieder das Control-System aus "javax.sound.sampled" ein. Das hab' ich iwie völlig neu für mich entdeckt, kopiert und steuere damit noch ganz andere Dinge als blos Sound, z.B. irgendwelche Einstellungen an DisplayHandlern für 3D-Objekte.[/OT]


----------



## s4ke (2. Okt 2012)

pause(boolean param) find ich gut, aber trotzdem mal schauen.


----------



## Network (6. Okt 2012)

Also ich würde das Projekt gerne in meine kleine Engine/Library aufnehmen.

Das ist im Grunde ein kleines Projekt was viele kleine nützliche Funktionalitäten bereitstellt indem man einfach nur ein JFrame kreiert.
Dieses JFrame hat dann bspw. ein eigenes LookAndFeel mit einem zusätzlichen Button oben rechts um das Programm zu als TrayIcon zu verkleinern.
Oder wenn das Programm iconfied oder trayiconfied ist und man auf die Verknüpfung klickt (Vergessen dass es schon läuft bspw) wird das bereits laufende Programm wieder visible.

Solche Sachen halt, für einen schnellen Start ins nächste Projekt oder Spiel.

Die Library/Engine ist zwar noch nicht öffentlich, aber das wird sie eventuell mal. Ich würde dann halt beim Start des Programmes in einer kleinen Start-Animation deinen Namen neben meinem auftauchen lassen.
Jetzt ein einfaches Soundtool hinzuzufügen hab ich keine Luft ^^

Die Seite die du da verlinkt hast, hab ich schön öfters gesehen, aber wie "verwendet" man die? 

Gruß
Net


----------



## s4ke (18. Okt 2012)

Find ich gut .


----------

