add support for querying sample ist with esound protocol
authorLennart Poettering <lennart@poettering.net>
Mon, 2 Aug 2004 19:45:02 +0000 (19:45 +0000)
committerLennart Poettering <lennart@poettering.net>
Mon, 2 Aug 2004 19:45:02 +0000 (19:45 +0000)
git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@101 fefdeb5f-60dc-0310-8127-8f9354f1896f

doc/todo
polyp/polypaudio.pa
polyp/protocol-esound.c
polyp/scache.c
polyp/scache.h

index 326a64b..73401e7 100644 (file)
--- a/doc/todo
+++ b/doc/todo
@@ -4,7 +4,6 @@
 
 - enable searchdir
 
-- scache memory leak
 - scache remove()
 - scache in native protocol
 - scache/debug.h copyright
index 177707b..79ca83e 100755 (executable)
@@ -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
 
index 7a141d3..5db0442 100644 (file)
@@ -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;
 
index c150504..f1f7ec5 100644 (file)
@@ -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
index 73759b8..a1454ce 100644 (file)
@@ -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;
 };