bug in cddb discid calculation ?

Christian Esken esken at kde.org
Mon May 19 23:45:38 BST 2003

```On Sunday 11 May 2003 23:52, Alexander Neundorf wrote:
> The reason seems to be line 67:
>
>     unsigned int l = (list[numTracks + 1] + 1) / 75;
>     l -= list[numTracks] / 75;
>
> I changed it to
>     l -= list[0] / 75;
>
> and now it works.

I have seen that it is not in CVS. You should commit it, because it is (most
likely)  correct. I verified this with my own algorithm I wrote a year ago. I
followed the Specs as published by the FreeDB project. You see below in my
code that I am taking the leadout track and subtracting the first track:

unsigned long cdaccess::calcDiscID() {
unsigned int i;
int t = 0;
int n = 0;

i = 0;

while (i < i_trackcount) {
n = n + cddb_sum((i_tracks[i].i_min * 60) + i_tracks[i].i_sec);
i++;
}

// !!! Here is the crucial part, that interests us today !!!
((i_tracks[0].i_min * 60) + i_tracks[0].i_sec);

return ((n % 0xff) << 24 | t << 8 | i_trackcount);
}

// function cddb_sum() has been taken over 100% from FreeDB example code
int cddb_sum(int n)
{
int     ret;

/* For backward compatibility this algorithm must not change */

ret = 0;

while (n > 0) {
ret = ret + (n % 10);
n = n / 10;
}

return (ret);
}

Apart from that I see that we only differ in the location of the division by
75. I am storing it in my list while you do it in the algoritm itself. But
this should not matter.

> list[numTracks] is this strange "disc start" value, list[0] is the start
> frame of the first track.
> I think the code should be changed to not include this useless (?) "disc
> start" in the list and use the start frame of the first track instead.