#!/bin/python # -*- coding: utf-8 -*- # Fenrir TTY screen reader # By Chrys, Storm Dragon, and contributers. from core import debug import gi import time from gi.repository import GLib try: gi.require_version('Gst', '1.0') from gi.repository import Gst except: _gstreamerAvailable = False else: _gstreamerAvailable, args = Gst.init_check(None) class driver: def __init__(self): self._initialized = False self._source = None self._sink = None self.volume = 1 if not _gstreamerAvailable: return def initialize(self, environment): if self._initialized: return if not _gstreamerAvailable: return self.env = environment self._player = Gst.ElementFactory.make('playbin', 'player') bus = self._player.get_bus() bus.add_signal_watch() bus.connect("message", self._onPlayerMessage) self._pipeline = Gst.Pipeline(name='fenrir-pipeline') bus = self._pipeline.get_bus() bus.add_signal_watch() bus.connect("message", self._onPipelineMessage) self._source = Gst.ElementFactory.make('audiotestsrc', 'src') self._sink = Gst.ElementFactory.make('autoaudiosink', 'output') self._pipeline.add(self._source) self._pipeline.add(self._sink) self._source.link(self._sink) self._initialized = True return def shutdown(self): global _gstreamerAvailable if not _gstreamerAvailable: return self.cancel() self._initialized = False _gstreamerAvailable = False def _onPlayerMessage(self, bus, message): if message.type == Gst.MessageType.EOS: self._player.set_state(Gst.State.NULL) elif message.type == Gst.MessageType.ERROR: self._player.set_state(Gst.State.NULL) error, info = message.parse_error() print(error, info) print('_onPlayerMessage') def _onPipelineMessage(self, bus, message): if message.type == Gst.MessageType.EOS: self._pipeline.set_state(Gst.State.NULL) elif message.type == Gst.MessageType.ERROR: self._pipeline.set_state(Gst.State.NULL) error, info = message.parse_error() print(error, info) print('_onPipelineMessage') def _onTimeout(self, element): element.set_state(Gst.State.NULL) return False def playSoundFile(self, fileName, interrupt=True): if interrupt: self.cancel() self._player.set_property('uri', 'file://%s' % fileName) self._player.set_state(Gst.State.PLAYING) print('playSoundFile') def playFrequence(self, frequence, duration, adjustVolume, interrupt=True): if interrupt: self.cancel() self._source.set_property('volume', tone.volume) self._source.set_property('freq', tone.frequency) self._source.set_property('wave', tone.wave) self._pipeline.set_state(Gst.State.PLAYING) duration = int(1000 * tone.duration) GLib.timeout_add(duration, self._onTimeout, self._pipeline) def cancel(self, element=None): if not _gstreamerAvailable: return if element: element.set_state(Gst.State.NULL) return self._player.set_state(Gst.State.NULL) self._pipeline.set_state(Gst.State.NULL) def setVolume(self, volume): self.volume = volume