Projekte > Optische Laufwerke > Medieninformationen

Table of Contents (MMC)

READ TOC/PMA/ATIP Command - Operation Code $43

Die Table of Content (TOC) ist das Inhaltsverzeichnis. Es gibt die auf dem Datenträger vorhandenen Tracks an. Das READ TOC/PMA/ATIP Command wird in der MMC-6 in den Kapitel 6.25 ff beschrieben. Mit ihm erhält man durch Auswahl des Response Data Type (Antwortdatentyp) wahlweise eine formatierte oder unformatierte TOC, den PMA sowie den ATIP. Das Command ist mit verschiedenen Features (siehe Feature List) verbunden. Ist keines der Feature vorhanden wird das Command nicht unterstützt. Die formatierte TOC ist mit den Feature CD READ, DVD READ, HD DVD READ (in MMC-6 entfallen) und CD AUDIO EXTERNAL PLAY verbunden. Der READ TOC/PMA/ATIP Command Descriptor Block ist in Kapitel 6.25.2.1 dargestellt:

  7 6 5 4 3 2 1 0
0 Operation Code ($43)
1 Reserviert MSF (1b) Reserviert
2 Reserviert Response Format (0000b)
3 Reserviert
4
5
6 Track/Session Number ($00)
7 Allocation Length
8
9 Control

 

Zu setzende Werte:

Operation Code: $43 - READ TOC/PMA/ATIP Command.

MSF: 1b - Die Adressen sollen in MSF (Minuten:Sekunden:Frames) angegeben werden. Das Bit muss nicht gesetzt werden. Seine Angabe wird vom Laufwerk ignoriert da das gewählte Format als gesetzt definiert ist.

Response Format: 0000b Formatted TOC - Die Antwort soll eine formatierte TOC enthalten.

Track/Session Number: $00 - Die Daten werden beginnend ab der angegebenen Tracknummer zurückgegeben.

Allocation Length: $F03F - Die Länge der Antwortstruktur. Das Response Format hat für CDs keine feste Länge. Die Felder für die Längenangaben sind jeweils zwei Byte lang, so dass das Maximum $FFFF beträgt. Werte über $F03F (61503) führten jedoch zu Fehlern. Für DVDs und BDs ist die Länge $14.

Control - ?

 

Antwortstruktur

Die Beschreibung des Antwortformates ist in der MMC-6 in Kapitel 6.25.3.2.1 enthalten:

  7 6 5 4 3 2 1 0
0 TOC Data Length
1
2 First Track Number
3 Last Track Number
  TOC Track Descriptor(s)
0 Reserviert
1 ADR CONTROL
2 Track Number
3 Reserviert
4 Track Start Address
5
6
7

 
TOC Data Length
Gibt in Bytes an, wie lang die folgende Datenstruktur ist.

Für CD

First Track Number: Gibt den ersten Track in der ersten vollständigen Session TOC an.

Last Track Number: Gibt den letzten Track in der letzten vollständigen Session TOC vor dem Lead-Out an.

ADR: Gibt den Typ der Information an.

$0 - Q Sub-channel mode Informationen werden nicht unterstützt
$1 - Q Sub-channel Daten enthalten die gegenwärtige Position
$2 - Q Sub-channel enthält die Mediakatalognummer (MCN)
$3 - Q Sub-channel enthält die International Standard Recording Code (ISRC)
$4..$F - Reserviert

CONTROL: Gibt die Attribute des Tracks an.

00x0b - Zwei Audiokanäle ohne Preemphasis
00x1b - Zwei AudioKanäle mit Preemphasis 50/15
10x0b - Audiokanäle ohne Preemphasis (Reserviert für CD-R/RW)
10x1b - Audiokanäle mit Preemphasis 50/15 (reserviert für CD-R/RW)
01x0b - Datentrack, ununterbrochen aufgezeichnet
01x1b - Datentrack, schrittweise aufgenommen
11xxb - Reserviert
xx0xb - Digital kopiergeschützt
xx1xb - Digital kopieren erlaubt

Track Number: Gibt die Nummber des Tracks an, für welchen die Informationen gelten. Die Tracknummer $AA (170) gibt den Start des Lead-Out an.

Für DVD-ROM, _RAM, Single Session DVD-R/-RW und Single Session DVD+R:

Eine Session enthält nur einen Track. Die TOC enthält dem entsprechend nur zwei Beschreibungen, welche den Anfang und das Ende des Tracks respektive der Session angibt.

Für DVD-R/-RW mit mehreren Sessions:

DVD-R/-RW können mehrere Session besitzen. Da die Anzahl sehr hoch sein kann, werden nur zwei als Tracks dargestellt. Die letzte Session wird als letzter (zweiter) Track darfgestellt. Die älteren Session werden in einem Track zusammengefasst.

Für DVD+R mit mehreren Sessions:

Eine DVD+R kann bis zu 154 Sessions besitzen. Jede Session wird als Track dargestellt.

 

Deklarationen

 
  {
  *  Für die Auswertung.
  }
 
  type
    TMSF = Array[0..3] of Byte;

  type
    TTOCTrackDescriptor = record
      ADR               : Byte;
      CONTROL           : Byte;
      TrackNumber       : Byte;
      TrackStartAddress : TMSF;
    end;

  type
    TTOC = record
      DataLength       : Word;
      FirstTrackNumber : Byte;
      LastTrackNumber  : Byte;
      TrackDescriptor  : Array of TTOCTrackDescriptor;
    end;
 
  {
  *  Für den Befehl.
  }
 
  const
    RespFmtTOC    = $00;
    RespFmtMSI    = $01;
    RespFmtRawTOC = $02;
    RespFmtPMA    = $03;
    RespFmtATIP   = $04;
    RespFmtCDTEXT = $05;
 
  const
    SCSIOP_READ_TOC_PMA_ATIP = $43;
 
  type
    TREAD_TOC_PMA_ATIP_CDB = record
      OperationCode      : Byte;
      MSF                : Byte;
      Format             : Byte;
      TrackSessionNumber : Byte;
      AllocationLength   : Word;
      Control            : Byte;
    end;
 
  type
    TREAD_TOC_DATA = record
      General : Array[$00..$03] of byte;
      Data    : Array[$0000..$EFFF] of Byte;
    end;
 
          

 

Ausführung und Auswertung

Nach dem Ausfüllen des Command Descriptors Blockes wird die Abfrage ausgeführt und die Antwort ausgewertet.

 
  function TOptDrives.ReadTOCFormatted(aDevice: THandle): Boolean;
  {*******************************************************************************
  *  Die formatierte Table of Contents ermitteln.
  }
  var
    READ_TOC_PMA_ATIP_CDB  : TREAD_TOC_PMA_ATIP_CDB;
    pReadTOCData           : PREAD_TOC_PMA_ATIP_DATA;
    aCDB                   : Array[0..9] of Byte;
    nDescCount             : Integer;
    i                      : Integer;
  begin
    Result := False;
    {
    *  TOC initialisieren.
    }
    FillChar(FDrive[FActive].TableOfContents,
             SizeOf(FDrive[FActive].TableOfContents), $00);
    {
    *  Den Command Descriptor Block füllen.
    }
    ZeroMemory(@READ_TOC_PMA_ATIP_CDB, SizeOf(READ_TOC_PMA_ATIP_CDB));
    READ_TOC_PMA_ATIP_CDB.OperationCode    := SCSIOP_READ_TOC_PMA_ATIP;
    READ_TOC_PMA_ATIP_CDB.MSF              := 1;
    READ_TOC_PMA_ATIP_CDB.Format           := RF_TOC;
    READ_TOC_PMA_ATIP_CDB.AllocationLength := SizeOf(TREAD_TOC_PMA_ATIP_DATA);
    {
    *  Den Command Descriptor Block übertragen.
    }
    ZeroMemory(@aCDB, SizeOf(aCDB));
    aCDB[0] := READ_TOC_PMA_ATIP_CDB.OperationCode;
    aCDB[1] := READ_TOC_PMA_ATIP_CDB.MSF and $01 shl 1;
    aCDB[2] := READ_TOC_PMA_ATIP_CDB.Format and $0F;
    aCDB[7] := HiByte(READ_TOC_PMA_ATIP_CDB.AllocationLength);
    aCDB[8] := LoByte(READ_TOC_PMA_ATIP_CDB.AllocationLength);
    {
    *  Befehl ausführen.
    }
    GetMem(pReadTOCData, SizeOf(TREAD_TOC_PMA_ATIP_DATA));
    Result := GET_SCSI_PASS_THROUGH_DIRECT(aDevice, aCDB, pReadTOCData,
                                           SizeOf(TREAD_TOC_PMA_ATIP_DATA));
    if Result then
    with FDrive[FActive].TableOfContents
    do begin
      DataLength := pReadTOCData.General[0] shl 8 or pReadTOCData.General[1];
      {
      *  Prüfen, ob Daten folgen.
      }
      if DataLength >= 0
      then begin
        {
        *  General
        }
        FirstTrackNumber := pReadTOCData.General[2];
        LastTrackNumber  := pReadTOCData.General[3];
        {
        *  Wenn Tracks angegeben sind.
        }
        if DataLength > 2
        then begin
          nDescCount := DataLength - 2) div 8;
          SetLength(TrackDescriptor, nDescCount);
          for i := 0 to nDescCount - 1 do
          with TrackDescriptor[i]
          do begin
            ADR                  := pReadTOCData.Data[(i * 8) + 1] and $F0 shr 4;
            CONTROL              := pReadTOCData.Data[(i * 8) + 1] and $0F;
            TrackNumber          := pReadTOCData.Data[(i * 8) + 2];
            TrackStartAddress[0] := pReadTOCData.Data[(i * 8) + 4];
            TrackStartAddress[1] := pReadTOCData.Data[(i * 8) + 5];
            TrackStartAddress[2] := pReadTOCData.Data[(i * 8) + 6];
            TrackStartAddress[3] := pReadTOCData.Data[(i * 8) + 7];
          end;
        end;
      end;
    end;
  end;
          

 

Hinweis: Die with do Anweisung ist nur zur Verkürzung des Quelltextes eingefügt worden. In der Demo ist sie nicht vorhanden.

Demo, welche diese Funktion nutzt:

Table of Contents (MMC) (podTableOfContentsMMC.7z - 269 kb) MD5 (1 kb). Stand: 18. Juli 2013

Änderungen an der Demo

Datum Beschreibung
18.07.2013Kleine Überarbeitung und neuer Name.
26.02.2012Aktualisiert: Groupbox "Optische Laufwerke".

Alternative Demo. Die Ausgabe entspricht dem Schema oben.

Table of Contents (MMC) alternativ (podTableOfContentsMMCalt.7z - 328 kb) MD5 (1 kb). Stand: 18. Juli 2013

Änderungen an der Demo

Datum Beschreibung
17.07.2013Kleine Überarbeitung und neuer Name.