package javaforce.linux; /** * Created : May 27, 2012 * * @author pquiring */ import java.util.*; import javaforce.*; /** * Retrieves PulseAudio configuration */ public class PulseAudio { public static class Card { public String name; public int idx; public int card; public String activeProfile = ""; public ArrayList<Profile> profiles = new ArrayList<Profile>(); public ArrayList<Port> ports = new ArrayList<Port>(); //this if info only, can't use it } public static class Sink { public String name; public int idx; public int card; public int volume; //% public boolean muted; public String activePort = ""; public ArrayList<Port> ports = new ArrayList<Port>(); } public static class Source { public String name; public int idx; public int card; public int volume; //% public boolean muted; public String activePort = ""; public ArrayList<Port> ports = new ArrayList<Port>(); } public static class Port { public String name, desc; } public static class Profile { public String name, desc; } public static ArrayList<Card> cards; public static ArrayList<Sink> sinks; public static ArrayList<Source> sources; public static void list() { cards = new ArrayList<Card>(); sinks = new ArrayList<Sink>(); sources = new ArrayList<Source>(); ShellProcess sp = new ShellProcess(); String output = sp.run(new String[]{"pactl", "list"}, false); String lns[] = output.split("\n"); Card card = null; Sink sink = null; Source source = null; boolean ports = false, profiles = false; for (int a = 0; a < lns.length; a++) { if (lns[a].length() == 0) { continue; } if (lns[a].charAt(0) == '\t') { if (lns[a].startsWith("\tDescription:")) { if (sink != null) { sink.name = lns[a].substring(14); } if (source != null) { source.name = lns[a].substring(14); } continue; } if (lns[a].startsWith("\t\talsa.card = ")) { int i1 = lns[a].indexOf("\""); int i2 = lns[a].indexOf("\"", i1 + 1); int idx = JF.atoi(lns[a].substring(i1 + 1, i2)); if (sink != null) { sink.card = idx; } if (source != null) { source.card = idx; } if (card != null) { card.card = idx; } continue; } if (lns[a].startsWith("\t\talsa.card_name = ")) { int i1 = lns[a].indexOf("\""); int i2 = lns[a].indexOf("\"", i1 + 1); if (card != null) { card.name = lns[a].substring(i1 + 1, i2); } continue; } if (lns[a].startsWith("\tActive Port:")) { if (sink != null) { sink.activePort = lns[a].substring(14); } if (source != null) { source.activePort = lns[a].substring(14); } continue; } if (lns[a].startsWith("\tActive Profile:")) { profiles = false; if (card != null) { card.activeProfile = lns[a].substring(17); } continue; } if (lns[a].startsWith("\tVolume:")) { String f[] = lns[a].substring(9).split(" +"); int left = JF.atoi(f[1].substring(0, f[1].length() - 1)); int right = -1; if (f.length > 3) { right = JF.atoi(f[3].substring(0, f[3].length() - 1)); } if (sink != null) { sink.volume = left; } if (source != null) { source.volume = left; } continue; } if (lns[a].startsWith("\tMute:")) { boolean muted = lns[a].indexOf("no") == -1; if (sink != null) { sink.muted = muted; } if (source != null) { source.muted = muted; } } if (lns[a].equals("\tPorts:")) { ports = true; continue; } if (lns[a].equals("\tProfiles:")) { profiles = true; continue; } if (ports) { if (lns[a].startsWith("\t\t\t")) { continue; } int i1 = lns[a].indexOf(":"); if (i1 == -1) { continue; } int i2 = lns[a].indexOf("(priority", i1); if (i2 == -1) { continue; } Port port = new Port(); port.name = lns[a].substring(2, i1); port.desc = lns[a].substring(i1 + 1, i2).trim(); if (card != null) { card.ports.add(port); } if (sink != null) { sink.ports.add(port); } if (source != null) { source.ports.add(port); } continue; } if (profiles) { Profile profile = new Profile(); int i1 = lns[a].indexOf(" "); int i2 = lns[a].indexOf("(sinks:"); profile.name = lns[a].substring(2, i1 - 1); profile.desc = lns[a].substring(i1 + 1, i2); card.profiles.add(profile); continue; } } else { sink = null; source = null; card = null; ports = false; profiles = false; int idx = lns[a].indexOf("#"); if (idx == -1) { continue; } idx = JF.atoi(lns[a].substring(idx + 1)); if (lns[a].startsWith("Sink #")) { sink = new Sink(); sink.idx = idx; sinks.add(sink); } if (lns[a].startsWith("Source #")) { source = new Source(); source.idx = idx; sources.add(source); } if (lns[a].startsWith("Card #")) { card = new Card(); card.name = "?"; card.idx = idx; cards.add(card); } } } } }