--- /dev/null
+/^Sink \#[0-9]+$/ {
+ sub("^#", "", $2)
+ sink = $2
+ next
+}
+
+/^\t[A-Z].+:/ {
+ section = $1
+}
+
+section == "Properties:" {
+ read_property()
+}
+
+/\tState:/ {
+ state[sink] = $2
+ next
+}
+
+/\tMute:/ {
+ mute[sink] = $2
+ next
+}
+
+# Volume: front-left: 45732 / 70% / -9.38 dB, front-right: 45732 / 70% / -9.38 dB
+/\tVolume:/ {
+ delete vol_parts
+ delete left_parts
+ delete right_parts
+ sub("^\t+Volume: +", "")
+ split($0, vol_parts, ", +")
+ sub("^front-left: +", "", vol_parts[1])
+ sub("^front-right: +", "", vol_parts[2])
+ split(vol_parts[1], left_parts, " +/ +")
+ split(vol_parts[2], right_parts, " +/ +")
+ vol_left[sink] = left_parts[2]
+ vol_right[sink] = right_parts[2]
+ next
+}
+
+END {
+ for (sink in state) {
+ device = properties[sink, "alsa.device"]
+ print("state" Kfs device, state[sink])
+ print("mute" Kfs device, mute[sink])
+ print("vol_left" Kfs device, vol_left[sink])
+ print("vol_right" Kfs device, vol_right[sink])
+ }
+}
+
+function read_property() {
+ key = $1
+ # Yes, the sequence (x-1+1) is redundant, but it keeps the variable names
+ # true to their meaning:
+ val_begin = index($0, "\"") + 1 # +1 to exclude first quote
+ val_end = length($0) - 1 # -1 to exclude last quote
+ val_len = (val_end - val_begin) + 1 # +1 to include final character
+ val = substr($0, val_begin, val_len)
+ properties[sink, key] = val
+}