2009-01-05 4 views
7

ich mit Beep-Funktion unter Windows am Experimentieren:Windows-Beep() Äquivalent für Linux

#include <windows.h> 
... 
Beep(frequency, duration); 

Der Computer piept dann mit einer gewissen Häufigkeit einiger Dauer. Wie würde ich das auf einem Linux-Computer tun?

Edit: Es ist wichtig, verschiedene Frequenzen auszugeben.

Antwort

9

Überprüfen Sie den Quellcode für Beep mit Ubuntu (und wahrscheinlich andere Distributionen) oder sehen Sie sich http://www.johnath.com/beep/beep.c für eine andere Quelle (es ist der gleiche Code, glaube ich).

Es erlaubt Ihnen, Frequenz, Länge und Wiederholungen (unter anderem) mit Leichtigkeit zu steuern.

+0

Ich glaube, dass Sie root privs brauchen, um die PC-Speaker Beep-Spezifika tun, zumindest unter X Sie tun .. –

+0

Nicht mit diesem Code benutze ich es direkt von einem Benutzerkonto.Ich denke, dass die Kontrolle durch den Standard-Gerätetreiber ioctl ausgesetzt ist() Schnittstelle – paxdiablo

-1

this site zeigt zwei Möglichkeiten:

char beep[] = {7, ”}; 
printf(“%c”, beep); 

und

Beep(587,500); 
+0

funktioniert nicht. Die Unicode-Anführungszeichen stoppen sofort die Kompilierung mit einem Fehler, und ich weiß nicht einmal, was Sie mit '{7,}}' versuchen (was auch den gleichen Fehler erzeugt) –

+0

No Beep() function ... – hfrmobile

0

ich mit Linux nicht vertraut bin, aber 0x07 ascii Charakter scheint die Ausgabe von diesem Trick zu tun, was ich mit einem schnellen google lesen Suche.

0

Ich würde vorschlagen, dass Sie die Quelle für das beep Dienstprogramm betrachten. das macht genau das, was du willst. (genauer gesagt, öffnet es „/ dev/console“ und verwendet ioctl Piepton zu beantragen. Dies nur auf dem angeschlossenen Konsole arbeiten beachten wird)

4

uns einige gabba aus den Audio-Lautsprechern haben können

#!/usr/bin/ruby 

$audio = File.open("/dev/audio", "w+") 
def snd char 
    $audio.print char.chr 
end 

def evil z 
    0.step(100, 4.0/z) { |i| 
     (i/z).to_i.times { snd 0 } 
     (i/z).to_i.times { snd 255 } 
    } 
end 

loop { 
    evil 1 
    evil 1 
    evil 1 
    evil 4 
} 

obwohl ernster:

//g++ -o pa pa.cpp -lportaudio 
#include <portaudio.h> 
#include <cmath> 

int callback(void*, void* outputBuffer, unsigned long framesPerBuffer, PaTimestamp, void*) { 
    float *out = (float*)outputBuffer; 
    static float phase; 
    for(int i = 0; i < framesPerBuffer; ++i) { 
     out[i] = std::sin(phase); 
     phase += 0.1f; 
    } 
    return 0; 
} 

int main() { 
    Pa_Initialize(); 
    PaStream* stream; 
    Pa_OpenDefaultStream(&stream, 0, 1, paFloat32, 44100, 256, 1, callback, NULL); 
    Pa_StartStream(stream); 
    Pa_Sleep(4000); 
} 
+0

sollten Sie die Phase auf 0.0 und vielleicht zurückspulen, wenn es größer als 2pi ist, dh wenn (Phase> 2 * M_PI) Phase - = 2 * M_PI, sonst kommen Sie zu dem Punkt, wo Phase + 0.1f == phase Ich habe nicht berechnet, wann das passieren wird :) – quinmars

+0

good point oder phase könnte integer sein, und ich würde sin nehmen (phase/10.0) –

0

Zusammengefasst:

  1. Wenn Sie ein BEL-Zeichen an ein Terminal ausgeben, wird möglicherweise ein Signalton ausgegeben - je nachdem, welches Terminal es ist und wie es konfiguriert ist. Es gibt jedoch keine Kontrolle darüber.

  2. Jeder Ton, den Sie mögen, kann durch Ausgabe von Audiodaten an/dev/dsp oder ein anderes Audiogerät erzeugt werden. Dies beinhaltet einen Piepton, aber das Erzeugen eines Sounds beinhaltet die Wiedergabe eines tatsächlichen Samples.

  3. Der Treiber für die Konsole bietet (in einigen Konfigurationen) ein ioctl für/dev/console, die mit einem konfigurierbaren Tonhöhe piept (ähnlich wie die NT ein)