diff -urN mcd-0.2/cddev.c mcd-0.2a/cddev.c --- mcd-0.2/cddev.c Thu Jul 12 02:19:06 2001 +++ mcd-0.2a/cddev.c Sun Jul 22 02:52:23 2001 @@ -20,37 +20,6 @@ /* GLOBAL */ -/* looks a bit strange, but is a really simple (inefficient) thought */ -/* generates new t[i].rnd */ -void cd_initshuffle(struct mcd *cd) { - register unsigned seed; - int i; - - seed=(unsigned)time(NULL); - for (i=1;i<=cd->title[1];i++) { /* title[1]==last */ - seed+=i;srand(seed); /* stupid seed :P */ - cd->t[i].rnd=1+(int)((double)cd->title[1]*rand()/(RAND_MAX+1.)); - /* is number already given ? */ - for (cd->t[0].rnd=1;cd->t[0].rndt[0].rnd++) { /* t[0].rnd is count */ - /* if so, break out and do it again */ - if (cd->t[i].rnd==cd->t[cd->t[0].rnd].rnd) --i; - } - } - return; -} - -void cd_randomize(struct mcd *cd) { - register int i; - struct track h[MCD_CDAUDIO_MAX+1]; - for (i=1;i<=cd->title[1];i++) h[i]=cd->t[i]; /* be sure */ - if (cd->method==M_SHUFFLE) { - for (i=1;i<=cd->title[1];i++) {cd->t[h[i].rnd]=h[i];} - } else { - for (i=1;i<=cd->title[1];i++) {cd->t[h[i].nr]=h[i];} - } - return; -} - int cd_init(const char *cdpath, struct mcd *cd) { cd->fd=open(cdpath,O_RDONLY|O_NONBLOCK); if (cd->fd<0) return -1; @@ -59,11 +28,10 @@ return 0; } -/* needs correct cd->fd; seems very efficient (no division qnd such) */ +/* needs correct cd->fd; seems efficient to me :) */ int cd_readtracks(struct mcd *cd) { - int i, sec, frame; - struct track tmp[MCD_CDAUDIO_MAX]; /* Tmp Stuff */ - struct cdrom_tochdr cdth; /* TocHdr Stuff */ + struct cdrom_tochdr cdth; /* TocHdr Stuff */ + int i, sec; if (ioctl(cd->fd, CDROMREADTOCHDR, &cdth)<0) { draw_status("can't read disc",1); @@ -77,14 +45,12 @@ draw_status("can't read disc",1); return -1; } else { - cd->t[i].nr=i; - cd->t[i].audio=cd->cdte[i].cdte_ctrl & CDROM_DATA_TRACK; - tmp[i].min=cd->cdte[i].cdte_addr.msf.minute; - tmp[i].sec=cd->cdte[i].cdte_addr.msf.second; - frame=cd->cdte[i].cdte_addr.msf.frame; - cd->t[i-1].min=tmp[i].min-tmp[i-1].min; - sec=(cd->t[i-1].sec=tmp[i].sec-tmp[i-1].sec); - if (frame>37) cd->t[i-1].sec++; /* rounding a bit :) */ + cd->t[i].nr=i; /* for reordering after shuffle */ + cd->t[i].audio = cd->cdte[i].cdte_ctrl & CDROM_DATA_TRACK; + cd->t[i-1].min=cd->cdte[i].cdte_addr.msf.minute- + cd->cdte[i-1].cdte_addr.msf.minute; + sec=(cd->t[i-1].sec=cd->t[i].sec - cd->t[i-1].sec); + if (cd->cdte[i].cdte_addr.msf.frame>37) cd->t[i-1].sec++; /* rounding a bit :) */ if (sec<0) { cd->t[i-1].min--;cd->t[i-1].sec+=60; } @@ -98,13 +64,12 @@ return -1; } else { cd->t[i].nr=i; - cd->t[0].audio=cd->cdte[0].cdte_ctrl & CDROM_DATA_TRACK; - cd->t[0].min=cd->cdte[0].cdte_addr.msf.minute; - cd->t[0].sec=cd->cdte[0].cdte_addr.msf.second; - frame=cd->cdte[0].cdte_addr.msf.frame; - cd->t[i-1].min=cd->t[0].min-tmp[i-1].min; - sec=(cd->t[i-1].sec=cd->t[0].sec-tmp[i-1].sec); - if (frame>37) cd->t[i-1].sec++; /* rounding a bit :) */ + cd->t[0].audio = cd->cdte[0].cdte_ctrl & CDROM_DATA_TRACK; + cd->t[0].min = cd->cdte[0].cdte_addr.msf.minute; + cd->t[0].sec = cd->cdte[0].cdte_addr.msf.second; + cd->t[i-1].min=cd->t[0].min - cd->t[i-1].min; + sec=(cd->t[i-1].sec=cd->t[0].sec - cd->t[i-1].sec); + if (cd->cdte[0].cdte_addr.msf.frame>37) cd->t[i-1].sec++; /* rounding a bit :) */ if (sec<0) { cd->t[i-1].min--;cd->t[i-1].sec+=60; } diff -urN mcd-0.2/doc/README mcd-0.2a/doc/README --- mcd-0.2/doc/README Thu Jul 12 23:50:54 2001 +++ mcd-0.2a/doc/README Sun Jul 22 04:19:38 2001 @@ -2,24 +2,26 @@ WHAT IS IT =========== -- mcd (0.2) is a small (maybe the smallest) cd-player for _linux_ +- mcd (0.2a) is a small (maybe the smallest) cd-player for _linux_ - it should compile/run out off the box - it compiles against dietlibc (12kb static!) - working play methods: reapeat cd, repeat track and intro (@ some time shuffle) + REQUIREMENTS ============== -- linux >=2.2 -- /usr/include/termios.h (tcgetattr(),...) +- linux >= 2.2 +- some simple libc (glibc/dietlibc/...) +- a cdrom (of cause, with a cable to your soundcard) COPYING ========= -Copyright (C) 2000 Tino Reichardt +Copyright (C) 2001 Tino Reichardt This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -45,8 +47,8 @@ to catch the SIGWINCH signal !!! (btw: a new rewrite of the midnight commander will be my next project ...) - maybe some things of the wishlist... if someone ask me, i will do it, but for - now, this (mcd-0.2) is the stable release of mcd ! -- shuffle isn't really inclued yet !!!!! + now, this (mcd-0.2a) is the stable release of mcd ! + WISHLIST @@ -54,6 +56,8 @@ - CD-Text (i like this!) - maybe cddb (i don't like it much!) +- shuffle isn't really done yet, it is now in my private 0.3 version :) + HOMEPAGE diff -urN mcd-0.2/doc/README.de mcd-0.2a/doc/README.de --- mcd-0.2/doc/README.de Sun Jul 8 15:07:37 2001 +++ mcd-0.2a/doc/README.de Thu Jan 1 01:00:00 1970 @@ -1,102 +0,0 @@ -siehe README !!! - - - -Technisches: - - -CD-DA Standard alias RedBook -============================ - -Der Standard der Audio-CD (CD-DA) wurde also 1982 von Philips und Sony im -RedBook definiert. Die maximale Spielzeit einer 12cm-CD beträgt 74 Minuten und -33 Sekunden, eine 8cm Single-CD hat eine Laufzeit von etwa 21 Minuten. Auf -einer CD können bis zu 99 Tracks direkt von einem CD-Player adressiert werden, -wobei ein Track mindestens 4 Sekunden lang sein muß. Die maximale Länge eines -Tracks wird nur von der Länge der CD begrenzt. Einem Musikstück wird auf einer -CD-DA ein Track zugeordnet. - -Die Audio-Daten einer CD-DA liegen grundsätzlich im PCM-Format vor. -Der Aufbau einer CD gestaltet sich nun wie folgt. Generell -muß der Audio-Datenstrom einer CD mit einem Mechanismus zur Fehlererkennung -und Korrektur ausgestattet werden, sodaß eine gewisse Toleranz bei der -Signal-Umwandlung gewährleistet ist. Bei CD-DA wird dabei ein Cross Interleave -Reed-Solomon Code (CIRC) eingesetzt. Man nimmt also eine kleine Portion -der Audio-Daten und versieht diese mit dem Fehlererkennungs- und --korrektur-Code. - -Diese kleine Portion ist mit 6 32-Bit-Samples bestimmt, was einer -Audio-Datenmenge von 192 Bits entspricht. Diese Daten werden nun mit 64 CIRC -Parity Bits, 8 Subcode Bits und 24 Sync-Bits erweitert, sodaß unsere Portion -288 Bits breit ist. Eine solche Daten-Portion wird Frame genannt. 98 solcher -Frames werden zu einem Block> oder auch Sektor zusammengefaßt. Bei einer -Abtastrate von 44.1 kHz ergibt sich somit eine Framerate von 44.100 / 6 = -7.350 Frames pro Sekunde. Zuguterletzt ergibt sich weiters die sog. Subcode -block rate mit 7.350 / 98 = 75 Blocks pro Sekunde. Insgesammt werden für eine -Sekunde der CD 2.116.800 Bits bzw. 264.600 Byte benötigt, wovon 176.400 Byte -Audio-Daten sind. Dies resultiert also in einer Übertragungsrate von 1.411.200 -Bit/Sekunde (1.41 Mbit/sec). - -Betrachten wir die Einteilung der Daten in einem Block bzw. Sektor noch etwas -genauer. Da ein Block aus 98 Frames besteht, transportiert jeder Block 2.352 -Bytes Nutzdaten, in diesem Fall reine Audio-Daten. Dazu kommen noch 882 Bytes -für die beiden Ebenen des Fehlererkennungs- und -korrektur-Codes von CIRC -(784) und die Kontroll-Bytes (98) sowie die Sync-Reihe mit 294 Bytes. Ein -Block umfaßt also insgesammt 3.528 Bytes. Interessant sind hier vorallem die -Kontrollbytes. Jedem Bit eines Kontroll-Bytes wird ein Buchstabe zugewiesen, -"P", "Q", "R", "S", "T", "U", "V" und "W". Das erste Bit wird mit "P" -bezeichnet, das zweite mit "Q" und so weiter. Der Datenstrom bestehend aus -allen ersten Bits der 98 Kontroll-Bytes wird P-Subchannel genannt. Analog dazu -bezeichnet man den Datenstrom aller zweiten Bits mit Q-Subchannel. Der dritte -Datenstrom kombiniert die restlichen Bits "R", "S", "T", "U", "V" und "W" zu -einem 6-Bit Wort und wird "R bis W"-Subchannel genannt. - -Der P-Subchannel enthält ein Flag (on/off), wenn ein Track beginnt. Der -Q-Subchannel besteht aus den Zeitmarkierungen für die absolute und die -relative Zeit. Im Lead-In enthält dieser Subchannel den Inhalt der CD (Table -of contents, TOC). 72 der 98 Bits des Q-Subchannels werden für Informationen, -der Rest zur Synchronisation, Kontrolle und Fehlerkorrektur der Subchannels -genutzt. Neben den Bits für die Synchronisation, Kontrolle und Fehlerkorrektur -kann der "R bis W"-Subchannel Benutzerdaten für zusätzliche Informationen -enthalten (64 6-Bit Worte pro Block). - -So, nach soviel Zahlen- und Bit-Theorie machen wir uns an etwas handfesteres - -die Adressierung von Tracks einer CD. Jeder Track auf einer CD wird -grundsätzlich durch die Angabe von Minuten, Sekunden und Sektoren genau -adressiert. Daraus ergibt sich ein interessanter Nebeneffekt bei der -Berechnung der Spieldauer eines Tracks. Um nicht in die Verlegenheit zu -geraten, sehr breite Fließkommazahlen im TOC einer CD zu halten, werden -Zeitangaben in Minuten und Sekunden geführt. Natürlich geht sich nicht jeder -Track auf eine ganze Sekundenzahl aus. In diesem Fall wird der verbleibende -Rest in Sektoren angegeben. Da eine Sekunde wie bereits eingangs erklärt in 75 -Sektoren unterteilt wird, ergibt sich eine Genauigkeit von 0.01 Sekunden. - -Wie zu Beginn dieses Abschnittes bereits erwähnt muß jeder Track mindestens 4 -Sekunden lang sein. Diese Mindestlänge entspricht 300 Sektoren. Diesen Betrag -an Sektoren teilen sich auch der Lead-In und Lead-Out, sodaß der erste Track -beim Sektor 150 beginnt. Längenangaben können grundsätzlich auch in Sektoren -gemacht werden. - - --> cd-extra cd's - - eine mixed-mode cd mit 2 sessions - - 1. session == alle audio tracks (weil cd-player nur 1.lesen) - - 2. session == alle daten - --> mixed-mode cd's - - 1. track daten + 2-XX track == audio (nachfolger von cd-extra) - - ... - --> cd-text - - in den subchannels r+w drinne - - subchannel q enthält z.b. verzeichnisstruktur.... - - information @ftp://ftp.t10.org/t10/drafts/mmc2/mmc2r11a.pdf (last pages) - - --> subchannels - - P/Q/R/S/T/U/V/W mit je max. 4MB - - P/Q/R/W werden mehr oder weniger genutzt - --- -Tino Reichardt -+ Stuff from http://www.all4freaks.org/ diff -urN mcd-0.2/draw.c mcd-0.2a/draw.c --- mcd-0.2/draw.c Thu Jul 12 02:45:16 2001 +++ mcd-0.2a/draw.c Sun Jul 22 02:54:19 2001 @@ -30,7 +30,6 @@ return; } - static void draw_method(char *msg) { gotoxy(11,5); _printf(C_STATUS "%s" C_NORMAL, msg); @@ -45,7 +44,7 @@ register int i=1,m=1; /* title/modifier/realtitle */ int y=0,x=0; /* x,y==diffs to real */ - for (i=1;(i<=cd->title[1] && i<=99); i++) { + for (i=1;(i<=cd->title[1] && i<=MCD_CDAUDIO_MAX); i++) { m=((i-(pluskey+1)*10)<0 && (i-(pluskey+1)*10)>-11); /* is shortcut? */ if (i%(maxy-10)==0) {y=-i;x+=15;} /* bottom reached, horiz. isn't checked! */ gotoxy(3+x,10+i+y); @@ -112,9 +111,7 @@ if ((cd->title[1]=cd_readtracks(&cd[0]))<1) { draw_status("can't read tracks",1);return; } - /* last, but not least, init the shuffle tracks */ draw_initscr(); - cd_initshuffle(&cd[0]); updates[U_TRACKS]=updates[U_STATUS]=updates[U_METHOD]=updates[U_VOLUME]=1; updates[U_ALL]=0; } @@ -131,14 +128,10 @@ } if (updates[U_METHOD]) { - if (cd->method==M_SHUFFLE) { - cd_randomize(&cd[0]); updates[U_TRACKS]=1; /* shuffle in */ - } draw_method( (cd->method==M_PLAY_CD) ? "play cd ":"" && (cd->method==M_REPEAT_CD) ? "repeat cd ":"" && (cd->method==M_REPEAT_TRK) ? "repeat track":"" && - (cd->method==M_SHUFFLE) ? "shuffle ":"" && (cd->method==M_INTRO) ? "intro ":""); updates[U_METHOD]=0; } diff -urN mcd-0.2/mcd.1 mcd-0.2a/mcd.1 --- mcd-0.2/mcd.1 Thu Jul 12 00:50:27 2001 +++ mcd-0.2a/mcd.1 Sun Jul 22 03:00:26 2001 @@ -1,5 +1,5 @@ .\" Tino Reichardt -.TH MCD 1 "2001-07-10" "" "User commands" +.TH MCD 1 "2001-07-22" "mcd-0.2a" "User commands" .SH "NAME" mcd \- a small cdplayer for linux .SH "SYNOPSIS" @@ -11,21 +11,23 @@ .TS tab (@); l l. +KEY@DESCRIPTION +@ #@play track number # (0,1..9) cursor up@fast forward cursor right@slow forward cursor left@slow rewind cursor down@fast rewind -@change volume (-/+) -+/-@change trackmodifier (+/-) space@next track b/B@previous track -M/m@change playmethod (-/+) S/s@toggle start/stop P/p@toggle pause/resume E/e@eject cdrom device C/c@close cdrom device -R/r@redraw screen and reinit shuffle +R/r@redraw screen +M/m@change playmethod (-/+) ++/-@change trackmodifier (+/-) +@change audio volume of cdrom device (-/+) Q/q@quit mcd .TE .SH "RETURN VALUE" @@ -44,3 +46,7 @@ .B linux, .B xterm, .B xterm-color +.SH "AUTHOR" +Tino Reichardt +.PP +Homepage: http://www.mcmilk.de/projects/mcd/ diff -urN mcd-0.2/mcd.c mcd-0.2a/mcd.c --- mcd-0.2/mcd.c Thu Jul 12 02:44:53 2001 +++ mcd-0.2a/mcd.c Sun Jul 22 02:43:44 2001 @@ -59,23 +59,11 @@ updates[U_ALL]=1; break; case 'm': - if (cd->method==M_SHUFFLE) { /* out of shuffle */ - cd->method++; - cd_randomize(&cd[0]); - updates[U_TRACKS]=updates[U_METHOD]=1; - break; - } if (cd->methodmethod++; else cd->method=M_PLAY_CD; updates[U_TRACKS]=updates[U_METHOD]=1; break; case 'M': - if (cd->method==M_SHUFFLE) { /* out of shuffle */ - cd->method--; - cd_randomize(&cd[0]); - updates[U_TRACKS]=updates[U_METHOD]=1; - break; - } if (cd->method>M_PLAY_CD) cd->method--; else cd->method=M_INTRO; updates[U_METHOD]=1; diff -urN mcd-0.2/mcd.h mcd-0.2a/mcd.h --- mcd-0.2/mcd.h Thu Jul 12 02:23:14 2001 +++ mcd-0.2a/mcd.h Sun Jul 22 04:22:59 2001 @@ -24,28 +24,25 @@ #include "params.h" -#define MCD_VERSION "0.2" +#define MCD_VERSION "0.2a" /* METHODS (don't change!) */ -#define M_PLAY_CD 0 /* play whole cd and stop */ -#define M_REPEAT_CD 1 /* play whole cd in endless-loop */ -#define M_REPEAT_TRK 2 /* play current track in endless-loop */ -#define M_SHUFFLE 3 /* play some random tracks */ -#define M_INTRO 4 /* play first ten seconds of each track and stop */ +#define M_PLAY_CD 0 /* play whole cd and stop */ +#define M_REPEAT_CD 1 /* play whole cd in endless-loop */ +#define M_REPEAT_TRK 2 /* play current track in endless-loop */ +#define M_INTRO 3 /* play first ten seconds of each track and stop */ /* for selected refresh (times are always refr..) */ #define U_STATUS 0 /* only titles are updated */ #define U_METHOD 1 /* status-method is updated */ #define U_VOLUME 2 /* status-volume is updated */ #define U_TRACKS 3 /* all tracks are updated */ -#define U_CDCHANGER 4 /* ... reserved */ -#define U_ALL 5 /* really ALL is updated */ +#define U_ALL 4 /* really ALL is updated */ /* ***** */ /* mcd.c */ struct track { int nr; /* title number */ - int rnd; /* random title */ int audio; /* current track is audio */ int sec; /* seconds of current title */ int min; /* minutes of current title */ diff -urN mcd-0.2/params.h mcd-0.2a/params.h --- mcd-0.2/params.h Wed Jul 11 11:18:54 2001 +++ mcd-0.2a/params.h Sun Jul 22 04:18:35 2001 @@ -26,31 +26,31 @@ */ /* needed */ -#define T_NORMAL "\033[0m" /* normal mode */ -#define T_BOLD "\033[1m" /* bold mode */ -#define T_HOME "\033[H" /* goto 0,0 */ -#define T_CLEAR "\033[2J" /* clear screen */ -#define T_GOTO_XY "\033[%d;%dH" /* goto x,y position (%d=int) */ +#define T_NORMAL "\033[0m" /* normal mode */ +#define T_BOLD "\033[1m" /* bold mode */ +#define T_HOME "\033[H" /* goto 0,0 */ +#define T_CLEAR "\033[2J" /* clear screen */ +#define T_GOTO_XY "\033[%d;%dH" /* goto x,y position (%d=int) */ /* box drawing */ -#define AC_TL "\016l\017" /* top left */ -#define AC_TR "\016k\017" /* top right */ -#define AC_BL "\016m\017" /* bottom left */ -#define AC_BR "\016j\017" /* bottom right */ -#define AC_MT "\016v\017" /* top 2middle */ -#define AC_MB "\016w\017" /* bottom 2middle */ -#define AC_ML "\016t\017" /* left 2middle */ -#define AC_MR "\016u\017" /* right 2middle */ -#define AC_MM "\016n\017" /* middle + */ -#define AC_HL "\016q\017" /* hline - */ -#define AC_VL "\016x\017" /* vline | */ +#define AC_TL "\016l\017" /* top left */ +#define AC_TR "\016k\017" /* top right */ +#define AC_BL "\016m\017" /* bottom left */ +#define AC_BR "\016j\017" /* bottom right */ +#define AC_MT "\016v\017" /* top 2middle */ +#define AC_MB "\016w\017" /* bottom 2middle */ +#define AC_ML "\016t\017" /* left 2middle */ +#define AC_MR "\016u\017" /* right 2middle */ +#define AC_MM "\016n\017" /* middle + */ +#define AC_HL "\016q\017" /* hline - */ +#define AC_VL "\016x\017" /* vline | */ /* colors */ -#define C_BOX "\033[0;34m" /* blue - boxdrawing */ -#define C_NORMAL "\033[0;37m" /* grey - normal/default/tracks */ -#define C_STATUS "\033[0;31m" /* red - stausline (track++) */ -#define C_DESCRIPT "\033[1;33m" /* yellow - descriptions */ -#define C_HEADLINE "\033[0;33m" /* brown - version, headlines */ +#define C_BOX "\033[0;34m" /* blue - boxdrawing */ +#define C_NORMAL "\033[0;37m" /* grey - normal/default/tracks */ +#define C_STATUS "\033[0;31m" /* red - stausline (track++) */ +#define C_DESCRIPT "\033[1;33m" /* yellow - descriptions */ +#define C_HEADLINE "\033[0;33m" /* brown - version, headlines */ /* style: 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed * fg: 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=grey * bg: 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=grey