#!/usr/bin/env ruby # true # true # true # true # true # true require "json" SWITCH_AUDIO_SOURCE = "/opt/homebrew/bin/SwitchAudioSource" SOURCES = { headset: { icon: "headphones", input: "Antlion USB Microphone", output: "CalDigit TS4 Audio - Front" }, laptop: { icon: "play.laptopcomputer", input: "MacBook Pro Microphone", output: "MacBook Pro Speakers" }, } unless ARGV.empty? audio_sources = `#{SWITCH_AUDIO_SOURCE} -a -f json` .lines(chomp: true) .map {|x| JSON.parse(x) } source = SOURCES.fetch(ARGV.shift.to_sym) %i[input output].each do |xput| name = source.fetch(xput) src = audio_sources.find {|src| src.values_at("type", "name") == [xput.to_s, name] } id = src.fetch("id") `#{SWITCH_AUDIO_SOURCE} -t #{xput} -i #{id}` end end input = JSON.parse(`#{SWITCH_AUDIO_SOURCE} -c -f json -t input`) output = JSON.parse(`#{SWITCH_AUDIO_SOURCE} -c -f json -t output`) active_source = SOURCES.find {|_,src| src.values_at(:input, :output) == [input, output].map {|src| src.fetch("name") } } icon = active_source ? active_source.fetch(1).fetch(:icon) : "questionmark.bubble" puts ":waveform:: :#{icon}: | symbolize=true" puts "---" SOURCES.each do |name, sources| params = { symbolize: true, checked: active_source && (name == active_source.fetch(0)), bash: __FILE__, terminal: false, param0: name, refresh: true, } icon = sources.fetch(:icon) puts ":#{icon}: | #{params.map {|k,v| "#{k}=#{v}"}.join(" ")}" end