emmental/rind/audio/playbin.py

77 lines
1.7 KiB
Python

# Copyright 2019 (c) Anna Schumaker.
from . import artwork
from gi.repository import GLib, Gst
Playbin = Gst.ElementFactory.make("playbin")
Fakesink = Gst.ElementFactory.make("fakesink")
Bus = Playbin.get_bus()
Bus.add_signal_watch()
def get_state():
(ret, state, pending) = Playbin.get_state(Gst.CLOCK_TIME_NONE)
if ret == Gst.StateChangeReturn.SUCCESS:
return state
return ret
def get_property(key):
return Playbin.get_property(key)
def set_property(key, value):
Playbin.set_property(key, value)
set_property("video-sink", Fakesink)
def set_uri(uri, state=None):
uri = GLib.filename_to_uri(uri)
if state != None:
Playbin.set_state(Gst.State.NULL)
artwork.reset()
set_property("uri", uri)
if state != None:
Playbin.set_state(state)
def set_volume(volume):
set_property("volume", volume / 100.0)
def position():
(res, pos) = Playbin.query_position(Gst.Format.TIME)
return pos if res == True else 0
def duration():
(res, dur) = Playbin.query_duration(Gst.Format.TIME)
return dur if res == True else 0
def remaining():
return duration() - position()
def progress():
dur = duration()
return (position() * 100) / dur if dur > 0 else 0
def play():
return Playbin.set_state(Gst.State.PLAYING)
def pause():
return Playbin.set_state(Gst.State.PAUSED)
def seek_percent(percent):
pos = (duration() * percent) / 100.0
return Playbin.seek_simple(Gst.Format.TIME, Gst.SeekFlags.FLUSH, pos)
def seek_step(step):
pos = position() + (step * Gst.SECOND)
if pos < 0:
pos = 0
return Playbin.seek_simple(Gst.Format.TIME, Gst.SeekFlags.FLUSH, pos)
def reset():
Playbin.set_state(Gst.State.NULL)
seek_percent(0)
set_volume(100)