Детектор медийного контента
mcd опции* конфигурационный_файл &
.devices
..eject
..insert
./dev/mcd
.ЗОСРВ «Нейтрино»
aarch64, arm, armv7, e2k, mips, ppc, x86
Утилита mcd ((media content detector, MCD – детектор медийного контента) отслеживает подключение и извлечение носителей медиа-информации, а также наличие соответствующего медийного контента.
Содержание этой страницы утилиты:
MCD – это самостоятельная утилита, предназначенная для обнаружения устройств, носителей медиа-информации и определенного медийного контента. Она функционирует между драйверами устройств хранения данных и USB и любым клиентским приложением, которому необходима информация об операциях с устройством или носителем медиаинформации или информация о наличии указанных типов медийного контента.
В 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 выполняет следующие действия:
Действия 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=, должна обрабатывать все объекты, соответствующие этому шаблону.
Параметры
Использование конфигурационных параметров отличается в зависимости от типа раздела (описание носителя медиаинформации или правило контента), в котором они указаны.
Параметры в разделе объектов конфигурационного файла используются следующим образом:
Для разделов правил медийного контента конфигурационного файла mcd имя раздела является именем правила.
Параметры
Параметры в разделе правила медийного контента конфигурационного файла используются следующим образом:
Приоритет выполнения правила определяется в разделе объекта, с которого начинается цепочка правила. |
Подпрограмма уведомления
Подпрограмма уведомления, выполняемая при соответствии носителя медиа-информации правилу, создает результат сопоставления и указывает, соответствует ли медиа-информация на носителе определенным требованиям подпрограммы. В зависимости от результата применения правила, MCD переходит к другому правилу, указанному в параметрах Match Rule= или Fail Rule= текущего раздела.
Если связанная ветвь правила для результата применения правила не указана, то MCD определяет данное правило как последнее, а процедуру обнаружения контента как завершенную.
Если в правиле отсутствует параметр Callout=, то MCD определяет соответствие правилу в зависимости от наличия связанной ветви правила. При отладке эту особенность можно использовать для деактивации проверки и создания ветви к следующему правилу. |
MCD можно использовать в качестве программы автоматического монтирования файловой системы с помощью создания набора двухфазных правил в конфигурационном файле MCD. Двухфазные правила реализуются в MCD следующим образом:
Записи первого уровня
MOUNT_FSYS
, встроенной подпрограммы для монтирования файловых систем на основе простых критериев для носителей медиаинформации. PATH_MEDIA_PROCMGR
. Записи второго уровня
Пример использования MCD в качестве программы автоматического монтирования файловой системы см. в "Пример двухфазного монтирования файловой системы" в разделе "Примеры" далее.
Сервер MCD обеспечивает стандартный интерфейс менеджера ресурсов ЗОСРВ «Нейтрино» (аналогичный файловой системе). Каталогом высшего уровня по умолчанию является /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 выполняет следующие действия:
Аргументы
Встроенные подпрограммы уведомления
К встроенным подпрограммам уведомления о медийном контенте MCD относятся следующие:
EBADF
обрабатывается как индикатор изменения состояния. Различие между операциями вставки и извлечения определяется путем анализа объявленного размера устройства. PATH_MEDIA_PROCMGR
, но поскольку создание и удаление файлов не приводит к инициированию событий в файловой системе, ее функция заключается в сканировании указанного каталога с определенной периодичностью. PATH_MEDIA_SCAN
обеспечивает следующее поведение MCD в зависимости от наличия или отсутствия завершающего символа "/" в конце путевого имени:
Прототип вызовов правил обнаружения контента:
int mcd_content( char *device, void *arg );
Аргументы
Возвращаемое значение
Эта подпрограмма возвращает следующие значения:
Если для вызываемой подпрограммы требуется доступ к файловой системе устройства, для поиска соответствующей точки монтирования подпрограммой может использоваться DCMD_FSYS_MOUNTED_BY функции devctl(). |
Встроенные правила обнаружения контента
К встроенным в MCD подпрограммам обнаружения контента относятся:
Для упрощения обнаружения смешанных компакт-дисков и компакт-дисков расширенного формата, содержащих звуковые файлы и компоненты файловой системы, правило CD_AUDIO можно настроить в качестве нетерминального состояния; т.о., обеспечиваются одновременно ветви Match Rule= и Fail Rule=. Подобная настройка правила позволяет перейти к другим правилам обнаружения контента после проверки наличия звукового контента. |
Команда READ DISK INFORMATION и физическое обнаружение пустых дисков поддерживаются только более новым оборудованием CD-RW. Для более старого оборудования CD-ROM эти возможности недоступны. В действительности на таком оборудование вставленный пустой или незаписанный диск может быть не обнаружен. |
/fs/cd*
]), эта файловая система является точкой монтирования, в которой правилом FNAME_MATCH
осуществляется поиск имен файлов. FNAME_MATCH
из устройства (например, [/dev/cd0
]), это правило: /dev/cd0
(вероятно, /fs/cd0
); /dev/shmem
. PATH_MEDIA_PROCMGR
. Правила обрабатываются поочередно. Обработка останавливается при обнаружении первого совпадения ( fnmatch()) или при необходимости пропуска устройства (если для правила определен только шаблон, но отсутствует информация о монтировании). С целью выбора соответствующей файловой системы можно указать несколько правил для съемного устройства. Опция монтирования normv позволяет избежать конфликты при совпадении пространства имен ОС. Она необходима только в том случае, если функция mcd.mnt сконфигурирована для использования UDF, а затем CD, и для нее требуется PSP "TC630SP2_1828_fsys-EIDE". |
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
Для уведомления клиентских приложений о соответствиях медийного контента 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() без блокировки:
<PRE>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();}</PRE>
В реальной ситуации событие с высокой долей вероятности являлось бы импульсом, и, в отличие от приведенного фрагмента кода с паузами, существовал бы управляемый событиями цикл. |
Устаревшие правила
Правила могут устаревать при отключении клиента и/или задержке между уведомлением и использованием вставленного носителя медиаинформации, например из-за вызова отдельного медиаприложения.
Во избежание устаревания правил MCD может добавить порядковый номер вставки носителя медиаинформации в уведомление о правиле, который в дальнейшем будет сопоставляться приложениями с записью устройства в каталоге /dev/mcd/.devices. Если устройство извлекается после вызова правила, эти значения больше не совпадают, т.е. правило больше не относится к текущему контенту устройства и могли быть вызваны новые правила.
Если для клиентского приложения необходим порядковый номер операции вставки, MCD использует чтение XTYPE для возврата дополнительного uint32_t с данными и именем носителя медиаинформации и код приоритета сообщения _IO_XTYPE_MQUEUE
. Это исключает необходимость внесения изменений в глобальный заголовочный файл <sys/io_msg.h>
.
// Получение уведомления о правилах с использованием чтения XTYPEint 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:
FNAME_MATCH
; также можно записать пользовательскую подпрограмму и передать ее в MCD во внешней DLL- библиотеке.
MCD может управлять устройством любого типа, если доступен механизм уведомления о вставке и запуске процесса обнаружения.
Для USB-устройств в конфигурационном файле MCD можно использовать следующую запись:
[/fs/usb*] Callout = PATH_MEDIA_PROCMGR Argument = /proc/mount 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
. Это поведение означает, что для обнаружения носителя медиаинформации для устройств под управлением встроенного аппаратно-программного обеспечения необходимо выполнить следующие шаги:
/dev/cd0
). Запись имени устройства в контрольной точке инициирует последующие операции процесса обнаружения контента. В конфигурационном файле соответствующая запись устройства будет выглядеть следующим образом (обратите внимание, что опция 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 MOUNT_FSYS
можно использовать, для того чтобы определить, выполнено ли перечисление разделов устройства (USB-накопителя). Если устройство не разбито на разделы, то эта возможность позволяет смонтировать файловую систему на устройстве без разделов.
Для определения, выполнено ли разбиение устройства на разделы, используется следующая конфигурация:
/dev/umass*
], т.е. шаблон должен соответствовать как устройству без разделов, так и любым разделам; MOUNT_FSYS
. /fs/usb*
].
Правило mcd.mnt, используемое MOUNT_FSYS, должно включать следующий код:
/dev/umass[0-9]* / enum /dev/umass[0-9]* /fs/usb%# dos /dev/umass[0-9]*t1[124] /fs/usb%# dos fsi=use /dev/umass[0-9]*t[146] /fs/usb%# dos
Поток управления для этой конфигурации выглядит следующим образом:
/dev/umassX
и вызывает MCD. MOUNT_FSYS
. /fs/usb*
. /dev/umassXtN
, повторно вводится правило устройства MCD с шаблоном, пропускающим правила enum, и вместо этого предпринимается попытка монтирования fs-dos.so в разделе, что приводит к созданию /fs/usb*
. 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()
:
DVD_OR_CD
. DVD_AUDIO
. Если соответствие правилу не обнаружено, то процесс переходит к правилу CD_AUDIO
.
Правило DVD_AUDIO
предполагает (после выполнения встроенного теста FNAME_MATCH
) существование на DVD-диске файла /AUDIO_TS/AUDIO_TS.IFO, что указывает на наличие звукового контента.
DVD_VIDEO
.
Это поведение аналогично поведению правила CD_AUDIO
, поскольку компакт-диск может содержать как аудиофайлы, так и данные.
Правила определения контента компакт-диска, например VIDEO_CD или SVIDEO_CD, имеют только ветвь "Fail", поскольку обнаружение соответствия на этих уровнях исключает наличие любого другого контента. При обнаружении соответствия для этих правил, процесс обнаружения контента останавливается.
MIXED_AV
не имеет ветвей. Вне зависимости от результата, на этом правиле обработка завершается. На этапе выполнения обнаружения контента создаются уведомления для всех клиентов, связанных с правилами, для которых обнаружены соответствия. Вставленный компакт-диск может соответствовать нескольким правилам или не соответствовать ни одному правилу: например, аудиодиск расширенного формата с видеоклипом может соответствовать правилам 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
Базовые подсистемы ЗОСРВ «Нейтрино»
Предыдущий раздел: Сервисы