Я хочу изменить частоту звука по умолчанию SND_BELL (которая используется, когда \a или BEL или ^ G печатаются на экране) на более высокие значения (текущее значение по умолчанию составляет около 750 Гц).
Конечно, этот поворот требует полного программного решения.

Проблема в том, что я не понимаю, как int value в pcspkr_event() преобразуется из заданной частоты в подходящее значение при использовании с SND_TONE . Поэтому я не понимаю, как value=1000 воспроизводит сигнал с частотой 750 Гц.

switch (code) {
    case SND_BELL: if (value) value = 1000; // changing this line would change the default beep frequency, but why 1000 does 750Hz tone????
    case SND_TONE: break; // with SND_TONE the value variable is already computed, so do nothing
    default: return -1;
}

Поскольку та же функция реализует SND_TONE я подумал, что было бы неплохо получить то, что вызывает ее, поэтому я смог бы найти функцию, которая преобразует частоту. Однако обратная трассировка не сообщает имени функции, которая вызывает pcspkr_event, и оказалось, что преобразование все еще не выполнено в функции, которая ее вызывает ìnput_handle_event()).
Я также не смог найти документацию о том, как использовать динамик, когда нет операционной системы.

Так какова частота отношения между частотой и value переменной value`?

1 ответ1

0

Звуковой сигнал ПК имеет долгую историю. Чтобы понять его использование, вы должны знать, откуда оно. Все ПК имеют кристалл (который первоначально использовался для получения тактовой частоты процессора и цветовой частоты для видеовыхода). Это значение было 14,318 МГц (и изменилось) ... Разделенное на 3, это дало частоту процессора (4,77 МГц в исходном ПК), а разделенное на 4, это дало (NTSC) 3,58 МГц цветную несущую.

Затем 4,77 поделили на 4, чтобы получить 1,19 МГц ... Это было разделено на 65536, чтобы дать исходный тактовый сигнал (18 Гц), и разделено на другое - переменное - значение, чтобы дать звуковой сигнал. Это значение int, которое вы должны запрограммировать!

Итак, 14,31818 МГц / 12 = 1,193182 МГц (1193182 Гц). 1193182/1000 = 1193 даст вам тон 1000 Гц.

Код ссылки на вызовы PIT_TICK_RATE (см http://lxr.free-electrons.com/source/include/linux/timex.h?v=3.2#L277), который определен в этом:

* The clock frequency of the i8253/i8254 PIT */
#define PIT_TICK_RATE 1193182ul

Конечно, все это работает только как администратор root ...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .