-
Notifications
You must be signed in to change notification settings - Fork 0
/
soundboard.py
89 lines (72 loc) · 2.72 KB
/
soundboard.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import vlc, os, time
from threading import Thread
from mutagen.mp3 import MP3
import RPi.GPIO as GPIO
from random import shuffle
from queue import Queue
class SoundBoardButton():
def __init__(self, GPIO_Pin:int):
# create audio player
self.player:vlc.MediaPlayer = vlc.MediaPlayer()
# create lists and queues
self.soundqueue = Queue()
self.soundlist = []
# store pin value
self.GPIO_Pin = GPIO_Pin
# setup pin
GPIO.setmode(GPIO.BCM)
GPIO.setup(self.GPIO_Pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.add_event_detect(self.GPIO_Pin, GPIO.RISING, callback=self.play_callback, bouncetime=2000)
# enqueue sounds
self.fill_queue()
def fill_queue(self):
self.soundlist = []
ready_sound:str = ''
working_dir:str = os.path.dirname(__file__)
# look for mp3 files
for path, subdirs, files in os.walk(working_dir):
for name in files:
filePath:str = os.path.join(path, name)
if '.mp3' in filePath:
if 'oou' in filePath: # set ready sound if found
ready_sound = filePath
self.soundlist.append(filePath)
shuffle(self.soundlist) # shuffle sounds
for sound in self.soundlist:
self.soundqueue.put(sound) # enqueue sounds
print(self.soundlist)
# play sound so we know the soundboard is ready
self.play_sound(ready_sound)
self.play_sound(ready_sound)
def play_sound(self, sound:str):
print(f'playing {sound}')
# setup sound
sound_length = MP3(sound).info.length
self.player = vlc.MediaPlayer(sound)
self.player.audio_set_volume(100)
# play sound
self.player.play()
# wait for sound to finish
time.sleep(sound_length + .5)
# stop when done
self.player.stop()
def play_callback(self, channel:int):
# temporarily disable button presses
GPIO.remove_event_detect(channel)
# fill queue if empty
if self.soundqueue.empty():
self.fill_queue()
# get sound and play
try:
sound:str = self.soundqueue.get_nowait()
self.play_sound(sound)
except:
pass
# re-enable button presses
GPIO.add_event_detect(channel, GPIO.RISING, callback=self.play_callback, bouncetime=2000)
if __name__ == '__main__':
# init object with pin 17 (button)
sb = SoundBoardButton(17)
# sleep loop forever, so button events can happen asynchronously
while True:
time.sleep(1)