Tabella dei contenuti per un CD audio

Il TOC , o Table of Content, è il nome di un'area dati situata all'inizio di ogni CD audio. Il sommario contiene l'elenco delle tracce sul CD . Se il CD è multisessione, ogni sessione ha un sommario. Una sessione è composta dal lead-in , dall'area del programma e dal lead-out (che deve contenere almeno 90 secondi di silenzio).

Il sommario di un CD audio ha lo stesso ruolo della directory principale di un disco rigido convenzionale. Le differenze sono le seguenti:

Un sommario è dimensionato per contenere il numero e la posizione di 100 tracce. Fisicamente OCD si trova nella lead-in , quindi all'inizio del CD (diametro 23 millimetri di diametro 25 mm). Le tracce devono essere numerate in modo incrementale, ma non è obbligatorio iniziare dalla traccia 1. Pertanto, nel caso di un cofanetto da 2 CD, se la prima contiene 10 tracce, è possibile iniziare a numerare il secondo CD da 11. Per essere sicuri di essere compatibile con tutti i lettori sul mercato, tuttavia, si consiglia di iniziare da 1.

La struttura del TOC e il limite al numero di intervalli sono definiti dal Libro rosso .

Struttura del TOC

Il sommario si compone di due tipi di informazioni:

Il sommario contiene informazioni su 100 tracce: le 99 tracce musicali autorizzate su un CD audio e il lead-out .

Quando si implementano le due strutture descritte di seguito nel software, il compilatore non deve aggiungere un byte di riempimento per allineare i campi. Con GCC è necessario utilizzare l'opzione PACKED.

Struttura informativa su una spiaggia

Questa struttura a 8 byte è nota come TOCTRACK .

Il contenuto di Addr può essere in formato MSF o in formato LBA:

Il codice sorgente fornito mostra come attivare la modalità MSF.

Struttura del TOC

Questa struttura, che ha una dimensione di 804 byte ((8 * 100) +4), è nota come TOC.

Come leggere il DOC?

GNU / Linux

Sotto Linux puoi leggere facilmente i primi settori del CD con l'utility dd , devi quindi interpretare tu stesso i dati grezzi letti sul disco. Un metodo più semplice è usare cdrdao , con l'opzione read-toc , per recuperare direttamente le informazioni in chiaro.

finestre

In Windows non possiamo accedere direttamente ai contenuti del CD, quindi non abbiamo accesso al sommario. Per accedere fisicamente ai settori del CD , è necessario utilizzare un livello di interfaccia software che consenta di inviare i comandi SCSI al lettore o al scrittore. Si può ad esempio utilizzare ASPI , della società Adaptec, vedere l'esempio sotto. La documentazione fornita con la libreria ASPI elenca gli include da aggiungere, così come i definisce che dipendono dal compilatore ( Borland C ++ Builder , Microsoft Visual C ++ , GCC ).

TOC toc; // définir une structure en fonction des informations données plus haut SRB_ExecSCSICmd SRBexec; DWORD dwASPIStatus; HANDLE hEvent; memset(&SRBexec, 0, sizeof(SRB_ExecSCSICmd)); hEventSRB = CreateEvent(NULL, TRUE, FALSE, NULL); if (!heventSRB) { // ERREUR : sortir } SRBexec.SRB_Cmd = SC_EXEC_SCSI_CMD; SRBexec.SRB_HaID = haId; // numéro de l'interface SRBexec.SRB_Target = id; // identifiant du périphérique SRBexec.SRB_Lun = lun; // unité logique SRBexec.SRB_Flags = SRB_DIR_IN; // sens du transfert SRBexec.SRB_BufLen = sizeof(TOC); // taille des données à transférer (la TOC) SRBexec.SRB_BufPointer = &toc; SRBexec.SRB_SenseLen = 0x0e; SRBexec.SRB_CDBLen = 0x0A; SRBexec.SRB_CDBByte[0] = 0x43; // numéro de la commande "read TOC" SRBexec.SRB_CDBByte[1] = 0x02; // pour le format du champ Addr (mode MSF = Minute/Second/Frame) SRBexec.SRB_CDBByte[7] = 0x03; // poids-fort de la taille du buffer (804=0x324) SRBexec.SRB_CDBByte[8] = 0x24; // poids-faible de la taille du buffer (804=0x324) SRBexec.SRB_PostProc = hEventSRB; // on bloque sur cet objet, pour attendre la fin de la commande ResetEvent(hEventSRB); // reset l'événement avant de l'utiliser dwASPIStatus = SendASPI32Command((LPSRB)&srbExec); if (dwASPIStatus == SS_PENDING) // commande acceptée, en cours d'exécution { WaitForSingleObject(heventSRB, 15000); // attendre au maximum 15 secondes } else { // ERREUR CloseHandle(hEventSRB); // libérer la ressource avant de sortir // sortir } CloseHandle(hEventSRB); // libérer la ressource avant de sortir if (srbExec.SRB_Status != SS_COMP) { // ERREUR pendant l'exécution, sortir } // commande terminée sans erreur, la TOC est dans la structure toc.

Un'altra soluzione è utilizzare i file CDA forniti da Windows durante l'inserimento del CD . Il problema con questa soluzione è che non fornisce la posizione del lead-out e quindi non consente il calcolo del DiscId .