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

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

17.07.2013Kleine Überarbeitung und neuer Name.