1 - Amiga Magazine Online

1 - Amiga Magazine Online 1 - Amiga Magazine Online

amigamagazine.info
from amigamagazine.info More from this publisher
12.06.2013 Views

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

strata dovreste aver notato due cose: innanzitutto che la funzione CreateIoRequest( ) richiede due parametri, e cioè un puntatore alla porta messaggi precedentemente allocata (mp) e le dimensioni della struttura IO da alloca- re (nel nostro caso IOStdReq); e poi che, per motivi di chiarezza, non abbiamo controllato nessuna condizione di errore. È owio che tutte e tre le funzioni utilizzate, in certe condizioni particolari (mancanza di memoria, assen- za fisica del cd.device, ecc.) potrebbero non poter assol- vere al loro compito; in questo caso segnalerebbero il lo- ro problema per mezzo del valore di ritorno, che deve essere interpretato correttamente. Fate riferimento agli Autodoc dell1Exec per ulteriori informazioni su questo ar- gomento. Al termine dell'esecuzione del nostro ipotetico program- ma, sarà necessario deallocare le strutture e chiudere il device che abbiamo utilizzato. Questo compito può esse- re svolto in maniera semplice dalla funzione Chiudi( ): void Chiudi (void) { /* Chiudiamo il device */ CloseDevice((struct IORequest *)io); /* Deallochiamo la struttura IOStdReq */ DeleteIORequest((struct IORequest *)io); /* Deallochiamo la porta messaggi */ DeleteMsgPort(mp); } È molto importante che queste operazioni siano svolte nella sequenza giusta. Mai, per esempio, deallocare la porta messaggi se prima non si è chiuso il dispositivo e deallocata la struttura IOStdReq. Per questa volta ci fer- miamo qui, la prossima volta vediamo come usare le fun- zioni sincrone e asincrone e qualche esempio concreto. Bibliografza: Amiga Rom Kernel Reference Manual - Devices: Intro- duction to Amiga System Devices, Chapter 1. Amiga Rom Kernel Reference Manual - Libraries: Exec Device I/O, Chapter 19. A

strata dovreste aver notato due cose: innanzitutto che la<br />

funzione CreateIoRequest( ) richiede due parametri, e<br />

cioè un puntatore alla porta messaggi precedentemente<br />

allocata (mp) e le dimensioni della struttura IO da alloca-<br />

re (nel nostro caso IOStdReq); e poi che, per motivi di<br />

chiarezza, non abbiamo controllato nessuna condizione<br />

di errore. È owio che tutte e tre le funzioni utilizzate, in<br />

certe condizioni particolari (mancanza di memoria, assen-<br />

za fisica del cd.device, ecc.) potrebbero non poter assol-<br />

vere al loro compito; in questo caso segnalerebbero il lo-<br />

ro problema per mezzo del valore di ritorno, che deve<br />

essere interpretato correttamente. Fate riferimento agli<br />

Autodoc dell1Exec per ulteriori informazioni su questo ar-<br />

gomento.<br />

Al termine dell'esecuzione del nostro ipotetico program-<br />

ma, sarà necessario deallocare le strutture e chiudere il<br />

device che abbiamo utilizzato. Questo compito può esse-<br />

re svolto in maniera semplice dalla funzione Chiudi( ):<br />

void Chiudi (void)<br />

{<br />

/* Chiudiamo il device */<br />

CloseDevice((struct IORequest *)io);<br />

/* Deallochiamo la struttura IOStdReq */<br />

DeleteIORequest((struct IORequest *)io);<br />

/* Deallochiamo la porta messaggi */<br />

DeleteMsgPort(mp);<br />

}<br />

È molto importante che queste operazioni siano svolte<br />

nella sequenza giusta. Mai, per esempio, deallocare la<br />

porta messaggi se prima non si è chiuso il dispositivo e<br />

deallocata la struttura IOStdReq. Per questa volta ci fer-<br />

miamo qui, la prossima volta vediamo come usare le fun-<br />

zioni sincrone e asincrone e qualche esempio concreto.<br />

Bibliografza:<br />

<strong>Amiga</strong> Rom Kernel Reference Manual - Devices: Intro-<br />

duction to <strong>Amiga</strong> System Devices, Chapter 1.<br />

<strong>Amiga</strong> Rom Kernel Reference Manual - Libraries: Exec<br />

Device I/O, Chapter 19. A

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

Saved successfully!

Ooh no, something went wrong!