Hi everyone,
oh, sorry, I was very busy working on other stuff and missed some of your discussions.
For our solution, we have two applications running:
- UE with a soundfield submix endpoint and
- a separated application which has control of an ASIO interface with all the required channels (we use 15 loudspeakers at variable locations).
On the UE side we collect the isolated source signals in a soundfield mixer buffer. That mixer buffer is just a set of 25 channels - we use higher order ambisonics, oder 4. It is actually our own mixer in C/C++ code since UE supports only order 1 / 4 channels.
Given the single channel source and the direction we artificially render a HOA signal just for this single source and add it as a contribution to our overall mixer signal. If we have multiple sources, each single signal has a dedicated contribution which becomes part of the overall HOA signal mix.
Then, once all signals have been added to the mixer and we are sure that this is all for this time frame, we take the 25 channels and output towards a UNIX socket we created on our UI PC. This all happened on the UE side so far. There are callbacks for each source and one for the “all sources handled” in UE.
Now, the other side (2): here we run an audio playback thread which reads from a (simple) jitter buffer. The data taken from the jitter buffer are 25 channels of HOA signals. Once we got the HOA signal, we run a HOA decoder involving VBAP, followed by a delay equalization followed by a loudspeaker equalization. We run some measurement routines in the playback environment to store all required information in set of matrices for the decoding for maximum efficiency.
The link between the UE output towards the UNIX socket and the other side audio playback is simple: a specific thread observes the UNIX socket and reads the HOA signal when available. Then, the received audio data is added to the mentioned (simple) jitter buffer.
I was always in doubt how the interaction via the jitter buffer works in realtime: input is clocked by UE and therefore the involved WASAPI soundcard, output is clocked by ASIO. Well, it is absolutely uncritical: I do not see any clockdrifts for long operation times. If there is one I have a clever jitter buffer recovery rule :-).
I hope that helps out. Let me know if I can help you any further.
Best regards