Titel von AudioCDs von FreeDB.org holen & DiscID berechnen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Interesse an Mitarbeit an Hobby Projekt ?

Beitrag von ts-soft »

jpd hat geschrieben:müsste eingentlich in Tipps und Tricks rein ..oder?
Sehr gute Idee :allright:
Einfach die funktionierenden aktuellen Proceduren zusammensuchen, den Link zur freedb.org dokumentation dazu,
unter Tipps und Tricks dann posten und es wird viele dankbare User geben :D

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Rebon
Beiträge: 263
Registriert: 20.05.2009 19:13

Re: Titel von AudioCDs von FreeDB.org holen & DiscID berechn

Beitrag von Rebon »

Die folgende Anpassung des Codes entstand durch den Versuch von mir den Fehler zu finden, bin aber nicht darauf gekommen. Habe die Anpassung bei Hex so vorgenommen, wie es jpd gelöst hatte.
Bei beispielsweise den Typendeklarationen bin ich mir aber überhaupt nicht sicher ob die so stimmen und ein Test, mit der ID einer Audio-CD bei freedb, funktionierte leider nicht(no results found).

Code: Alles auswählen

EnableExplicit
Global NewList StartTrackList(), NumberOfDrives.i = InitAudioCD(), RawDiscID.s

Procedure.s GetHourFormat(LengthInSeconds)
  Protected Minutes.i = LengthInSeconds / 60, Seconds.i = LengthInSeconds - Minutes * 60, Null.s = ""
  If Seconds < 10
    Null = "0"
  EndIf
  ProcedureReturn RSet(Str(Minutes),2,"0")+":" + Null + Str(Seconds)
EndProcedure

Procedure.l SumDigits(numbers)
  Protected qs.l
  While numbers > 0
    qs = qs + (numbers % 10)
    numbers = numbers / 10
  Wend
  ProcedureReturn qs
EndProcedure

Procedure.s CalcRawDiscID(List StartTrackList())
  Protected Counter.i = 1, track_length.i, total_length.i, CheckSum.i, Temp.q, XX.s = "", YYYY.s = "", ZZ.s = ""
  ForEach StartTrackList()
    track_length = AudioCDTrackLength(Counter)
    total_length + track_length
    CheckSum + SumDigits(StartTrackList())               
    Counter + 1
  Next

  Temp    = (CheckSum % $FF) << 24

  XX    = LCase(RSet(Hex(Temp,#PB_Quad), 2, "0"))               
  YYYY  = LCase(RSet(Hex(AudioCDLength(),#PB_Quad), 4, "0"))
  ZZ    = LCase(RSet(Hex(AudioCDTracks(),#PB_Quad), 2, "0"))

  RawDiscID = XX + YYYY + ZZ
  ProcedureReturn RawDiscID
EndProcedure

Procedure CreateTrackList()
  Protected Drive.i, NumTracks.i, Track.i, StartTimeTrack.i
  If NumberOfDrives > 0
    For Drive = 1 To NumberOfDrives
      UseAudioCD(Drive-1)
      If AudioCDTracks() > 0
        NumTracks     = AudioCDTracks()
        InsertElement(StartTrackList())
        StartTrackList() = 2
       
        For Track = 1 To NumTracks         
          StartTimeTrack = StartTimeTrack + AudioCDTrackLength(Track)
          AddElement(StartTrackList())
          StartTrackList()  = StartTimeTrack
        Next
       
        LastElement(StartTrackList())
        DeleteElement(StartTrackList())     
      EndIf
    Next
  EndIf
EndProcedure

If NumberOfDrives = 0
  MessageRequester("Fehler", "Keine CD-Audio Laufwerke gefunden", 0)
  End
Else
  ClearList(StartTrackList())
  CreateTrackList()

  RawDiscID = CalcRawDiscID(StartTrackList())

  Debug "*** DiscID ***"
  Debug RawDiscID
  Debug ""

  Debug "*** Startzeiten der Tracks ***"
  ForEach StartTrackList()
    Debug GetHourFormat(StartTrackList())
  Next
EndIf
PB 4.00 | Windows XP Home SP3
Benutzeravatar
jpd
Beiträge: 380
Registriert: 14.02.2005 10:33

Re: Titel von AudioCDs von FreeDB.org holen & DiscID berechn

Beitrag von jpd »

Hallo Rebon,

habe auf Freedb eine disc id von einer meiner CD's verglichen und funktioniert fehlerfrei.

Fredb Disc ID Check

Mit freeRIP kriege ich die gleiche Disc-ID.

Ciao
jpd
PB 5.10 Windows 7 x64
Rebon
Beiträge: 263
Registriert: 20.05.2009 19:13

Re: Titel von AudioCDs von FreeDB.org holen & DiscID berechn

Beitrag von Rebon »

Danke jpd für die Info. :allright:
Ich hatte gestern Nacht noch die Variable qs von Global in die Prozedur geschrieben, das war wohl der Hauptfehler, die Var wurde zuvor beim erneuten Aufruf von SumDigits() nicht zurückgesetzt. :oops:
PB 4.00 | Windows XP Home SP3
Antworten