+void get_sink_info_change_cb(pa_context *c,
+ const pa_sink_info *i,
+ int eol,
+ void *data)
+{
+ Q_UNUSED(c);
+ Q_ASSERT(i);
+ Q_ASSERT(data);
+
+ if (eol) return;
+
+ for (int chan = 0; chan < i->channel_map.channels; chan++) {
+ PaClient *self = reinterpret_cast<PaClient*>(data);
+ QHash<int, pa_cvolume *> states = self->sink_states();
+ pa_cvolume *cvolume = states.value(i->index);
+ // Check each channel for volume change
+ if (cvolume->values[chan] != i->volume.values[chan]) {
+ // On change, update cache and signal
+ cvolume->values[chan] = i->volume.values[chan];
+ emit self->volumeExternallyChanged(C_SINK, i->index, chan, i->volume.values[chan]);
+ }
+ }
+}
+
+void get_source_info_change_cb(pa_context *c,
+ const pa_source_info *i,
+ int eol,
+ void *data)
+{
+ Q_UNUSED(c);
+ Q_ASSERT(i);
+ Q_ASSERT(data);
+
+ if (eol) return;
+
+ for (int chan = 0; chan < i->channel_map.channels; chan++) {
+ PaClient *self = reinterpret_cast<PaClient*>(data);
+ QHash<int, pa_cvolume *> states = self->source_states();
+ pa_cvolume *cvolume = states.value(i->index);
+ // Check each channel for volume change
+ if (cvolume->values[chan] != i->volume.values[chan]) {
+ // On change, update cache and signal
+ cvolume->values[chan] = i->volume.values[chan];
+ emit self->volumeExternallyChanged(C_SOURCE, i->index, chan, i->volume.values[chan]);
+ }
+ }
+}
+
+
+void subscribe_cb(pa_context *c,
+ pa_subscription_event_type_t type,
+ uint32_t index,
+ void *data)
+{
+ pa_operation *o;
+
+ if ((type & PA_SUBSCRIPTION_EVENT_TYPE_MASK) != PA_SUBSCRIPTION_EVENT_CHANGE) {
+ qWarning("PaClient: unhandled subscribe event operation");
+ return;
+ }
+
+ switch (type & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) {
+ case PA_SUBSCRIPTION_EVENT_SINK:
+ if (!(o = pa_context_get_sink_info_by_index(c, index, get_sink_info_change_cb, data))) {
+ qWarning() << "PaClient: get sink info by index: " <<
+ pa_strerror(pa_context_errno(c));
+ return;
+ }
+ break;
+ case PA_SUBSCRIPTION_EVENT_SOURCE:
+ if (!(o = pa_context_get_source_info_by_index(c, index, get_source_info_change_cb, data))) {
+ qWarning() << "PaClient: get source info by index: " <<
+ pa_strerror(pa_context_errno(c));
+ return;
+ }
+ break;
+ default:
+ qWarning("PaClient: unhandled subscribe event facility");
+ }
+}
+