def audio_callback(binsim):
""" Wrapper for callback to hand over custom data """
assert isinstance(binsim, BinSim)
# The pyAudio Callback
def callback(in_data, frame_count, time_info, status):
# print("pyAudio callback")
current_soundfile_list = binsim.oscReceiver.get_sound_file_list()
if current_soundfile_list:
binsim.soundHandler.request_new_sound_file(current_soundfile_list)
# Get sound block. At least one convolver should exist
binsim.block[:binsim.soundHandler.get_sound_channels(), :] = binsim.soundHandler.buffer_read()
# Update Filters and run each convolver with the current block
for n in range(binsim.soundHandler.get_sound_channels()):
# Get new Filter
if binsim.oscReceiver.is_filter_update_necessary(n):
# print('Updating Filter')
filterValueList = binsim.oscReceiver.get_current_values(n)
filter = binsim.filterStorage.get_filter(Pose.from_filterValueList(filterValueList))
binsim.convolvers[n].setIR(filter, callback.config.get('enableCrossfading'))
left, right = binsim.convolvers[n].process(binsim.block[n, :])
# Sum results from all convolvers
if n == 0:
binsim.result[:, 0] = left
binsim.result[:, 1] = right
else:
binsim.result[:, 0] += left
binsim.result[:, 1] += right
# Finally apply Headphone Filter
if callback.config.get('useHeadphoneFilter') == 'True':
binsim.result[:, 0], binsim.result[:, 1] = binsim.convolverHP.process(binsim.result)
# Scale data
binsim.result *= 1 / float((callback.config.get('maxChannels') + 1) * 2)
binsim.result *= callback.config.get('loudnessFactor')
# When the last block is small than the blockSize, this is probably the end of the file.
# Call pyaudio to stop after this frame
if binsim.block.size < callback.config.get('blockSize'):
pyaudio.paContinue = 1
return (binsim.result[:frame_count].tostring(), pyaudio.paContinue)
callback.config = binsim.config
return callback
评论列表
文章目录