diff options
Diffstat (limited to 'plugins/alsa')
-rw-r--r-- | plugins/alsa/CMakeLists.txt | 42 | ||||
-rw-r--r-- | plugins/alsa/alsa-dmix.c | 67 | ||||
-rw-r--r-- | plugins/alsa/alsa-lua.c | 45 | ||||
-rw-r--r-- | plugins/alsa/alsa-softmixer.c | 55 | ||||
-rw-r--r-- | plugins/alsa/alsa-softmixer.h | 49 | ||||
-rw-r--r-- | plugins/alsa/alsa-tools-high.c | 66 | ||||
-rw-r--r-- | plugins/alsa/alsa-tools-low.c | 55 |
7 files changed, 379 insertions, 0 deletions
diff --git a/plugins/alsa/CMakeLists.txt b/plugins/alsa/CMakeLists.txt new file mode 100644 index 0000000..51f4639 --- /dev/null +++ b/plugins/alsa/CMakeLists.txt @@ -0,0 +1,42 @@ +########################################################################### +# Copyright 2015, 2016, 2017 IoT.bzh +# +# author: Romain Forlot <romain.forlot@iot.bzh> +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +########################################################################### + + +PROJECT_TARGET_ADD(alsa-router) + + file(GLOB SOURCE_FILES "alsa-*.c") + + # Define targets + ADD_LIBRARY(${TARGET_NAME} MODULE ${SOURCE_FILES}) + + # Alsa Plugin properties + SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES + LABELS "PLUGIN" + PREFIX "" + SUFFIX ".ctlso" + OUTPUT_NAME ${TARGET_NAME} + ) + + # Library dependencies (include updates automatically) + TARGET_LINK_LIBRARIES(${TARGET_NAME} + ${link_libraries} + ) + + target_include_directories(${TARGET_NAME} + PRIVATE "${CMAKE_SOURCE_DIR}/app-controller-submodule/ctl-lib" + PRIVATE "${CMAKE_SOURCE_DIR}/mixer-binding") diff --git a/plugins/alsa/alsa-dmix.c b/plugins/alsa/alsa-dmix.c new file mode 100644 index 0000000..b162d04 --- /dev/null +++ b/plugins/alsa/alsa-dmix.c @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2018 "IoT.bzh" + * Author Fulup Ar Foll <fulup@iot.bzh> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#define _GNU_SOURCE // needed for vasprintf + +#include "alsa-softmixer.h" + +static int uniqueIpcIndex = 1024; + + +PUBLIC int AlsaCreateDmix(CtlSourceT *source) { + + AFB_ApiNotice(source->api, "AlsaCreateDmix: start "); + + int cardid= AlsaCardInfoByPath ("/dev/snd/by-id/usb-Focusrite_Scarlett_18i8_USB_10004EE6-00"); + AFB_ApiNotice(source->api, "AlsaCreateDmix: cardid=%d ", cardid); + + snd_pcm_t *dmixPcm; + snd_config_t *dmixConfig, *slaveConfig, *elemConfig; + snd_pcm_stream_t streamPcm = SND_PCM_STREAM_PLAYBACK; + int error = 0, streamMode = SND_PCM_NONBLOCK; + + + error += snd_config_top(&dmixConfig); + error += snd_config_imake_integer(&elemConfig, "ipc_key", uniqueIpcIndex++); + error += snd_config_add(dmixConfig, elemConfig); + if (error) goto OnErrorExit; + + error += snd_config_make_compound(&slaveConfig, "slave", 0); + error += snd_config_imake_string(&elemConfig, "pcm", "hw:6"); + error += snd_config_add(slaveConfig, elemConfig); + if (error) goto OnErrorExit; + + // add leaf into config + error += snd_config_add(dmixConfig, slaveConfig); + if (error) goto OnErrorExit; + + snd_config_update(); + AlsaDumpConfig (source, snd_config, 1); + AlsaDumpConfig (source, dmixConfig, 1); + + + int status = _snd_pcm_dmix_open(&dmixPcm, "MyDMix", snd_config, dmixConfig, streamPcm , streamMode); + + AFB_ApiNotice(source->api, "AlsaCreateDmix: done"); + + return status; + +OnErrorExit: + AFB_ApiNotice(source->api, "AlsaCreateDmix: OnErrorExit"); + return 1; +}
\ No newline at end of file diff --git a/plugins/alsa/alsa-lua.c b/plugins/alsa/alsa-lua.c new file mode 100644 index 0000000..8f1329f --- /dev/null +++ b/plugins/alsa/alsa-lua.c @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2017 "IoT.bzh" + * Author Fulup Ar Foll <fulup@iot.bzh> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +#define _GNU_SOURCE // needed for vasprintf + +#include "alsa-softmixer.h" + + +// Force Lua2cWrapper inclusion within already existing plugin +Lua2cWrapperT Lua2cWrap; + +CTLP_LUA2C (AlsaDmix, source, argsJ, responseJ) { + json_object* subscribeArgsJ = NULL; + + int err = 0; + wrap_json_pack(&subscribeArgsJ, "{ss}", "value", "location"); + AFB_ApiNotice(source->api, "--lua2c-- AlsaDmix"); + + return err; +} + +CTLP_LUA2C (AlsaRouter, source, argsJ, responseJ) { + json_object* subscribeArgsJ = NULL; + + 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; +} diff --git a/plugins/alsa/alsa-softmixer.c b/plugins/alsa/alsa-softmixer.c new file mode 100644 index 0000000..bf195fb --- /dev/null +++ b/plugins/alsa/alsa-softmixer.c @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2017 "IoT.bzh" + * Author Fulup Ar Foll <fulup@iot.bzh> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * 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"); + +// 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; +} + +CTLP_CAPI (zone_ctl, source, argsJ, eventJ) { + json_object* subscribeArgsJ = NULL; + + 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)); + + return err; +} + +CTLP_CAPI (stream_ctl, source, argsJ, eventJ) { + 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)); + + return err; +} diff --git a/plugins/alsa/alsa-softmixer.h b/plugins/alsa/alsa-softmixer.h new file mode 100644 index 0000000..d413929 --- /dev/null +++ b/plugins/alsa/alsa-softmixer.h @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2018 "IoT.bzh" + * Author Fulup Ar Foll <fulup@iot.bzh> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +#define _GNU_SOURCE // needed for vasprintf + +#ifndef _ALSA_SOFTMIXER_ +#define _ALSA_SOFTMIXER_ + +#include <afb/afb-binding.h> +#include <systemd/sd-event.h> +#include <json-c/json_object.h> +#include <stdbool.h> +#include <string.h> + +#include "ctl-plugin.h" +#include "wrap-json.h" + +#include <alsa/asoundlib.h> + +// Provide proto for LibASound low level API +int _snd_pcm_dmix_open(snd_pcm_t **pcmp, const char *name, + snd_config_t *root, snd_config_t *conf, + snd_pcm_stream_t stream, int mode); + +// alsa-tools-high.c +PUBLIC void AlsaDumpConfig (CtlSourceT *source, snd_config_t *config, int indent); + +// alsa-tools-low.c +PUBLIC int AlsaCardInfoByPath (const char *control); + + +PUBLIC int AlsaCreateDmix (CtlSourceT *source); + +#endif
\ No newline at end of file diff --git a/plugins/alsa/alsa-tools-high.c b/plugins/alsa/alsa-tools-high.c new file mode 100644 index 0000000..a86ba2e --- /dev/null +++ b/plugins/alsa/alsa-tools-high.c @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2018 "IoT.bzh" + * Author Fulup Ar Foll <fulup@iot.bzh> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#define _GNU_SOURCE // needed for vasprintf + + +#include "alsa-softmixer.h" + + +PUBLIC void AlsaDumpConfig(CtlSourceT *source, snd_config_t *config, int indent) { + snd_config_iterator_t it, next; + + // hugly hack to get minimalist indentation + char *pretty = alloca(indent + 1); + for (int idx = 0; idx < indent; idx++) pretty[idx] = '-'; + pretty[indent] = '\0'; + + snd_config_for_each(it, next, config) { + snd_config_t *node = snd_config_iterator_entry(it); + const char *key; + + // ignore comment en empty lines + if (snd_config_get_id(node, &key) < 0) continue; + + switch (snd_config_get_type(node)) { + long valueI; + const char *valueS; + + case SND_CONFIG_TYPE_INTEGER: + snd_config_get_integer(node, &valueI); + AFB_ApiNotice(source->api, "DumpAlsaConfig: %s %s: %d (int)", pretty, key, (int) valueI); + break; + + case SND_CONFIG_TYPE_STRING: + snd_config_get_string(node, &valueS); + AFB_ApiNotice(source->api, "DumpAlsaConfig: %s %s: %s (str)", pretty, key, valueS); + break; + + case SND_CONFIG_TYPE_COMPOUND: + AFB_ApiNotice(source->api, "DumpAlsaConfig: %s %s { ", pretty, key); + AlsaDumpConfig(source, node, indent + 2); + AFB_ApiNotice(source->api, "DumpAlsaConfig: %s } ", pretty); + break; + + default: + snd_config_get_string(node, &valueS); + AFB_ApiNotice(source->api, "DumpAlsaConfig: %s: key=%s unknown=%s", pretty, key, valueS); + break; + } + } +} diff --git a/plugins/alsa/alsa-tools-low.c b/plugins/alsa/alsa-tools-low.c new file mode 100644 index 0000000..57b5e5c --- /dev/null +++ b/plugins/alsa/alsa-tools-low.c @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2018 "IoT.bzh" + * Author Fulup Ar Foll <fulup@iot.bzh> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#define _GNU_SOURCE // needed for vasprintf + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <ctype.h> +#include <fcntl.h> +#include <sys/ioctl.h> + +#include "alsa-softmixer.h" + +// extracted IOCTLs from <alsa/asoundlib.h> +#define _IOR_HACKED(type,nr,size) _IOC(_IOC_READ,(type),(nr),size) +#define SNDRV_CTL_IOCTL_CARD_INFO(size) _IOR_HACKED('U', 0x01, size) + +// Clone of AlsaLib snd_card_load2 static function +int AlsaCardInfoByPath (const char *devpath) { + int open_dev; + snd_ctl_card_info_t *cardinfo = alloca(snd_ctl_card_info_sizeof()); + + open_dev = open(devpath, O_RDONLY); + if (open_dev >= 0) { + int rc = ioctl(open_dev, SNDRV_CTL_IOCTL_CARD_INFO(snd_ctl_card_info_sizeof()), cardinfo); + if (rc < 0) { + int err = -errno; + close(open_dev); + return err; + } + close(open_dev); + int cardId = snd_ctl_card_info_get_card(cardinfo); + return cardId; + } else { + return -errno; + } +} + |