2009-01-05 9 views
7

Ja eksperymentuje z funkcją Beep w systemie Windows:Okna Beep() odpowiednik dla systemu Linux

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

Następnie komputer wydaje sygnały dźwiękowe z pewną częstotliwością przez jakiś czas. Jak mam to zrobić na komputerze z systemem Linux?

Edytuj: Ważne jest, aby wyprowadzać różne częstotliwości.

Odpowiedz

9

Sprawdź kod źródłowy dla sygnału dźwiękowego dostępnego dla Ubuntu (i prawdopodobnie innych dystrybucji) lub spójrz na http://www.johnath.com/beep/beep.c dla innego źródła (przypuszczam, że jest to ten sam kod).

Pozwala z łatwością kontrolować częstotliwość, długość i powtórzenia (między innymi).

+0

Wydaje mi się, że potrzebujesz "root privs", aby dostroić specyfikację dźwiękową głośnika komputera, przynajmniej pod X. –

+0

Nie z tym kodem, używam go bezpośrednio z konta użytkownika. Myślę, że kontrola jest narażona przez standardowy sterownik urządzenia ioctl() interfejs – paxdiablo

-1

this site przedstawia dwa sposoby:

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

i

Beep(587,500); 
+0

nie działa. Znaki cudzysłowu unicode natychmiast zatrzymują kompilację z błędem, a ja nawet nie wiem, co próbujesz zrobić z '{7,}} (co również powoduje ten sam błąd) –

+0

Brak funkcji Beep() ... – hfrmobile

0

Nie jestem zaznajomiony z Linuksem, ale wpisywanie znaków ASCII 0x07 wydaje się zrobić tę sztuczkę z tego co czytałem z szybkim google Szukaj.

0

Proponuję spojrzeć na źródło dla narzędzia beep. to dokładnie to, co chcesz. (konkretnie, otwiera „/ dev/console” i używa ioctl zażądać sygnał. Uwaga ta będzie działać tylko na załączonym konsoli)

4

pozwala mieć nam gabbana pochodzących z głośników dźwięku

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

choć bardziej poważnie:

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

powinieneś zainicjować fazę na 0.0 i może ją przewinąć, jeśli jest większa niż 2pi, tzn. jeśli (faza> 2 * M_PI) faza - = 2 * M_PI, w przeciwnym razie dojdziesz do punktu, w którym faza + 0.1f == faza. Nie obliczyłem kiedy to się stanie tho :) – quinmars

+0

dobry punkt lub faza może być liczbą całkowitą, a ja wziąłbym grzech (faza/10,0) –

0

W skrócie:

  1. Wyprowadzenie znaku BEL na terminal może wygenerować sygnał dźwiękowy - w zależności od tego, jaki terminal jest i jaka jest jego konfiguracja. Nie ma jednak nad tym kontroli.

  2. Każdy dźwięk, który ci się podoba, może zostać wygenerowany przez wyprowadzenie danych dźwiękowych do/dev/dsp lub innego urządzenia dźwiękowego. Obejmuje to sygnał dźwiękowy, ale wykonanie dźwięku wymaga odtworzenia rzeczywistej próbki.

  3. Kierowca konsola zapewnia (w niektórych konfiguracjach) ioctl do/dev/console, który wydaje dźwięk z konfigurowalnym boisku (podobnie jak NT jeden)

Powiązane problemy