1 | #if USE_PULSEAUDIO_DEVICES
|
---|
2 | #include <pulse/context.h>
|
---|
3 | #include <pulse/glib-mainloop.h>
|
---|
4 | #include <pulse/introspect.h>
|
---|
5 | #include <pulse/operation.h>
|
---|
6 | #include <QApplication>
|
---|
7 |
|
---|
8 | QMap<int, QString> pulse_device_list;
|
---|
9 | bool pulse_list_done = false;
|
---|
10 |
|
---|
11 | void sink_cb(pa_context *, const pa_sink_info *i, int eol, void *) {
|
---|
12 | if (eol == 0) {
|
---|
13 | qDebug() << "DeviceInfo::sink_cb: sink #" << i->index << ":" << i->name;
|
---|
14 | pulse_device_list[i->index] = i->name;
|
---|
15 | } else {
|
---|
16 | pulse_list_done = true;
|
---|
17 | }
|
---|
18 | }
|
---|
19 |
|
---|
20 | void context_state_cb(pa_context *c, void *) {
|
---|
21 | qDebug() << "DeviceInfo::context_state_cb";
|
---|
22 |
|
---|
23 | pa_context_state_t state = pa_context_get_state(c);
|
---|
24 |
|
---|
25 | if (state == PA_CONTEXT_READY) {
|
---|
26 | pa_operation *o;
|
---|
27 |
|
---|
28 | if (!(o = pa_context_get_sink_info_list(c, sink_cb, NULL))) {
|
---|
29 | qWarning() << "DeviceInfo::context_state_cb: pa_context_get_sink_info_list failed";
|
---|
30 | return;
|
---|
31 | }
|
---|
32 | pa_operation_unref(o);
|
---|
33 | }
|
---|
34 | }
|
---|
35 |
|
---|
36 | DeviceList DeviceInfo::paDevices() {
|
---|
37 | qDebug("DeviceInfo::paDevices");
|
---|
38 | DeviceList l;
|
---|
39 |
|
---|
40 | if (!pulse_list_done) {
|
---|
41 | pa_glib_mainloop *mainloop = pa_glib_mainloop_new(NULL);
|
---|
42 | pa_mainloop_api *api = pa_glib_mainloop_get_api(mainloop);
|
---|
43 | pa_context *context = pa_context_new(api, "smplayer");
|
---|
44 |
|
---|
45 | if (pa_context_connect(context, NULL, PA_CONTEXT_NOFAIL, 0) < 0) {
|
---|
46 | pa_context_unref(context);
|
---|
47 | return l;
|
---|
48 | }
|
---|
49 | pa_context_set_state_callback(context, context_state_cb, NULL);
|
---|
50 |
|
---|
51 | // Wait for a while until the list is complete
|
---|
52 | for (int n = 0; n < 1000; n++) {
|
---|
53 | QApplication::processEvents();
|
---|
54 | if (pulse_list_done) {
|
---|
55 | qDebug("DeviceInfo::paDevices: list done (%d)", n);
|
---|
56 | break;
|
---|
57 | }
|
---|
58 | }
|
---|
59 | }
|
---|
60 |
|
---|
61 | if (!pulse_list_done) {
|
---|
62 | qWarning("DeviceInfo::paDevices: list is not done yet!");
|
---|
63 | }
|
---|
64 |
|
---|
65 | QMapIterator<int, QString> i(pulse_device_list);
|
---|
66 | while (i.hasNext()) {
|
---|
67 | i.next();
|
---|
68 | l.append(DeviceData(i.key(), i.value()));
|
---|
69 | }
|
---|
70 |
|
---|
71 | return l;
|
---|
72 | }
|
---|
73 | #endif // USE_PULSEAUDIO_DEVICES
|
---|