To make Fenrir easier to approach for new developer, start code migration to be pep8 compliant.

This commit is contained in:
Storm Dragon
2025-07-01 22:23:50 -04:00
parent 4bcf82178e
commit 7408951152
345 changed files with 8688 additions and 3852 deletions

View File

@ -7,6 +7,7 @@
from fenrirscreenreader.core import debug
from fenrirscreenreader.core.soundDriver import soundDriver
class driver(soundDriver):
def __init__(self):
soundDriver.__init__(self)
@ -23,34 +24,46 @@ class driver(soundDriver):
self._initialized = False
print('Sound Debug Driver: Shutdown')
def playFrequence(self, frequence, duration, adjustVolume = 0.0, interrupt=True):
def playFrequence(
self,
frequence,
duration,
adjustVolume=0.0,
interrupt=True):
if not self._initialized:
return
return
if interrupt:
self.cancel()
print('Sound Debug Driver: playFrequence:' + ' freq:' + str(frequence) + ' duration:' + str(duration) + ' adjustVolume:' + str(adjustVolume) )
print(
'Sound Debug Driver: playFrequence:' +
' freq:' +
str(frequence) +
' duration:' +
str(duration) +
' adjustVolume:' +
str(adjustVolume))
print('Sound Debug Driver: -----------------------------------')
def playSoundFile(self, filePath, interrupt = True):
def playSoundFile(self, filePath, interrupt=True):
if not self._initialized:
return
return
if interrupt:
self.cancel()
print('Sound Debug Driver: playSoundFile:' + str(filePath))
print('Sound Debug Driver: playSoundFile:' + str(filePath))
print('Sound Debug Driver: -----------------------------------')
def cancel(self):
if not self._initialized:
return
print('Sound Debug Driver: Cancel')
print('Sound Debug Driver: Cancel')
def setCallback(self, callback):
if not self._initialized:
return
print('Sound Debug Driver: setCallback')
print('Sound Debug Driver: setCallback')
def setVolume(self, volume):
if not self._initialized:
return
return
self.volume = volume
print('Sound Debug Driver: setVolume:' + str(self.volume))
print('Sound Debug Driver: setVolume:' + str(self.volume))

View File

@ -7,6 +7,7 @@
from fenrirscreenreader.core import debug
from fenrirscreenreader.core.soundDriver import soundDriver
class driver(soundDriver):
def __init__(self):
soundDriver.__init__(self)

View File

@ -9,6 +9,7 @@ import subprocess
import shlex
from fenrirscreenreader.core.soundDriver import soundDriver
class driver(soundDriver):
def __init__(self):
soundDriver.__init__(self)
@ -16,30 +17,46 @@ class driver(soundDriver):
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')
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, duration, adjustVolume = 0.0, interrupt=True):
def playFrequence(
self,
frequence,
duration,
adjustVolume=0.0,
interrupt=True):
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(
'fenrirVolume', str(
self.volume * adjustVolume))
word = word.replace('fenrirDuration', str(duration))
word = word.replace('fenrirFrequence', str(frequence))
popenFrequenceCommand[idx] = word
self.proc = subprocess.Popen(popenFrequenceCommand, stdin=None, stdout=None, stderr=None, shell=False)
self.proc = subprocess.Popen(
popenFrequenceCommand,
stdin=None,
stdout=None,
stderr=None,
shell=False)
self.soundType = 'frequence'
def playSoundFile(self, filePath, interrupt = True):
def playSoundFile(self, filePath, interrupt=True):
if not self._initialized:
return
if interrupt:
@ -50,11 +67,12 @@ class driver(soundDriver):
return
popenSoundFileCommand = shlex.split(self.soundFileCommand)
for idx, word in enumerate(popenSoundFileCommand):
word = word.replace('fenrirVolume', str(self.volume ))
word = word.replace('fenrirVolume', str(self.volume))
word = word.replace('fenrirSoundFile', shlex.quote(str(filePath)))
popenSoundFileCommand[idx] = word
self.proc = subprocess.Popen(popenSoundFileCommand, shell=False)
self.soundType = 'file'
def cancel(self):
if not self._initialized:
return
@ -63,7 +81,8 @@ class driver(soundDriver):
if self.soundType == 'file':
self.proc.kill()
try:
self.proc.wait(timeout=1.0) # Wait for process to finish to prevent zombies
# Wait for process to finish to prevent zombies
self.proc.wait(timeout=1.0)
except subprocess.TimeoutExpired:
pass # Process already terminated
except Exception as e:
@ -71,7 +90,8 @@ class driver(soundDriver):
if self.soundType == 'frequence':
self.proc.kill()
try:
self.proc.wait(timeout=1.0) # Wait for process to finish to prevent zombies
# Wait for process to finish to prevent zombies
self.proc.wait(timeout=1.0)
except subprocess.TimeoutExpired:
pass # Process already terminated
except Exception as e:

View File

@ -5,7 +5,8 @@
# By Chrys, Storm Dragon, and contributers.
from fenrirscreenreader.core import debug
import time, threading
import time
import threading
from fenrirscreenreader.core.soundDriver import soundDriver
_gstreamerAvailable = False
@ -19,19 +20,21 @@ 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)
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()
@ -59,28 +62,33 @@ class driver(soundDriver):
self.mainloop.quit()
# Wait for the GLib MainLoop thread to finish to prevent shutdown races
if hasattr(self, 'thread') and self.thread.is_alive():
self.thread.join(timeout=2.0) # 2 second timeout to prevent hanging
# 2 second timeout to prevent hanging
self.thread.join(timeout=2.0)
def _onPlayerMessage(self, bus, message):
if not self._initialized:
return
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)
self.env['runtime']['debug'].writeDebugOut(
'GSTREAMER: _onPlayerMessage' + str(error) + str(info),
debug.debugLevel.WARNING)
def _onPipelineMessage(self, bus, message):
if not self._initialized:
return
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)
self.env['runtime']['debug'].writeDebugOut(
'GSTREAMER: _onPipelineMessage' + str(error) + str(info),
debug.debugLevel.WARNING)
def _onTimeout(self, element):
if not self._initialized:
return
@ -95,7 +103,12 @@ class driver(soundDriver):
self._player.set_property('uri', 'file://%s' % fileName)
self._player.set_state(Gst.State.PLAYING)
def playFrequence(self, frequence, duration, adjustVolume = 0.0, interrupt=True):
def playFrequence(
self,
frequence,
duration,
adjustVolume=0.0,
interrupt=True):
if not self._initialized:
return
if interrupt: