|
@@ -472,6 +472,24 @@ 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;
|
|
@@ -484,6 +502,7 @@ 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;
|
|
@@ -741,23 +760,11 @@ 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++) {
|
|
|
- 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);
|
|
|
- }
|
|
|
+ hda_close_stream(a, a->st + i);
|
|
|
}
|
|
|
AUD_remove_card(&a->card);
|
|
|
}
|