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 - Track Informationen

Track Informationen

READ TRACK INFORMATION Command - Operation Code $52

Das READ TRACK INFORMATION Command stellt Informationen über einen logischen Track zur Verfügung. Logischer Track wird als allgemeiner Begriff verwendet, um auf logische Unterteilungen auf einem optischen Medium zu verweisen. Der logische Track bezieht sich auf Tracks auf CD-Medien, auf die Rzone auf DVD-R/-RW-Medien, auf Fragmente auf DVD+R-Medien und auf SRR auf BD-R- Medien. Wenn das gerade eingelegte Medium keine logische Track-Struktur besitzt, ist das gesamte Medium als ein einziger logischer Track anzusehen. Wenn das Medium keine Standardstruktur weil unformatiert besitzt, wird dieser Befehl mit CHECK CONDITION status und sense bytes SK/ASC/ASCQ beendet.

Das Command ist mit einer Reihe von Feature verbunden (siehe Feature List): $001D Multi-Read, $0021 Increment Streaming Writable, $0026 Restrited Overwerite, $0027 CD-RW CAV Write, $002B DVD+R Read, $002C Rigid Restricted Overwrite, $002D CD Track At Once, $002E CD Mastering, $002F DVD-R/RW Write, $0033 Layer Jump Recording und $003B DVD+R DL. Ist keines dieser Feature vorhanden wird das Command nicht unterstützt. Der Command Descriptor Block ist in MMC 6 Kapitel 6.26.2.1 dargestellt:

 76543210
0Operation Code = $52
1ReserviertOpenAddress /
Number Type
2Logical Block Address / Track / Session Number
3
4
5
6Reserviert
7Allocation Length
8
9Control

Zu setzende Werte:

Operation Code $52 - READ TRACK INFORMATION Command.

Open 0b - Wenn Open auf Null festgelegt ist, muss der adressierte logische Track dem Wert des Logical Block Address / Track / Session Number Feldes entsprechen. Wenn Open auf Eins festgelegt ist, wird der erste offene logische Track mit der logischen Titelnummer gesucht, die größer als oder gleich dem angegebenen logischen Track ist.

Address/Number Type 01b und Logical BlockAddress/Track/Session Number Tracknummer:

Address/
Number
Type
Logical Block
Address/Track/
Session Number
Beschreibung
00bLogical Block Address
(LBA)
MAX = letzte mögliche Lead-out Startadresse, wie vom READ DISC INFORMATON Command zurückgegeben. Wenn die LBA >= MAX ist wird der Befehl mit CHECK CONDITION status abgebrochen und die sense bytes SK/ASC/ASCQ werden auf ILLEGAL REQUEST/LOGICAL BLOCK ADDRESS OUT OF RANGE gesetzt. Andernfalls liegt die LBA in irgendeinem logischen Track TA auf der CD.
01bLogical Track Number
(LTN) = 0
Wenn die eingelegte Disk keine CD ist wird der Befehl mit CHECK CONDITION status abgebrochen und die sense bytes SK/ASC/ASCQ werden auf ILLEGAL REQUEST/INVALID FIELD IN CDB gesetzt. Anderenfalls erhält man die Lead-In Informationen zurück.
Logical Track Number
(LTN)
TM ist die letzte Track Nummer der letzten Session aus der READ DISC INFORMATION Command Standard Disc Information. Wenn LTN > TM ist wird der Befehl mit CHECK CONDITION status beendet und die sense bytes SK/ASC/ASCQ werden auf ILLEGAL REQUEST/INVALID FIELD IN CDB gesetzt. Anderfalls ist TA = LTN.
Logical Track Number
(LTN) = 255
Wenn die eingelegte Disk eine CD, DVD+R oder DVD+R DL ist wird TA auf die logische Tracknummer auf den unsichtbaren/unvollständigen Track gesetzt. Für DVD meint dieser Wert TA = 255.
10bSession Number
(SN)
SM ist die Anzahl der Sessions aus dem READ DISC INFORMATION Command. Wenn SN > SM ist wird der Befehl mit CHECK CONDITION status abgebrochen und die sense bytes SK/ASC/ASCQ auf ILLEGAL REQUEST/INVALID FIELD IN CDB gesetzt. Andernfalls ist TA gleich dem ersten logischen Track in der Session SN.
11bReserviert 

Allocation Length $30. Die Antwort ist maximal 48 Byte lang.

Control - ?

Antwortstruktur

 76543210
0Data Length
1
2Logical Track Number (Least Significant Byte)
3Session Number (Least Significant Byte)
4Reserviert
5LJRSDamageCopyTrack Mode
RTBlankPacket/IncFPData Mode
7ReserviertLRA_VNWA_V
8Logical Track Start Address
9
10
11
12Next Writable Address
13
14
15
16Free Blocks
17
19
20Fixed Packet Size / Blocking Factor
21
22
23
24Logical Track Size
25
26
27
28Last Recorded Address
29
30
31
32Logical Track Number (Most Significant Byte)
33Session Number (Most Significant Byte)
34Reserviert
35
36Read Compatibility LBA
37
38>
39
40Next Layer Jump Address
41
42
43
44Last Layer Jump Address
45
46
47

Data Length Länge der folgenden Struktur in Bytes.

Logical Track Number Die logische Tracknummer aufgeteilt in niedriges und hohes Byte.

Session Number Die Sessionnummer aufgeteilt in niedriges und hohes Byte.

LJRS Der Layer Jump Recording status definiert den gegenwärtigen Layer Jump Recording status für das eingelegte Medium:

00bNot Layer Jump Recording Mode
01bLayer Jump Mode: Unspezified
10bLayer Jump Mode: Manual
11bLayer Jump Mode: Regular interval recording

Ist der Wert ungleich Null, sind die Felder Next Layer Jump Address field und Last Layer Jump Address vorhanden. Das Flag Packet/Inc ist gesetzt und das Flag FP ist nicht gesetzt.

Damage Ist das Flag gesetzt und das Flag NWA_V nicht gilt der Track als wegen eines unvollständigen Schreibvorganges nicht abgeschlossen. Das Laufwerk kann eine automatische Reparatur versuchen wenn das CLOSE TRACK SESSION Command erfolgt. Ein Weiterschreiben des Tracks ist nicht möglich. Sind Damage und NWA_V gesetzt kann der Track weiter geschrieben werden. Die automatische Reparatur wird beim nächsten Schreibbefehl versucht. Wenn die Reaparatur erfolgreich ist, wird das Damage Flag entfernt. Bevor die Reparatur versucht wird, enthält das NWA Feld die Adresse des nächsten beschreibbaren Bereiches.

Copy Für CD-Medien bedeutet das Copy-Bit, dass dieser Track eine Kopie des zweiten oder höheren Generation ist. Für andere Medien ist das bit nicht gesetzt.

Track Mode Ursprünglich für CD-Medien definiert. Werte für verschiedene Medientypen:

CD-ROM/-R/-RWDefiniert für Mode 1 Q Subchannel
DVD+R$07, Indiziert: Daten, schrittweise Aufzeichnung, Kopierschutz
Alle andere Medien$04, Indiziert: Daten, kontinuierliche Aufzeichnung, Kein Kopierschutz
Media TypeRT = 0RT = 1
CD‑ROM, DVD‑ROM,
BD-ROM, DVD-RAM,
DVD+RW, BD-RE
Standard-
CD-R/-RWDer Track ist unsichtbar/ unvollständig.Ein PMA Eintrag wurde zur Erkennung der Start- und Endadressen des Tracks geschrieben.
DVD-R/-RWDie Rzone ist vollständig (z.B. geschlossen), unsichtbar oder unvollständig.Die Rzone ist reserviert. Sie kann entweder leer oder teilweise beschrieben sein.
DVD+RDer logische Track ist ein unsicht- bares/unvollständiges Fragment.Die Grenzen des Fragments sind inner- halb der Disk/Session Identifikation Zone definiert.
BD-RDer logische Track ist eine unsichtbare/unvollständige SRR.Der logische Track ist keine unsichtbare/unvollständige SRR.
Media TypeBlank = 0Blank = 1
CD-R/RWMindestens der Track Pre-gap wurde geschrieben.Alle Sektoren innerhalb des Tracks und des Pre-gaps sind leer.
DVD‑R/‑RW,
DVD+R, BD-R
Einige beschreibbare Einheiten innerhalb der logischen Tracks sind beschrieben. Alle beschreibbaren Einheiten innerhalb des logischen Tracks sind leer.
DVD-RAM,
BD-RE
Blank hat keine Bedeutung für dieses Medium. Das Bit ist immer Null.
DVD+RWDer CD-Status im Disc-Informationsblock zeigt, dass die Disk nicht leer ist.Der CD-Status im Disc-Informationsblock zeigt, dass die gesamte CD leer ist.
Media TypePacket/Inc = 0Packet/Inc = 1
CD-R/RWBasiert auf vorhandenem Track-Format und Write Parameter Mode Page.
DVD-R/-RWBasiert auf vorhandenem Rzone-Format und Write Parameter Mode Page.
DVD-RAM,
DVD+R,
DVD+RW,
BD-RE
-Immer
Media TypeFP = 0FP = 1
CD-R/RWBasiert auf vorhandenem Track-Format und Write Parameter Mode Page.
DVD-R/-RWBasiert auf vorhandenem Rzone-Format und Write Parameter Mode Page.
DVD-RAM, DVD+R,
DVD+RW,
BD-RE
Immer-

Beim Schreiben von CD und DVD-R/RW können die Parameter RT, Blanc und Packet/Inc über die Write Parameters Page gesetzt werden. Der Zustand des Tracks bestimmt welche Parameter gesetzt werden und den Parametern in der mode page entsprechen müssen.

Track Status entsprechend der RT, Blank, Packet/Inc und FP Flags:

RTBlankPacketFPDVD-R/-RWCD
Write MethodTrack StatusWrite MethodTrack Status
000-DAOVollständigKontinuierlich/
TAO/SAO
Vollständig/
Während
TAO/SAO
0010SchrittweiseUnvollständig oder vollständig1VariabelUnvollständig
0011Eingeschränkt überschriebenUnvollständig oder vollständig2FestUnvollständig
010-DAOUnsichtbarTAO/Variable/ Fest3Unsichtbar
0111Eingeschränkt überschreibenUnsichtbar-Ungültig
100-DAOWährend DAOTAOVollständig/ Während TAO
1010SchrittweiseTeilweise beschrieben
Reserviert
Variabel Vollständig/teilweise beschrieben
Reserviert
1011-UngültigFestVollständig/teilweise beschrieben
Reserviert
110-DAOLeer
Reserviert
Vor Schreiben
TAOLeer
Reserviert
1110SchrittweiseLeer
Reserviert
Variabel/FestLeer
Reserviert

1 Wenn das Free Blocks Feld Null ist, ist der Track vollständig, sonst unvollständig.
2 Wenn der Track in einer Session im Zwischenzustand ist, ist der Track im unvollständigem Zustand.
3 Wenn die letzte Session leer ist, ist SAO gültig.

Data Mode gibt den Inhalt des Tracks für CD an:

WertDefinition
1Mode 1 (ISO/IEC 10149)
2Mode 2 (ISO/IEC 10149 oder CD-ROM XA)
$FDatenblocktyp unbekannt (Kein Track Descriptor Block)
0, 3..$EReserviert

Für andere Medien ist der Wert Eins.

NWA_V Gibt an, ob das Next Writable Address Feld gültig ist. Wenn der Track nicht beschreibbar ist, ist das Flag nicht gesetzt. Wenn es eine grundlegend formatierte DVD+RW ist, ist das Flag nicht gesetzt.

LRA_V Gibt an, ob das Last Recorded Address Feld gültig ist. Das Flag wird nicht gesetzt, wenn der Track Schäden besitzt und automatisch repariert wurde.

Track Start Address Das Feld enthält die Adresse des ersten Blockes mit Benutzerinformationen für den Logical Track.

Next Writable Address Wenn sie gültig ist, gibt sie die LBA des nächsten beschreibbaren Benutzer-Blocks im Track welcher im CDB angegeben ist an.

Free Blocks Gibt die maximale Anzahl der im logischen Track zur Aufnahme zur Verfügung stehenden Nutzerdatenblöcke.

Fixed Packet Size / Blocking Factor Für CD ist die Größe nur gültig wenn die Packet und FP Flags gesetzt sind. Für DVD Medien ist der Wert 16, für BD Medien 32.

Logical Track Size Die Anzahl der Nutzerdatenblöcke im logischen Track.

Last Recorded Address Die Adresse ist für DVD-R, DVD-R DL, DVD-RW und BD-R gültig, wenn das Flag LJRS nicht gesetzt ist. Es ist die Adresse des letzten beschriebenen Nutzerdatensektors des angegebenen logischen Tracks. Der letzte geschriebene Sektor der Auffüllsektoren gelten dabei nicht.

Read Compatibility LBA Wenn die Disc eine DVD+R und der Track unsichtbar ist (d.h. RT = 0), ist dieses Feld present. Die Read Compatibility LBA ist eine Auffüllempfehlung des Laufwerkes, die verwendet wird, um einen minimalen Aufnahmeradius (28-30 mm) zu gewährleisten. Für DVD + R DL liegt die Adresse bei L0.

Next Layer Jump Address Ist die Adresse des künftigen Layer Jumps von L0 zu L1 oder L1 zu L0 der reservierten / unsichtbaren / unvollständigen Rzone des DVD-R DL Mediums. Die Adresse ist entweder die L0- oder die L1-Adresse. Wenn keine andere Schicht in der Rzone liegt, hat das Feld den Wert Null. Für leere DVD-R DL ist der Wert ebenfalls Null.

Last Layer Jump Address Ist die Adresse des letzten Layersprungs bei L0. Im Falle von DVD-R DL Medium wird nur die vorige Layer Jump Address an L0 zurückgegeben. Wenn kein Layersprung in der Rzone gefunden wurde und NWA gesetzt ist, ist das Feld auf Null gesetzt. Für DVD-R DL mit die geschlossener Rzone enthält das Feld die größte beschriebene LBA auf L0 in der geschlossenen Rzone. Wenn die Rzone unsichtbar oder unvollständig ist, berichten das Last Layer Address und die Next Layer Jump Address Felder die Informationen über den Layer Jump Block (LJB). Wenn das Feld LJRS auf 00b gesetzt ist und die Next Layer Jump Address und Last Layer Jump Address Felder nach dem Read Compatibility LBA present sind, sind diese Felder $00000000.

Deklarationen

{
*  Für die Auswertung.
}
type
  TTrackInformationBlock = record
    DataLength         : Word;
    LogicalTrackNumber : Word;
    SessionNumber      : Word;
    LJRS               : Byte;
    Damage             : Boolean;
    Copy               : Boolean;
    TrackMode          : Byte;
    RT                 : Boolean;
    Blank              : Boolean;
    PacketInc          : Boolean;
    FP                 : Boolean;
    DataMode           : Byte;
    LRA_V              : Boolean;
    NWA_V              : Boolean;
    LogTrackStartAddr  : Cardinal;
    NextWritableAddr   : Cardinal;
    FreeBlocks         : Cardinal;
    FixedPacketSize    : Cardinal;
    LogTrackSize       : Cardinal;
    LastRecordedAddr   : Cardinal;
    ReadCompLBA        : Cardinal;
    NextLayerJumpAddr  : Cardinal;
    LastLayerJumpAddr  : Cardinal;
  end;
 
{
*  Für den Befehl.
}
const
  SCSIOP_READ_TRACK_INFORMATION = $52;
 
type
  TREAD_TRACK_INFORMATION_CDB = record
    OperationCode      : Byte;
    Open               : Byte;
    AddressNumberType  : Byte;
    LBATrackSessionNum : Byte;
    AllocationLength   : Word;
    Control            : 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.ReadTrackInformation(aDevice: THandle): Boolean;
{*******************************************************************************
*  Die Informationen zu den Tracks ermitteln.
}
var
  READ_TRACK_INFO_CDB : TREAD_TRACK_INFORMATION_CDB;
  pTrackInformation   : PREAD_TRACK_INFO_DATA;
  aCDB                : Array of Byte;
  nTrackNr, i         : Integer;
  nFrom               : Integer;
  nTo                 : Integer;
begin
  Result := False;
  {
  *  Aus der Standard Disc Information die Tracks feststellen.
  }
  nFrom := FDrive[FActive].DiscInformation.NumberOfFirstTrackOnDisc;
  nTo   := FDrive[FActive].DiscInformation.LastTrackNumberInLastSession;
  if (nFrom > 0) and (nTo > 0) and (nFrom <= nTo)
  then begin
    {
    *  Anzahl der Blöcke setzen.
    }
    SetLength(FDrive[FActive].TrackInformation, nTo - nFrom + 1);
    {
    *  Tracks abarbeiten.
    }
    for nTrackNr := nFrom to nTo
    do begin
      i := nTrackNr - nFrom;
      {
      *  Track Info initialisieren.
      }
      FillChar(FDrive[FActive].TrackInformation[i],
               SizeOf(FDrive[FActive].TrackInformation[i]), $00);
      {
      *  Den Command Descriptor Block füllen.
      }
      ZeroMemory(@READ_TRACK_INFO_CDB, SizeOf(READ_TRACK_INFO_CDB));
      READ_TRACK_INFO_CDB.OperationCode      := SCSIOP_READ_TRACK_INFORMATION;
      READ_TRACK_INFO_CDB.Open               := 0;
      READ_TRACK_INFO_CDB.AddressNumberType  := 1;
      READ_TRACK_INFO_CDB.LBATrackSessionNum := nTrackNr;
      READ_TRACK_INFO_CDB.AllocationLength   := SizeOf(TREAD_TRACK_INFO_DATA);
      READ_TRACK_INFO_CDB.Control            := 0;
      {
      *  Den Command Descriptor Block übertragen.
      }
      SetLength(aCDB, 10);
      aCDB[0] := READ_TRACK_INFO_CDB.OperationCode;
      aCDB[1] := ((READ_TRACK_INFO_CDB.Open and $01) shl 1) or
                  (READ_TRACK_INFO_CDB.AddressNumberType and $03);
      aCDB[2] := (READ_TRACK_INFO_CDB.LBATrackSessionNum and $FF000000) shr 24;
      aCDB[3] := (READ_TRACK_INFO_CDB.LBATrackSessionNum and $00FF0000) shr 16;
      aCDB[4] := (READ_TRACK_INFO_CDB.LBATrackSessionNum and $0000FF00) shr 8;
      aCDB[5] := (READ_TRACK_INFO_CDB.LBATrackSessionNum and $000000FF);
      aCDB[7] := HiByte(READ_TRACK_INFO_CDB.AllocationLength);
      aCDB[8] := LoByte(READ_TRACK_INFO_CDB.AllocationLength);
      {
      *  Befehl ausführen.
      }
      GetMem(pTrackInformation, SizeOf(TREAD_TRACK_INFO_DATA));
      Result := GET_SCSI_PASS_THROUGH_DIRECT(aDevice, aCDB, pTrackInformation,
                                             SizeOf(TREAD_TRACK_INFO_DATA));
      if Result then
      with FDrive[FActive].TrackInformation[i]
      do begin
        DataLength := pTrackInformation[0] shl 8 or pTrackInformation[1];
        {
        *  Prüfen, ob Daten folgen.
        }
        if DataLength >= 2
        then begin
          LogicalTrackNumber       := pTrackInformation[2] or
                                      pTrackInformation[32] shl 8;
          SessionNumber            := pTrackInformation[3] or
                                      pTrackInformation[33] shl 8;
          LJRS                     := pTrackInformation[5] and $C0 shr 6;
          Damage                   := pTrackInformation[5] and $20 > 0;
          Copy                     := pTrackInformation[5] and $10 > 0;
          TrackMode                := pTrackInformation[5] and $0F;
          RT                       := pTrackInformation[6] and $80 > 0;
          Blank                    := pTrackInformation[6] and $40 > 0;
          PacketInc                := pTrackInformation[6] and $20 > 0;
          FP                       := pTrackInformation[6] and $10 > 0;
          DataMode                 := pTrackInformation[6] and $0F;
          LRA_V                    := pTrackInformation[7] and $02 > 0;
          NWA_V                    := pTrackInformation[7] and $01 > 0;
          LogicalTrackStartAddress := pTrackInformation[8] shl 24 or
                                      pTrackInformation[9] shl 16 or
                                      pTrackInformation[10] shl 8 or
                                      pTrackInformation[11];
          NextWritableAddress      := pTrackInformation[12] shl 24 or
                                      pTrackInformation[13] shl 16 or
                                      pTrackInformation[14] shl 8 or
                                      pTrackInformation[15];
          FreeBlocks               := pTrackInformation[16] shl 24 or
                                      pTrackInformation[17] shl 16 or
                                      pTrackInformation[18] shl 8 or
                                      pTrackInformation[19];
          FixedPacketSize          := pTrackInformation[20] shl 24 or
                                      pTrackInformation[21] shl 16 or
                                      pTrackInformation[22] shl 8 or
                                      pTrackInformation[23];
          LogicalTrackSize         := pTrackInformation[24] shl 24 or
                                      pTrackInformation[25] shl 16 or
                                      pTrackInformation[26] shl 8 or
                                      pTrackInformation[27];
          LastRecordedAddress      := pTrackInformation[28] shl 24 or
                                      pTrackInformation[29] shl 16 or
                                      pTrackInformation[30] shl 8 or
                                      pTrackInformation[31];
          ReadCompatibilityLBA     := pTrackInformation[36] shl 24 or
                                      pTrackInformation[37] shl 16 or
                                      pTrackInformation[38] shl 8 or
                                      pTrackInformation[39];
          NextLayerJumpAddress     := pTrackInformation[40] shl 24 or
                                      pTrackInformation[41] shl 16 or
                                      pTrackInformation[42] shl 8 or
                                      pTrackInformation[43];
          LastLayerJumpAddress     := pTrackInformation[44] shl 24 or
                                      pTrackInformation[45] shl 16 or
                                      pTrackInformation[46] shl 8 or
                                      pTrackInformation[47];
        end;
      end;
    end;
  end;
end;

Demo, welche diese Funktion nutzt:

Track Information (podTrackInformation.7z - 294 kb) MD5 (1 kb). Stand: 23. Juli 2013

Änderungen an der Demo

23.07.2013Kleine Überarbeitung und neuer Name.
26.02.2012Aktualisiert: Groupbox "Optische Laufwerke".

Table of Content (IOCTL) > Track Information > CD Type