Обратный вызов Python Sounddevice time.inputBufferAdcTime возвращает 0 - PullRequest
0 голосов
/ 11 сентября 2018

Моя конечная цель - одновременно вывести wav-файл и записать его на микрофон, а затем отобразить их на графике. Это не требует низкой задержки, но требует, чтобы два графика были наложены таким образом, чтобы они правильно отображали то, что происходит в режиме реального времени. Если я подключу линию микрофона к линии громкоговорителей, графики должны располагаться друг относительно друга относительно хорошо.

вывод поверх графика ввода

Так как, похоже, существует некоторая задержка, мое решение - использовать переменную времени, заданную обратным вызовом. Это должно позволить мне соответствующим образом сместить график при настройке его на задержку. Я получаю соответствующие значения времени ЦАП и текущего времени, но время АЦП дает мне 0.

def callback(indata, outdata, frames, time, status):
print "ADC time: ", time.inputBufferAdcTime
print "DAC time: ", time.outputBufferDacTime
print "curr time: ", time.currentTime
print "time diff: ", time.outputBufferDacTime - time.currentTime
print "###############"
if status:
    print(status)
if len(data[callback.index:]) < frames:
    outdata[:len(data[callback.index:])] = data[callback.index:]
    outdata[len(data[callback.index:]):] = np.zeros(
        ((len(outdata) - len(data[callback.index:])), len(args.channels)))
    raise sd.CallbackStop
else:
    outdata[:] = data[callback.index:callback.index + frames]
q_out.put(outdata[::args.downsample, mapping])
q_in.put(indata[::args.downsample, mapping])

callback.index += frames

1 Ответ

0 голосов
/ 12 сентября 2018

Если inputBufferAdcTime дает вам 0, это проблема PortAudio. Скорее всего, это зависит от используемого вами хост-API и, вероятно, от вашего оборудования и драйверов. Вы должны спросить в списке рассылки PortAudio (http://portaudio.com/contacts.html), хотите ли вы узнать больше об этом.

Или вы можете попробовать другой хост-API, он может работать лучше.

Вы также можете попытаться запросить атрибут latency объекта потока, но у него может быть та же проблема.

Наконец, если вы не можете получить правильную задержку таким образом, вы можете просто измерить задержку самостоятельно. Просто подключите кабель от выхода вашей звуковой карты к входу, воспроизведите тестовый сигнал и запишите результат (как вы делали это в своем примере кода). Вы сможете найти значение задержки, сравнив два сигнала.

...