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
vieleicht findest du was hier:
Linux Api (HTML) & Linux Kernel API (PDF)

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