diff options
Diffstat (limited to 'src/pulsecore')
-rw-r--r-- | src/pulsecore/cli-text.c | 30 | ||||
-rw-r--r-- | src/pulsecore/protocol-native.c | 7 | ||||
-rw-r--r-- | src/pulsecore/sample-util.c | 27 | ||||
-rw-r--r-- | src/pulsecore/sample-util.h | 2 | ||||
-rw-r--r-- | src/pulsecore/sink.c | 12 | ||||
-rw-r--r-- | src/pulsecore/sink.h | 2 | ||||
-rw-r--r-- | src/pulsecore/source.c | 4 | ||||
-rw-r--r-- | src/pulsecore/source.h | 2 | ||||
-rw-r--r-- | src/pulsecore/tagstruct.c | 38 | ||||
-rw-r--r-- | src/pulsecore/tagstruct.h | 6 |
10 files changed, 120 insertions, 10 deletions
diff --git a/src/pulsecore/cli-text.c b/src/pulsecore/cli-text.c index 7bbc2660..362a9791 100644 --- a/src/pulsecore/cli-text.c +++ b/src/pulsecore/cli-text.c @@ -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, diff --git a/src/pulsecore/protocol-native.c b/src/pulsecore/protocol-native.c index 56e86cb4..fa3e3f8d 100644 --- a/src/pulsecore/protocol-native.c +++ b/src/pulsecore/protocol-native.c @@ -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); diff --git a/src/pulsecore/sample-util.c b/src/pulsecore/sample-util.c index 9f0f795c..414c1c81 100644 --- a/src/pulsecore/sample-util.c +++ b/src/pulsecore/sample-util.c @@ -27,6 +27,7 @@ #include <stdio.h> #include <string.h> #include <stdlib.h> +#include <stdio.h> #include <liboil/liboilfuncs.h> #include <liboil/liboil.h> @@ -987,3 +988,29 @@ size_t pa_usec_to_bytes_round_up(pa_usec_t t, const pa_sample_spec *spec) { return (size_t) u; } + +void pa_memchunk_dump_to_file(pa_memchunk *c, const char *fn) { + FILE *f; + void *p; + + pa_assert(c); + pa_assert(fn); + + /* Only for debugging purposes */ + + f = fopen(fn, "a"); + + if (!f) { + pa_log_warn("Failed to open '%s': %s", fn, pa_cstrerror(errno)); + return; + } + + p = pa_memblock_acquire(c->memblock); + + if (fwrite((uint8_t*) p + c->index, 1, c->length, f) != c->length) + pa_log_warn("Failed to write to '%s': %s", fn, pa_cstrerror(errno)); + + pa_memblock_release(c->memblock); + + fclose(f); +} diff --git a/src/pulsecore/sample-util.h b/src/pulsecore/sample-util.h index 2fe2c81d..36d19e48 100644 --- a/src/pulsecore/sample-util.h +++ b/src/pulsecore/sample-util.h @@ -81,4 +81,6 @@ void pa_sample_clamp(pa_sample_format_t format, void *dst, size_t dstr, const vo pa_usec_t pa_bytes_to_usec_round_up(uint64_t length, const pa_sample_spec *spec); size_t pa_usec_to_bytes_round_up(pa_usec_t t, const pa_sample_spec *spec); +void pa_memchunk_dump_to_file(pa_memchunk *c, const char *fn); + #endif diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c index 1580cf2e..a4d993cd 100644 --- a/src/pulsecore/sink.c +++ b/src/pulsecore/sink.c @@ -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; @@ -239,7 +240,7 @@ pa_sink* pa_sink_new( pa_proplist_setf(source_data.proplist, PA_PROP_DEVICE_DESCRIPTION, "Monitor of %s", dn ? dn : s->name); pa_proplist_sets(source_data.proplist, PA_PROP_DEVICE_CLASS, "monitor"); - s->monitor_source = pa_source_new(core, &source_data, 0); + s->monitor_source = pa_source_new(core, &source_data, PA_SOURCE_LATENCY); pa_source_new_data_done(&source_data); @@ -835,6 +836,9 @@ pa_usec_t pa_sink_get_latency(pa_sink *s) { if (!PA_SINK_IS_OPENED(s->state)) return 0; + if (!(s->flags & PA_SINK_LATENCY)) + return 0; + pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SINK_MESSAGE_GET_LATENCY, &usec, 0, NULL) == 0); return usec; @@ -1161,7 +1165,8 @@ int pa_sink_process_msg(pa_msgobject *o, int code, void *userdata, int64_t offse size_t sink_nbytes, total_nbytes; /* Get the latency of the sink */ - if (PA_MSGOBJECT(s)->process_msg(PA_MSGOBJECT(s), PA_SINK_MESSAGE_GET_LATENCY, &usec, 0, NULL) < 0) + if (!(s->flags & PA_SINK_LATENCY) || + PA_MSGOBJECT(s)->process_msg(PA_MSGOBJECT(s), PA_SINK_MESSAGE_GET_LATENCY, &usec, 0, NULL) < 0) usec = 0; sink_nbytes = pa_usec_to_bytes(usec, &s->sample_spec); @@ -1220,7 +1225,8 @@ int pa_sink_process_msg(pa_msgobject *o, int code, void *userdata, int64_t offse size_t nbytes; /* Get the latency of the sink */ - if (PA_MSGOBJECT(s)->process_msg(PA_MSGOBJECT(s), PA_SINK_MESSAGE_GET_LATENCY, &usec, 0, NULL) < 0) + if (!(s->flags & PA_SINK_LATENCY) || + PA_MSGOBJECT(s)->process_msg(PA_MSGOBJECT(s), PA_SINK_MESSAGE_GET_LATENCY, &usec, 0, NULL) < 0) usec = 0; nbytes = pa_usec_to_bytes(usec, &s->sample_spec); diff --git a/src/pulsecore/sink.h b/src/pulsecore/sink.h index c5a73214..254be3b0 100644 --- a/src/pulsecore/sink.h +++ b/src/pulsecore/sink.h @@ -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; diff --git a/src/pulsecore/source.c b/src/pulsecore/source.c index f113e295..815ec271 100644 --- a/src/pulsecore/source.c +++ b/src/pulsecore/source.c @@ -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; @@ -500,6 +501,9 @@ pa_usec_t pa_source_get_latency(pa_source *s) { if (!PA_SOURCE_IS_OPENED(s->state)) return 0; + if (!(s->flags & PA_SOURCE_LATENCY)) + return 0; + pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_GET_LATENCY, &usec, 0, NULL) == 0); return usec; diff --git a/src/pulsecore/source.h b/src/pulsecore/source.h index aaf904b4..b93e4ad0 100644 --- a/src/pulsecore/source.h +++ b/src/pulsecore/source.h @@ -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; diff --git a/src/pulsecore/tagstruct.c b/src/pulsecore/tagstruct.c index 62a30144..330b7596 100644 --- a/src/pulsecore/tagstruct.c +++ b/src/pulsecore/tagstruct.c @@ -254,6 +254,17 @@ void pa_tagstruct_put_cvolume(pa_tagstruct *t, const pa_cvolume *cvolume) { } } +void pa_tagstruct_put_volume(pa_tagstruct *t, pa_volume_t vol) { + uint32_t u; + pa_assert(t); + + extend(t, 5); + t->data[t->length] = PA_TAG_VOLUME; + u = htonl((uint32_t) vol); + memcpy(t->data+t->length+1, &u, 4); + t->length += 5; +} + void pa_tagstruct_put_proplist(pa_tagstruct *t, pa_proplist *p) { void *state = NULL; pa_assert(t); @@ -555,6 +566,25 @@ int pa_tagstruct_get_cvolume(pa_tagstruct *t, pa_cvolume *cvolume) { return 0; } +int pa_tagstruct_get_volume(pa_tagstruct*t, pa_volume_t *vol) { + uint32_t u; + + pa_assert(t); + pa_assert(vol); + + if (t->rindex+5 > t->length) + return -1; + + if (t->data[t->rindex] != PA_TAG_VOLUME) + return -1; + + memcpy(&u, t->data+t->rindex+1, 4); + *vol = (pa_volume_t) ntohl(u); + + t->rindex += 5; + return 0; +} + int pa_tagstruct_get_proplist(pa_tagstruct *t, pa_proplist *p) { size_t saved_rindex; @@ -663,6 +693,10 @@ void pa_tagstruct_put(pa_tagstruct *t, ...) { pa_tagstruct_put_cvolume(t, va_arg(va, pa_cvolume *)); break; + case PA_TAG_VOLUME: + pa_tagstruct_put_volume(t, va_arg(va, pa_volume_t)); + break; + case PA_TAG_PROPLIST: pa_tagstruct_put_proplist(t, va_arg(va, pa_proplist *)); break; @@ -738,6 +772,10 @@ int pa_tagstruct_get(pa_tagstruct *t, ...) { ret = pa_tagstruct_get_cvolume(t, va_arg(va, pa_cvolume *)); break; + case PA_TAG_VOLUME: + ret = pa_tagstruct_get_volume(t, va_arg(va, pa_volume_t *)); + break; + case PA_TAG_PROPLIST: ret = pa_tagstruct_get_proplist(t, va_arg(va, pa_proplist *)); break; diff --git a/src/pulsecore/tagstruct.h b/src/pulsecore/tagstruct.h index e7d07054..19288eeb 100644 --- a/src/pulsecore/tagstruct.h +++ b/src/pulsecore/tagstruct.h @@ -54,7 +54,8 @@ enum { PA_TAG_USEC = 'U' /* 64bit unsigned */, PA_TAG_CHANNEL_MAP = 'm', PA_TAG_CVOLUME = 'v', - PA_TAG_PROPLIST = 'P' + PA_TAG_PROPLIST = 'P', + PA_TAG_VOLUME = 'V' }; pa_tagstruct *pa_tagstruct_new(const uint8_t* data, size_t length); @@ -79,6 +80,7 @@ void pa_tagstruct_put_usec(pa_tagstruct*t, pa_usec_t u); void pa_tagstruct_put_channel_map(pa_tagstruct *t, const pa_channel_map *map); void pa_tagstruct_put_cvolume(pa_tagstruct *t, const pa_cvolume *cvolume); void pa_tagstruct_put_proplist(pa_tagstruct *t, pa_proplist *p); +void pa_tagstruct_put_volume(pa_tagstruct *t, pa_volume_t volume); int pa_tagstruct_get(pa_tagstruct *t, ...); @@ -95,6 +97,6 @@ int pa_tagstruct_get_usec(pa_tagstruct*t, pa_usec_t *u); int pa_tagstruct_get_channel_map(pa_tagstruct *t, pa_channel_map *map); int pa_tagstruct_get_cvolume(pa_tagstruct *t, pa_cvolume *v); int pa_tagstruct_get_proplist(pa_tagstruct *t, pa_proplist *p); - +int pa_tagstruct_get_volume(pa_tagstruct *t, pa_volume_t *v); #endif |