Innholdsfortegnelse for en lyd-CD

Den TOC , eller innholdsfortegnelse er navnet på et dataområde som ligger ved begynnelsen av hver Audio CD . TOC inneholder listen over spor på CDen . Hvis CD-en er multi-økt, har hver økt en innholdsfortegnelse. En økt består av innledningen , programområdet og utledningen (som må inneholde minst 90 sekunders stillhet).

Innholdsfortegnelsen av en lyd-CD spiller samme rolle som root katalogen av en vanlig harddisk. Forskjellene er som følger:

En TOC er dimensjonert slik at den inneholder antall og posisjon på 100 spor. Fysisk er OCD plassert i innledningen , derfor i begynnelsen av CDen (diameter 23 mm til diameter 25 mm). Sporene må nummereres trinnvis, men det er ingen forpliktelse til å starte på spor 1. Såfremt det gjelder en 2-CD-boks, hvis den første inneholder 10 spor, er det mulig å starte nummereringen av den andre CDen fra 11 For å være sikker på at du er kompatibel med alle aktører på markedet, anbefales det imidlertid å starte fra 1.

Strukturen til innholdsfortegnelsen samt grensen for antall områder er definert av den røde boken .

Strukturen til innholdsfortegnelsen

Innholdsfortegnelsen består av to typer informasjon:

TOC inneholder informasjon om 100 spor: de 99 musikksporene som er autorisert på en lyd- CD , og lead-out .

Når du implementerer de to strukturene som er beskrevet nedenfor i programvare, skal ikke kompilatoren legge til en polstringsbyte for å justere feltene. Med GCC må du bruke alternativet PAKKET.

Informasjonsstruktur på en strand

Denne 8-byte strukturen er kjent som TOCTRACK .

Innholdet i Addr kan være i MSF-format eller i LBA-format:

Den gitte kildekoden viser hvordan du aktiverer MSF-modus.

Strukturen til innholdsfortegnelsen

Denne strukturen med størrelse 804 byte ((8 * 100) +4) er kjent som TOC.

Hvordan lese OCD?

GNU / Linux

Under Linux kan du enkelt lese de første sektorene på CD-en med dd- verktøyet , og du må da tolke rådataene som er lest på disken selv. En enklere metode er å bruke cdrdao , med read-toc- alternativet , for å direkte hente informasjonen i det klare.

Windows

Under Windows har vi ikke direkte tilgang til innholdet på CDen, så vi har ikke tilgang til innholdsfortegnelsen. For å få fysisk tilgang til CD- sektorene, må det brukes et programvaregrensesnittlag som lar SCSI- kommandoer sendes til leseren eller forfatteren. Man kan for eksempel bruke ASPI , fra firmaet Adaptec, se eksemplet nedenfor. Dokumentasjonen som følger med ASPI-biblioteket lister opp inkluderer å legge til, samt for defineringene som avhenger av kompilatoren ( 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.

En annen løsning er å bruke CDA- filene som leveres av Windows når du setter inn CDen . Problemet med denne løsningen er at den ikke gir posisjonen til lead-out , og derfor ikke tillater å beregne DiscId .