В DDK (файл d_stream.chm) нашёл информацию о работе с аудиодрайвером напрямую (посылая ему запросы ввода/вывода). Возникли следующие вопросы: 1)К какому именно драйверу следует обращаться, а точнее как получить его символьную ссылку? 2)LONGLONG - это 64-битовое знаковое целое (не знаю C)? 3)В документации нет описания поля Data структуры KSSTREAM_HEADER. Что означает тип PVOID? В исходнике я пытаюсь вывести шум на колонки, но мне не известна символьная ссылка.
символьную ссылку обычно используют на устройство, а не на драйвер, учитывая расширенное понятие "устройства" в контексте Windows. получить никак, скорее всего тебе подходит только юзать существующие жестко заданные. си тут не при чем, но ты прав. пустой указатель, он же void*. тип данных, на кот. он указывает, не определен
Разве символьные ссылки не зависят от устройства? Как быть если в системе несколько звуковых карт? Если верить документации указатель на данные передаётся через поле DataUsed (ULONG). Для чего тогда используется Data?
Не зависят. Это просто файл, "указывающий" на устройство и создаваемый для обмена данными с ним из юзермода. Ничего страшного... Каждая звуковая карта (впрочем и любой другой девайс в компе) представляет собой уникальное устройство
murder И обращаясь к устройству через символьную ссылку (Read\Write\IoCtl\etc), вы тем самым взаимодействуете с драйвером, обслуживающим это устройство.
Утилита WDM Audio Graph Inspector из состава DDK каким то образом получает символьные ссылки на драйверы конкретных устройств. Я пытался посылать IOCTL_KS_WRITE_STREAM по следующим символьным ссылкам 1) \\.\sysaudio\playback 2) \\?\root#system#0000#{a7c7a5b1-5af3-11d1-9ced-00a024bf0407}\{a7c7a5b0-5af3-11d1-9ced-00a024bf0407}&{9b365890-165f-11d0-a195-0020afd156e4} 3) \\?\sw#{a7c7a5b0-5af3-11d1-9ced-00a024bf0407}#{9b365890-165f-11d0-a195-0020afd156e4}#{d6c5066e-72c1-11d2-9755-0000f8004788}\sad6 Результат один - DeviceIOControl выдаёт ошибку "неверная функция". Что делать?
Посмотри внимательно Интерфейс управления устройствами MCI (Media Control Interface) позволяет программам для Windows работать с различными устройствами мультимедиа которые включают в себя CD-ROM, звуковую карту, проигрыватель видеодисков, даже видеомагнитофон и т.д. Все функции интерфейса MCI начинаются с префикса mci и делятся на три группы: интерфейс команд сообщений: mciSendCommand() mciGetDeviceID() интерфейс команд строк: mciSendString() оба типа интерфейса: mciGetErrorString() mciSetYieldProc() и библиотека winmm.lib (dll) это обёртка над драйвером описание есть в C++ и Delphi
Насколько я понял из документации MCI позволяет записывать звук файл и воспроизводить из файла (MCI_CAPTURE, MCI_LOAD, MCI_PLAY). Мне нужно обрабатывать данные в оперативной памяти без обращения к диску. Наилучшим интерфейсом является Kernel Streaming но я не понял как создавать необходимые com-объекты через KSCreatePin или CoCreateInstance. В DDK более или менее подробно описаны только IOCTL - сообщения. В принципе требуется не много: с минимальной задержкой получить звук (с микрофона или line-in), обработать его и воспроизвести. При этом нельзя использовать сторонние библиотеки и драйверы. Также было бы неплохо работать сразу с 2 звуковыми картами.