static void pa_command_disable_srbchannel(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata) { pa_context *c = userdata; pa_tagstruct *t2; pa_assert(pd); pa_assert(command == PA_COMMAND_DISABLE_SRBCHANNEL); pa_assert(t); pa_assert(c); pa_assert(PA_REFCNT_VALUE(c) >= 1); pa_pstream_set_srbchannel(c->pstream, NULL); c->srb_template.readfd = -1; c->srb_template.writefd = -1; if (c->srb_template.memblock) { pa_memblock_unref(c->srb_template.memblock); c->srb_template.memblock = NULL; } /* Send disable command back again */ t2 = pa_tagstruct_new(NULL, 0); pa_tagstruct_putu32(t2, PA_COMMAND_DISABLE_SRBCHANNEL); pa_tagstruct_putu32(t2, tag); pa_pstream_send_tagstruct(c->pstream, t2); }
static void handle_srbchannel_memblock(pa_context *c, pa_memblock *memblock) { pa_srbchannel *sr; pa_tagstruct *t; pa_assert(c); /* Memblock sanity check */ if (!memblock) { pa_context_fail(c, PA_ERR_PROTOCOL); return; } else if (pa_memblock_is_read_only(memblock)) { pa_context_fail(c, PA_ERR_PROTOCOL); return; } else if (pa_memblock_is_ours(memblock)) { pa_context_fail(c, PA_ERR_PROTOCOL); return; } /* Create the srbchannel */ c->srb_template.memblock = memblock; pa_memblock_ref(memblock); sr = pa_srbchannel_new_from_template(c->mainloop, &c->srb_template); if (!sr) { pa_log_warn("Failed to create srbchannel from template"); c->srb_template.readfd = -1; c->srb_template.writefd = -1; pa_memblock_unref(c->srb_template.memblock); c->srb_template.memblock = NULL; return; } /* Ack the enable command */ t = pa_tagstruct_new(); pa_tagstruct_putu32(t, PA_COMMAND_ENABLE_SRBCHANNEL); pa_tagstruct_putu32(t, c->srb_setup_tag); pa_pstream_send_tagstruct(c->pstream, t); /* ...and switch over */ pa_pstream_set_srbchannel(c->pstream, sr); }