Add "base volume" field to sinks/sources
authorLennart Poettering <lennart@poettering.net>
Tue, 23 Dec 2008 23:49:43 +0000 (00:49 +0100)
committerLennart Poettering <lennart@poettering.net>
Tue, 23 Dec 2008 23:49:43 +0000 (00:49 +0100)
src/pulse/introspect.c
src/pulse/introspect.h
src/pulsecore/cli-text.c
src/pulsecore/protocol-native.c
src/pulsecore/sink.c
src/pulsecore/sink.h
src/pulsecore/source.c
src/pulsecore/source.h

index 3809158..5b905b7 100644 (file)
@@ -154,6 +154,7 @@ static void context_get_sink_info_callback(pa_pdispatch *pd, uint32_t command, u
 
             memset(&i, 0, sizeof(i));
             i.proplist = pa_proplist_new();
+            i.base_volume = PA_VOLUME_NORM;
 
             if (pa_tagstruct_getu32(t, &i.index) < 0 ||
                 pa_tagstruct_gets(t, &i.name) < 0 ||
@@ -170,7 +171,9 @@ static void context_get_sink_info_callback(pa_pdispatch *pd, uint32_t command, u
                 pa_tagstruct_getu32(t, &flags) < 0 ||
                 (o->context->version >= 13 &&
                  (pa_tagstruct_get_proplist(t, i.proplist) < 0 ||
-                  pa_tagstruct_get_usec(t, &i.configured_latency) < 0))) {
+                  pa_tagstruct_get_usec(t, &i.configured_latency) < 0)) ||
+                (o->context->version >= 14 &&
+                 pa_tagstruct_get_volume(t, &i.base_volume) < 0)) {
 
                 pa_context_fail(o->context, PA_ERR_PROTOCOL);
                 pa_proplist_free(i.proplist);
@@ -275,6 +278,7 @@ static void context_get_source_info_callback(pa_pdispatch *pd, uint32_t command,
 
             memset(&i, 0, sizeof(i));
             i.proplist = pa_proplist_new();
+            i.base_volume = PA_VOLUME_NORM;
 
             if (pa_tagstruct_getu32(t, &i.index) < 0 ||
                 pa_tagstruct_gets(t, &i.name) < 0 ||
@@ -291,7 +295,9 @@ static void context_get_source_info_callback(pa_pdispatch *pd, uint32_t command,
                 pa_tagstruct_getu32(t, &flags) < 0 ||
                 (o->context->version >= 13 &&
                  (pa_tagstruct_get_proplist(t, i.proplist) < 0 ||
-                  pa_tagstruct_get_usec(t, &i.configured_latency) < 0))) {
+                  pa_tagstruct_get_usec(t, &i.configured_latency) < 0)) ||
+                (o->context->version >= 14 &&
+                 pa_tagstruct_get_volume(t, &i.base_volume) < 0)) {
 
                 pa_context_fail(o->context, PA_ERR_PROTOCOL);
                 pa_proplist_free(i.proplist);
index 087bd9f..b409cad 100644 (file)
@@ -231,6 +231,7 @@ typedef struct pa_sink_info {
     pa_sink_flags_t flags;             /**< Flags */
     pa_proplist *proplist;             /**< Property list \since 0.9.11 */
     pa_usec_t configured_latency;      /**< The latency this device has been configured to. \since 0.9.11 */
+    pa_volume_t base_volume;           /**< Some kind of "base" volume that refers to unamplified/unattenuated volume in the context of the output device. \since 0.9.14 */
 } pa_sink_info;
 
 /** Callback prototype for pa_context_get_sink_info_by_name() and friends */
@@ -286,6 +287,7 @@ typedef struct pa_source_info {
     pa_source_flags_t flags;            /**< Flags */
     pa_proplist *proplist;              /**< Property list \since 0.9.11 */
     pa_usec_t configured_latency;       /**< The latency this device has been configured to. \since 0.9.11 */
+    pa_volume_t base_volume;           /**< Some kind of "base" volume that refers to unamplified/unattenuated volume in the context of the input device. \since 0.9.14 */
 } pa_source_info;
 
 /** Callback prototype for pa_context_get_source_info_by_name() and friends */
index 7bbc266..362a979 100644 (file)
@@ -115,7 +115,12 @@ char *pa_sink_list_to_string(pa_core *c) {
     pa_strbuf_printf(s, "%u sink(s) available.\n", pa_idxset_size(c->sinks));
 
     for (sink = pa_idxset_first(c->sinks, &idx); sink; sink = pa_idxset_next(c->sinks, &idx)) {
-        char ss[PA_SAMPLE_SPEC_SNPRINT_MAX], cv[PA_CVOLUME_SNPRINT_MAX], cm[PA_CHANNEL_MAP_SNPRINT_MAX], *t;
+        char ss[PA_SAMPLE_SPEC_SNPRINT_MAX],
+            cv[PA_CVOLUME_SNPRINT_MAX],
+            cvdb[PA_SW_CVOLUME_SNPRINT_DB_MAX],
+            v[PA_VOLUME_SNPRINT_MAX],
+            vdb[PA_SW_VOLUME_SNPRINT_DB_MAX],
+            cm[PA_CHANNEL_MAP_SNPRINT_MAX], *t;
         pa_usec_t min_latency, max_latency;
 
         pa_sink_get_latency_range(sink, &min_latency, &max_latency);
@@ -127,7 +132,8 @@ char *pa_sink_list_to_string(pa_core *c) {
             "\tdriver: <%s>\n"
             "\tflags: %s%s%s%s%s%s\n"
             "\tstate: %s\n"
-            "\tvolume: %s\n"
+            "\tvolume: %s%s%s\n"
+            "\tbase volume: %s%s%s\n"
             "\tmuted: %s\n"
             "\tcurrent latency: %0.2f ms\n"
             "\tconfigured latency: %0.2f ms; range is %0.2f .. %0.2f ms\n"
@@ -150,6 +156,11 @@ char *pa_sink_list_to_string(pa_core *c) {
             sink->flags & PA_SINK_LATENCY ? "LATENCY " : "",
             state_table[pa_sink_get_state(sink)],
             pa_cvolume_snprint(cv, sizeof(cv), pa_sink_get_volume(sink, FALSE)),
+            sink->flags & PA_SINK_DECIBEL_VOLUME ? "\n\t        " : "",
+            sink->flags & PA_SINK_DECIBEL_VOLUME ? pa_sw_cvolume_snprint_dB(cvdb, sizeof(cvdb), pa_sink_get_volume(sink, FALSE)) : "",
+            pa_volume_snprint(v, sizeof(v), sink->base_volume),
+            sink->flags & PA_SINK_DECIBEL_VOLUME ? "\n\t             " : "",
+            sink->flags & PA_SINK_DECIBEL_VOLUME ? pa_sw_volume_snprint_dB(vdb, sizeof(vdb), sink->base_volume) : "",
             pa_yes_no(pa_sink_get_mute(sink, FALSE)),
             (double) pa_sink_get_latency(sink) / (double) PA_USEC_PER_MSEC,
             (double) pa_sink_get_requested_latency(sink) / (double) PA_USEC_PER_MSEC,
@@ -192,7 +203,12 @@ char *pa_source_list_to_string(pa_core *c) {
     pa_strbuf_printf(s, "%u source(s) available.\n", pa_idxset_size(c->sources));
 
     for (source = pa_idxset_first(c->sources, &idx); source; source = pa_idxset_next(c->sources, &idx)) {
-        char ss[PA_SAMPLE_SPEC_SNPRINT_MAX], cm[PA_CHANNEL_MAP_SNPRINT_MAX], cv[PA_CVOLUME_SNPRINT_MAX], *t;
+        char ss[PA_SAMPLE_SPEC_SNPRINT_MAX],
+            cv[PA_CVOLUME_SNPRINT_MAX],
+            cvdb[PA_SW_CVOLUME_SNPRINT_DB_MAX],
+            v[PA_VOLUME_SNPRINT_MAX],
+            vdb[PA_SW_VOLUME_SNPRINT_DB_MAX],
+            cm[PA_CHANNEL_MAP_SNPRINT_MAX], *t;
         pa_usec_t min_latency, max_latency;
 
         pa_source_get_latency_range(source, &min_latency, &max_latency);
@@ -204,7 +220,8 @@ char *pa_source_list_to_string(pa_core *c) {
             "\tdriver: <%s>\n"
             "\tflags: %s%s%s%s%s%s\n"
             "\tstate: %s\n"
-            "\tvolume: %s\n"
+            "\tvolume: %s%s%s\n"
+            "\tbase volume: %s%s%s\n"
             "\tmuted: %s\n"
             "\tcurrent latency: %0.2f ms\n"
             "\tconfigured latency: %0.2f ms; range is %0.2f .. %0.2f ms\n"
@@ -225,6 +242,11 @@ char *pa_source_list_to_string(pa_core *c) {
             source->flags & PA_SOURCE_LATENCY ? "LATENCY " : "",
             state_table[pa_source_get_state(source)],
             pa_cvolume_snprint(cv, sizeof(cv), pa_source_get_volume(source, FALSE)),
+            source->flags & PA_SOURCE_DECIBEL_VOLUME ? "\n\t        " : "",
+            source->flags & PA_SOURCE_DECIBEL_VOLUME ? pa_sw_cvolume_snprint_dB(cvdb, sizeof(cvdb), pa_source_get_volume(source, FALSE)) : "",
+            pa_volume_snprint(v, sizeof(v), source->base_volume),
+            source->flags & PA_SOURCE_DECIBEL_VOLUME ? "\n\t             " : "",
+            source->flags & PA_SOURCE_DECIBEL_VOLUME ? pa_sw_volume_snprint_dB(vdb, sizeof(vdb), source->base_volume) : "",
             pa_yes_no(pa_source_get_mute(source, FALSE)),
             (double) pa_source_get_latency(source) / PA_USEC_PER_MSEC,
             (double) pa_source_get_requested_latency(source) / PA_USEC_PER_MSEC,
index 56e86cb..fa3e3f8 100644 (file)
@@ -2677,6 +2677,9 @@ static void sink_fill_tagstruct(pa_native_connection *c, pa_tagstruct *t, pa_sin
         pa_tagstruct_put_proplist(t, sink->proplist);
         pa_tagstruct_put_usec(t, pa_sink_get_requested_latency(sink));
     }
+
+    if (c->version >= 14)
+        pa_tagstruct_put_volume(t, sink->base_volume);
 }
 
 static void source_fill_tagstruct(pa_native_connection *c, pa_tagstruct *t, pa_source *source) {
@@ -2708,8 +2711,10 @@ static void source_fill_tagstruct(pa_native_connection *c, pa_tagstruct *t, pa_s
         pa_tagstruct_put_proplist(t, source->proplist);
         pa_tagstruct_put_usec(t, pa_source_get_requested_latency(source));
     }
-}
 
+    if (c->version >= 14)
+        pa_tagstruct_put_volume(t, source->base_volume);
+}
 
 static void client_fill_tagstruct(pa_native_connection *c, pa_tagstruct *t, pa_client *client) {
     pa_assert(t);
index 1580cf2..3738776 100644 (file)
@@ -191,6 +191,7 @@ pa_sink* pa_sink_new(
     s->n_corked = 0;
 
     s->volume = data->volume;
+    s->base_volume = PA_VOLUME_NORM;
     s->muted = data->muted;
     s->refresh_volume = s->refresh_muted = FALSE;
 
index c5a7321..254be3b 100644 (file)
@@ -81,6 +81,8 @@ struct pa_sink {
     pa_cvolume volume;
     pa_bool_t muted;
 
+    pa_volume_t base_volume;  /* shall be constant */
+
     pa_bool_t refresh_volume:1;
     pa_bool_t refresh_muted:1;
 
index f113e29..5538ced 100644 (file)
@@ -185,6 +185,7 @@ pa_source* pa_source_new(
     s->volume = data->volume;
     s->muted = data->muted;
     s->refresh_volume = s->refresh_muted = FALSE;
+    s->base_volume = PA_VOLUME_NORM;
 
     reset_callbacks(s);
     s->userdata = NULL;
index aaf904b..b93e4ad 100644 (file)
@@ -84,6 +84,8 @@ struct pa_source {
     pa_cvolume volume;
     pa_bool_t muted;
 
+    pa_volume_t base_volume; /* shall be constant */
+
     pa_bool_t refresh_volume:1;
     pa_bool_t refresh_muted:1;