Opened 3 years ago
Closed 2 years ago
#841 closed defect (fixed)
Intel HD Audio stuttering in VirtualBox
Reported by: | Jiri Svoboda | Owned by: | |
---|---|---|---|
Priority: | major | Milestone: | 0.12.1 |
Component: | helenos/unspecified | Version: | mainline |
Keywords: | virtualbox | Cc: | |
Blocker for: | Depends on: | ||
See also: |
Description
When I try playing audio in VirtualBox using HD Audio device, the sound is stuttering
Change History (7)
comment:1 by , 3 years ago
Keywords: | virtualbox added |
---|
comment:2 by , 3 years ago
Milestone: | → 0.12.1 |
---|
comment:3 by , 2 years ago
comment:4 by , 2 years ago
I've verified that we receive HD Audio interrupts in VirtualBox. The function hda_ctl_interrupt gets called while stream playback is in progress. I can see more than the usual number of last ditch effort process RIRB messages during the setup phase, but nothing during playback.
comment:5 by , 2 years ago
The driver does not check for buffer underrun. HD Audio informs of buffer underrun in form of FIFO Error bit in stream descriptor status register. It is even possible to get an interrupt when this bit is turned on (but this complicates interrupt handling quite a bit). I've tried checking this bit in the interrupt handler (which is invoked upon buffer completion). There is another problem, i.e. which stream descriptors to check. In Qemu unused stream descriptors have a status of 0x00, in VirtualBox they have status 0xff. (Ideally we would only check used stream descriptors). Anyway I hacked it temporarily and found out that we do not get any FIFO errors in VirtualBox.
What else could be wrong? I am thinking whether the buffers are allocated correctly and whether we could have some problem with the audio data format. Currently the driver seems to always set a fixed audio format. It does read the supported formats from the audio converted widget, but then ignores them. It always tries to set 44100 Hz, 16 bits, 1 channel.
comment:6 by , 2 years ago
Root cause: VirtualBox HD Audio reports a number of output converters. One of them (ID 8) seems to be the 'correct' one, supporting 16-bit PCM @ 44100 Hz, the others reporting 0 for both rates and format.
When faced with multiple output converters, which one should hdaudio driver send the audio to? Currently it initializes all of them, just in case, with the same stream as source. But this clearly doesn't work correctly here, the output converters seem to fight over the stream, creating the stuttering. If I enable just the one audio converter, audio plays fine!
How do we fix this properly? In this particular case we could filter out the 'fake' converters based on their capabilities. That should solve this particular problem. What to do in case of multiple valid output converters is another question.
comment:7 by , 2 years ago
Resolution: | → fixed |
---|---|
Status: | new → closed |
Fixed in changeset 0d59ea7ea0080e71c460e8251bb84b50f0ed8bc8.
It is also possible to configure VirtualBox with a SB16 soundcard. Using SB16 the sound output is just fine (albeit a little quieter).
When using HD Audio the sound stutters horribly. No abnormal messages appear in /log/hdaudio.