Changes
4 changed files (+172/-9)
-
-
@@ -41,14 +41,14 @@ <child><object class="GtkBox" id="incremental_control"> <property name="spacing">6</property> <child> <object class="GtkButton"> <object class="GtkButton" id="volume_down_incr"> <property name="label">Volume down</property> <property name="icon-name">audio-volume-low-symbolic</property> <property name="hexpand">true</property> </object> </child> <child> <object class="GtkButton"> <object class="GtkButton" id="volume_up_incr"> <property name="label">Volume up</property> <property name="icon-name">audio-volume-high-symbolic</property> <property name="hexpand">true</property>
-
@@ -59,7 +59,7 @@ </child><child> <object class="GtkBox" id="value_control"> <child> <object class="GtkButton"> <object class="GtkButton" id="volume_down"> <property name="label">Volume down</property> <property name="icon-name">audio-volume-low-symbolic</property> <style>
-
@@ -78,7 +78,7 @@ </accessibility></object> </child> <child> <object class="GtkButton"> <object class="GtkButton" id="volume_up"> <property name="label">Volume up</property> <property name="icon-name">audio-volume-high-symbolic</property> <style>
-
-
-
@@ -186,6 +186,45 @@ yield;return code; } public async Transport.VolumeControlResultCode increase_volume(Transport.Output output) { GLib.SourceFunc callback = increase_volume.callback; Transport.VolumeControlResultCode code = UNKNOWN_ERROR; new GLib.Thread<void>("increase_volume", () => { code = conn.increase_volume(output); GLib.Idle.add((owned) callback); }); yield; return code; } public async Transport.VolumeControlResultCode decrease_volume(Transport.Output output) { GLib.SourceFunc callback = decrease_volume.callback; Transport.VolumeControlResultCode code = UNKNOWN_ERROR; new GLib.Thread<void>("decrease_volume", () => { code = conn.decrease_volume(output); GLib.Idle.add((owned) callback); }); yield; return code; } public async Transport.VolumeControlResultCode change_volume(Transport.Output output, double value) { GLib.SourceFunc callback = change_volume.callback; Transport.VolumeControlResultCode code = UNKNOWN_ERROR; new GLib.Thread<void>("change_volume", () => { code = conn.change_volume(output, value); GLib.Idle.add((owned) callback); }); yield; return code; } public async Browse.Result? browse(Browse.Hierarchy hierarchy, Transport.Zone? zone, Browse.Item? item, bool back) { GLib.SourceFunc callback = browse.callback; Browse.Result? result = null;
-
-
-
@@ -422,7 +422,10 @@ int i = 0;while (true) { var row = (ZoneOutputRow?) zone_outputs.get_row_at_index(i++); if (row == null) { zone_outputs.append(new ZoneOutputRow(output)); var new_row = new ZoneOutputRow(output); new_row.conn = conn; this.bind_property("conn", new_row, "conn", DEFAULT); zone_outputs.append(new_row); return; }
-
-
-
@@ -29,11 +29,25 @@[GtkChild] private unowned Gtk.Scale volume_slider; [GtkChild] private unowned Gtk.Button volume_up_incr; [GtkChild] private unowned Gtk.Button volume_up; [GtkChild] private unowned Gtk.Button volume_down_incr; [GtkChild] private unowned Gtk.Button volume_down; public bool stale = false; public string output_id { get { return _output.id; } } public Plac.AsyncConnection? conn { get; set construct; } private Plac.Transport.Output _output; public Plac.Transport.Output output {
-
@@ -47,16 +61,123 @@ value_control.visible = false;} else { incremental_control.visible = false; value_control.visible = true; volume_slider.adjustment.lower = output.volume.min; volume_slider.adjustment.upper = output.volume.max; volume_slider.adjustment.value = output.volume.value; volume_slider.adjustment.step_increment = output.volume.step; if (volume_slider.adjustment.lower != output.volume.min) { volume_slider.adjustment.lower = output.volume.min; } if (volume_slider.adjustment.upper != output.volume.max) { volume_slider.adjustment.upper = output.volume.max; } if (!is_moving_volume && volume_slider.adjustment.value != output.volume.value) { volume_slider.adjustment.value = output.volume.value; } if (volume_slider.adjustment.step_increment != output.volume.step) { volume_slider.adjustment.step_increment = output.volume.step; } } } } private bool is_incrementing_volume = false; // true = increase, false = decrease private Gee.ArrayQueue<bool>volume_increment_queue = new Gee.ArrayQueue<bool>(); private bool is_moving_volume = false; private double? next_volume_move_to = null; public ZoneOutputRow(Plac.Transport.Output output) { Object(output: output); } construct { volume_up_incr.clicked.connect(() => { queue_incremental_volume_change(true); }); volume_up.clicked.connect(() => { var current = next_volume_move_to != null ? next_volume_move_to : output.volume.value; schedule_volume_change(current + output.volume.step); }); volume_down_incr.clicked.connect(() => { queue_incremental_volume_change(false); }); volume_down.clicked.connect(() => { var current = next_volume_move_to != null ? next_volume_move_to : output.volume.value; schedule_volume_change(current - output.volume.step); }); volume_slider.change_value.connect((scroll, value) => { schedule_volume_change(value); return false; }); } private void queue_incremental_volume_change(bool is_increase) { volume_increment_queue.offer(is_increase); if (!is_incrementing_volume) { is_incrementing_volume = true; dequeue_incremental_volume_change(); } } private void dequeue_incremental_volume_change() { if (conn == null || volume_increment_queue.is_empty) { is_incrementing_volume = false; return; } var next = volume_increment_queue.poll(); if (next) { conn.increase_volume.begin(output, (obj, res) => { var code = conn.increase_volume.end(res); if (code != OK) { GLib.log("Plac", LEVEL_WARNING, "Increase volume failed: %s", code.to_string()); } dequeue_incremental_volume_change(); }); } else { conn.decrease_volume.begin(output, (obj, res) => { var code = conn.decrease_volume.end(res); if (code != OK) { GLib.log("Plac", LEVEL_WARNING, "Decrease volume failed: %s", code.to_string()); } dequeue_incremental_volume_change(); }); } } private void schedule_volume_change(double value) { next_volume_move_to = value; if (!is_moving_volume) { is_moving_volume = true; take_volume_change(); } } private void take_volume_change() { if (conn == null || next_volume_move_to == null) { is_moving_volume = false; return; } var value = next_volume_move_to; next_volume_move_to = null; conn.change_volume.begin(output, value, (obj, res) => { var code = conn.change_volume.end(res); if (code != OK) { GLib.log("Plac", LEVEL_WARNING, "Change volume failed: %s", code.to_string()); } take_volume_change(); }); } } }
-