вторник, 22 июня 2010 г.

Что там у нас с драйвером Beep в Windows 7?

Это перевод What’s up with the Beep driver in Windows 7? Автор: Ларри Остерман.

Чуть раньше сегодня кое-кто спросил меня, почему 64-х битные версии Windows не поддерживают пикание встроенным системным динамиком. Ответ на этот вопрос довольно сложен и заключается в интересном пересечении нескольких противоречивых тенденций в экосистеме PC.

Давайте начнём с обсуждения, как железо для Beep работало в старые дни [1]. Оригинальный IBM PC содержал чип программируемого таймера (PIT) Intel 8254 для управления системными часами. Поскольку инженеры IBM предвидели, что PC может нуждаться в проигрывании звуков (но не особо высококачественных), то они решили, что они могли использовать 8254 как очень примитивный генератор квадратных волн. Для этого они запрограммировали третий таймер (канал) чипа для работы в режиме Square Wave и отсчитывать с заданной выходной частотой. Это приводило к тому, что линия Out2 чипа переключалась с положения high на low каждый раз, когда таймер пересекал 0. Разработчики железа соединили линию Out2 чипа с PC-спикером и вуаля - они смогли использовать чип таймера для программирования звучания PC-спикера.

Функция Beep в Win32 API является, фактически, тонкой оболочкой вокруг функциональности PIC 8254. Поэтому, когда вы вызываете Beep, вы программируете 8254 играть звук на PC-спикере.

Теперь - быстрая перемотка вперёд на 25 лет… Индустрия PC сильно изменилась, а вместе с ней изменилась и архитектура PC. В этот момент 8254 уже не использовался как программируемый контроллер прерываний, но он всё ещё присутствовал в современных PC. По одной единственной причине: 8254 всё ещё контролировал PC-спикер.

Ещё одной вещью, которая случилась за эти 25 лет, было то, что машины стали намного более способными. Теперь машины имеют возможности вроде новомодных жёстких дисков (некоторые из которых могут хранить даже больше 30 Мегабайт (но я не знаю, кому на свете может понадобится жёсткий диск, который имеет больший объём)). И каждая не серверная машина, продаваемая сегодня, имеет звуковую карту. Поэтому, почти каждая машина, продаваемая сегодня, имеет два способа генерации звуков – звуковая карта PC и старичок 8254, который всё ещё привязан к внутреннему PC-спикеру (или к выделенному для этих целей входу на звуковой карте - но об этом позже).

Но есть и ещё что-то, что случилось за это время. PC стали популярным товаром. Что означает, что производители PC стали искать способы снизить их стоимость. Они посмотрели на 8254 и спросили: "Почему мы не можем его убрать?".

Получилось так, что они не могли это сделать. И ответ на то, почему они не могли это сделать, пришёл с совершенно неожиданной стороны. ADA - Americans with Disabilities Act - закон о (американских) инвалидах.

ADA? Боже, какое отношение имеет ADA к пикающему спикеру в PC? Ну, оказалось, что самое прямое. Дело в том, что за эти 25 лет функция Beep использовалась для assistive-технологий – в частности, звуки для включения таких вещей как StickyKeys генерировались именно с помощью Beep. Существует около 6 assistive-технологий (AT), связанных с звуком, встроенные в Windows. Их реализация лежит глубоко в драйвере win32k.sys. Вы не могли использовать для этого звуковую карту, потому что она могла (теоретически) отсутствовать.

Но почему это имеет значение? Ну, оказывается что многие предприятия (как правительства, так и корпорации) имеют требования, которые не позволяют им закупить оборудование, которое имеет недостаточно accessible-технологий. Но это означает, что вы не сможете продавать им компьютеры без Intel 8254 на борту.

Эта проблема была замечена впервые, когда Microsoft начала разработку первой 64-х битной версии Windows. Поскольку оригинальная версия была нацелена исключительно на сервера, то требования для железа для 64-х битных машин не включали наличия поддержки 8254 (очевидно, что требования к AT ослаблены для серверных машин). Но когда мы начали разрабатывать клиентскую ОС на базе существующей, перед нами встала проблема: клиентская ОС должна поддерживать AT, так что нам надо вернуть Beep на те машины, где железа для него нет.

Для Windows XP это было решено специальным кодом в Winlogon, который в целом работал, но имел некоторые неожиданные осложнения (ни одно из которых не имеет отношения к этому обсуждению). Для Windows Vista я перепроектировал механизм, переносом логики Beep к новому “агенту системных звуков режима пользователя”.

Поскольку единственными машинами с этой проблемой были 64-х битные машины, эта функциональность была ограничена только 64-х битными машинами.

Но это означало, что производители всё ещё обязаны включать поддержку железа 8254 - в конце концов, вы могли купить компьютер и поставить на него 32-х разрядную версию Windows, так что вам могла понадобится функциональность AT.

В Windows 7 мы полностью разрешили ту проблему – мы переместили всю функциональность драйвера Beep.Sys в агент системных звуков пользовательского режима – теперь, когда вы вызываете Beep, то вместо манипулирования чипом 8254, вызов просто перенаправляется этому агенту, который и играет звук на звуковой карте.

Есть и ещё одно преимущество этого плана: помните, что выше я упомянул, что вывод 8254 был подключён к входу звуковой карты? Из-за этого звуковая карта была обязана постоянно находится на максимальной мощности всё время, потому что система не могла знать, когда код захочет активировать 8254 (между 8254 и инфраструктурой управлением питанием нет никакой связи, поэтому система не может включать звуковое оборудование, когда кто-то программирует третий таймер на 8254). Перенаправляя вызовы Beep на звуковую карту, система могла отправлять звуковое оборудование в сон, когда оно не было нужно.

Это перенаправление имело и другие преимущества. К примеру, когда вы случайно выводили на экран в консоли двоичный файл, содержащий символы #07 (который приводит к пиканью), то наконец-то вы могли убрать этот назойливый звук - просто выключив колонки. Это также означает, что теперь вы можете контролировать громкость пикания.

Были и некоторые неожиданные последствия. Самое значительное заключалось в том, что люди начали замечать, когда приложения вызывают Beep. Потому что они размещали свои системные блоки далеко или в закрытом месте или внешний шум был достаточно велик или же они вовсе (физически) отключали PC-спикер, так что они вообще не замечали, что их машина пикает, пока этот звук не начал раздаваться прямо у них под носом из колонок.

[1] Это даёт мне оправдание хранению старых каталогов компонентов Интел из 80-х.

8 комментариев:

  1. Мне НУЖЕН спикер!!!
    Так как у меня работает программа будильник выдающая звук не только на колонки, но и на спикер.
    Нужно это в том случае, если я не хочу зря включать колонки ради будильника!!!
    Как принудительно включить спикер в Windows 7 ???

    ОтветитьУдалить
  2. А мне надо заставить Server 2003 пищать колонками (параллельно со спикером). Прога, наверно java, алармит спикером и настроек не имеет. Может стырить какой файлик из Win7 и встроить в Server? (it was a joke :). Один чел предположил что реестр поможет.

    ОтветитьУдалить
  3. По-моему, перехватить в этой программе вызов Beep и перенаправить на колонки будет в разы проще...

    ОтветитьУдалить
  4. К сож я знаю только BASIC да и в прогу не полез бы (потеряется гарантия на устройство). Кстати в ноутбуках все сигналы спикера выводятся через звуковуху, узнать бы какие отличия у таких окон.

    ОтветитьУдалить
  5. Оказалось что в ноутбуках BEEP - контроллер физически жестко подключен к усилителю звуковой карты

    ОтветитьУдалить
  6. win7x64 - ТАК КАК ЖЕ ЗАСТАВИТЬ ЭТОТ СР*ННЫЙ СПИКЕР ПИЩАТЬ??1!!!11!

    ОтветитьУдалить
    Ответы
    1. Я не знаю, какое слово в заметке непонятно, но вроде написано достаточно ясно: "на современном железе контроллер может отсутствовать, а в Windows 7 и выше драйвера для него - нет".

      Так что если вы уверены, что аппаратно он присутствует - пишите свой драйвер.

      Удалить

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.