Iniziamo questo mese, o meglio questa settimana del mese, la nostra nuova rubrica "Come si fa a…" in cui vogliamo rispondere a quelle innumerevoli domande, che ogni tanto ci si pone, di semplice risoluzione ma che spesso portano via prezioso tempo. Ricordo che chiunque voglia rivolgere una domanda del tipo "Come si fa a…:" è sufficiente che la invii all'indirizzo soprariportato. Al lavoro........
Come si fa a…… riprodurre il suono in una applicazione?
Il primo problema che ci accingiamo a risolvere riguarda la riproduzione audio in una applicazione. Sappiamo, infatti, che in un applet, il caricamento e la riproduzione di un file .au è molto semplice in quanto si utilizza l'interfaccia java.applet.AudioClip implementata proprio dalla classe Applet ed ottenuta attraverso il metodo getAudioClip() della interfaccia java.applet.AppletContext. In verità questa interfaccia è implementata dalla JVM presente nel Browser ma la cosa, ai fini pratici, conta per ora poco. Se vogliamo riprodurre il file suono.au presente nella stessa directory in cui è contenuto il file .class dell'applet basterà scrivere, all'interno di un Applet, il seguente codice:
- try{
URL url=new url(getCodeBase(),"suono.au");
AudioClip ac=getAudioClip(url);
ac.play();
}catch(MalformedURLException mue){
System.out.println("Errore: "+mue.getMessage());
}// fine catch
Nel caso delle applicazioni non e' possibile utilizzare l'implementazione delle interfacce AudioClip ed AppletContext come nel caso degli applet. Questo per la ragione già citata che tali interfacce sono implementate dalla JVM nel browser che deve poter accedere a risorse locali (scheda audio) attraverso metodi nativi. Nel caso di una applicazione bisogna ricorrere alle non documentate classi del package sun.audio. E' cosa sconsigliata da SunSoft utilizzare tali classi in quanto non è assicurato che rimangano le stesse tra le diverse versioni del JDK: infatti queste classi permettono di correggere eventuali errori o di apportare comunque modifiche alle API senza modificare le classi per così dire …"documentate". Comunque se vi è la necessità della riproduzione di suoni in una applicazione non esiste altra scelta (esistono le API Java Media Framework ma non fanno parte delle core java o almeno non ancora). Primo passo e' quello di importare il package sun.audio attraverso l'istruzione
import sun.audio.\*;
L'oggetto responsabile della riproduzione audio è l'oggetto di tipo sun.audio.AudioPlayer. Esso dispone dei metodi start() e stop() per l'avvio e lo stop della riproduzione rispettivamente. Esiste anche un terzo metodo run() che la classe eredita dalla classe Thread che estende. Infatti affinché la riproduzione del suono non assorba tutte le risorse del sistema, essa è ottenuta estendendo la classe Thread. Il metodo run() è chiamato automaticamente quando l'oggetto AudioPlayer viene creato. Cosa importante da sottolineare riguarda il fatto che i metodi start() e stop() prevedono un java.io.InputStream come parametro. Questo rappresenta proprio lo stream da cui verranno letti i byte relativi al suono. Per rappresentare l'InputStream si utilizza la classe sun.audio.AudioStream che rappresenta appunto uno stream in lettura. Essa dispone dei metodi che permettono di ottenere la lunghezza dei dati nello stream attraverso il metodo getLength(), l'insieme dei dati con il metodo getData() e fornisce un metodo read() per la lettura dei byte in blocchi. Questo ultimo viene utilizzato dal player per leggere un numero di byte che dipende dalla capacità di bufferizzazione della macchina in cui il programma è in esecuzione. Per creare un AudioStream è sufficiente utilizzare il costruttore:
AudioStream as= new AudioStream(InputStream in);
Ritornando al problema iniziale, come si fa a riprodurre un file audio in una applicazione? Bene, basterà utilizzare il seguente codice:
AudioStream as = new AudioStream(url.openStream());
AudioPlayer.player.start(as);
Dove player è una proprietà di classe che contiene il player di default del sistema. Infatti la classe AudioPlayer non possiede costruttore ma fornisce una sua istanza attraverso la proprietà player suddetta. [](index.htm)
