Cuprins pentru un CD audio

TOC sau Cuprins este numele unei zone de date situat la începutul fiecărui Audio CD . TOC conține lista pieselor de pe CD . Dacă CD-ul este multi-sesiune, fiecare sesiune are un TOC. O sesiune este alcătuită din lead-in , zona programului și lead-out (care trebuie să conțină cel puțin 90 de secunde de tăcere).

TOC-ul unui CD audio joacă același rol ca și directorul rădăcină al unui hard disk convențional. Diferențele sunt următoarele:

Un TOC este dimensionat pentru a conține numărul și poziția a 100 de piese. Din punct de vedere fizic, TOC este situat în plumb , de aceea la începutul CD-ului (diametru 23 mm până la diametru 25 mm). Piesele trebuie numerotate incremental, dar nu există nicio obligație de a începe la pista 1. Astfel, în cazul unei cutii cu 2 CD-uri, dacă prima conține 10 piese, este posibilă pornirea numerotării celui de-al doilea CD de la 11 Pentru a vă asigura că sunteți compatibil cu toți jucătorii de pe piață, totuși, se recomandă să începeți de la 1.

Structura TOC, precum și limita numărului de intervale sunt definite de Cartea Roșie .

Structura TOC

TOC este alcătuit din două tipuri de informații:

TOC conține informații despre 100 de piese: cele 99 de piese muzicale autorizate pe un CD audio și lead-out-ul .

La implementarea celor două structuri descrise mai jos în software, compilatorul nu ar trebui să adauge un octet de umplere pentru a alinia câmpurile. Cu GCC trebuie să utilizați opțiunea PACKED.

Structura informațională pe o plajă

Această structură de 8 octeți este cunoscută sub numele de TOCTRACK .

Conținutul Addr poate fi în format MSF sau în format LBA:

Codul sursă indicat arată cum se activează modul MSF.

Structura TOC

Această structură de mărime 804 octeți ((8 * 100) +4) este cunoscută sub numele de TOC.

Cum se citește TOC?

GNU / Linux

Sub Linux puteți citi cu ușurință primele sectoare ale CD-ului cu utilitarul dd , apoi trebuie să interpretați singuri datele brute citite pe disc. O metodă mai simplă este utilizarea cdrdao , cu opțiunea read-toc , pentru a prelua direct informațiile în clar.

Windows

În Windows nu putem accesa direct conținutul CD-ului, deci nu avem acces la TOC. Pentru a accesa fizic sectoarele CD , trebuie utilizat un strat de interfață software care să permită trimiterea de comenzi SCSI către cititor sau scriitor. De exemplu, se poate utiliza ASPI , de la compania Adaptec, a se vedea exemplul de mai jos. Documentația furnizată împreună cu biblioteca ASPI listează include de adăugat, precum și pentru definițiile care depind de compilator ( 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.

O altă soluție este utilizarea fișierelor CDA furnizate de Windows la introducerea CD - ului . Problema cu această soluție este că nu oferă poziția lead-out-ului și, prin urmare, nu permite calcularea discului .