Open Community

the Open Community site
 
   

Beethoven

PDF
PDF

Introduzione

Audio Player è un semplicissimo tool command line scritto in Java che consente di ascoltare file musicali di diveso formato. Attualmente il solo formato supportato è quello MIDI (attraverso le APIs standard di Java) ma ben presto molti altri formati verranno aggiunti.

Poichè Audio Player è stato scritto in Java in teoria dovrebbe funzionare su qualsiasi piattaforma, tuttavia, gli script attualmente disponibili sono solo per Linux e i test da me effettuati sono stati eseguiti solo su questo tipo di sistema operativo.

Installazione

Scarica il seguente file player.tar.gz in una directory ed esegui i seguenti passi:

./build.sh
./play <midi file>

Disegno

Nel disegnare Audio Player ho posto la mia attenzione soprattutto sugli aspetti di Estensibilità. Infatti il tool dovrà essere flessibile qualora si voglia aggiungere un nuovo formato audio o addirittura si voglia aggungere anche il supporto per una GUI.

Al fine di poter aggiungere in futuro anche una GUI, ho pensato bene di disaccoppiare il modello (o engine) del player dalla logica che impartisce i comandi (vedi [1]). Infatti ho definito 2 packages:

- model: che contiene l'engine del player;
- cli: che contiene la classe che gestisce la command line, cioè prende i comandi utenti ed invoca il corrispondente comando nel modello.

Iniziamo con l'esaminare il modello. Fondamentalmente la classe principale è PlayerManager che, in pratica, funge da Facade (vedi [2]) per l'intero engine. Tutti i comandi provenenti da cli (e in futuro da GUI), passano attraverso questo punto unico di accesso all'engine. Il PlayerManager è implementato come singleton (vedi [3]) per cui all'interno di una virtual machine è possibile avere solo una istanza di questa classe.

L'unico comando messo a disposizione di questa classe è play che prende in input il file da suonare e lancia eccezioni in caso di errore.

                public class PlayerManager  {

                    ...

                    public void play(String filename) throws PlayerException {

                    }

                    ....

                }
      

Ogni file audio è gestito attraverso un player che fondamentalmente implementa l'interfaccia Player.

                interface Player {

                    public void play(String filename) throws PlayerException;

                }
      

Nel caso del midi player avremo la classe MidiPlayer che implementa l'interfaccia Player ed invoca le Java APIs per suonare il file MIDI.

Per consentire di aggiungere al Player manager il supporto per nuovi formati di file senza dover ogni volta modificarlo, ho introdotto la classe PlayerFactory che contiene un factory method (vedi [4]) che consente di creare i players appropriati in base all'estensione del file in input. Ad esempio, nel caso in cui il file in input è un .mid, allora il factory method instanzierà un oggetto della classe MidiPlayer. A questo punto, il PlayerManager senza conoscere con quale tipo di player stia lavorando (disaccoppiamento tra player manager e player), invoca semplicemente il comando play sull'oggetto di tipo Player.

        public class PlayerManager {

            ...

            public void play(String filename) throws PlayerException {

                Player p = PlayerFactory.makePlayer(filename);

                p.play(filename);

            }

            ....

        }
      

Conclusioni

Il progetto presentato in questo articolo è una valida introduzione alla programmazione Java e ai Design Patterns. Chiunque lo desidera può ulteriormente sviluppare questo progetto aggiungendo nuove features, come ad esempio: supporto per nuovi formati audio (es. MP3), aggiunta di un GUI front end e molto altro ancora.

Download source code

Clicca qui per scaricare il codice.

Bibliografia

by Salvatore D'Angelo