Compact Disc Player

1 Descrizione del sistema

Il Compact Disc Player è un dispositivo, controllato da un microprocessore, per la riproduzione di brani audio memorizzati su disco ottico. E` dotato di un lettore, di un altoparlante, e di una tastiera con sei tasti (Play, Pause, Stop, Next, Previous, Eject). Il microprocessore dispone di memorie ROM e RAM.

1.1 Hardware

1.1.1 Formato del disco ottico

Il disco ottico contiene una sequenza di brani, numerati consecutivamente a partire da zero. Ogni brano inizia con un blocco di intestazione contenente il numero d'ordine del brano, su 16 bit, e il numero di blocchi audio costituenti il brano, su 16 bit. Il blocco di intestazione è seguito dalla sequenza dei blocchi audio. Ogni blocco audio è formato da: (a) il numero d'ordine del blocco su 16 bit, a partire da zero; (b) il numero di campioni, su 16 bit; (c) i campioni, su 16 bit, corrispondenti a 1/75 di secondo, con una frequenza di campionamento di 44100 Hz.

1.1.2 Lettore

Il lettore comprende le parti optoelettroniche e meccaniche, e in particolare il motore e il cassetto portadisco, che permette l'inserimento e l'espulsione del disco ottico.

Il lettore ha una memoria interna (buffer) contenente un certo numero di blocchi audio letti dal disco ottico.

L'interfaccia del drive verso il microprocessore è costituita da un registro (TNUM) di 16 bit in lettura, che contiene il numero del brano corrente, un registro (SNUM) in lettura, che contiene il numero d'ordine del blocco, un registro (SMPL) di 16 bit in lettura, che contiene il prossimo campione da riprodurre, un registro (MODE) di 8 bit in lettura, che índica se la riproduzione di un brano non è ancora iniziata (0), è in corso (1), è interrotta (2), o è terminata (3), e da un un registro (CMD) di 8 bit in scrittura, che riceve dal microprocessore comandi di posizionamento sul brano successivo o sul precedente, di riproduzione, di pausa o di arresto della riproduzione, e di espulsione del disco.

Ogni lettura del registro SMPL ne causa l'aggiornamento.

1.1.3 Altoparlante

L'interfaccia dell'altoparlante verso il microprocessore è costituita da un registro (SPKR) di 16 bit. Ogni operazione di scrittura sul registro causa la generazione del segnale analogico corrispondente.

Il segnale analogico mantiene il valore impostato dall'ultima operazione di scrittura, fino all'operazione successiva.

Il registro è inizializzato automaticamente a zero.

1.1.4 Tastiera

La tastiera assegna un codice a ciascun tasto: Play (1), Pause (2), Stop (3), Next (4), Previous (5), Eject (6).

Quando viene premuto un tasto, il codice corrispondente viene inserito in una coda accessibile attraverso un registro (KBD).

1.1.5 Memorie

Si suppone che la memoria RAM abbia una dimensione sufficiente per il sistema operativo e per il codice e i dati dell'applicazione.

1.1.6 Timer

Il dispositivo ha un timer/contatore che genera un numero programmabile di interruzioni, a intervalli di durata programmabile.

1.2 Software di sistema

Si suppone che il dispositivo sia controllato da un sistema operativo monoprogrammato accessibile attraverso l'interfaccia di programmazione descritta di seguito. L'interfaccia è disponibile in C++ e in Java.

Gli ambienti di sviluppo (v. oltre) permettono di integrare il codice applicativo col sistema operativo.

All'accensione del dispositivo il controllo passa all'applicazione.

1.2.1 Classe Reader

init(): void
Posiziona il lettore sul primo brano, i cui blocchi iniziali vengono letti nel buffer. Il primo campione del brano viene registrato nel registro SMPL.

next(): void
Posiziona il lettore sul brano successivo, i cui blocchi iniziali vengono letti nel buffer. Il primo campione del brano viene registrato nel registro SMPL.

Se il lettore è posizionato sull'ultimo brano, si posiziona sul primo.

prev(): void
Posiziona il lettore sul brano precedente, i cui blocchi iniziali vengono letti nel buffer. Il primo campione del brano viene registrato nel registro SMPL.

Se il lettore è posizionato sul primo brano, si posiziona sull'ultimo.

get_tnum(): unsigned short
Preleva il valore attuale del registro TNUM e ne restituisce il valore.

get_snum(): unsigned short
Preleva il valore attuale del registro SNUM e ne restituisce il valore.

get_smpl(): unsigned short
Preleva il valore attuale del registro SMPL e ne restituisce il valore.

get_mode(): unsigned short
Preleva il valore attuale del registro MODE e ne restituisce il valore.

eject(): void
Se il cassetto portadischi è chiuso e il motore del drive è fermo, apre il cassetto portadischi.

Se il cassetto portadischi è chiuso e il motore del drive è in movimento, arresta il motore e poi apre il cassetto portadischi.

Se il cassetto portadischi è aperto, chiude il cassetto portadischi.

1.2.2 Classe Speaker

put(in val: unsigned short)
Scrive nel registro dell'altoparlante il valore digitale val del campione, che viene convertito in analogico.

1.2.3 Classe Keyboard

get(): int
Estrae dalla coda il primo codice e lo restituisce al chiamante. Restituisce zero se la coda è vuota.

1.2.4 Classe Timer

set(in n: unsigned, in period: unsigned)
Inizializza il timer impostando il numero n di interruzioni che devono essere generate, a intervalli di period microsecondi.

Dopo l'ultima interruzione, il timer si arresta e torna allo stato non inizializzato.

start()
Avvia il timer. Non ha effetto se il timer non è inizializzato, o è già stato avviato.

stop()
Arresta il timer, riportandolo allo stato non inizializzato. Non ha effetto se il timer non è inizializzato, o non è stato ancora avviato.

{abstract} on_tick()
Questa operazione deve essere implementata nel codice applicativo (in una classe derivata), e viene invocata ad ogni interruzione del timer.

1.3 Ambienti di sviluppo

L'interfaccia di programmazione sú esposta è disponibile sotto forma di librerie in C++ e in Java. In queste librerie è definito un package (o namespace) uOS (micro Operating System) contenente una classe per ciascuna sottosezione della sezione precedente (Reader, Speaker. . . ).

Gli ambienti di programmazione (C++ e Java) girano su un PC e permettono di caricare il software completo (applicazione e libreria di sistema) sul dispositivo.

2 Requisiti

2.1 Inserimento del disco

L'utente preme il tasto Eject, inserisce il disco e preme il tasto Eject per richiudere il cassetto portadisco.

2.2 Estrazione del disco

L'utente preme il tasto Eject, estrae il disco e preme il tasto Eject per richiudere il cassetto portadisco.

2.3 Selezione e riproduzione di un brano

Subito dopo che il disco è stato inserito, l'utente può iniziare la riproduzione del primo brano del disco premendo il tasto Play.

Premendo i tasti Next e Prev, l'utente può selezionare in sequenza i brani del disco.

Appena il lettore si posiziona su un brano, inizia la riproduzione. La riproduzione di un brano prosegue finché non si verifica una delle seguenti condizioni: (a) il brano è terminato; (b) l'utente preme il tasto Stop; (c) l'utente preme il tasto Pause; (d) l'utente preme uno dei tasti Next o Prev; (e) l'utente preme il tasto Eject. Se nessun tasto viene premuto entro mezzo secondo dalla fine del brano e questo non e` l'ultimo, inizia la riproduzione del brano successivo. Dopo l'ultimo brano, la riproduzione si interrompe finché l'utente non preme un tasto.

2.4 Interruzione di un brano

Se l'utente preme il tasto Pause durante la riproduzione di un brano, la riproduzione si interrompe.

Se l'utente, dopo aver premuto il tasto Pause e senza aver premuto altri tasti, preme il tasto Play, la riproduzione riprende dal punto in cui era stata interrotta.

Se l'utente, dopo aver premuto il tasto Pause e senza aver premuto altri tasti, preme il tasto Stop, la riproduzione termina.

Il tasto Pause non ha effetto se viene premuto mentre non viene riprodotto alcun brano.

2.5 Terminazione di un brano

Un brano è terminato quando è stato riprodotto il suo ultimo campione, quando l'utente ha premuto il tasto Stop o il tasto Eject durante la riproduzione o durante una pausa.

Il tasto Stop non ha effetto quando nessun brano viene riprodotto o è stato interrotto.

Quando la riproduzione di un brano è terminata, senza che sia stato premuto il tasto Eject, premendo il tasto Play riprende dall'inizio del brano, premendo uno dei tasti Next o Previous riprende dall'inizio del brano successivo o, rispettivamente, precedente.

3 Requisiti temporali

Si ignorino i requisiti temporali, supponendo che il microprocessore sia abbastanza veloce da eseguire tutte le operazioni richieste nell'intervallo fra un campione audio e l'altro.