Scream — это драйвер виртуального устройства для Windows, который обеспечивает дискретное звуковое устройство. Звук, воспроизводимый через это устройство, публикуется в вашей локальной сети в виде многоадресного потока PCM.
Приемники в сети могут принимать поток и воспроизводить его через свои собственные аудиовыходы. Приёмники доступны для Unix/Linux (с интерфейсом PulseAudio или ALSA) и для Windows.
Для специального сценария гостя Windows на хосте QEMU @martinellimarco предоставил поддержку передачи звука через механизм драйвера IVSHMEM, аналогичный программному обеспечению сквозной передачи графического процессора «Looking Glass». См. раздел IVSHMEM ниже.
Scream основан на примере кода аудиодрайвера Microsoft MSVAD. Исходный код распространяется под лицензией MS-PL, как и мои изменения и дополнения. Актуальный текст лицензии см. в разделе ЛИЦЕНЗИЯ.
ZIP-файл, содержащий подписанные сборки для Windows 10 на x64, x86 и Arm64, доступен на странице выпусков GitHub. «Установщик» представляет собой пакетный файл, который необходимо запускать с правами администратора.
Microsoft недавно ужесточила правила подписи драйверов ядра. Эти новые правила применяются к более новым установкам Windows 10, которые не были обновлены с более ранней версии. Если ваша установка подчиняется этим правилам, драйвер не будет установлен.
Однако драйверы ядра с перекрестной подписью по-прежнему принимаются Windows 10 версии 1607 (и более поздних версий), если применимо любое из следующих исключений:
Обходной путь № 1: отключите безопасную загрузку в BIOS. Дополнительную информацию см. в этом выпуске.
Обходной путь № 2: добавьте этот специальный параметр реестра:
[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlCIPolicy]
"UpgradedSystem"=dword:00000001
Пожалуйста, просмотрите следующие ресурсы для получения дополнительной информации.
Вышеуказанные методы установки не будут работать в Windows 11, поскольку пакетный файл установки использует devcon-x64
, который несовместим с Windows 11. Вы можете установить неподписанные драйверы для Windows 11 альтернативным методом, используя преемника devcon, pnputil
и bcdedit
чтобы перевести Windows 11 в тестовый режим. Чтобы установить Scream для Windows 11:
bcdedit /set testsigning on
. Перезагрузите компьютер и убедитесь, что в правом нижнем углу обоев отображается «Тестовый режим»./Install/driver//
. Затем введите: pnputil /add-driver .Scream.inf /install
.bcdedit /set testsigning off
. Затем перезагрузите компьютер. Убедитесь, что тестовый режим отключен, убедившись, что в правом нижнем углу обоев нет сообщения «Тестовый режим». Теперь вы должны увидеть аудиоустройство Scream на своих аудиоустройствах и можете продолжить настройку клиента. Unix с Pulsaudio, JACK или ALSA: не входит в пакет установки. Пожалуйста, ознакомьтесь с README в папке Receivers/unix. Различные участники написали код для этого приемника:
Windows: ScreamReader, предоставлено @MrShoenel. Входит в установочный пакет начиная с версии 1.2. Этот ресивер не поддерживает позиционное отображение многоканальных (более чем стерео) настроек – это означает, что несоответствие в настройке динамиков может привести к тому, что каналы будут воспроизводиться в неправильном положении.
Сторонний приемник, поддерживающий потоки Scream, — https://github.com/mincequi/cornrow. В первую очередь он предназначен для встраиваемых устройств.
@tomek-o написал ресиверы для маломощных встраиваемых систем, которые отлично подходят для создания активных динамиков с подключением к Ethernet.
Получатели обычно могут запускаться от имени непривилегированных пользователей. Системы-приемники, имеющие входной брандмауэр, должны открыть порт UDP 4010 или любой другой порт, который вы используете.
Весь звук, воспроизводимый через устройство Scream, будет передаваться в локальную сеть в виде многоадресного потока (использование одноадресной передачи не является обязательным — см. ниже). Задержка минимальна, поскольку вся обработка выполняется на уровне ядра. Пользовательского пространства нет.
Целевой адрес и порт многоадресной рассылки — «239.255.77.77:4010». Звук представляет собой необработанный поток PCM. Частоту и размер выборки по умолчанию можно установить как «Формат по умолчанию» на странице свойств «Дополнительно» драйвера. Конфигурацию динамика/канала по умолчанию можно установить в диалоговом окне «Настройка» звукового устройства Scream.
Данные передаются в кадрах UDP с размером полезной нагрузки макс. 1157 байт, состоящих из 5 байтов заголовка и 1152 байтов данных PCM. Последнее число делится на 4, 6 и 8, поэтому в пакет всегда поместится полное количество сэмплов для всех каналов. Первый байт заголовка обозначает частоту дискретизации. Бит 7 определяет базовую скорость: 0 для 48 кГц, 1 для 44,1 кГц. Другие биты определяют множитель базовой скорости. Второй байт заголовка обозначает ширину выборки в битах. Третий байт заголовка обозначает количество передаваемых каналов. Четвертый и пятый байты заголовка составляют DWORD dwChannelMask из структуры Microsoft WAVEFORMATEXTENSIBLE, описывающую сопоставление каналов с позициями динамиков.
Приемникам просто нужно прочитать поток из сети и поместить его в локальный аудиоприемник. Ядро принимающей системы должно автоматически выполнять необходимую сигнализацию IGMP, поэтому обычно достаточно просто открыть сокет прослушивания многоадресной рассылки и начать чтение из него. Для учета дрожания следует использовать минимальную буферизацию (примерно в 4 раза превышающую размер полезной нагрузки UDP).
Чтобы удовлетворить ваши аудиофильские чувства или уменьшить ненужную повторную выборку, вы можете установить более высокую частоту дискретизации и/или ширину дискретизации. Вы можете сделать это на странице свойств драйвера «Дополнительно», как показано ниже. Предупреждение: использование высоких частот дискретизации с разрядностью 24/32 бита в сочетании с многоканальностью может привести к высокой скорости передачи данных в сети. Мы рекомендуем придерживаться 48 кГц/16 бит для режимов каналов 5.1 и выше или 44,1 кГц/16, если вы собираетесь слушать музыку с компакт-дисков.
ширина="700"/>
Благодаря великолепной работе @martinellimarco, если ваша целевая система имеет настройку многоканальных динамиков, вы можете распространить ее и на Windows. Используйте мастер «Настройка» диалогового окна драйвера звукового устройства, как показано ниже. Обратите внимание, что это всего лишь системные настройки по умолчанию, и что прикладное программное обеспечение (например, игры) может потребовать выполнения собственных настроек.
Это рекомендуется только в том случае, если многоадресная рассылка вызывает проблемы. Настройте реестр так, как показано на этом скриншоте (нужно будет создать ключ «Параметры»), затем перезагрузитесь:
Подавление тишины позволит избежать отправки данных по сети в случае тишины. Как только будет обработано заданное количество последовательных тихих выборок, Scream прекратит отправку данных. Добавьте следующий ключ реестра — рекомендуемое значение — 10 000 выборок (~ 1/4 секунды при частоте 44 100 Гц).
Настройте реестр так, как показано на этом скриншоте (нужно будет создать ключ «Параметры»), затем перезагрузитесь:
️ Примечание. Хотя такая настройка возможна, обычно ее рекомендуется использовать только в том случае, если вы не можете использовать сетевую передачу через стандартное устройство virtio-net. Scream на QEMU не получает преимуществ от использования IVSHMEM. Это увеличивает нагрузку на процессор и задержку из-за опросного характера реализации.
Это можно использовать в качестве альтернативы сетевой передаче по умолчанию при использовании QEMU/KVM.
...
...
2
...
...
Альтернативно, для тех, кто не использует libvirt, вот пример соответствующих частей командной строки QEMU:
...
-device ivshmem-plain,memdev=ivshmem_scream
-object memory-backend-file,id=ivshmem_scream,share=on,mem-path=/dev/shm/scream-ivshmem,size=2M
...
PCI standard RAM Controller
в узле System Devices
необходимо обновить вручную, используя загруженный выше контроллер.HKLMSYSTEMCurrentControlSetServicesScreamOptionsUseIVSHMEM
, где значение равно размеру устройства в МБ (2, как рекомендуется). Обратите внимание, что Scream идентифицирует устройство по его размеру, поэтому у вас должно быть только одно устройство IVSHMEM этого конкретного размера. Также обратите внимание, что вам, возможно, придется создать ключ Options
. Вы также можете вставить эту команду в оболочку CMD администратора, чтобы создать как ключ, так и DWORD: REG ADD HKLMSYSTEMCurrentControlSetServicesScreamOptions /v UseIVSHMEM /t REG_DWORD /d 2
scream -m /dev/shm/scream-ivshmem
Требуется Visual Studio и последняя версия WDK. Удачи!