Проектирование и разработка подсистемы виртуализации звука в Parallels Desktop (1187416), страница 5
Текст из файла (страница 5)
- Монитор виртуальных машин занимается обработкой запросов к ac97-cовместимой эмулируемой аудио карте, конфигурирует унифицированный аудио поток, переносит аудио данные из DMA ,буфера в аудио поток, а так же передает контрольные запросы в часть виртуальной машины, исполняющейся в режиме пользователя
- Пользовательское приложение обрабатывает запросы от монитора на запуск/остановку аудио потока и передает их в аудио библиотеку. Так же этот компонент занимается управлением выбора реального устройства воспроизведения и задержками виртуализированного аудио потока
- Аудио библиотека является обёрткой вокруг интерфейса Core Audio, позволяющей использовать унифицированный̆ аудио поток в
качестве источника данных и информации о формате воспроизведения. Так же она дает пользовательской части приложения простой интерфейс для работы с информацией̆ о присутствующих в системе реальных аудио устройствах, учитывая особенности работы виртуальных машин
Разработка велась итеративно со следующими стадиями:
- Расширение кольцевого буфера до унифицированного аудио
потока
- Пошаговый перенос кода обработки запросов к ac97-
совместимой эмулируемой карте из пользовательского приложения в монитор виртуальных машин
- Написание кода конфигурации параметров унифицированного аудио потока, изменяющего эти параметры в при доступе к mmio регистрам эмулируемой аудио карты
- Изменение интерфейса взаимодействия монитора виртуальных машин и пользовательского приложения
- Переход на использование унифицированного аудио потока в качестве единственного источника данных и конфигурации аудио в пользовательском коде эмуляции.
4.3 Разработка аудио библиотеки
Как было указано в главе 3, существующие аудио библиотеки не удовлетворяли требованиям к хостовой части аудио подсистемы виртуальной машины, и поэтому было принято решение написать свой аудио компонент на базе интерфейса, предоставляемого Core Audio. Основной цикл работы в этом случае выглядит так [14]:
- Клиент создает обьект Audio Unit (HAL Audio Unit), выставляет необходимый формат аудио данных, параметры воспроизведения, регистрирует функцию обратного вызова и запускает воспроизведение
- Core Audio вызывает функцию обратного вызова как только необходимо произвести трансферт данных. В качестве параметра передается указатель на буфер, в котором содержатся данные, либо который необходимо заполнить данными. Так продолжается до момента остановки.
Такой подход в явном виде не учитывает ряд особенностей работы с аудио устройствами в среде OSX, которые так же должны быть учтены в аудио библиотеке:
- В списке устройств, предоставляемом библиотекой Core Audio нет “устройства по умолчанию”. Но есть параметр системы, который указывает на текущее устройство, которое считается таким. Из этого следует, что смена “устройства по умолчанию” должна быть обработана нашей аудио библиотекой (библиотека Portaudio не решала эту проблему, что приводило к излишней запутанности кода эмуляции).
- Тестирование прототипа, использующего Core Aduio для воспроизведения звука показало, что несмотря на ряд заверений
разработчиков Apple, эта аудио библиотека не умеет работать с форматами, в которых частота дискретизации не поддерживается аудио устройством, используемым для работы. Эта проблема может быть решена при помощи компонента Core Audio – AudioConverter, принцип работы которого совпадает с принципом работы HAL Audio Unit и основан на функции обратного вызова. Особенностью этого конвертера является то, что в качестве параметра при конвертации передается количество фреймов аудио данных, которые нужно получить на выходе из конвертера. Такой подход является очень удобным в случае воспроизведения: HAL Audio Unit запрашивает определенное количество квантов аудио в своей функции обратного вызова. Мы это же количество квантов запрашиваем у Audio Converter Unit’а, а тот в свою очередь выберет из нашего унифицированного аудио потока ровно столько фреймов, сколько ему необходимо (а в случае несовпадения частоты дискретизации ему может понадобиться как большее количество фреймов, так и меньшее). Но в этом случае для устройства записи возникает закономерная проблема: получив в функции обратного вызова пакет данных конкретной длинны – мы не знаем, какое количество квантов в гостевом формате выйдет из этого пакета после трансформации, а значит мы не знаем какой параметр выдать в трансформатор. Проблема заключается в том, что при некратном значении отношения хостовой и гостевой частоты дискретизации при конвертации запрашиваются пакеты данных фиксированного размера, и если из аудио устройства придет некратное размеру пакета количество данных, то часть из них не будет использована и без дополнительных действие со стороны аудио библиотеки пропадет, что для пользователя будет звучать как искажение звука. Обзор существующих решений показал что с этой проблемой борются созданием дополнительного кольцевого буфера между HAL Audio Unit и Audio Converter Unit.
- Функции обратного вызова в Core Audio не потоко-безопасны в том смысле, что могут быть вызваны после остановки и даже закрытия аудио устройства. Ряд библиотек не учитывал эту особенность и потому имел серьезные проблемы со стабильностью.
Учитывая выявленные выше особенности, было принято решение использовать следующую архитектуру:
CAudioPipeline – обертка вокруг унифицированного аудио потока, реализующую простую read/write семантику, и инкапсулирующего внутри себя логику по предобразованию аудио форматов.
CAudioUnit – обьект, инкапсулирующий логику инициализации и работы с HAL Audio Unit.
CAudioUnitManager – singletone обьект, занимающийся маршрутизацией запросов между CAudioUnit’ми и Core Audio. Является точкой входа для сторонних компонентов, и разрешает проблемы исполнения функций обратного вызова в устаревшем контексте при помощи механизма подсчета поколений аудио юнитов.
Отдельным компонентом является менеджер устройств, который позволяет подписываться на изменения в списке устройств в системе и получении информации о них. Так как его функционал востребован сразу несколькими частями приложения, то его код вынесен в отдельную библиотеку.
5. Оценка результатов работы
Оценка результатов работы была проведена на базе измерения следущих метрик:
1. Полная величина задержки при неизменном значении величины пребуферизации
2. Частота возникновения искажений в VoIP приложениях при автоматической подстройке громкости аудио
Для проверки первого утверждения был собран следующий стенд: на физической машине MacPro 2 x 2,8 GHz Quad-Core Intel Xeon с установленной на ней OS X 10.10 линейный выход было соединен с линейным входом шнуром 3.5 jack. Внутри виртуальной машины (2 virtual CPU cores) Windows 8 было установлено приложение Audacity [36], позволяющее стартовать одновременную воспроизведение аудио сигнала и запись. В качестве аудио сигнала была выбрана синусоида, а в качестве метрики – задержка между началом воспроизведения и началом записи сигнала. Результаты измерений приведены в таблице 2.
Старая архитектура | Новая архитектура | |
Задержка полная, мс | 119 ±15 | 86 ±11 |
Таблица 2. Сравнение величин полной задежки
Таким образом, полная задержка виртуализированного аудиотракта была снижена на 27% при неизменной величине пребуферизации.
На том же стенде удалось обнаружить качественный скачек в скорости обработки изменения громкости аудиоустройств. Для этого на том же стенде было установлено приложение Lync [37] и совершен звонок. На старой аудио архитектуре были очевидны искажения аудио сигнала. В версии с новой архитектурой эти помехи устранены.
6. Заключение
В рамках данной работы был приведен анализ существующей архитектуры виртуализированного аудио потока в продукте Parallels Desktop, выявлены слабые стороны, и предоставлен анализ и сравнение возможных архитектурных изменений, улучшающих аудио характеристики продукта. Были проанализированы следующие вопросы, раскрывающие подходы к улучшению системы:
- Вопрос уместности дополнительного слоя буферизации между эмулируемой аудио картой и хостовой аудио системой. Формальный анализ этой проблемы показал, что используемый в текущей реализации подход, предполагающий использование дополнительного буфера, является более предпочтительным перед подходами, реализованными в рамках других виртуализационных продуктов.
- Проблема выбора подходящей аудио библиотеки. Обзор существующих решений (в том числе и ранее использованного в продукте) показал, что они не удовлетворяют требованиям со стороны виртуализационного ПО, и, следовательно, наилучшим решением являлось написание собственной аудио библиотеки.
Таким образом, анализ показал, что наиболее оптимальным решением в вопросе улучшения аудио харатктеристик продукта Parallels Desktop является использование текущей архитектуры аудио потока (с рядом некритичных изменений) и имплементация собственной библиотеки для работы с аудио устройствами, учитывающей специфику виртуализацотнного ПО.
Проведенная оценка результатов работы показала, что выбранный подход оправдал себя, и полная задержка аудио тракта упала почти на треть, при неизменной величине пребуферизации.
Тем не менее, стоит отметить ряд вопросов, которые все еще остаются актуальными, являясь по сути логическим продолжением данной работы:
- Развитие формальной модели виртуализированного аудиотракта. Анализ с учетом нестационарной природы нагрузки системы.
- Обзор методик управлением приоритетами виртуальной машины и анализ их применимости.
- Анализ методологий предсказания аудиосигнала в случаях простоя генератора.
В заключение хотелось бы особенно поблагодарить Константина Озеркова и Анну Мелехову за неоценимую помощь в работе.
7. Список использованной литературы
1. ADAMS, K. AND AGESEN, O. 2006. A comparison of software and hardware techniques for x86 virtualiza- tion. In Proceedings of the 12th International Conference on Architectural Support for Programming Languages and Operating Systems (ASPLOS-XII). 2–13.
2. AMD. AMD64 Virtualization Codenamed “Pacifica” Technology: Secure Virtual Machine Architecture Reference Manual, May 2005.
3. INTEL CORPORATION. Intel Virtualization Technology Specifica- tion for the IA-32 Intel Architecture, April 2005.
4. http://www.vmware.com/products/esxi-and-esx/overview
5. http://www.linux-kvm.org/page/Main_Page
6. http://www.vmware.com/ru/products/workstation
7. http://www.parallels.com/ru/products/desktop
8. Christopher Clark , Keir Fraser , Steven Hand , Jacob Gorm Hansen , Eric Jul , Christian Limpach , Ian Pratt , Andrew Warfield, Live migration of virtual machines, Proceedings of the 2nd conference on Symposium on Networked Systems Design & Implementation, p.273-286, May 02-04, 2005
9. MANACHER, G.K. Production and stabihzation of real-time task schedules. J. ACM 14' 3 (July 1967), 439-465.
10. Raoul Rivas , Ahsan Arefin , Klara Nahrstedt, Janus: a cross-layer soft real- time architecture for virtualization, Proceedings of the 19th ACM International Symposium on High Performance Distributed Computing, June 21-25, 2010, Chicago, Illinois
11. Vincent Legout , Matthieu Lemerre Paravirtualizing Linux in a real-time hypervisor, ACM SIGBED Review - 2nd Workshop on Embed With Linux
12. RT-Xen: towards real-time hypervisor scheduling in xen
13. Martin, James (1965). Programming Real-time Computer Systems.
Englewood Cliffs, NJ: Prentice-Hall Inc. p. 4. ISBN 013-730507-9.
14. http://www.portaudio.com/docs/latency.html
15. https://developer.apple.com/library/mac/documentation/MusicAudio/Concep
tual/CoreAudioOverview/CoreAudioEssentials/CoreAudioEssentials.html
16. https://msdn.microsoft.com/en-
us/library/windows/desktop/dd756612(v=vs.85).aspx
17. A. C. Younkin and P. J. Corriveau "Determining the amount of audio-video synchronization errors perceptible to the average end-user", IEEE Trans. Broadcast., vol. 54, pp.623 -627 2008
18. ITU-T Recommendation G.114
19. http://www.yamahaproaudio.com/europe/en_gb/training_support/selftrainin
g/audio_quality/chapter5/05_absolute_latency/
20. http://www.asio4all.com/
21. http://www.linux-kvm.org/page/Main_Page
22. https://www.virtualbox.org
23. http://www.di.ens.fr/~guatto/sbac13.pdf
24. http://www.intel.com/content/dam/www/public/us/en/documents/product-
specifications/high-definition-audio-specification.pdf
25. http://www.portaudio.com/
26. https://developer.apple.com/library/mac/documentation/MusicAudio/Concep
tual/AudioUnitProgrammingGuide/AudioUnitDevelopmentFundamentals/A
udioUnitDevelopmentFundamentals.html
27. http://www.intel.com/content/dam/www/public/us/en/documents/technical-