Einzelnen Beitrag anzeigen

Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.334 Beiträge
 
Delphi XE5 Professional
 
#4

AW: MusicBrainz DiscID

  Alt 27. Apr 2012, 08:20
Hallo Sir Rufo,

ich musste feststellen, dass es unwichtig ist, ob der String im ganzen oder in Teilen übergeben wird.

Das Auffüllen auf 99 Tracks habe ich übersehen.
Wobei das Codebeispiel auch falsch sein dürfte. Darin fehlt das Lead-out track offset.

Wie ich sehe, habe ich auch nicht das Lead-Out sondern die Spieldauer der CD genommen. Aber mit
Delphi-Quellcode:
  SHA1Init(Context);

  temp := Format('%2.2x', [fCD.FirstTrack]);
  SHA1Update(Context,@temp[1],length(temp));

  temp := Format('%2.2x', [fCD.LastTrack]);
  SHA1Update(Context,@temp[1],length(temp));

  temp := Format('%8.8x', [msf2frames(fCD.LeadOut)]);
  SHA1Update(Context,@temp[1],length(temp));

  for i := 0 to 99
  do begin
    if i < Length(fCD.Track)
    then temp := Format('%8.8x', [msf2frames(fCD.Track[i].Start)])
    else temp := Format('%8.8x', [0]);
    SHA1Update(Context,@temp[1],length(temp));
  end;

  SHA1Final(Context, Digest);
Delphi-Quellcode:
function msf2frames(addr: TAddr): Cardinal;
begin
  Result := (((addr[1] * 60) + addr[2]) * 75) + addr[3];
end;
bekomme ich leider immer noch nicht den richtigen Wert.

In der disc.c befindet sich die Erstellung der DiscID:
Code:
242    static void create_disc_id(mb_disc_private *d, char buf[]) {
243        SHA_INFO   sha;
244        unsigned char  digest[20], *base64;
245        unsigned long  size;
246        char       tmp[17]; /* for 8 hex digits (16 to avoid trouble) */
247        int    i;
248    
249        assert( d != NULL );
250    
251        sha_init(&sha);
252    
253        sprintf(tmp, "%02X", d->first_track_num);
254        sha_update(&sha, (unsigned char *) tmp, strlen(tmp));
255    
256        sprintf(tmp, "%02X", d->last_track_num);
257        sha_update(&sha, (unsigned char *) tmp, strlen(tmp));
258    
259        for (i = 0; i < 100; i++) {
260            sprintf(tmp, "%08X", d->track_offsets[i]);
261            sha_update(&sha, (unsigned char *) tmp, strlen(tmp));
262        }
263    
264        sha_final(digest, &sha);
265    
266        base64 = rfc822_binary(digest, sizeof(digest), &size);
267    
268        memcpy(buf, base64, size);
269        buf[size] = '\0';
270    
271        free(base64);
272    }
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof

Geändert von Garfield (27. Apr 2012 um 08:51 Uhr)
  Mit Zitat antworten Zitat