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.
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.
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.
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).
Si suppone che la memoria RAM abbia una dimensione sufficiente per il sistema operativo e per il codice e i dati dell'applicazione.
Il dispositivo ha un timer/contatore che genera un numero programmabile di interruzioni, a intervalli di durata programmabile.
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.
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.
put(in val: unsigned short)
Scrive nel registro dell'altoparlante il valore digitale val del campione, che
viene convertito in analogico.
get(): int
Estrae dalla coda il primo codice e lo restituisce al chiamante. Restituisce
zero se la coda è vuota.
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.
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.
L'utente preme il tasto Eject, inserisce il disco e preme il tasto Eject per richiudere il cassetto portadisco.
L'utente preme il tasto Eject, estrae il disco e preme il tasto Eject per richiudere il cassetto portadisco.
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.
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.
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.
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.