/*
* The Ursary Audio Controls
*
- * (c) 2014 Martin Mares <mj@ucw.cz>
+ * (c) 2014--2018 Martin Mares <mj@ucw.cz>
*/
#undef LOCAL_DEBUG
* Map of all controls
*
* rotary red button green button
- * 0 sink Ursarium mute select as default (or assign to client selected by touch)
- * 1 sink Catarium mute dtto
- * 2 sink Compress - dtto
+ * 0 sink PCH mute -
+ * 1 - - -
+ * 2 - - -
* 3 - - -
* 4 MPD mute play/pause/stop
- * 5 Albireo mute -
- * 6 Ogion mute -
- * 7 Ursula/Havrana mute -
+ * 5 Albireo MPV mute -
+ * 6 Albireo other mute -
+ * 7 other machines mute -
*
- * center all sinks
+ * center -
* slider -
*/
+#define PCH_SINK "alsa_output.pci-0000_00_1f.3.analog-stereo"
+
/*** Sink controls ***/
static double volume_from_pa(pa_volume_t vol)
noct_set_button(ring, 0);
}
+static void update_button_from_port(int button, const char *sink_name, const char *port_name)
+{
+ struct pulse_sink *s = pulse_sink_by_name(sink_name);
+ if (!s)
+ {
+ noct_set_button(button, 0);
+ return;
+ }
+
+ noct_set_button(button, !strcmp(s->active_port, port_name));
+}
+
static void update_sink_from_rotary(int delta, const char *sink_name)
{
struct pulse_sink *s = pulse_sink_by_name(sink_name);
pulse_sink_set_mute(s->idx, !s->mute);
}
+static void update_port_from_button(int on, const char *sink_name, const char *port1, const char *port2)
+{
+ if (!on)
+ return;
+
+ struct pulse_sink *s = pulse_sink_by_name(sink_name);
+ if (!s)
+ return;
+
+ const char *port = port1;
+ if (!strcmp(s->active_port, port1))
+ port = port2;
+
+ DBG("## Setting port of sink %s to %s", s->name, port);
+ pulse_sink_set_port(s->idx, port);
+}
+
/*** Client controls ***/
struct client_map {
static struct client_map client_map[] = {
{ 4, "Music Player Daemon", "albireo", },
- { 5, NULL, "albireo", },
- { 6, NULL, "ogion", },
- { 7, NULL, "ursula", },
- { 7, NULL, "havrana", },
+ { 5, "mpv", "albireo", },
+ { 6, NULL, "albireo", },
+ { 7, NULL, NULL, },
};
#define CLIENT_MAP_SIZE ARRAY_SIZE(client_map)
}
}
+#if 0 // Not used at the moment
+
static int find_touched_client(void)
{
int touched = -1;
return touched;
}
+#endif
+
/*** Default sink controls ***/
+#if 0 // Not mapped to any button at the moment
+
static const char *get_client_sink(int i)
{
const char *sink = NULL;
}
}
+#endif
+
/*** MPD controls ***/
static bool mpd_flash_state;
}
// Everything normal
- update_ring_from_sink(0, "ursarium");
- update_ring_from_sink(1, "catarium");
+ update_ring_from_sink(0, PCH_SINK);
+ update_button_from_port(8, PCH_SINK, "analog-output-headphones");
update_groups();
+#if 0
update_default_sink();
+#endif
update_mpd();
}
switch (rotary)
{
case 0:
- update_sink_from_rotary(delta, "ursarium");
- break;
- case 1:
- update_sink_from_rotary(delta, "catarium");
- break;
- case 8:
- update_sink_from_rotary(delta, "ursarium");
- update_sink_from_rotary(delta, "catarium");
+ update_sink_from_rotary(delta, PCH_SINK);
break;
default:
update_group_from_rotary(rotary, delta);
switch (button)
{
case 0:
- update_sink_mute_from_button(on, "ursarium");
- break;
- case 1:
- update_sink_mute_from_button(on, "catarium");
+ update_sink_mute_from_button(on, PCH_SINK);
break;
case 8:
+ update_port_from_button(on, PCH_SINK, "analog-output-lineout", "analog-output-headphones");
+ break;
+#if 0
case 9:
case 10:
update_default_sink_from_button(button, on);
break;
+#endif
case 12:
update_mpd_from_button(button, on);
break;
+ case 13:
+ if (on)
+ mpd_stop();
+ break;
+ case 14:
+ if (on)
+ mpd_prev();
+ break;
+ case 15:
+ if (on)
+ mpd_next();
+ break;
default:
update_group_from_button(button, on);
}
/*** Main entry point ***/
static int debug;
+static int no_fork;
static struct opt_section options = {
OPT_ITEMS {
OPT_HELP("Options:"),
OPT_HELP_OPTION,
OPT_BOOL('d', "debug", debug, 0, "\tEnable debugging mode (no fork etc.)"),
+ OPT_BOOL(0, "no-fork", no_fork, 0, "\tDo not fork\n"),
OPT_END
}
};
unsetenv("HOME");
struct daemon_params dp = {
- .flags = (debug ? DAEMON_FLAG_SIMULATE : 0),
+ .flags = ((debug || no_fork) ? DAEMON_FLAG_SIMULATE : 0),
.pid_file = "/run/ursaryd.pid",
.run_as_user = "ursary",
};