Як змінити частоту звукового сигналу за замовчуванням на динаміку ПК?


0

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

Проблема полягає в тому, що я не розумію, як int valueIn 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я вважав, що це було б гарною ідеєю отримати те, що викликає, тож я зможу знайти функцію, яка перетворює частоту. Однак, backtrace не вказує ім'я функції, яке викликає pcspkr_event, і виявилося, що перетворення все ще не виконується у функції, яка викликає його ( ìnput_handle_event()) .
Я також не зміг знайти жодної документації щодо використання динаміка, коли немає Операційної системи.

То що таке частота відношення між частотою і значенням valueзмінної`?


Для цього потрібні повне запитання програмування та повний відповідь на програмування, але початкова проблема полягає в тому, що я хочу змінити частоту звукового сигналу за замовчуванням . Тому я подумав, що краще запитати тут, ніж про stackoverflow. Сміливо мігруйте його.
користувач2284570

Відповіді:


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


Так ви намагаєтесь переконати мене, що частота SND_BELL за замовчуванням не на 750 Гц, а на 1193 Гц? Що ви вказуєте на корінь? Модулі ядра є агностичними для користувачів.
користувач2284570

Ні ... Якщо ви скажете 750, я вірю вам ... У цьому випадку BIOS, ймовірно, запрограмував це на 1193182/750 = 1590. Насправді, в одному списку, який я тут маю, фактор був запрограмований на 1331, генерують 886 Гц. Немає справжнього стандарту для звукового сигналу.
jcoppens

Цей файл дає 750 ГГц в режимі = SND_BELL на всіх ПК.
користувач2284570

Про кореневий доступ. Так, але я бачу, що є "зовнішні" інструкції щодо перепрограмування таймера. Ці інструкції захищені, і до них може отримати доступ лише root.
jcoppens

Додано посилання на мою попередню відповідь ... У якій показано, де визначено PIT _... з вашого файлу.
jcoppens
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.