LINUX.ORG.RU

QEMU. Звук. 2023. Опять все сломано

 , , ,


0

4

Итак, на дворе 2023 год. Состояние звуковой подсистемы в QEMU все то же - оно сломано.

РЕШЕНИЕ!!! И общие заметки по состоянию на текущий момент.

  1. Не надо подключать cdrom реальной машины, это ломает звук! То есть -cdrom /dev/cdrom добавлять не стоит.

  2. Вывод через hda эмулируемые сетевые карты напрямую (не через SPICE) - сломан. Через бэкенд pa (pulseaudio) вывод идет намного быстрее чем надо, постоянные глитчи. Через бэкенд alsa - у меня работает нормально, но какие-то глюки при запуске воспроизведения. Они сразу же проходят и выводится чисто. Можно использовать, но работает не очень стабильно при переключении окон, фоновой нагрузке. Возможно, тут нужно увеличивать буферы.

-audiodev alsa,id=snd0 -device ich9-intel-hda -device hda-output,audiodev=snd0
  1. Вывод через SPICE, hda звуковая карта в qemu - работает лучше всего. Это по дефолту и ставит virt-manager.
-audiodev spice,id=snd0 -device ich9-intel-hda -device hda-output,audiodev=snd0
  1. Вывод через 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 Есть ли идеи, что вообще может побуждать виртуалку выводить звук настолько быстрее? В ней время идет некорректно, что-то с таймерами, или что?

★★★

Последнее исправление: James_Holden (всего исправлений: 6)

При этом всем - запись звука внутри виртуалки, при помощи Audacity запущенного на госте например, идет без проблем. На ней глюков нет.

James_Holden ★★★
() автор топика
Ответ на: комментарий от firkax

Да, это не влияет.

Судя по всему, меня сейчас опять фанаты libvirt закидают субстанцией, поэтому ладно, пойдем другим путем.

Установил все то же самое через virt-manager - звук работает нормально.

Теперь задача, значит, сводится к тому, чтобы вытянуть опции оттуда и выяснить, что фиксит.

James_Holden ★★★
() автор топика
Ответ на: комментарий от i586

Вообще я годами не могу понять, зачем этот либвирт собственно нужен, и зачем поверх простых и понятных опций QEMU наворачивать непрозрачный слой абстракции на XML файлах, который никто не понимает что он внутри делает.

Отсюда и сабжевые проблемы. Звук работать может, но как этого добиться - это знание для избранных (разработчиков либвирта). Простым смертным не положено.

James_Holden ★★★
() автор топика
Ответ на: комментарий от James_Holden

непрозрачный слой абстракции на XML файлах

Ладно бы оно решало проблему совместимости на разных ВМ, как вроде и задумывалось, но кроме qemu разве что-то используется?

GAMer ★★★★★
()
Ответ на: комментарий от GAMer

LXC вроде.

Короче, с этим возник эпический обломамс.

Я конечно вытянул строку запуска qemu из virt-manager, но! Аххаха

Она не работает без libvirt. Он плещет такие опции, которые вне libvirt не работают.

James_Holden ★★★
() автор топика
Ответ на: комментарий от James_Holden

Вообще я годами не могу понять, зачем этот либвирт собственно нужен, и зачем поверх простых и понятных опций QEMU наворачивать непрозрачный слой абстракции на XML файлах, который никто не понимает что он внутри делает.

Чтобы помочь разобраться в проблеме, я должен быть в состоянии ее воспроизвести. Опции существенно меняются от версии к версии, помнить это невозможно.

Добавлю еще, что в rhel, например, вообще не предполагается такое использование QEMU. Даже qemu-system-x86_64 нет.

i586 ★★★★★
()
Ответ на: комментарий от i586

Ну видимо, придется таки на virt-manager полностью переходить.

Короче, в применении с libvirt один вопрос остался - как мне сразу загрузиться в снапшот виртуалки, с определенным именем?

James_Holden ★★★
() автор топика
Последнее исправление: James_Holden (всего исправлений: 1)
Ответ на: комментарий от James_Holden

Я конечно вытянул строку запуска qemu из virt-manager, но! Аххаха

Она не работает без libvirt. Он плещет такие опции, которые вне libvirt не работают.

Да, и про звук в том числе. В основном не про звук, но если их убрать - все запускается и звук трещит.

например?

kindof
()
Ответ на: комментарий от kindof

Там в таком духе идет

-blockdev {"node-name":"libvirt-2-format","read-only":true,"driver":"qcow2","file":"libvirt-2-storage","backing":null}

Да и банально вот это

-machine pc-q35-7.2,usb=off,vmport=off,dump-guest-core=off,memory-backend=pc.ram

не работает, голый qemu такого не понимает.

James_Holden ★★★
() автор топика
Ответ на: комментарий от James_Holden

Там в таком духе идет

ну это libvirt парсит, не qemu

а про звук?

Установил все то же самое через virt-manager - звук работает нормально.

чот не срастается:

в топике - virtio/spice/usb

из либвирта - nousb/file/pc.ram

kindof
()
Ответ на: комментарий от kindof

Ну так, если бы с либвиртом срасталось - я бы давно его использовал. Да, вот такие непонятки. Тем не менее, с такими опциями все работает, и usb и звук без глюков.

За это я его и не люблю - я не могу понять как он это делает.

А, да - в virt-manager просто создана виртуалка по дефолту, туда подключен образ диска который я скриптом запускал.

James_Holden ★★★
() автор топика
Последнее исправление: James_Holden (всего исправлений: 1)
Ответ на: комментарий от kindof

Вот по звуку кусок

-audiodev {"id":"audio1","driver":"spice"} -device {"driver":"ich9-intel-hda","id":"sound0","bus":"pcie.0","addr":"0x1b"} -device {"driver":"hda-duplex","id":"sound0-codec0","bus":"sound0.0","cad":0,"audiodev":"audio1"} -global ICH9-LPC.noreboot=off

В таком виде голый qemu это не принимает.

James_Holden ★★★
() автор топика
Ответ на: комментарий от James_Holden

зачем поверх простых и понятных опций QEMU наворачивать непрозрачный слой абстракции на XML файлах

Затем, что я не хочу писать миллион опций для описания виртуалки. А этот ваш XML я вообще в глаза не вижу, спасибо virt-manager

XMs ★★★★★
()
Ответ на: комментарий от James_Holden

ну так и запусти qemu вместо:

-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

с:

-audiodev spice,id=audio1  -device ich9-intel-hda,id=sound0,bus=pcie.0,addr=0x1b -device hda-duplex,id=sound0-codec0,bus=sound0.0,cad=0,audiodev=audio1 -global ICH9-LPC.noreboot=off

например

kindof
()
Ответ на: комментарий от firkax

В каком интерфейсе. Конечно я смотрю процесс.

Еще раз - все не так просто. Я тоже думал, что сейчас скопирую опции и все. А вот нет. Он с ними не стартует в отрыве от.

James_Holden ★★★
() автор топика
Ответ на: комментарий от James_Holden

Очень сомнительно звучит что бинарник qemu меняет своё поведение, будучи запущеным из разных мест. В одинарные кавычки каждый аргумент заворачивал? А то там двойные кавычки, если их написать как есть то шелл всё испортит.

$ echo {"id":"audio1","driver":"spice"}
id:audio1 driver:spice      // bash
{id:audio1,driver:spice}    // posix
$ echo '{"id":"audio1","driver":"spice"}'
{"id":"audio1","driver":"spice"}
firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от superuser

Точнее нет, скорее всего это как раз работает, но у меня другое ломает звук, поэтому так как ты предлагаешь не получается пока, все равно трещит.

James_Holden ★★★
() автор топика
Ответ на: комментарий от greenman

@firkax

Короче, это комичный трендец. Звук ломал сидиром!!!

В стартовом посте приведена команда запуска, так вот, она прямо так и работает, если убрать

-cdrom /dev/cdrom

Потому что эта собака каждую секунду опрашивала долбаный сидиром реальной машины, который я сдуру присобачил, и ломала звук.

Сейчас в стартовый пост добавлю итоговую инфу, там есть еще интересные моменты.

James_Holden ★★★
() автор топика
Ответ на: комментарий от James_Holden

-cdrom /dev/cdrom

А изначально эта строка с какой целью была добавлена? Или это копипаста с какого-то ресурса?

Интересуюсь, т.к. сам являюсь активно юзаю Qemu. Но в основном запускаю изошники дистров. )

krasnh ★★★
()
Последнее исправление: krasnh (всего исправлений: 1)