+bool noct_is_ready(void);
+void noct_set_ring(int ring, int mode, int val);
+void noct_set_button(int button, int val);
+
+extern char noct_rotary_touched[10]; // 8=center, 9=slider
+extern char noct_button_pressed[16];
+
+enum ring_mode {
+ RING_MODE_LEFT,
+ RING_MODE_RIGHT,
+ RING_MODE_MID_RIGHT,
+ RING_MODE_MID_SYM,
+ RING_MODE_SINGLE_ON,
+ RING_MODE_SINGLE_OFF,
+};
+
+/* pulse.c */
+
+enum pulse_state {
+ PS_OFFLINE,
+ PS_SUBSCRIBE,
+ PS_GET_CLIENTS,
+ PS_GET_SINKS,
+ PS_GET_SINK_INPUTS,
+ PS_GET_SERVER,
+ PS_ONLINE,
+};
+
+extern enum pulse_state pulse_state;
+extern char *pulse_default_sink_name;
+
+struct pulse_client {
+ cnode n;
+ int idx;
+ char *name;
+ char *host;
+};
+
+struct pulse_sink {
+ cnode n;
+ int idx;
+ char *name;
+ uint channels;
+ uint volume;
+ uint base_volume;
+ int mute;
+};
+
+struct pulse_sink_input {
+ cnode n;
+ int idx;
+ char *name;
+ int client_idx;
+ int sink_idx;
+ uint channels;
+ uint volume;
+ uint mute;
+ int noct_client_idx; // Used by the high-level logic below
+};
+
+extern clist pulse_client_list, pulse_sink_list, pulse_sink_input_list;
+
+void pulse_init(void);
+void pulse_dump(void);
+struct pulse_sink *pulse_sink_by_name(const char *name);
+struct pulse_sink *pulse_sink_by_idx(int idx);
+void pulse_sink_set_volume(int idx, pa_cvolume *cvol);
+void pulse_sink_set_mute(int idx, bool mute);
+void pulse_sink_input_set_volume(int idx, pa_cvolume *cvol);
+void pulse_sink_input_set_mute(int idx, bool mute);
+void pulse_sink_input_move(int input_idx, int sink_idx);
+struct pulse_client *pulse_client_by_idx(int idx);
+void pulse_server_set_default_sink(const char *name);