summaryrefslogtreecommitdiffstats
path: root/plugins/alsa/alsa-softmixer.c
diff options
context:
space:
mode:
authorFulup Ar Foll <fulup@iot.bzh>2018-05-08 22:12:35 +0200
committerFulup Ar Foll <fulup@iot.bzh>2018-05-08 22:12:35 +0200
commite904b7da51297b0417df31ab79568c3f1243fb64 (patch)
tree01a7850d68dcc3983cd0bdfab1ed49ed2e4e675c /plugins/alsa/alsa-softmixer.c
parent17edfc4c20cfd855d68e5b0ef044da2e7509f3f3 (diff)
Fist AlsaLoop model playing music (work in progress)
Diffstat (limited to 'plugins/alsa/alsa-softmixer.c')
-rw-r--r--plugins/alsa/alsa-softmixer.c88
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", &paramsJ);
+ 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;
}