Эквивалент Windows Beep () для Linux

Я экспериментирую с функцией звукового сигнала в Windows:

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

Затем компьютер в течение некоторого времени подает звуковой сигнал с некоторой частотой. Как мне это сделать на компьютере с Linux?

Обновлено: важно выводить разные частоты.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
0
11 491
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

этот сайт показывает два пути:

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

а также

Beep(587,500);

Не работает. Кавычки Unicode немедленно останавливают компиляцию с ошибкой, и я даже не знаю, что вы пытаетесь сделать с {7,"} (который также вызывает ту же ошибку)

Braden Best 16.02.2014 07:01

Я не знаком с Linux, но вывод символа ascii 0x07, похоже, делает этот трюк из того, что я прочитал с помощью быстрого поиска в Google.

Это не помогает OP. ОП уточнил, что ему нужны разные частоты.

he77789 11.02.2020 15:46
Ответ принят как подходящий

Ознакомьтесь с исходным кодом звукового сигнала, доступным в Ubuntu (и, возможно, в других дистрибутивах), или посмотрите http://www.johnath.com/beep/beep.c для другого источника (я думаю, это тот же код).

Это позволяет вам легко контролировать частоту, длину и повторы (среди прочего).

Я считаю, что вам нужны root-права, чтобы настроить особенности звукового сигнала PC-Speaker, по крайней мере, под X вы это делаете.

Kent Fredric 05.01.2009 14:36

Не с этим кодом, я использую его прямо из учетной записи пользователя. Я думаю, что элемент управления предоставляется через стандартный интерфейс драйвера устройства ioctl ().

paxdiablo 05.01.2009 16:06

Предлагаю вам посмотреть исходники утилиты писк. это делает именно то, что вы хотите. (в частности, он открывает "/ dev / console" и использует ioctl для запроса звукового сигнала. Обратите внимание, что это будет работать только на подключенной консоли)

давай нам немного габба, исходящего из аудиоколонок

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

если серьезно:

//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,0 и, возможно, перемотать ее, если она больше 2pi, т.е. if (phase> 2 * M_PI) phase - = 2 * M_PI, иначе вы придете к точке, где phase + 0.1f == phase. Я не рассчитал, когда это произойдет, хотя :)

quinmars 05.01.2009 17:48

хорошая точка зрения. или фаза может быть целым числом, и я бы взял грех (фаза / 10.0)

Iraimbilanja 05.01.2009 21:45

В итоге:

  1. Вывод символа BEL на терминал может вызвать звуковой сигнал - в зависимости от того, что это за терминал и какова его конфигурация. Однако контроля над этим нет.

  2. Любой звук, который вам нравится, может быть воспроизведен путем вывода аудиоданных в / dev / dsp или другое звуковое устройство. Это включает в себя звуковой сигнал, но создание звука требует воспроизведения фактического семпла.

  3. Драйвер консоли предоставляет (в некоторых конфигурациях) ioctl для / dev / console, который издает звуковой сигнал с настраиваемой высотой тона (как в NT).

Другие вопросы по теме