2009-01-05 12 views
7

estoy experimentando con función de alerta sonora en Windows:de Windows Bip() equivalente para Linux

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

Entonces, el ordenador emite un pitido con cierta frecuencia para una cierta duración. ¿Cómo haría esto en una computadora con Linux?

Editar: ES IMPORTANTE emitir diferentes frecuencias.

Respuesta

9

Echa un vistazo al código fuente de beep disponible para Ubuntu (y probablemente otras distros) o echa un vistazo a http://www.johnath.com/beep/beep.c para otra fuente (creo que es el mismo código).

Le permite controlar la frecuencia, la longitud y las repeticiones (entre otras cosas) con facilidad.

+0

Creo que necesita privilegios de root para sintonizar las especificaciones de pitido del altavoz de PC, al menos en X. –

+0

No con este código, lo uso directamente desde una cuenta de usuario. Creo que el control está expuesto por el controlador de dispositivo estándar ioctl() interfaz. – paxdiablo

-1

this site muestra dos maneras:

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

y

Beep(587,500); 
+0

no funciona. Las comillas Unicode detienen inmediatamente la compilación con un error, y ni siquiera sé lo que estás tratando de hacer con '{7,"} '(que también produce el mismo error) –

+0

Sin función Beep() ... – hfrmobile

0

No estoy familiarizado con Linux, pero la salida de 0x07 caracteres ASCII parece hacer el truco de lo que leí con una rápida de Google buscar.

0

Le sugiero que mire la fuente para la utilidad beep. eso hace exactamente lo que quieres (específicamente, se abre "/ dev/console" y utiliza ioctl para solicitar pitido. En cuenta que esto sólo funcionará en la consola adjunta)

4

nos permite tener cierta gabba procedente de los altavoces de audio

#!/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 
} 

De forma más seria:

//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

debe iniciar la fase a 0.0 y quizás rebobinarla si es más grande que 2pi, es decir, si (fase> 2 * M_PI) fase - = 2 * M_PI, de lo contrario llegará al punto, donde la fase + 0.1f == fase. No he calculado cuándo sucederá esto :) – quinmars

+0

buen punto o fase podría ser un número entero, y tomaría sin (fase/10.0) –

0

En resumen:

  1. La emisión de un carácter BEL en un terminal puede producir un pitido, dependiendo de qué terminal sea y cuál es su configuración. Sin embargo, no hay control sobre esto.

  2. Cualquier sonido que desee se puede producir al enviar datos de audio a/dev/dsp o a algún otro dispositivo de sonido. Esto incluye un pitido, pero emitir un sonido implica reproducir una muestra real.

  3. El controlador de consola proporciona (en algunas configuraciones) ioctl para/dev/consola, que emite un sonido con un paso de configurables (al igual que el NT uno)