diff options
Diffstat (limited to 'plugins/alsa/alsa-softmixer.c')
-rw-r--r-- | plugins/alsa/alsa-softmixer.c | 88 |
1 files changed, 66 insertions, 22 deletions
diff --git a/plugins/alsa/alsa-softmixer.c b/plugins/alsa/alsa-softmixer.c index bf195fb..253a00b 100644 --- a/plugins/alsa/alsa-softmixer.c +++ b/plugins/alsa/alsa-softmixer.c @@ -14,42 +14,86 @@ * See the License for the specific language governing permissions and * limitations under the License. * -*/ + */ #define _GNU_SOURCE // needed for vasprintf #include "alsa-softmixer.h" -CTLP_CAPI_REGISTER("alsa-mixer"); +// Force Lua2cWrapper inclusion within already existing plugin +CTLP_LUA_REGISTER("alsa-mixer") // Call at initialisation time CTLP_ONLOAD(plugin, callbacks) { - AFB_ApiDebug (plugin->api, "SoftMixer plugin: uid='%s' 'info='%s'", plugin->uid, plugin->info); - - // fake action call during init for debug - CtlSourceT source; - source.api = plugin->api; - AlsaCreateDmix (&source); - - return 0; + AFB_ApiDebug (plugin->api, "SoftMixer plugin: uid='%s' 'info='%s'", plugin->uid, plugin->info); + return NULL; } -CTLP_CAPI (zone_ctl, source, argsJ, eventJ) { - json_object* subscribeArgsJ = NULL; +CTLP_LUA2C(AlsaRouter, source, argsJ, responseJ) { + json_object *devInJ, *devOutJ, *paramsJ=NULL; + AlsaDevByPathT devIn, devOut; + int err; + + // init default values + memset(&devIn,0,sizeof(AlsaDevByPathT)); + memset(&devOut,0,sizeof(AlsaDevByPathT)); + int rate=ALSA_PCM_DEFAULT_RATE; + int channels=ALSA_PCM_DEFAULT_CHANNELS; + snd_pcm_format_t format=ALSA_PCM_DEFAULT_FORMAT; + snd_pcm_access_t access=ALSA_PCM_DEFAULT_ACCESS; + + + err= wrap_json_unpack(argsJ, "{s:o,s:o,s?o}", "devin", &devInJ, "devout", &devOutJ, "params", ¶msJ); + if (err) { + AFB_ApiNotice(source->api, "--lua2c-- AlsaRouter ARGS missing devIn|devOut args=%s", json_object_get_string(argsJ)); + goto OnErrorExit; + } - int err = 0; - wrap_json_pack(&subscribeArgsJ, "{ss}", "value", "location"); - AFB_ApiDebug(source->api, "Calling zone_ctl with %s", json_object_to_json_string_ext(subscribeArgsJ, JSON_C_TO_STRING_PRETTY)); + AFB_ApiNotice(source->api, "--lua2c-- AlsaRouter **** PARAMS missing 'format|access|rate|channels' params=%s", json_object_get_string(paramsJ)); - return err; + err= wrap_json_unpack(devInJ, "{s?s,s?s,s?i,s?i}", "path", &devIn.devpath, "id",&devIn.devid,"numid",&devIn.numid,"dev", &devIn.device, "sub", &devIn.subdev); + if (err || (!devIn.devpath && !devIn.devid)) { + AFB_ApiNotice(source->api, "--lua2c-- AlsaRouter DEV-IN missing 'path|id|dev|sub|numid' devin=%s", json_object_get_string(devInJ)); + goto OnErrorExit; + } + + err= wrap_json_unpack(devOutJ, "{s?s,s?s,s?i, s?i,s?i}", "path", &devOut.devpath, "id", &devOut.device, "sub", &devOut.subdev); + if (err || (!devOut.devpath && !devOut.devid)) { + AFB_ApiNotice(source->api, "--lua2c-- AlsaRouter DEV-OUT missing 'path|id|dev|sub' devout=%s", json_object_get_string(devOutJ)); + goto OnErrorExit; + } + + if (paramsJ) if ((err= wrap_json_unpack(paramsJ, "{s?i, s?i, s?i, s?i}", "format", &format, "access", &access, "rate", &rate, "channels",&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", devIn.devpath, devOut.devpath, rate, channels); + + // open PCM and start frame copy from binder Mainloop + snd_pcm_t* pcmIn = AlsaByPathOpenPcm(source, &devIn, SND_PCM_STREAM_CAPTURE); + snd_pcm_t* pcmOut = AlsaByPathOpenPcm(source, &devOut, SND_PCM_STREAM_PLAYBACK); + err = AlsaPcmCopy(source, pcmIn, pcmOut, format, access, (unsigned int)rate, (unsigned int)channels); + if(err) goto OnErrorExit; + + // Registration to event should be done after pcm_start + if (devIn.numid) { + err= AlsaCtlRegister(source, pcmIn, devIn.numid); + if(err) goto OnErrorExit; + } + + return 0; + +OnErrorExit: + return -1; } -CTLP_CAPI (stream_ctl, source, argsJ, eventJ) { - json_object* subscribeArgsJ = NULL; +CTLP_LUA2C(AlsaDmix, source, argsJ, responseJ) { + json_object* subscribeArgsJ = NULL; - int err = 0; - wrap_json_pack(&subscribeArgsJ, "{ss}", "value", "location"); - AFB_ApiDebug(source->api, "Calling stream_ctl with %s", json_object_to_json_string_ext(subscribeArgsJ, JSON_C_TO_STRING_PRETTY)); + int err = 0; + wrap_json_pack(&subscribeArgsJ, "{ss}", "value", "location"); + AFB_ApiNotice(source->api, "lua2c router with %s", json_object_to_json_string_ext(subscribeArgsJ, JSON_C_TO_STRING_PRETTY)); - return err; + return err; } |