我一般对python和代码都很陌生,所以请多多包涵。
我有一些代码可以运行并播放文件列表(例如,在itunes播放列表中)。我需要能够通过切换发送的按钮/变量来停止并重新开始循环来自touchosc。
该循环将触发并正常运行,但是如果不点击ctrl-c,我将无法使其停止。问题似乎是,当循环运行时,我的程序将不会使用新值更新“ loop”变量,以便在将其更改为0时停止该进程。使它工作的方法。这些包括while循环和线程化(超出我的范围)。如果有人能指出我正确的方向,将不胜感激!另外请原谅我的hacky代码-r,s,sp和sr标志主要用于程序的另一部分正常工作,因此我可以确保在录制或触发不同的播放文件时杀死进程,以避免重载CPU,如果我要同时记录到同一文件并从同一文件播放,也要避免反馈。如果您有关于如何使这种感觉更好的指示,但我真的只想立即解决主要问题。
代码如下:
from OSC import OSCServer,OSCClient, OSCMessage
import sys
from time import sleep
import time
import types
import os
import subprocess
server = OSCServer( ("10.1.1.143", 7002) )#This has to be the IP of the RaspberryPi on the network
client = OSCClient()
r = None
p = None
sr = 0
sp = 0
loop = 0
def playall(path, tags, args, source):
global sp
global p
global sr
global r
global loop
loop = int(args[0])
if loop == 1:
print "Play on Loop";
for x in range(1,10):
i = ""
i = str(x)
print "Loop Duration", loop;
if sp == 0:
if sr == 0:
p = subprocess.Popen(['ola_recorder', '-p', i, '-i 0'], stdout=subprocess.PIPE)
sp = 1
else:
r.kill()
p = subprocess.Popen(['ola_recorder', '-p', i, '-i 0'], stdout=subprocess.PIPE)
sp = 1
sr = 0
else:
if sr == 0:
p.kill()
p = subprocess.Popen(['ola_recorder', '-p', i, '-i 0'], stdout=subprocess.PIPE)
sp = 1
else:
p.kill()
r.kill()
p = subprocess.Popen(['ola_recorder', '-p', i, '-i 0'], stdout=subprocess.PIPE)
sp = 1
sr = 0
time.sleep(5)
if loop == 0:
break
server.addMsgHandler("/3/playall", playall)
while True:
server.handle_request()
server.close()