Audio driver on MS Win 10 1703
От: Vicul  
Дата: 10.07.17 11:29
Оценка:
Есть у меня аудио драйвер, выполненный на основе Microsoft Virtual Audio Device (MSVAD) примера из СДК. Работал лет 5 без нареканий, носа никто туда не совал.
Но после выхода MS Win 10 1703 версии начал лажать на этой ОС. Прошелся по всей цепочке аудиоканала, определил лажа именно в этом драйвере.
Графэдит показывает много ошибок на входе этого драйвера. В графе меняю драйвер на стандартный рендеринг, все отлично работает.

По гуглу посмотрел — похоже это не только у меня проблемы. Кто уже с этим сталкивался — подскажите, где копать?
Re: Audio driver on MS Win 10 1703
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 10.07.17 13:54
Оценка:
Здравствуйте, Vicul, Вы писали:

V>Есть у меня аудио драйвер, выполненный на основе Microsoft Virtual Audio Device (MSVAD) примера из СДК.


MSVAD времен XP/Win7 достаточно кривой — он многим даже тогдашним требованиям MS не соответствует, и тесты WLK/HCK полностью не проходит. Можно или взять за основу исходники из последних WDK, или напустить на Ваш драйвер тесты, и смотреть, где косяки. Но имейте в виду, что некоторые тесты тоже косые — их не проходят даже родные драйверы от MS с подписью WHQL. Это, кстати, к вопросу о смысле WHQL-тестирования.
Re[2]: Audio driver on MS Win 10 1703
От: Vicul  
Дата: 10.07.17 14:11
Оценка:
ЕМ>MSVAD времен XP/Win7 достаточно кривой —

Кривой, не кривой, а 5 лет проработал с хр до 10


ЕМ>Можно или взять за основу исходники из последних WDK,


Больше ничего и не остается, как это. Аналогичная ситуация у меня было по AVStream драйверу. Тоже на первой 10 Винде перестал работать, обновил код с последнего ВДК,
все стало пучком
Re: Audio driver on MS Win 10 1703
От: Vicul  
Дата: 25.07.17 14:17
Оценка:
V>По гуглу посмотрел — похоже это не только у меня проблемы. Кто уже с этим сталкивался — подскажите, где копать?

Проблему нашел, драйвер MSVAD не полностью передает принятые аудио данные.
Примерно получается так, через CopyTo() он принимает 1920, а отдает через CopyFrom() чуть меньше ~1700 байт.

В инете (https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/c93d060e-58b4-4e29-a441-4a89f2e20087/wdmaudiodev-problem-with-copyfrom-it-copied-less-audio-data-than-my-expected?forum=wdk)
народ говорит, что драйвер не успевает формировать трейды для передачи аудио на выход. Как выход, предлагают организовать передачу на уровне IRP.

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

Чтобы все это запустить никак не могу определить PDEVICE_OBJECT этого фильтра. В DirectShow все это делалось через соотв. пин. Здесь, в ядре, не могу определить, как к нему достучаться.

Может кто подскажет?
Re[2]: Audio driver on MS Win 10 1703
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 25.07.17 15:34
Оценка:
Здравствуйте, Vicul, Вы писали:

V>народ говорит


Это не "народ", а отдельно взятый человек.

V>что драйвер не успевает формировать трейды для передачи аудио на выход.


Что такое "формировать трейды для передачи аудио"?

V>Как выход, предлагают организовать передачу на уровне IRP.


Ничего подобного там не предлагают. Вы гуглом переводили, что ли?

V>Я так понимаю необходимо отлавливать IRP процедуры завершения с фильтра (рендера), который за драйвером принимает эти аудио данные.

V>Все это можно делать через IoSetCompletionRoutine(), которая сформирует процедуру завершения, что примет нужные IRP от того фильтра.
V>А дальше распаковываем IRP, находим этот буфер приема и его размер, далее заполняем этот буфер.

При желании, конечно, можно организовать весь это колхоз, который вряд ли будет работать сколько-нибудь надежно. Но лучше, конечно, обеспечить равномерность вызова Notify.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.