replaces namespace fenrir with fenrirscreenreader
This commit is contained in:
0
src/fenrirscreenreader/soundDriver/__init__.py
Executable file
0
src/fenrirscreenreader/soundDriver/__init__.py
Executable file
56
src/fenrirscreenreader/soundDriver/debugDriver.py
Normal file
56
src/fenrirscreenreader/soundDriver/debugDriver.py
Normal file
@ -0,0 +1,56 @@
|
||||
#!/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Fenrir TTY screen reader
|
||||
# By Chrys, Storm Dragon, and contributers.
|
||||
|
||||
from fenrirscreenreader.core import debug
|
||||
from fenrirscreenreader.core.soundDriver import soundDriver
|
||||
|
||||
class driver(soundDriver):
|
||||
def __init__(self):
|
||||
soundDriver.__init__(self)
|
||||
|
||||
def initialize(self, environment):
|
||||
self.env = environment
|
||||
self._initialized = True
|
||||
print('Sound Debug Driver: Initialized')
|
||||
|
||||
def shutdown(self):
|
||||
if not self._initialized:
|
||||
return
|
||||
self.cancel()
|
||||
self._initialized = False
|
||||
print('Sound Debug Driver: Shutdown')
|
||||
|
||||
def playFrequence(self, frequence = 1000, duration = 0.3, adjustVolume = 0):
|
||||
if not self._initialized:
|
||||
return
|
||||
if interrupt:
|
||||
self.cancel()
|
||||
print('Sound Debug Driver: playFrequence:' + ' freq:' + str(frequence) + ' duration:' + str(duration) + ' adjustVolume:' + str(adjustVolume) )
|
||||
print('Sound Debug Driver: -----------------------------------')
|
||||
|
||||
def playSoundFile(self, filePath, interrupt = True):
|
||||
if not self._initialized:
|
||||
return
|
||||
if interrupt:
|
||||
self.cancel()
|
||||
print('Sound Debug Driver: playSoundFile:' + str(filePath))
|
||||
print('Sound Debug Driver: -----------------------------------')
|
||||
|
||||
def cancel(self):
|
||||
if not self._initialized:
|
||||
return
|
||||
print('Sound Debug Driver: Cancel')
|
||||
|
||||
def setCallback(self, callback):
|
||||
if not self._initialized:
|
||||
return
|
||||
print('Sound Debug Driver: setCallback')
|
||||
|
||||
def setVolume(self, volume):
|
||||
if not self._initialized:
|
||||
return
|
||||
self.volume = volume
|
||||
print('Sound Debug Driver: setVolume:' + str(self.volume))
|
12
src/fenrirscreenreader/soundDriver/dummyDriver.py
Normal file
12
src/fenrirscreenreader/soundDriver/dummyDriver.py
Normal file
@ -0,0 +1,12 @@
|
||||
#!/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Fenrir TTY screen reader
|
||||
# By Chrys, Storm Dragon, and contributers.
|
||||
|
||||
from fenrirscreenreader.core import debug
|
||||
from fenrirscreenreader.core.soundDriver import soundDriver
|
||||
|
||||
class driver(soundDriver):
|
||||
def __init__(self):
|
||||
soundDriver.__init__(self)
|
63
src/fenrirscreenreader/soundDriver/genericDriver.py
Normal file
63
src/fenrirscreenreader/soundDriver/genericDriver.py
Normal file
@ -0,0 +1,63 @@
|
||||
#!/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Fenrir TTY screen reader
|
||||
# By Chrys, Storm Dragon, and contributers.
|
||||
|
||||
from fenrirscreenreader.core import debug
|
||||
import subprocess
|
||||
import shlex
|
||||
from fenrirscreenreader.core.soundDriver import soundDriver
|
||||
|
||||
class driver(soundDriver):
|
||||
def __init__(self):
|
||||
soundDriver.__init__(self)
|
||||
self.proc = None
|
||||
self.soundType = ''
|
||||
self.soundFileCommand = ''
|
||||
self.frequenceCommand = ''
|
||||
def initialize(self, environment):
|
||||
self.env = environment
|
||||
self.soundFileCommand = self.env['runtime']['settingsManager'].getSetting('sound', 'genericPlayFileCommand')
|
||||
self.frequenceCommand = self.env['runtime']['settingsManager'].getSetting('sound', 'genericFrequencyCommand')
|
||||
if self.soundFileCommand == '':
|
||||
self.soundFileCommand = 'play -q -v fenrirVolume fenrirSoundFile'
|
||||
if self.frequenceCommand == '':
|
||||
self.frequenceCommand = 'play -q -v fenrirVolume -n -c1 synth fenrirDuration sine fenrirFrequence'
|
||||
self._initialized = True
|
||||
|
||||
def playFrequence(self, frequence = 1000, duration = 0.3, adjustVolume = 0):
|
||||
if not self._initialized:
|
||||
return
|
||||
if interrupt:
|
||||
self.cancel()
|
||||
popenFrequenceCommand = shlex.split(self.frequenceCommand)
|
||||
for idx, word in enumerate(popenFrequenceCommand):
|
||||
word = word.replace('fenrirVolume', str(self.volume + adjustVolume ))
|
||||
word = word.replace('fenrirFreqDuration', str(duration))
|
||||
word = word.replace('fenrirFrequence', str(frequence))
|
||||
popenFrequenceCommand[idx] = word
|
||||
self.proc = subprocess.Popen(popenFrequenceCommand, shell=False)
|
||||
self.soundType = 'frequence'
|
||||
def playSoundFile(self, filePath, interrupt = True):
|
||||
if not self._initialized:
|
||||
return
|
||||
if interrupt:
|
||||
self.cancel()
|
||||
popenSoundFileCommand = shlex.split(self.soundFileCommand)
|
||||
for idx, word in enumerate(popenSoundFileCommand):
|
||||
word = word.replace('fenrirVolume', str(self.volume ))
|
||||
word = word.replace('fenrirSoundFile', str(filePath))
|
||||
popenSoundFileCommand[idx] = word
|
||||
self.proc = subprocess.Popen(popenSoundFileCommand, shell=False)
|
||||
self.soundType = 'file'
|
||||
def cancel(self):
|
||||
if not self._initialized:
|
||||
return
|
||||
if self.soundType == '':
|
||||
return
|
||||
if self.soundType == 'file':
|
||||
self.proc.kill()
|
||||
if self.soundType == 'frequence':
|
||||
self.proc.kill()
|
||||
self.soundType = ''
|
113
src/fenrirscreenreader/soundDriver/gstreamerDriver.py
Normal file
113
src/fenrirscreenreader/soundDriver/gstreamerDriver.py
Normal file
@ -0,0 +1,113 @@
|
||||
#!/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Fenrir TTY screen reader
|
||||
# By Chrys, Storm Dragon, and contributers.
|
||||
|
||||
from fenrirscreenreader.core import debug
|
||||
import time, threading
|
||||
from fenrirscreenreader.core.soundDriver import soundDriver
|
||||
|
||||
_gstreamerAvailable = False
|
||||
try:
|
||||
import gi
|
||||
from gi.repository import GLib
|
||||
gi.require_version('Gst', '1.0')
|
||||
from gi.repository import Gst
|
||||
_gstreamerAvailable, args = Gst.init_check(None)
|
||||
except Exception as e:
|
||||
_gstreamerAvailable = False
|
||||
_availableError = str(e)
|
||||
|
||||
class driver(soundDriver):
|
||||
def __init__(self):
|
||||
soundDriver.__init__(self)
|
||||
self._source = None
|
||||
self._sink = None
|
||||
|
||||
def initialize(self, environment):
|
||||
self.env = environment
|
||||
global _gstreamerAvailable
|
||||
self._initialized = _gstreamerAvailable
|
||||
if not self._initialized:
|
||||
global _availableError
|
||||
self.environment['runtime']['debug'].writeDebugOut('Gstreamer not available ' + _availableError,debug.debugLevel.ERROR)
|
||||
return
|
||||
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.mainloop = GLib.MainLoop()
|
||||
self.thread = threading.Thread(target=self.mainloop.run)
|
||||
self.thread.start()
|
||||
|
||||
def shutdown(self):
|
||||
if not self._initialized:
|
||||
return
|
||||
self.cancel()
|
||||
self.mainloop.quit()
|
||||
|
||||
def _onPlayerMessage(self, bus, message):
|
||||
if not self._initialized:
|
||||
return
|
||||
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()
|
||||
self.env['runtime']['debug'].writeDebugOut('GSTREAMER: _onPlayerMessage'+ str(error) + str(info),debug.debugLevel.WARNING)
|
||||
|
||||
def _onPipelineMessage(self, bus, message):
|
||||
if not self._initialized:
|
||||
return
|
||||
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()
|
||||
self.env['runtime']['debug'].writeDebugOut('GSTREAMER: _onPipelineMessage'+ str(error) + str(info),debug.debugLevel.WARNING)
|
||||
|
||||
def _onTimeout(self, element):
|
||||
if not self._initialized:
|
||||
return
|
||||
element.set_state(Gst.State.NULL)
|
||||
|
||||
def playSoundFile(self, fileName, interrupt=True):
|
||||
if not self._initialized:
|
||||
return
|
||||
if interrupt:
|
||||
self.cancel()
|
||||
self._player.set_property('uri', 'file://%s' % fileName)
|
||||
self._player.set_state(Gst.State.PLAYING)
|
||||
|
||||
def playFrequence(self, frequence, duration, adjustVolume, interrupt=True):
|
||||
if not self._initialized:
|
||||
return
|
||||
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 self._initialized:
|
||||
return
|
||||
if element:
|
||||
element.set_state(Gst.State.NULL)
|
||||
return
|
||||
self._player.set_state(Gst.State.NULL)
|
||||
self._pipeline.set_state(Gst.State.NULL)
|
Reference in New Issue
Block a user