Audio CD abspielen mit ioctl



  • Hallo,

    ich möchte gerne über ioctl unter Linux eine Audio CD abspielen, aber irgendwie läuft das nicht. Das Auslesen der Trackinfos läuft. Aber einen Musiktitel kann ich nicht abspielen. Auch das Öffnen der CD-Schublade geht nur, wenn keine CD enthalten ist. Lege ich eine CD ein schließe die Schublade manuell, dann habe ich keine Funktion mehr. Ich erhalte auch keine Fehlermeldung.

    Der Quellcode zum abspielen sieht wie folgt aus:

      int fd;
      struct cdrom_tocentry toc_entry;
      struct cdrom_msf start_stop;
    
      if ((fd = open("/dev/cdrom", O_RDONLY  | O_NONBLOCK)) == -1)
        err_exit("cdplay: Can't open /dev/cdrom", 1);
    
                /* Anfang des 1. Stuecks */
      toc_entry.cdte_track = 1;
      toc_entry.cdte_format = CDROM_MSF;
      if (ioctl(fd, CDROMREADTOCENTRY, &toc_entry) == -1)
        err_exit("cdplay: ioctl() failed", 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;
    
                /* Ende des letzten Stuecks */
      toc_entry.cdte_track = CDROM_LEADOUT;
      toc_entry.cdte_format = CDROM_MSF;
      if (ioctl(fd, CDROMREADTOCENTRY, &toc_entry) == -1)
        err_exit("cdplay: ioctl() failed", 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)
        err_exit("cdplay: ioctl() failed", 1);
    
      printf("Press <RETURN> to stop playing.\n");
      getchar();
    
      if (ioctl(fd, CDROMSTOP) == -1)
        err_exit("cdplay: ioctl() failed", 1);
    
      close(fd);
    

    CDs abspielen mit einem Standard CD-Player läuft einwandfrei.


  • Mod

    Ist dein CD-Laufwerk über einen analogen Audioausgang angeschlossen? Hat es überhaupt einen analogen Audioausgang? Denn CDROMPLAYMSF gibt dem Laufwerk den Befehl, über den analogen Audioausgang auszugeben. Wenn es keinen solchen Ausgang hat (was normal wäre, wenn es nach, sagen wir ca. 2000 gebaut wurde), kann es das nicht tun. Es sollte dann Fehlercode ENOSYS zurück geben. Wenn es einen solchen Ausgang hat, aber nicht angeschlossen ist (was ebenfalls normal wäre, wenn dein Computer nach ca. 1995 zusammengebaut wurde), dann spielt es, aber du hörst nix.

    Zeitgemäßer (also so seit ca. 1995…) wäre es, die Daten tatsächlich auszulesen und dann an ein Audiogerät zu übergeben. Das ist natürlich nicht so ganz einfach, weil man da auf Formate, Codecs, etc. achten muss; sollte aber libraries geben, um dir zu helfen. Da ich nicht weiß, was überhaupt dein Ziel hier ist (Es geht ja wohl kaum um das Abspielen an sich. Historisches Interesse?) erkläre ich das aber nicht im Detail.



  • Das Laufwerk ist ein USB Laufwerk und hat keinen separaten Audioausgang.
    Wenn es eine andere Möglichkeiten gibt wäre ich sehr daran interessiert.
    Ich benötige das Ganze um mein Dauerprojekt (mittlerweile vielleicht nicht mehr ganz up to date) ans Laufen bzw. umzubauen. Ich habe vor einiger Zeit ca. 30 Jahre eine alte Wurlitzer Musikbox umgebaut in einen 80-fach CD-Wechsler. Das Ganze läuft auf einem alten Windowsrechner mit einer alten ISA-Karte die den Input Output steuert. Das System ist total veraltet, da läuft noch ein Windows 3.11 drauf oder so ähnlich.
    Jetzt war meine Idee das Ganze von einem Raspberry übernehmen zu lassen. Daher bin ich jetzt auf der Suche nach einer Möglichkeit mittels C/C++ eine Audio CD abzuspielen. Könnte auch Java sein, da die Oberfläche in Java geschrieben ist, aber auch da bin ich bisher nicht fündig geworden.

    D.h. ich muss eine CD-Laufwerk ansteuern können mit folgenden Möglichkeiten:

    • CD-Schublade auf
    • CD-Schublade zu
    • Bestimmten Titel abspielen
    • Abspielen beenden

  • Mod

    Die realistischte und einfachste Möglichkeit wäre ja sicherlich, da irgendwo einen zeitgenössischen Datenträger (oder Internetanschluss) zu verstecken, und stattdessen darauf das Äquivalent von 80 Millionen CDs in einem zeitgenössichen Audioformat zu speichern, die dann mit einem Standardmedienplayer abgespielt werden können. Oder wenn wir schon dabei sind: So ziemlich jeder Standardmedienplayer sollte doch noch mit Audio-CDs zurecht kommen. Warum nicht so einen nutzen? Die müssten doch per Script steuerbar sein.

    Aber wenn es unbedingt etwas selbst erfundenes sein muss: Die Audiodaten auf der CD sind keine Dateien wie man sie kennt. Es ist ein langer Datenstrom, dessen Format im sogenannten Red Book festgelegt ist (Dessen Format eigentlich ein sehr spannendes Thema ist, was 2022 aber komplett unnützes Wissen ist) . Das müsstest du irgendwie dekodieren. Jetzt weiß ich nicht genug über die Detail von CD-ROM Laufwerken, als dass ich dir sagen könnte, auf welcher Ebene du da ansetzen müsstest, und wie viel davon dir das CD-Laufwerk schon selber abnimmt. Beispielsweise wird das CD-Laufwerk sicherlich das CIRC-Decoding und Fehlerkorrektur selber machen, aber bekommst du am Ende einen fertiges 16-Bit PCM Stream, oder musst du den noch selber bauen? Jedenfalls willst du solche Details sicher nicht alle recherchieren müssen, sondern irgendeine Bibliothek für Audio-CDs suchen, die dir am Ende die PCM-Daten übergibt. Und die müsstest du dann an eine Soundkarte übergeben, die üblicherweise direkt PCM verstehen sollte. Aber da du sicher keinen eigenen Audiotreiber schreiben möchtest, nimmst du da das Betriebssystem für. In Linux wird alles was Sound angeht heutzutage normalerweise von Pulseaudio gemacht, das gewiss auch eine C-Schnittstelle für PCM haben sollte (weiß ich aber nicht und in das Handbuch kannst du genauso gut gucken, wie ich). Am Ende pipest du also einfach die Daten von der CD-Bibliothek an die Soundschnittstelle und vermeidest so gut wie möglich, selber etwas zu tun. Und dann ist die Frage, ob es nicht einfacher wäre, einen Standardmediaplayer mit einem Script zu steuern.

    PS: Ich sage nicht, dass das Dekodieren der Audiodaten nicht super spannend wäre. Das ist auch garantiert machbar. Sooo kompliziert ist das nicht und die Standards sind dermaßen wichtig (gewesen), die sollten genauestens dokumentiert sein. Aber wir reden sicherlich von Wochen oder Monaten intensiver Beschäftigung mit dem Thema, bevor du etwas hast, wenn du jetzt von 0 anfängst. Und am Ende weißt du dann, wie du ein Audioformat lesen kannst, das auf dem PC praktisch seit Jahren tot ist. Aber wenn du an solcher Technik Interesse hast, dann ist das gewiss spannend, zu versuchen, selber die Daten auszulesen.



  • Hallo Sepp,
    erst einmal vielen Dank für die vielen und schnellen Infos. An einen Mediaplayer hatte ich auch schon gedacht (hatte es mit VLC probiert, aber irgendwie nicht ans Laufen bekommen). Dann müsste ich hier vielleicht noch einmal schauen. Das andere klingt zwar sehr spannend, aber bis ich das am fliegen habe, gibt es diese Möglichkeiten vielleicht auch schon nicht mehr :-).
    Natürlich könnte ich dies alles einfacher mittlerweile über Spotify lösen, aber die gute alte Box und die drehende Mechanik möchte ich noch am Laufen haben und es ist ein schönes Bastelobjekt bei dem ich schon viel ausprobiert und gelernt habe.

    Gruß
    Michael


Log in to reply