rind: Add volume button

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2019-03-30 17:26:02 -04:00
parent ff3b9c4b5a
commit 215ebb8653
3 changed files with 136 additions and 43 deletions

View File

@ -12,6 +12,12 @@
<property name="step_increment">5</property>
<property name="page_increment">10</property>
</object>
<object class="GtkAdjustment" id="volume_adjustment">
<property name="upper">100</property>
<property name="value">100</property>
<property name="step_increment">1</property>
<property name="page_increment">10</property>
</object>
<object class="GtkApplicationWindow" id="window">
<property name="visible">True</property>
<property name="can_focus">False</property>
@ -200,69 +206,135 @@
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">5</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkLabel" id="position">
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">00:00</property>
<property name="xalign">1</property>
<property name="homogeneous">True</property>
<child>
<object class="GtkToggleButton" id="random_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon_name">media-playlist-shuffle-symbolic</property>
<property name="icon_size">2</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkVolumeButton" id="volume_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="focus_on_click">False</property>
<property name="receives_default">True</property>
<property name="relief">half</property>
<property name="orientation">vertical</property>
<property name="value">100</property>
<property name="adjustment">volume_adjustment</property>
<property name="icons">audio-volume-muted-symbolic
audio-volume-high-symbolic
audio-volume-low-symbolic
audio-volume-medium-symbolic</property>
<child internal-child="plus_button">
<object class="GtkButton">
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="relief">none</property>
</object>
</child>
<child internal-child="minus_button">
<object class="GtkButton">
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="relief">none</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<style>
<class name="linked"/>
</style>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkScale" id="progress_scale">
<property name="width_request">125</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="adjustment">progress_adjustment</property>
<property name="fill_level">100</property>
<property name="digits">-1</property>
<property name="draw_value">False</property>
<property name="value_pos">left</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="duration">
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_right">10</property>
<property name="label" translatable="yes">-00:00</property>
<property name="xalign">0</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkToggleButton" id="random_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="margin_bottom">5</property>
<property name="spacing">5</property>
<child>
<object class="GtkImage">
<object class="GtkLabel" id="position">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon_name">media-playlist-shuffle-symbolic</property>
<property name="icon_size">3</property>
<property name="label" translatable="yes">00:00</property>
<property name="xalign">1</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkScale" id="progress_scale">
<property name="width_request">125</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="adjustment">progress_adjustment</property>
<property name="fill_level">100</property>
<property name="digits">-1</property>
<property name="draw_value">False</property>
<property name="value_pos">left</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="duration">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">-00:00</property>
<property name="xalign">0</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">3</property>
<property name="position">1</property>
</packing>
</child>
</object>

View File

@ -9,6 +9,7 @@ from gi.repository import Gst, GLib
Gst.init(sys.argv)
Adjustment = gtk.Builder.get_object("progress_adjustment")
Artist = gtk.Builder.get_object("artist")
Duration = gtk.Builder.get_object("duration")
NextButton = gtk.Builder.get_object("next_button")
PauseButton = gtk.Builder.get_object("pause_button")
@ -16,8 +17,9 @@ PlayButton = gtk.Builder.get_object("play_button")
Position = gtk.Builder.get_object("position")
PrevButton = gtk.Builder.get_object("previous_button")
ProgScale = gtk.Builder.get_object("progress_scale")
Artist = gtk.Builder.get_object("artist")
Title = gtk.Builder.get_object("title")
Volume = gtk.Builder.get_object("volume_button")
VolumeAdj = gtk.Builder.get_object("volume_adjustment")
class EmmentalAudio:
def __init__(self):
@ -33,6 +35,7 @@ class EmmentalAudio:
self.prev_cb = PrevButton.connect( "clicked", self.previous)
self.next_cb = NextButton.connect( "clicked", self.next)
self.seek_cb = ProgScale.connect("change-value", self.seek)
self.vol_cb = Volume.connect("value-changed", self.set_volume)
self.finish_cb = self.playbin.connect("about-to-finish",
self.about_to_finish)
@ -59,6 +62,9 @@ class EmmentalAudio:
(res, cur) = self.playbin.query_duration(Gst.Format.TIME)
return cur / Gst.SECOND if res == True else 0.0
def get_property(self, name):
return self.playbin.get_property(name)
def load(self, track):
if track:
self.playbin.set_state(Gst.State.READY)
@ -116,6 +122,9 @@ class EmmentalAudio:
pos = (dur * value) / 100.0
self.playbin.seek_simple(Gst.Format.TIME, Gst.SeekFlags.FLUSH, pos)
def set_volume(self, button, value):
self.playbin.set_property("volume", value / 100.0)
def state_changed(self, src, state):
if src == self.playbin:
PlayButton.set_visible( state != Gst.State.PLAYING)

View File

@ -61,6 +61,8 @@ class TestGst(unittest.TestCase):
self.assertIsInstance(gst.PrevButton, Gtk.Button)
self.assertIsInstance(gst.ProgScale, Gtk.Scale)
self.assertIsInstance(gst.Title, Gtk.Label)
self.assertIsInstance(gst.Volume, Gtk.VolumeButton)
self.assertIsInstance(gst.VolumeAdj, Gtk.Adjustment)
self.assertEqual(gst.Title.get_text(), "Emmental")
self.assertEqual(gst.Artist.get_text(), "The Cheesy Music Player")
@ -72,6 +74,7 @@ class TestGst(unittest.TestCase):
self.assertEqual(gst.Duration.get_text(), "-00:00")
self.assertFalse(gst.ProgScale.get_show_fill_level())
self.assertEqual(gst.ProgScale.get_fill_level(), 100.0)
self.assertEqual(gst.Volume.get_value(), 100)
self.audio.load(None)
self.assertFalse(gst.PauseButton.is_visible())
@ -143,6 +146,15 @@ class TestGst(unittest.TestCase):
self.assertTrue( gst.PlayButton.is_visible())
self.assertEqual(curds.PlaylistManager.track, track2)
self.assertAlmostEqual(self.audio.get_property("volume"), 1.0)
self.assertEqual(gst.Volume.get_value(), 100.0)
gst.Volume.set_value(50)
self.assertAlmostEqual(self.audio.get_property("volume"), 0.5, delta=0.001)
self.assertEqual(gst.Volume.get_value(), 50.0)
gst.Volume.set_value(100)
self.assertEqual(gst.Volume.get_value(), 100.0)
self.assertAlmostEqual(self.audio.get_property("volume"), 1.0)
self.audio.seek(value=50.0)
self.main_loop(delay=0.1)
self.assertEqual(self.audio.duration(), 3.0)