Tabla de contenido de un CD de audio

El TOC o Tabla de contenido es el nombre de un área de datos ubicada al comienzo de cada CD de audio. El TOC contiene la lista de pistas del CD . Si el CD es multisesión, cada sesión tiene un TOC. Una sesión se compone de la entrada , el área del programa y la salida (que debe contener al menos 90 segundos de silencio).

El TOC de un CD de audio juega el mismo papel que el directorio raíz de un disco duro convencional. Las diferencias son las siguientes:

Un TOC está dimensionado para contener el número y la posición de 100 pistas. Físicamente, el TOC se encuentra en la entrada , por lo tanto, al comienzo del CD (diámetro de 23 mm a diámetro de 25 mm). Las pistas deben numerarse de forma incremental, pero no hay obligación de empezar en la pista 1. Por lo tanto, en el caso de una caja de 2 CD, si la primera contiene 10 pistas, es posible comenzar a numerar el segundo CD desde 11. Sin embargo, para asegurarse de que sea compatible con todos los reproductores del mercado, se recomienda comenzar en 1.

La estructura del TOC, así como el límite en el número de rangos, están definidos por el Libro Rojo .

Estructura del TOC

El TOC se compone de dos tipos de información:

El TOC contiene información sobre 100 pistas: las 99 pistas musicales autorizadas en un CD de audio y la salida .

Al implementar las dos estructuras descritas a continuación en el software, el compilador no debe agregar un byte de relleno para alinear los campos. Con GCC debes usar la opción PACKED.

Estructura de información en una playa

Esta estructura de 8 bytes se conoce como TOCTRACK .

El contenido de Addr puede estar en formato MSF o en formato LBA:

El código fuente proporcionado muestra cómo activar el modo MSF.

Estructura del TOC

Esta estructura de tamaño 804 bytes ((8 * 100) +4) se conoce como TOC.

¿Cómo leer el TOC?

GNU / Linux

Bajo Linux, puede leer fácilmente los primeros sectores del CD con la utilidad dd , luego debe interpretar los datos brutos leídos en el disco usted mismo. Un método más simple es usar cdrdao , con la opción read-toc , para recuperar directamente la información en claro.

Ventanas

En Windows no podemos acceder directamente al contenido del CD, por lo que no tenemos acceso al TOC. Para acceder físicamente a los sectores del CD es necesario utilizar una capa de interfaz de software que permita el envío de comandos SCSI al lector o grabador. Por ejemplo, se puede utilizar ASPI , de la empresa Adaptec, ver el ejemplo a continuación. La documentación suministrada con la biblioteca ASPI enumera las inclusiones para agregar, así como las definiciones que dependen del compilador ( 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.

Otra solución es utilizar los archivos CDA proporcionados por Windows al insertar el CD . El problema con esta solución es que no da la posición del lead-out y, por lo tanto, no permite calcular el DiscId .