void Source::update() { pa_operation *o; o = pa_context_get_source_info_by_index(d->context->cObject(), (Device::d)->index, Source::source_cb, this); pa_operation_unref(o); }
static void gst_pulsemixer_ctrl_subscribe_cb (pa_context * context, pa_subscription_event_type_t t, uint32_t idx, void *userdata) { GstPulseMixerCtrl *c = GST_PULSEMIXER_CTRL (userdata); pa_operation *o = NULL; /* Called from the background thread! */ if (c->index != idx) return; if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) != PA_SUBSCRIPTION_EVENT_CHANGE) return; if (c->type == GST_PULSEMIXER_SINK) o = pa_context_get_sink_info_by_index (c->context, c->index, gst_pulsemixer_ctrl_sink_info_cb, c); else o = pa_context_get_source_info_by_index (c->context, c->index, gst_pulsemixer_ctrl_source_info_cb, c); if (!o) { GST_WARNING_OBJECT (c->object, "Failed to get sink info: %s", pa_strerror (pa_context_errno (c->context))); return; } pa_operation_unref (o); c->outstandig_queries++; }
void subscribe_cb(pa_context *c, pa_subscription_event_type_t t, uint32_t index, void *userdata) { switch (t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) { case PA_SUBSCRIPTION_EVENT_SINK: if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) printf("Removing sink index %d\n", index); else { pa_operation *o; if (!(o = pa_context_get_sink_info_by_index(c, index, sink_cb, NULL))) { show_error(_("pa_context_get_sink_info_by_index() failed")); return; } pa_operation_unref(o); } break; case PA_SUBSCRIPTION_EVENT_SOURCE: if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) printf("Removing source index %d\n", index); else { pa_operation *o; if (!(o = pa_context_get_source_info_by_index(c, index, source_cb, NULL))) { show_error(_("pa_context_get_source_info_by_index() failed")); return; } pa_operation_unref(o); } break; } }
static gchar * gst_pulsesrc_device_description (GstPulseSrc * pulsesrc) { pa_operation *o = NULL; gchar *t; if (!pulsesrc->mainloop) goto no_mainloop; pa_threaded_mainloop_lock (pulsesrc->mainloop); if (!pulsesrc->stream) goto unlock; if (!(o = pa_context_get_source_info_by_index (pulsesrc->context, pa_stream_get_device_index (pulsesrc->stream), gst_pulsesrc_source_info_cb, pulsesrc))) { GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, ("pa_stream_get_source_info() failed: %s", pa_strerror (pa_context_errno (pulsesrc->context))), (NULL)); goto unlock; } while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) { if (gst_pulsesrc_is_dead (pulsesrc)) goto unlock; pa_threaded_mainloop_wait (pulsesrc->mainloop); } unlock: if (o) pa_operation_unref (o); t = g_strdup (pulsesrc->device_description); pa_threaded_mainloop_unlock (pulsesrc->mainloop); return t; no_mainloop: { GST_DEBUG_OBJECT (pulsesrc, "have no mainloop"); return NULL; } }
void QPulseAudioThread::subscribe_callback ( struct pa_context *c, enum pa_subscription_event_type t, uint32_t index, void *userdata ) { QPulseAudioThread * thread = static_cast<QPulseAudioThread *>(userdata); switch ( t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK ) { case PA_SUBSCRIPTION_EVENT_SINK: break; case PA_SUBSCRIPTION_EVENT_SOURCE: { if ( ( t & PA_SUBSCRIPTION_EVENT_TYPE_MASK ) == PA_SUBSCRIPTION_EVENT_REMOVE ) { qDebug() << "Warning! untested code. email [email protected] if it explodes"; SourceContainer::const_iterator pos = s_sourceList.find(index); if (pos == s_sourcePosition) { s_sourceList.remove(index); reconnect(); thread->deviceChanged(); } else { s_sourceList.remove(index); thread->deviceChanged(); } } else { pa_operation_unref ( pa_context_get_source_info_by_index ( context, index, pa_source_info_callback, userdata ) ); } break; } case PA_SUBSCRIPTION_EVENT_MODULE: break; case PA_SUBSCRIPTION_EVENT_CLIENT: break; case PA_SUBSCRIPTION_EVENT_SINK_INPUT: break; case PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT: break; case PA_SUBSCRIPTION_EVENT_SAMPLE_CACHE: break; case PA_SUBSCRIPTION_EVENT_SERVER: break; default: fprintf ( stderr, "OTHER EVENT\n" ); break; } }
void backend_volume_set(context_t *c, backend_entry_type type, uint32_t idx, int i, int v) { volume_callback_t *volume = (volume_callback_t*)malloc(sizeof(volume_callback_t)); volume->index = i; volume->value = v; switch(type) { case SINK: pa_context_get_sink_info_by_index(c->context, idx, _cb_s_sink, volume); break; case SINK_INPUT: pa_context_get_sink_input_info(c->context, idx, _cb_s_sink_input, volume); break; case SOURCE: pa_context_get_source_info_by_index(c->context, idx, _cb_s_source, volume); break; case SOURCE_OUTPUT: pa_context_get_source_output_info(c->context, idx, _cb_s_source_output, volume); break; default: break; } }
static void ContextCallback(pa_context *ctx, pa_subscription_event_type_t type, uint32_t idx, void *userdata) { services_discovery_t *sd = userdata; pa_operation *op; assert ((type & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_SOURCE); switch (type & PA_SUBSCRIPTION_EVENT_TYPE_MASK) { case PA_SUBSCRIPTION_EVENT_NEW: case PA_SUBSCRIPTION_EVENT_CHANGE: op = pa_context_get_source_info_by_index(ctx, idx, SourceCallback, sd); if (likely(op != NULL)) pa_operation_unref(op); break; case PA_SUBSCRIPTION_EVENT_REMOVE: RemoveSource (sd, idx); break; } }
void Context::subscribeCallback(pa_context *context, pa_subscription_event_type_t type, uint32_t index) { Q_ASSERT(context == m_context); switch (type & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) { case PA_SUBSCRIPTION_EVENT_SINK: if ((type & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) { m_sinks.removeEntry(index); } else { if (!PAOperation(pa_context_get_sink_info_by_index(context, index, sink_cb, this))) { qCWarning(PLASMAPA) << "pa_context_get_sink_info_by_index() failed"; return; } } break; case PA_SUBSCRIPTION_EVENT_SOURCE: if ((type & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) { m_sources.removeEntry(index); } else { if (!PAOperation(pa_context_get_source_info_by_index(context, index, source_cb, this))) { qCWarning(PLASMAPA) << "pa_context_get_source_info_by_index() failed"; return; } } break; case PA_SUBSCRIPTION_EVENT_SINK_INPUT: if ((type & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) { m_sinkInputs.removeEntry(index); } else { if (!PAOperation(pa_context_get_sink_input_info(context, index, sink_input_callback, this))) { qCWarning(PLASMAPA) << "pa_context_get_sink_input_info() failed"; return; } } break; case PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT: if ((type & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) { m_sourceOutputs.removeEntry(index); } else { if (!PAOperation(pa_context_get_source_output_info(context, index, source_output_cb, this))) { qCWarning(PLASMAPA) << "pa_context_get_sink_input_info() failed"; return; } } break; case PA_SUBSCRIPTION_EVENT_CLIENT: if ((type & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) { m_clients.removeEntry(index); } else { if (!PAOperation(pa_context_get_client_info(context, index, client_cb, this))) { qCWarning(PLASMAPA) << "pa_context_get_client_info() failed"; return; } } break; case PA_SUBSCRIPTION_EVENT_CARD: if ((type & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) { m_cards.removeEntry(index); } else { if (!PAOperation(pa_context_get_card_info_by_index(context, index, card_cb, this))) { qCWarning(PLASMAPA) << "pa_context_get_card_info_by_index() failed"; return; } } break; case PA_SUBSCRIPTION_EVENT_SERVER: if (!PAOperation(pa_context_get_server_info(context, server_cb, this))) { qCWarning(PLASMAPA) << "pa_context_get_server_info() failed"; return; } break; } }
void subscribe_cb(pa_context *c, pa_subscription_event_type_t t, uint32_t index) { switch (t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) { case PA_SUBSCRIPTION_EVENT_SINK: if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) //w->removeSink(index); printf("INF: suppose to removeSink(index)\n"); else { pa_operation *o; if (!(o = pa_context_get_sink_info_by_index(c, index, sink_cb, NULL))) { //show_error("pa_context_get_sink_info_by_index() failed"); printf("func.c:<error> pa_context_get_sink_info_by_index() failed\n"); return; } pa_operation_unref(o); } break; case PA_SUBSCRIPTION_EVENT_SOURCE: if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) //w->removeSource(index); printf("func.c:INF: suppose to removeSource(index)\n"); else { pa_operation *o; if (!(o = pa_context_get_source_info_by_index(c, index, source_cb, NULL))) { //show_error("pa_context_get_source_info_by_index() failed"); printf("func.c:<error> pa_context_get_source_info_by_index() failed\n"); return; } pa_operation_unref(o); } break; case PA_SUBSCRIPTION_EVENT_SINK_INPUT: if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) //w->removeSinkInput(index); printf("func.c:INF: suppose to removeSinkInput(index)\n"); else { pa_operation *o; if (!(o = pa_context_get_sink_input_info(c, index, sink_input_cb, NULL))) { //show_error("pa_context_get_sink_input_info() failed"); printf("func.c:<error> pa_context_get_sink_input_info() failed"); return; } pa_operation_unref(o); } break; case PA_SUBSCRIPTION_EVENT_CLIENT: if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) //w->removeClient(index); printf("func.c:INF: suppose to removeClient(index)\n"); else { pa_operation *o; if (!(o = pa_context_get_client_info(c, index, client_cb, NULL))) { //show_error("pa_context_get_client_info() failed"); printf("func.c:<error> pa_context_get_client_info() failed\n"); return; } pa_operation_unref(o); } break; case PA_SUBSCRIPTION_EVENT_SERVER: printf("func.c: pa_subscription_event_server triggered\n"); { pa_operation *o; if (!(o = pa_context_get_server_info(c, server_info_cb, NULL))) { //show_error("pa_context_get_server_info() failed"); printf("func.c:<error> pa_context_get_server_info() failed\n"); return; } pa_operation_unref(o); } break; } }
static void onContextSubscription(pa_context* context, pa_subscription_event_type_t event, uint32_t idx, void* userData) { long facility = (event & PA_SUBSCRIPTION_EVENT_FACILITY_MASK); long eventType = (event & PA_SUBSCRIPTION_EVENT_TYPE_MASK); // static QHash< long, QString > facilities; // if (facilities.isEmpty()) // { // facilities.insert(PA_SUBSCRIPTION_EVENT_SINK, "PA_SUBSCRIPTION_EVENT_SINK"); // facilities.insert(PA_SUBSCRIPTION_EVENT_SOURCE, "PA_SUBSCRIPTION_EVENT_SOURCE"); // facilities.insert(PA_SUBSCRIPTION_EVENT_SINK_INPUT, "PA_SUBSCRIPTION_EVENT_SINK_INPUT"); // facilities.insert(PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT, "PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT"); // facilities.insert(PA_SUBSCRIPTION_EVENT_MODULE, "PA_SUBSCRIPTION_EVENT_MODULE"); // facilities.insert(PA_SUBSCRIPTION_EVENT_CLIENT, "PA_SUBSCRIPTION_EVENT_CLIENT"); // facilities.insert(PA_SUBSCRIPTION_EVENT_SAMPLE_CACHE, "PA_SUBSCRIPTION_EVENT_SAMPLE_CACHE"); // facilities.insert(PA_SUBSCRIPTION_EVENT_CARD, "PA_SUBSCRIPTION_EVENT_CARD"); // } // static QHash< long, QString > eventTypes; // if (eventTypes.isEmpty()) // { // eventTypes.insert(PA_SUBSCRIPTION_EVENT_NEW, "PA_SUBSCRIPTION_EVENT_NEW"); // eventTypes.insert(PA_SUBSCRIPTION_EVENT_CHANGE, "PA_SUBSCRIPTION_EVENT_CHANGE"); // eventTypes.insert(PA_SUBSCRIPTION_EVENT_REMOVE, "PA_SUBSCRIPTION_EVENT_REMOVE"); // } // qDebug() << "Facility:" << facilities.value(facility, "Other") << // "Event Type:" << eventTypes.value(eventType, "Other") << // "idx:" << idx; PulseAudioWrapperPrivate* d = reinterpret_cast< PulseAudioWrapperPrivate* >(userData); if (facility == PA_SUBSCRIPTION_EVENT_CARD) { if (eventType == PA_SUBSCRIPTION_EVENT_NEW || eventType == PA_SUBSCRIPTION_EVENT_CHANGE) { pa_operation_unref(pa_context_get_card_info_by_index( PulseAudioWrapperPrivate::paContext, idx, &PulseAudioWrapperPrivate::onCardInfoByIndex, userData)); } else if (eventType == PA_SUBSCRIPTION_EVENT_REMOVE) { qDebug() << "Removing card at idx: " << idx; if (d->cardsByIndex.contains(idx)) { PulseAudioCard* card = d->cardsByIndex.value(idx); d->cards.remove(card); d->cardsByIndex.remove(idx); d->cardsByName.remove(card->name()); delete card; } else qDebug() << "No card at idx " << idx; } } else if (facility == PA_SUBSCRIPTION_EVENT_SINK) { if (eventType == PA_SUBSCRIPTION_EVENT_NEW || eventType == PA_SUBSCRIPTION_EVENT_CHANGE) { pa_operation_unref(pa_context_get_sink_info_by_index( PulseAudioWrapperPrivate::paContext, idx, &PulseAudioWrapperPrivate::onSinkInfoByIndex, userData)); } else if (eventType == PA_SUBSCRIPTION_EVENT_REMOVE) { qDebug() << "Removing sink at idx: " << idx; if (d->sinksByIndex.contains(idx)) { PulseAudioSink* sink = d->sinksByIndex.value(idx); d->sinks.remove(sink); d->sinksByIndex.remove(idx); d->sinksByName.remove(sink->name()); delete sink; } else qDebug() << "No sink at idx " << idx; } } else if (facility == PA_SUBSCRIPTION_EVENT_SOURCE) { if (eventType == PA_SUBSCRIPTION_EVENT_NEW) { pa_operation_unref(pa_context_get_source_info_by_index( PulseAudioWrapperPrivate::paContext, idx, &PulseAudioWrapperPrivate::onSourceInfoByIndex, userData)); } else if (eventType == PA_SUBSCRIPTION_EVENT_REMOVE) { qDebug() << "Removing source at idx: " << idx; if (d->sourcesByIndex.contains(idx)) { PulseAudioSource* source = d->sourcesByIndex.value(idx); QString sourceName = source->name(); d->sources.remove(source); d->sourcesByIndex.remove(idx); d->sourcesByName.remove(source->name()); delete source; emit d->q->sourceRemoved(idx, sourceName); } else qDebug() << "No source at idx " << idx; } } }