Sziasztok!
Fvwm-hez szeretnék írni egy új mixer alkalmazást (bash, valamint fvwmscript nyelven).
A jelenleg/korábban használt verzió ez: http://vimeo.com/2453828 (Jobb alsó sarokban a mixer, bal gombbal csatornát vált, jobb gombbal némít, görgővel pedig hangerőt szabályoz.)
A mostani mixert pulseaudiohoz szeretném igazítani, így nem a csatornákat, hanem külön az alkalmazások hangerejét tudnám szabályozni. (Eddig nem volt pulse a rendszerben, tegnap telepítettem/állítottam be.) Ott tartok, hogy le tudom kérdezni, valamint tudom külön szabályozni az adott alkalmazások hangerejét parancssorban.
awk és/vagy sed segítségével megoldható-e az, hogy:
pactl list sink-inputs parancs kimenetéből valahogy kiszedni az alkalmazás nevét (application.name), valamint a hozzá tartozó hangerőt (Volume). Én sajnos csak grep|cut módon tudom megoldani, gondolom van ettől logikusabb elegánsabb megoldás is.
Valami ilyesmi kimenet jó lenne:
Volume: 0: 50% 1: 50% "Qmmp"
Volume: 0: 40% 1: 40% "mplayer2"
Előre is köszönet.
- 6159 megtekintés
Hozzászólások
Valami olyasmit csinálnék, hogy amikor meglátom a /^Sink Input/ regexpet, akkor növelném a tömbindexemet, s szépen feltöltenék egy struktúrát az értékekkel. Tehát például az application.process.binary[i] lesz az '=' jel túloldalán lévő érték. Igazából nem értem a kérdést, azt ugyanis csak remélni tudom, hogy nem előrágott, kész megoldást vársz. Ha meg elgondolkozol rajta, akkor úgyis kijön valami jóféle megoldás.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Mivel vannak itt olyan emberek akik meg nem lattak pakontrol listat, megtenned, hogy olyat is vagsz be? Csak mert ugy talan konnyebb lenne.
- A hozzászóláshoz be kell jelentkezni
+1
- A hozzászóláshoz be kell jelentkezni
Erről lenne szó:
juuzer@user ~ $ pactl list sink-inputs
Sink Input #0
Driver: protocol-native.c
Owner Module: 9
Client: 2
Sink: 0
Sample Specification: s16le 2ch 44100Hz
Channel Map: front-left,front-right
Format: pcm, format.sample_format = "\"s16le\"" format.rate = "44100" format.channels = "2" format.channel_map = "\"front-left,front-right\""
Mute: no
Volume: 0: 50% 1: 50%
0: -18,06 dB 1: -18,06 dB
balance 0,00
Buffer Latency: 122743 usec
Sink Latency: 101553 usec
Resample method: speex-float-3
Properties:
media.name = "Music"
application.name = "Qmmp"
native-protocol.peer = "UNIX socket client"
native-protocol.version = "23"
application.process.id = "2818"
application.process.user = "juuzer"
application.process.host = "user"
application.process.binary = "qmmp"
application.language = "hu_HU"
window.x11.display = ":0"
application.process.machine_id = "973ad399fea2f5837b3b1ea500000021"
application.process.session_id = "973ad399fea2f5837b3b1ea500000021-1352471746.864714-163450555"
application.icon_name = "qmmp"
module-stream-restore.id = "sink-input-by-application-name:Qmmp"
Sink Input #1
Driver: protocol-native.c
Owner Module: 9
Client: 3
Sink: 0
Sample Specification: s16le 2ch 48000Hz
Channel Map: front-left,front-right
Format: pcm, format.sample_format = "\"s16le\"" format.rate = "48000" format.channels = "2" format.channel_map = "\"front-left,front-right\""
Mute: no
Volume: 0: 40% 1: 40%
0: -23,88 dB 1: -23,88 dB
balance 0,00
Buffer Latency: 1069291 usec
Sink Latency: 101479 usec
Resample method: ismeretlen
Properties:
media.name = "audio stream"
application.name = "mplayer2"
native-protocol.peer = "UNIX socket client"
native-protocol.version = "23"
application.process.id = "2829"
application.process.user = "juuzer"
application.process.host = "user"
application.process.binary = "mplayer"
application.language = "C"
window.x11.display = ":0"
application.process.machine_id = "973ad399fea2f5837b3b1ea500000021"
application.process.session_id = "973ad399fea2f5837b3b1ea500000021-1352471746.864714-163450555"
module-stream-restore.id = "sink-input-by-application-name:mplayer2"
Ebből szeretnék valami hasonló kimenetet:
Volume: 0: 50% 1: 50% "Qmmp"
Volume: 0: 40% 1: 40% "mplayer2"
Esetleg:
0: 50% 1: 50% "Qmmp"
0: 40% 1: 40% "mplayer2"
Köszönettel!
- A hozzászóláshoz be kell jelentkezni
pactl list sink-inputs | awk 'BEGIN{idx=0}; $1=="Volume:"{vol[idx]=$0}; $1=="application.name"{name[idx]=$3; idx++} ; END{for (i=0; i<idx; i++) print vol[i], name[i]}'
Bár scriptként olvashatóbb lenne.
-----
A kockás zakók és a mellészabások tekintetében kérdezze meg úri szabóját.
- A hozzászóláshoz be kell jelentkezni
Így is teljesen jól olvasható/értelmezhető.
Részben tökéletes, egy apró hibája van, ha az alkalmazás nevében szóköz van, ott levágja (ALSA plug-in, pl. böngésző flash beépölője). Viszont már így is használható.
...
Volume: 0: 35% 1: 35%
0: -27,38 dB 1: -27,38 dB
balance 0,00
Buffer Latency: 489203 usec
Sink Latency: 19755 usec
Resample method: speex-float-3
Properties:
media.name = "ALSA Playback"
application.name = "ALSA plug-in [plugin-container]"
...
Volume: 0: 50% 1: 50% "Qmmp"
Volume: 0: 35% 1: 35% "ALSA
Volume: 0: 40% 1: 40% "mplayer2"
Köszönöm!
- A hozzászóláshoz be kell jelentkezni
awk 'BEGIN{idx=0}; $1=="Volume:"{vol[idx]=$0}; $1=="application.name"{for (i=3; i<=NR; i++) name[idx]=name[idx] " " $i; idx++} ; END{for (i=0; i<idx; i++) print vol[i], name[i]}'
-----
A kockás zakók és a mellészabások tekintetében kérdezze meg úri szabóját.
- A hozzászóláshoz be kell jelentkezni
Csak annyit tennék hozzá - mivel rövid időn belül többedszer látok ilyet - hogy az awk változói alapértelmezetten 0 ill. "" értékűek, vagyis ilyen értékre nem kell inicializálni azokat kummulálás/konkatenáció/összehasonlítás előtt; ilyesmire használni a BEGIN blokkot elektronpazarlás.
- A hozzászóláshoz be kell jelentkezni
Nálam a GNU Awk 4.0.0 van telepítve, és a BEGIN blokk nélkül nem működött jól.
Konkrétan a tömbök első elemét így lehetett elérni:
vol[""]
name[""]
-----
A kockás zakók és a mellészabások tekintetében kérdezze meg úri szabóját.
- A hozzászóláshoz be kell jelentkezni
Teljesen igazad van - ez a viselkedés az asszociatív tömb sztringaffinitása miatt jelentkezik: a definiálatlan, ezért 0/"" értékből a "" lesz irányadó, és nem történik 0=>"0" konverzió. Figyelmetlen voltam.
- A hozzászóláshoz be kell jelentkezni
Köszönöm az eddigi segítséget is, sajnos a figyelmetlenségem miatt még egyszer neki kéne futni. A "Sink Input"-ra is szükségem lenne. (Sink Input, Volume, application.name) Próbálkozom már egy ideje, de sajnos ez az awk téma nem nagyon fekszik nekem.
0 Volume: 0: 50% 1: 50% "Qmmp"
1 Volume: 0: 40% 1: 40% "mplayer2"
- A hozzászóláshoz be kell jelentkezni
pactl list sink-inputs | awk -F' *[#:=] *' '/^Sink Input #/ {si=$2}; /^Volume/ {vol=$0}; /^application\.name/ {print si, vol, $2}'
- A hozzászóláshoz be kell jelentkezni
Tökéletes!
Köszönöm ironcat, lx.
Volume, application.name elől a sor eleje karaktert eltávolítottam, mivel ezek a sorok beljebb kezdődnek, csak ezek nem jelennek meg itt az oldalon.
Remélem hamarosan be tudom mutatni az új mixert is.
- A hozzászóláshoz be kell jelentkezni
Nem kell külön sorba, de valahogy úgy kerül:
sed -n "/^Volume: 0:/p ; s@application.process.binary =@@p" | paste - -
- A hozzászóláshoz be kell jelentkezni