You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
tutti i CD-ROM esistenti, visto che la testina di lettura è<br />
una sola, e se essa è posizionata su una traccia audio,<br />
ovviamente non può spostarsi sulla zona dati. E invece<br />
certamente possibile caricare dei dati audio in formato<br />
<strong>Amiga</strong> (un sample 8SVX o un modulo Protracker) e<br />
ascoltarli durante l'accesso del CD alle tracce dati, oppu-<br />
re ascoltare delle tracce audio durante la decompressione<br />
dei dati appena caricati, a patto che siano compressi, e<br />
normalmente su un CD, data la vasta quantità di spazio<br />
disponibile, non ce n'è bisogno).<br />
I1 cd.device dispone di 25 comandi, che sono suddivisi in<br />
quattro classi principali:<br />
- gestione "fisica" del CD<br />
- accesso ai dati<br />
- accesso all'audio<br />
- generici<br />
Quasi tutti i comandi possono operare in modo asincro-<br />
no, in tal caso il loro compito è quello di impartire un<br />
"ordine" al lettore di CD, in modo che esso esegua il<br />
compito mentre il sistema rimane libero di effettuare altre<br />
operazioni. I1 caso più classico è CD-PLAYTRACK, che<br />
"comanda" al CD di farci ascoltare il numero desiderato<br />
di tracce audio, mentre <strong>Amiga</strong> può continuare a svolgere<br />
i propri compiti, come per esempio far funzionare un in-<br />
tero videogioco: la musica in arrivo dal CD, viene mixata<br />
dall'hardware di CD32 e CDTV con Iloutput dei quattro<br />
canali audio, e garantisce colonne sonore di altissima<br />
qualità, da CD Audio, senza alcun appesantimento sulle<br />
capacità di elaborazione della macchina.<br />
Cominciamo a programmare<br />
È venuto il momento di cominciare a operare con il<br />
cd.device. Inutile dire che sarà necessario sfruttare il lin-<br />
guaggio C. Tenete infine presente che per tutti gli esempi<br />
e le funzioni citate, ove necessario, presupponiamo che<br />
il programma sia progettato per "girare" su <strong>Amiga</strong> dotati<br />
di sistema operativo 2.0 o superiori.<br />
Al contrario di quanto generalmente non si creda, acce-<br />
dere a un device ("dispositivo" in Italiano) è estremamen-<br />
te semplice, a patto che tutto sia ben chiaro prima di ini-<br />
ziare a scrivere il codice vero e proprio. Per prima cosa è<br />
necessario creare una porta messaggi, destinata allo<br />
scambio di "comunicati" tra il nostro programma e il di-<br />
spositivo. Questa operazione può essere facilmente svol-<br />
ta tramite la funzione di Exec CreateMsgPort( ), presente<br />
a partire dalla versione 2.0 del sistema operativo, la quale<br />
alloca e inizializza una struttura MsgPort, definita nel file<br />
di include "exec/ports.h". Ovviamente al termine del pro-<br />
gramma bisognerà ricordarsi di deallocarla, per mezzo<br />
della funzione DeleteMsgPort( ).<br />
Per seconda cosa, sarà necessario allocare della memoria<br />
da destinare a una struttura particolare (IOStdReq) che<br />
viene utilizzata dai device per lo scambio di parametri<br />
con il programma. Anche in questo caso, per allocarla, ci<br />
conviene utilizzare una delle funzioni messe a nostra di-<br />
sposizione da Exec, e precisamente CreateIORequest( ),<br />
la quale oltre ad allocare la memoria richiesta, procederà<br />
al collegamento della porta messaggi indicata, che deve<br />
essere quindi già stata creata dal programma, con la<br />
struttura stessa. Come al solito, al termine del program-<br />
ma, bisognera ricordarsi di deallocare la struttura creata,<br />
per mezzo della funzione DeleteIORequest( ).<br />
La terza e ultima operazione da compiere, prima di poter<br />
inviare comandi al device, è quella di richiedere effettiva-<br />
mente la sua apertura e, quindi, la sua attenzione. Ciò si<br />
ottiene per mezzo della funzione Exec OpenDevice( ).<br />
Ad essa devono essere passati alcuni parametri: il nome<br />
del dispositivo (nel nostro caso "cd.devicel'), il numero<br />
dell'unità del dispositivo da aprire (nel nostro caso O), un<br />
puntatore alla struttura IOStdReq precedentemente allo-<br />
cata, ed eventuali flag per specificare opzioni particolari<br />
(il cd.device non ne prevede).<br />
Vediamo ora un esempio su come aprire un dispositivo<br />
per inviargli comandi:<br />
/* Innanzitutto definiamo quali<br />
file includere */<br />
/* Quindi definiamo i puntatori<br />
alle due strutture che dobbiamo<br />
utilizzare */<br />
struct IOStdReq *io;<br />
struct MsgPort *mP ;<br />
void Apri (void)<br />
{<br />
/* Allochiamo la porta messaggi */<br />
mp = CreateMsgPort();<br />
/* Allochiamo la struttura IOStdReq*/<br />
io = (struct IOStdReq *)<br />
CreateIORequest(mp,<br />
sizeof(struct IOStdReq));<br />
/* Apriamo effettivamente il device<br />
OpenDevice("cd.device", O,<br />
(struct IORequest*)io,<br />
OUL) ;<br />
}<br />
Leggendo attentamente la funzione Apri( ) appena mo-