Home | Kontakt | Sitemap

Start

Über mich

Kontakt

Sitemap

Lizenz

Anleitungen

DVD, miniDVD

SVCD

Audio, Audio-CD (CD-DA)

AVI

Software

Von Freunden und Bekannten

Eigene Programme

Programmierung

Delphi

Lazarus

Delphi/Lazarus

Projekte

MPEG-1/2 Video

Optische Laufwerke

Audio-CD (CDDA)

Raspberry Pi Dashcam

Verschiedenes

MPEG 2 Schnitt

Project X

VCD Easy

Hardlinks

Windows

Links

Software

Projekte | Optische Laufwerke - MedienInformationen - TOC (MMC)

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:

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

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:

 76543210
0TOC Data Length
1
2First Track Number
3Last Track Number
 TOC Track Descriptor(s)
0Reserviert
1ADRCONTROL
2Track Number
3Reserviert
4Track 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.

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

CONTROL: Gibt die Attribute des Tracks an.

00x0bZwei Audiokanäle ohne Preemphasis
00x1bZwei AudioKanäle mit Preemphasis 50/15
10x0bAudiokanäle ohne Preemphasis (Reserviert für CD-R/RW)
10x1bAudiokanäle mit Preemphasis 50/15 (reserviert für CD-R/RW)
01x0bDatentrack, ununterbrochen aufgezeichnet
01x1bDatentrack, schrittweise aufgenommen
Reserviert
xx0xbDigital kopiergeschützt
xx1xbDigital 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.

Standard Disc Information > Table of Contents (MMC) > Table of Contents (RAW)