diff options
m--------- | libavirt | 0 | ||||
-rw-r--r-- | plugins/alsa/alsa-api-loop.c | 11 | ||||
-rw-r--r-- | plugins/alsa/alsa-transaction.c | 21 | ||||
-rw-r--r-- | plugins/alsa/alsa-transaction.h | 1 |
4 files changed, 30 insertions, 3 deletions
diff --git a/libavirt b/libavirt -Subproject 53755ac91f5dc408c250f6313a924244fefe895 +Subproject 648a5dfc291738f655fa903f2e5f6899817e812 diff --git a/plugins/alsa/alsa-api-loop.c b/plugins/alsa/alsa-api-loop.c index e5e6af5..7e852a8 100644 --- a/plugins/alsa/alsa-api-loop.c +++ b/plugins/alsa/alsa-api-loop.c @@ -159,7 +159,7 @@ STATIC AlsaLoopSubdevT *ProcessOneAvirtSubdev(SoftMixerT *mixer, AlsaSndLoopT *l } error = snd_avirt_stream_new(uid, zone->ccount, - SND_PCM_STREAM_PLAYBACK, "ap_loopback"); + SND_PCM_STREAM_PLAYBACK, "ap_loopback", false); if (error < 0) { AFB_ApiError(mixer->api, "%s: mixer=%s stream=%s could not create AVIRT stream [errno=%d]", @@ -363,7 +363,7 @@ STATIC AlsaSndLoopT *AttachOneLoop(SoftMixerT *mixer, const char *uid, json_obje goto fail_snd_card; } - snd_avirt_card_seal(); + snd_avirt_card_configure(); // try to open sound card control interface loop->sndcard->ctl = AlsaByPathOpenCtl(mixer, loop->uid, loop->sndcard); @@ -413,6 +413,10 @@ static void loopDestroy(SoftMixerT * mixer, void* arg) { mixer->nbLoops--; cds_list_del(&loop->list); + + if (loop->avirt) + snd_avirt_card_unconfigure(); + free(loop); AFB_ApiDebug(mixer->api, "DONE !"); @@ -427,7 +431,8 @@ static AlsaSndLoopT * loopCreate(SoftMixerT *mixer, const char *uid, json_object mixer->nbLoops++; cds_list_add(&newLoop->list, &mixer->loops.list); - AlsaMixerTransactionObjectAdd(mixer->transaction, newLoop, loopDestroy); + /* We need the loops to be at the end of the list, so that they are destroyed last */ + AlsaMixerTransactionObjectAddTail(mixer->transaction, newLoop, loopDestroy); loopsDisplay(mixer); diff --git a/plugins/alsa/alsa-transaction.c b/plugins/alsa/alsa-transaction.c index 1958c87..dcfd028 100644 --- a/plugins/alsa/alsa-transaction.c +++ b/plugins/alsa/alsa-transaction.c @@ -67,6 +67,27 @@ fail: } +bool AlsaMixerTransactionObjectAddTail(AlsaMixerTransaction* list, void* object, AlsaTransactionDestructor destructor) { + bool ret = false; + AlsaMixerTransactionDataItem * newItem = NULL; + if (!list) + goto fail; + + newItem = (AlsaMixerTransactionDataItem *) malloc(sizeof(AlsaMixerTransactionDataItem)); + if (newItem == NULL) + goto fail; + + CDS_INIT_LIST_HEAD(&newItem->list_entry); + newItem->object = object; + newItem->destructor = destructor; + cds_list_add_tail(&newItem->list_entry, &list->item_list); + + ret = true; +fail: + return ret; + +} + void AlsaMixerTransactionDoCleanup(AlsaMixerTransaction* transaction) { AlsaMixerTransactionDataItem * item, *sav; diff --git a/plugins/alsa/alsa-transaction.h b/plugins/alsa/alsa-transaction.h index dd6e91b..ba45ae7 100644 --- a/plugins/alsa/alsa-transaction.h +++ b/plugins/alsa/alsa-transaction.h @@ -30,6 +30,7 @@ extern void AlsaMixerTransactionDelete(AlsaMixerTransaction * transaction); extern void AlsaMixerTransactionDataListDestroy(AlsaMixerTransaction*); extern bool AlsaMixerTransactionObjectAdd(AlsaMixerTransaction*, void * object, AlsaTransactionDestructor destructor); +extern bool AlsaMixerTransactionObjectAddTail(AlsaMixerTransaction* list, void* object, AlsaTransactionDestructor destructor); extern void AlsaMixerTransactionObjectForget(AlsaMixerTransaction* list, void * object); |