[alg] TOC info lezen van audiocd *

Pagina: 1
Acties:
  • 105 views sinds 30-01-2008
  • Reageer

  • TheRebell
  • Registratie: Oktober 2000
  • Laatst online: 22:31
Hoi,

ik ben van plan om mijn, redelijk grote, cd verzameling eens bij te gaan houden. Natuurlijk ben ik lui dus ga ik uren spenderen in een zooi code dat dat voor mij doet :X
Maar het volgende. De bedoeling was om middels een script de tracks van een audio cd te lezen, dit door te sturen naar cddb, en dan die info op te slaan in een db (mysql).

Nu heb ik al ff zitten zoeken mbt het protocol van cddb USE OF CDDB SERVICE IN YOUR SOFTWARE maar hier staat meer een verhaal over cddb precies is en hoe je een cd-id kunt maken.

Het punt is juist dat elke (audio)cd een id heeft. Ahv dit id is de cd bekend bij cddb en krijg je een lijst met tracks terug (oke soms meer maar dat komt doordat er een kleine afwijking kan zitten in je gegenereerde cd-id). Het algoritme voor de cd-id geven ze :) maar hoe lee sje nu de benodigde info uit van de cd?!?!
Het gaat erom dat je de TOC (table of contents) kunt uitlezen waar dit alles in staat..

Is dit uberhaupt wel mogelijk met php of zou ik hiervoor een stuk c-code moeten gebruiken. Ik heb zo geen id hoe ik die TOC zou moeten uitlezen (helaas stond er in de search ook niet veel denderends :( )

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

offtopic:
Ik heb je topictitle even aangepast om de non-php'ers ook even naar dit topic te luren ;)

Ik ben eerlijk gezegd bang dat dit je met PHP niet gaat lukken. Een simpele "right tool for the right job" zegt wel genoeg, denk ik? ;)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • TheRebell
  • Registratie: Oktober 2000
  • Laatst online: 22:31
offtopic:
oke das een goeie ;)


Dat zou tocg erg jammer zijn. Maar hoe zou het dan wel kunnen? En stuk in C ofzo ?? heb wel tijd C gehad alleen mag ik dan wel ff inkomen...
Heeft iemand al wel eens zoiets gedaan of kent iemand juist wél een manier om het trucje voor elkaar te krijgen;) ??

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 12-02 15:52
offtopic:
Een HEEL interessant onderwerp! Ik stapte gelijk af van me internet-paginatje dat ik voor school moet maken :P


[google=ISO 9660 specification] bracht mij hier, een PDF-file waar het ISO-9660 formaat uitgelegd wordt. Als je daarin gaat spitten, en een manier vind om low-level de hardware (CD-ROM-speler) aan te spreken dat ie ook daadwerkelijk de bits van de TOC oplevert, kun je daar een TOC van brouwen. En daar kun je dan weer een CDDB-id van maken, en verder mee doen wat jou leuk lijkt :)
offtopic:
Ik ga hier ook zeker ff door naar kijken (*bookmark deze draad*), omdat het mij vooral interessant lijkt een of ander brouwsel te maken zodat je een directory met MP3tjes kunt inlezen, en dáár een CDDB-id van te bakken en te laten controleren op echtheid. I know, zulke programma's bestaan al (bijv Tag&Rename), bij CDDB gaat het niet meer werken (maar bij freedb.org ofzo wel), maar desalniettemin: het is leuk :D

  • TheRebell
  • Registratie: Oktober 2000
  • Laatst online: 22:31
Hmm als het low-level moet wordt het dus waarschijnlijk, om het vanuit php te blijven doen, een stuk code in C. Moet wel lukken denk ik, ik ga morgen (lees: vandaag) es ff kijken of ik een stuk C in elkaar kan jassen wat iets van dat spul uitleest

Ja oke, er zijn proggies wat je cd leest en connect alleen wil ik het vanuit php gaan doen zodat ik du sniet persé weer dat programma nodig heb. En aangezien ik vaak @ skool zit mag ik ook niet alles installen dusja :(

offtopic:
elviver, hij's gebooked hoor :D

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 12-02 15:52
offtopic:
Juist, bij mij nu ook, net vergeten :P

Misschien kun je het toch vanuit PHP doen.. Als je niet direct de TOC uitleest, maar gewoon naar de inhoud van de CD-bijkt (.cdd-bestanden :?).. Daar de benodigde gegevens voor het CDDB-algoritme uithalen (aantal frames, aantal seconde, aantal minuten right?), en dan daar dus mee verder werken.. Dan zou je dus misschien niet een grote lap C hoeven te schrijven. Maar hoe dit werkt: :?

  • PiepPiep
  • Registratie: Maart 2002
  • Laatst online: 08-06 11:02
Ik heb weleens iets geschreven in dos/c dat mscdex aanspreekt om sectoren in te lezen, misschien kan je daar wat mee?
Ik kan er nu ff niet bij maar ik bookmark :) en plak morgen/straks ochtend ff wat code als ik het nog kan vinden of als ik het opnieuw heb uitgezocht.

Edit :
Welke gegevens heb je nodig voor die internet database? is dat echt een id nummer of de lengte in seconden van alle nummers?

[ Voor 21% gewijzigd door PiepPiep op 11-03-2003 02:00 ]

486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22


  • PiepPiep
  • Registratie: Maart 2002
  • Laatst online: 08-06 11:02
Mijn originele source is eeeeerg onduidelijk zie ik nu :? mja, is ook al een tijdje oud.
Hier stukjes uit de interrupt lijst van ralf brown waar ik alles vandaan heb wat ik doe of denk dat interessant is.

INT 2F - CD-ROM - INSTALLATION CHECK
AX = 1500h
BX = 0000h
Return: BX = number of CD-ROM drive letters used
CX = starting drive letter (0=A:)

INT 2F - CD-ROM - ABSOLUTE DISK READ
AX = 1508h
ES:BX -> buffer
CX = drive number (0=A:)
SI:DI = starting sector number
DX = number of sectors to read
Note: returns error 15h (not ready) under Windows95 if the starting sector
number is less than 10h

INT 2F - CD-ROM - READ VTOC
AX = 1505h
ES:BX -> 2048-byte buffer
CX = drive number (0=A:)
DX = sector index (0=first volume descriptor,1=second,...)

INT 2F - CD-ROM - GET BIBLIOGRAPHIC DOC FILE NAME
AX = 1504h
ES:BX -> 38-byte buffer for name of bibliographic documentation file
CX = drive number (0=A:)

INT 2F - CD-ROM - GET COPYRIGHT FILE NAME
AX = 1502h
ES:BX -> 38-byte buffer for name of copyright file
CX = drive number (0=A:)

Ik heb een filetje gemaakt CD.txt maar die vind ik te groot om hier te posten, ik mail hem naar de TS, wie hem ook wilt hebben moet het ff laten weten aan me.
Hij is 8kB trouwens.

486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

offtopic:
PiepPiep >
Als je 'm even naar mij mailt, zet ik 'm wel ff online (ik neem aan dat je zelf geen webspace hebt?)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Ik vind dit wel een interessant en fraai opgezet alternatief:

http://musicbrainz.org/

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • TheRebell
  • Registratie: Oktober 2000
  • Laatst online: 22:31
hmm, wel een leuke site maar voor zover ik gelezen heb willen ze zoiets doen als wat oa CDDB is...maar dan breder... CDDB leest ahv de cd-id gewoon uit een db de track-info in maar deze MusicBrainz Tagger moet als extra nog dit voor MP3 files doen. Nu op basis van de fingerprint :
he MusicBrainz solution for this is the MusicBrainz Tagger, a Windows application that uses acoustic fingerprints (TRMs) to semiautomatically identify tracks in your music collection and then write clean and accurate metadata to your music files
Zeker niet onaardig maar wat de bedoeling is om hem een audio cd (dus geen MP3) te koppelen aan CDDB en dan de trackinfo op te staan in een DB.

Ik zal nog eens verder kijken, misschien geeft MusicBrainz wel iet swat we kunnen gebruiken.

DRM, heb jij die file van elviver al ergens gezet? Anders gooi ik hem wel ff online (moet ie hem ff mailen naar mij)

oke ik heb de file, helaas zit er hier (op school) zon stom filter op mn mailproggie dus ik up hem vanmiddag ff.

[ Voor 6% gewijzigd door TheRebell op 11-03-2003 11:57 ]


  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
Hier staat hoe je een id berekent, met links naar voorbeeld code voor Linux en windows.

"He took a duck in the face at two hundred and fifty knots."


  • TheRebell
  • Registratie: Oktober 2000
  • Laatst online: 22:31
Ja hoe we dat ID bereken is niet het probleem, dat algoritme hadden we al gevonden (zie 1e post). Het gaat nu juist om het ontbrekende stukje in die zooi C, namelijk het stuk om de TOC uit te lezen...

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
struct toc {
intmin;
intsec;
intframe;
};
struct toc cdtoc[100];
int
read_cdtoc_from_drive(void)
{
/* Do whatever is appropriate to read the TOC of the CD
 * into the cdtoc[] structure array.
 */
return (tot_trks);
}
int
cddb_sum(int n)
{
intret;
/* For backward compatibility this algorithm must not change */
ret = 0;
while (n > 0) {
ret = ret + (n % 10);
n = n / 10;
}
return (ret);
}
unsigned long
cddb_discid(int tot_trks)
{
inti,
t = 0,
n = 0;
/* For backward compatibility this algorithm must not change */
i = 0;
while (i < tot_trks) {
n = n + cddb_sum((cdtoc[i].min * 60) + cdtoc[i].sec);
i++;
}
t = ((cdtoc[tot_trks].min * 60) + cdtoc[tot_trks].sec) -
    ((cdtoc[0].min * 60) + cdtoc[0].sec);
return ((n % 0xff) << 24 | t << 8 | tot_trks);
}
main()
{
int tot_trks;
tot_trks = read_cdtoc_from_drive();
printf("The discid is %08x", cddb_discid(tot_trks));
}


Als we dat weten dan zouden we dr, in principe, zijn.... Dan moet alleen nog de connectie naar CDDB/FreeDB en de verdere afhandeling..

  • PiepPiep
  • Registratie: Maart 2002
  • Laatst online: 08-06 11:02
Hmz.. dat stukje C kan ik niets van maken :?
Wat is er nou nog precies nodig?
Je hebt dus een id nodig van een CD, als ik de code een beetje volg is dat dus een getal, int om precies te zijn.
Als ik het nog verder goed volg is alles wat je wilt weten hoeveel minuten en seconden elk nummer duurt, klopt dit?
Dus stel ik heb een cd met 5 nummers wil je deze getallen bv hebben :
4 48
3 57
5 34
5 31
4 56
En met deze nummers kan je een uniek getal berekenen wat in de database staat.

486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22


  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
TheRebell schreef op 11 March 2003 @ 15:40:
Ja hoe we dat ID bereken is niet het probleem, dat algoritme hadden we al gevonden (zie 1e post). Het gaat nu juist om het ontbrekende stukje in die zooi C, namelijk het stuk om de TOC uit te lezen...
Op de link die ik je gaf wordt verwezen naar voorbeeld programma's. Als we daar kijken:
Windows

DiscID Calculator: This little tool by Luc Vigato calculates the disc ID for any CD, using ASPI to access the drive. A dll and the sourcecode are also available.

cddbidgen: A commandline disc ID calculator from Andy Key using ASPI, SCSI Passtrough and IOCTL_CDROM (depending on what's available on the system). The sourcecode is included in the package.
Dus misschien kun je de sourcecode van deze programma's eens bekijken.
Dan moet alleen nog de connectie naar CDDB/FreeDB en de verdere afhandeling..
Op de download pagina staat ook een php script met functies voor de verbinding met een cddb/freedb server.

[ Voor 25% gewijzigd door _Squatt_ op 11-03-2003 16:16 ]

"He took a duck in the face at two hundred and fifty knots."


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 20-08 00:10
Op de FreeDB website (freedb.org) staat veel informatie onder het kopje "developers". Behalve uitleg, staan er ook links naar applicaties (waarvan sommige met broncode) die de besproken methoden implementeren. Daarin is ook te vinden hoe je de TOC uitleest met ASPI drivers onder Windows, bijvoorbeeld (wat me de bedoeling lijkt?).

Verder zou je eens kunnen zoeken naar ASPI documentatie. De MSDN website lijkt me daarbij een goed begin; het lijkt me sterk dat daar geen hoofdstuk over ASPI op staat.

  • TheRebell
  • Registratie: Oktober 2000
  • Laatst online: 22:31
Ik zal vanavond eens ff gaan kijken naar de source code van wat programma's. Daar zou het wel in moeten staan ja lijkt me, thnx _Squatt_

Ik heb hier nog het hele bestandje staan van PiepPiep (sorry O+ )

Nou het hoeft dus niet persé voor Windows te zijn. Het gaat web-based dus zou ook onder bv linux moeten werken maar voornamelijk zal het windows worden. Ik gebruik alleen liever geen windows-only trucjes...

[ Voor 6% gewijzigd door TheRebell op 12-03-2003 00:52 ]


  • PiepPiep
  • Registratie: Maart 2002
  • Laatst online: 08-06 11:02
TheRebell schreef op 11 March 2003 @ 17:53:
Ik heb hier nog het hele bestandje staan van Elviver
Van PiepPiep :)

Ik ben er nu trouwens bijna, met cddbidgen een id berekent van een muziek cd en zonder api's heb ik al 6 van 8 van de id digits goed
FF nog wat opzoeken, verbeteren, en dan post ik me oplossing.

486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 20-08 00:10
Ik vrees dat je voor het uitlezen van de CD-informatie niet ontkomt aan een besturingssysteem-specifieke oplossing. Voor zover ik weet is er geen portable API waarmee je dit zou kunnen doen.

  • PiepPiep
  • Registratie: Maart 2002
  • Laatst online: 08-06 11:02
Afgezien van een file openen en eventueel zoeken naar files heb ik meer niet nodig, mist je op de cd files ziet met TRACKxx.CDA
Ik weet niet of je die alleen zo ziet in windows of ook in andere OS'en, maar met die files van 44 bytes per stuk kan je de CDID berekenen.
De word op offset 32 is namelijk de lengte van die track in frames, er gaan 75 frames in een seconde.
De cd begint met 2 seconden, 150 frames 'stilte' waar je ook rekening mee moet houden.
Nu krijg je in pseudo code :

int w1=0, w2=150, w3=0, huidigframe=150
ga alle TRACKxx.CDA files af, begin met het laagste nummer en telkens 1 hoger
{
lees lengte in frames, word op offset 32 dus
w1 += digits van (w2/75) bijelkaar opgetelt
w2 += lengte in frames
verhoog w3 met 1
}
w1 = w1 modulo 255 (dus de rest van de deling door 255)
w2 = (w2 - 150) / 75

zet nu w1, w2, w3 in hexadecimaal, w1 in 2 digits, w2 in 4 digits, w3 in 2 digits.
Plak deze aanelkaar en je hebt de CDID

486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22


  • TheRebell
  • Registratie: Oktober 2000
  • Laatst online: 22:31
Zeg PiepPiep, in welke taal heb je al zoiets voor elkaar dan? Omdat het via PHP zou moeten ben ik dus hiermee aan het klooien met alle mogelijke manieren om die bytes (lengte) te krijgen, en dus niet die 44 bytes van de .cda Wil alleen niet echt lukken :(

Dacht misschien via dio_open() maar dat snapt mn server niet :?, zou vanag 4.2.0 moeten lukken (draai 4.2.3)

Ik heb ook al een perl script ff zitten uitpluizen maar ook hierin gaat het voornamelijk wee rom dat algoritme voor de CD-ID maar niet om de TOC uit te lezen :'(

  • PiepPiep
  • Registratie: Maart 2002
  • Laatst online: 08-06 11:02
Jaaaaa, duurde ff om me page te update met de source erop, maar kijk op
http://home.planet.nl/~burg0484
daar staat heeeelemaal onderaan :) een zipje waar de source inzit en een compiled versie ook.

486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Hmm, ik ben nu geloof ik een beetje laat met mijn linkje :D

maar ik heb wel zo'n flauw vermoeden dat deze 't langst blijft staan ;)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • TheRebell
  • Registratie: Oktober 2000
  • Laatst online: 22:31
drm schreef op 11 March 2003 @ 23:42:
Hmm, ik ben nu geloof ik een beetje laat met mijn linkje :D

maar ik heb wel zo'n flauw vermoeden dat deze 't langst blijft staan ;)
..en hoezo dat? ;)

  • littledreamer
  • Registratie: Juni 2002
  • Laatst online: 15-08-2025

littledreamer

Dingen enzo!

het is inmiddels een tijdje geleden :)
maar ik zat te zoeken naar het zelfde 'systeempje' als de topicstarter

is dit inmiddels al gelukt? en zo ja, zou iemand het even kunnen toelichten?

alvast bedankt!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 20-08 00:10
Het originele probleem was besturingssysteemafhankelijk; dat is niet veranderd. Onder Windows zijn er verschillende CD-ROM API's beschikbaar (ASPI, etc.) en ook libraries die daarvan gebruik maken om de TOC uit te lezen. Onder UNIX-achtige systemen is de TOC te vinden als configuratieparameter van het CD-rom device; een mooi (portable) klein voorbeeld van hoe je daarmee discid's kunt genereren, is de cd-discid utillity.

  • PiepPiep
  • Registratie: Maart 2002
  • Laatst online: 08-06 11:02
Mijn oplossing was niet besturingssysteemafhankelijk toch? onder linux zie je toch ook files van 44 bytes op een audio cd staan?
Ik kon namelijk de cddb checksum berekenen met die files.

486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22


  • littledreamer
  • Registratie: Juni 2002
  • Laatst online: 15-08-2025

littledreamer

Dingen enzo!

Soultaker schreef op 14 October 2003 @ 12:21:
Het originele probleem was besturingssysteemafhankelijk; dat is niet veranderd. Onder Windows zijn er verschillende CD-ROM API's beschikbaar (ASPI, etc.) en ook libraries die daarvan gebruik maken om de TOC uit te lezen. Onder UNIX-achtige systemen is de TOC te vinden als configuratieparameter van het CD-rom device; een mooi (portable) klein voorbeeld van hoe je daarmee discid's kunt genereren, is de cd-discid utillity.
Oke, dat het uitlezen al 'geslaagd' was had ik al begrepen uit bovenstaande berichten. Maar is het direct in de database plaatsen inmiddels al gelukt, zoals topicstarter van plan was?

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 20-08 00:10
xingrs schreef op 14 October 2003 @ 13:58:
Oke, dat het uitlezen al 'geslaagd' was had ik al begrepen uit bovenstaande berichten. Maar is het direct in de database plaatsen inmiddels al gelukt, zoals topicstarter van plan was?
Oh, dat weet ik verder niet. Daar ging het topic ook niet echt over. ;)
PiepPiep schreef op 14 October 2003 @ 13:12:
Mijn oplossing was niet besturingssysteemafhankelijk toch? onder linux zie je toch ook files van 44 bytes op een audio cd staan?
Ik kon namelijk de cddb checksum berekenen met die files.
Hmm, ik heb zelf die track filetjes alleen onder Windows gezien. Ik weet onder BSD alleen hoe ik een ISO9660 filesystem moet mounten en dat kan dus niet met audio CD's. Voor zover ik weet zijn die track filetjes dus een uitvinding van Microsoft, maar ik kan me vergissen.

  • littledreamer
  • Registratie: Juni 2002
  • Laatst online: 15-08-2025

littledreamer

Dingen enzo!

Soultaker schreef op 14 October 2003 @ 14:11:
[...]

Oh, dat weet ik verder niet. Daar ging het topic ook niet echt over. ;)
Ik dacht toch echt dat de topicstarter het hier ook over had hoor ;) :P
TheRebell schreef op 10 March 2003 @ 23:40:
De bedoeling was om middels een script de tracks van een audio cd te lezen, dit door te sturen naar cddb, en dan die info op te slaan in een db (mysql)
maar niemand die hier verder een antwoord op heeft? als het idee van de topicstarter werkt, ben ik hier ook zeer geinteresseerd in namelijk

  • littledreamer
  • Registratie: Juni 2002
  • Laatst online: 15-08-2025

littledreamer

Dingen enzo!

niemand? :/

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 20-08 00:10
xingrs schreef op 14 October 2003 @ 14:45:
maar niemand die hier verder een antwoord op heeft? als het idee van de topicstarter werkt, ben ik hier ook zeer geinteresseerd in namelijk
Wat wil je dan precies doen/weten? Het uitvinden van de DiscID is uitgebreid beschreven in dit topic. Met die DiscID de gegevens van de CD opzoeken staat in de CDDB documentatie (zie topic start voor een link). Het opslaan van de gegevens in MySQL, tenslotte, lijkt me simpel, maar hoe het precies gaat is afhankelijk van de gebruikte taal en API.
Pagina: 1