Итак, на дворе 2023 год. Состояние звуковой подсистемы в QEMU все то же - оно сломано.
РЕШЕНИЕ!!! И общие заметки по состоянию на текущий момент.
-
Не надо подключать cdrom реальной машины, это ломает звук! То есть -cdrom /dev/cdrom добавлять не стоит.
-
Вывод через hda эмулируемые сетевые карты напрямую (не через SPICE) - сломан. Через бэкенд pa (pulseaudio) вывод идет намного быстрее чем надо, постоянные глитчи. Через бэкенд alsa - у меня работает нормально, но какие-то глюки при запуске воспроизведения. Они сразу же проходят и выводится чисто. Можно использовать, но работает не очень стабильно при переключении окон, фоновой нагрузке. Возможно, тут нужно увеличивать буферы.
-audiodev alsa,id=snd0 -device ich9-intel-hda -device hda-output,audiodev=snd0
- Вывод через SPICE, hda звуковая карта в qemu - работает лучше всего. Это по дефолту и ставит virt-manager.
-audiodev spice,id=snd0 -device ich9-intel-hda -device hda-output,audiodev=snd0
- Вывод через ac97 работает, если выбрать бэкенд alsa (спасибо superuser). Работает хорошо, но раз в несколько секунд происходит глитч. На реальной музыке это практически не заметно, на тестовом сигнале я слышу. Это - предпочтительный вариант для применения без SPICE.
-audiodev alsa,id=snd0 -device -device ac97,audiodev=snd0
ЦЕЛИКОМ рабочая конфигурация
qemu-system-x86_64 -enable-kvm -rtc base=localtime -cpu host,hv_relaxed,hv_spinlocks=0x1fff,hv_vapic,hv_time -smp 2,sockets=1,cores=2,threads=1 -m 2G -netdev user,id=mynet0 -device virtio-net-pci,netdev=mynet0 -vga qxl -device virtio-serial-pci -device virtio-balloon -spice unix=on,addr=/tmp/vm_spice.socket,disable-ticketing=on,playback-compression=off -device virtserialport,chardev=spicechannel0,name=com.redhat.spice.0 -chardev spicevmc,id=spicechannel0,name=vdagent -audiodev spice,id=snd0 -device ich9-intel-hda -device hda-output,audiodev=snd0 -device ich9-usb-ehci1,id=usb -device ich9-usb-uhci1,masterbus=usb.0,firstport=0,multifunction=on -device ich9-usb-uhci2,masterbus=usb.0,firstport=2 -device ich9-usb-uhci3,masterbus=usb.0,firstport=4 -chardev spicevmc,name=usbredir,id=usbredirchardev1 -device usb-redir,chardev=usbredirchardev1,id=usbredirdev1 -chardev spicevmc,name=usbredir,id=usbredirchardev2 -device usb-redir,chardev=usbredirchardev2,id=usbredirdev2 -chardev spicevmc,name=usbredir,id=usbredirchardev3 -device usb-redir,chardev=usbredirchardev3,id=usbredirdev3 -drive file=~/vms/Win10-main.qcow2 -device usb-tablet,bus=usb.0 -monitor stdio
ДАЛЕЕ - для истории, исходный пост
Пробую практически в любых конфигурациях, в любых сочетаниях параметров, на разных гостевых ОС - без глюков не выводится звук ни при каких условиях. Призываю всех, кому нужен звук на виртуалке, присоединиться к процессу разбирательства - какого, собственно, черта так происходит годами.
ЭКСПЕРИМЕНТ 1, вывод через SPICE
Начинаю вот с такого, полная строка запуска
qemu-system-x86_64 -enable-kvm -rtc base=localtime -cpu host,hv_relaxed,hv_spinlocks=0x1fff,hv_vapic,hv_time -smp 2,sockets=1,cores=2,threads=1 -m 2G -netdev user,id=mynet0 -device virtio-net-pci,netdev=mynet0 -vga qxl -device virtio-serial-pci -device virtio-balloon -spice unix=on,addr=/tmp/vm_spice.socket,disable-ticketing=on,playback-compression=off -device virtserialport,chardev=spicechannel0,name=com.redhat.spice.0 -chardev spicevmc,id=spicechannel0,name=vdagent -audiodev spice,id=snd0,out.mixing-engine=off,out.buffer-length=200000,out.fixed-settings=off -device ich9-intel-hda -device hda-output,audiodev=snd0 -device ich9-usb-ehci1,id=usb -device ich9-usb-uhci1,masterbus=usb.0,firstport=0,multifunction=on -device ich9-usb-uhci2,masterbus=usb.0,firstport=2 -device ich9-usb-uhci3,masterbus=usb.0,firstport=4 -chardev spicevmc,name=usbredir,id=usbredirchardev1 -device usb-redir,chardev=usbredirchardev1,id=usbredirdev1 -chardev spicevmc,name=usbredir,id=usbredirchardev2 -device usb-redir,chardev=usbredirchardev2,id=usbredirdev2 -chardev spicevmc,name=usbredir,id=usbredirchardev3 -device usb-redir,chardev=usbredirchardev3,id=usbredirdev3 -drive file=~/vms/Win10-main.qcow2,if=virtio -drive file=~/vms/diskb.qcow2,if=virtio -device usb-tablet,bus=usb.0 -cdrom /dev/cdrom -monitor stdio
Конкретно звук в ней:
-audiodev spice,id=snd0,out.mixing-engine=off,out.buffer-length=200000,out.fixed-settings=off -device ich9-intel-hda -device hda-output,audiodev=snd0
Симптомы: примерно раз в секунду происходит щелчок. На записи видны две проблемы: выпадение куска на 10мс (идет тишина вместо сигнала), и наоборот, съедается какой-то кусок (виден резкий скачок на синусе, сбивается фаза синуса после этого).
С виртуалки вывел синус ровно 60 секунд, на записи - около 59 секунд. То есть сигнал съедался.
ЭКСПЕРИМЕНТ 2, вывод через Pulse
-audiodev pa,id=snd0 -device ich9-intel-hda -device hda-output,audiodev=snd0
Симптомы те же. Но! Теперь минутный фрагмент стал короче на… 15 секунд! То есть виртуалка выводит звук намного быстрее, чем нужно!
При этом - частота дискретизации, передискретизация - правильная, я получаю синус ровно той же частоты, что и был! Ускорение происходит за счет сбивок, съедания кусков.
ВОПРОСЫ
1 Есть ли у кого-то опыт подбора опций, которые дают на 2023 год нормальную работу звука в QEMU?
2 Есть ли идеи, что вообще может побуждать виртуалку выводить звук настолько быстрее? В ней время идет некорректно, что-то с таймерами, или что?