Seite 1 von 2
Beep_() für Linux?
Verfasst: 13.02.2010 19:15
von pickelrobert
Hallo.
Gibt es unter Linux soetwas wie Beep_(Frequenz,Dauer)? Einen "allgemeinen" Beep habe ich schon gefunden, allerdings kann ich dort keine Parameter definieren.
Re: Beep_() für Linux?
Verfasst: 13.02.2010 19:17
von RSBasic
Re: Beep_() für Linux?
Verfasst: 13.02.2010 19:23
von pickelrobert
Gibt aber keine Antwort auf meine Frage. Aber ich formuliere es anders:
Welche Linux(API)Funktion muß ich benutzen, um Töne mit variabler Frequenz und Dauer auf dem Systemlautsprecher auszugeben. Die Funktion unter Windows ist Beep_(Frequenz,Dauer)
Re: Beep_() für Linux?
Verfasst: 13.02.2010 22:19
von Andreas21
Re: Beep_() für Linux?
Verfasst: 19.02.2010 21:56
von pickelrobert
Leider habe ich noch nichts passendes gefunden.
Kann man das irgendwie nachbilden?
Re: Beep_() für Linux?
Verfasst: 20.02.2010 18:18
von Marvin
Na ja, du kannst eine Wave-Datei on-the-fly im Speicher erstellen, per CatchSound laden und dann abspielen.
Sooo schwer sollte das nicht sein.
Re: Beep_() für Linux?
Verfasst: 22.02.2010 00:51
von Andreas21
Vieleicht hilft dir das:
http://www.netzmafia.de/skripten/hardwa ... sound.html
ich habe es noch nicht zum lauffen bekommen.
Code: Alles auswählen
#O_RDONLY = 0
#KDMKTONE = $4B30
Procedure Beep(freq.l,duration.l)
Protected fd.i, res.l
fd = open_("/dev/console",#O_RDONLY,0);
If (freq > 0)
res = (duration << 16) + (1193180/freq);
ioctl_(fd,#KDMKTONE,res);
EndIf
;usleep_(duration*1000)
Delay(duration)
close_(fd);
EndProcedure
Beep(880,100)
Re: Beep_() für Linux?
Verfasst: 22.02.2010 20:56
von pickelrobert
Habe Dein Beispiel mit den Suchbegriffen "beep() linux" als C-Quelle gefunden. Funktioniert leider nur als "root". Ich denke, das wird auch das Problem bei dem PB-Beispiel sein. Werde es nachher testen.
Re: Beep_() für Linux?
Verfasst: 23.02.2010 21:54
von pickelrobert
Vermutung hat sich bestätigt.
Mal sehen, vielleicht gibt es noch eine Lösung, ohne "root" sein zu müssen...
Re: Beep_() für Linux?
Verfasst: 24.02.2010 10:30
von Shardik
pickelrobert hat geschrieben:Mal sehen, vielleicht gibt es noch eine Lösung, ohne "root" sein zu müssen...
Ich fürchte, eine Lösung ohne root-Rechte wird es leider nicht geben...
Ich habe den Beispiel-Code von Andreas21 gestern ebenfalls ausprobiert und festgestellt,
daß sowohl der Zugriff auf /dev/console als auch der Einsatz von ioctl_() root-Rechte
benötigt. Für /dev/console kann man mit chmod die Rechte leicht anpassen, aber ioctl_()
ist eine Art Poke-Befehl, der nur mit root-Rechten ausgeführt werden kann. Als Abhilfe
bleibt nur, eine ausführbare Beep-Datei zu kompilieren, diese dem Benutzer root zuzuordnen
und bei dieser Datei dann mit chmod das suid-Bit (set user id, auch "Sticky bit" genannt) zu
setzen, das bewirkt, daß die Beep-Datei mit root-Rechten ausgeführt wird (egal von wem sie
aufgerufen wird) und ioctl_() problemlos ausgeführt werden kann.
Man könnte zu diesem Zweck auch das C-Programm Beep() von Jonathan Nightingale
herunterladen und kompilieren, das noch weitere interessante Optionen bietet. In seiner
Readme-Datei beschreibt Jonathan auch die Problematik von ioctl() und die möglichen
Abhilfen:
http://www.linux.org/apps/AppId_2367.html