From ca0965cae3ad129e495fd4615ebeb7c11b413a2b Mon Sep 17 00:00:00 2001 From: Fulup Ar Foll Date: Sun, 13 May 2018 01:22:24 +0200 Subject: Initial version with softvol,Route,Multi,Dmix --- plugins/alsa/alsa-softmixer.c | 93 ++++++++++++++++++++++--------------------- 1 file changed, 48 insertions(+), 45 deletions(-) (limited to 'plugins/alsa/alsa-softmixer.c') diff --git a/plugins/alsa/alsa-softmixer.c b/plugins/alsa/alsa-softmixer.c index 9586fa3..bd9ee5e 100644 --- a/plugins/alsa/alsa-softmixer.c +++ b/plugins/alsa/alsa-softmixer.c @@ -21,12 +21,16 @@ #include "alsa-softmixer.h" // Force Lua2cWrapper inclusion within already existing plugin + CTLP_LUA_REGISTER("alsa-mixer") +SoftMixerHandleT *Softmixer; + // Call at initialisation time CTLP_ONLOAD(plugin, callbacks) { - AFB_ApiDebug (plugin->api, "SoftMixer plugin: uid='%s' 'info='%s'", plugin->uid, plugin->info); - return NULL; + AFB_ApiDebug(plugin->api, "SoftMixer plugin: uid='%s' 'info='%s'", plugin->uid, plugin->info); + Softmixer = calloc(1, sizeof(SoftMixerHandleT)); + return NULL; } CTLP_LUA2C(AlsaDmix, source, argsJ, responseJ) { @@ -40,75 +44,74 @@ CTLP_LUA2C(AlsaDmix, source, argsJ, responseJ) { } + CTLP_LUA2C(AlsaRouter, source, argsJ, responseJ) { - json_object *sndInJ, *sndOutJ, *paramsJ=NULL; + json_object *sndInJ, *sndOutJ, *paramsJ = NULL; AlsaPcmInfoT *sndIn, *sndOut; int error; - + // make sndIn/Out a pointer to get cleaner code - sndIn=calloc(1, sizeof(AlsaPcmInfoT)); - sndOut=calloc(1, sizeof(AlsaPcmInfoT)); - + sndIn = calloc(1, sizeof (AlsaPcmInfoT)); + sndOut = calloc(1, sizeof (AlsaPcmInfoT)); + // set pcm options to defaults AlsaPcmHwInfoT *pcmOpts; - pcmOpts=calloc(1, sizeof(AlsaPcmHwInfoT)); - pcmOpts->format=SND_PCM_FORMAT_UNKNOWN; - pcmOpts->access=SND_PCM_ACCESS_RW_INTERLEAVED; - - error= wrap_json_unpack(argsJ, "{s:o,s:o,s?o}", "devin", &sndInJ, "devout", &sndOutJ, "params", ¶msJ); + pcmOpts = calloc(1, sizeof (AlsaPcmHwInfoT)); + pcmOpts->format = SND_PCM_FORMAT_UNKNOWN; + pcmOpts->access = SND_PCM_ACCESS_RW_INTERLEAVED; + + error = wrap_json_unpack(argsJ, "{s:o,s:o,s?o}", "devin", &sndInJ, "devout", &sndOutJ, "params", ¶msJ); if (error) { AFB_ApiNotice(source->api, "--lua2c-- AlsaRouter ARGS missing devIn|devOut args=%s", json_object_get_string(argsJ)); goto OnErrorExit; } - error= wrap_json_unpack(sndInJ, "{s?s,s?s,s?i,s?i,s?i}", "path",&sndIn->devpath, "id",&sndIn->devid, "numid",&sndIn->numid, "dev",&sndIn->device, "sub",&sndIn->subdev); - if (error || (!sndIn->devpath && !sndIn->devid)) { + error = wrap_json_unpack(sndInJ, "{s?s,s?s,s?i,s?i,s?i}", "path", &sndIn->devpath, "id", &sndIn->cardid, "numid", &sndIn->numid, "dev", &sndIn->device, "sub", &sndIn->subdev); + if (error || (!sndIn->devpath && !sndIn->cardid)) { AFB_ApiNotice(source->api, "--lua2c-- AlsaRouter DEV-IN missing 'path|id|dev|sub|numid' devin=%s", json_object_get_string(sndInJ)); goto OnErrorExit; } - - error= wrap_json_unpack(sndOutJ, "{s?s,s?s,s?i,s?i, s?i}", "path",&sndOut->devpath, "id",&sndOut->devid, "numid",&sndOut->numid,"dev",&sndOut->device, "sub",&sndOut->subdev); - if (error || (!sndOut->devpath && !sndOut->devid)) { + + error = wrap_json_unpack(sndOutJ, "{s?s,s?s,s?i,s?i, s?i}", "path", &sndOut->devpath, "id", &sndOut->cardid, "numid", &sndOut->numid, "dev", &sndOut->device, "sub", &sndOut->subdev); + if (error || (!sndOut->devpath && !sndOut->cardid)) { AFB_ApiNotice(source->api, "--lua2c-- AlsaRouter DEV-OUT missing 'path|id|dev|sub' devout=%s", json_object_get_string(sndOutJ)); goto OnErrorExit; } - - if (paramsJ) if ((error= wrap_json_unpack(paramsJ, "{s?i, s?i, s?i, s?i}", "format", &pcmOpts->format, "access", &pcmOpts->access, "rate", &pcmOpts->rate, "channels",&pcmOpts->channels)) != 0) { - AFB_ApiNotice(source->api, "--lua2c-- AlsaRouter PARAMS missing 'format|access|rate|channels' params=%s", json_object_get_string(paramsJ)); - goto OnErrorExit; - } - + + if (paramsJ) if ((error = wrap_json_unpack(paramsJ, "{s?i, s?i, s?i, s?i}", "format", &pcmOpts->format, "access", &pcmOpts->access, "rate", &pcmOpts->rate, "channels", &pcmOpts->channels)) != 0) { + AFB_ApiNotice(source->api, "--lua2c-- AlsaRouter PARAMS missing 'format|access|rate|channels' params=%s", json_object_get_string(paramsJ)); + goto OnErrorExit; + } + AFB_ApiNotice(source->api, "--lua2c-- AlsaRouter devin=%s devout=%s rate=%d channel=%d", sndIn->devpath, sndOut->devpath, pcmOpts->rate, pcmOpts->channels); - - // Check sndOut Exist and build a valid devid config - error= AlsaByPathDevid (source, sndOut); + + // Check sndOut Exist and build a valid cardid config + error = AlsaByPathDevid(source, sndOut); if (error) goto OnErrorExit; - - //AlsaPcmInfoT *pcmOut = AlsaByPathOpenPcm(source, sndOut, SND_PCM_STREAM_PLAYBACK); - + // open capture PCM AlsaPcmInfoT *pcmIn = AlsaByPathOpenPcm(source, sndIn, SND_PCM_STREAM_CAPTURE); if (!pcmIn) goto OnErrorExit; - - AlsaPcmInfoT *pcmDmix= AlsaCreateDmix(source, "DmixPlugPcm", sndOut); - if(!pcmDmix) goto OnErrorExit; - - AlsaPcmInfoT *pcmVol= AlsaCreateVol(source, "SoftVol", sndIn, pcmDmix); - if(!pcmVol) goto OnErrorExit; - - error = AlsaPcmCopy(source, pcmIn, pcmVol, pcmOpts); - if(error) goto OnErrorExit; - + + AlsaPcmInfoT *pcmDmix = AlsaCreateDmix(source, "DmixPlugPcm", sndOut); + if (!pcmDmix) goto OnErrorExit; + + //AlsaPcmInfoT *pcmVol = AlsaCreateVol(source, "SoftVol", sndIn, pcmDmix); + //if (!pcmVol) goto OnErrorExit; + + //error = AlsaPcmCopy(source, pcmIn, pcmVol, pcmOpts); + //if (error) goto OnErrorExit; + // Registration to event should be done after pcm_start if (sndIn->numid) { - error= AlsaCtlRegister(source, pcmIn, sndIn->numid); - if(error) goto OnErrorExit; - } - + error = AlsaCtlRegister(source, pcmIn, sndIn->numid); + if (error) goto OnErrorExit; + } + return 0; - + OnErrorExit: AFB_ApiNotice(source->api, "--lua2c-- ERROR AlsaRouter sndIn=%s sndOut=%s rate=%d channel=%d", sndIn->devpath, sndOut->devpath, pcmOpts->rate, pcmOpts->channels); - return -1; + return -1; } -- cgit 1.2.3-korg