Il sistema software dovrà fornire all’utente la possibilità di ascoltare i file musicali contenuti all’interno del proprio computer, tramite una apposita interfaccia grafica suddivisa nelle seguenti pagine.
Attraverso la pagina della libreria si potrà visualizzare la lista di tracce di cui il
sistema ha precedentemente memorizzato il percorso file. Per ciascuna traccia deve essere visualizzato
un pannello contentente il suo titolo, il nome dell’artista e un pulsante che ne avvii la riproduzione.
Se l’utente non ha ancora aggiunto nessuna traccia, dovrà essere visualizzato un testo che invita a
farlo.
Nella pagina sorgenti sarà possibile visualizzare la lista dei percorsi delle cartelle in cui il sistema cerca i file audio: questa lista potrà essere modificata aggiungendo una cartella o rimuovendone una. L'aggiunta di una cartella dovrà portare alla sua scansione. La lista dovrà essere memorizzata in un apposito database locale, da cui, ad ogni avvio del sistema, dovrà essere letta. Il software dovrà poi effettuare nuovamente la scansione di ciascuna cartella per rilevare eventuali nuovi brani. La scansione consiste nello scorrimento di tutti i file contenuti nella cartella e nelle varie sotto-cartelle, e nella visualizzazione della lista di tracce ottenute nella sezione Libreria. Almeno il formato audio MP3 dovrà essere supportato.
La scheda del riproduttore fornirà all’utente la possibilità di controllare l’audio attualmente in
riproduzione: il sistema dovrà mostrare l’immagine di copertina del brano, oltre al suo titolo e a
quello dell’artista che lo interpreta. Durante la riproduzione dovranno inoltre essere disponibili un
pulsante per mettere in pausa, uno per riprendere, uno per andare alla canzone successiva e
uno per
andare alla canzone precedente.
Il sistema dovrà inoltre tenere traccia della coda di riproduzione, e riprodurre la traccia successiva nella lista quando quella attualmente in riproduzione sarà terminata.
Se l’utente non ha ancora avviato un brano, la schermata del riproduttore mostrerà un’immagine e un
testo predefiniti.
Segue uno schema scheletro del progetto.
La classe Main sarà l'ingresso del programma
e si occuperà di creare la finestra (JFrame
)
e di istanziare e contenere le tre pagine principali: Library,
Sources e Player.
In particolare, Main dovrà essere una sottoclasse di TabsPanel, che si occupa di istanziare il JTabbedPane
e di aggiungervi i componenti, che devono implementare l'interfaccia Tab, che fornisce informazioni essenziali
per l'utilizzo nel JTabbedPane
come il nome del tab e l'icona.
Il database verrà gestito dalla classe Singleton Data utilizzando SQLite. Si terrà traccia dei brani all'interno del programma e non delle cartelle, per avere subito le loro informazioni a disposizione e non dover effettuare la rilettura dei tag MP3. L'unica tabella esistente dovrà essere simile a quella proposta di seguito.
Sarà disponibile internamente una lista di tracce con lo stesso
contenuto del database (localTracksCache
) per velocizzare il tempo di lettura
e non doversi preoccupare del numero di chiamate effettuate.
Le classi interessate potranno inoltre iscriversi per ricevere notifiche
ogni volta che il database viene modificato. Ciascuna notifica consisterà
in un oggetto della classe TracklistUpdate, in grado di portare
informazioni sulla traccia in questione e se questa sia stata aggiunta o rimossa.
Un brano verrà rappresentato dalla classe Track, e conterrà
una serie di informazioni quali titolo, artista, album e percorso file.
La pagina della libreria mostrerà la lista di tracce al momento disponibili per la riproduzione. Tale componente sarà internamente suddiviso in tre parti:
- TracklistController, utilizzata dal client (in questo caso Library). Istanzia le altre due parti ed espone alcuni dei loro metodi utili all'esterno
- TracklistModel racchiude i meccanismi interni della classe, come la lista di tracce e metodi per aggiungerne di nuove o rimuoverne di esistenti, o il metodo
startPlayback
per avviare la riproduzione di un brano. Riceve aggiornamenti sullo stato del database dalla classe Data, e li utilizza per tenere aggiornati i dati interni - TracklistView si occupa di mostrare a schermo le tracce in memoria, ricevendo aggiornamenti in tempo reale dal Model.
La pagina delle sorgenti mostrerà la lista di cartelle scansionate e due pulsanti per aggiungere o rimuovere cartelle. Anche questo sarà suddiviso in tre:
- LocalController, utilizzata all'esterno, istanzia le altre due parti e ne espone i metodi principali. Gestisce l'input utente trammite click sui pulsanti
- LocalModel contiene la logica interna, la lista di cartelle e metodi per aggiungerne di nuove o rimuoverne di esistenti, o il metodo
scanDirectory
per avviare la scansione di una cartella - LocalView si occupa di mostrare a schermo la lista delle cartelle e i pulsanti, o un testo di riempimento se non ne sono state selezionate alcune.
Anche la pagina di gestione della musica sarà suddivisa in tre componenti Model, View e Controller.
La PlayerView mostrerà le informazioni sul brano ricevute tramite
il metodo display(Track)
da PlayerModel e i pulsanti,
il cui input verrà catturato da PlayerController e inoltrato a PlayerModel,
responsabile della logica interna del player, per la quale si serve delle classi offerte dalla libreria JACo MP3 Player.
PlayerModel è inizialmente nello stato inattivo, pronto a passare allo stato attivo nel momento in cui l'utente avvia una traccia dalla lista.
Se la riproduzione termina e non ci sono tracce in coda, il player tornerà nuovamente nello stato inattivo, in cui verranno mostrati un'immagine e un titolo
predefiniti e le operazioni di previous
, play
/pause
e next
non avranno alcun effetto.
Il seguente diagramma illustra i passaggi tra le classi che dovranno avvenire a partire dal click sul pulsante per iniziare la riproduzione di un brano.
La scelta di una cartella da aggiungere porterà invece ad una catena simile alla seguente
- Singleton in
Data
- State in
Player
- Observer tra
Data
eTracklistModel
e traTracklistModel
eTracklistView
- Model-View-Controller in
Library
,Local
ePlayer