-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrt_signal_extra.py
41 lines (33 loc) · 1.22 KB
/
rt_signal_extra.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
import threading
from rt_signal.nodes import BaseNode, Buffer
class Recorder(BaseNode):
def __init__(self, block_size):
super().__init__()
self.defineInputs(["audio"])
self.block_size = block_size
self.recording_done = threading.Condition()
self.thread = threading.Thread(target=self._threadLoop)
self.record_count = 0
self.buffer = Buffer()
def work(self, sample_count):
samples = self.inputs["audio"].read(sample_count)
if self.record_count > 0:
trimmed = samples[:self.record_count]
self.buffer.write(trimmed)
self.record_count -= len(trimmed)
if self.record_count == 0:
self.recording_done.acquire()
self.recording_done.notify()
self.recording_done.release()
def _threadLoop(self):
while True:
self.work(self.block_size)
def start(self):
self.thread.start()
def record(self, sample_count):
self.recording_done.acquire()
self.record_count = sample_count
self.recording_done.wait()
samples = self.buffer.read(sample_count)
self.recording_done.release()
return samples