Merge branch 'master' of gitlab.com:hugvey/hugvey
This commit is contained in:
commit
42b4185a69
8 changed files with 407 additions and 222 deletions
|
@ -223,6 +223,11 @@ def getVoiceHandler(voiceStorage):
|
||||||
self.finish()
|
self.finish()
|
||||||
return VoiceHandler
|
return VoiceHandler
|
||||||
|
|
||||||
|
class StaticFileWithHeaderHandler(tornado.web.StaticFileHandler):
|
||||||
|
def set_extra_headers(self, path):
|
||||||
|
"""For subclass to add extra headers to the response"""
|
||||||
|
if path[-5:] == '.html':
|
||||||
|
self.set_header("Access-Control-Allow-Origin", "*")
|
||||||
|
|
||||||
class Panopticon(object):
|
class Panopticon(object):
|
||||||
def __init__(self, central_command, config, voiceStorage):
|
def __init__(self, central_command, config, voiceStorage):
|
||||||
|
@ -239,7 +244,7 @@ class Panopticon(object):
|
||||||
{"path": config['web']['files_dir']}),
|
{"path": config['web']['files_dir']}),
|
||||||
(r"/upload", getUploadHandler(self.command)),
|
(r"/upload", getUploadHandler(self.command)),
|
||||||
(r"/voice", getVoiceHandler(self.voiceStorage)),
|
(r"/voice", getVoiceHandler(self.voiceStorage)),
|
||||||
(r"/(.*)", tornado.web.StaticFileHandler,
|
(r"/(.*)", StaticFileWithHeaderHandler,
|
||||||
{"path": web_dir, "default_filename": 'index.html'}),
|
{"path": web_dir, "default_filename": 'index.html'}),
|
||||||
], debug=True)
|
], debug=True)
|
||||||
|
|
||||||
|
@ -278,4 +283,3 @@ class Panopticon(object):
|
||||||
j = json.dumps(msg)
|
j = json.dumps(msg)
|
||||||
logger.debug(j)
|
logger.debug(j)
|
||||||
self.loop.add_callback(wsHandler.write_to_clients, j)
|
self.loop.add_callback(wsHandler.write_to_clients, j)
|
||||||
|
|
|
@ -628,7 +628,7 @@ class Diversion(object):
|
||||||
}]
|
}]
|
||||||
"""
|
"""
|
||||||
self.counter +=1
|
self.counter +=1
|
||||||
|
# story.logger.warn(f"CREATING DIRECTIONS FOR {startMsg.id}")
|
||||||
finishMessageIds = story.getFinishesForMsg(startMsg)
|
finishMessageIds = story.getFinishesForMsg(startMsg)
|
||||||
finalTimeoutDuration = timeoutDuration
|
finalTimeoutDuration = timeoutDuration
|
||||||
finalContainsDurations = replyContainsDurations
|
finalContainsDurations = replyContainsDurations
|
||||||
|
@ -647,6 +647,7 @@ class Diversion(object):
|
||||||
finalContainsDurations = json.loads(condition.originalJsonString)['vars']['delays']
|
finalContainsDurations = json.loads(condition.originalJsonString)['vars']['delays']
|
||||||
|
|
||||||
i = 0
|
i = 0
|
||||||
|
# story.logger.warn(f"FINISHES: {finishMessageIds}")
|
||||||
for msgId in finishMessageIds:
|
for msgId in finishMessageIds:
|
||||||
# Some very ugly hack to add a direction & condition
|
# Some very ugly hack to add a direction & condition
|
||||||
i+=1
|
i+=1
|
||||||
|
@ -693,6 +694,7 @@ class Diversion(object):
|
||||||
story.logger.info(f"Created direction: {direction.id} {condition.id} with timeout {finalTimeoutDuration}s")
|
story.logger.info(f"Created direction: {direction.id} {condition.id} with timeout {finalTimeoutDuration}s")
|
||||||
story.add(condition)
|
story.add(condition)
|
||||||
story.add(direction)
|
story.add(direction)
|
||||||
|
# story.logger.warn(f"ADDED DIRECTION {direction.id}")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1649,16 +1651,16 @@ class Story(object):
|
||||||
self.timer.pause()
|
self.timer.pause()
|
||||||
|
|
||||||
def calculateFinishesForMsg(self, msgId, depth = 0, checked = []):
|
def calculateFinishesForMsg(self, msgId, depth = 0, checked = []):
|
||||||
if msgId in checked:
|
# if msgId in checked:
|
||||||
return []
|
# return []
|
||||||
|
#
|
||||||
checked.append(msgId)
|
# checked.append(msgId)
|
||||||
|
|
||||||
if not msgId in self.directionsPerMsg or len(self.directionsPerMsg[msgId]) < 1:
|
if not msgId in self.directionsPerMsg or len(self.directionsPerMsg[msgId]) < 1:
|
||||||
# is finish
|
# is finish
|
||||||
return [msgId]
|
return [msgId]
|
||||||
|
|
||||||
if depth > 200:
|
if depth > 100:
|
||||||
return []
|
return []
|
||||||
|
|
||||||
finishes = []
|
finishes = []
|
||||||
|
@ -1691,6 +1693,7 @@ class Story(object):
|
||||||
|
|
||||||
returns message ids
|
returns message ids
|
||||||
"""
|
"""
|
||||||
|
print(msg.id, self.strands)
|
||||||
if msg.id in self.strands:
|
if msg.id in self.strands:
|
||||||
return self.strands[msg.id]
|
return self.strands[msg.id]
|
||||||
|
|
||||||
|
@ -1780,4 +1783,3 @@ class Story(object):
|
||||||
|
|
||||||
def __setstate__(self, state):
|
def __setstate__(self, state):
|
||||||
self.__dict__.update(state)
|
self.__dict__.update(state)
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,16 @@ echo "blacklist snd_bcm2835" > /etc/modprobe.d/internalsnd-blacklist.conf
|
||||||
echo "d /var/log/supervisor 0777 root root" > /etc/tmpfiles.d/supervisor.conf
|
echo "d /var/log/supervisor 0777 root root" > /etc/tmpfiles.d/supervisor.conf
|
||||||
cp installation/fstab /etc/fstab
|
cp installation/fstab /etc/fstab
|
||||||
|
|
||||||
|
# setup pulseaudio as system daemon and grant access: https://rudd-o.com/linux-and-free-software/how-to-make-pulseaudio-run-once-at-boot-for-all-your-users
|
||||||
|
cp installation/pulseaudio.service /etc/systemd/system/pulseaudio.service
|
||||||
|
# disable autospawn
|
||||||
|
cp installation/pulseaudio-client.conf /etc/pulse/client.conf
|
||||||
|
# put tsched to 0: https://wiki.archlinux.org/index.php/PulseAudio/Troubleshooting#Sound_stuttering_when_streaming_over_network
|
||||||
|
cp installation/pulse-default.pa /etc/pulse/default.pa
|
||||||
|
systemctl --system enable pulseaudio.service
|
||||||
|
systemctl --system start pulseaudio.service
|
||||||
|
usermod -a -G pulse-access pi
|
||||||
|
|
||||||
# Added chown=pi:pi
|
# Added chown=pi:pi
|
||||||
cp installation/supervisord.conf /etc/supervisor/supervisord.conf
|
cp installation/supervisord.conf /etc/supervisor/supervisord.conf
|
||||||
ln -s /home/pi/hugvey/supervisor.conf /etc/supervisor/conf.d/hugvey.conf
|
ln -s /home/pi/hugvey/supervisor.conf /etc/supervisor/conf.d/hugvey.conf
|
||||||
|
|
141
installation/pulse-default.pa
Normal file
141
installation/pulse-default.pa
Normal file
|
@ -0,0 +1,141 @@
|
||||||
|
#!/usr/bin/pulseaudio -nF
|
||||||
|
#
|
||||||
|
# This file is part of PulseAudio.
|
||||||
|
#
|
||||||
|
# PulseAudio is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms of the GNU Lesser General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# PulseAudio is distributed in the hope that it will be useful, but
|
||||||
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
# General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Lesser General Public License
|
||||||
|
# along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# This startup script is used only if PulseAudio is started per-user
|
||||||
|
# (i.e. not in system mode)
|
||||||
|
|
||||||
|
.fail
|
||||||
|
|
||||||
|
### Automatically restore the volume of streams and devices
|
||||||
|
load-module module-device-restore
|
||||||
|
load-module module-stream-restore
|
||||||
|
load-module module-card-restore
|
||||||
|
|
||||||
|
### Automatically augment property information from .desktop files
|
||||||
|
### stored in /usr/share/application
|
||||||
|
load-module module-augment-properties
|
||||||
|
|
||||||
|
### Should be after module-*-restore but before module-*-detect
|
||||||
|
load-module module-switch-on-port-available
|
||||||
|
|
||||||
|
### Load audio drivers statically
|
||||||
|
### (it's probably better to not load these drivers manually, but instead
|
||||||
|
### use module-udev-detect -- see below -- for doing this automatically)
|
||||||
|
#load-module module-alsa-sink
|
||||||
|
#load-module module-alsa-source device=hw:1,0
|
||||||
|
#load-module module-oss device="/dev/dsp" sink_name=output source_name=input
|
||||||
|
#load-module module-oss-mmap device="/dev/dsp" sink_name=output source_name=input
|
||||||
|
#load-module module-null-sink
|
||||||
|
#load-module module-pipe-sink
|
||||||
|
|
||||||
|
### Automatically load driver modules depending on the hardware available
|
||||||
|
.ifexists module-udev-detect.so
|
||||||
|
# HUGVEY: put tsched to 0: https://wiki.archlinux.org/index.php/PulseAudio/Troubleshooting#Sound_stuttering_when_streaming_over_network
|
||||||
|
load-module module-udev-detect tsched=0
|
||||||
|
.else
|
||||||
|
### Use the static hardware detection module (for systems that lack udev support)
|
||||||
|
load-module module-detect
|
||||||
|
.endif
|
||||||
|
|
||||||
|
### Automatically connect sink and source if JACK server is present
|
||||||
|
.ifexists module-jackdbus-detect.so
|
||||||
|
.nofail
|
||||||
|
load-module module-jackdbus-detect channels=2
|
||||||
|
.fail
|
||||||
|
.endif
|
||||||
|
|
||||||
|
### Automatically load driver modules for Bluetooth hardware
|
||||||
|
.ifexists module-bluetooth-policy.so
|
||||||
|
load-module module-bluetooth-policy
|
||||||
|
.endif
|
||||||
|
|
||||||
|
.ifexists module-bluetooth-discover.so
|
||||||
|
load-module module-bluetooth-discover
|
||||||
|
.endif
|
||||||
|
|
||||||
|
### Load several protocols
|
||||||
|
.ifexists module-esound-protocol-unix.so
|
||||||
|
load-module module-esound-protocol-unix
|
||||||
|
.endif
|
||||||
|
load-module module-native-protocol-unix
|
||||||
|
|
||||||
|
### Network access (may be configured with paprefs, so leave this commented
|
||||||
|
### here if you plan to use paprefs)
|
||||||
|
#load-module module-esound-protocol-tcp
|
||||||
|
#load-module module-native-protocol-tcp
|
||||||
|
#load-module module-zeroconf-publish
|
||||||
|
|
||||||
|
### Load the RTP receiver module (also configured via paprefs, see above)
|
||||||
|
#load-module module-rtp-recv
|
||||||
|
|
||||||
|
### Load the RTP sender module (also configured via paprefs, see above)
|
||||||
|
#load-module module-null-sink sink_name=rtp format=s16be channels=2 rate=44100 sink_properties="device.description='RTP Multicast Sink'"
|
||||||
|
#load-module module-rtp-send source=rtp.monitor
|
||||||
|
|
||||||
|
### Load additional modules from GConf settings. This can be configured with the paprefs tool.
|
||||||
|
### Please keep in mind that the modules configured by paprefs might conflict with manually
|
||||||
|
### loaded modules.
|
||||||
|
.ifexists module-gconf.so
|
||||||
|
.nofail
|
||||||
|
load-module module-gconf
|
||||||
|
.fail
|
||||||
|
.endif
|
||||||
|
|
||||||
|
### Automatically restore the default sink/source when changed by the user
|
||||||
|
### during runtime
|
||||||
|
### NOTE: This should be loaded as early as possible so that subsequent modules
|
||||||
|
### that look up the default sink/source get the right value
|
||||||
|
load-module module-default-device-restore
|
||||||
|
|
||||||
|
### Automatically move streams to the default sink if the sink they are
|
||||||
|
### connected to dies, similar for sources
|
||||||
|
load-module module-rescue-streams
|
||||||
|
|
||||||
|
### Make sure we always have a sink around, even if it is a null sink.
|
||||||
|
load-module module-always-sink
|
||||||
|
|
||||||
|
### Honour intended role device property
|
||||||
|
load-module module-intended-roles
|
||||||
|
|
||||||
|
### Automatically suspend sinks/sources that become idle for too long
|
||||||
|
load-module module-suspend-on-idle
|
||||||
|
|
||||||
|
### If autoexit on idle is enabled we want to make sure we only quit
|
||||||
|
### when no local session needs us anymore.
|
||||||
|
.ifexists module-console-kit.so
|
||||||
|
load-module module-console-kit
|
||||||
|
.endif
|
||||||
|
.ifexists module-systemd-login.so
|
||||||
|
load-module module-systemd-login
|
||||||
|
.endif
|
||||||
|
|
||||||
|
### Enable positioned event sounds
|
||||||
|
load-module module-position-event-sounds
|
||||||
|
|
||||||
|
### Cork music/video streams when a phone stream is active
|
||||||
|
load-module module-role-cork
|
||||||
|
|
||||||
|
### Modules to allow autoloading of filters (such as echo cancellation)
|
||||||
|
### on demand. module-filter-heuristics tries to determine what filters
|
||||||
|
### make sense, and module-filter-apply does the heavy-lifting of
|
||||||
|
### loading modules and rerouting streams.
|
||||||
|
load-module module-filter-heuristics
|
||||||
|
load-module module-filter-apply
|
||||||
|
|
||||||
|
### Make some devices default
|
||||||
|
#set-default-sink output
|
||||||
|
#set-default-source input
|
18
installation/pulseaudio-client.conf
Normal file
18
installation/pulseaudio-client.conf
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
# disable autospawn because we're in system wide mode
|
||||||
|
|
||||||
|
; default-sink =
|
||||||
|
; default-source =
|
||||||
|
; default-server =
|
||||||
|
; default-dbus-server =
|
||||||
|
|
||||||
|
autospawn = no
|
||||||
|
; daemon-binary = /usr/bin/pulseaudio
|
||||||
|
; extra-arguments = --log-target=syslog
|
||||||
|
|
||||||
|
; cookie-file =
|
||||||
|
|
||||||
|
; enable-shm = yes
|
||||||
|
; shm-size-bytes = 0 # setting this 0 will use the system-default, usually 64 MiB
|
||||||
|
|
||||||
|
; auto-connect-localhost = no
|
||||||
|
; auto-connect-display = no
|
9
installation/pulseaudio.service
Normal file
9
installation/pulseaudio.service
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
[Unit]
|
||||||
|
Description=PulseAudio system server
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=notify
|
||||||
|
ExecStart=/usr/bin/pulseaudio --daemonize=no --system --realtime --log-target=journal
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
|
@ -1,51 +1,52 @@
|
||||||
#N canvas 200 136 660 592 10;
|
#N canvas 976 211 660 592 10;
|
||||||
#X obj 131 277 dac~;
|
#X obj 131 277 dac~;
|
||||||
#X obj 131 227 readsf~;
|
#X obj 131 227 readsf~;
|
||||||
#X obj 209 209 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
|
#X obj 209 209 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
|
||||||
-1 -1;
|
-1 -1;
|
||||||
#X text 229 206 (re-)start loop;
|
#X text 229 206 (re-)start loop;
|
||||||
#X msg 132 170 open /home/a/projects/pd-play/testaudio.wav \, 1;
|
|
||||||
#X obj 208 459 netsend -u -b;
|
#X obj 208 459 netsend -u -b;
|
||||||
#X obj 208 481 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
|
#X obj 208 481 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1
|
||||||
1;
|
1;
|
||||||
#X msg 355 464 disconnect;
|
#X msg 355 464 disconnect;
|
||||||
#X obj 208 393 list prepend send;
|
#X obj 208 393 list prepend send;
|
||||||
#X obj 208 415 list trim;
|
#X obj 208 415 list trim;
|
||||||
#X msg 357 434 connect localhost 5555;
|
|
||||||
#X obj 208 345 oscformat /trigger;
|
|
||||||
#X msg 51 193 0;
|
#X msg 51 193 0;
|
||||||
#X obj 227 83 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
|
#X obj 227 83 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
|
||||||
-1;
|
-1;
|
||||||
#X text 40 173 stop loop;
|
#X text 40 173 stop loop;
|
||||||
#X msg 210 292 1;
|
#X msg 208 320 1;
|
||||||
#X obj 318 84 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
|
#X obj 318 84 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
|
||||||
-1;
|
-1;
|
||||||
#X text 217 60 START;
|
#X text 217 60 START;
|
||||||
#X obj 436 84 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
|
#X obj 436 84 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1
|
||||||
1;
|
1;
|
||||||
#X text 309 61 !STOP!;
|
#X text 309 61 !STOP!;
|
||||||
#X text 422 60 Playing indicator;
|
#X text 422 60 Playing indicator;
|
||||||
#X msg 261 118 1;
|
#X msg 261 118 1;
|
||||||
#X msg 330 117 0;
|
#X msg 330 117 0;
|
||||||
|
#X obj 208 345 oscformat /loop;
|
||||||
|
#X msg 356 434 connect 192.168.1.174 7400;
|
||||||
|
#X msg 132 170 open /mnt/stash/hugvey/score38_loop_40s_extra.wav \,
|
||||||
|
1;
|
||||||
#X connect 1 0 0 0;
|
#X connect 1 0 0 0;
|
||||||
#X connect 1 0 0 1;
|
#X connect 1 0 0 1;
|
||||||
#X connect 1 1 2 0;
|
#X connect 1 1 2 0;
|
||||||
#X connect 2 0 4 0;
|
#X connect 2 0 22 0;
|
||||||
#X connect 2 0 15 0;
|
#X connect 2 0 12 0;
|
||||||
#X connect 4 0 1 0;
|
#X connect 4 0 5 0;
|
||||||
#X connect 5 0 6 0;
|
#X connect 6 0 4 0;
|
||||||
#X connect 7 0 5 0;
|
#X connect 7 0 8 0;
|
||||||
#X connect 8 0 9 0;
|
#X connect 8 0 4 0;
|
||||||
#X connect 9 0 5 0;
|
#X connect 9 0 1 0;
|
||||||
#X connect 10 0 5 0;
|
#X connect 10 0 21 0;
|
||||||
#X connect 11 0 8 0;
|
#X connect 10 0 2 0;
|
||||||
#X connect 12 0 1 0;
|
#X connect 10 0 18 0;
|
||||||
#X connect 13 0 10 0;
|
#X connect 12 0 20 0;
|
||||||
#X connect 13 0 2 0;
|
#X connect 13 0 9 0;
|
||||||
#X connect 13 0 21 0;
|
#X connect 13 0 6 0;
|
||||||
#X connect 15 0 11 0;
|
#X connect 13 0 19 0;
|
||||||
#X connect 16 0 12 0;
|
#X connect 18 0 15 0;
|
||||||
#X connect 16 0 7 0;
|
#X connect 19 0 15 0;
|
||||||
#X connect 16 0 22 0;
|
#X connect 20 0 7 0;
|
||||||
#X connect 21 0 18 0;
|
#X connect 21 0 4 0;
|
||||||
#X connect 22 0 18 0;
|
#X connect 22 0 1 0;
|
||||||
|
|
|
@ -1677,15 +1677,15 @@ class Graph {
|
||||||
let graph = this;
|
let graph = this;
|
||||||
let el = function( e ) {
|
let el = function( e ) {
|
||||||
console.info("Changed", e);
|
console.info("Changed", e);
|
||||||
let parts = e.srcElement.name.split( '-' );
|
let parts = e.target.name.split( '-' );
|
||||||
let field = parts.pop();
|
let field = parts.pop();
|
||||||
let id = parts.join('-');
|
let id = parts.join('-');
|
||||||
let node = graph.getNodeById( id );
|
let node = graph.getNodeById( id );
|
||||||
let path = field.split( '.' ); // use vars.test to set ['vars']['test'] = value
|
let path = field.split( '.' ); // use vars.test to set ['vars']['test'] = value
|
||||||
var res = node;
|
var res = node;
|
||||||
let value = e.srcElement.value
|
let value = e.target.value
|
||||||
if(e.srcElement.type == 'checkbox') {
|
if(e.target.type == 'checkbox') {
|
||||||
value = e.srcElement.checked;
|
value = e.target.checked;
|
||||||
}
|
}
|
||||||
for ( var i = 0; i < path.length; i++ ) {
|
for ( var i = 0; i < path.length; i++ ) {
|
||||||
if ( i == ( path.length - 1 ) ) {
|
if ( i == ( path.length - 1 ) ) {
|
||||||
|
|
Loading…
Reference in a new issue