|
8 | 8 | blocksize = 0 |
9 | 9 | latency = 'low' |
10 | 10 | samplerate = 48000 |
11 | | -safety = 0.1 # Shouldn't be less than the duration of an audio block |
| 11 | +safety = 0.001 # Increase if Python interpreter is slow |
12 | 12 |
|
13 | | -rb_size = 2**math.ceil(math.log2((delay + safety) * samplerate)) |
| 13 | +rb_size = 2**math.ceil(math.log2(delay * samplerate)) |
14 | 14 |
|
15 | 15 | stream = rtmixer.MixerAndRecorder( |
16 | 16 | channels=channels, blocksize=blocksize, samplerate=samplerate, |
17 | 17 | latency=latency) |
18 | 18 | with stream: |
19 | 19 | samplesize = 4 |
20 | 20 | assert {samplesize} == set(stream.samplesize) |
| 21 | + print(' input latency:', stream.latency[0]) |
| 22 | + print(' output latency:', stream.latency[1]) |
| 23 | + print(' sum:', sum(stream.latency)) |
| 24 | + print('requested delay:', delay) |
21 | 25 | rb = rtmixer.RingBuffer(samplesize * channels, rb_size) |
22 | 26 | start = stream.time + safety |
23 | | - stream.record_ringbuffer(rb, start=start, allow_belated=False) |
24 | | - stream.play_ringbuffer(rb, start=start + delay, allow_belated=False) |
25 | | - # TODO: check if start was successful |
| 27 | + record_action = stream.record_ringbuffer(rb, start=start, |
| 28 | + allow_belated=False) |
| 29 | + play_action = stream.play_ringbuffer(rb, start=start + delay, |
| 30 | + allow_belated=False) |
| 31 | + # Dummy recording to wait until "start" has passed: |
| 32 | + stream.wait(stream.record_buffer(b'', channels=1, start=start)) |
| 33 | + if record_action not in stream.actions: |
| 34 | + if record_action.actual_time == 0: |
| 35 | + raise RuntimeError('Increase "safety"') |
| 36 | + else: |
| 37 | + # TODO: could there be another error? |
| 38 | + raise RuntimeError('Ring buffer overflow (increase "delay"?)') |
| 39 | + # Dummy playback to wait until "start + delay" has passed: |
| 40 | + stream.wait(stream.play_buffer(b'', channels=1, start=start + delay)) |
| 41 | + if play_action not in stream.actions: |
| 42 | + if play_action.actual_time == 0: |
| 43 | + raise RuntimeError('Increase "safety" or "delay"') |
| 44 | + else: |
| 45 | + # TODO: could there be another error? |
| 46 | + raise RuntimeError('Ring buffer underflow (increase "delay"?)') |
26 | 47 | print('#' * 80) |
27 | 48 | print('press Return to quit') |
28 | 49 | print('#' * 80) |
|
0 commit comments