12.06.2013 Views

1 - Amiga Magazine Online

1 - Amiga Magazine Online

1 - Amiga Magazine Online

SHOW MORE
SHOW LESS

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-

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!