[pulseaudio-discuss] [PATCH 08/11] client: Allow client to receive the srchannel memblock
David Henningsson
david.henningsson at canonical.com
Tue Apr 29 08:29:28 PDT 2014
On 2014-04-29 15:22, David Henningsson wrote:
> We assume it's an srchannel memblock if it is writable and does not come
> from our own mempool.
>
> In a future implementation, maybe we can have more than one
> srchannel open at the same time, but at this point we only
> support one.
>
> Signed-off-by: David Henningsson <david.henningsson at canonical.com>
> ---
> src/pulse/context.c | 26 ++++++++++++++++++++++++++
> src/pulse/internal.h | 1 +
> 2 files changed, 27 insertions(+)
>
> diff --git a/src/pulse/context.c b/src/pulse/context.c
> index f3adf4c..7456ee5 100644
> --- a/src/pulse/context.c
> +++ b/src/pulse/context.c
> @@ -213,6 +213,11 @@ static void context_unlink(pa_context *c) {
> c->pstream = NULL;
> }
>
> + if (c->srmemblock) {
> + pa_memblock_unref(c->srmemblock);
> + c->srmemblock = NULL;
> + }
> +
> if (c->client) {
> pa_socket_client_unref(c->client);
> c->client = NULL;
> @@ -338,6 +343,17 @@ static void pstream_packet_callback(pa_pstream *p, pa_packet *packet, const pa_a
> pa_context_unref(c);
> }
>
Btw, I wasn't sure if the below is a good heuristic for figuring out
whether this is an srchannel memblock or not. I was considering
(ab)using pa_seek_mode_t instead, i e, add a new seek mode indicating
that this is an srmemblock. What do you think?
> +static bool is_srmemblock(pa_context *c, const pa_memchunk *chunk)
> +{
> + if (!chunk || !chunk->memblock)
> + return false;
> + if (pa_memblock_is_read_only(chunk->memblock))
> + return false;
> + if (pa_memblock_is_ours(chunk->memblock))
> + return false;
> + return true;
> +}
> +
> static void pstream_memblock_callback(pa_pstream *p, uint32_t channel, int64_t offset, pa_seek_mode_t seek, const pa_memchunk *chunk, void *userdata) {
> pa_context *c = userdata;
> pa_stream *s;
> @@ -350,6 +366,16 @@ static void pstream_memblock_callback(pa_pstream *p, uint32_t channel, int64_t o
>
> pa_context_ref(c);
>
> + if (is_srmemblock(c, chunk)) {
> + if (c->srmemblock) {
> + pa_log_warn("There is already an srmemblock. Ignoring the new one.");
> + }
> + else {
> + c->srmemblock = chunk->memblock;
> + pa_memblock_ref(c->srmemblock);
> + }
> + }
> +
> if ((s = pa_hashmap_get(c->record_streams, PA_UINT32_TO_PTR(channel)))) {
>
> if (chunk->memblock) {
> diff --git a/src/pulse/internal.h b/src/pulse/internal.h
> index c5084d5..dc5dc66 100644
> --- a/src/pulse/internal.h
> +++ b/src/pulse/internal.h
> @@ -65,6 +65,7 @@ struct pa_context {
> pa_socket_client *client;
> pa_pstream *pstream;
> pa_pdispatch *pdispatch;
> + pa_memblock *srmemblock;
>
> pa_hashmap *record_streams, *playback_streams;
> PA_LLIST_HEAD(pa_stream, streams);
>
--
David Henningsson, Canonical Ltd.
https://launchpad.net/~diwic
More information about the pulseaudio-discuss
mailing list