Skip to content

Commit

Permalink
voctogui: Add per source volume controls
Browse files Browse the repository at this point in the history
  • Loading branch information
Florob committed Jul 28, 2017
1 parent a687797 commit fdeec5f
Show file tree
Hide file tree
Showing 5 changed files with 86 additions and 144 deletions.
2 changes: 2 additions & 0 deletions voctogui/default-config.ini
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,5 @@ system=gl
[misc]
close=true
cut=true
# Show volume controls even if a default audio source is set
forcevolumecontrol=false
73 changes: 0 additions & 73 deletions voctogui/lib/audioselector.py

This file was deleted.

14 changes: 0 additions & 14 deletions voctogui/lib/ui.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
from lib.warningoverlay import VideoWarningOverlay

from lib.videopreviews import VideoPreviewsController
from lib.audioselector import AudioSelectorController

from lib.toolbar.composition import CompositionToolbarController
from lib.toolbar.streamblank import StreamblankToolbarController
Expand Down Expand Up @@ -59,19 +58,6 @@ def setup(self):
uibuilder=self
)

# check if there is a fixed audio source configured.
# if so, remove the combo-box entirely instead of setting it up.
if Config.has_option('mix', 'audiosource'):
box_audio = self.find_widget_recursive(self.win, 'box_audio')
box_left.remove(box_audio)
else:
combo_audio = self.find_widget_recursive(self.win, 'combo_audio')
self.audio_selector_controller = AudioSelectorController(
combo=combo_audio,
win=self.win,
uibuilder=self
)

# Setup Toolbar Controllers
toolbar = self.find_widget_recursive(self.win, 'toolbar')
self.composition_toolbar_controller = CompositionToolbarController(
Expand Down
57 changes: 56 additions & 1 deletion voctogui/lib/videopreviews.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import logging
from gi.repository import Gtk
import json
import math
from gi.repository import Gtk, GObject
from configparser import NoOptionError

from lib.config import Config
Expand All @@ -21,6 +23,7 @@ def __init__(self, preview_box, win, uibuilder):
self.previews = {}
self.a_btns = {}
self.b_btns = {}
self.volume_sliders = {}

self.current_source = {'a': None, 'b': None}

Expand All @@ -45,6 +48,12 @@ def __init__(self, preview_box, win, uibuilder):
group_a = None
group_b = None

# Check if there is a fixed audio source configured.
# If so, we will remove the volume sliders entirely
# instead of setting them up.
volume_control = (not Config.has_option('mix', 'audiosource') or
Config.getboolean('misc', 'forcevolumecontrol'))

for idx, source in enumerate(self.sources):
self.log.info('Initializing Video Preview %s', source)

Expand Down Expand Up @@ -102,6 +111,27 @@ def __init__(self, preview_box, win, uibuilder):
tooltip = Gtk.accelerator_get_label(key, mod)
btn_fullscreen.set_tooltip_text(tooltip)

volume_slider = uibuilder.find_widget_recursive(preview,
'audio_level')

if not volume_control:
box = uibuilder.find_widget_recursive(preview, 'box')
box.remove(volume_slider)
else:
volume_slider.set_name("volume {}".format(source))
volume_signal = volume_slider.connect('value-changed',
self.slider_changed)

def slider_format(scale, value):
if value == -20.0:
return "-\u221e\u202fdB"
else:
return "{:.{}f}\u202fdB".format(value,
scale.get_digits())

volume_slider.connect('format-value', slider_format)
self.volume_sliders[source] = (volume_slider, volume_signal)

self.preview_players[source] = player
self.previews[source] = preview
self.a_btns[source] = btn_a
Expand All @@ -111,6 +141,10 @@ def __init__(self, preview_box, win, uibuilder):
Connection.on('video_status', self.on_video_status)
Connection.send('get_video')

if volume_control:
Connection.on('audio_status', self.on_audio_status)
Connection.send('get_audio')

def btn_toggled(self, btn):
if not btn.get_active():
return
Expand All @@ -129,6 +163,14 @@ def btn_toggled(self, btn):
self.log.info('video-channel %s changed to %s', channel, source_name)
Connection.send('set_video_' + channel, source_name)

def slider_changed(self, slider):
slider_name = slider.get_name()
source = slider_name.split(' ')[1]
value = slider.get_value()
volume = 10 ** (value / 20) if value > -20.0 else 0
self.log.debug("slider_changed: {}: {:.4f}".format(source, volume))
Connection.send('set_audio_volume {} {:.4f}'.format(source, volume))

def btn_fullscreen_clicked(self, btn):
btn_name = btn.get_name()
self.log.debug('btn_fullscreen_clicked: %s', btn_name)
Expand All @@ -149,3 +191,16 @@ def on_video_status(self, source_a, source_b):

self.a_btns[source_a].set_active(True)
self.b_btns[source_b].set_active(True)

def on_audio_status(self, *volumes):
volumes_json = "".join(volumes)
volumes = json.loads(volumes_json)

for source, volume in volumes.items():
volume = 20.0 * math.log10(volume) if volume > 0 else -20.0
slider, signal = self.volume_sliders[source]
# Temporarily block the 'value-changed' signal,
# so we don't (re)trigger it when receiving (our) changes
GObject.signal_handler_block(slider, signal)
slider.set_value(volume)
GObject.signal_handler_unblock(slider, signal)
84 changes: 28 additions & 56 deletions voctogui/ui/voctogui.ui
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.18.3 -->
<!-- Generated with glade 3.20.0 -->
<interface>
<requires lib="gtk+" version="3.4"/>
<object class="GtkAdjustment" id="audio_level_adjustment">
<property name="lower">-20</property>
<property name="upper">10</property>
<property name="step_increment">0.1</property>
</object>
<object class="GtkImage" id="img-blank-stream">
<property name="visible">True</property>
<property name="can_focus">False</property>
Expand Down Expand Up @@ -195,58 +200,7 @@
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkBox" id="box_audio">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkLabel" id="label_audio">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">5</property>
<property name="margin_right">5</property>
<property name="margin_top">5</property>
<property name="margin_bottom">5</property>
<property name="label" translatable="yes">Audio</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkEventBox" id="combo_audio_events">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="events">GDK_BUTTON_PRESS_MASK | GDK_STRUCTURE_MASK</property>
<child>
<object class="GtkComboBoxText" id="combo_audio">
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">False</property>
<property name="events">GDK_BUTTON_PRESS_MASK | GDK_STRUCTURE_MASK</property>
<property name="margin_top">5</property>
<property name="margin_bottom">5</property>
<items>
<item translatable="yes">Foo</item>
<item translatable="yes">Bar</item>
</items>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
<placeholder/>
</child>
</object>
<packing>
Expand Down Expand Up @@ -372,7 +326,6 @@
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="margin_right">5</property>
<property name="xalign">0.5</property>
<property name="draw_indicator">False</property>
</object>
<packing>
Expand All @@ -390,7 +343,6 @@
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="margin_right">5</property>
<property name="xalign">0.5</property>
<property name="draw_indicator">False</property>
</object>
<packing>
Expand All @@ -408,7 +360,6 @@
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="margin_right">5</property>
<property name="xalign">0.5</property>
</object>
<packing>
<property name="expand">False</property>
Expand All @@ -423,6 +374,27 @@
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkScale" id="audio_level">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="margin_right">5</property>
<property name="adjustment">audio_level_adjustment</property>
<property name="restrict_to_fill_level">False</property>
<property name="round_digits">1</property>
<property name="digits">1</property>
<property name="value_pos">right</property>
<marks>
<mark value="-20">-&#x221e;</mark>
<mark value="0">0.0</mark>
</marks>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
</object>
Expand Down

0 comments on commit fdeec5f

Please sign in to comment.