Add a duration check to prevent hanging playback
This commit is contained in:
parent
ffcd0d70c2
commit
2708f22b80
3 changed files with 39 additions and 3 deletions
|
@ -279,6 +279,8 @@ class CommandHandler(object):
|
||||||
file = cmd['file'] if 'file' in cmd else None
|
file = cmd['file'] if 'file' in cmd else None
|
||||||
text = cmd['msg'] if 'msg' in cmd else None
|
text = cmd['msg'] if 'msg' in cmd else None
|
||||||
params = cmd['params'] if 'params' in cmd else {}
|
params = cmd['params'] if 'params' in cmd else {}
|
||||||
|
# use duration for timing the popen duration (and redo it if needed)
|
||||||
|
duration = cmd['duration'] if 'duration' in cmd else None
|
||||||
self.playingMsgId = msgId
|
self.playingMsgId = msgId
|
||||||
|
|
||||||
if file is None and text is None:
|
if file is None and text is None:
|
||||||
|
@ -302,6 +304,12 @@ class CommandHandler(object):
|
||||||
if self.play_audiodev is not None:
|
if self.play_audiodev is not None:
|
||||||
environment_vars['AUDIODEV'] = self.play_audiodev
|
environment_vars['AUDIODEV'] = self.play_audiodev
|
||||||
logger.debug(playCmd)
|
logger.debug(playCmd)
|
||||||
|
|
||||||
|
t = None
|
||||||
|
if duration is not None:
|
||||||
|
t = threading.Timer(duration+3, self.checkPopen, (msgId,))
|
||||||
|
t.start()
|
||||||
|
|
||||||
self.playPopen = subprocess.Popen(
|
self.playPopen = subprocess.Popen(
|
||||||
playCmd, stdout=subprocess.PIPE, env=environment_vars)
|
playCmd, stdout=subprocess.PIPE, env=environment_vars)
|
||||||
self.sendMessage({
|
self.sendMessage({
|
||||||
|
@ -312,6 +320,10 @@ class CommandHandler(object):
|
||||||
returnCode = self.playPopen.returncode
|
returnCode = self.playPopen.returncode
|
||||||
logger.debug('finished')
|
logger.debug('finished')
|
||||||
self.playPopen = None
|
self.playPopen = None
|
||||||
|
|
||||||
|
if t is not None:
|
||||||
|
t.cancel()
|
||||||
|
|
||||||
else:
|
else:
|
||||||
logger.info("Speak: {}".format(text))
|
logger.info("Speak: {}".format(text))
|
||||||
playCmd = ['espeak', '-p', '{0}'.format(pitch), text]
|
playCmd = ['espeak', '-p', '{0}'.format(pitch), text]
|
||||||
|
@ -332,6 +344,16 @@ class CommandHandler(object):
|
||||||
'event': 'playbackFinish',
|
'event': 'playbackFinish',
|
||||||
'msgId': msgId
|
'msgId': msgId
|
||||||
})
|
})
|
||||||
|
|
||||||
|
def checkPopen(self, msgId):
|
||||||
|
if self.playingMsgId != msgId:
|
||||||
|
return
|
||||||
|
|
||||||
|
if self.playPopen is None:
|
||||||
|
return
|
||||||
|
|
||||||
|
# prevent a lock of the story, no repeat or anything for now
|
||||||
|
self.playPopen.terminate()
|
||||||
|
|
||||||
def cmdStop(self, msgId):
|
def cmdStop(self, msgId):
|
||||||
if self.playPopen and self.playingMsgId == msgId:
|
if self.playPopen and self.playingMsgId == msgId:
|
||||||
|
|
|
@ -12,6 +12,7 @@ import threading
|
||||||
import faulthandler
|
import faulthandler
|
||||||
from zmq.asyncio import Context
|
from zmq.asyncio import Context
|
||||||
import zmq
|
import zmq
|
||||||
|
import wave
|
||||||
|
|
||||||
mainLogger = logging.getLogger("hugvey")
|
mainLogger = logging.getLogger("hugvey")
|
||||||
logger = mainLogger.getChild("narrative")
|
logger = mainLogger.getChild("narrative")
|
||||||
|
@ -503,6 +504,10 @@ class Diversion(object):
|
||||||
"""
|
"""
|
||||||
Participant asks if message can be repeated.
|
Participant asks if message can be repeated.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
# TODO: how to handle this now we sometimes use different timings.
|
||||||
|
# Perhaps set isFinished when matching condition.
|
||||||
if story.currentReply is None or story.currentReply.isSpeaking():
|
if story.currentReply is None or story.currentReply.isSpeaking():
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -937,12 +942,20 @@ class Story(object):
|
||||||
|
|
||||||
# TODO: prep events & timer etc.
|
# TODO: prep events & timer etc.
|
||||||
fn = await message.getAudioFilePath()
|
fn = await message.getAudioFilePath()
|
||||||
|
|
||||||
|
# get duration of audio file, so the client can detect a hang of 'play'
|
||||||
|
with wave.open(fn,'r') as fp:
|
||||||
|
frames = fp.getnframes()
|
||||||
|
rate = fp.getframerate()
|
||||||
|
duration = frames/float(rate)
|
||||||
|
|
||||||
# self.hugvey.google.pause() # pause STT to avoid text events while decision is made
|
# self.hugvey.google.pause() # pause STT to avoid text events while decision is made
|
||||||
self.hugvey.sendCommand({
|
self.hugvey.sendCommand({
|
||||||
'action': 'play',
|
'action': 'play',
|
||||||
'file': fn,
|
'file': fn,
|
||||||
'id': message.id,
|
'id': message.id,
|
||||||
'params': message.getParams()
|
'params': message.getParams(),
|
||||||
|
'duration': duration
|
||||||
})
|
})
|
||||||
|
|
||||||
# 2019-02-22 temporary disable listening while playing audio:
|
# 2019-02-22 temporary disable listening while playing audio:
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
apt-get update
|
apt-get update
|
||||||
|
|
||||||
apt-get install -y munin-node
|
apt-get install -y munin-node bc
|
||||||
cp installation/rpi-internal-temp /usr/share/munin/plugins
|
cp installation/rpi-internal-temp /usr/share/munin/plugins
|
||||||
ln -sf /usr/share/munin/plugins/rpi-internal-temp /etc/munin/plugins/rpi-internal-temp
|
ln -sf /usr/share/munin/plugins/rpi-internal-temp /etc/munin/plugins/rpi-internal-temp
|
||||||
|
rm /etc/munin/plugins/irqstats
|
||||||
chmod a+x /usr/share/munin/plugins/rpi-internal-temp
|
chmod a+x /usr/share/munin/plugins/rpi-internal-temp
|
||||||
echo "allow ^192\\.168\\.0\\.155\$" >> /etc/munin/munin-node.conf
|
echo "allow ^\\S*\$" >> /etc/munin/munin-node.conf
|
||||||
service munin-node restart
|
service munin-node restart
|
||||||
|
|
||||||
apt-get install -y supervisor
|
apt-get install -y supervisor
|
||||||
|
|
Loading…
Reference in a new issue