Есть у меня аудио драйвер, выполненный на основе Microsoft Virtual Audio Device (MSVAD) примера из СДК. Работал лет 5 без нареканий, носа никто туда не совал.
Но после выхода MS Win 10 1703 версии начал лажать на этой ОС. Прошелся по всей цепочке аудиоканала, определил лажа именно в этом драйвере.
Графэдит показывает много ошибок на входе этого драйвера. В графе меняю драйвер на стандартный рендеринг, все отлично работает.
По гуглу посмотрел — похоже это не только у меня проблемы. Кто уже с этим сталкивался — подскажите, где копать?
Здравствуйте, Vicul, Вы писали:
V>Есть у меня аудио драйвер, выполненный на основе Microsoft Virtual Audio Device (MSVAD) примера из СДК.
MSVAD времен XP/Win7 достаточно кривой — он многим даже тогдашним требованиям MS не соответствует, и тесты WLK/HCK полностью не проходит. Можно или взять за основу исходники из последних WDK, или напустить на Ваш драйвер тесты, и смотреть, где косяки. Но имейте в виду, что некоторые тесты тоже косые — их не проходят даже родные драйверы от MS с подписью WHQL. Это, кстати, к вопросу о смысле WHQL-тестирования.
ЕМ>Можно или взять за основу исходники из последних WDK,
Больше ничего и не остается, как это. Аналогичная ситуация у меня было по AVStream драйверу. Тоже на первой 10 Винде перестал работать, обновил код с последнего ВДК,
все стало пучком
V>По гуглу посмотрел — похоже это не только у меня проблемы. Кто уже с этим сталкивался — подскажите, где копать?
Проблему нашел, драйвер MSVAD не полностью передает принятые аудио данные.
Примерно получается так, через CopyTo() он принимает 1920, а отдает через CopyFrom() чуть меньше ~1700 байт.
Я так понимаю необходимо отлавливать IRP процедуры завершения с фильтра (рендера), который за драйвером принимает эти аудио данные.
Все это можно делать через IoSetCompletionRoutine(), которая сформирует процедуру завершения, что примет нужные IRP от того фильтра.
А дальше распаковываем IRP, находим этот буфер приема и его размер, далее заполняем этот буфер.
Чтобы все это запустить никак не могу определить PDEVICE_OBJECT этого фильтра. В DirectShow все это делалось через соотв. пин. Здесь, в ядре, не могу определить, как к нему достучаться.
Это не "народ", а отдельно взятый человек.
V>что драйвер не успевает формировать трейды для передачи аудио на выход.
Что такое "формировать трейды для передачи аудио"?
V>Как выход, предлагают организовать передачу на уровне IRP.
Ничего подобного там не предлагают. Вы гуглом переводили, что ли?
V>Я так понимаю необходимо отлавливать IRP процедуры завершения с фильтра (рендера), который за драйвером принимает эти аудио данные. V>Все это можно делать через IoSetCompletionRoutine(), которая сформирует процедуру завершения, что примет нужные IRP от того фильтра. V>А дальше распаковываем IRP, находим этот буфер приема и его размер, далее заполняем этот буфер.
При желании, конечно, можно организовать весь это колхоз, который вряд ли будет работать сколько-нибудь надежно. Но лучше, конечно, обеспечить равномерность вызова Notify.