mcd

Детектор медийного контента

Синтаксис:

mcd опции* конфигурационный_файл &

Поддерживаемые платформы:

Neutrino

Целевые платформы:

ARM, PowerPC, SH, x86

Опции:

-D

Определить имя каталога со списком носителей медиаинформации; значение по умолчанию .devices.

-E

Определить имя файла извлечения носителя медиа-информации; значение по умолчанию .eject.

-I

Определить имя файла вставки носителя медиа-информации; значение по умолчанию .insert.

-n

Определить точку монтирования подсистемы; значение по умолчанию /dev/mcd.

-v

Увеличить уровень подробности сообщений, записываемых в sloginfo, с 0 до 7.

-V

Выводить выходные сообщения на консоль, а также в sloginfo.

конфигурационный_файл


Путевое имя соответствующего конфигурационного файла.

Описание:

Утилита mcd ((media content detector, MCD детектор медийного контента) отслеживает подключение и извлечение носителей медиа-информации, а также наличие соответствующего медийного контента.

Содержание этой страницы утилиты:
Обзор

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

В MCD определение действий, выполняемых системой, и выполнение этих действий разделены. Таким образом, действия можно легко корректировать или обновлять без изменения кода.

Правила MCD

MCD обеспечивает каркас в виде двоичного дерева решений, в котором правила и переходы по ветвям правил применяются согласно результатам сопоставления (соответствие/несоответствие). Эти правила используются для обнаружения подключения и извлечения устройств и носителей медиа-информации, а также для классификации их содержимого. Они указаны в конфигурационном файле MCD и реализуются по вызову пользователя.

Для MCD можно записать правила об отслеживании наличия или отсутствия устройства, носителя медиа-информации или файла, как в следующих трех примерах:

Мониторинг носителя медиа-информации

В соответствии со следующим правилом, MCD отслеживает операцию физической вставки или извлечения носителя медиа-информации в устройство CD-ROM, которое отображается в /dev/cd*.

[/dev/cd*]

Callout=CD_MEDIA_IOBLK


Мониторинг изменений пространства имен

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

[/fs/usb*]

Callout=PATH_MEDIA_PROCMGR


Мониторинг наличия файлов

В соответствии со следующим правилом, проверяется содержимое /directory с целью поиска файлов или каталогов, созданных в проверяемом каталоге или удаленных из него. Например, ввод в командном интерпретаторе команды touch /directory/file удовлетворяет этому правилу, хотя операция вставки или удаления физического устройства не выполняется.

[/directory/*]

Callout=PATH_MEDIA_SCAN


Примечание. MCD можно использовать в качестве структуры для построения независимой системы обнаружения контента.

Сервер MCD

Функции сервера MCD:
Примечание. В настоящей документации принято следующее:
Последовательность операций

В этом разделе описана последовательность операций MCD при запуске и при обнаружении нового устройства, носителя медиаинформации или файла.

Запуск

При запуске сервера MCD выполняются следующие действия:
  1. Чтение конфигурационного файла;

  2. Создание выделенного потока для доступа к интерфейсу менеджера ресурсов.

  3. Для всех носителей медиаинформации, перечисленных в конфигурационном файле, выполняются следующие действия:

    1. Создание выделенного потока обнаружения устройства;

    2. Выполнение подпрограммы уведомления в отдельном потоке.


Примечание. Возможно одновременное выполнение нескольких потоков обнаружения для различных носителей медиа-информации.

Устройство или вставка

При обнаружении вставки устройства или носителя медиаинформации или наличия соответствующего файла MCD выполняет следующие действия:
Конфигурирование MCD

Действия MCD контролируются с помощью конфигурационного файла. Этот файл содержит разделы с присвоенными именами, каждое из которых заключено в квадратные скобки ([ ]), после которых следуют строки параметров в формате ключ = значение. Эти параметры применяются только к разделу, в котором они указаны.

Примечание. Пример конфигурационного файла MCD 2phase.cfg входит в поставку MCD; в конфигурационном файле mcd.conf содержатся примеры использования в пакете Aviage Multimedia suite (MME).

MCD игнорирует пустые строки и начальные или завершающие пробельные символы. Строки, начинающиеся с "#" или ";", обрабатываются как комментарии и тоже игнорируются.

Разделы конфигурационных файлов

Раздел конфигурационного файла MCD может содержать один из следующих вариантов:
В приведенном ниже примере представлены описание ([/dev/cd0]) и правило: [DVD_AUDIO]:

[/dev/cd0]

Callout = CD_MEDIA_IOBLK

Argument = 1000,2000

Priority = 11,9

Start Rule = DVD_OR_CD

[DVD_AUDIO]

Callout = FNAME_MATCH

Argument = /AUDIO_TS/AUDIO_TS.IFO

Match Rule = DVD_VIDEO

Fail Rule = DVD_VIDEO


Описания объектов

Для разделов описаний объектов (устройств, носителей медиаинформации или файлов) объектом, который отслеживается MCD, является имя раздела. Это может быть конкретное имя, например /media/drive, или шаблон с групповым символом, например /dev/umass*. Если имя раздела представляет собой шаблон с групповым символом, подпрограмма уведомления о событиях, заданная для раздела с помощью параметра Callout=, должна обрабатывать все объекты, соответствующие этому шаблону.

Параметры

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

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

Callout=


Подпрограмма уведомления, выполняется MCD при обнаружении объекта, определенного в имени раздела. Каждая подпрограмма уведомления выполняется в собственном потоке, что позволяет при необходимости выполнять блокировку или опрос.

Если подпрограмма Callout= не задана, необходимо внешнее управление операциями с устройством, файлом или носителем медиаинформации. Уведомление при этом выводится через интерфейс менеджера ресурсов.

Argument=

Необязательный аргумент, который передается подпрограмме уведомления, заданной с помощью параметра Callout=.

Priority=

Приоритеты выполнения для объекта, определенного в текущем разделе:

Start Rule=

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

Stop Rule=


Корень вызовов, выполняемых при удалении объекта.


Правила медийного контента

Для разделов правил медийного контента конфигурационного файла mcd имя раздела является именем правила.

Параметры

Параметры в разделе правила медийного контента конфигурационного файла используются следующим образом:

Callout=

Подпрограмма уведомления, выполняемая MCD при обнаружении объекта, соответствующего правилу контента в имени раздела. См. "Подпрограмма уведомления" далее.

Argument=

Необязательный аргумент, который передается подпрограмме уведомления, заданной с помощью параметра Callout=.

Match Rule=

Ветвь дерева принятия решений, выполняемая при соответствии медийного контента правилу контента.

Fail Rule=

Ветвь вызовов, выполняемая при несоответствии медийного контента правилу контента.

Примечания
. Приоритет выполнения правила определяется в разделе объекта, с которого начинается цепочка правила.


Подпрограмма уведомления

Подпрограмма уведомления, выполняемая при соответствии носителя медиа-информации правилу, создает результат сопоставления и указывает, соответствует ли медиа-информация на носителе определенным требованиям подпрограммы. В зависимости от результата применения правила, MCD переходит к другому правилу, указанному в параметрах Match Rule= или Fail Rule= текущего раздела.

Если связанная ветвь правила для результата применения правила не указана, то MCD определяет данное правило как последнее, а процедуру обнаружения контента как завершенную.

Примечание. Если в правиле отсутствует параметр Callout=, то MCD определяет соответствие правилу в зависимости от наличия связанной ветви правила. При отладке эту особенность можно использовать для деактивации проверки и создания ветви к следующему правилу.

Использование MCD в качестве программы автоматического монтирования файловой системы

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

Записи первого уровня
Записи второго уровня
Пример использования MCD в качестве программы автоматического монтирования файловой системы см. в "Пример двухфазного монтирования файловой системы" в разделе "Примеры" далее.

Интерфейс менеджера ресурсов mcd

Сервер MCD обеспечивает стандартный интерфейс менеджера ресурсов QNX (аналогичный файловой системе). Каталогом высшего уровня по умолчанию является /dev/mcd; он содержит:
Примечание. Для изменения каталога верхнего уровня используется опция командной строки -n.

Файлы .insert и .eject

Файлы .insert и .eject доступны только для записи и находятся в каталоге /dev/mcd. Внешние программы могут инициировать процесс обнаружения контента MCD при вставке или извлечении объекта путем записи в соответствующий файл путевого имени вставленного или извлеченного объекта, например /dev/cd1.

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

Каталог .devices

Каталог .devices в /dev/mcd содержит записи для всех объектов (устройств, носителей медиаинформации и отслеживаемых файлов), известных системе. Каждому объекту в этом каталоге соответствует файл S_IFCHR/char- special. В полях этих файлов информация об объектах представлена в следующем виде:
Примечание. Записи в каталоге .devices отображаются только для объектов, которые были вставлены хотя бы один раз. Поскольку разделы объектов могут быть определены групповыми символами, полный список потенциальных соответствий объектов не может быть известен заранее. Информация об объекте доступна для MCD только после вставки. Таким образом, если клиентское приложение предпринимает попытку выполнения stat() для определенного устройства, которая завершается неуспешно, и возвращается ENOENT, то этот результат обрабатывается как значение 0 в поле st_ino (т.е. устройство извлечено).

Порядковый номер

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

Каждый раз при вставке объекта MCD увеличивает порядковый номер этого объекта. Например, для носителя медиа-информации значения st_ino могут иметь следующую последовательность: 1 (первая вставка), 0 (извлечение), 3 (повторная вставка), 0 (извлечение), 5 (повторная вставка).

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

Пример. Иерархия файловой системы

Пример иерархии файловой системы:

$ ls -al /dev/mcd

dr-xr-xr-x 1 root root 11 Aug 02 19:46 .

n-w--w--w- 1 root root 0 Aug 02 19:46 .eject

n-w--w--w- 1 root root 0 Aug 02 19:46 .insert

nr--r--r-- 1 root root 0 Aug 02 19:46 CDDA_OR_DTS

nr--r--r-- 1 root root 0 Aug 02 19:46 CD_AUDIO

nr--r--r-- 1 root root 0 Aug 02 19:46 DVD_AUDIO

nr--r--r-- 1 root root 0 Aug 02 19:46 DVD_OR_CD

nr--r--r-- 1 root root 0 Aug 02 19:46 DVD_VIDEO

nr--r--r-- 1 root root 0 Aug 02 19:46 MIXED_AV

nr--r--r-- 1 root root 0 Aug 02 19:46 SVIDEO_CD

nr--r--r-- 1 root root 0 Aug 02 19:46 VIDEO_CD


Записи только для чтения, предусмотренные для правил

Каталог верхнего уровня /dev/mcd содержит для каждого правила, определенного в конфигурационном файле записи, доступные только для чтения.

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

Шаблоны вызова

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

MCD содержит некоторые общие подпрограммы, доступные для использования в статически связанной библиотеке сервера. MCD также поддерживает подпрограммы расширения внешних поставщиков в DLL-библиотеках, динамически связываемых во время выполнения. Таким образом, существует возможность расширения системы: если требуется новый неподдерживаемый тест обнаружения, то такой тест может быть создан вне сервера и поставлен в виде отдельной библиотеки.

В конфигурационном файле системы обнаружения контента все элементы Callout= относятся к вызову. Эти вызовы определяются как внутренние или внешние в зависимости от имени.

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

Уведомление о вставке и удалении

Прототип для вызовов уведомления о вставке носителя имеет следующий вид:

void mcd_notify( char *iomgr[2], char *device, void *arg );

MCD создает эту подпрограмму в выделенном потоке для непрерывного контроля устройства. Этот поток не возвращает значений, за исключением возникновения серьезной ошибки. Если в потоке возникает серьезная ошибка, устанавливается соответствующее значение errno, и поток завершается. После завершения потока обнаружения объектов MCD выполняет следующие действия:
Аргументы

iomgr

Массив, содержащий имена записей интерфейсов, на которых обнаружены события вставки и извлечения. В системе по умолчанию iomgr[0] = "/dev/mcd/.insert" и iomgr[1] = "/dev/mcd/.eject", но в фактических строках отражены все значения, переопределенные в командной строке.

device

Указывает на имя контролируемого устройства, носителя медиаинформации или файла.

В качестве значения аргумента device может быть указан групповой символ; в этом случае подпрограмма контролирует группу устройств, файлов или носителей медиаинформации. В случае события устройства подпрограмма записывает в соответствующий путь iomgr[] имя конкретного устройства, носителя медиаинформации или файла, которые затрагивает данное событие.

arg

Аргумент, специфичный для подпрограммы. Этот специфичный для подпрограммы аргумент, определяется как параметр Argument= записи соответствующего устройства в конфигурационном файле.

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

К встроенным подпрограммам уведомления о медийном контенте MCD относятся следующие:

CD_MEDIA_IOBLK


Эта подпрограмма обеспечивает интерфейс между системой и CD- и DVD-дисководами, управляемыми файловой системой devb/io- blk. В ней используется функция файловой системы по автоматической деактивации открытых дескрипторов файлов при изменении носителя: подпрограмма открывает блок-ориентированный специальный файл устройства и периодически опрашивает его, при этом результат EBADF обрабатывается как индикатор изменения состояния. Различие между операциями вставки и извлечения определяется путем анализа объявленного размера устройства.

Опция Argument= определяет периоды опроса (в миллисекундах) дескриптора файла при отсутствии носителя медиаинформации и при его наличии. Значение по умолчанию для этого аргумента "1000,2000", что соответствует интервалу в 1 секунду при отсутствии носителя медиаинформации и в 2 секунды при его наличии.

USB_MEDIA_ENUM


Только для QNX Neutrino 6.3.n. Эта подпрограмма обеспечивает интерфейс между системой и утилитой umass-enum (которая в QNX Neutrino 6.4.0 заменена на enum-usb). Она преобразует события изменения состояния USB-устройства из исходного формата в события вставки и извлечения, ожидаемые сервером распознавания USB-устройств, указанного в опции Argument=.

В опции Argument= указывается имя сервера распознавания USB-устройств, к которому необходимо подключиться (как правило, это "/dev/umass-enum").

PATH_MEDIA_PROCMGR


Эта подпрограмма обеспечивает соединение системы с любым устройством, динамически присоединяющим путевое имя менеджера ресурсов (при его наличии) и отсоединяющим путевое имя (при отсутствии менеджера ресурсов). Для получения уведомления об изменениях в глобальном пространстве путевых имен используется функция procmgr_event() (доступная начиная с версии QNX Neutrino 6.3.0 SP2), а затем выполняется сканирование добавления и/или удаления точек монтирования устройства, соответствующих шаблону, определенному в имени вызова.

В опции Argument= определяется имя специального каталога, в котором pathmgr ОС осуществляет ведение точек монтирования (как правило, "/proc/mount").

PATH_MEDIA_SCAN


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

Подпрограмма PATH_MEDIA_SCAN обеспечивает следующее поведение MCD в зависимости от наличия или отсутствия завершающего символа "/" в конце путевого имени:

В опции Argument= устанавливается период опроса для сканирования каталога в миллисекундах.

Определение медийного контента

Прототип вызовов правил обнаружения контента:

int mcd_content( char *device, void *arg );

Аргументы

device

Имя устройства или носителя медиаинформации без файловой системы.

arg

Аргумент, специфичный для подпрограммы. Этот специфичный для подпрограммы аргумент определяется параметром Argument= соответствующей записи правила в конфигурационном файле.

Возвращаемое значение

Эта подпрограмма возвращает следующие значения:
Примечание. Если для вызываемой подпрограммы требуется доступ к файловой системе устройства, для поиска соответствующей точки монтирования подпрограммой может использоваться DCMD_FSYS_MOUNTED_BY devctl.

Встроенные правила обнаружения контента

К встроенным в MCD подпрограммам обнаружения контента относятся:

DVD_OR_CD


Это правило используется для определения типа диска с медиаинформацией: DVD или CD (с помощью команды READ DVD STRUCT).

Опция Argument= игнорируется. Соответствие правилу возможно только в том случае, если носитель является DVD- диском.

CD_AUDIO

Это правило используется для обнаружения на компакт-диске звукового контента (с помощью команды READ TOC). Опция Argument= игнорируется. Соответствие правилу возможно только в том случае, если носитель содержит звуковые дорожки.

Примечание. Для упрощения обнаружения смешанных компакт-дисков и компакт-дисков расширенного формата, содержащих звуковые файлы и компоненты файловой системы, правило CD_AUDIO можно настроить в качестве нетерминального состояния; т.о., обеспечиваются одновременно ветви Match Rule= и Fail Rule=. Подобная настройка правила позволяет перейти к другим правилам обнаружения контента после проверки наличия звукового контента.

BLANK_CD

Это правило используется для определения пустого или незаписанного компакт-диска (с помощью команды READ DISK INFORMATION). Опция Argument= игнорируется.

Примечание. Команда READ DISK INFORMATION и физическое обнаружение пустых дисков поддерживаются только более новым оборудованием CD-RW. Для более старого оборудования CD-ROM эти возможности недоступны. В действительности на таком оборудование вставленный пустой или незаписанный диск может быть не обнаружен.

FNAME_MATCH

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

Это поведение означает следующее:
Опция Argument= представляет собой список путевых имен, разделенных запятыми, на основе корневого каталога файловой системы. Если MCD обнаруживает любое из этих путевых имен в списке на носителе медиаинформации, то это соответствие правилу.

FNAME_PATTERN

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

В опции Argument= определен список шаблонов, разделенных запятыми. Если имя файла, соответствующее любому из шаблонов в списке, существует в каком-либо каталоге в файловой системе, то это соответствие правилу.

Для этой опции поддерживается несколько других опций, встраиваемых в указанные шаблоны. Пример: Argument = depth=2,*.c,*.h". К этим "встраиваемым" опциям относятся следующие:
По умолчанию на совпадение с шаблоном сканируется вся целевая файловая система. Опции basedir= и depth= применяются для конкретизации и ограничения сканирования.

MOUNT_FSYS

Это правило используется для монтирования файловой системы на указанном устройстве и использования MCD в качестве программы автоматического монтирования.

В опции Argument= определяется имя файла правил монтирования. Поскольку при каждом применении правила эта опция открывается и выполняется ее синтаксический анализ, целесообразно сохранить имя файла на псевдодиске или в каталоге /dev/shmem.

В большинстве случаев это правило используется в качестве Start Rule= в двухфазной конфигурации, где конечная операция монтирования вызывает действие PATH_MEDIA_PROCMGR. Правила обрабатываются поочередно. Обработка останавливается при обнаружении первого совпадения (fnmatch()) или при необходимости пропуска устройства (если для правила определен только шаблон, но отсутствует информация о монтировании). С целью выбора соответствующей файловой системы можно указать несколько правил для съемного устройства.

Формат файла одно правило в строке, при этом каждая строка содержит поля, разделенные пробельными символами. Пример.

#Device_pattern Mount_point Fsys_type Mount_options

/dev/cd* /fs/cd%# udf normv

/dev/cd* /fs/cd%# cd normv,case=upper

/dev/umass*t1[124] /fs/usb%0 dos fsi=use

/dev/umass*t[146] /fs/usb%0 dos

/dev/hd*

В результате применения правил, представленных в приведенном выше примере, MCD выполняет следующие действия:
Для получения дополнительной информации о последовательностях точек монтирования см. "Специальные последовательности MOUNT_FSYS" далее.

Примечание. Опция монтирования normv позволяет избежать конфликты при совпадении пространства имен ОС. Она необходима только в том случае, если функция mcd.mnt сконфигурирована для использования UDF, а затем CD, и для нее требуется PSP "TC630SP2_1828_fsys-EIDE".

UNMOUNT_FSYS

Это правило применяется для демонтирования файловой системы на носителе медиаинформации, указанном в имени правила. Опция Argument= игнорируется.

Обычно это правило используется в качестве Stop Rule= для носителя медиаинформации CD_MEDIA_IOBLK, использующего действие MOUNT_FSYS, если в противном случае, установка сохранилась бы после извлечения носителя медиаинформации. Если носитель медиаинформации представлен менеджером resmgr, который завершается самостоятельно или извне (например, USB-устройством), то соответствующая файловая система демонтируется автоматически без необходимости применения этого правила. Однако в большинстве экземпляров, в которых используется MOUNT_FSYS, также следует настроить соответствующее правило UNMOUNT_FSYS для обеспечения надлежащего демонтирования файловой системы извлеченного носителя медиаинформации.

Специальные последовательности MOUNT_FSYS

В правиле MOUNT_FSYS используются следующие специальные последовательности:

Пример файла mcd.mnt, в котором используются специальные последовательности %# и %0:

#------------------------------------------------------

# Device Mountpt Type Options

#------------------------------------------------------

/dev/cd* /fs/cd%# cd normv

/dev/umass[0-9]* / enum

/dev/umass[0-9]*t1[1234] /fs/usb%0 dos

/dev/umass[0-9]*t1[1234].* /fs/usb%0 dos

/dev/umass[0-9]*t[146] /fs/usb%0 dos

/dev/umass[0-9]*t[146].* /fs/usb%0 dos

/dev/umass*t7[789] /fs/usb%0 qnx4

/dev/umass*t17[789] /fs/usb%0 qnx6 sync=optional

/dev/umass[0-9]* /fs/usb%0 dos


API-интерфейс клиента

Для уведомления клиентских приложений о соответствиях медийного контента MCD использует специальные записи правил, созданные в файловой системе менеджера ресурсов.

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

Функция read() блокируется до обнаружения соответствия (если для oflag не установлено значение O_NONBLOCK). Для уведомлений без блокировки используется функция ionotify(). Для ожидания выполнения нескольких правил используется функция select().

Сохраняемая информация

Для однократного информирования клиента о каждом совпадении на сервере MCD сохраняется информация о состоянии каждого носителя медиаинформации, соответствии правилу и клиентском приложении.

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

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

Простой мультимедийный проигрыватель можно создать следующим образом:

int fd, cd;

char device[_POSIX_PATH_MAX];

// Открыть правило CD_AUDIO и дождаться обнаружения соответствия.

fd = open("/dev/mcd/CD_AUDIO", O_RDONLY);

while (read(fd, device, sizeof(device)) != -1) {

// В этот момент в устройстве находится звуковой компакт-диск ...

cd = open(device, O_RDONLY);

// ... чтение содержимого, воспроизведение и т.д.

// Возможность отслеживания статуса воспроизведения с помощью

// DCMD_CAM_CDROMSUBCHNL.

// При извлечении диска будет завершено неуспешно.

// Возможность возврата и ожидания следующей вставки.

// Обновление правила для

// следующего совпадения.

close(cd);

}

close(fd);


Пример. Опрос.

Цепочки правил Start Rule= и Stop Rule= устройства mcd являются взаимоисключающими: извлечение устройства приводит к отмене правил вставки для этого устройства (и наоборот). Поэтому в случае использования функции select() или ionotify() их следует выполнять совместно с функцией read() без блокировки, поскольку сообщаемое состояние и/или правила триггера могут быть недействительными (например, в случае извлечения носителя между вызовами ionotify() и read()).

Фрагмент кода для применения функции ionotify() совместно с функцией read() без блокировки:

fd = open(rulename, O_RDONLY | O_NONBLOCK);

SIGEV_UNBLOCK_INIT(&evt);

for (;;) {

while (ionotify(fd, _NOTIFY_ACTION_POLLARM, _NOTIFY_COND_INPUT,

&evt) != 0) {

while (read(fd, device, sizeof(device)) > 0) {

// значение "device" сопоставляется с "rulename".

}

}

pause();

}


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

Устаревшие правила

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

Во избежание устаревания правил MCD может добавить порядковый номер вставки носителя медиаинформации в уведомление о правиле, который в дальнейшем будет сопоставляться приложениями с записью устройства в каталоге /dev/mcd/.devices. Если устройство извлекается после вызова правила, эти значения больше не совпадают, т.е. правило больше не относится к текущему контенту устройства и могли быть вызваны новые правила.

Если для клиентского приложения необходим порядковый номер операции вставки, MCD использует чтение XTYPE для возврата дополнительного uint32_t с данными и именем носителя медиаинформации и код приоритета сообщения _IO_XTYPE_MQUEUE. Это исключает необходимость внесения изменений в глобальный заголовочный файл .

// Получение уведомления о правилах с использованием чтения XTYPE

int fd;

uint32_t seq1;

char device[_POSIX_PATH_MAX];

fd = open("/dev/mcd/CD_AUDIO", O_RDONLY);

_readx(fd, device, sizeof(device), _IO_XFLAG_BLOCK | _IO_XTYPE_MQUEUE,

&seq1, sizeof(seq1));

// Открытие и проверка текущей версии вставленного устройства

int fd;

struct stat st;

uint32_t seq2;

char entry[_POSIX_PATH_MAX];

fd = open(device, O_RDONLY);

sprintf(device, "/dev/mcd/.devices/%s", device);

seq2 = (stat(device, &st) != -1) ? st.st_ino : 0;

// В случае совпадения правило CD_AUDIO не изменено и по-прежнему действительно,

// а каталог "fd" открыт в данной версии носителя

if (seq1 == seq2) ...


Дополнительная информация

В этом разделе описывается использование MCD для определенных операций:
Обнаружение других видов системных носителей

Обнаружение системного носителя, не обрабатываемого подпрограммами MCD:
  1. Определите отличие нового типа носителя от всех остальных типов. Во многих случаях разница может заключаться лишь в наличии на носителе медиаинформации определенных файлов или каталогов. Например, диск обновления для навигации можно распознать по наличию файла acios_db.ini или config.nfm. В этом случае для обнаружения используется встроенная подпрограмма, например FNAME_MATCH; также можно записать пользовательскую подпрограмму и передать ее в MCD во внешней DLL- библиотеке.
  2. Определите приоритет проверки данного носителя по отношению к другим тестам (в первую или в последнюю очередь, после проверки звукового контента, но до проверки других правил данных и т.д.).
  3. Создайте в конфигурационном файле новый раздел правила для данного теста с соответствующим правилом Callout= и соедините его с соответствующей точкой дерева решений путем изменения параметров Match Rule= или Fail Rule= как для предыдущего, так и для нового правила. При совпадении нового контента имя нового правила может использоваться для вызова любого клиентского приложения.

Обнаружение устройств USB и iPod

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

Для USB-устройств в конфигурационном файле MCD можно использовать следующую запись:

[/fs/usb*]

Callout = PATH_MEDIA_PROCMGR

Argument = /proc/mount

Priority = 11,10

Start Rule = ...

Только для целевых систем под управлением QNX Neutrino 6.3.n. В отношении USB-устройств сервер umass- enum совместно со встроенной подпрограммой MCD USB_MEDIA_ENUM может обеспечить механизм уведомления и запустить процесс обнаружения. Для активации интерфейса менеджера ресурсов вызовите функцию umass-enum с помощью опции -r и используйте следующую запись устройства в конфигурационном файле MCD:

[/dev/umass/*]

Callout = USB_MEDIA_ENUM

Argument = /dev/umass-enum

Priority = 11,10

Start Rule = ...

Для устройств iPod к записям устройств динамически присоединяются путевые имена (если они доступны), что позволяет выполнять обработку с использованием встроенной подпрограммы MCD PATH_MEDIA_PROCMGR(). В конфигурационном файле MCD для устройств iPod используется следующая запись устройства:

[/fs/ipod*]

Callout = PATH_MEDIA_PROCMGR

Argument = /proc/mount

Priority = 11,10

Start Rule = ...


Сопоставление с шаблоном и учет регистра

Подпрограмма MCD FNAME_MATCH предпринимает попытку доступа к указанным файлам с помощью базовой файловой системы, в которой применяются соответствующие правила в сочетании с заданными опциями монтирования. Таким образом, учет регистра при определении соответствия шаблону зависит от
В следующей таблице приведены параметры учета и сохранения регистра для некоторых общих файловых систем:

Файловая система

Учет регистра

Сохранение регистра

FAT

Нет

Нет

ISO 9660

Нет

Нет

Joliet

Нет

Да

QNX4

Да

Да

RRIP

Да

Да

VFAT

Нет

Да


Поскольку большинство носителей медиаинформации форматируется для DOS/Windows, наиболее вероятно, что регистр в файловой системе учитываться не будет. Это означает, что в правилах FNAME_MATCH список имен файлов Argument= может быть представлен как в верхнем, так и в нижнем регистре.
Подпрограмма FNAME_PATTERN обрабатывает записи каталога файловой системы с помощью функции libc fnmatch(), учитывающей регистр.

Вывод каталога для каждой файловой системы зависит от того, сохраняется ли в ней регистр. Если регистр в файловой системе не сохраняется, для управления представлением имен файлов используются правила по умолчанию. См. опции монтирования файловой системы cd case=lower|upper или dos sfn=lower|upper|windows.

Поскольку в самых распространенных мультимедийных форматах регистр сохраняется и используется точное имя файла, заданное пользователем или медиаприложением при создании файла, во всех правилах FNAME_PATTERN список шаблонов Argument= должен быть приведен как в верхнем, так и в нижнем регистрах (см. правило MIXED_AV в разделе Примеры далее).

Сопоставление с единственным правилом

Если соответствие нескольких типов медиаинформации не требуется, но требуется сопоставление только с первым правилом, можно воспользоваться тем, что при отсутствии ветви Match Rule= правила, для которого обнаружено соответствие, MCD прекращает процесс обнаружения.

В конфигурационном файле правила можно распределить в порядке приоритета от Start Rule= до Fail Rule=. Ветви Match Rule= указывать не следует. В структуре обнаружения MCD эти правила проверяются в указанной последовательности до обнаружения соответствия для одного из правил, после чего процесс обнаружения завершается. Пример см. в записях VIDEO_CD и SVIDEO_CD в разделе Примеры далее.

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

Для получения уведомлений при вставке компакт-диска вне зависимости от его содержимого достаточно выполнить следующее:
Теперь приложение может блокировать новое правило в стандартном интерфейсе менеджера ресурсов ("/dev/mcd/DISC_INSERTED") во время ожидания вставки устройства. Например, один из примеров конфигураций в этом документе может быть изменен следующим образом:

[/dev/cd0]

Callout = CD_MEDIA_IOBLK

Argument = 1000,2000

Priority = 11,9

Start Rule = DISC_INSERTED

[DISC_INSERTED]

Match Rule = DVD_OR_CD


Устройство смены компакт-дисков с встроенным аппаратно-программным обеспечением

Для обнаружения событий вставки устройства смены компакт-дисков под управлением встроенного микропрограммного обеспечения (например, FJ-10) не следует использовать встроенные вызовы обнаружения MCD. Уведомление о вставке следует инициировать непосредственно из стека контроллера устройства смены компакт-дисков.

Все встроенные вызовы обнаружения устройств выполняют определенные задачи внутренними средствами, а затем записывают имя устройства в специальную запись /dev/mcd/.insert. Это поведение означает, что для обнаружения носителя медиаинформации для устройств под управлением встроенного аппаратно-программного обеспечения необходимо выполнить следующие шаги:
В конфигурационном файле соответствующая запись устройства будет выглядеть следующим образом (обратите внимание, что опция Callout= в данном случае не указана):

[/dev/cd0]

Priority = 11

Start Rule = ...

Код уведомления о вставке в драйвере:

int notify;

notify = open("/dev/mcd/.insert", O_WRONLY);

write(notify, "/dev/cd0", 8);

close(notify);


Аналогичный код для обработки операций извлечения можно записать в /dev/mcd/.eject.

Использование MCD в качестве перечислителя разделов

Правило MCD MOUNT_FSYS можно использовать, для того чтобы определить, выполнено ли перечисление разделов устройства (USB-накопителя). Если устройство не разбито на разделы, то эта возможность позволяет смонтировать файловую систему на устройстве без разделов.

Для определения, выполнено ли разбиение устройства на разделы, используется следующая конфигурация:
Поток управления для этой конфигурации выглядит следующим образом:
  1. USB-накопитель вставлен.

  2. Перечислитель USB обнаруживает событие вставки и запускает devb-umass.

  3. devb-umass создает путевое имя /dev/umassX и вызывает MCD.

  4. MCD выполняет правило MOUNT_FSYS.

  5. Если носитель не разбит на разделы:

    1. Выполняется правило enum, которое завершается неуспешно.

    2. После неуспешного выполнения кода предпринимается попытка монтирования fs-dos на устройстве без разделов, которая завершается успешно, и создается /fs/usb*.

  6. Если носитель разбит на разделы:

    1. Правило enum перечисляет разделы и, таким образом, завершается успешно, вызов также завершается.

    2. В результате перечисления появляются имена /dev/umassXtN, повторно вводится правило устройства MCD с шаблоном, пропускающим правила enum, и вместо этого предпринимается попытка монтирования fs-dos в разделе, что приводит к созданию /fs/usb*.

  7. После любого из последних действий (5 или 6) MOUNT_FSYS успешно выполняет монтирование, и MCD продолжает выполнение правил /fs/usb*, обычно для обнаружения контента или вызова фиктивного правила INSERT.

Примечание. X обозначает номер диска (0, 1, 2 и т.д.), а N тип раздела (4, 11, 12 и т.д.) например, /dev/umass[0-9]* или /dev/umass[0-9]*t1[124]. Таким образом, путь со значением umassX относится к устройству, а путь с umassXtN к разделу.

Примеры:

Пример конфигурационного файла MCD для компакт-диска:

# Примеры правил идентификации CD/DVD-диска.

[/dev/cd0]

Callout = CD_MEDIA_IOBLK

Argument = 1000,2000

Priority = 11,9

Start Rule = DVD_OR_CD

[DVD_OR_CD]

Callout = DVD_OR_CD

Match Rule = DVD_AUDIO

Fail Rule = CD_AUDIO

[DVD_AUDIO]

Callout = FNAME_MATCH

Argument = /AUDIO_TS/AUDIO_TS.IFO

Match Rule = DVD_VIDEO

Fail Rule = DVD_VIDEO

[DVD_VIDEO]

Callout = FNAME_MATCH

Argument = /VIDEO_TS/VIDEO_TS.IFO

Fail Rule = VIDEO_CD

[CD_AUDIO]

Callout = CD_AUDIO

Match Rule = VIDEO_CD

Fail Rule = VIDEO_CD

[VIDEO_CD]

Callout = FNAME_MATCH

Argument = /VCD/INFO.VCD,/MPEGAV/AVSEQ01.DAT,/MPEGAV/MUSIC01.DAT

Fail Rule = SVIDEO_CD

[SVIDEO_CD]

Callout = FNAME_MATCH

Argument = /SVCD/INFO.SVD,/MPEGAV/AVSEQ01.MPG,/MPEG2/AVSEQ01.MPG

Fail Rule = MIXED_AV

[MIXED_AV]

Callout = FNAME_PATTERN

Argument = *.MP3,*.mp3,*.WMV,*.wmv,*.WMA,*.wma,*.AAC,*.aac,*.JPG,*.jpg,*.MPG,*.mpg

Отдельное устройство /dev/cd0 контролируется встроенной подпрограммой CD_MEDIA_IOBLK():

Это поведение аналогично поведению правила CD_AUDIO, поскольку компакт-диск может содержать как аудиофайлы, так и данные.

Правила определения контента компакт-диска, например VIDEO_CD или SVIDEO_CD, имеют только ветвь "Fail", поскольку обнаружение соответствия на этих уровнях исключает наличие любого другого контента. При обнаружении соответствия для этих правил, процесс обнаружения контента останавливается.
На этапе выполнения обнаружения контента создаются уведомления для всех клиентов, связанных с правилами, для которых обнаружены соответствия. Вставленный компакт-диск может соответствовать нескольким правилам или не соответствовать ни одному правилу: например, аудиодиск расширенного формата с видеоклипом может соответствовать правилам CD_AUDIO и MIXED_AV, а резервная копия системы разработки программ не будет соответствовать ни одному из правил.

Пример двухфазного монтирования файловой системы

Пример конфигурационного файла для USB-устройств (в нем определен вызов devb-umass blk auto=partition disk name=umass внешним перечислителем USB-устройств в ответ на операции вставки):

[/dev/umass*t*]

Callout = PATH_MEDIA_PROCMGR

Argument = /proc/mount

Priority = 11,10

Start Rule = MOUNT

[MOUNT]

Callout = MOUNT_FSYS

Argument = /dev/shmem/mcd.mnt

[/fs/usb*]

Callout = PATH_MEDIA_PROCMGR

Argument = /proc/mount

Priority = 11,10

Start Rule = MIXED_AV

[MIXED_AV]

Callout = FNAME_PATTERN

Argument = *.MP3,*.mp3,*.WMV,*.wmv,*.WMA,*.wma,*.AAC,*.aac,*.JPG,*.jpg,*.MPG,*.mpg

Обратите внимание, что шаблон устройства в приведенном выше примере не подходит для устройства без разделов и применяется только к записям разделов. Конфигурация монтирования /dev/shmem/mcd.mnt содержит следующий код:

/dev/umass*t1[124] /fs/usb%# dos

/dev/umass*t[146] /fs/usb%# dos