Seite zurück / previous page
links
Seite vor / next page
rechts
 
Kapitel zurück / previous Chapter
zurück
Kapitel vor / next Chapter
vor
 
Seitenanfang/TopOfPage
oben
Seitenende/EndOfPage
unten
DD380700.HTM
DD-Software.CDDBQSC
Add this page to your favorites
Save this document

CDDBQSC


CDDBQSC.WBT   Version 1.02  2003:11:04

CDDB Query String Creator
This WinBatch script calculates the CDDB ID from Audio CDROM
and builds a formatted query string for CDDB request.

Example:
"cddb query 890a9a0b 11 187 20610 41790 60137 77472 90200 111502 128465 142360 162700 183120 2716"


If you have questions about WinBatch, you are encouraged to use online WebBoard BBS at http://webboard.windowware.com


;================================================================================================================================
; CDDB Query String Creator, CDDBQSC.WBT, Version 1.02                                                  (c)Detlev Dalitz.20010801
;================================================================================================================================
; Detlev Dalitz.20010801.20010809.20031104.
;
; This WinBatch script calculates the CDDB ID from Audio CDROM
; and builds a formatted query string for CDDB request.
;
; Example:
; cddb query 890a9a0b 11 187 20610 41790 60137 77472 90200 111502 128465 142360 162700 183120 2716
;================================================================================================================================

GoSub DefineUDFs

; Get List of CD-ROM drives.
CdRomList = DiskScan(8) ; Tab delimited list of logical drive names.
CdRomCount = ItemCount(CdRomList, @TAB)

While @TRUE
   ; Select one CD-ROM drive.
   IntControl (63, 300, 200, 700, 500)
   CdRomDrive = AskItemlist("Select one CD-ROM drive",CdRomList,@TAB, @SORTED, @SINGLE)

   ; Get List of cda track files from the selected drive.
   TrackList = FileItemize(StrCat(CdRomDrive,"\*.cda"))
   If (TrackList=="") Then Continue
   TrackList = ItemSort(TrackList,@TAB) ; For sure.
   TrackCount = ItemCount(TrackList,@TAB)

   DispList = ""
   DispItem = ""
   DispItem = ItemInsert("CD",-1,DispItem,@TAB)
   DispItem = ItemInsert("Begin",-1,DispItem,@TAB)
   DispItem = ItemInsert("",-1,DispItem,@TAB)
   DispItem = ItemInsert("",-1,DispItem,@TAB)
   DispItem = ItemInsert("Length",-1,DispItem,@TAB)
   DispItem = ItemInsert("",-1,DispItem,@TAB)
   DispItem = ItemInsert("",-1,DispItem,@TAB)
   DispList = ItemInsert(DispItem,-1,DispList,@CR)
   DispItem = ""
   DispItem = ItemInsert("Track ",-1,DispItem,@TAB)
   DispItem = ItemInsert("Minute",-1,DispItem,@TAB)
   DispItem = ItemInsert("Second",-1,DispItem,@TAB)
   DispItem = ItemInsert("Frame" ,-1,DispItem,@TAB)
   DispItem = ItemInsert("Minute",-1,DispItem,@TAB)
   DispItem = ItemInsert("Second",-1,DispItem,@TAB)
   DispItem = ItemInsert("Frame" ,-1,DispItem,@TAB)
   DispList = ItemInsert(DispItem,-1,DispList,@CR)

   CDAFileSize = 44 ; Magic value, see cda structure table below.
   bbcda = BinaryAlloc(CDAFileSize)

   SumNumbers = 0
   SumSeconds = 0
   FrameOffsetList = ""

   For t=1 To TrackCount
      TrackFilename = StrCat(CdRomDrive, "\", ItemExtract(t, TrackList, @TAB))
      BinaryEodSet(bbcda, 0)
      BinaryRead(bbcda, TrackFilename)

      TrackNr           = BinaryPeek2(bbcda, 22)
      TrackBeginMinute  = BinaryPeek(bbcda, 38)
      TrackBeginSecond  = BinaryPeek(bbcda, 37)
      TrackBeginFrame   = BinaryPeek(bbcda, 36)
      TrackLengthMinute = BinaryPeek(bbcda, 42)
      TrackLengthSecond = BinaryPeek(bbcda, 41)
      TrackLengthFrame  = BinaryPeek(bbcda, 40)

      If (t==1)
         ; Store first track begin for later use.
         FirstTrackStart = (TrackBeginMinute * 60) + TrackBeginSecond
      EndIf
      If (t==TrackCount)
         CDTotallength = 1
         CDTotallength = CDTotallength + (TrackBeginMinute * 60 * 75) + (TrackBeginSecond * 75) + TrackBeginFrame
         CDTotallength = CDTotallength + (TracklengthMinute * 60 * 75) + (TrackLengthSecond * 75) + TrackLengthFrame
         CDTotallength = CDTotallength / 75
      EndIf

      OffsetSecond = (TrackBeginMinute * 60) + TrackBeginSecond
      While (OffsetSecond > 0)
         SumNumbers = SumNumbers + (OffsetSecond mod 10);
         OffsetSecond = OffsetSecond / 10;
      EndWhile

      FrameOffset = (TrackBeginMinute * 60 * 75) + (TrackBeginSecond * 75) + TrackBeginFrame
      ; Store FrameOffsets for later use.
      FrameOffsetList = ItemInsert(FrameOffset,-1,FrameOffsetList," ")

      DispTrackNr           = StrFixLeft(TrackNr          ,"0",2)
      DispTrackBeginMinute  = StrFixLeft(TrackBeginMinute ,"0",2)
      DispTrackBeginSecond  = StrFixLeft(TrackBeginSecond ,"0",2)
      DispTrackBeginFrame   = StrFixLeft(TrackBeginFrame  ,"0",2)
      DispTrackLengthMinute = StrFixLeft(TrackLengthMinute,"0",2)
      DispTrackLengthSecond = StrFixLeft(TrackLengthSecond,"0",2)
      DispTrackLengthFrame  = StrFixLeft(TrackLengthFrame ,"0",2)

      DispItem = ""
      DispItem = ItemInsert(DispTrackNr          ,-1,DispItem,@TAB)
      DispItem = ItemInsert(DispTrackBeginMinute ,-1,DispItem,@TAB)
      DispItem = ItemInsert(DispTrackBeginSecond ,-1,DispItem,@TAB)
      DispItem = ItemInsert(DispTrackBeginFrame  ,-1,DispItem,@TAB)
      DispItem = ItemInsert(DispTrackLengthMinute,-1,DispItem,@TAB)
      DispItem = ItemInsert(DispTrackLengthSecond,-1,DispItem,@TAB)
      DispItem = ItemInsert(DispTrackLengthFrame ,-1,DispItem,@TAB)
      DispList = ItemInsert(DispItem,-1,DispList,@CR)
   Next
   DropWild("DispTrack*")
   DropWild("TrackBegin*")
   DropWild("TrackLength*")
   Drop(FrameOffset,OffsetSecond,TrackFilename,TrackNr,TrackList)

   CDSerialNrHex = ""
   For i=0 To 3
      CDSerialNrHex  = StrCat(udfByteToHex(BinaryPeek(bbcda, 24 + i)),CDSerialNrHex)
   Next
   CDSerialNrHex = StrSub(CDSerialNrHex,StrScan(CDSerialNrHex, "123456789abcdef", 1, @FWDSCAN), -1)
   CDSerialNrHex = StrCat("[", StrUpper(CDSerialNrHex), "]") ; As stored in CDPLAYER.INI.

   SumSeconds = CDTotalLength - FirstTrackStart
   bbcddb = BinaryAlloc(4)
   BinaryPoke4(bbcddb,0,((SumNumbers mod 255) << 24 | SumSeconds << 8 | TrackCount))
   CDDBIDHex = ""
   For i=0 To 3
      CDDBIDHex  = StrCat(udfByteToHex(BinaryPeek(bbcddb, 0 + i)), CDDBIDHex)
   Next
   BinaryFree(bbcddb)
   BinaryFree(bbcda)

   ; Here comes the ultimative CDDD query string.
   CDDBQueryList = ""
   CDDBQueryList = ItemInsert("cddb query"   , -1, CDDBQueryList, " ")
   CDDBQueryList = ItemInsert(CDDBIDHex      , -1, CDDBQueryList, " ")
   CDDBQueryList = ItemInsert(TrackCount     , -1, CDDBQueryList, " ")
   CDDBQueryList = ItemInsert(FrameOffsetList, -1, CDDBQueryList, " ")
   CDDBQueryList = ItemInsert(CDTotalLength  , -1, CDDBQueryList, " ")
   Drop(FrameOffsetList)

   DispList = ItemInsert(StrCat(@CR, "CD SerialNr ", CDSerialNrHex, @CR), -1, DispList, @CR)
   DispList = ItemInsert(CDDBQueryList, -1, DispList, @CR)

   IntControl (63, 100, 200, 900, 800)
   AskItemlist(StrCat("CDDB Query String Creator - Tracklist Info for CD drive ", CdRomDrive), DispList, @CR, @UNSORTED, @SINGLE)

   GoSub ClipCopyDialog
   DropWild("QueryList*")
EndWhile

:CANCEL
Exit

;================================================================================================================================
:DefineUDFs
;--------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfbytetohex",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfbytetohex

#DefineFunction udfByteToHex(Byte)
HexChars="0123456789abcdef"
h1=StrSub(HexChars,1+(Byte>>4),1)
h2=StrSub(HexChars,1+(Byte&15),1)
Return (StrCat(h1,h2))
;HexChars="0123456789ABCDEF"
;Byte=0..255
#EndFunction

:skip_udfbytetohex
;--------------------------------------------------------------------------------------------------------------------------------
Return ; from DefineUDFs
;================================================================================================================================


;================================================================================================================================
; Procedures
;--------------------------------------------------------------------------------------------------------------------------------
:ClipCopyDialog

CDDBQueryList_save = CDDBQueryList
ClipInfo = ""
done = @FALSE
While !done

   ;MyClipCopyDialogFormat=`WWWDLGED,5.0`
   ;MyClipCopyDialogCaption=`CDDB Query String Creator`
   ;MyClipCopyDialogX=60
   ;MyClipCopyDialogY=100
   ;MyClipCopyDialogWidth=363
   ;MyClipCopyDialogHeight=52
   ;MyClipCopyDialogNumControls=6
   ;MyClipCopyDialog01=`006,004,074,DEFAULT,STATICTEXT,DEFAULT,"CDDB Query String"`
   ;MyClipCopyDialog02=`312,004,044,DEFAULT,STATICTEXT,DEFAULT,"(c) DD.20010808"`
   ;MyClipCopyDialog03=`004,016,352,DEFAULT,EDITBOX,CDDBQueryList,""`
   ;MyClipCopyDialog04=`006,032,120,DEFAULT,VARYTEXT,ClipInfo,""`
   ;MyClipCopyDialog05=`132,032,064,DEFAULT,PUSHBUTTON,DEFAULT,"Copy to &ClipBoard",11`
   ;MyClipCopyDialog06=`204,032,064,DEFAULT,PUSHBUTTON,DEFAULT,"Cl&ose",1`
   ;ButtonPushed=Dialog("MyClipCopyDialog")

   MyClipCopyDialogFormat=`WWWDLGED,6.1`
   MyClipCopyDialogCaption=`CDDB Query String Creator`
   MyClipCopyDialogX=060
   MyClipCopyDialogY=100
   MyClipCopyDialogWidth=362
   MyClipCopyDialogHeight=051
   MyClipCopyDialogNumControls=006
   MyClipCopyDialogProcedure=`DEFAULT`
   MyClipCopyDialogFont=`DEFAULT`
   MyClipCopyDialogTextColor=`DEFAULT`
   MyClipCopyDialogBackground=`DEFAULT,DEFAULT`
   MyClipCopyDialogConfig=0
   MyClipCopyDialog001=`007,005,074,012,STATICTEXT,DEFAULT,"CDDB Query String",DEFAULT,1,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
   MyClipCopyDialog002=`313,005,044,012,STATICTEXT,DEFAULT,"(c) DD.20010808",DEFAULT,2,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
   MyClipCopyDialog003=`005,017,352,012,EDITBOX,CDDBQueryList,"Edit 1",DEFAULT,3,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
   MyClipCopyDialog004=`007,033,120,012,VARYTEXT,ClipInfo,"Vary 1",DEFAULT,4,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
   MyClipCopyDialog005=`133,033,064,012,PUSHBUTTON,DEFAULT,"Copy to &ClipBoard",11,5,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
   MyClipCopyDialog006=`205,033,064,012,PUSHBUTTON,DEFAULT,"Cl&ose",1,6,32,DEFAULT,DEFAULT,DEFAULT`
   ButtonPushed=Dialog("MyClipCopyDialog")

   CDDBQueryList = CDDBQueryList_save
   Select ButtonPushed
   Case 11
      ClipPut(CDDBQueryList)
      If (CDDBQueryList==ClipGet())
         ClipInfo = "The whole Query String was copied to Clipboard"
      Else
         ClipInfo = ""
      EndIf
      Break
   Case 1
      done = @TRUE
      Break
   EndSelect
EndWhile
DropWild("MyClipCopyDialog*")
Return
;================================================================================================================================


;================================================================================================================================
; Note:
; The rounding formula I've used in CDDBQSC.WBT Version 1.00 was not good in all cases.
; Therefore the calculation formulas were changed in Version 1.01.
; Now we use the known standard vehicle for calculation of TotalLength.
;================================================================================================================================


;================================================================================================================================
; CDA file structure
; Thanks to Wojtek Kaniewski, 1997, wojtekka@logonet.com.pl, published on http://www.wotsit.org
;--------------------------------------------------------------------------------------------------------------------------------
; Offset Length  Offset Length
; 00h    08h     00d    08d     RIFF resource identifier string: "RIFF$".
; 08h    04h     08d    04d     RIFF ID: "CDDA".
; 0ch    04h     12d    04d     Data ID: "fmt ".
; 10h    04h     16d    04d     Length of following block: "18 00 00 00" = 24 byte
; 14h    02h     20d    02d     CDA file version. Currently equals 1.
;                               If it has other value, following data may be out of date.
; 16h    02h     22d    02d     Number of Track.
; 18h    04h     24d    04d     CD disc serial number (the one stored in CDPLAYER.INI).
; 1ch    04h     28d    04d     Beginning of the Track in HSG format.
; 20h    04h     32d    04d     Length of the Track in HSG format.
; 24h    04h     36d    04d     Beginning of the Track in Red-Book format.
; 28h    04h     40d    04d     Length of the Track in Red-Book format.
; 2ch    ---     44d    ---     Total structure size
;--------------------------------------------------------------------------------------------------------------------------------
; Red-book time format
; Offset Length  Description
; 00h    01h     Frame
; 01h    01h     Second
; 02h    01h     Minute
; 03h    01h     not used
;--------------------------------------------------------------------------------------------------------------------------------
; HSG time format               time = minute * 4500 + second * 75 + frame
; Offset Length  Description
; 00h    01h     Frame
; 01h    01h     Second
; 02h    01h     Minute
; 03h    01h     not used
;================================================================================================================================




 
Seite zurück / previous page
links
Seite vor / next page
rechts
 
Kapitel zurück / previous Chapter
zurück
Kapitel vor / next Chapter
vor
 
Seitenanfang/TopOfPage
oben
Seitenende/EndOfPage
unten
DD380700.HTM
DD-Software.CDDBQSC
Add this page to your favorites
Save this document