Кэширование сведений о закреплении для DirectShow
Приложение может использовать интерфейс DirectShow IFilterMapper2 для автоматического поиска фильтров, соответствующих определенным критериям. Это приложение может использовать список предлагаемых фильтров, возвращаемых IFilterMapper2 , для автоматического создания графов фильтров с фильтрами, которые получают и отрисовывает телевизионные сигналы. Для быстрого поиска фильтров, соответствующих указанным условиям, IFilterMapper2 использует сведения о фильтре и его контактах, которые были ранее введены в кэш. В следующих абзацах этот кэш называется кэшем данных контактов.
Сведения, содержащиеся в кэше данных контактов, включают список носителей и типов носителей для каждого контакта, который может предоставить фильтр. IFilterMapper2 использует эти сведения кэша, чтобы определить, может ли фильтр подключиться к закреплению на фильтре, который уже находится в графе. Это определение устраняет дополнительные затраты на создание экземпляра фильтра только для определения того, что подключение к фильтру запрещено из-за несоответствия типа носителя или носителя. Если кэш данных закрепления для фильтра не является актуальным, фильтр может быть ошибочно исключен в качестве кандидата для подключения в графе фильтра.
Всякий раз, когда мини-накопитель BDA определяет, что его кэш данных контактов, который используется DirectShow, не является актуальным, этот мини-driver должен обновить кэш данных контактов, чтобы сведения о закреплении для экземпляров фильтра BDA компонента BDA мини-драйвера точно отображались в графе фильтра. Мини-накопитель BDA обновляет кэш данных контактов DirectShow, как описано в следующих сценариях:
Мини-накопитель BDA может потребоваться или не требуется для обновления кэша данных контактов DirectShow, когда мини-накопитель изначально создает экземпляры фильтра BDA в зависимости от того, как этот мини-накопитель представляет фильтры BDA как фильтры DirectShow в пользовательском режиме. Файл сведений о мини-накопителе BDA (INF) указывает механизм, используемый мини-driver для представления фильтров BDA в качестве фильтров DirectShow.
Мини-драйверы BDA обычно используют прокси-модуль потоковой передачи ядра (KS) (Ksproxy.ax) для представления фильтров BDA в качестве фильтров DirectShow. Прокси-сервер KS автоматически обновляет кэш данных контактов DirectShow, чтобы предоставлять сведения о контактах для фильтров BDA при каждом первоначальном создании экземпляров этих фильтров. Таким образом, мини-накопители BDA, использующие прокси-сервер KS, не обязаны выполнять какие-либо действия по обновлению кэша данных контактов DirectShow при первоначальном создании экземпляров фильтров. Если фильтр BDA предоставляется в пользовательском режиме через прокси-сервер KS, кэшированные сведения автоматически включают носители и типы носителей для фабрик контактов, которые существуют в экземпляре фильтра, сразу после возврата процедуры создания диспетчеризации фильтра.
Некоторые мини-драйверы BDA не используют прокси-сервер KS для представления фильтров BDA в качестве фильтров DirectShow. Например, мини-драйверы приемников BDA, реализующие фильтры BDA для получения или обработки аналоговых телевизионных сигналов, используют модули KSTVTune.ax или KSXBar.ax для представления этих фильтров BDA в качестве фильтров DirectShow. Поскольку эти модули не используют стандартные методы прокси-интерфейса KS для обновления кэша данных контактов DirectShow, мини-драйверы BDA для этих типов фильтров BDA должны обновлять кэш данных контактов DirectShow, когда эти мини-драйверы изначально создают экземпляры фильтров. Чтобы обеспечить обновление кэша данных контактов DirectShow при создании экземпляров этих фильтров, мини-накопитель BDA вызывает функцию BdaFilterFactoryUpdateCacheData сразу после вызова функции BdaInitFilter внутри реализации процедуры диспетчеризации создания фильтра. В этом вызове мини-диск передает сведения о закреплениях, чтобы обновить все начальные контакты фильтра.
Контакты можно создавать в фильтре BDA динамически после завершения процедуры создания диспетчеризации фильтра. Если изначально созданный экземпляр фильтра BDA не предоставляет экземпляры всех контактов, перечисленных в топологии шаблона фильтра BDA (BDA_FILTER_TEMPLATE), то мини-накопитель BDA должен вызвать BdaFilterFactoryUpdateCacheData , чтобы принудительно получить сведения обо всех контактах, перечисленных в топологии шаблона фильтра.
Примечание Обновление кэша данных контактов DirectShow имеет значительные издержки, так как оно затрагивает и изменяет реестр. Кроме того, обновление кэша данных контактов DirectShow влияет на время, необходимое DirectShow для автоматической сборки графов фильтров. Поэтому мини-накопитель BDA должен вызывать BdaFilterFactoryUpdateCacheData для всех возможных контактов, только если он определяет, что кэш данных контактов, который использует DirectShow, не является актуальным.
По возможности мини-драйвер BDA должен вызывать BdaFilterFactoryUpdateCacheData при каждом обновлении драйвера, встроенного ПО или оборудования.