commit b494610aa4e956c23d61daf810c1f789ca5368f6 Author: Hubert Van De Walle Date: Mon Feb 8 00:39:24 2021 +0100 Initial commit diff --git a/Audio.nimble b/Audio.nimble new file mode 100644 index 0000000..e1efa1b --- /dev/null +++ b/Audio.nimble @@ -0,0 +1,13 @@ +# Package + +version = "0.1.0" +author = "Hubert Van De Walle" +description = "A new awesome nimble package" +license = "Apache-2.0" +srcDir = "src" +bin = @["audio"] + + +# Dependencies + +requires "nim >= 1.4.2" diff --git a/src/audio.nim b/src/audio.nim new file mode 100644 index 0000000..eb946e4 --- /dev/null +++ b/src/audio.nim @@ -0,0 +1,47 @@ +import os, osproc, strutils, system + +type + SinkState = enum + Suspended, Running + + Sink = tuple[index: int, description: string, state: SinkState] + +proc listSinks(): seq[Sink] = + let outp = execProcess("pactl", args = ["list", "sinks"], options = {poUsePath}) + var sink: Sink + var done = false + + for line in outp.splitLines(): + if line.startsWith("Sink"): + done = false + sink.index = line.split("#")[1].parseInt() + elif not done: + let trim = line.strip(trailing = false) + if trim.startsWith("State"): + let stateStr = trim.split(": ")[1] + sink.state = if stateStr == "SUSPENDED": Suspended else: Running + elif trim.startsWith("Description"): + done = true + sink.description = trim.split(": ")[1] + result.add(sink) + +proc setDefaultSink(index: int): int = + let p = startProcess("pactl", args = ["set-default-sink", $index], options = {poUsePath}) + result = p.waitForExit() + +const + reset = "\e[0m" + bold = "\e[1m" + green = "\e[32m" + +proc printSinks() = + for sink in listSinks(): + if sink.state == Running: + echo bold & $sink.index & reset & " " & green & sink.description & reset + else: + echo bold & $sink.index & reset & " " & sink.description & reset + +if paramCount() < 1: + printSinks() +else: + paramStr(1).parseInt().setDefaultSink().quit()