emmental/audio/replaygain.py

53 lines
2.1 KiB
Python

# Copyright 2021 (c) Anna Schumaker.
from gi.repository import GObject
from gi.repository import Gst
class ReplayGainSink(Gst.Bin):
def __init__(self):
Gst.Bin.__init__(self)
self.selector = Gst.ElementFactory.make("output-selector")
self.funnel = Gst.ElementFactory.make("funnel")
self.audiosink = Gst.ElementFactory.make("autoaudiosink")
self.rgvolume = Gst.ElementFactory.make("rgvolume")
self.rglimiter = Gst.ElementFactory.make("rglimiter")
for element in [ self.selector, self.funnel, self.audiosink,
self.rgvolume, self.rglimiter ]:
self.add(element)
# No ReplayGain: selector -> funnel -> audiosink
self.shortcut = self.selector.get_request_pad("src_%u")
self.shortcut.link(self.funnel.get_request_pad("sink_%u"))
self.funnel.link(self.audiosink)
# Replaygain: selector -> rgvolume -> rglimiter -> funnel -> audiosink
self.replaygain = self.selector.get_request_pad("src_%u")
self.replaygain.link(self.rgvolume.get_static_pad("sink"))
self.rgvolume.link(self.rglimiter)
self.rglimiter.get_static_pad("src").link(
self.funnel.get_request_pad("sink_%u"))
self.selector.set_property("pad-negotiation-mode", 1)
self.selector.set_property("active-pad", self.shortcut)
pad = self.selector.get_static_pad("sink")
ghost = Gst.GhostPad.new("sink", pad)
ghost.set_active(True)
self.add_pad(ghost)
@GObject.Property
def mode(self):
if self.selector.get_property("active-pad") == self.shortcut:
return "disabled"
album_mode = self.rgvolume.get_property("album-mode")
return "album" if album_mode else "track"
@mode.setter
def mode(self, mode):
if mode == "disabled":
self.selector.set_property("active-pad", self.shortcut)
else:
self.rgvolume.set_property("album-mode", mode == "album")
self.selector.set_property("active-pad", self.replaygain)