diff options
Diffstat (limited to 'src/modules')
-rw-r--r-- | src/modules/alsa/alsa-sink.c | 2 | ||||
-rw-r--r-- | src/modules/module-device-restore.c | 2 | ||||
-rw-r--r-- | src/modules/module-lirc.c | 6 | ||||
-rw-r--r-- | src/modules/module-match.c | 2 | ||||
-rw-r--r-- | src/modules/module-mmkbd-evdev.c | 6 | ||||
-rw-r--r-- | src/modules/module-stream-restore.c | 142 | ||||
-rw-r--r-- | src/modules/oss/module-oss.c | 2 |
7 files changed, 63 insertions, 99 deletions
diff --git a/src/modules/alsa/alsa-sink.c b/src/modules/alsa/alsa-sink.c index 3e5c219f..2fbcd7be 100644 --- a/src/modules/alsa/alsa-sink.c +++ b/src/modules/alsa/alsa-sink.c @@ -931,7 +931,7 @@ static int mixer_callback(snd_mixer_elem_t *elem, unsigned int mask) { return 0; if (mask & SND_CTL_EVENT_MASK_VALUE) { - pa_sink_get_volume(u->sink, TRUE); + pa_sink_get_volume(u->sink, TRUE, FALSE); pa_sink_get_mute(u->sink, TRUE); } diff --git a/src/modules/module-device-restore.c b/src/modules/module-device-restore.c index 0ca3dd83..7d87ca0f 100644 --- a/src/modules/module-device-restore.c +++ b/src/modules/module-device-restore.c @@ -191,7 +191,7 @@ static void subscribe_callback(pa_core *c, pa_subscription_event_type_t t, uint3 name = pa_sprintf_malloc("sink:%s", sink->name); entry.channel_map = sink->channel_map; - entry.volume = *pa_sink_get_volume(sink, FALSE); + entry.volume = *pa_sink_get_volume(sink, FALSE, TRUE); entry.muted = pa_sink_get_mute(sink, FALSE); } else { diff --git a/src/modules/module-lirc.c b/src/modules/module-lirc.c index 120b26e9..a1a8726f 100644 --- a/src/modules/module-lirc.c +++ b/src/modules/module-lirc.c @@ -120,7 +120,7 @@ static void io_callback(pa_mainloop_api *io, pa_io_event *e, int fd, pa_io_event pa_log("Failed to get sink '%s'", u->sink_name); else { int i; - pa_cvolume cv = *pa_sink_get_volume(s, FALSE); + pa_cvolume cv = *pa_sink_get_volume(s, FALSE, FALSE); #define DELTA (PA_VOLUME_NORM/20) @@ -133,7 +133,7 @@ static void io_callback(pa_mainloop_api *io, pa_io_event *e, int fd, pa_io_event cv.values[i] = PA_VOLUME_MAX; } - pa_sink_set_volume(s, &cv, TRUE, TRUE); + pa_sink_set_volume(s, &cv, TRUE, TRUE, TRUE); break; case DOWN: @@ -144,7 +144,7 @@ static void io_callback(pa_mainloop_api *io, pa_io_event *e, int fd, pa_io_event cv.values[i] = PA_VOLUME_MUTED; } - pa_sink_set_volume(s, &cv, TRUE, TRUE); + pa_sink_set_volume(s, &cv, TRUE, TRUE, TRUE); break; case MUTE: diff --git a/src/modules/module-match.c b/src/modules/module-match.c index d7365ca7..625f2a8b 100644 --- a/src/modules/module-match.c +++ b/src/modules/module-match.c @@ -216,7 +216,7 @@ static void callback(pa_core *c, pa_subscription_event_type_t t, uint32_t idx, v pa_cvolume cv; pa_log_debug("changing volume of sink input '%s' to 0x%03x", n, r->volume); pa_cvolume_set(&cv, si->sample_spec.channels, r->volume); - pa_sink_input_set_volume(si, &cv, TRUE); + pa_sink_input_set_volume(si, &cv, TRUE, TRUE); } } } diff --git a/src/modules/module-mmkbd-evdev.c b/src/modules/module-mmkbd-evdev.c index c43cfdac..d8b9c79e 100644 --- a/src/modules/module-mmkbd-evdev.c +++ b/src/modules/module-mmkbd-evdev.c @@ -102,7 +102,7 @@ static void io_callback(pa_mainloop_api *io, pa_io_event *e, int fd, pa_io_event pa_log("Failed to get sink '%s'", u->sink_name); else { int i; - pa_cvolume cv = *pa_sink_get_volume(s, FALSE); + pa_cvolume cv = *pa_sink_get_volume(s, FALSE, FALSE); #define DELTA (PA_VOLUME_NORM/20) @@ -115,7 +115,7 @@ static void io_callback(pa_mainloop_api *io, pa_io_event *e, int fd, pa_io_event cv.values[i] = PA_VOLUME_MAX; } - pa_sink_set_volume(s, &cv, TRUE, TRUE); + pa_sink_set_volume(s, &cv, TRUE, TRUE, TRUE); break; case DOWN: @@ -126,7 +126,7 @@ static void io_callback(pa_mainloop_api *io, pa_io_event *e, int fd, pa_io_event cv.values[i] = PA_VOLUME_MUTED; } - pa_sink_set_volume(s, &cv, TRUE, TRUE); + pa_sink_set_volume(s, &cv, TRUE, TRUE, TRUE); break; case MUTE_TOGGLE: diff --git a/src/modules/module-stream-restore.c b/src/modules/module-stream-restore.c index 2c90e726..70cd89a7 100644 --- a/src/modules/module-stream-restore.c +++ b/src/modules/module-stream-restore.c @@ -91,15 +91,14 @@ struct userdata { pa_idxset *subscribed; }; -#define ENTRY_VERSION 1 +#define ENTRY_VERSION 2 struct entry { uint8_t version; - pa_bool_t muted_valid:1, relative_volume_valid:1, absolute_volume_valid:1, device_valid:1; + pa_bool_t muted_valid:1, volume_valid:1, device_valid:1; pa_bool_t muted:1; pa_channel_map channel_map; - pa_cvolume relative_volume; - pa_cvolume absolute_volume; + pa_cvolume volume; char device[PA_NAME_MAX]; } PA_GCC_PACKED; @@ -192,13 +191,12 @@ static struct entry* read_entry(struct userdata *u, const char *name) { goto fail; } - if ((e->relative_volume_valid || e->absolute_volume_valid) && !pa_channel_map_valid(&e->channel_map)) { + if (e->volume_valid && !pa_channel_map_valid(&e->channel_map)) { pa_log_warn("Invalid channel map stored in database for stream %s", name); goto fail; } - if ((e->relative_volume_valid && (!pa_cvolume_valid(&e->relative_volume) || e->relative_volume.channels != e->channel_map.channels)) || - (e->absolute_volume_valid && (!pa_cvolume_valid(&e->absolute_volume) || e->absolute_volume.channels != e->channel_map.channels))) { + if (e->volume_valid && (!pa_cvolume_valid(&e->volume) || !pa_cvolume_compatible_with_channel_map(&e->volume, &e->channel_map))) { pa_log_warn("Invalid volume stored in database for stream %s", name); goto fail; } @@ -251,14 +249,9 @@ static pa_bool_t entries_equal(const struct entry *a, const struct entry *b) { (a->muted_valid && (a->muted != b->muted))) return FALSE; - t = b->relative_volume; - if (a->relative_volume_valid != b->relative_volume_valid || - (a->relative_volume_valid && !pa_cvolume_equal(pa_cvolume_remap(&t, &b->channel_map, &a->channel_map), &a->relative_volume))) - return FALSE; - - t = b->absolute_volume; - if (a->absolute_volume_valid != b->absolute_volume_valid || - (a->absolute_volume_valid && !pa_cvolume_equal(pa_cvolume_remap(&t, &b->channel_map, &a->channel_map), &a->absolute_volume))) + t = b->volume; + if (a->volume_valid != b->volume_valid || + (a->volume_valid && !pa_cvolume_equal(pa_cvolume_remap(&t, &b->channel_map, &a->channel_map), &a->volume))) return FALSE; return TRUE; @@ -291,22 +284,24 @@ static void subscribe_callback(pa_core *c, pa_subscription_event_type_t t, uint3 if (!(name = get_name(sink_input->proplist, "sink-input"))) return; - entry.channel_map = sink_input->channel_map; - - pa_sink_input_get_relative_volume(sink_input, &entry.relative_volume); - entry.relative_volume_valid = sink_input->save_volume; + if ((old = read_entry(u, name))) + entry = *old; - if (sink_input->sink->flags & PA_SINK_FLAT_VOLUME) { - entry.absolute_volume = *pa_sink_input_get_volume(sink_input); - entry.absolute_volume_valid = sink_input->save_volume; - } else - entry.absolute_volume_valid = FALSE; + if (sink_input->save_volume) { + entry.channel_map = sink_input->channel_map; + pa_sink_input_get_volume(sink_input, &entry.volume, FALSE); + entry.volume_valid = TRUE; + } - entry.muted = pa_sink_input_get_mute(sink_input); - entry.muted_valid = sink_input->save_muted; + if (sink_input->save_muted) { + entry.muted = pa_sink_input_get_mute(sink_input); + entry.muted_valid = TRUE; + } - pa_strlcpy(entry.device, sink_input->sink->name, sizeof(entry.device)); - entry.device_valid = sink_input->save_sink; + if (sink_input->save_sink) { + pa_strlcpy(entry.device, sink_input->sink->name, sizeof(entry.device)); + entry.device_valid = TRUE; + } } else { pa_source_output *source_output; @@ -319,13 +314,16 @@ static void subscribe_callback(pa_core *c, pa_subscription_event_type_t t, uint3 if (!(name = get_name(source_output->proplist, "source-output"))) return; - entry.channel_map = source_output->channel_map; + if ((old = read_entry(u, name))) + entry = *old; - pa_strlcpy(entry.device, source_output->source->name, sizeof(entry.device)); - entry.device_valid = source_output->save_source; + if (source_output->save_source) { + pa_strlcpy(entry.device, source_output->source->name, sizeof(entry.device)); + entry.device_valid = source_output->save_source; + } } - if ((old = read_entry(u, name))) { + if (old) { if (entries_equal(old, &entry)) { pa_xfree(old); @@ -400,42 +398,24 @@ static pa_hook_result_t sink_input_fixate_hook_callback(pa_core *c, pa_sink_inpu if ((e = read_entry(u, name))) { - if (u->restore_volume) { + if (u->restore_volume && e->volume_valid) { if (!new_data->volume_is_set) { pa_cvolume v; - pa_cvolume_init(&v); - - if (new_data->sink->flags & PA_SINK_FLAT_VOLUME) { - - /* We don't check for e->device_valid here because - that bit marks whether it is a good choice for - restoring, not just if the data is filled in. */ - if (e->absolute_volume_valid && - (e->device[0] == 0 || pa_streq(new_data->sink->name, e->device))) { - - v = e->absolute_volume; - new_data->volume_is_absolute = TRUE; - } else if (e->relative_volume_valid) { - v = e->relative_volume; - new_data->volume_is_absolute = FALSE; - } - - } else if (e->relative_volume_valid) { - v = e->relative_volume; - new_data->volume_is_absolute = FALSE; - } - if (v.channels > 0) { - pa_log_info("Restoring volume for sink input %s.", name); - pa_sink_input_new_data_set_volume(new_data, pa_cvolume_remap(&v, &e->channel_map, &new_data->channel_map)); - new_data->save_volume = TRUE; - } + pa_log_info("Restoring volume for sink input %s.", name); + v = e->volume; + pa_cvolume_remap(&v, &e->channel_map, &new_data->channel_map); + pa_sink_input_new_data_set_volume(new_data, &v); + + new_data->volume_is_absolute = FALSE; + new_data->save_volume = FALSE; } else pa_log_debug("Not restoring volume for sink input %s, because already set.", name); } if (u->restore_muted && e->muted_valid) { + if (!new_data->muted_is_set) { pa_log_info("Restoring mute state for sink input %s.", name); pa_sink_input_new_data_set_muted(new_data, e->muted); @@ -532,30 +512,15 @@ static void apply_entry(struct userdata *u, const char *name, struct entry *e) { } pa_xfree(n); - if (u->restore_volume) { + if (u->restore_volume && e->volume_valid) { pa_cvolume v; - pa_cvolume_init(&v); - if (si->sink->flags & PA_SINK_FLAT_VOLUME) { - - if (e->absolute_volume_valid && - (e->device[0] == 0 || pa_streq(e->device, si->sink->name))) - v = e->absolute_volume; - else if (e->relative_volume_valid) { - pa_cvolume t = *pa_sink_get_volume(si->sink, FALSE); - pa_sw_cvolume_multiply(&v, &e->relative_volume, pa_cvolume_remap(&t, &si->sink->channel_map, &e->channel_map)); - } - } else if (e->relative_volume_valid) - v = e->relative_volume; - - if (v.channels > 0) { - pa_log_info("Restoring volume for sink input %s.", name); - pa_sink_input_set_volume(si, pa_cvolume_remap(&v, &e->channel_map, &si->channel_map), TRUE); - } + v = e->volume; + pa_log_info("Restoring volume for sink input %s.", name); + pa_sink_input_set_volume(si, pa_cvolume_remap(&v, &e->channel_map, &si->channel_map), FALSE, FALSE); } - if (u->restore_muted && - e->muted_valid) { + if (u->restore_muted && e->muted_valid) { pa_log_info("Restoring mute state for sink input %s.", name); pa_sink_input_set_mute(si, e->muted, TRUE); } @@ -610,10 +575,10 @@ static void dump_database(struct userdata *u) { if ((e = read_entry(u, name))) { char t[256]; pa_log("name=%s", name); - pa_log("device=%s", e->device); + pa_log("device=%s %s", e->device, pa_yes_no(e->device_valid)); pa_log("channel_map=%s", pa_channel_map_snprint(t, sizeof(t), &e->channel_map)); - pa_log("volume=%s", pa_cvolume_snprint(t, sizeof(t), &e->volume)); - pa_log("mute=%s", pa_yes_no(e->muted)); + pa_log("volume=%s %s", pa_cvolume_snprint(t, sizeof(t), &e->volume), pa_yes_no(e->volume_valid)); + pa_log("mute=%s %s", pa_yes_no(e->muted), pa_yes_no(e->volume_valid)); pa_xfree(e); } @@ -674,8 +639,8 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio pa_channel_map cm; pa_tagstruct_puts(reply, name); - pa_tagstruct_put_channel_map(reply, (e->relative_volume_valid || e->absolute_volume_valid) ? &e->channel_map : pa_channel_map_init(&cm)); - pa_tagstruct_put_cvolume(reply, e->absolute_volume_valid ? &e->absolute_volume : (e->relative_volume_valid ? &e->relative_volume : pa_cvolume_init(&r))); + pa_tagstruct_put_channel_map(reply, e->volume_valid ? &e->channel_map : pa_channel_map_init(&cm)); + pa_tagstruct_put_cvolume(reply, e->volume_valid ? &e->volume : pa_cvolume_init(&r)); pa_tagstruct_puts(reply, e->device_valid ? e->device : NULL); pa_tagstruct_put_boolean(reply, e->muted_valid ? e->muted : FALSE); @@ -718,7 +683,7 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio if (pa_tagstruct_gets(t, &name) < 0 || pa_tagstruct_get_channel_map(t, &entry.channel_map) || - pa_tagstruct_get_cvolume(t, &entry.absolute_volume) < 0 || + pa_tagstruct_get_cvolume(t, &entry.volume) < 0 || pa_tagstruct_gets(t, &device) < 0 || pa_tagstruct_get_boolean(t, &muted) < 0) goto fail; @@ -726,11 +691,10 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio if (!name || !*name) goto fail; - entry.relative_volume = entry.absolute_volume; - entry.absolute_volume_valid = entry.relative_volume_valid = entry.relative_volume.channels > 0; + entry.volume_valid = entry.volume.channels > 0; - if (entry.relative_volume_valid) - if (!pa_cvolume_compatible_with_channel_map(&entry.relative_volume, &entry.channel_map)) + if (entry.volume_valid) + if (!pa_cvolume_compatible_with_channel_map(&entry.volume, &entry.channel_map)) goto fail; entry.muted = muted; diff --git a/src/modules/oss/module-oss.c b/src/modules/oss/module-oss.c index 855e8a35..9f7863f5 100644 --- a/src/modules/oss/module-oss.c +++ b/src/modules/oss/module-oss.c @@ -617,7 +617,7 @@ static int unsuspend(struct userdata *u) { build_pollfd(u); if (u->sink) - pa_sink_get_volume(u->sink, TRUE); + pa_sink_get_volume(u->sink, TRUE, FALSE); if (u->source) pa_source_get_volume(u->source, TRUE); |