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 --- conf.d/project/etc/4a-softmixer-config.json | 10 +- conf.d/project/htdocs/AudioBinding.js | 6 +- conf.d/project/lua.d/README.md | 60 +++++++++ conf.d/project/lua.d/softmixer-01.lua | 181 +++++++++++++++++++++++++--- 4 files changed, 231 insertions(+), 26 deletions(-) create mode 100644 conf.d/project/lua.d/README.md (limited to 'conf.d') diff --git a/conf.d/project/etc/4a-softmixer-config.json b/conf.d/project/etc/4a-softmixer-config.json index e66a2e6..b094f2f 100644 --- a/conf.d/project/etc/4a-softmixer-config.json +++ b/conf.d/project/etc/4a-softmixer-config.json @@ -10,7 +10,7 @@ { "uid": "alsa-router", "ldpath": "./plugins/alsa", - "lua2c": ["AlsaDmix", "AlsaRouter"], + "lua2c": ["snd_cards", "snd_zones", "snd_loops", "snd_streams"], "info": "Map alsa-loop subdevices to 4A HAL streams" } ], @@ -83,17 +83,17 @@ "lua": "_mixer_config_" }, { - "uid": "stream", + "uid": "snd-cards", "callback": { "plugin": "alsa-router", - "function": "stream_ctl" + "function": "snd_cards" } }, { - "uid": "zone", + "uid": "snd-zone", "callback": { "plugin": "alsa-router", - "function": "zone_ctl" + "function": "snd_zones" } } ] diff --git a/conf.d/project/htdocs/AudioBinding.js b/conf.d/project/htdocs/AudioBinding.js index 0f5caf9..1e539c2 100644 --- a/conf.d/project/htdocs/AudioBinding.js +++ b/conf.d/project/htdocs/AudioBinding.js @@ -39,8 +39,8 @@ } // default soundcard is "PCH" - var devid=getParameterByName("devid"); - if (!devid) devid="hw:1"; + var cardid=getParameterByName("cardid"); + if (!cardid) cardid="hw:1"; var haldev=getParameterByName("haldev"); if (!haldev) haldev="scarlett-usb"; @@ -115,7 +115,7 @@ // Alsa LowLevel selection mode if (response[idx].name) opt.text = response[idx].name; - if (response[idx].devid) opt.value = response[idx].devid; + if (response[idx].cardid) opt.value = response[idx].cardid; // HAL selection mode if (response[idx].shortname) opt.text = response[idx].shortname; diff --git a/conf.d/project/lua.d/README.md b/conf.d/project/lua.d/README.md new file mode 100644 index 0000000..11dbd49 --- /dev/null +++ b/conf.d/project/lua.d/README.md @@ -0,0 +1,60 @@ +Softmixer controller for 4A (AGL Advance Audio Architecture). +------------------------------------------------------------ + + * Object: LUA API Documentation + * Status: In Progress + * Author: Fulup Ar Foll fulup@iot.bzh + * Date : April-2018 + +## Sound Cards + +User may define as many sound card as needed. All sound cards will be group within one global multi channels card. +As a result, declaring three USB stereo sound card is equivalent to declare one Renesas GEN3 with 6 channels + +``` + -- Sound Card Definition + -- ========================== + -- local sndcard_sample = { + -- + -- * Mandatory UID will be the ALSA PCM + -- ["uid"]= "YAMAHA-APU70", + -- + -- * Mandatory Card might be found by either its devpath, its cardid or cardindex (should provide only one) + -- ["devpath"]= "/dev/snd/by-xxx/xxxx, (any path in /dev/snd pointing to a valid sndcard control works + -- ["cardid"] = "hw:xx", [xx] may either be a card index or a name (eg: hw:USB) + -- ["cardidx"] = N, + -- + -- * Optional Device and subdev + -- ["device"] = N, (default 0) + -- ["subdev"] = N, (default 0) + -- + -- * Mandotory List of sink channels attached to the card + -- ["sink"] = { + -- [0]= {["uid"]= "front-right", ["port"]= 0}, + -- [1]= {["uid"]= "front-left", ["port"]= 1}, + -- } + -- } +``` + +Sound card should be group in a table in order to request grouping as a multi channel PCM. Note that this grouping +relies on ALSA 'multi' plugin and thus inherit of its limits. + +``` + local sndcards= { + [0] = sndcard_0, + [1] = sndcard_2, + [3] = sndcard_3, + } +``` + +Call + +``` + error= L2C:snd_cards (source, sndcards) + if (error ~= 0) then + AFB:error (source, "--InLua-- L2C:sndcards fail to attach sndcards=%s", Dump_Table(sndcards)) + --goto OnErrorExit + else + AFB:notice (source, "--InLua-- L2C:sndcards done response=%s", Dump_Table(response)) + end +``` \ No newline at end of file diff --git a/conf.d/project/lua.d/softmixer-01.lua b/conf.d/project/lua.d/softmixer-01.lua index 8858b93..8b586a7 100644 --- a/conf.d/project/lua.d/softmixer-01.lua +++ b/conf.d/project/lua.d/softmixer-01.lua @@ -31,34 +31,179 @@ end -- Display receive arguments and echo them to caller function _mixer_config_ (source, args) + do + local error + + -- ============================= Sound Cards =================== + + local snd_params = { + ["rate"] = 48000, + ["channel"]= 2, + } + + local sndcard_0 = { + ["uid"]= "YAMAHA-APU70", + ["devpath"]= "/dev/snd/by-id/usb-YAMAHA_Corporation_YAMAHA_AP-U70_USB_Audio_00-00", + ["params"] = params, + ["sink"] = { + [0]= {["uid"]= "front-right", ["port"]= 0}, + [1]= {["uid"]= "front-left", ["port"]= 1}, + } + } - local devin = { - ["path"]= "/dev/snd/by-path/platform-snd_aloop.0", - ["dev"]= 1, - ["sub"]= 0, - ["numid"]= 51, + local sndcard_1 = { + ["uid"]= "Jabra-Solemate", + ["devpath"]= "/dev/snd/by-id/usb-0b0e_Jabra_SOLEMATE_v1.34.0-00", + ["params"] = params, + ["sink"] = { + [0]= {["uid"]= "front-right", ["port"]= 0}, + [1]= {["uid"]= "front-left", ["port"]= 1}, + } } - local devout = { - ["path"]= "/dev/snd/by-id/usb-YAMAHA_Corporation_YAMAHA_AP-U70_USB_Audio_00-00", - -- ["path"]= "/dev/snd/by-id/usb-0b0e_Jabra_SOLEMATE_v1.34.0-00", - ["dev"]= 0, - ["sub"]= 0, + local sndcard_2 = { + ["uid"]= "Jabra-410", + ["params"] = params, + ["devpath"]= "/dev/snd/by-id/usb-0b0e_Jabra_SPEAK_410_USB_745C4B15BD11x010900-00", + ["sink"] = { + [0]= {["uid"]= "back-right", ["port"]= 0}, + [1]= {["uid"]= "back-left", ["port"]= 1}, + } + } + + -- group sound card as one multi channels card + local sndcards= { + sndcard_0, + sndcard_2, } - local params = { - ["rate"]= 48000, - --["rate"]= 44100, - ["channels"]= 2, + error= L2C:snd_cards (source, sndcards) + if (error ~= 0) then + AFB:error (source, "--InLua-- L2C:snd_cards fail to attach sndcards=%s", Dump_Table(sndcards)) + goto OnErrorExit + else + AFB:notice (source, "--InLua-- L2C:snd_cards done response=%s\n", Dump_Table(response)) + end + + -- ============================= Zones =================== + + local zone_front= { + ["uid"] = "front-seats", + ["type"] = "playback", + ["mapping"] = { + {["target"]="front-right",["channel"]=0}, + {["target"]="front-left" ,["channel"]=1}, + } } - -- Call AlsaSoftRouter - L2C:alsarouter(source, {["devin"]= devin, ["devout"]= devout, ["params"]= params}) + local zone_back= { + ["uid"] = "back-seats", + ["type"] = "playback", + ["mapping"] = { + {["target"]="back-right",["channel"]=0}, + {["target"]="back-left" ,["channel"]=1}, + } + } + + local zone_all= { + ["uid"] = "all-seats", + ["type"] = "playback", + ["mapping"] = { + {["target"]="front-right",["channel"]=0}, + {["target"]="front-left" ,["channel"]=1}, + {["target"]="back-right" ,["channel"]=0}, + {["target"]="back-left" ,["channel"]=1}, + } + } + + local multi_zones = { + zone_all, + zone_front, + zone_back, + } + + error= L2C:snd_zones (source, multi_zones) + if (error ~= 0) then + AFB:error (source, "--InLua-- L2C:snd_zones fail to attach sndcards=%s", Dump_Table(multi_zones)) + goto OnErrorExit + else + AFB:notice (source, "--InLua-- L2C:snd_zones done response=%s\n", Dump_Table(response)) + end + + -- ======================= Loop PCM =========================== + + local snd_aloop = { + ["uid"] = "Alsa-Loop", + ["devpath"] = "/dev/snd/by-path/platform-snd_aloop.0", + ["devices"] = {["playback"]=0,["capture"]=1}, + ["subdevs"] = { + {["subdev"]= 0, ["numid"]= 51}, + {["subdev"]= 1, ["numid"]= 57}, + {["subdev"]= 2, ["numid"]= 63}, + {["subdev"]= 3, ["numid"]= 69}, + {["subdev"]= 4, ["numid"]= 75}, + {["subdev"]= 5, ["numid"]= 81}, + {["subdev"]= 6, ["numid"]= 87}, + {["subdev"]= 7, ["numid"]= 93}, + } + } + error= L2C:snd_loops (source, snd_aloop) + if (error ~= 0) then + AFB:error (source, "--InLua-- L2C:snd_loops fail to attach sndcards=%s", Dump_Table(aloop)) + goto OnErrorExit + else + AFB:notice (source, "--InLua-- L2C:snd_loops done response=%s\n", Dump_Table(response)) + end + + -- =================== Audio Stream ============================ + + local stream_music= { + ["uid"] = "multimedia", + ["zone"] = "all-seats", + ["volume"]= 70, + ["rate"] = 48000, + ["mute"] = false; + } + + local stream_navigation= { + ["uid"] = "navigation", + ["zone"] = "front-seats", + ["volume"]= 80, + ["mute"] = false; + } + + local stream_children= { + ["uid"] = "children", + ["zone"] = "back-seats", + ["volume"]= 50, + ["mute"] = false; + } + + local snd_streams = { + stream_music, + stream_navigation, + stream_children, + } + + error= L2C:snd_streams (source, snd_streams) + if (error ~= 0) then + AFB:error (source, "--InLua-- L2C:snd_streams fail to attach sndcards=%s", Dump_Table(aloop)) + goto OnErrorExit + else + AFB:notice (source, "--InLua-- L2C:streams_loops done response=%s\n", Dump_Table(response)) + end + + + -- ================== Happy End ============================= AFB:notice (source, "--InLua-- _mixer_config_ done") + return 0 end - return 0 -- happy end -end + -- ================= Unhappy End ============================ + ::OnErrorExit:: + AFB:error (source, "--InLua-- snd_attach fail") + return 1 -- unhappy end -- +end -- Display receive arguments and echo them to caller function _init_softmixer_ (source, args) -- cgit 1.2.3-korg