From e10b918009446186c80584273d2e3f5e84a6670b Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 2 Aug 2004 19:45:02 +0000 Subject: add support for querying sample ist with esound protocol git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@101 fefdeb5f-60dc-0310-8127-8f9354f1896f --- polyp/polypaudio.pa | 13 ++++++---- polyp/protocol-esound.c | 68 +++++++++++++++++++++++++++++++++++++++++++------ polyp/scache.c | 2 ++ polyp/scache.h | 1 + 4 files changed, 71 insertions(+), 13 deletions(-) (limited to 'polyp') diff --git a/polyp/polypaudio.pa b/polyp/polypaudio.pa index 177707ba..79ca83ea 100755 --- a/polyp/polypaudio.pa +++ b/polyp/polypaudio.pa @@ -19,9 +19,9 @@ # Load audio drivers -load module-alsa-sink -load module-alsa-source device=plughw:1,0 -#load module-oss device="/dev/dsp" +#load module-alsa-sink +#load module-alsa-source device=plughw:1,0 +load module-oss device="/dev/dsp" #load module-oss-mmap device="/dev/dsp" # Load several protocols @@ -30,12 +30,15 @@ load module-simple-protocol-tcp load module-native-protocol-unix load module-cli-protocol-unix +# Load X11 bell module +load module-x11-bell + # Load the CLI module load module-cli .nofail # Make some devices default -sink_default alsa_output -source_default alsa_input +sink_default oss_output +source_default oss_input diff --git a/polyp/protocol-esound.c b/polyp/protocol-esound.c index 7a141d3a..5db0442f 100644 --- a/polyp/protocol-esound.c +++ b/polyp/protocol-esound.c @@ -53,7 +53,7 @@ #define MAX_CACHE_SAMPLE_SIZE (1024000) -#define SCACHE_PREFIX "esound~" +#define SCACHE_PREFIX "esound." /* This is heavily based on esound's code */ @@ -299,8 +299,10 @@ static int esd_proto_stream_play(struct connection *c, esd_proto_t request, cons if (!pa_sample_spec_valid(&ss)) return -1; - if (!(sink = get_output_sink(c->protocol))) + if (!(sink = get_output_sink(c->protocol))) { + fprintf(stderr, __FILE__": No output sink\n"); return -1; + } strncpy(name, data + sizeof(int)*2, sizeof(name)); name[sizeof(name)-1] = 0; @@ -438,6 +440,7 @@ static int esd_proto_all_info(struct connection *c, esd_proto_t request, const v size_t t, k, s; struct connection *conn; size_t index = PA_IDXSET_INVALID; + unsigned nsamples; assert(c && data && length == sizeof(int)); if (esd_proto_server_info(c, request, data, length) < 0) @@ -445,7 +448,8 @@ static int esd_proto_all_info(struct connection *c, esd_proto_t request, const v k = sizeof(int)*5+ESD_NAME_MAX; s = sizeof(int)*6+ESD_NAME_MAX; - response = connection_write(c, (t = s+k*(c->protocol->n_player+1))); + nsamples = c->protocol->core->scache_idxset ? pa_idxset_ncontents(c->protocol->core->scache_idxset) : 0; + response = connection_write(c, (t = s*(nsamples+1) + k*(c->protocol->n_player+1))); assert(k); for (conn = pa_idxset_first(c->protocol->connections, &index); conn; conn = pa_idxset_next(c->protocol->connections, &index)) { @@ -455,7 +459,7 @@ static int esd_proto_all_info(struct connection *c, esd_proto_t request, const v continue; assert(t >= s+k+k); - + if (conn->sink_input) { rate = conn->sink_input->sample_spec.rate; volume = (conn->sink_input->volume*0xFF)/0x100; @@ -463,7 +467,7 @@ static int esd_proto_all_info(struct connection *c, esd_proto_t request, const v } /* id */ - *((int*) response) = maybe_swap_endian_32(c->swap_byte_order, (int) conn->index); + *((int*) response) = maybe_swap_endian_32(c->swap_byte_order, (int) (conn->index+1)); response += sizeof(int); /* name */ @@ -490,8 +494,56 @@ static int esd_proto_all_info(struct connection *c, esd_proto_t request, const v t-= k; } - assert(t == s+k); - memset(response, 0, t); + assert(t == s*(nsamples+1)+k); + memset(response, 0, k); + response += k; + t -= k; + + if (nsamples) { + struct pa_scache_entry *ce; + + index = PA_IDXSET_INVALID; + for (ce = pa_idxset_first(c->protocol->core->scache_idxset, &index); ce; ce = pa_idxset_next(c->protocol->core->scache_idxset, &index)) { + assert(t >= s*2); + + /* id */ + *((int*) response) = maybe_swap_endian_32(c->swap_byte_order, (int) (ce->index+1)); + response += sizeof(int); + + /* name */ + if (strncmp(ce->name, SCACHE_PREFIX, sizeof(SCACHE_PREFIX)-1) == 0) + strncpy(response, ce->name+sizeof(SCACHE_PREFIX)-1, ESD_NAME_MAX); + else + snprintf(response, ESD_NAME_MAX, "native.%s", ce->name); + response += ESD_NAME_MAX; + + /* rate */ + *((int*) response) = maybe_swap_endian_32(c->swap_byte_order, ce->sample_spec.rate); + response += sizeof(int); + + /* left */ + *((int*) response) = maybe_swap_endian_32(c->swap_byte_order, (ce->volume*0xFF)/0x100); + response += sizeof(int); + + /*right*/ + *((int*) response) = maybe_swap_endian_32(c->swap_byte_order, (ce->volume*0xFF)/0x100); + response += sizeof(int); + + /*format*/ + *((int*) response) = maybe_swap_endian_32(c->swap_byte_order, format_native2esd(&ce->sample_spec)); + response += sizeof(int); + + /*length*/ + *((int*) response) = maybe_swap_endian_32(c->swap_byte_order, (int) ce->memchunk.length); + response += sizeof(int); + + t -= s; + } + } + + assert(t == s); + memset(response, 0, s); + return 0; } @@ -501,7 +553,7 @@ static int esd_proto_stream_pan(struct connection *c, esd_proto_t request, const struct connection *conn; assert(c && data && length == sizeof(int)*3); - index = (uint32_t) maybe_swap_endian_32(c->swap_byte_order, *(int*)data); + index = (uint32_t) maybe_swap_endian_32(c->swap_byte_order, *(int*)data)-1; volume = (uint32_t) maybe_swap_endian_32(c->swap_byte_order, *((int*)data + 1)); volume = (volume*0x100)/0xFF; diff --git a/polyp/scache.c b/polyp/scache.c index c1505046..f1f7ec5a 100644 --- a/polyp/scache.c +++ b/polyp/scache.c @@ -32,6 +32,8 @@ void pa_scache_add_item(struct pa_core *c, const char *name, struct pa_sample_sp assert(e->name); } + e->volume = 0x100; + if (ss) e->sample_spec = *ss; else diff --git a/polyp/scache.h b/polyp/scache.h index 73759b81..a1454cea 100644 --- a/polyp/scache.h +++ b/polyp/scache.h @@ -8,6 +8,7 @@ struct pa_scache_entry { uint32_t index; char *name; + uint32_t volume; struct pa_sample_spec sample_spec; struct pa_memchunk memchunk; }; -- cgit