2009-01-05 32 views
7

Tôi đang thử nghiệm với chức năng Beep trên Windows:của Windows Beep() tương đương cho Linux

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

Các máy tính sau đó phát ra tiếng bíp với một số tần số cho một số thời gian. Làm thế nào tôi sẽ làm điều này trên một máy tính Linux?

Chỉnh sửa: Điều quan trọng là phải xuất các tần số khác nhau.

Trả lời

9

Kiểm tra mã nguồn cho tiếng bíp có sẵn với Ubuntu (và có thể là các bản phân phối khác) hoặc xem http://www.johnath.com/beep/beep.c cho một nguồn khác (đó là cùng mã, tôi tin).

Nó cho phép bạn kiểm soát tần suất, độ dài và lặp lại (trong số những thứ khác) một cách dễ dàng.

+0

Tôi tin rằng bạn cần quyền riêng tư để điều chỉnh các chi tiết tiếng bíp trên PC-Speaker, ít nhất là dưới X bạn làm –

+0

Không có mã này, tôi sử dụng nó trực tiếp từ tài khoản người dùng.() giao diện – paxdiablo

-1

this site cho thấy hai cách:

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

Beep(587,500); 
+0

Không làm việc. Dấu ngoặc kép unicode ngay lập tức ngừng biên dịch với một lỗi, và tôi thậm chí không biết những gì bạn đang cố gắng làm với '{7,"} '(cũng tạo ra cùng một lỗi) –

+0

Không có hàm Beep() ... – hfrmobile

0

Tôi không quen thuộc với Linux, nhưng xuất ra nhân vật ascii 0x07 dường như làm trick mà từ những gì tôi đọc với một google nhanh chóng Tìm kiếm.

0

Tôi khuyên bạn nên xem xét nguồn của tiện ích beep. thực hiện chính xác những gì bạn muốn. (cụ thể, nó sẽ mở ra "/ dev/console" và sử dụng ioctl để yêu cầu tiếng bíp. Lưu ý điều này sẽ chỉ làm việc trên giao diện điều khiển kèm theo)

4

phép có chúng tôi một số Gabba đến từ các loa âm thanh

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

nghiêm túc hơn mặc dù:

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

bạn nên bắt đầu giai đoạn đến 0.0 và có thể tua lại nếu nó lớn hơn 2pi, tức là nếu (pha> 2 * M_PI) giai đoạn - = 2 * M_PI, nếu không bạn sẽ đến điểm, trong đó giai đoạn + 0.1f == phase.Tôi chưa tính toán khi điều này sẽ xảy ra tho :) – quinmars

+0

điểm tốt hoặc pha có thể là số nguyên, và tôi lấy sin (pha/10.0) –

0

Nói tóm lại:

  1. Xuất một ký tự BEL vào một đầu cuối có thể tạo ra một tiếng bíp - tùy thuộc vào thiết bị đầu cuối nào và cấu hình của nó là gì. Tuy nhiên, không có quyền kiểm soát điều này.

  2. Mọi âm thanh bạn thích có thể được tạo ra bằng cách xuất dữ liệu âm thanh vào/dev/dsp hoặc một số thiết bị âm thanh khác. Điều này bao gồm tiếng bíp, nhưng làm cho một âm thanh liên quan đến việc chơi lại một mẫu thực tế.

  3. Người tài xế điều khiển cung cấp (trong một số cấu hình) một ioctl cho/dev/console mà tiếng bíp với một sân cấu hình (giống như NT một)

Các vấn đề liên quan