mirror of https://github.com/xemu-project/xemu.git
Revert "hw/audio/hda: fix memory leak on audio setup"
This reverts commit 6d03242a7e47815ed56687ecd13f683d8da3f2fe, which causes SPICE audio to break. While arguably this is a SPICE bug, it is possible to fix the leak in a less heavy-handed way. Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2639 Cc: qemu-stable@nongnu.org Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Michael Tokarev <mjt@tls.msk.ru> Message-ID: <20241114125318.1707590-2-pbonzini@redhat.com> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
This commit is contained in:
parent
c3d7c18b0d
commit
e125d9835b
|
@ -472,24 +472,6 @@ static void hda_audio_set_amp(HDAAudioStream *st)
|
|||
}
|
||||
}
|
||||
|
||||
static void hda_close_stream(HDAAudioState *a, HDAAudioStream *st)
|
||||
{
|
||||
if (st->node == NULL) {
|
||||
return;
|
||||
}
|
||||
if (a->use_timer) {
|
||||
timer_free(st->buft);
|
||||
st->buft = NULL;
|
||||
}
|
||||
if (st->output) {
|
||||
AUD_close_out(&a->card, st->voice.out);
|
||||
st->voice.out = NULL;
|
||||
} else {
|
||||
AUD_close_in(&a->card, st->voice.in);
|
||||
st->voice.in = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void hda_audio_setup(HDAAudioStream *st)
|
||||
{
|
||||
bool use_timer = st->state->use_timer;
|
||||
|
@ -502,7 +484,6 @@ static void hda_audio_setup(HDAAudioStream *st)
|
|||
trace_hda_audio_format(st->node->name, st->as.nchannels,
|
||||
fmt2name[st->as.fmt], st->as.freq);
|
||||
|
||||
hda_close_stream(st->state, st);
|
||||
if (st->output) {
|
||||
if (use_timer) {
|
||||
cb = hda_audio_output_cb;
|
||||
|
@ -760,11 +741,23 @@ static void hda_audio_init(HDACodecDevice *hda,
|
|||
static void hda_audio_exit(HDACodecDevice *hda)
|
||||
{
|
||||
HDAAudioState *a = HDA_AUDIO(hda);
|
||||
HDAAudioStream *st;
|
||||
int i;
|
||||
|
||||
dprint(a, 1, "%s\n", __func__);
|
||||
for (i = 0; i < ARRAY_SIZE(a->st); i++) {
|
||||
hda_close_stream(a, a->st + i);
|
||||
st = a->st + i;
|
||||
if (st->node == NULL) {
|
||||
continue;
|
||||
}
|
||||
if (a->use_timer) {
|
||||
timer_free(st->buft);
|
||||
}
|
||||
if (st->output) {
|
||||
AUD_close_out(&a->card, st->voice.out);
|
||||
} else {
|
||||
AUD_close_in(&a->card, st->voice.in);
|
||||
}
|
||||
}
|
||||
AUD_remove_card(&a->card);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue