Гитарный петлитель Raspberry Pi - кнопка запускает запись звука, пока не будет нажата снова - PullRequest
0 голосов
/ 03 апреля 2020

Я очень сильно почесал голову и действительно застрял в этом.

Я хочу использовать 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

Может кто-нибудь подсказать мне, как это сделать, или, может быть, какие-то концепции, которые я мог бы реализовать, например, многопоточность, которая может быть полезна для этих задач.

Бесконечно благодарен !

...