From bbaf42c6b02ca5d1bdceb7e215807abdbf8cd61d Mon Sep 17 00:00:00 2001 From: Fulup Ar Foll Date: Mon, 4 Jun 2018 00:33:34 +0200 Subject: Move to Dynamic Mixer API (work in progress) --- conf.d/cmake/00-opensuse-osconfig.cmake | 2 + conf.d/cmake/config.cmake | 4 +- conf.d/project/etc/4a--softmixer-test.json | 35 ---- conf.d/project/etc/smixer-test-config.json | 35 ++++ conf.d/project/lua.d/softmixer-simple-test.lua | 217 ++++++++++++++++++------- 5 files changed, 195 insertions(+), 98 deletions(-) delete mode 100644 conf.d/project/etc/4a--softmixer-test.json create mode 100644 conf.d/project/etc/smixer-test-config.json (limited to 'conf.d') diff --git a/conf.d/cmake/00-opensuse-osconfig.cmake b/conf.d/cmake/00-opensuse-osconfig.cmake index 9f8ce3d..3da2b4b 100644 --- a/conf.d/cmake/00-opensuse-osconfig.cmake +++ b/conf.d/cmake/00-opensuse-osconfig.cmake @@ -1,2 +1,4 @@ message(STATUS "*** Notice: OpenSuSe LUA-5.3+DynApi") list(APPEND PKG_REQUIRED_LIST lua>=5.3) + +set(USE_EFENCE 1) diff --git a/conf.d/cmake/config.cmake b/conf.d/cmake/config.cmake index 536d4b5..8d6b4b7 100644 --- a/conf.d/cmake/config.cmake +++ b/conf.d/cmake/config.cmake @@ -18,7 +18,7 @@ # Project Info # ------------------ -set(PROJECT_NAME 4a-softmixer) +set(PROJECT_NAME 4a-smixer) set(PROJECT_PRETTY_NAME "Audio SoftMixer") set(PROJECT_DESCRIPTION "Soft Mixer for 4A (AGL Advanced Audio Architecture)") set(PROJECT_URL "https://github.com/iotbzh/4a-softmixer") @@ -199,7 +199,7 @@ set(AFB_REMPORT "1234" CACHE PATH "Default binder listening port") # Print a helper message when every thing is finished # ---------------------------------------------------- -set(CLOSING_MESSAGE "Typical binding launch: afb-daemon --name ${PROJECT_NAME}-afbd --port=${AFB_REMPORT} --workdir=${CMAKE_BINARY_DIR} --ldpath=/dev/null --binding=package/lib/softmixer-binding.so --roothttp=package/htdocs --token=\"${AFB_TOKEN}\" --tracereq=common --verbose") +set(CLOSING_MESSAGE "Typical binding launch: afb-daemon --name smixer-test-afbd --port=${AFB_REMPORT} --workdir=${CMAKE_BINARY_DIR} --ldpath=/dev/null --binding=package/lib/softmixer-binding.so --roothttp=package/htdocs --token=\"${AFB_TOKEN}\" --tracereq=common --verbose") set(PACKAGE_MESSAGE "Install widget file using in the target : afm-util install ${PROJECT_NAME}.wgt") # Optional schema validator about now only XML, LUA and JSON diff --git a/conf.d/project/etc/4a--softmixer-test.json b/conf.d/project/etc/4a--softmixer-test.json deleted file mode 100644 index d646e3b..0000000 --- a/conf.d/project/etc/4a--softmixer-test.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "$schema": "http://iot.bzh/download/public/schema/json/ctl-schema.json", - "metadata": { - "uid": "Soft Mixer", - "version": "1.0", - "api": "softmixer", - "info": "Soft Mixer emulating hardware mixer" - }, - "resources": [ - { - "uid": "softmixer", - "info": "Map alsa-loop subdevices to 4A HAL streams", - "spath": "./plugins/alsa:../conf.d/project/lua.d", - "libs": ["alsa-softmixer.ctlso", "softmixer-simple-test.lua"], - "lua": { - "prefix": "smix", - "functions": ["_mixer_new_"] - } - } - ], - - "onload": [ - { - "uid": "init-soft-mixer", - "info": "Initialise Audio Router", - "action": "lua://softmixer#_mixer_simple_test_" - } - ], - "controls": [ - { - "uid": "create", - "action": "plugin://softmixer#mixer_new" - } - ] -} diff --git a/conf.d/project/etc/smixer-test-config.json b/conf.d/project/etc/smixer-test-config.json new file mode 100644 index 0000000..d646e3b --- /dev/null +++ b/conf.d/project/etc/smixer-test-config.json @@ -0,0 +1,35 @@ +{ + "$schema": "http://iot.bzh/download/public/schema/json/ctl-schema.json", + "metadata": { + "uid": "Soft Mixer", + "version": "1.0", + "api": "softmixer", + "info": "Soft Mixer emulating hardware mixer" + }, + "resources": [ + { + "uid": "softmixer", + "info": "Map alsa-loop subdevices to 4A HAL streams", + "spath": "./plugins/alsa:../conf.d/project/lua.d", + "libs": ["alsa-softmixer.ctlso", "softmixer-simple-test.lua"], + "lua": { + "prefix": "smix", + "functions": ["_mixer_new_"] + } + } + ], + + "onload": [ + { + "uid": "init-soft-mixer", + "info": "Initialise Audio Router", + "action": "lua://softmixer#_mixer_simple_test_" + } + ], + "controls": [ + { + "uid": "create", + "action": "plugin://softmixer#mixer_new" + } + ] +} diff --git a/conf.d/project/lua.d/softmixer-simple-test.lua b/conf.d/project/lua.d/softmixer-simple-test.lua index 115831b..87fb866 100644 --- a/conf.d/project/lua.d/softmixer-simple-test.lua +++ b/conf.d/project/lua.d/softmixer-simple-test.lua @@ -21,131 +21,221 @@ -- Static variables should be prefixed with _ _EventHandle={} --- Call when AlsaCore return HAL active list -function _AlsaPingCB_ (source, result, context) - AFB:notice (source, "--InLua-- PingCB: result='%s'", Dump_Table(result)) +-- make variable visible from ::OnExitError:: +local error +local result -end +local printf = function(s,...) + io.write(s:format(...)) + io.write("\n") + return +end -- Display receive arguments and echo them to caller function _mixer_simple_test_ (source, args) do - local error - local response + - -- ================== Default Alsa snd-aloop numid and subdev config - local aloop = { - ["devices"] = {["playback"]=0,["capture"]=1}, - ["ramps"] = { + -- Mixer UID is used as API name + + -- ==================== Default rate =========================== + + local audio_params ={ + defaults = { ["rate"] = 48000 }, + standard = { ["rate"] = 44100 }, + basic= { ["rate"] = 8000 }, + } + + local volume_ramps = { {["uid"]="ramp-fast", ["delay"]= 050, ["up"]=10,["down"]=3}, {["uid"]="ramp-slow", ["delay"]= 250, ["up"]=03,["down"]=1}, {["uid"]="ramp-normal", ["delay"]= 100, ["up"]=06,["down"]=2}, - }, + } + + -- ======================= Loop PCM =========================== + local snd_aloop = { + ["uid"] = "Alsa-Loop", + ["path"]= "/dev/snd/by-path/platform-snd_aloop.0", + ["devices"] = {["playback"]=0,["capture"]=1}, ["subdevs"] = { - {["subdev"]= 0, ["numid"]= 51}, - {["subdev"]= 1, ["numid"]= 57}, + {["subdev"]= 0, ["numid"]= 51, ["uid"]= "loop-legacy"}, + {["subdev"]= 1, ["numid"]= 57, ["uid"]= "loop-multimedia"}, {["subdev"]= 2, ["numid"]= 63}, {["subdev"]= 3, ["numid"]= 69}, {["subdev"]= 4, ["numid"]= 75}, {["subdev"]= 5, ["numid"]= 81}, {["subdev"]= 6, ["numid"]= 87}, {["subdev"]= 7, ["numid"]= 93}, - } + }, } - -- ==================== Default rate =========================== - - local audio_defaults = { - ["rate"] = 48000, - } - - -- ======================= Loop PCM =========================== - local snd_aloop = { - ["uid"] = "Alsa-Loop", - ["devpath"] = "/dev/snd/by-path/platform-snd_aloop.0", - ["params"] = audio_defaults, - ["ramps"] = aloop.ramps, - ["devices"] = aloop.devices, - ["subdevs"] = aloop.subdevs, - } + -- ============================= Backend (Sound Cards) =================== - -- ============================= Sound Cards =================== local snd_yamaha = { ["uid"]= "YAMAHA-APU70", - ["devpath"]= "/dev/snd/by-id/usb-YAMAHA_Corporation_YAMAHA_AP-U70_USB_Audio_00-00", - ["params"] = snd_params, + ["path"]= "/dev/snd/by-id/usb-YAMAHA_Corporation_YAMAHA_AP-U70_USB_Audio_00-00", + ["params"]= audio_params.default, ["sink"] = { - {["uid"]= "front-right", ["port"]= 0}, - {["uid"]= "front-left", ["port"]= 1}, + ["channels"] = { + {["uid"]= "front-right", ["port"]= 0}, + {["uid"]= "front-left", ["port"]= 1}, + }, } } - local snd_jabra= { - ["uid"]= "Jabra-Solemate", - ["devpath"]= "/dev/snd/by-id/usb-0b0e_Jabra_SOLEMATE_v1.34.0-00", - ["params"] = snd_params, + local snd_usb_8ch= { + ["uid"]= "8CH-USB", + ["path"]= "/dev/snd/by-id/usb-0d8c_USB_Sound_Device-00", + ["params"] = audio_params.default, ["sink"] = { - {["uid"]= "front-right", ["port"]= 0}, - {["uid"]= "front-left", ["port"]= 1}, + ["controls"]= { + ["volume"] = {["name"]= "Speaker Playback Volume", ["value"]=80}, + ["mute"] = {["name"]= "Speaker Playback Switch"}, + }, + ["channels"] = { + {["uid"]= "front-right", ["port"]= 0}, + {["uid"]= "front-left" , ["port"]= 1}, + {["uid"]= "middle-right", ["port"]= 2}, + {["uid"]= "middle-left" , ["port"]= 3}, + {["uid"]= "back-right", ["port"]= 4}, + {["uid"]= "back-left" , ["port"]= 5}, + {["uid"]= "centre-left" , ["port"]= 6}, + {["uid"]= "centre-left" , ["port"]= 7}, + }, + }, + ["source"] = { + ["controls"]= { + ["volume"] = {["name"]= "Capture Volume"}, + ["mute"] = {["name"]= "Capture Switch"}, + }, + ["channels"] = { + {["uid"]= "mic-right", ["port"]= 0}, + {["uid"]= "mic-left" , ["port"]= 1}, + }, } } -- ============================= Zones =================== + local zone_stereo={ + ["uid"] = "full-stereo", + ["sink"] = { + {["target"]="front-right",["channel"]=0}, + {["target"]="front-left" ,["channel"]=1}, + {["target"]="middle-right",["channel"]=0}, + {["target"]="middle-left" ,["channel"]=1}, + {["target"]="back-right",["channel"]=0}, + {["target"]="back-left" ,["channel"]=1}, + } + } + local zone_front= { ["uid"] = "front-seats", - ["type"] = "playback", - ["mapping"] = { + ["sink"] = { {["target"]="front-right",["channel"]=0}, {["target"]="front-left" ,["channel"]=1}, } } + local zone_middle= { + ["uid"] = "middle-seats", + ["sink"] = { + {["target"]="middle-right",["channel"]=0}, + {["target"]="middle-left" ,["channel"]=1}, + } + } + + local zone_back= { + ["uid"] = "back-seats", + ["sink"] = { + {["target"]="back-right",["channel"]=0}, + {["target"]="back-left" ,["channel"]=1}, + } + } + + local zone_driver= { + ["uid"] = "driver-seat", + ["source"] = { + {["target"]="mic-right",["channel"]=0}, + }, + ["sink"] = { + {["target"]="front-right",["channel"]=0}, + } + } + -- =================== Audio Stream ============================ local stream_music= { - ["uid"] = "multimedia", - ["zone"] = "front-seats", - ["ramp"] = "ramp-slow", + ["uid"] = "multimedia", + ["zone"]= "full-stereo", + ["source"]= "loop-multimedia", ["volume"]= 60, ["mute"] = false, + ["params"]= audio_params.standard, } local stream_navigation= { ["uid"] = "navigation", - ["zone"] = "front-seats", - ["ramp"] = "ramp-normal", - ["volume"]= 70, + ["zone"]= "front-seats", + ["volume"]= 60, ["mute"] = false, } - + local stream_emergency= { ["uid"] = "emergency", - ["zone"] = "front-seats", - ["ramp"] = "ramp-fast", + ["zone"] = "driver-seat", ["volume"]= 80, ["mute"] = false, + --["params"]= audio_params.basic, } + local stream_radio= { + ["uid"] = "radio", + ["zone"] = "full-stereo", + --["source"]= snd_usb_8ch.uid, + ["volume"]= 60, + ["mute"] = false, + } + + local stream_pulse= { + ["uid"] = "pulseaudio", + ["zone"] = "back-seats", + ["source"]= "loop-legacy", + ["volume"]= 60, + ["mute"] = false, + } + --- ================ Create Mixer ========================= - local MyMixer= { - ["uid"]="Simple_Mixer", - ["backend"] = {snd_yamaha}, - ["frontend"]= {snd_aloop}, - ["zones"] = {zone_front}, - ["streams"] = {stream_music,stream_navigation,stream_emergency}, + local MyTestHal= { + ["uid"]= "MyMixer", + ["ramps"]= volume_ramps, + ["playbacks"] = {snd_usb_8ch}, + ["captures"]= {snd_usb_8ch}, + ["loops"] = {snd_aloop}, + ["zones"] = {zone_stereo, zone_front, zone_back, zone_middle, zone_driver}, + ["streams"] = {stream_pulse, stream_music, stream_navigation }, + -- ["streams"] = {stream_pulse, stream_music, stream_navigation, stream_emergency, stream_radio }, + } - local error,response= smix:_mixer_new_ (source, MyMixer) + -- direct LUA call because controller cannot call its own API from AFB:servsync + error,result= smix:_mixer_new_ (source, {["uid"]="MyMixer"}) if (error ~= 0) then - AFB:error (source, "--InLua-- smix:_mixer_new_ fail config=%s", Dump_Table(aloop)) + AFB:error (source, "--InLua-- smix:_mixer_new_ fail config=%s", Dump_Table(result)) goto OnErrorExit else - AFB:notice (source, "--InLua-- smix:_mixer_new_ done response=%s\n", Dump_Table(response)) + AFB:notice (source, "--InLua-- smix:_mixer_new_ done\n") end + error,result= AFB:servsync(source, "MyMixer", "attach", MyTestHal) + if (error) then + AFB:error (source, "--InLua-- API MyMixer/attach fail error=%d", error) + goto OnErrorExit + else + AFB:notice (source, "--InLua-- MyMixer/attach done result=%s\n", Dump_Table(result)) + end -- ================== Happy End ============================= AFB:notice (source, "--InLua-- Test success") @@ -153,6 +243,11 @@ function _mixer_simple_test_ (source, args) -- ================= Unhappy End ============================ ::OnErrorExit:: - AFB:error (source, "--InLua-- Test fail") + local response=result["request"] + printf ("--InLua-- ------------STATUS= %s --------------", result["status"]) + printf ("--InLua-- ++ INFO= %s", Dump_Table(response["info"])) + printf ("--InLua-- ----------TEST %s-------------", result["status"]) + + AFB:error (source, "--InLua-- Test Fail") return 1 -- unhappy end -- end -- cgit 1.2.3-korg