Skip to content

Commit

Permalink
audio: Always call fini on exit
Browse files Browse the repository at this point in the history
Not only clean up enabled voices but any registered one. Backends like
pulsaudio rely on unconditional fini handler invocations.

This fixes "Memory pool destroyed but not all memory blocks freed!"
warnings on VM shutdowns when pa is used and lockups of QEMU on shutdown
as it got stuck on some pa-internal synchronization point.

Signed-off-by: Jan Kiszka <[email protected]>
Signed-off-by: malc <[email protected]>
  • Loading branch information
jan-kiszka authored and malc committed May 24, 2012
1 parent f8687ba commit aeb29b6
Showing 1 changed file with 8 additions and 4 deletions.
12 changes: 8 additions & 4 deletions audio/audio.c
Original file line number Diff line number Diff line change
Expand Up @@ -1775,10 +1775,12 @@ static void audio_atexit (void)
HWVoiceOut *hwo = NULL;
HWVoiceIn *hwi = NULL;

while ((hwo = audio_pcm_hw_find_any_enabled_out (hwo))) {
while ((hwo = audio_pcm_hw_find_any_out (hwo))) {
SWVoiceCap *sc;

hwo->pcm_ops->ctl_out (hwo, VOICE_DISABLE);
if (hwo->enabled) {
hwo->pcm_ops->ctl_out (hwo, VOICE_DISABLE);
}
hwo->pcm_ops->fini_out (hwo);

for (sc = hwo->cap_head.lh_first; sc; sc = sc->entries.le_next) {
Expand All @@ -1791,8 +1793,10 @@ static void audio_atexit (void)
}
}

while ((hwi = audio_pcm_hw_find_any_enabled_in (hwi))) {
hwi->pcm_ops->ctl_in (hwi, VOICE_DISABLE);
while ((hwi = audio_pcm_hw_find_any_in (hwi))) {
if (hwi->enabled) {
hwi->pcm_ops->ctl_in (hwi, VOICE_DISABLE);
}
hwi->pcm_ops->fini_in (hwi);
}

Expand Down

0 comments on commit aeb29b6

Please sign in to comment.