CD-ID für freeDB.org berechen

  • VB.NET

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von Infinity.

    CD-ID für freeDB.org berechen

    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:


    VB.NET-Quellcode

    1. 'CD-Handle überpfrüfen
    2. If cdHandle = 0 Or cdHandle = -1 Or Not Laufwerk.IsReady Then
    3. Return Nothing
    4. End If
    5. 'Toc auslesen
    6. Dim BytesRead As ULong
    7. Dim TOC As New Kernel32.CDROM_TOC
    8. If Kernel32.DeviceIoControl(cdHandle, Kernel32.IOCTL_CDROM_READ_TOC, Nothing, 0, TOC, System.Runtime.InteropServices.Marshal.SizeOf(TOC), BytesRead, Nothing) = 0 Then
    9. Return Nothing
    10. End If
    11. 'Ermittle benötigte Daten zur Berechnung der ID
    12. Dim AnzahlDerTracks As Integer = TOC.LastTrack
    13. Dim SummerDerTitellängenInSekunden As Integer = LeseEndSektor(TOC.LastTrack, TOC) / Zeitberechnung.FRAMES_PER_SECOND
    14. Dim Checksumme As Integer = 0
    15. For i As Byte = TOC.FirstTrack To TOC.LastTrack
    16. '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)
    17. Checksumme += LeseStartSektor(i, TOC) / Zeitberechnung.FRAMES_PER_SECOND
    18. Checksumme += Quersumme(TOC.TrackData(i).Address_1 * 60 + TOC.TrackData(i).Address_2)
    19. Next
    20. 'Berechne ID
    21. Dim IDAlsUlong As ULong = (CUInt(Checksumme) Mod &HFF) << 24 Or CUInt(SummerDerTitellängenInSekunden) << 8 Or CUInt(AnzahlDerTracks)
    22. 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“ ()

    Problem gelöst

    Falls es irgendwen interessiert :) ich habe das Probelm gelöst. Es war einfach eine Rundungssache, VB.Net rundent anscheinend bei der Konvertierung nach Integer je nach Nachkommawert automatisch auf und ab. Für den richtigen Wert muss allerdings immer abgerundet werden.

    Also nicht:
    Checksumme += Quersumme((NeuerCDRipper.LeseStartSektor(CInt(i), TOC) + 150) / Zeitberechnung.FRAMES_PER_SECOND)

    sondern:
    Checksumme += Quersumme(Int((NeuerCDRipper.LeseStartSektor(CInt(i), TOC) + 150) / Zeitberechnung.FRAMES_PER_SECOND))

    Außerdem muss man zum StartSektor noch 150 addieren, würde allerdings noch gerne wissen wiso eigentlich, denn ich bin nur durch Zufall darauf gekommen.