Я очень сильно почесал голову и действительно застрял в этом.
Я хочу использовать Raspberry Pi 3, чтобы подражать поведению гитарного петлителя. Петлитель - это устройство, позволяющее записывать и воспроизводить звук oop. Кнопка pu sh запускает запись, и эта же кнопка нажимается, чтобы остановить запись и запустить l oop. Я хочу реализовать следующие функции:
- Одна кнопка pu sh запускает запись и останавливает ее.
- После зацикливания звука, если кнопка нажимается дважды, останавливает зацикленное аудио
- Если кнопка будет нажата более 2 секунд, запись будет удалена.
Меня не особо волнует реальное время, так как это больше о проверке концепции.
У меня есть следующий код (я полагаю, довольно неэффективно), позволяющий мне запускать и останавливать запись. Однако, когда запись останавливается, программа заканчивается здесь и не выходит из l oop, позволяя выполнить другую запись.
import RPi.GPIO as GPIO
import time
import os
#variables:
GPIO.setmode(GPIO.BOARD)
pin = 10 #GPIO pins of each button
recordBool = False #True if a record is in progress
def button_callback(channel):
os.system("pkill -9 arecord")
print("Recording finished")
GPIO.remove_event_detect(10)
#Play audio#
GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)#sets Pi's internal resistors to pull-up
try:
while True:
butPressed = GPIO.input(10)#checks if a button is pressed
if butPressed == 0:#if a button is pressed
previousTime = time.time()
while butPressed == 0 and recordBool == False:
butPressed = GPIO.input(pin)
if time.time() - previousTime > 2: #Not working
os.remove("%d.wav")
print("Audio deleted")
if not time.time() - previousTime > 2:#if the button is pressed for more than a second, then recordBool is True
recordBool = True
if recordBool == True:#if recordBool is True, it plays a beep sound and then records
print("Recording")
os.system("arecord %d.wav -D sysdefault:CARD=1 -f cd &")#records for maximum 20 seconds in file i.wav, with cd quality
if butPressed == 0:
time.sleep(1)
butPressed = GPIO.input(pin)
GPIO.add_event_detect(10, GPIO.FALLING, callback=button_callback, bouncetime=300) #callback funtion stopping recording
finally:
GPIO.cleanup()
Я смотрел на это без реального успеха при реализации решений : https://www.raspberrypi.org/forums/viewtopic.php?t=155882
Может кто-нибудь подсказать мне, как это сделать, или, может быть, какие-то концепции, которые я мог бы реализовать, например, многопоточность, которая может быть полезна для этих задач.
Бесконечно благодарен !