【发布时间】:2018-03-08 10:15:24
【问题描述】:
尝试使用 Python 子进程在 Raspberry Pi 上播放音频并在按下 GPIO 连接按钮时终止子进程。
我遇到的问题是,当播放文件之间存在子进程 Popen.wait() 命令时,子进程不会终止。如果只有一个文件要播放,则无需等待它完成,并且 p.kill() 命令可以正常工作。一旦插入 p.wait() 以使文件不会相互重叠播放,Popen.kill() 就不再起作用。
已经尝试在中使用 os.kill() Kill a running subprocess call。找不到关于子进程在 Popen.wait() 下的行为方式的任何其他资源。我正在寻找一种方法来强制下面代码中的 aplay 函数在第二个代码 sn-p 中的三个 play_wav 命令期间随时关闭按钮按下,而不是只有一个 play_wav 命令。
这是利用 subprocess.Popen() 的 play_wav 函数:
# play wav file on the attached system sound device
def play_wav(wav_filename):
global p
msg = "playing " + wav_filename
logger.debug(msg)
p = subprocess.Popen(
['aplay','-i','-D','plughw:1', wav_filename],
stdin = subprocess.PIPE,
stdout = subprocess.PIPE,
stderr = subprocess.STDOUT,
shell = False
)
下面是调用 play_wav 函数的 sn-p 代码:
# determine what to do when a button is pressed
def button_pressed(channel):
global MENU
btnval = readadc(0, SPICLK, SPIMOSI, SPIMISO, SPICS) # check value of ADC
if btnval > 980: # 1
if p.poll() == None:
p.kill()
if MENU == 1:
play_wav("/media/pi/WONDERPHONE/prompts/en/Menu1.wav")
p.wait()
play_wav("/media/pi/WONDERPHONE/stories/1/PersonalStory.wav")
p.wait()
play_wav("/media/pi/WONDERPHONE/prompts/en/returntomain.wav")
我如何检查按钮按下:
GPIO.add_event_detect(PRESSED, GPIO.RISING, callback=button_pressed, bouncetime=500) # look for button presses
【问题讨论】:
标签: python subprocess gpio alsa