• WANTED: Happy members who like to discuss audio and other topics related to our interest. Desire to learn and share knowledge of science required. There are many reviews of audio hardware and expert members to help answer your questions. Click here to have your audio equipment measured for free!

[FULL TUTORIAL] Dual headphone listening with individual PEQing

Jose Hidalgo

Addicted to Fun and Learning
Joined
Aug 15, 2020
Messages
972
Likes
1,044
Location
France
Hi everybody,

This is a happy follow-up of previous ASR threads like this one. I have some revelations to make. This is the first one :

WE HAVE COMPLETELY SUCCEEDED.
IT HAPPENED NEARLY ONE WEEK AGO
(but I needed some free time to write this).
ASIO4ALL DETECTS BOTH TOPPING USB DACS IN OUR SYSTEM,
AND AGGREGATES THEM INTO A SINGLE 4-CHANNEL VIRTUAL DAC.
THERE ARE NO SYNC ISSUES AT ALL
(see part 8 for technical details).

This schematic is now a delicious reality. I can confirm this after several dual listening sessions with two individually EQed headphones :) :

Audio Signal.png



So how did we do it ? There are some important steps, that I'm putting here for future readers. Because people need to know that THIS CAN BE DONE.
Some people, on ASR and elsewhere, told us that it couldn't be done. That we would run into issues. Well, THEY WERE WRONG. ALL OF THEM.

Here are the detailed steps, feel free to ask questions if that's not detailed enough for you. I hope this is an interesting read for everybody, even if you don't intend to do exactly the same thing. Enjoy ! ;)


1. Get Windows 10

For some unknown reason, ASIO4ALL wouldn't detect our Topping E30 DACs under Windows 7 or Windows 8.1 :

ASIO4ALL rien.png


However, we found out that it was only Windows-related. After moving to Windows 10, we only needed to install ASIO4ALL, without ever installing the Topping drivers. ASIO4ALL is the only thing that's needed, and its developer specifically requests to NOT install manufacturer drivers.

And then, magically...

A4A 512 4.png


Both DACs are detected, and both are activated at the same time (see the blue on/off sign to the left of each DAC). End of story, right ? ;) Well, not yet ! First let's go back to our previous operations.


2. Choose the right EQ option

Our whole purpose being to EQ our headphones individually and simultaneously, we needed to create all the corresponding EQ presets. For that, we needed to choose the right EQ option.

Since ASIO4ALL uses ASIO which is an exclusive bit-perfect audio path between the player and the DACs, completely bypassing Windows audio mixer, we couldn't use popular system-wide EQs like Equalizer APO that use Windows audio mixer. What are the other options ?

Our audio player (foobar2000) allows for several EQ options :
  1. A basic integrated 18-band stereo EQ
  2. A couple of VST Host plug-ins that allow to use any VST plug-in within foobar, including VST PEQs.
  3. A convolution plug-in (Convolver), which also needs a VST PEQ at some point.
Since the basic EQ is not parametric, we discarded option 1.

Option 2 (using a VST PEQ within foobar in real time) would be ideal if the CPU is powerful enough. However, there are a couple of issues :
  • Most VST PEQs on the market are stereo, and here we need a 4-channel PEQ. I have yet to find a free (or not too expensive) 4-channel VST PEQ (so far I've only found expensive pro stuff with lots of functions that we don't need, like FabFilter Pro-Q 3). Any ideas ? ;)
  • Current VST Host plug-ins for foobar2000 (foo_vst and George Yohng's VST Wrapper) are known to not be very stable. It's a bit like the Russian Roulette, lol.
For such reasons, we discarded option 2... for the moment, but we hope to be able to resort to it in the future.

Which leaves us with option 3, which is also the most complicated : convolution. So how does that beast work ? o_O Well, convolution means creating EQ presets in advance (except that we call them "impulse responses" in this case), and feeding the convolution plug-in with them so it can work in real time during playback.

Convolution needs a VST PEQ too at some point, so now we need to choose the right VST PEQ for our needs. But here's the kicker : Convolution only needs a stereo VST PEQ to function. What ? How ? :oops: We'll see that in part 4.


3. Choose the right VST PEQ

With the precious help of a foobar forums member, we measured several PEQs (ffmpeg / KVR QRange with 2 different settings / DDMF IIEQPro). Details are on the link for those who want them.

Measurements showed all PEQs frequency responses to be really close until 5-7 KHz, with some notable differences afterwards (here's an example for the AT M50x) :

ZvgpE7I.png


Spectrogram convinced us that DDMF IIEQPro (preferrably with "AnaPeaks" type filters, see its manual) was the best EQ option here (minimum phase, no pre-echo) :

y66GDeZ.png


DDMF IIEQPro is not free, but its price is very reasonable. The site seems to be down at the moment though.
If you want a free alternative, just pick KVR QRange and set it to "minimum phase".


4. Create EQ presets (part 1 - audio editor)

First we need an audio editor (in our case Audacity which is free), and the VST PEQ we just choosed (IIEQ Pro).
Since Audacity supports VSTs, we only had to install IIEQPro as an Audacity VST plug-in, and then use it within Audacity.

In our case we have 2 DACs and 3 headphones to EQ (in alphabetical order : Audioquest Nighthawk Carbon aka "1", Hifiman Sundara aka "2", Sennheiser HD600 aka "3"). That leaves all these possibilities :
  • 00 : no EQ at all
  • 12 : Nighthawk EQ on DAC 1, Sundara EQ on DAC 2
  • 13 : Nighthawk EQ on DAC 1, HD600 EQ on DAC 2
  • 21 : Sundara EQ on DAC 1, Nighthawk EQ on DAC 2
  • 23 : Sundara EQ on DAC 1, HD600 EQ on DAC 2
  • 31 : HD600 EQ on DAC 1, Nighthawk EQ on DAC 2
  • 32 : HD600 EQ on DAC 1, Sundara EQ on DAC 2
So we need to create all the corresponding EQ presets. How ?
  1. Create a basic 44100 Hz 4-channel impulse within Audacity. It's basically a 4-channel waveform that consists of 4096 samples of silence. Then with the pencil retouching tool, create a basic 1-sample impulse located right in the middle, at sample #2048 :

    2020.12.15 - 14.30.13.png


  2. Once that's ready, just save it as a multichannel wav (caution : format has to be 32-bit float, unless your player/convolver doesn't support 32-bit files which would be a shame). For example "Basic Impulse.wav".
    Then we are going to use that basic impulse to create all our EQ presets or "impulse responses".

  3. Select two of the four channels to be EQed (in this case channels 1-2, see how they're highlighted)
  4. Launch the PEQ VST (IIEQPro) within Audacity via the "Effects" menu
  5. The first time we launch the PEQ VST, we take the time to create all the needed PEQ presets by copying the tables from Oratory, InnerFidelity, etc., and saving them as IIEQPro presets. That doesn't take very long.
  6. Load one of the IIEQPro presets that we have just created (here for example the latest HD600 Oratory preset)...

    2020.12.15 - 14.48.13.png


  7. ... and apply it once to the two channels that we've previously selected. See the difference ? It looks minor, but everything is there :

    2020.12.15 - 14.48.36.png


  8. Select channels 3-4, and repeat the operation with a different PEQ preset.

  9. When all 4 channels have been EQed, just save this "impulse response", always as wav 32-bit float, naming it appropriately (in our case we named our presets like previously said : 12.wav, 13.wav, 21.wav, 23.wav, 31.wav, 32.wav).
Important : all these steps (1 to 9) are valid for ONE samplerate, in this case 44100 Hz (which accounts for nearly 99% of our tracks). If you have other samplerates in your collection (ex : 192 KHz tracks too), you will have to repeat all these steps for every samplerate ! (I know, that makes a lot of waveforms, but hopefully you will only have to do it once). For every new waveform, make sure that setting the right samplerate is the FIRST THING YOU DO right after you launch Audacity, before creating the basic impulse (you can set it easily in the lower left corner, see screenshots).
You will also have to use a Dynamic DSP plug-in such as foobar2000's Dynamic DSP (
v1 is compatible with foobar 1.6 and is sufficient in our case, v2 isn't yet). Here's a Dynamic DSP silent video tutorial (made for a different use but you'll get the idea).


5. Create EQ presets (part 2 - music player)

Now within the music player, we need to create the corresponding DSP presets.

For foobar2000, we use the built-in DSP Manager :
  1. Add "Convert stereo to 4 channels" to the audio chain (lossless duplication, see our schematic)
  2. Add a "Convolver" instance.
  3. Edit the Convolver instance (click on the three dots), and load one of the corresponding "impulse response" files that we have previously created with Audacity. Don't forget to UNCHECK "Auto level adjust".

    foobar DSP Manager.png


  4. Just name the DSP preset accordingly ("2-3" in our screenshot) and click on "Save" to save it within the DSP Manager.
  5. Repeat the operation for all other EQ presets. We're nearly there !
(if you need it, here's a nice Convolver silent video tutorial, made for a different use, but you can see how it works)


6. ASIO setup in the music player
  1. Download and install ASIO support for foobar2000
  2. Go to foobar2000 preferences ( File > Preferences > Playback > Output > ASIO) and check that ASIO4ALL is detected (BTW also make sure that you CHECK "Use 64-bit ASIO drivers" and "Run with high process priority") :

    foobar ASIO 1.png


    Note that if you double-click on "ASIO4ALL v2" you can get the ASIO4ALL control panel that we showed earlier in part 1. ;)

  3. Add a new custom channel mapping in order to send channels 1-2 to DAC #1, and channels 3-4 to DAC #2 :

    foobar ASIO 2 - Mappings.png


    Note that under foobar2000, channels are named "Left, Right, Center, LFE, etc." instead of "1, 2, 3, 4, etc.". It's not a problem.

  4. Go to Preferences > Playback > Output and select as "Device" the name of the custom channel mapping that we have just created :

    foobar Output.png

7. ASIO4ALL setup for 44100 Hz

Everything was ready and we were full of hope, so we tried playing some music on both connected headphones.
  • Good news : both headphones worked simultaneously.
  • Bad news : there were lots of artifacts, like "Tac-tac-tac-tac-tac" lots of times per second. It was terrible ! :eek:
Thankfully the solution was easy : increase ASIO4ALL buffers size from 512 samples to the max (2048) :

A4A 2048 4.png


Important : don't forget to do that for each of the DACs, as they have individual ASIO buffers !

We listened again, and... TA-DAAAAA ! It finally worked beautifully !!! :D:D:D


8. What about sync issues ?

Many people here and elsewhere, including the one and only @JohnYang1997 , told us that there would be sync issues, because of the lack of a master clock. Seems obvious. We were told that the DACs would slowly drift apart (some samples per second, if we were lucky), and that ultimately the drifting would cause issues (audio glitches for instance).

Well, THAT DIDN'T HAPPEN AT ALL. Allow me to explain.

ASIO4ALL has a user manual. Here's what it says on page 5/11 :

" Multi-device-setups require that all the devices involved are running from the same clock source. You can achieve this by daisy-chaining devices via S/PDIF etc. Fortunately, most USB devices will automatically synchronize themselves for as long as the host controllers they are connected to have a common clock source, which is trivially true for the USB host controllers embedded in the south bridge on any mainboard. "

In other words, there won't be any sync issues for most USB devices, like Topping E30 DACs. Problem solved guys ! :cool:

We have tested this extensively already, including playing long pieces of classical music (15 minutes of continuous play). The DACs don't drift apart in any noticeable way. There are no audio glitches at all, no sync issues at all, and we both finish listening at the exact same time. It's really a wonderful experience ! :D

So let me say this once and for all :
  • YES, we can aggregate several USB DACs with ASIO4ALL and Windows 10, and use them as a single multi-channel virtual DAC
  • NO, there are no sync issues at all for Hi-Fi purposes (it would of course be different for studio purposes where latency is critical)
It just works. End of story.


9. ASIO4ALL setup for higher samplerates

Now that everything worked fine for 99% of our audio files (44100 Hz), I wanted to make sure that it worked too for those 1% of hi-res files (88.2 / 96 / 176.4 / 192 KHz and beyond). So I selected a 192 KHz file, with no EQ to begin with, and I played it on both headphones.

Again, there were those horrendous audio artifacts ("Tac-tac-tac-tac-tac"). But this time the ASIO4ALL buffers were already at 2048 samples. So what could we do ? :eek:

Once again, the solution was easy (but you need to know that it exists) : increase ASIO4ALL Buffer offsets from 4ms to 10ms (the max being 20ms) :

A4A 2048 10.png


Important : like said before, don't forget to do this for each of the connected DACs.

... and voilà ! This is it guys : even 192 KHz audio files played perfectly, with no glitches nor delays. All our wishes were granted. :D
For the record, it worked too with EQ. We just needed to create the corresponding EQ presets with the relevant samplerates, and use Dynamic DSP to have foobar automatically switch between them depending on the samplerate. Yes, it's a bit tedious. But you only have to do it once.


10. Conclusion

There's no real conclusion here. Just a mere testimony that IT WORKS. IT ABSOLUTELY WORKS. IT'S STABLE, IT'S BEAUTIFUL, AND ANYBODY CAN DO IT.
I'm just a "perpetual beginner" in the audio world, but I'm very commited.
So if it can be done, I probably can find a way to do it.
And if I can do it, I guarantee that so can you.

I'll just finish with these words :

" He didn't know that it was impossible. And that's precisely why he succeeded at it. "

Or in my own words (right @raif71 ? ;)) : NEVER GIVE UP !!!:cool::cool::cool:

Have a great day everyone ! ;)

*goes back to listening*
 
Last edited:
This is a great post overall! But regarding this point:

8. What about sync issues ?

Many people here and elsewhere, including the one and only @JohnYang1997 , told us that there would be sync issues, because of the lack of a master clock. Seems obvious. We were told that the DACs would slowly drift apart (some samples per second, if we were lucky), and that ultimately the drifting would cause issues (audio glitches for instance).

Well, THAT DIDN'T HAPPEN AT ALL. Allow me to explain.

ASIO4ALL has a user manual. Here's what it says on page 5/11 :

" Multi-device-setups require that all the devices involved are running from the same clock source. You can achieve this by daisy-chaining devices via S/PDIF etc. Fortunately, most USB devices will automatically synchronize themselves for as long as the host controllers they are connected to have a common clock source, which is trivially true for the USB host controllers embedded in the south bridge on any mainboard. "

In other words, there won't be any sync issues for most USB devices, like Topping E30 DACs. Problem solved guys ! :cool:

We have tested this extensively already, including playing long pieces of classical music (15 minutes of continuous play). The DACs don't drift apart in any noticeable way. There are no audio glitches at all, no sync issues at all, and we both finish listening at the exact same time. It's really a wonderful experience ! :D

So let me say this once and for all :
  • YES, we can aggregate several USB DACs with ASIO4ALL and Windows 10, and use them as a single multi-channel virtual DAC
  • NO, there are no sync issues at all for Hi-Fi purposes (it would of course be different for studio purposes where latency is critical)
It just works. End of story.

The point made in the ASIO4ALL manual is false with respect to asynchronous DACs like the E30. There is no automatic synchronization. It's not a difference of opinion; it's just false.

The real reason that you're not getting sync issues is likely because the E30 clocks are high enough quality and similar enough that there isn't a lot of mutual drift (they're both E30s after all).
 
This is a great post overall! But regarding this point:

The point made in the ASIO4ALL manual is false with respect to asynchronous DACs like the E30. There is no automatic synchronization. It's not a difference of opinion; it's just false.

The real reason that you're not getting sync issues is likely because the E30 clocks are high enough quality and similar enough that there isn't a lot of mutual drift (they're both E30s after all).
[Just kidding] Come on buddy, just enjoy the post and don't rain on my parade :p [/Just kidding] OK, not being an expert I don't know what to think here. I would say that is a claim to be directed directly towards ASIO4ALL's developer, Michael Tippach. He's an expert and he claims one thing in his user manual. You claim another thing, and that's great. I don't mind at all.

Plus assuming that you are right in theory, would it matter in the real world ? AFAIK I'm the first one to try and achieve this with Topping devices. Lucky me ! ;) As a final user, I can only testify that it works perfectly (better than I expected actually) with the two E30s, even on long pieces of music, which is more than enough for our needs. We have hours of listening sessions behind us now, with not a single issue. Plus pressing "stop/pause" at the end of each song (which foobar2000 can even do automatically) resets the audio stream and the hypothetical drift, so that's more than OK for us.

So, were we really lucky with our two units, or would this work for just about any two units ? Maybe all Topping DACs have great clocks. Or maybe the theoretical sync issue isn't really an issue for Hi-Fi purposes, whereas it certainly is an issue for studio purposes. I don't know. And honestly, after all the research hoping to achieve this, I just want to enjoy music so I don't really care anymore. :p

For science purposes I can perform further testing, by letting the system run continuously for one or two hours (or even more), and then see if there's any noticeable delay or glitches. But if nothing happens, we'll just have to assume that it works.


poissons.gif
 
Last edited:
The manual suggests that ASIO4ALL doesn't do any clock drift compensation, unlike Jack, which uses resampling. So ASIO4ALL is intended for cases where drift stays small or non-existent.
 
Well. XMOS is asynchronous. So all XMOS devices don't fall into the "most devices" categories. In real world use cases, after some time it will slowly drift away then at some point there will be a glitch and they will be synced again. Problem is how much drift there is and whether you will notice it or not. There are some dongles with large phase difference between left and right but people still loving them. You can do this of course. And in your cases it's not for crossover so it's completely fine.
 
Forgot to mention. The best replacement for your current features is to use rca splitter. This could have largely simplified your setup and avoid this issue from the start.
If you still want to do DSP, the way is to find asio4all alternative with DSP for each device,
or to move the DSP to a multichannel dac with built in DSP.
 
Problem is how much drift there is and whether you will notice it or not
I believe I once asked you if Topping had measured the min and maximum hypothetical drift rate between two devices. That must be linked to the accuracy of the internal clocks (both 44.1 and 48), right ? So if we know the accuracy we can know the drift rate. If you have any info on that, please share it so we can all enjoy it. :)

I was once told (by an ASR member I think) that the hypothetical drift rate would be of about 2 samples per second. If that was the case, then it would mean 480 samples after 4 minutes, or 1920 samples for 16 minutes of continuous play. That's 0,04 seconds so it's completely unnoticeable between both listeners. And it remains below ASIO4ALL's buffers size anyway.

My longest music file is about 41 min long (it's "El payador perseguido" from Atahualpa Yupanqui). Maybe I'll try it someday just to see.
Among my 50.000+ music files, only about 50 are longer than 16 minutes (mostly Classical music). That's one in 1000. I should try them too. I believe there won't be any issues either. :)

The best replacement for your current features is to use rca splitter. This could have largely simplified your setup and avoid this issue from the start.
NOT AT ALL. Using a RCA splitter (so 1 DAC + 2 amps) is something we already discussed on ASR months ago. It's not a replacement at all, since it doesn't allow separate EQing of headphones. It's a lesser solution.

I'm very happy to be able to EQ our headphones individually, so both listeners can enjoy the best possible sound. That's exactly why I decided to buy a second Topping DAC. I'm sure you don't mind me doing that. Sorry John ! ;)
 
I believe I once asked you if Topping had measured the min and maximum hypothetical drift rate between two devices. That must be linked to the accuracy of the internal clocks (both 44.1 and 48), right ? So if we know the accuracy we can know the drift rate. If you have any info on that, please share it so we can all enjoy it. :)

I was once told (by an ASR member I think) that the hypothetical drift rate would be of about 2 samples per second. If that was the case, then it would mean 480 samples after 4 minutes, or 1920 samples for 16 minutes of continuous play. That's 0,04 seconds so it's completely unnoticeable between both listeners. And it remains below ASIO4ALL's buffers size anyway.

My longest music file is about 41 min long (it's "El payador perseguido" from Atahualpa Yupanqui). Maybe I'll try it someday just to see.
Among my 50.000+ music files, only about 50 are longer than 16 minutes (mostly Classical music). That's one in 1000. I should try them too. I believe there won't be any issues either. :)


NOT AT ALL. Using a RCA splitter (so 1 DAC + 2 amps) is something we already discussed months ago. It's not a replacement at all, since it doesn't allow separate EQing of headphones. It's a lesser solution.

I'm very happy to be able to EQ our headphones individually, so both listeners can enjoy the best possible sound. That's exactly why I decided to buy a second DAC. Sorry John ! ;-)
I thought you weren't able to do that? The separate eq thing.
EDIT: Alright you manually convert eq settings to impulse responses.
 
Yes, like said in the tutorial, there are several ways to achieve separate EQing within the player itself. Especially these two ways :
  • A couple of VST Host plug-ins that allow to use any VST plug-in within foobar, including VST PEQs.
  • A convolution plug-in (Convolver), which also needs a VST PEQ at some point.
I am currently using convolution, only because it works and it's stable. Its only downside is that EQ changes require generating new IRs.

Someday I may try VST Host plugins within foobar. If I can achieve that (VST Host + multi-channel EQ VST), then I'll be able to modify EQ settings much easily. But I'm not the kind of guy that messes with settings all the time. Once I'm happy with something, I just keep it. :)

Another way would be replacing ASIO4ALL by another driver. For example DDMF MetaPlugin or DDMF Virtual Audio Stream. They seem to be able to do ASIO4ALL's job and also to act as VST hosts. So theoretically it's ideal, but that will require time for testing. And right now I just feel like enjoying our rig with my fiancée. :D
 
Or, get Roon.
Sure. Or not. Because Roon costs 10 € / month or 700 € lifetime.
For a similar price (989 € - 2 x 129 € = 731 €) I could also have gotten an Okto Research dac8 Pro which would do the job perfectly in lieu of my E30s.

But instead, I succeeded with only 2 E30s + ASIO4ALL, and I saved 700 € (Roon) or 731 € (dac8 Pro). :cool:
Now we all know that we can achieve dual headphone listening with individual PEQing for the price of 2 stereo USB DACs + 2 amps (2 E30/L30 stacks in my case, but there are other possibilities, even cheaper ones), with no additional costs.
THAT is the real achievement here, not much more expensive solutions that we all know exist. ;)
 
Last edited:
I also installed a two-headphone system with individual PEQs. I have a MOTU M4, which is a four-channel DAC, so the installation was quite a bit simpler. Channels 1 and 2 are connected to Topping A90, 3 and 4 to Atom amp. I use EqualizerAPO and Peace UI (in this case with Voicemeeter and the vendor ASIO driver, but it shouldn't matter, as long as all four channels are running).
First, I added commands to duplicate channels before equalization:
Code:
Copy: 3=L
Copy: 4=R
Then I imported the configuration of one headphone to Left and copied that to Right through Peace UI.
Similarly, I imported the configuration of the other headphone to the Center and Subwoofer channels (3 and 4).
 
Last edited:
I'm glad that I'm not the only one ! :D

Absolutely. Having a 4-channel DAC makes things much simpler. Plus the M4 has a lot to offer for its low price. I had considered the M4, but I decided to get the Topping DACs instead for three reasons :
  • Because I strongly dislike having inputs on the front panel. That's great for studio work, but not for hi-fi purposes.
  • Because of the marginally superior performance of the Topping E30 measurement-wise (which probably can't be heard, but for peace of mind), plus the fact that the M4 suffers from the dreaded IMP hump, lol.
  • Because all four Topping units fit nicely in the reduced space of my Custom Listening Station v1.
All this is a work in progress. My listening station will progressively evolve into a v2, the table being replaced at some point by a more modern furniture that I'm currently 3D-designing. So when a new 4-channel DAC comes up in the future, at the right price and with latest-gen measurements, that could be the cue for selling both E30s and replacing them. Topping, if you're listening... ;)

The L30s will probably stay forever unless they fail, they're beyond my expectations and amazing for the price. They are unbalanced but I've figured that I don't need/want balanced. Let's just hope their tiny on/off switches hold in the long run. Fingers crossed. :)
 
Last edited:
Back
Top Bottom