Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
Delphi XE5 Professional
|
AW: MusicBrainz DiscID
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)
|