Hi
Ich bin gerade dabei meinen CD-Ripper (mit VB.Net geschrieben) zu erweitern, dass automatisch die Tracknamen und das Album angezeigt werden.
Dazu will ich freeDB.org verwenden. Im Internet gibt es dazu auch eine Menge Anleitungen. Die Abfrage nach einer bestimmten CD-ID funktioniert auch schon. Nur habe ich Probleme, diese ID zu berechen:
Laut Wikipedia (de.wikipedia.org/wiki/Compact_Disc_Database) berechnet sich die ID genau so, wie ich sie in dem Code oben berechne (denke ich zumindest aber anscheinen ist es nicht so).
Also die Anzahl der Tracks auf dem Album stimmen, die Summe der Titellängen in Sekunden auch, nur die Checksumme der Werte des Inhaltsverzeichnis stimmt nicht.
Ich bekomme z. B. immer 1e103b12 statt 0f103b12 also die ersten beiden Zeichen sind falsch.
An der Methode mit der ich die Quersumme berechne liegt es auf jeden Fall nicht und der Toc wird eigentlich auch richtig ausgelesen, sonst würde ja mein CD-Ripper nicht funktionieren.
Ich hoffe ihr könnt mir helfen, weil ich habe es jetzt schon fast geschafft und es wäre schade, wenn das ganze an der Checksumme scheitert.
Ich bin gerade dabei meinen CD-Ripper (mit VB.Net geschrieben) zu erweitern, dass automatisch die Tracknamen und das Album angezeigt werden.
Dazu will ich freeDB.org verwenden. Im Internet gibt es dazu auch eine Menge Anleitungen. Die Abfrage nach einer bestimmten CD-ID funktioniert auch schon. Nur habe ich Probleme, diese ID zu berechen:
VB.NET-Quellcode
- 'CD-Handle überpfrüfen
- If cdHandle = 0 Or cdHandle = -1 Or Not Laufwerk.IsReady Then
- Return Nothing
- End If
- 'Toc auslesen
- Dim BytesRead As ULong
- Dim TOC As New Kernel32.CDROM_TOC
- If Kernel32.DeviceIoControl(cdHandle, Kernel32.IOCTL_CDROM_READ_TOC, Nothing, 0, TOC, System.Runtime.InteropServices.Marshal.SizeOf(TOC), BytesRead, Nothing) = 0 Then
- Return Nothing
- End If
- 'Ermittle benötigte Daten zur Berechnung der ID
- Dim AnzahlDerTracks As Integer = TOC.LastTrack
- Dim SummerDerTitellängenInSekunden As Integer = LeseEndSektor(TOC.LastTrack, TOC) / Zeitberechnung.FRAMES_PER_SECOND
- Dim Checksumme As Integer = 0
- For i As Byte = TOC.FirstTrack To TOC.LastTrack
- 'Habe hier mal 2 Varianten, die aber beide nicht zum gewünschten Ergebnis führen (und ja ich verwende die nicht gleichzeitig hab hier nur mal beide reinkopiert zum Zeigen)
- Checksumme += LeseStartSektor(i, TOC) / Zeitberechnung.FRAMES_PER_SECOND
- Checksumme += Quersumme(TOC.TrackData(i).Address_1 * 60 + TOC.TrackData(i).Address_2)
- Next
- 'Berechne ID
- Dim IDAlsUlong As ULong = (CUInt(Checksumme) Mod &HFF) << 24 Or CUInt(SummerDerTitellängenInSekunden) << 8 Or CUInt(AnzahlDerTracks)
- Dim IDAlsString As String = String.Format("{0:x8}", IDAlsUlong)
Laut Wikipedia (de.wikipedia.org/wiki/Compact_Disc_Database) berechnet sich die ID genau so, wie ich sie in dem Code oben berechne (denke ich zumindest aber anscheinen ist es nicht so).
Also die Anzahl der Tracks auf dem Album stimmen, die Summe der Titellängen in Sekunden auch, nur die Checksumme der Werte des Inhaltsverzeichnis stimmt nicht.
Ich bekomme z. B. immer 1e103b12 statt 0f103b12 also die ersten beiden Zeichen sind falsch.
An der Methode mit der ich die Quersumme berechne liegt es auf jeden Fall nicht und der Toc wird eigentlich auch richtig ausgelesen, sonst würde ja mein CD-Ripper nicht funktionieren.
Ich hoffe ihr könnt mir helfen, weil ich habe es jetzt schon fast geschafft und es wäre schade, wenn das ganze an der Checksumme scheitert.
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Infinity“ ()