# 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)