Hallo zusammen!
Wie kann ich die Prozeduren Sound und NoSound unter X in einer grafischen Anwendung (mit GRX) nutzbar machen?
Eike
Eike Lange schrieb:
Wie kann ich die Prozeduren Sound und NoSound unter X in einer grafischen Anwendung (mit GRX) nutzbar machen?
Das willst du doch nicht wirklich, oder? ;-)
Also, Sound/NoSound sind ja nur für "Piepstöne" da, d.h. ein Sinus- (oder ähnlich nerviger) Ton einer festen Frequenz wird gespielt, bis er abgeschaltet oder ein anderer Ton gesetzt wird. CRT benutzt dafür auf der Linux-Console eine spezielle "ioctl"-Funktion (bei Interesse s. crtlinux386.h für Details). Soweit ich weiß, gibt's diese Funktion in xterms und PDCurses ("native" X11-Version von CRT) einfach nicht.
Ich weiß nicht mal, ob X11 überhaupt so was überhaupt unterstützt. Es gibt die Funktion XBell (in <X11/Xlib.h>) und eine `struct XKeyboardControl' mit Feldern (u.a.) `bell_pitch' und `bell_duration'. Ich weiß nicht, ob das tauglich ist -- wenn überhaupt, erscheint es mir eher murksig, aber prinzipiell sollte es dann (vermutlich mit ein bisschen C-Code) möglich sein, das in crtlinux386.h einzubinden.
Wenn du das aber nicht meinst, sondern richtigen Sound (also Samples): Ich habe eine kleine `SoundCard'-Unit geschrieben (kann ich bei Interesse schicken), die aber bisher nur OSS unterstützt (also eine der Soundarchitekturen unter Linux) -- wenn du sie für ALSA, esd o.a. brauchst, müsste sie "portiert" werden (obwohl zumindest ALSA auch OSS-Kompatibilität bereitstellt, soweit ich weiß, sodass sie da vielleicht einfach so funktioniert).
Frank
On Wed, Mar 13, 2002 at 01:04:31AM +0100, Frank Heckenbach wrote:
Wie kann ich die Prozeduren Sound und NoSound unter X in einer grafischen Anwendung (mit GRX) nutzbar machen?
Das willst du doch nicht wirklich, oder? ;-)
Ja, doch, genau darum geht es. Hier auf der Arbeit portiere ich gerade eine Menge von Units, die unter Turbo Pascal geschrieben wurden und nun in GNU Pascal verwendet werden sollen. `Sound' ist deswegen so interessant, weil es eine Datenakustisierung (oder wie heißt das mit der Visualisierung beim Hören???) ermöglicht, und zwar mit dem Parameter "Hz". Die Unit besteht im wesentlichen aus einer deutschen Übersetzung der TP-Befehle :-(, wobei _gleichzeitig_ "Graph" und "CRT" benutzt werden und die Umschaltung mit den dort bekannten Befehlen abläuft.
Wenn du das aber nicht meinst, sondern richtigen Sound (also Samples): Ich habe eine kleine `SoundCard'-Unit geschrieben (kann ich bei Interesse schicken), die aber bisher nur OSS unterstützt (also eine der Soundarchitekturen unter Linux) -- wenn du sie für ALSA, esd o.a. brauchst, müsste sie "portiert" werden (obwohl zumindest ALSA auch OSS-Kompatibilität bereitstellt, soweit ich weiß, sodass sie da vielleicht einfach so funktioniert).
Nee, das ist schon zuviel des Guten, aber Danke! Wir sollten wirklich mal ein Verzeichnis aufsetzen, in welches jeder seine GNU Pascal Units packen kann, so daß sie allen zur Verfügung stehen, und das an einem gemeinsamen Ort.
Eike
Eike Lange schrieb:
On Wed, Mar 13, 2002 at 01:04:31AM +0100, Frank Heckenbach wrote:
Wie kann ich die Prozeduren Sound und NoSound unter X in einer grafischen Anwendung (mit GRX) nutzbar machen?
Das willst du doch nicht wirklich, oder? ;-)
Ja, doch, genau darum geht es. Hier auf der Arbeit portiere ich gerade eine Menge von Units, die unter Turbo Pascal geschrieben wurden und nun in GNU Pascal verwendet werden sollen. `Sound' ist deswegen so interessant, weil es eine Datenakustisierung (oder wie heißt das mit der Visualisierung beim Hören???) ermöglicht, und zwar mit dem Parameter "Hz". Die Unit besteht im wesentlichen aus einer deutschen Übersetzung der TP-Befehle :-(, wobei _gleichzeitig_ "Graph" und "CRT" benutzt werden und die Umschaltung mit den dort bekannten Befehlen abläuft.
Tja, wie gesagt kannst du da mal die Xlib-Funktionen untersuchen. Wenn die es nicht tun (oder zu kompliziert sind ;-), gibt es wohl nur eine etwas unsauberere Lösung:
Ich habe mal kurz im Kernel nachgeschaut (ich gehe davon aus, dass das Ganze unter Linux stattfinden soll, anderswo (abgesehen von DJGPP) ist Sound in CRT eh nicht unterstützt). Anscheinend ist die erwähnte ioctl-Funktion nur auf dem "kontrollierenden Terminal", wenn dieses eine Console ist und für root-Prozesse erlaubt. Bei Prorgammen, die unter X laufen, ist das kontrollierenden Terminal das xterm, also keine Console. Sofern also nicht die ganze Anwendung als root laufen soll, bleiben wohl nur zwei Möglichkeiten:
- Du benutzt einen "Daemon" (von einer Console außerhalb von X), der via Pipe o.ä. die Sound-Daten entgegen nimmt und auf seiner Konsole ausgibt.
- Du benutzt ein "suid root" Helferprogramm, das dasselbe macht. (Dazu muss es eine beiliebige Console öffnen, am besten vermutlich /dev/console, und darauf die Ausgabe machen.)
Natürlich sind suid-Programme ein gewisses Risiko, aber wenn es einigermaßen vorsichtig geschrieben ist (keine Buffer-Overflows beim Einlesen der Sound-Daten) und das System nicht extrem sicherheitskritisch ist, sollte das vertretbar sein. Dafür ist es komfortabler, weil es bei Bedarf vom eigentlichen Programm automatisch aufgerufen werden kann, während die erstere Lösung explizit von einer Console aus gestartet werden muss.
Bei Interesse kannst du crtlinux386.h und demos/crtscreen.c anschauen. Dort mache ich nämlich schon was Ähnliches (wenn auch nicht suid root, sondern nur sgid vcsa) für `CRTSavePreviousScreen'.
Ebenso wie dort sollte auch ein Sound-Helferprogramm wohl besser in C geschrieben werden, weil es erstens sehr kurz ist und zweitens GPC (und das RTS) noch nie in Bezug auf Sicherheit "auditiert" wurden.
In crtlinux386.h könnte es dann eingebunden werden, d.h. dass es bei Bedarf automatisch gestartet wird, sodass der normale Programmierer und Anwender nichts davon merken (sobald das Helferprogramm mit entsprechenden Rechten installiert wurde).
Eine einfachere Lösung fällt mir leider auch nicht ein (abgesehen von der Sound-Unit, mit der man natürlich auch reine Sinus- (oder noch einfacher Rechteck-)Töne ausgeben kann, aber dann halt über die Soundkarte, nicht über den Piepser).
Wenn du das aber nicht meinst, sondern richtigen Sound (also Samples): Ich habe eine kleine `SoundCard'-Unit geschrieben (kann ich bei Interesse schicken), die aber bisher nur OSS unterstützt (also eine der Soundarchitekturen unter Linux) -- wenn du sie für ALSA, esd o.a. brauchst, müsste sie "portiert" werden (obwohl zumindest ALSA auch OSS-Kompatibilität bereitstellt, soweit ich weiß, sodass sie da vielleicht einfach so funktioniert).
Nee, das ist schon zuviel des Guten, aber Danke! Wir sollten wirklich mal ein Verzeichnis aufsetzen, in welches jeder seine GNU Pascal Units packen kann, so daß sie allen zur Verfügung stehen, und das an einem gemeinsamen Ort.
Tja, ich hatte mit Peter schon mal darüber gesprochen, zusammen mit einer Beschreibung a la LSM/DSM. Dummerweise hatte Peter damals die Notizen gemacht, und jetzt versuche ich seit langer Zeit, diese von ihm zu bekommen. Scheint nicht leicht zu sein. :-(
Frank