[Linux]CD-ROM audioplay Problem
-
Hi
Ich will ein kleines Testprogrammm schreiben, mit welchem ich auf das CD-Laufwerk zugreifen und eine Audio-CD abspielen kann.
Hier der Code:#include <stdio.h> #include <fcntl.h> #include <sys/ioctl.h> #include <linux/cdrom.h> int main(int argc, char *argv[]) { int fd; struct cdrom_tocentry toc_entry; struct cdrom_msf start_stop; /* open cd device */ if ((fd = open("/dev/cdrom", O_RDONLY)) == -1) { perror("Konnte Laufwerk nicht öffnen."); return -1; } /* play cdrom */ /*beginn first track */ toc_entry.cdte_track = 1; toc_entry.cdte_format = CDROM_MSF; if (ioctl(fd, CDROMREADTOCENTRY, &toc_entry) == -1) { perror("ioctl() failed."); return -1; } start_stop.cdmsf_min0 = toc_entry.cdte_addr.msf.minute; start_stop.cdmsf_sec0 = toc_entry.cdte_addr.msf.second; start_stop.cdmsf_frame0 = toc_entry.cdte_addr.msf.frame; /* end last track */ toc_entry.cdte_track = CDROM_LEADOUT; toc_entry.cdte_format = CDROM_MSF; if (ioctl(fd, CDROMREADTOCENTRY, &toc_entry) == -1) { perror("ioctl() failed."); return -1; } start_stop.cdmsf_min1 = toc_entry.cdte_addr.msf.minute; start_stop.cdmsf_sec1 = toc_entry.cdte_addr.msf.second; start_stop.cdmsf_frame1 = toc_entry.cdte_addr.msf.frame; if (ioctl(fd, CDROMPLAYMSF, &start_stop) == -1) { perror("ioctl() failed."); return -1; } getchar(); if (ioctl(fd, CDROMSTOP) == -1) { perror("ioctl() failed."); return -1; } close(fd); return 0; }
So weit alles in Ordnung, das Programm spielt die CD ab.
Das Programm fängt immer mit Stück 1 an, bis es das Ende der CD (CDROM_LEADOUT) erreicht. Nun will ich einfach das Anfangslied bestimmen. Ich also hin und einen integer abgefragt, diesen dann in eine Variable geschrieben und wollte selbige an die Struktur toc_entry übergeben:int count = 1; bla /* play cdrom */ /*beginn first track */ printf("\nMit welchem Stück soll begonnen werden?\n"); scanf("%d", &count); toc_entry.cdte_track = count; toc_entry.cdte_format = CDROM_MSF; bla
Das Programm startet jetzt, es wird die Variable abgefragt, nach count geschrieben und an die Struktur übergeben.. aber das Lied erscheint nicht, sondern das Programm beendet sich ohne Fehler.
Das komische ist jetzt, schreibe ich in den Code direkt, fange zB mit Stück 4 an
toc_entry.cdte_track = 4; toc_entry.cdte_format = CDROM_MSF;
klappt es! Das Programm spielt direkt ab 4 ab...
Wieso kann ich die Zahl nicht per Variable übergeben?
Wenn ich zB eine ungültige Stücknummer eingebe bekomme ich bei beiden Versionen (mit Variable und ohne) einen ioctl() Fehler. Aber wieso nimmt der die gueltige Zahl nicht an?
Jemand eine Idee?
Danke und gute Nacht,
Linuxfanatic
-
in meinem kdevelop kompiliert das nicht mal
-
Hast du dir mal mit einem Debugger angeguckt, ob die Zahl wirklich übergeben wird? So kann ich mir das Problem auch nicht erklären.
-
LinuxFanatic schrieb:
toc_entry.cdte_track = 4; toc_entry.cdte_format = CDROM_MSF;
klappt es! Das Programm spielt direkt ab 4 ab...
Wieso kann ich die Zahl nicht per Variable übergeben?
Was meinst du damit?
Bir mir geht es auch, nur die Mucke ist viel zu Leise und mit Strg+C habe ich zwar das das Programm beendet aber die Mucke läuft weiter!
-
@supertux:
Das Programm beendet sich bei mir mit einem Druck auf Enter und die Mucke hört auf.Ich habe noch ein bißchen herumprobiert: Wenn ich count deklariere und oben schon eine Zahl zuweise, dann klappt auch die Übergabe an die Struktur und das Abspielen beginnt mit dem Stueck, welches ich in count festgelegt habe. Damit, kingruendi dürfte sich auch der Debugger erübrigen, oder?
Das Problem liegt also in
printf("\nMit welchem Stück soll begonnen werden?\n"); scanf("%d", &count);
Aber wieso? Wo ist da die Logik? Wieso kann ich die Drecksvariable nicht einlesen und dann übergeben?
Gruß
-
wieso hat sich der debugger erledigt? Lass dir doch mal den Wert von count angeben, nachdem du es eingelesen hast.
-
Also der Debugger ddd bestätigt mir, das count richtig übergeben wird.
toc_entry.cdte_track hat den Wert den ich ihm über count zuweise...Verstehe das einer?
Gruß
-
LinuxFanatic schrieb:
Also der Debugger ddd bestätigt mir, das count richtig übergeben wird.
toc_entry.cdte_track hat den Wert den ich ihm über count zuweise...Verstehe das einer?
Gruß
Um ehrlich zu sein, nein! Ich hab selber (mit deinem Code) erweitert und dann ging es nicht mehr. Die Variable war zwar richtig, aber warum es nicht funktioniert ist ein Rätsel für mich.
-
@Supertux:
Schade! Aber trotzdem danke für deine Mühen.Ich hoffe irgendjemand hier kann mir da weiterhelfen und den Denkfehler (so es einer ist) aufklären...
Gruß
-
Das ist ganz einfach!!!!!
Dein Problem liegt nicht in dem scanf(), sondern im getchar() kurz vor Schluss!scanf("%d",...) liest nur die Integer-Zahl ein, das "\n" bleibt stehen. Genau das findet aber getchar() dann und beendet das Programm sofort.
scanf() kann schon manchmal tückisch sein...
Nimm statt scanf("%d",...) lieber fgets() + sscanf(buffer, "%d",...)
oder werf mal einen Blick in mein Buch "C und Linux"Martin
-
Martin G schrieb:
scanf("%d",...) liest nur die Integer-Zahl ein, das "\n" bleibt stehen. Genau das findet aber getchar() dann und beendet das Programm sofort.
Martin
Natürlich, du hast Recht, hab nicht daran gedacht!
Besser wäre da fgets zu benutzen, das holt nämlich alles.
-
oder "%d\n" als Formatstring
-
VIELEN DANK!
Und Herr Gräfe, Ihr Buch habe ich hier liegen! Kann ich Ihnen direkt noch sagen, daß es mir sehr gefällt und ich es jederzeit wieder kaufen würde.
Danke!
LinuxFanatic