aboutsummaryrefslogtreecommitdiff
path: root/pavold.c
blob: aa92d3a2f7ef6a549fb99b35823c2850c3007e03 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pulse/pulseaudio.h>

//TODO pa_operation_unref(o);

static int default_sink_index;


static void sink_info_volume_callback(pa_context *c, const pa_sink_info *i, int eol, void *userdata) {
	pa_volume_t vol;
	if (eol) return;

	vol = pa_cvolume_avg(&i->volume);
	printf("%d,%.02fdB,%d,%d,%d\n", vol*100/PA_VOLUME_NORM, pa_sw_volume_to_dB(vol), i->mute, i->index, i->index == default_sink_index);
}

static void sink_info_default_index_callback(pa_context *c, const pa_sink_info *i, int eol, void *userdata) {
	if (eol) return;
	default_sink_index = i->index;

	// output volume levels for each sink
	pa_context_get_sink_info_list(c, sink_info_volume_callback, userdata);
}

static void server_info_get_default_sink_callback(pa_context *c, const pa_server_info *i, void *userdata) {
	pa_context_get_sink_info_by_name(c, i->default_sink_name, sink_info_default_index_callback, userdata);
}

static void subscription_callback(pa_context *c, pa_subscription_event_type_t t, uint32_t idx, void *userdata) {
	switch (t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) {
		case PA_SUBSCRIPTION_EVENT_SINK:
			pa_context_get_sink_info_by_index(c, idx, sink_info_volume_callback, userdata);
			break;
		case PA_SUBSCRIPTION_EVENT_SERVER:
			pa_context_get_server_info(c, server_info_get_default_sink_callback, userdata);
			break;
	}
}

static void context_state_callback(pa_context *c, void *userdata) {
	if (pa_context_get_state(c) == PA_CONTEXT_READY) {
		pa_context_set_subscribe_callback(c, subscription_callback, userdata);

		// get initial default sink info
		pa_context_get_server_info(c, server_info_get_default_sink_callback, userdata);

		// subscribe to sink & server events to listen to changes
		pa_context_subscribe(c, PA_SUBSCRIPTION_MASK_SINK|PA_SUBSCRIPTION_MASK_SERVER, NULL, NULL);
	}
}

int main() {
	pa_mainloop *mainloop = pa_mainloop_new();
	pa_mainloop_api *mainloop_api = pa_mainloop_get_api(mainloop);
	pa_context *context = pa_context_new(mainloop_api, "pavold");

	pa_context_connect(context, NULL, PA_CONTEXT_NOAUTOSPAWN, NULL);

	pa_context_set_state_callback(context, context_state_callback, NULL);

	// main loop
	pa_mainloop_run(mainloop, NULL);

	// clean up
	pa_context_disconnect(context);
	pa_context_unref(context);
	pa_mainloop_free(mainloop);

	return 0;
}