summaryrefslogtreecommitdiffstats
path: root/plugins/alsa/alsa-softmixer.c
diff options
context:
space:
mode:
authorFulup Ar Foll <fulup@iot.bzh>2018-05-13 01:22:24 +0200
committerFulup Ar Foll <fulup@iot.bzh>2018-05-13 01:22:24 +0200
commitca0965cae3ad129e495fd4615ebeb7c11b413a2b (patch)
tree50aa199d84df3f7e61a7e653e57e8af2fd760e61 /plugins/alsa/alsa-softmixer.c
parent1dd1509a02fee564ff87f80c2f29055d7aad889c (diff)
Initial version with softvol,Route,Multi,Dmix
Diffstat (limited to 'plugins/alsa/alsa-softmixer.c')
-rw-r--r--plugins/alsa/alsa-softmixer.c93
1 files changed, 48 insertions, 45 deletions
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", &paramsJ);
+ 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", &paramsJ);
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;
}