{"id":5349,"date":"2023-09-13T02:23:18","date_gmt":"2023-09-13T10:23:18","guid":{"rendered":"https:\/\/wonghoi.humgar.com\/blog\/?p=5349"},"modified":"2025-12-29T23:46:52","modified_gmt":"2025-12-30T07:46:52","slug":"getting-sound-to-work-ubuntu-vm-guests-for-hyper-v","status":"publish","type":"post","link":"https:\/\/wonghoi.humgar.com\/blog\/2023\/09\/13\/getting-sound-to-work-ubuntu-vm-guests-for-hyper-v\/","title":{"rendered":"Getting sound to work Ubuntu VM guests for Hyper-V"},"content":{"rendered":"\n<p>It&#8217;s frustrating that there are no simple packages provided by Microsoft or Ubuntu to get something as basic as sound working on Hyper-V. It&#8217;s nuts that we still have to deal with these kind of integration bullshit in 2023 when people are claiming that Linux is useable! At the time of writing, there are still way too many rough edges on Linux that are clearly not the users&#8217; fault!<\/p>\n\n\n\n<p>To understand why things are the way they are. We have to first understand that Hyper-V talks to the VM under RDP under the hood which has many advantages that the RDP provides. RDP is way less sluggish for the video and sound quality than the damned X11 server, which people spent little time to provide for Windows. MobaXterm is the only decent free X11 server for Windows in terms of user experience but it&#8217;s not the first one that populate search results. <\/p>\n\n\n\n<p>In other words, we&#8217;ll need to set up Linux to stream the apps through RDP, not X11 to take advantage of Hyper-V manager&#8217;s interface (specifically <code>vmconnect.exe<\/code> under the hood). In Linux, this area is not maturely developed and the author of <code>xrdp<\/code> is not keen to make polished packages so most of the time we get pointed to the struggle of compiling the source code.<\/p>\n\n\n\n<p>Given RDP is not native to Linux, xrdp did not rebuild the guts of X11 that maps natively to RDP. Instead it launches a bare minimal RDP session with nothing on it other than a basic client (sesman) that you can use it as a VNC client or X11 client that streams to the bare minimum RDP, so there&#8217;s an extra layer of indirection. You are not running RDP natively. That RDP session is for you to call X11. <\/p>\n\n\n\n<p>Since X11 does not natively stream audio, you need to a sound server (over network) system that streams the audio to the bare minimal RDP layer of xrdp, then have the RDP layer stream\/relay to RDP with <code>pulseaudio-module-xrdp<\/code> (which is a kernel package that you need to build from scratch at the time of writing since there&#8217;s no packages for it).<\/p>\n\n\n\n<p>By the way, if you get this xrdp+pulseaudio ordeal working, you also get (x)RDP working for the linux even if you don&#8217;t use vmconnect to connect to it, because it&#8217;s RDP under the hood anyway.<\/p>\n\n\n\n<p>I followed the messy (and often broken) instructions from multiple sources to build and install pulseaudio-module-xrdp, but it turned out this wasn&#8217;t enough. There&#8217;s no sound and the anticipated sound device didn&#8217;t show up in Ubuntu and all I see is a dummy sound driver. <\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Turns out there are many pieces of the puzzle scattered through different blogs and the blog either has typos, missing a key component, or the URLs changed so it&#8217;s broken. Here&#8217;s an overview of what you need to do<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Replace Pipeware completely with PulseAudio on Ubuntu<\/li>\n\n\n\n<li>RDP Enhanced Session is required for sound. This is true for Windows Guests as well. Linux doesn&#8217;t have RDP so you&#8217;ll need xrdp first before you even talk about enhanced session. Vsocket is how Enhanced Session talk. On Linux side we configure xrdp to talk on vsocket instead of a raw rdp protocol over Port 3389. On Windows we enable Enhanced Session (if not already) and enable hv-socket (with it the Windows side of vsocket).<\/li>\n\n\n\n<li>Since xrdp &#8216;cheats&#8217; by redirecting X11 instead of implementing RDP from the core, you&#8217;ll need to relay the pulseaudio from the Ubuntu itself to the RDP layer which is done by <code>pulseaudio-module-xrdp<\/code>. Unfortunately it&#8217;s does not come with xrdp and there&#8217;s no package so you have to build it yourself the install your compiled product. Remember by default source code repo is disabled so you need to enable it first before following the any build instructions.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Get rid of Pipeware Completely &amp; Install PulseAudio<\/h2>\n\n\n\n<p>Griffon&#8217;s IT library provided the insight that we need to take out Pipeware (the competitior of PulseAudio) completely and replace it with PulseAudio. After that I got it working. Here&#8217;s a path to his tutorial:<\/p>\n\n\n\n<p><a href=\"https:\/\/c-nergy.be\/blog\/?p=18449\">XRDP \u2013 Bring back xRDP sound redirection on Ubuntu 22.10 \u2013 Griffon&#8217;s IT Library (c-nergy.be)<\/a><\/p>\n\n\n\n<p>His tutorial included the script he made to install a more recent xrdp he built but the link is now broken. So what I did turned out to be necessary after all. <\/p>\n\n\n\n<p>His tutorial basically stop\/disabled\/masked the hell out of Pipewire so it&#8217;s dead and deader and make sure the users cannot install it later and displace PulseAudio. It&#8217;s a lot of gymnastics because systemctl disable and mask do not take wildcards so you have to find out each service\/daemon named pipewire. I&#8217;ll take this shortcut instead:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt purge pipewire\n<\/code><\/pre>\n\n\n\n<p>A tool to check if there&#8217;s audio server running (optional) is<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pactl info<\/code><\/pre>\n\n\n\n<p>House keeping and install both pulseaudio and xrdp if not already done. pavucontrol is for controlling the volume which is often needed:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt update\nsudo apt install pulseaudio pavucontrol xrdp\n<\/code><\/pre>\n\n\n\n<p>Then enable pulse audio and start it immediately (the &#8211;now switch follows <em>enable<\/em> with <em>start<\/em>) without rebooting:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>systemctl --user enable --now pulseaudio.service pulseaudio.socket<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Configure Ubuntu and xrdp for Enhanced Session (nothing to do with PulseAudio itself)<\/h2>\n\n\n\n<p>I got the clue from this blog: <a href=\"https:\/\/francescotonini.medium.com\/how-to-install-ubuntu-20-04-on-hyper-v-with-enhanced-session-b20a269a5fa7\">How to install Ubuntu 20.04 on Hyper-V with enhanced session | by Francesco Tonini | Medium<\/a>, but some of the details changed as time moves on so I&#8217;ll document it here for the state of the art in 2023.<\/p>\n\n\n\n<p class=\"has-text-align-center\">Part 1 [DONE BY DEFAULT NOW]: Change xrdp to receive vsocket instead of raw RDP<\/p>\n\n\n\n<p><strong>TLDR<\/strong>: No actionable item here. Included here for educational purposes only as it was a required step before.<\/p>\n\n\n\n<p>Enhanced Session uses vsocket instead of raw Port 3389 for connection which <code>xrdp.ini<\/code> defaults to out of the box. Griffon&#8217;s IT library gave the instruction to replace the <code>port=3389<\/code> to <code>port=vsock:\/\/-1:3389<\/code> in <code>xrdp.ini<\/code>. However it&#8217;s already taken care of in the new <code>install.sh<\/code> script for <code>linux-vm-tools<\/code>:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"412\" src=\"https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2023\/09\/image-36-1024x412.png\" alt=\"\" class=\"wp-image-5370\" srcset=\"https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2023\/09\/image-36-1024x412.png 1024w, https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2023\/09\/image-36-300x121.png 300w, https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2023\/09\/image-36-768x309.png 768w, https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2023\/09\/image-36-1536x619.png 1536w, https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2023\/09\/image-36-500x201.png 500w, https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2023\/09\/image-36.png 1639w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>The more recent xrdp already defaulted to <code>use_vsock=false<\/code>. Discussion: <a href=\"https:\/\/github.com\/neutrinolabs\/xrdp\/issues\/1260\">Cannot establish RDP connection to Ubuntu VM made with Hyper-V Quick Create \u00b7 Issue #1260 \u00b7 neutrinolabs\/xrdp (github.com)<\/a><\/p>\n\n\n\n<p class=\"has-text-align-center\">Part 2: install linux-vm-tools (think of it as vsocket driver)<\/p>\n\n\n\n<p><code>linux-vm-tools<\/code> is &#8220;Hyper-V Linux Guest VM Enhancements&#8221; developed by Microsoft which dropped support for it and <a href=\"https:\/\/github.com\/Hinara\/linux-vm-tools\/\">picked up (forked) by hinara<\/a> to support <a href=\"https:\/\/github.com\/Hinara\/linux-vm-tools\/blob\/ubuntu20-04\/ubuntu\/22.04\/install.sh\">Ubuntu 22.04<\/a>. Hinara&#8217;s version is more updated.<\/p>\n\n\n\n<p>So the first thing you do is to download (can use wget, curl, aria whatever you like as the downloader) the install.sh of the latest\/appropriate version (right now it&#8217;s Ubuntu 22.04):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>wget https:\/\/raw.githubusercontent.com\/Hinara\/linux-vm-tools\/ubuntu20-04\/ubuntu\/22.04\/install.sh<\/code><\/pre>\n\n\n\n<p>This blog (<a href=\"https:\/\/ubuntuforums.org\/showthread.php?t=2481545\">Enable Sound Output Hyper-V (ubuntuforums.org)<\/a>)&#8217;s answer is a little outdated as involves a hack to rename 20.04 to 22.04 and keep the same script. <\/p>\n\n\n\n<p>Note that the folder name at the top level says 20.04 (branch name) but at the lower level says 22.04 (folder name). So be prepared the path might change in the future if the author figured it&#8217;s better to use a consistent branch name later. The safest bet is to go to the Github page and discover the latest version then click raw to get the direct link to use with <code>wget<\/code> (or any file downloader).<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"665\" src=\"https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2023\/09\/image-37-1024x665.png\" alt=\"\" class=\"wp-image-5381\" srcset=\"https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2023\/09\/image-37-1024x665.png 1024w, https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2023\/09\/image-37-300x195.png 300w, https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2023\/09\/image-37-768x499.png 768w, https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2023\/09\/image-37-1536x997.png 1536w, https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2023\/09\/image-37-462x300.png 462w, https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2023\/09\/image-37.png 1707w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Downloads by default are not executable for your safety, so enable the execute attribute with <code>chmod +x<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo chmod +x install.sh<\/code><\/pre>\n\n\n\n<p>and of course execute the install.sh after you checked it&#8217;s all kosher:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo .\/install.sh<\/code><\/pre>\n\n\n\n<p>The last 2 lines of the script tells you to RUN IT AGAIN AFTER REBOOT. It&#8217;s easy to overlook given the text doesn&#8217;t stand out after the user got bombarded with lots of verbose info. <mark style=\"background-color:#ffeb00\" class=\"has-inline-color has-blue-color\">Make sure you follow it!<\/mark><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Configure Hyper-V for Enhanced Session (Host)<\/h2>\n\n\n\n<p>On Windows side, you&#8217;ll need to enable the Windows version of vsocket to communicate with the vsocket. There&#8217;s no curly braces when you type in {your VM&#8217;s name}: <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Set-VM {your VM's name} -EnhancedSessionTransportType HvSocket<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">The chaos trying to build <code>pulseaudio-module-xrdp<\/code><\/h2>\n\n\n\n<p><a href=\"https:\/\/techbloggingfool.com\/2020\/12\/26\/deploy-a-linux-vm-on-hyper-v-with-sound-20-04-edition\/\">Deploy a Linux VM on Hyper-V with Sound 20.04 Edition \u2013 techbloggingfool.com<\/a>&#8216;s scripts do not use the default folder choices by the build script so the changes in the upstream broke his folder scheme by adding a &#8216;<code>+dfsg1<\/code>&#8216; to the folder name. Instead of fixing it, I followed the official instructions on the github page but take advantage of the one very useful piece he provided: enable source code repo: <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"475\" src=\"https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2023\/09\/image-35-1024x475.png\" alt=\"\" class=\"wp-image-5358\" srcset=\"https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2023\/09\/image-35-1024x475.png 1024w, https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2023\/09\/image-35-300x139.png 300w, https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2023\/09\/image-35-768x356.png 768w, https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2023\/09\/image-35-1536x713.png 1536w, https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2023\/09\/image-35-2048x950.png 2048w, https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2023\/09\/image-35-500x232.png 500w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>He has command line scripts that enables the source code too. Given my confidence about linux developer coordinating with people downstream about the naming schemes changes, I&#8217;ll stick with the GUI which gives a consistent interface.<\/p>\n\n\n\n<p>After source repos are allowed, get the build tools (<a href=\"https:\/\/github.com\/neutrinolabs\/pulseaudio-module-xrdp\/wiki\/Build-on-Debian-or-Ubuntu\">official instructions for Ubuntu<\/a>):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt install build-essential dpkg-dev libpulse-dev git autoconf libtool<\/code><\/pre>\n\n\n\n<p>Grab the pulseaudio-modle-xrdp source code and go into that folder<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git clone https:\/\/github.com\/neutrinolabs\/pulseaudio-module-xrdp.git\ncd pulseaudio-module-xrdp<\/code><\/pre>\n\n\n\n<p>Run the <code>install_pulseaudio_sources_apt-wrapper.sh<\/code> under the <code>\/scripts<\/code> folder:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\/scripts\/install_pulseaudio_sources_apt_wrapper.sh<\/code><\/pre>\n\n\n\n<p>(I tried the non &#8216;_wrapper&#8217; version next to it. It works too, but it doesn&#8217;t relieve you from the rest of the build and install process). This is taken straight from <a href=\"https:\/\/github.com\/neutrinolabs\/pulseaudio-module-xrdp\/wiki\/Build-on-Debian-or-Ubuntu\">Build on Debian or Ubuntu \u00b7 neutrinolabs\/pulseaudio-module-xrdp Wiki (github.com)<\/a>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\/bootstrap &amp;&amp; .\/configure PULSE_DIR=$HOME\/pulseaudio.src\nmake<\/code><\/pre>\n\n\n\n<p><code>PULSE_DIR=$HOME\/pulseaudio.src<\/code> because this is the default in the wrapper script above if no arguments are specified. Stick with the defaults (working at home folder) as it&#8217;s not wise to trust people to coordinate their naming scheme consistently. The defaults are likely tested more thoroughly. <\/p>\n\n\n\n<p>And the last step is to install your hard work (<a href=\"https:\/\/github.com\/neutrinolabs\/pulseaudio-module-xrdp\/wiki\/README#install\">README \u00b7 neutrinolabs\/pulseaudio-module-xrdp Wiki (github.com)<\/a>):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo make install<\/code><\/pre>\n\n\n\n<p>which you can OPTIONALLY check your work to see if the kernel modules are indeed installed:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ls $(pkg-config --variable=modlibexecdir libpulse) | grep xrdp<\/code><\/pre>\n\n\n\n<p>[Optional Cleanup] If you don&#8217;t have anything named pulseaudio that you&#8217;d like to keep, you can clean up by removing the files using wildcard and the install.sh<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo rm -rf ~\/pulseaudio*\nsudo rm ~\/install.sh<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Summary<\/h2>\n\n\n\n<p>Here&#8217;s a consolidated &#8216;script&#8217; to show the complexity. I do not recommend copying and pasting it as the dependencies might change and it might break.  <\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Change audio server in Ubuntu\nsudo apt -y update\nsudo apt -y purge pipewire\nsudo apt -y install pulseaudio pavucontrol xrdp\nsystemctl --user enable --now pulseaudio.service pulseaudio.socket\n\n# [Optional] check if PulseAudio was installed correctly\npactl info\n\n# Build pulseaudio-module-xrdp and install the kernel modules\n# Stick with official instructions which assumes home folder\ncd ~\nsudo apt -y install build-essential dpkg-dev libpulse-dev git autoconf libtool\ngit clone https:\/\/github.com\/neutrinolabs\/pulseaudio-module-xrdp.git\ncd pulseaudio-module-xrdp\n.\/scripts\/install_pulseaudio_sources_apt_wrapper.sh\n.\/bootstrap &amp;&amp; .\/configure PULSE_DIR=$HOME\/pulseaudio.src\nmake\nsudo make install\n\n# [Optional] check if pulseaudio-module-xrdp was installed correctly\nls $(pkg-config --variable=modlibexecdir libpulse) | grep xrdp\n\n# Install linux-vm-tools which enables Enhanced Session\n# Give linux-vm-tools its own folder to avoid confusion\nmkdir -p ~\/linux-vm-tools \n# Note: \"... &amp;&amp; cd $_\" will \ncd ~\/linux-vm-tools\nwget https:\/\/raw.githubusercontent.com\/Hinara\/linux-vm-tools\/ubuntu20-04\/ubuntu\/22.04\/install.sh\nsudo chmod +x install.sh\nsudo .\/install.sh\n\n# The last 2 lines of screen output of install.sh tells you to reboot and run this again\n# This is automated below by making a icon in Gnome desktop's autostart folder\n# that will self-destruct after first launch\ncat > ~\/.config\/autostart\/startonce.desktop &lt;&lt;EOF\n[Desktop Entry]\nType=Application\nName=startonce.desktop\nExec=gnome-terminal -- sh -c 'sudo ~\/linux-vm-tools\/install.sh &amp;&amp; rm -rf ~\/pulseaudio-module-xrdp ~\/pulseaudio.src ~\/linux-vm-tools ~\/.config\/autostart\/startonce.desktop &amp;&amp; init 0;$SHELL'\nEOF\n\nsudo reboot<\/pre>\n\n\n\n<p>I also noticed a quirk that the first reboot after everything&#8217;s installed might be a little too fast. In this case restart again once more. So instead I just have the desktop shortcut shutdown your VM after it&#8217;s done and have you manually start it again so it&#8217;d work right the first time.<\/p>\n\n\n\n<p>I&#8217;ve created a Github repo for my own convenience, but feel free to use it however way you like, but I&#8217;m not responsible for any damages it might cause. Better read through the code with the help of this blog page and understand what it does and decide if you want to try it for your setup. I tried to make it robust, but it&#8217;s designed to be installed on freshly install Ubuntu guest VMs.<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/wonghoi\/enhanced_session_linux\/\">https:\/\/github.com\/wonghoi\/enhanced_session_linux\/<\/a><\/p>\n<div class=\"pvc_clear\"><\/div><p id=\"pvc_stats_5349\" class=\"pvc_stats all  \" data-element-id=\"5349\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/svg><\/i> <img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/wonghoi.humgar.com\/blog\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif\" border=0 \/><\/p><div class=\"pvc_clear\"><\/div>","protected":false},"excerpt":{"rendered":"<p>It&#8217;s frustrating that there are no simple packages provided by Microsoft or Ubuntu to get something as basic as sound working on Hyper-V. It&#8217;s nuts that we still have to deal with these kind of integration bullshit in 2023 when &hellip; <a href=\"https:\/\/wonghoi.humgar.com\/blog\/2023\/09\/13\/getting-sound-to-work-ubuntu-vm-guests-for-hyper-v\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_5349\" class=\"pvc_stats all  \" data-element-id=\"5349\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/svg><\/i> <img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/wonghoi.humgar.com\/blog\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif\" border=0 \/><\/p>\n<div class=\"pvc_clear\"><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[77,70],"tags":[],"class_list":["post-5349","post","type-post","status-publish","format-standard","hentry","category-ubuntu-linux","category-vm"],"_links":{"self":[{"href":"https:\/\/wonghoi.humgar.com\/blog\/wp-json\/wp\/v2\/posts\/5349","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wonghoi.humgar.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wonghoi.humgar.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wonghoi.humgar.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wonghoi.humgar.com\/blog\/wp-json\/wp\/v2\/comments?post=5349"}],"version-history":[{"count":87,"href":"https:\/\/wonghoi.humgar.com\/blog\/wp-json\/wp\/v2\/posts\/5349\/revisions"}],"predecessor-version":[{"id":6908,"href":"https:\/\/wonghoi.humgar.com\/blog\/wp-json\/wp\/v2\/posts\/5349\/revisions\/6908"}],"wp:attachment":[{"href":"https:\/\/wonghoi.humgar.com\/blog\/wp-json\/wp\/v2\/media?parent=5349"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wonghoi.humgar.com\/blog\/wp-json\/wp\/v2\/categories?post=5349"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wonghoi.humgar.com\/blog\/wp-json\/wp\/v2\/tags?post=5349"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}