Программные интерфейсы джойстика и таймера

Евгений Музыченко

Краткие сведения об аппаратном устройстве джойстиков

Основные черты и понятия интерфейса джойстика

    Типы джойстиков

    Номера устройств

    Логические значения координат

    Калибровка

    Частота опроса

    Режим захвата

    Уведомление об изменении состояния

    Дребезг

    Порог чувствительности при уведомлении

Основные черты и понятия интерфейса таймера

    Разрешение

    Виды событий

    Уведомление о наступлении событий

    Точность

Общая схема взаимодействия программы и подсистем

Средства разработки, включаемые файлы и библиотеки

Структуры, используемые в интерфейсе

    Структура JOYCAPS

    Структура JOYINFO

    Структура JOYINFOEX

    Структура TIMECAPS

    Структура MMTIME

Уведомления, передаваемые программе

    Уведомление о состоянии джойстика

    Уведомление о наступлении таймерного события

Набор интерфейсных функций подсистем

    Перечень интерфейсных функций

    Значения, возвращаемые интерфейсными функциями

Описание интерфейсных функций джойстика

    joyGetNumDevs — запрос количества устройств

    joyGetDevCaps — запрос параметров и возможностей джойстика

    joyGetPos — запрос текущего состояния традиционного джойстика

    joyGetPosEx — запрос текущего состояния любого джойстика

    joyGetThreshold — запрос порога чувствительности к перемещению

    joySetThreshold — установка порога чувствительности к перемещению

    joySetCapture — захват джойстика

    joyReleaseCapture — освобождение джойстика

Описание интерфейсных функций таймера

    timeGetDevCaps — запрос параметров и возможностей таймера

    timeGetSystemTime — запрос системного времени в виде структуры

    timeGetTime — запрос системного времени в миллисекундах

    timeBeginPeriod — начало работы с заданным разрешением

    timeEndPeriod — конец работы с заданным разрешением

    timeSetEvent — запрос таймерного события

    timeKillEvent — отмена таймерного события

    TimerProc — функция приложения, вызываемая при уведомлении

Недостатки подсистем джойстика и таймера

Нетрадиционные применения интерфейса джойстика

 

Последние две подсистемы Windows MME, оставшиеся неописанными в рамках данного цикла — это интерфейсы с джойстиками (joystick) и таймерами (timer). Назначение первого понятно, а второй служит для управления мультимедийными виртуальными таймерами (multimedia timers).

Обе подсистемы введены в Windows 3.1 и впоследствии стали стандартными компонентами Win32.

Описание подсистем есть во встроенной системе помощи любой современной среды программирования, а также в MSDN SDK. Microsoft поддерживает в Internet справочную систему MSDN Online, где интерфейс джойстика описан в разделе http://msdn.microsoft.com/library/psdk/multimed/joy_42er.htm, а интерфейс таймера — в разделе http://msdn.microsoft.com/library/psdk/multimed/mmtime_4msz.htm.

Поскольку оба интерфейса предельно просты, я счел излишним снабжать статью демонстрационной программой, в которой не удалось бы показать возможности интерфейсов без дополнительной идеи и объемного кода, не имеющего прямого отношения к предмету.

Краткие сведения об аппаратном устройстве джойстиков

Традиционный джойстик IBM PC представляет собой простое аналоговое (analog, analogue) устройство, состоящее из двух переменных резисторов сопротивлением 100 кОм и двух кнопок с контактами на замыкание. Оси резисторов через систему ортогонального привода связаны с рукояткой джойстика таким образом, что горизонтальное перемещение рукоятки приводит к повороту оси резистора X, а вертикальное — резистора Y. То есть перемещение рукоятки в двух измерениях раскладывается на два независимых перемещения в перпендикулярных направлениях — X и Y. Направления X и Y называются осями (axis) джойстика.

Кнопки джойстика нумеруются от 1 до максимума; кнопка 1 обычно размещается на конце рукоятки.

Адаптер джойстика раньше входил в состав большинства многофункциональных адаптеров ввода-вывода (Multi I/O, или мультикарт), а впоследствии стал обязательной частью типовой звуковой карты универсального назначения. Интерфейс также предельно прост: ток, протекающий через каждый из переменных резисторов, заряжает времязадающий конденсатор одновибратора, который срабатывает через интервал времени, пропорциональный сопротивлению резистора. Срабатывание одновибраторов отражается в соответствующих разрядах порта состояния джойстика. Другие разряды порта состояния сигнализируют о замыкании контактов кнопок.

Программа, работающая с джойстиком, или его драйвер в ОС, принудительно разряжает времязадающие конденсаторы, после чего дожидается срабатывания одновибраторов, в цикле опрашивая порт состояния. Количество проходов цикла до изменения разряда состояния линейно пропорционально сопротивлению резистора и, следовательно, положению манипулятора измеряемой оси.

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

Вместо классической рукоятки джойстик может быть выполнен в виде руля и педали, двух педалей, единой площадки с возможностью наклона во всех направлениях, а также других конструкций, в которых сохраняется основной принцип — наличие не более двух осей независимого перемещения.

Кроме традиционных аналоговых джойстиков существуют цифровые (digital), что попросту означает наличие вместо переменных резисторов переключателей, срабатывающих при наклонах рукоятки. Такие джойстики сигнализируют только о наклоне рукоятки в одном из восьми направлений, но не о величине или скорости перемещения. По сути, такой «цифровой» джойстик содержит постоянные резисторы, подключаемые к интерфейсу при замыкании контактов переключателей.

Стандартный адаптер является двухканальным, то есть допускает подключение двух независимых джойстиков, что удобно, например, для игр с двумя игроками. Поскольку все органы управления отслеживаются независимо, возможно также объединение двух джойстиков в один с количеством осей и кнопок до четырех. Таким образом реализуются джойстики с осями R (обычно ось X второго канала) и Z (обычно ось Y второго канала).

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

В начало

В начало

Основные черты и понятия интерфейса джойстика

Типы джойстиков

В Win16 поддерживаются традиционные джойстики, имеющие до трех осей (X, Y, Z) и до четырех кнопок. В джойстиках, имеющих более двух осей и (или) двух кнопок, используется объединение каналов одного стандартного адаптера.

Win32 поддерживает различные типы джойстиков, имеющих до шести осей перемещения манипуляторов и до 32 кнопок (переключателей), имеющих два состояния: нажато/отпущено, включено/выключено и т.п.

Кроме традиционных осей X, Y и Z, подсистема поддерживает ось R (Rudder — руль) и две дополнительные оси — U и V. Перемещения по каждой из осей отслеживаются независимо от других, и конструктивно джойстик может быть выполнен как с совмещенными, так и с раздельными манипуляторами.

Ряд джойстиков имеет манипулятор точки обзора POV (point of view), которым обычно переключаются виды в играх (вперед, назад, в стороны). Значения этого манипулятора представляются в градусах по часовой стрелке относительно направления вперед.

В традиционном джойстике значения координат по осям U и V вычисляются как среднее арифметическое между двумя координатами одного канала адаптера. Координата U вычисляется по первому каналу, V — по второму. Значение POV вычисляется из координаты Z, если она есть, иначе — из координаты R. Другими словами — при нехватке физических осей значения координат будут взаимозависимыми и приложения должны использовать только одну из зависимых координат.

На многих джойстиках значения осей не являются полностью независимыми — например, педали газа и тормоза могут быть заведены на одну ось так, что нажатие на газ приводит к возрастанию значения координаты, а нажатие на тормоз — к ее уменьшению.

В начало

В начало

Номера устройств

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

Такой способ имеет некоторое неудобство, так как в течение сеанса работы возможна установка новых джойстиков либо удаление существующих, что приводит к изменению нумерации устройств. Поэтому ответственность за неизменность номеров возлагается на пользователя компьютера.

В начало

В начало

Логические значения координат

Количество проходов цикла ожидания до срабатывания одновибратора называется «сырой» (raw) позицией джойстика и используется в основном внутри подсистемы. Для удобства работы драйвер джойстика приводит эти значения к нормированным, логическим (logical) величинам, представляемым числами в диапазоне 0..65 535 (значения типа WORD). Если не определено иначе, программа получает по запросам значения именно логических координат, а «сырые» остаются только на уровне драйвера и служебных программ.

В начало

В начало

Калибровка

Для получения логических значений координат аналоговый джойстик после установки нуждается в калибровке. Калибровка заключается в установке манипуляторов в заданные положения, для которых драйвер по «сырым» координатам вычисляет поправочные коэффициенты для приведения их к логическим.

Калибровка (а также первоначальная установка джойстика) выполняется с помощью мастера (wizard), запускаемого из панели управления иконкой «Игровые контроллеры».

В начало

В начало

Частота опроса

Традиционный интерфейс джойстика не поддерживает генерации прерываний при изменении состояния манипуляторов, поэтому требуется постоянный опрос (polling) интерфейсного порта по прерываниям от системного таймера. В Windows эту задачу выполняет драйвер джойстика; приложению необходимо лишь задать требуемую частоту опроса (polling frequency). Увеличение частоты опроса приводит к повышению точности отслеживания, но одновременно — к увеличению доли накладных расходов системы, уменьшение частоты — к отставанию программных событий от реальных и снижению плавности перемещения.

Сама процедура опроса занимает сравнительно небольшое время — не более нескольких микросекунд. Накладные расходы вызываются в основном обработкой прерываний при повышенной частоте системного таймера.

В начало

В начало

Режим захвата

Информацию о состоянии каждого из джойстиков приложение может получать как путем регулярного опроса, так и посредством уведомляющих сообщений. Опрашивать джойстик можно в любой момент, но уведомляющие сообщения доступны только в режиме захвата (capture), который в некотором роде аналогичен открыванию устройства в остальных подсистемах MME. В режиме захвата Windows направляет приложению поток сообщений о состоянии джойстика.

Захватить устройство джойстика можно только один раз; последующие попытки захватить джойстик до его освобождения (даже от имени той же самой задачи) будут отвергаться с кодом ошибки JOYERR_NOCANDO.

В начало

В начало

Уведомление об изменении состояния

В режиме захвата Windows посылает заданному окну приложения сообщения, уведомляющие об изменении состояния джойстика — перемещении манипуляторов или нажатии/отпускании кнопок. Сообщения посылаются либо регулярно через заданные промежутки времени, либо нерегулярно — при каждом изменении состояния джойстика.

В начало

В начало

Дребезг

Простота используемого адаптером метода определения положения манипуляторов чревата значительными (порядка единиц процентов) случайными и систематическими ошибками, когда при неподвижном манипуляторе значение его координаты каждый раз определяется разным. Это явление называется дребезгом (bouncing) и требует специальных мер подавления, например — установки порога чувствительности.

Явление дребезга присуще также контактам кнопок, которые в момент замыкания и размыкания могут вместо одного перепада давать серию коротких ложных перепадов. Однако действия, порождаемые кнопками, как правило, занимают достаточное время, для того чтобы к моменту очередного опроса состояния кнопки ее контакты успели успокоиться.

В начало

В начало

Порог чувствительности при уведомлении

По умолчанию подсистема уведомляет приложение в режиме захвата при минимально воспринимаемом изменении положения манипуляторов. Если приложению требуется более грубое отслеживание состояния манипуляторов, можно установить порог (threshold) чувствительности, задаваемый в логических единицах перемещения (позиции). Установка порога также позволяет подавить «дребезг» значений координат, порожденный неточностью метода измерения сопротивления.

В начало

В начало

Основные черты и понятия интерфейса таймера

Разрешение

Разрешением (resolution) называется точность отсчета временных интервалов. Стандартный таймер Windows, управляемый функцией SetTimer, имеет довольно низкое разрешение (порядка 50 мс в Windows 9x, порядка 10 мс — в Windows NT). Этого вполне хватает для отсчета интервалов при общении с пользователем, однако недостаточно для приложений реального времени. Мультимедийный таймер предоставляет возможность установки произвольного разрешения, вплоть до одной миллисекунды.

Фактически разрешение таймера означает период времени между аппаратными прерываниями от системного таймера. Если при стандартном разрешении они возникают сравнительно редко (несколько десятков раз в секунду), то при разрешении в 1 мс ядро Windows будет получать 1000 прерываний в секунду, что приводит к некоторому возрастанию накладных расходов.

В начало

В начало

Виды событий

Мультимедийный таймер поддерживает два вида событий: однократное (One shot) и периодическое (Periodic). Однократное событие возникает по истечении заданного временного интервала. Периодическое событие возникает каждый раз по истечении интервала и фактически представляет собой однократное событие с «перезарядкой».

В начало

В начало

Уведомление о наступлении событий

Подсистема таймера поддерживает только один способ уведомления о наступлении таймерного события — вызов заданной программной функции. Для вызова функции подсистемой создается отдельная задача (thread) с приоритетом TIME_CRITICAL, из которой и вызывается заданная функция. Однажды созданная задача продолжает существовать до завершения приложения, обслуживая все последующие таймерные события.

В начало

В начало

Точность

Под точностью (accuracy) понимается способность таймерной подсистемы вызвать при уведомлении заданную программную функцию как можно ближе к моменту наступления события. Точность вызова увеличивается с повышением разрешения таймера, однако, поскольку вызов функции выполняется вспомогательной задачей, имеет место задержка на диспетчеризацию самой задачи. По умолчанию точность составляет примерно 7-10 мс, при разрешении 1 мс — 0-1 мс. При нехватке памяти, когда активизируется процесс подкачки (swapping), точность может резко падать до нескольких десятков миллисекунд.

Поскольку ни одна платформа Win32 не является системой реального времени, нет никаких гарантий точности работы таймера. Даже высший уровень приоритета вызывающей задачи не гарантирует от задержек на срочные системные операции, длительность которых в системах Windows никак не регламентируется.

В начало

В начало

Общая схема взаимодействия программы и подсистем

Работа с джойстиком обычно начинается с получения количества устройств функцией joyGetNumDevs, хотя некоторые программы всегда работают с первым устройством (нулевой номер). При помощи функции jouGetDevCaps можно получить характеристики выбранного джойстика, в частности — количество и конфигурацию его осей.

Если программа поддерживает собственные регулярные таймерные события, — она может просто периодически опрашивать состояние джойстика функциями joyGetPos / joyGetPosEx. Первая пригодна лишь для работы с традиционным джойстиком, вторая — для джойстика любого типа.

При необходимости получать сообщения об изменении состояния джойстика необходимо захватить его функцией joySetCapture, указав ключ окна (window handle), которое будет получать уведомляющие сообщения. Попутно функцией joySetThreshold можно задать порог чувствительности, чтобы сообщения посылались в «прореженном» виде — не на каждую единицу перемещения, а на каждую вторую, третью и т.д. Освобождение джойстика от захвата выполняется функцией joyReleaseCapture.

Работа с таймером обычно начинается с обращения к функции timeGetDevCaps для получения параметров разрешения, чтобы согласовать требуемое программе разрешение с возможностями аппаратуры и платформы.

Блоки программы, требующие работы с повышенным разрешением таймера, обрамляются вызовами функций timeBeginPeriod и timeEndPeriod; такие блоки могут вкладываться друг в друга (подсистема поддерживает стек, в котором сохраняются параметры разрешения), однако каждый вызов timeBeginPeriod должен быть впоследствии закрыт соответствующим ему вызовом timeEndPeriod.

Для запроса таймерного события применяется функция timeSetEvent, которая «заводит» таймер на заданный временной интервал. В зависимости от параметров результатом функции будет либо однократное событие, либо серия периодических событий, следующих друг за другом через заданный промежуток времени.

При необходимости досрочно отменить запрошенное событие используется функция timeKillEvent. При этом необходимо иметь в виду, что вызов функции уведомления происходит из независимой задачи, и уведомление может произойти в тот же момент, что и отмена события. Для исключения коллизий в таких случаях нужно использовать механизмы синхронизации процессов.

Независимо от таймерных событий приложение может в любой момент запросить текущее системное время функциями timeGetSystemTime и timeGetTime. Частота изменения, или гранулярность, системного времени зависит от текущего разрешения таймера. Установленное разрешение таймера влияет также и на результат функции GetTickCount и ее производных.

При запросе таймерных событий с высокой (сотни раз в секунду) частотой имеет смысл принять меры к минимизации накладных расходов и увеличению точности отслеживания времени. Например, уменьшить до предела объем кода в функции уведомления, зафиксировать код функции и используемые им данные в памяти посредством функции VirtualLock и т.п.

В начало

В начало

Средства разработки, включаемые файлы и библиотеки

Как и ранее, описывается программирование на языке C/C++ в среде Microsoft Visual C++.

Все необходимые константы, типы, структуры и прототипы функций подсистемы определяются в файле MMSYSTEM.H, который по умолчанию включается в компиляцию из общего файла WINDOWS.H. Дополнительные, редко используемые константы определены в файле MMREG.H.

Интерфейсные функции импортируются из библиотеки WINMM.LIB.

В начало

В начало

Структуры, используемые в интерфейсе

Структура JOYCAPS

Описывает свойства и характеристики устройства джойстика. Все поля заполняются только подсистемой и драйвером джойстика.

WORD wMid;
 WORD wPid;
 CHAR szPname [MAXPNAMELEN];
 UINT wXmin;
 UINT wXmax;
 UINT wYmin;
 UINT wYmax;
 UINT wZmin;
 UINT wZmax;
 UINT wNumButtons;
 UINT wPeriodMin;
 UINT wPeriodMax;
 UINT wRmin;
 UINT wRmax;
 UINT wUmin;
 UINT wUmax;
 UINT wVmin;
 UINT wVmax;
 UINT wCaps;
 UINT wMaxAxes;
 UINT wNumAxes;
 UINT wMaxButtons;
 CHAR szRegKey [MAXPNAMELEN];
 CHAR szOEMVxD [MAXOEMVXD];
  • wMid, wPid — идентификаторы разработчика (Manufacturer) и самого драйвера (Product). Полный список известных на момент выпуска SDK идентификаторов определен в файле MMREG.H.
  • szPname — имя устройства в виде строки ASCIIZ.
  • wXmin — минимальное значение координаты X.
  • wXmax — максимальное значение координаты X.
  • wYmin — минимальное значение координаты Y.
  • wYmax — максимальное значение координаты Y.
  • wZmin — минимальное значение координаты Z.
  • wZmax — максимальное значение координаты Z.
  • wNumButtons — количество кнопок.
  • wPeriodMin — минимальный допустимый период опроса состояния в режиме захвата, в миллисекундах.
  • wPeriodMax — максимальный допустимый период опроса состояния.
  • wRmin — минимальное значение координаты R.
  • wRmax — максимальное значение координаты R.
  • wUmin — минимальное значение координаты U.
  • wUmax — максимальное значение координаты U.
  • wVmin — минимальное значение координаты V.
  • wVmax — максимальное значение координаты V.
  • wCaps — флаги характеристик джойстика. Имена констант флагов имеют префикс JOYCAPS_:

HASZ

Имеет ось Z

HASR

Имеет ось R (руль)

HASU

Имеет ось U

HASV

Имеет ось V

HASPOV

Имеет манипулятор POV

POV4DIR

Манипулятор POV поддерживает только дискретные направления (нейтраль, вперед, вправо, назад, влево)

POVCTS

Манипулятор POV поддерживает плавное изменение направления

  • wMaxAxes — максимальное количество осей перемещения.
  • wNumAxes — количество используемых в данное время осей перемещения.
  • wMaxButtons — максимальное количество поддерживаемых кнопок.
  • szRegKey — название ключа реестра, представляющего джойстик.
  • szOEMVxD — строка идентификации системного драйвера (VxD).
В начало

В начало

Структура JOYINFO

Описывает состояние традиционного джойстика (до трех осей и до четырех кнопок). Введена в Win16, может использоваться в Win32, если информации достаточно для описания состояния опрашиваемого джойстика. Заполняется подсистемой.

UINT wXpos;
 UINT wYpos;
 UINT wZpos;
 UINT wButtons;
  • wXpos — позиция по оси X.
  • wYpos — позиция по оси Y.
  • wZpos — позиция по оси Z.
  • wButtons — состояние кнопок, отображаемое битовыми флагами. Константы флагов имеют имена вида JOY_BUTTONn, где n — номер кнопки (1..4).
В начало

В начало

Структура JOYINFOEX

Описывает состояние любого поддерживаемого в Win32 джойстика (до шести осей и до 32 кнопок). Заполняется подсистемой, кроме полей dwSize и dwFlags.

DWORD dwSize;
 DWORD dwFlags;
 DWORD dwXpos;
 DWORD dwYpos;
 DWORD dwZpos;
 DWORD dwRpos;
 DWORD dwUpos;
 DWORD dwVpos;
 DWORD dwButtons;
 DWORD dwButtonNumber;
 DWORD dwPOV;
 DWORD dwReserved1;
 DWORD dwReserved2;
  • dwSize — размер структуры в байтах. Заполняется приложением, используется для определения версии интерфейса.
  • dwFlags — флаги параметров запроса. Делятся на три группы: флаги запрашиваемых значений, флаги калибровки и вспомогательные флаги.

Флаги запрашиваемых значений (префикс JOY_RETURN в именах констант)

X

Запрашивается координата X в поле dwXpos

Y

Запрашивается координата Y в поле dwYpos

Z

Запрашивается координата Z в поле dwZpos

R

Запрашивается координата R в поле dwRpos

U

Запрашивается координата U в поле dwUpos

V

Запрашивается координата V в поле dwVpos

POV

Запрашивается значение Point of View в поле dwPow (в дискретных единицах)

POVCTS

Запрашивается значение Point of View в поле dwPow (в единицах по 0,1 градуса)

ALL

Запрашиваются все возможные значения координат

CENTERED

За центральное положение манипулятора принимается среднее значение координат по каждой из осей

RAWDATA

Запрашиваются сырые (некалиброванные) значения координат

BUTTONS

Запрашивается состояние кнопок в поле dwButtons

Вспомогательные флаги (префикс JOY_):

USEDEADZONE

Создание вблизи центрального значения координат «мертвой зоны», внутри которой возвращается одно и то же (среднее) значение координаты. Для того чтобы значение начало изменяться, необходим вывод манипулятора за пределы зоны. Может использоваться для подавления дребезга в области нейтрального положения

Флаги калибровки (префикс JOY_CAL_):

READ3

Запрос некалиброванных значений X, Y, Z

READ4

Запрос некалиброванных значений X, Y, Z, R

READ5

Запрос некалиброванных значений X, Y, Z, R, U

READ6

Запрос некалиброванных значений X, Y, Z, R, U, V

READXONLY

Запрос некалиброванного значения X

READYONLY

Запрос некалиброванного значения Y

READXYONLY

Запрос некалиброванных значений X, Y

READZONLY

Запрос некалиброванного значения Z

READRONLY

Запрос некалиброванного значения R

READUONLY

Запрос некалиброванного значения U

READVONLY

Запрос некалиброванного значения V

READALWAYS

Обращаться к порту состояния джойстика, даже если драйвер обнаружил, что джойстик не подключен

  • dwXpos — значение координаты X.
  • dwYpos — значение координаты Y.
  • dwZpos — значение координаты Z.
  • dwRpos — значение координаты R.
  • dwUpos — значение координаты U.
  • dwVpos — значение координаты V.
  • dwButtons — битовая шкала состояния кнопок. Нажатые кнопки 1..32 отображаются установленными разрядами 0..31. Для удобства определены константы с именами JOY_BUTTONn, где n — номер кнопки (1..32).
  • dwButtonNumber — номер последней нажатой кнопки.
  • dwPOV — значение параметра POV в сотых долях градуса. Определены специальные константы вида JOY_POVxxx, где xxx — дискретное положение манипулятора (CENTERED (-1) — нейтраль, FORWARD (0) — вперед, RIGHT (9000) — вправо, BACKWARD (18 000) — назад, LEFT (27 000) — влево.
  • dwReserved1, dwReserved2 — служебные поля.

Назначение флагов вида JOY_CAL_xxx из документации непонятно. Судя по тексту драйвера, эти флаги запрашивают отдельные некалиброванные значения, однако на практике наличие любого из этих флагов приводит к полному обнулению результирующей структуры.

В начало

В начало

Структура TIMECAPS

Описывает параметры мультимедийного таймера.

UINT wPeriodMin;
 UINT wPeriodMax;
  • wPeriodMin — минимальный измеряемый период времени (максимальное поддерживаемое разрешение).
  • wPeriodMax — максимальный измеряемый период времени (минимальное поддерживаемое разрешение).
В начало

В начало

Структура MMTIME

Описывает время в терминах различных мультимедийных потоков. Используется для получения текущего времени функцией timeGetSystemTime, заполняется подсистемой.

UINT wType;
 union {
    DWORD ms;
    DWORD sample;
    DWORD cb;
    DWORD ticks;
    struct {
       BYTE hour;
       BYTE min;
       BYTE sec;
       BYTE frame;
       BYTE fps;
       BYTE dummy;
       BYTE pad [2]
    } smpte;
    struct {
       DWORD songptrpos;
    } midi;
 } u;
  • wType — формат времени, описываемого структурой. Константы формата имеют префикс TIME_:
  • BYTES

    Количество байтов от начала мультимедийного потока

    MIDI

    Время в стандарте MIDI (Sond Position Pointer)

    MS

    Время в миллисекундах

    SAMPLES

    Количество звуковых блоков с начала звукового (Audio) потока

    SMPTE

    Время в стандарте SMPTE (в кадрах)

    TICKS

    Время в тиках от начала MIDI-потока

  • ms — счетчик миллисекунд — для случая TIME_MS.
  • sample — счетчик звуковых блоков — для случая TIME_SAMPLES.
  • cb — счетчик байтов — для случая TIME_BYTES.
  • ticks — счетчик тиков — для случая TIME_TICKS.
  • smpte — набор данных в формате SMPTE, для случая TIME_SMPTE.
  • midi — данные в формате MIDI-времени.
  • hour, min, sec — счетчик полных часов, минут и секунд.
  • frame — счетчик кадров внутри последней секунды.
  • fps — кадров в секунду (24, 25, 29, 30).
  • dummy, pad — выравнивание на границу двойного слова.
  • songptrpos — позиция указателя композиции в MIDI (Song Position Pointer).

Следующая страница