I am currently playing around with the python library sounddevice. Now I have the problem that with the following implementation the sound sounds choppy, as if there was an underflow or clipping. Here is my code:
from queue import Queue
class Buffer:
def __init__(self):
self.q = Queue()
def get_q(self):
return self.q
from audio.buffer.buffer import Buffer
import sounddevice as sd
class Input:
def __init__(self, input_device):
self.input_device = input_device
self.device_settings = sd.query_devices(input_device)
self.input_stream = sd.InputStream(device=input_device, callback=self.read_data, blocksize=32768, dtype="int16")
self.buffer = Buffer()
def read_data(self, indata, frames, time, status):
if status:
print(status, flush=True)
print(f"indata: {indata}")
self.buffer.get_q().put(indata)
def start_stream(self):
self.input_stream.start()
def stop_stream(self):
self.input_stream.stop()
import sounddevice as sd
class Output:
def __init__(self, output_device):
self.output_device = output_device
self.device_settings = sd.query_devices(output_device)
self.input_stream = sd.OutputStream(device=output_device, callback=self.write_data, blocksize=32768, dtype="int16")
self.output_buffer = None
def write_data(self, outdata, frames, time, status):
if status:
print(status, flush=True)
q = self.output_buffer.get_q()
if q.empty():
print("Q empty", flush=True)
else:
data = q.get_nowait()
print(f"outdata: {data}")
outdata[:] = data
def start_stream(self, output_buffer):
self.output_buffer = output_buffer
self.input_stream.start()
def stop_stream(self):
self.input_stream.stop()
self.output_buffer = None
from audio.input.input import Input
from audio.output.output import Output
import sounddevice as sd
input1 = Input(2)
output1 = Output(2)
input1.start_stream()
output1.start_stream(input1.buffer)
Debug output:
indata: [[ 0 0]
[ 0 0]
[ 0 0]
...
[-2 -3]
[-3 -5]
[-5 -6]]
outdata: [[-2 -3]
[ 2 3]
[ 3 3]
...
[-2 -3]
[-3 -5]
[-5 -6]]
indata: [[-2 -3]
[ 2 3]
[ 3 3]
...
[ 2 2]
[ 1 0]
[ 0 1]]
outdata: [[ 1 2]
[-1 -1]
[-6 -7]
...
[ 2 2]
[ 1 0]
[ 0 1]]
Q empty
indata: [[ 1 2]
[-1 -1]
[-6 -7]
...
[ 2 3]
[ 1 2]
[ 3 4]]
indata: [[ 1 2]
[ 3 4]
[ 2 1]
...
[-3 -2]
[-3 -2]
[ 0 0]]
outdata: [[-3 -3]
[-7 -6]
[-4 -4]
...
[-3 -2]
[-3 -2]
[ 0 0]]
indata: [[-3 -3]
[-7 -6]
[-4 -4]
...
[ 4 5]
[ 4 6]
[ 4 4]]
outdata: [[6 6]
[3 4]
[5 5]
...
[4 5]
[4 6]
[4 4]]
outdata: [[6 6]
[3 4]
[5 5]
...
[4 5]
[4 6]
[4 4]]
indata: [[ 6 6]
[ 3 4]
[ 5 5]
...
[-5 -5]
[-5 -4]
[-4 -3]]
indata: [[ -5 -4]
[ 2 2]
[ -2 -2]
...
[-4256 -3531]
[-3562 -270]
[-5817 -2898]]
outdata: [[-6996 -4607]
[-4653 -2403]
[ -950 288]
...
[-4256 -3531]
[-3562 -270]
[-5817 -2898]]
outdata: [[-6996 -4607]
[-4653 -2403]
[ -950 288]
...
[-4256 -3531]
[-3562 -270]
[-5817 -2898]]
indata: [[-6996 -4607]
[-4653 -2403]
[ -950 288]
...
[22415 20869]
[22785 20992]
[22681 20857]]
indata: [[ 22843 20948]
[ 23259 21106]
[ 23064 20686]
...
[-32411 -24239]
[-32322 -22860]
[-32252 -21027]]
outdata: [[-32166 -19012]
[-32095 -17178]
[-32006 -15459]
...
[-32411 -24239]
[-32322 -22860]
[-32252 -21027]]
outdata: [[-32166 -19012]
[-32095 -17178]
[-32006 -15459]
...
[-32411 -24239]
[-32322 -22860]
[-32252 -21027]]
indata: [[-32166 -19012]
[-32095 -17178]
[-32006 -15459]
...
[ -3367 451]
[ -4995 -3081]
[ -6701 -6331]]
indata: [[ -6691 -8941]
[ -6266 -10015]
[ -5759 -10552]
...
[ 14335 13256]
[ 13517 12118]
[ 12756 11777]]
outdata: [[12683 11770]
[12776 11501]
[12607 11241]
...
[14335 13256]
[13517 12118]
[12756 11777]]
indata: [[12683 11770]
[12776 11501]
[12607 11241]
...
[-1871 -1134]
[-2522 -886]
[-3541 -801]]
outdata: [[-4660 -635]
[-6320 -998]
[-7844 -2366]
...
[-1871 -1134]
[-2522 -886]
[-3541 -801]]
outdata: [[-4660 -635]
[-6320 -998]
[-7844 -2366]
...
[-1871 -1134]
[-2522 -886]
[-3541 -801]]
indata: [[-4660 -635]
[-6320 -998]
[-7844 -2366]
...
[-6790 2150]
[-7303 2614]
[-7760 3178]]
indata: [[-8136 3854]
[-8446 4600]
[-8715 5383]
...
[ 973 376]
[ 941 372]
[ 914 364]]
outdata: [[883 355]
[853 347]
[821 333]
...
[973 376]
[941 372]
[914 364]]
outdata: [[883 355]
[853 347]
[821 333]
...
[973 376]
[941 372]
[914 364]]
indata: [[ 883 355]
[ 853 347]
[ 821 333]
...
[ -3 -1137]
[ 4 -1142]
[ 17 -1152]]
indata: [[ 29 -1150]
[ 37 -1146]
[ 45 -1143]
...
[ 3967 -2368]
[ 4042 -2401]
[ 4111 -2441]]
outdata: [[ 4185 -2471]
[ 4262 -2500]
[ 4338 -2524]
...
[ 3967 -2368]
[ 4042 -2401]
[ 4111 -2441]]
outdata: [[ 4185 -2471]
[ 4262 -2500]
[ 4338 -2524]
...
[ 3967 -2368]
[ 4042 -2401]
[ 4111 -2441]]
indata: [[ 4185 -2471]
[ 4262 -2500]
[ 4338 -2524]
...
[ 6557 8529]
[ 6581 8635]
[ 6606 8742]]
indata: [[ 6628 8840]
[ 6656 8941]
[ 6689 9039]
...
[14234 11089]
[14141 11118]
[14049 11147]]
outdata: [[13961 11176]
[13878 11204]
[13798 11231]
...
[14234 11089]
[14141 11118]
[14049 11147]]
outdata: [[13961 11176]
[13878 11204]
[13798 11231]
...
[14234 11089]
[14141 11118]
[14049 11147]]
indata: [[13961 11176]
[13878 11204]
[13798 11231]
...
[ 3 3]
[ 4 2]
[ 4 2]]
indata: [[ 2 1]
[-1 -2]
[-4 -5]
...
[-4 -4]
[-9 -8]
[-6 -7]]
outdata: [[-6 -7]
[-7 -8]
[-4 -6]
...
[-4 -4]
[-9 -8]
[-6 -7]]
indata: [[-6 -7]
[-7 -8]
[-4 -6]
...
[ 3 3]
[ 3 3]
[ 3 4]]
outdata: [[3 3]
[3 4]
[3 3]
...
[3 3]
[3 3]
[3 4]]
outdata: [[3 3]
[3 4]
[3 3]
...
[3 3]
[3 3]
[3 4]]
indata: [[ 3 3]
[ 3 4]
[ 3 3]
...
[ 0 0]
[ 4 4]
[-1 -1]]
indata: [[-2 -1]
[-6 -5]
[-1 0]
...
[ 1 2]
[ 3 4]
[ 3 2]]
outdata: [[2 2]
[3 3]
[3 3]
...
[1 2]
[3 4]
[3 2]]
outdata: [[2 2]
[3 3]
[3 3]
...
[1 2]
[3 4]
[3 2]]
indata: [[ 2 2]
[ 3 3]
[ 3 3]
...
[-6 -7]
[-4 -4]
[-2 -2]]
indata: [[1 0]
[2 1]
[3 2]
...
[2 4]
[2 2]
[3 3]]
outdata: [[-2 -1]
[-3 -3]
[-4 -3]
...
[ 2 4]
[ 2 2]
[ 3 3]]
outdata: [[-2 -1]
[-3 -3]
[-4 -3]
...
[ 2 4]
[ 2 2]
[ 3 3]]
indata: [[-2 -1]
[-3 -3]
[-4 -3]
...
[ 1 3]
[ 2 2]
[ 1 1]]
indata: [[ 2 2]
[ 3 3]
[ 2 2]
...
[-2 -2]
[ 0 1]
[-3 -2]]
outdata: [[-4 -3]
[-1 -2]
[-6 -5]
...
[-2 -2]
[ 0 1]
[-3 -2]]
indata: [[-4 -3]
[-1 -2]
[-6 -5]
...
[ 2 2]
[ 1 1]
[ 1 1]]
These repetitions on the outdata is what i mean with the choppy sound.
I have already tried the following: checked for underflow, checked for clipping, checked for cpu utilisation, checked for suitable samplerates. With the Input to Output Pass-Through example from the sounddevice documentation the whole thing works without any problems.
I just solved my issue with: