diff options
author | Fulup Ar Foll <fulup@iot.bzh> | 2018-05-13 02:12:25 +0200 |
---|---|---|
committer | Fulup Ar Foll <fulup@iot.bzh> | 2018-05-13 02:12:25 +0200 |
commit | 0eb15da6365910ba3f290e3254719fd412ae0155 (patch) | |
tree | 5dc1f6027573fe21b3519b2dbafd2b45bb151c73 | |
parent | ca0965cae3ad129e495fd4615ebeb7c11b413a2b (diff) |
First version muxing multiple audio streams.
-rw-r--r-- | conf.d/project/lua.d/softmixer-01.lua | 9 | ||||
-rw-r--r-- | plugins/alsa/alsa-api-sndcards.c | 4 | ||||
-rw-r--r-- | plugins/alsa/alsa-api-sndstreams.c | 33 | ||||
-rw-r--r-- | plugins/alsa/alsa-plug-dmix.c | 3 | ||||
-rw-r--r-- | plugins/alsa/alsa-plug-multi.c | 3 | ||||
-rw-r--r-- | plugins/alsa/alsa-plug-route.c | 2 | ||||
-rw-r--r-- | plugins/alsa/alsa-plug-stream.c | 3 |
7 files changed, 34 insertions, 23 deletions
diff --git a/conf.d/project/lua.d/softmixer-01.lua b/conf.d/project/lua.d/softmixer-01.lua index 8b586a7..ed60192 100644 --- a/conf.d/project/lua.d/softmixer-01.lua +++ b/conf.d/project/lua.d/softmixer-01.lua @@ -33,6 +33,7 @@ end function _mixer_config_ (source, args) do local error + local response -- ============================= Sound Cards =================== @@ -77,7 +78,7 @@ function _mixer_config_ (source, args) sndcard_2, } - error= L2C:snd_cards (source, sndcards) + error,response= L2C:snd_cards (source, sndcards) if (error ~= 0) then AFB:error (source, "--InLua-- L2C:snd_cards fail to attach sndcards=%s", Dump_Table(sndcards)) goto OnErrorExit @@ -122,7 +123,7 @@ function _mixer_config_ (source, args) zone_back, } - error= L2C:snd_zones (source, multi_zones) + error,response= L2C:snd_zones (source, multi_zones) if (error ~= 0) then AFB:error (source, "--InLua-- L2C:snd_zones fail to attach sndcards=%s", Dump_Table(multi_zones)) goto OnErrorExit @@ -148,7 +149,7 @@ function _mixer_config_ (source, args) } } - error= L2C:snd_loops (source, snd_aloop) + error,response= L2C:snd_loops (source, snd_aloop) if (error ~= 0) then AFB:error (source, "--InLua-- L2C:snd_loops fail to attach sndcards=%s", Dump_Table(aloop)) goto OnErrorExit @@ -186,7 +187,7 @@ function _mixer_config_ (source, args) stream_children, } - error= L2C:snd_streams (source, snd_streams) + error,response= L2C:snd_streams (source, snd_streams) if (error ~= 0) then AFB:error (source, "--InLua-- L2C:snd_streams fail to attach sndcards=%s", Dump_Table(aloop)) goto OnErrorExit diff --git a/plugins/alsa/alsa-api-sndcards.c b/plugins/alsa/alsa-api-sndcards.c index d48abd8..e98a294 100644 --- a/plugins/alsa/alsa-api-sndcards.c +++ b/plugins/alsa/alsa-api-sndcards.c @@ -75,7 +75,9 @@ STATIC int ProcessOneSndCard(CtlSourceT *source, json_object *sndcardJ, AlsaPcmI } // protect each sndcard with a dmix plugin to enable audio-stream mixing - AlsaPcmInfoT *dmixPcm= AlsaCreateDmix(source, snd->uid, snd); + char dmixUid[100]; + snprintf(dmixUid, sizeof(dmixUid),"Dmix-%s", snd->uid); + AlsaPcmInfoT *dmixPcm= AlsaCreateDmix(source, dmixUid, snd); if (!dmixPcm) { AFB_ApiError(source->api, "ProcessOneSndCard: sndcard=%s fail to attach dmix plugin", snd->uid); goto OnErrorExit; diff --git a/plugins/alsa/alsa-api-sndstreams.c b/plugins/alsa/alsa-api-sndstreams.c index 9f5d90f..1ee0029 100644 --- a/plugins/alsa/alsa-api-sndstreams.c +++ b/plugins/alsa/alsa-api-sndstreams.c @@ -109,10 +109,13 @@ CTLP_LUA2C(snd_streams, source, argsJ, responseJ) { goto OnErrorExit; } - // instantiate stream as a softvol + // return stream data to application as a json array + *responseJ = json_object_new_array(); + for (int idx = 0; sndStream[idx].uid != NULL; idx++) { - + json_object *streamJ; + // Search for a free loop capture device AFB_ApiNotice(source->api, "L2C:sndstreams stream=%s Start", (char*)sndStream[idx].uid); ctlLoop->scount--; @@ -122,34 +125,42 @@ CTLP_LUA2C(snd_streams, source, argsJ, responseJ) { } // Retrieve subdev loop device and open corresponding pcm - AlsaPcmInfoT *devLoop = &ctlLoop->subdevs[ctlLoop->scount]; - AlsaPcmInfoT *pcmLoop = AlsaByPathOpenPcm(source, devLoop, SND_PCM_STREAM_CAPTURE); - if (!pcmLoop) goto OnErrorExit; + AlsaPcmInfoT *playbackDev = &ctlLoop->subdevs[ctlLoop->scount]; + + // capture use the same card/subdev as playback with a different device + playbackDev->device= ctlLoop->capture; + AlsaPcmInfoT *captureDev = AlsaByPathOpenPcm(source, playbackDev, SND_PCM_STREAM_CAPTURE); + if (!captureDev) goto OnErrorExit; - AlsaPcmInfoT *streamPcm = AlsaCreateStream(source, &sndStream[idx], pcmLoop); + AlsaPcmInfoT *streamPcm = AlsaCreateStream(source, &sndStream[idx], captureDev); if (!streamPcm) { AFB_ApiError(source->api, "L2C:sndstreams fail to create stream=%s", (char*) sndStream[idx].uid); goto OnErrorExit; } // capture stream inherit channel from targeted zone - pcmLoop->ccount = streamPcm->ccount; + captureDev->ccount = streamPcm->ccount; sndStream[idx].params.channels=streamPcm->ccount; // start stream pcm copy - error = AlsaPcmCopy(source, pcmLoop, streamPcm, &sndStream[idx].params); + error = AlsaPcmCopy(source, captureDev, streamPcm, &sndStream[idx].params); if (error) goto OnErrorExit; // Registration to event should be done after pcm_start - if (pcmLoop->numid) { - error = AlsaCtlRegister(source, pcmLoop, pcmLoop->numid); + if (captureDev->numid) { + error = AlsaCtlRegister(source, captureDev, captureDev->numid); if (error) goto OnErrorExit; } + // prepare response for application + playbackDev->device= ctlLoop->playback; + error = AlsaByPathDevid(source, playbackDev); + wrap_json_pack(&streamJ, "{ss ss si}", "uid", sndStream[idx].uid, "alsa", playbackDev->cardid, "numid", captureDev->numid); + json_object_array_add(*responseJ,streamJ); // Debug Alsa Config //AlsaDumpElemConfig (source, "\n\nAlsa_Config\n------------\n", "pcm"); - AlsaDumpPcmInfo(source, "\n\nPcm_config\n-----------\n", streamPcm->handle); + //AlsaDumpPcmInfo(source, "\n\nPcm_config\n-----------\n", streamPcm->handle); AFB_ApiNotice(source->api, "L2C:sndstreams stream=%s OK\n", (char*) sndStream[idx].uid); } diff --git a/plugins/alsa/alsa-plug-dmix.c b/plugins/alsa/alsa-plug-dmix.c index e28d009..22b5117 100644 --- a/plugins/alsa/alsa-plug-dmix.c +++ b/plugins/alsa/alsa-plug-dmix.c @@ -71,8 +71,7 @@ PUBLIC AlsaPcmInfoT* AlsaCreateDmix(CtlSourceT *source, const char* pcmName, Als } // Debug config & pcm - AlsaDumpCtlConfig (source, "plug-dmix", dmixConfig, 1); - //AlsaDumpPcmInfo(source, pcmPlug->handle, pcmPlug->cardid); + //AlsaDumpCtlConfig (source, "plug-dmix", dmixConfig, 1); AFB_ApiNotice(source->api, "AlsaCreateDmix: %s done\n", pcmPlug->cardid); return pcmPlug; diff --git a/plugins/alsa/alsa-plug-multi.c b/plugins/alsa/alsa-plug-multi.c index d6ef46e..6deca96 100644 --- a/plugins/alsa/alsa-plug-multi.c +++ b/plugins/alsa/alsa-plug-multi.c @@ -57,7 +57,7 @@ PUBLIC AlsaPcmInfoT* AlsaCreateMulti(CtlSourceT *source, const char *pcmUid) { snprintf (idxS, sizeof(idxS), "%d", pcmPlug->ccount++); // multi does not support to name channels error += snd_config_make_compound(&bindingConfig,idxS, 0); - error += snd_config_imake_string(&elemConfig, "slave", sndcard->cardid); + error += snd_config_imake_string(&elemConfig, "slave", sndcard->uid); error += snd_config_add(bindingConfig, elemConfig); error += snd_config_imake_integer(&elemConfig,"channel", channelIdx); error += snd_config_add(bindingConfig, elemConfig); @@ -94,7 +94,6 @@ PUBLIC AlsaPcmInfoT* AlsaCreateMulti(CtlSourceT *source, const char *pcmUid) { // Debug config & pcm //AlsaDumpCtlConfig(source, "plug-multi", multiConfig, 1); - //AlsaDumpPcmInfo(source, pcmPlug->handle, "pcmPlug->handle"); AFB_ApiNotice(source->api, "AlsaCreateMulti: %s done\n", pcmPlug->cardid); return pcmPlug; diff --git a/plugins/alsa/alsa-plug-route.c b/plugins/alsa/alsa-plug-route.c index dc75b56..2c8f3cb 100644 --- a/plugins/alsa/alsa-plug-route.c +++ b/plugins/alsa/alsa-plug-route.c @@ -129,7 +129,7 @@ PUBLIC AlsaPcmInfoT* AlsaCreateRoute(CtlSourceT *source, AlsaSndZoneT *zone) { } // Debug config & pcm - AlsaDumpCtlConfig(source, "plug-route", routeConfig, 1); + //AlsaDumpCtlConfig(source, "plug-route", routeConfig, 1); AFB_ApiNotice(source->api, "AlsaCreateRoute:zone(%s) done\n", zone->uid); return pcmPlug; diff --git a/plugins/alsa/alsa-plug-stream.c b/plugins/alsa/alsa-plug-stream.c index fccb309..e0ef69a 100644 --- a/plugins/alsa/alsa-plug-stream.c +++ b/plugins/alsa/alsa-plug-stream.c @@ -109,8 +109,7 @@ PUBLIC AlsaPcmInfoT* AlsaCreateStream(CtlSourceT *source, AlsaSndStreamT *stream } // Debug config & pcm - AlsaDumpCtlConfig (source, "plug-stream", streamConfig, 1); - //AlsaDumpPcmInfo(source, pcmPlug->handle, "pcmPlug->handle"); + //AlsaDumpCtlConfig (source, "plug-stream", streamConfig, 1); AFB_ApiNotice(source->api, "AlsaCreateStream:%s(stream) done\n", stream->uid); return pcmPlug; |