summaryrefslogtreecommitdiffstats
path: root/conf.d/project
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 /conf.d/project
parent1dd1509a02fee564ff87f80c2f29055d7aad889c (diff)
Initial version with softvol,Route,Multi,Dmix
Diffstat (limited to 'conf.d/project')
-rw-r--r--conf.d/project/etc/4a-softmixer-config.json10
-rw-r--r--conf.d/project/htdocs/AudioBinding.js6
-rw-r--r--conf.d/project/lua.d/README.md60
-rw-r--r--conf.d/project/lua.d/softmixer-01.lua181
4 files changed, 231 insertions, 26 deletions
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)