Mac mini M6 + Holo Red + Spring 3 KTE: what actually works, measured

The short version

I spent two weeks moving HQPlayer Embedded onto a Mac mini M6 and testing it against a Holo Audio Red and a Spring 3 KTE, one setting at a time, writing down the speed figure for every combination. This post is the result. It is meant for anyone who is about to buy hardware for HQPlayer and would like to know, before paying, what a small, silent, affordable computer can really do.

Three conclusions, for those who read no further:

  • The M6 handles about 95 percent of what I asked of it, up to DSD1024 with the newest AHM7EC4B modulator, with DAC correction switched on. The few things it cannot do are listed below, with numbers.
  • The limit is never the filter. Filters spread across cores and never held anything back. The modulator runs on one core per channel, and with DSD source material the integrator becomes the bottleneck. Those two decide what plays.
  • A speed of 1.0x is not enough. HQPlayer shows 1.0x as realtime, but anything averaging 1.03 to 1.05x still dropped out in my system. Stable playback started at about 1.1x, and I only trust a profile at 1.3x or more.

Everything here was measured on one system, mine. Treat the numbers as a map of one machine, not a guarantee for yours.

The chain and why each piece

Roon Server runs on an Intel NUC i7 under Roon’s own ROCK operating system and does nothing but manage the library. HQPlayer Embedded 6.1.0 runs on the Mac mini M6 and does all the processing; nothing else runs on that machine. The processed stream goes over the network to a Holo Audio Red acting as an NAA, then by USB to a Holo Audio Spring 3 KTE in NOS mode, and on to a Denon PMA-3000NE.

Why the Spring 3 KTE. Because it is a true NOS converter. It lets me hear a recording exactly in the format I own, or shape the conversion myself in HQPlayer until it sounds best to me, instead of choosing among the five or so filters a factory decided on. And it does this separately for PCM and for DSD. The rest was a judgment that it would suit the system around it.

Why the Red. It keeps the computer and its USB port out of the audio rack, and it passes native DSD up to DSD1024 to the Spring. It also comes from the same maker as the DAC, so the two are built to work together and compatibility is not something I have to think about.

Why the Mac mini M6. It is small, makes no noise, draws little power, and its single-core speed is what HQPlayer’s modulators need. The tables below show how far that goes.

How it sounds. I will skip the audiophile vocabulary. This is the closest to a live performance of anything I have had in my system, and the closest to the sound I used to admire at shows, hoping I might one day have it at home.

The network and the optical wall

The audio end of the system has no copper connection to the rest of the house. Everything electrical that a router, a mesh node or a computer might send down an Ethernet cable stops at a short run of glass.

The path, in order:

  1. HT router from the internet provider
  2. Cat 6 S/FTP Ethernet
  3. Mesh node 1 to mesh node 2 (Xiaomi AX3000), joined by a dedicated wireless link that other devices in the house cannot see or use
  4. Cat 6 S/FTP Ethernet
  5. Media converter 1: TW-MC1000-SFP with a Finisar FTLF8519P3BNL module
  6. OM3 LC-LC fibre
  7. Media converter 2: LHY FMC with the same Finisar module
  8. Cat 6 U/UTP Ethernet, deliberately unshielded so the cable itself does not rejoin the grounds
  9. Holo Audio Red
  10. QED Reference High Resolution USB cable
  11. Holo Audio Spring 3 KTE

The NUC and the M6 live in another room, on the house side of the fibre.

The only device on the quiet side of the fibre is the Red. The computers stay on the other side.

An optical break is easy to distrust: two conversions, cheap modules, one more thing to fail. So I tested it the dull way, with ten-minute pings from the M6 to the Red while music was playing, 600 packets each time.

Playing Packet loss Max Std dev
DSD1024, 44.1k family (90.3 Mbit/s) 0 % 57 ms 8.7 ms
DSD1024 after a cable change 0 % 62 ms 8.0 ms
DSD1024, 48k family (98.3 Mbit/s) 0 % 52 ms 7.9 ms

Not one packet was lost in any run. DSD1024 is close to 100 Mbit/s of continuous traffic, so the whole path has to be gigabit; a 100 Mbit link anywhere in it would be the end of the story.

What the M6 can and cannot do

The figure in each cell is the speed HQPlayer reports, where 1.0x is realtime. All of it was measured with DAC correction on, 1x filter poly-sinc-gauss-long, Nx filter poly-sinc-gauss-hires-lp. Columns are the output rate and modulator; rows are the source and, for DSD sources, the integrator.

Source DSD256 (ASDM7EC-super) DSD512 (ASDM7EC-fast 512+fs) DSD1024 (AHM7EC4B)
PCM 44.1k 2.02x 1.45x 1.53x
PCM 48k 1.90x 1.37x 1.42x
DSD64, FIR2 1.81x 1.40x 1.46x
DSD64, FIR-bl 1.37x 1.05x 1.11x
DSD128, FIR2 1.80x 1.34x 1.41x
DSD128, FIR-bl 1.02x 0.83x 0.87x
DSD256, FIR2 1.64x 1.16x 1.34x
DSD256, FIR-bl 0.68x 0.54x 0.60x

Read across the top two rows and the M6 looks comfortable everywhere. Read down the FIR-bl rows and the picture changes: the same machine that plays DSD1024 from a CD rip at 1.5x cannot convert a DSD256 album to DSD256 with that integrator.

Where the M6 gives up:

  • ASDM7EC-super 512+fs at DSD512. 1.07 to 1.11x from 44.1k sources, 0.98 to 0.99x from 48k, 1.03x from DSD64, 1.00x from DSD128. On paper it plays; in practice it drops out. The fast variant of the same modulator runs at 1.45x and is what I use.
  • FIR-bl with DSD128 and DSD256 sources, at any output rate.
  • FIR-bw almost everywhere. 0.87x from DSD64 at DSD1024, 0.32x from DSD256 at DSD256.

For comparison, the older AHM7EC8B modulator at DSD1024 runs at 1.88x from 44.1k, about 20 percent lighter than AHM7EC4B. A plain PCM output at 1.4112 MHz with poly-sinc-gauss-xla reached 2.29x.

Lessons that cost us days

Realtime is not 1.0x. The speed figure is an average, and the average hides the moments when the machine falls behind. Profiles averaging 1.03 to 1.05x dropped out regularly. Plan for 1.1x as the floor and 1.3x as the point where you stop watching the number.

The integrator follows the source, not the output. I first read the advice on integrators as depending on the output rate. It does not. What matters is the rate of the DSD file you are playing, because the integrator’s load grows with it. DSD64 can take FIR2 or FIR-bl. DSD128 and DSD256 need FIR2 on this machine.

DAC correction is cheap. Forum estimates suggested it might cost half the available speed. Measured here, on PCM sources, it cost about 10 percent: 2.08x without it and 1.87x with it at DSD1024. It is set once, in the Matrix tab, for the whole output, and it is saved inside the configuration profile. It stays on in every profile of mine except direct DSD, where no processing takes place.

Blocks per cycle will not rescue a marginal profile. Lower values raised the average by about 10 percent, higher values lowered it, and the dropouts stayed in every case. I left it on Default.

Rate families depend on the DAC chip. On the Spring, automatic rate family and 48k-based DSD are both on, and the switch between families is clean and silent. On an ESS-based player I tried earlier, both had to be off to avoid noise; HQPlayer’s author attributes that to how ESS chips handle clocking. If your DAC is ESS-based, test this before anything else.

There is no formula for what to lighten first. I asked HQPlayer’s author whether a simple rule exists for trading filter against modulator against integrator when a profile is too heavy. His answer, in short, was no. You measure.

The profile set

All of the above settled into eight saved profiles. Every SDM profile uses the same pair of filters, poly-sinc-gauss-long for 1x sources and poly-sinc-gauss-hires-lp for higher rates, so that what changes between profiles is only the output rate, the modulator and the integrator.

Profile Output Modulator Integrator DAC correction
256 DSD256 ASDM7EC-super FIR-bl on
512 DSD512 ASDM7EC-fast 512+fs FIR2 on
512fast-bl DSD512 ASDM7EC-fast 512+fs FIR-bl on
512super-FIR2 DSD512 ASDM7EC-super 512+fs FIR2 on
1024 DSD1024 AHM7EC4B FIR-bl on
1024FIR2 DSD1024 AHM7EC4B FIR2 on
PCM 1.4112 MHz, 20 bit LNS15 shaper not used on
direct DSD source rate, untouched DirectSDM DirectSDM off

The logic behind the pairs is the source material. About 90 percent of my DSD albums are DSD64, and for those FIR-bl is an option, so the FIR-bl profiles exist for them. DSD128 and DSD256 albums go to the FIR2 profiles. PCM sources do not touch the integrator at all and play on any of them.

DSD256 albums are a special case. They already arrive at a rate the Spring takes natively, so their first home is the direct DSD profile, with no processing at all. The trade-off is that direct DSD also means no DAC correction. I have not yet compared the two by ear, direct against FIR2 with correction, so for now this is a principle rather than a listening result.

If you do remodulate DSD256 albums, the speed table shows where to send them. At DSD512 they run at 1.16x, which plays but leaves little margin. DSD256 at 1.64x and DSD1024 with FIR2 at 1.34x are the safer choices.

The 512super-FIR2 profile is kept as a reference rather than for daily use: it sits right at the edge of what the M6 can do.

Two profiles get most of the use. The first is 256 with FIR-bl, because the largest part of my library is DSD64 and that integrator suits it best. The second is 1024, because it is something entirely new to me, out of reach on my previous setup, and so far it sounds exceptionally promising with every kind of source.

3 Likes

Working with HQPlayer Embedded without losing your mind

The web interface of HQPlayer Embedded has one habit that cost me more time than any measurement.

When a saved profile is loaded and you press Apply, the change is written straight into that profile’s file. The base configuration is left alone. The page then redraws from the base configuration, so what you see on screen is no longer the profile you just changed, and you have to load it again. I confirmed this by watching the modification times of the files on the Mac. I have reported it to HQPlayer’s author.

Three habits follow from that:

  • Apply is already a save. The Save button is only needed when you want a new profile name.
  • Experiment on a copy. Load the profile, save it under a test name, then load that test profile before you change anything. Saving under a new name does not make the copy the loaded profile: I learned that when Apply wrote my experiment into the original instead of the copy.
  • After Apply, load the profile again before believing anything the page shows.

And one more that has nothing to do with the interface: back up the whole configuration folder whenever the profiles are in a state you like. On the Mac it is one command over SSH.

cp -R ~/.hqplayer ~/hqplayer-backup-2026-10-03

To check later whether anything has drifted from that backup:

diff -r ~/hqplayer-backup-2026-10-03/cfgs ~/.hqplayer/cfgs

If it prints nothing, nothing has changed.

What we would do differently

The chain above is the second version of this system, and the first one taught me what to avoid.

Decide on the DAC before the computer. A NOS DAC that accepts DSD1024 sets the target, and the target sets the computer. I had it the other way round for a while, running HQPlayer into an ESS-based player used as a DAC, and spent my time working around the chip instead of listening. That is no criticism of the player: being a DAC is not its main job, and it should not be blamed for the trouble I gave it.

Buy for single-core speed. An earlier Mac mini M1 ran HQPlayer, but my measurements showed it would manage no more than about half of the combinations I wanted. Its performance cores are simply too slow, and everything that matters runs on the single fastest core per channel. More cores would not have helped; a faster core did.

Check the ceiling of the network endpoint. My first endpoint was an iFi ZEN Stream, and it could not go above DSD256. Whatever the computer can calculate, the endpoint has to be able to pass on; the Red takes DSD1024. The optical break was there from the beginning, with two identical TW-MC1000-SFP converters. Only the second one, on the audio side, was later replaced by the LHY FMC. The reason was its power supply: the last box before the audio gear should not put noise back into a signal that has just been cleaned. According to the maker it has a linear supply with a toroidal transformer, mains filtering and three separate low-noise regulators, and an oven-controlled oscillator (OCXO) that reclocks the data.

Measure before you trust a setting. Nearly every assumption I started with, mine or borrowed from a forum, was off by enough to matter: the cost of DAC correction, the meaning of 1.0x, the rule for integrators. An afternoon with a notebook and the speed figure is worth more than a week of reading.

If you are about to build something similar and have a question the tables do not answer, ask below. I still have the full test log.

This is great work. My M6, 512/24 arrives tomorrow. I have a Red and Spring 3 but have just got a Eversolo T10.

Thanks…mine M6 is the 256/16 standard version; I didn’t want to wait for the 24GB RAM model since it had to be ordered, and—aside from a few filters, from what I could gather—the RAM itself isn’t critical for performance… since the Roon server is on another computer, I haven’t noticed any downside to having less RAM so far.

Nice share BojanD, there is a lot of really useful information there.

I currently have an M4 Pro with 24GB that runs Roon and HQP and I was thinking about about getting an M6 just for HQP but not sure that I need it for DSD 256 & 512 for use with my T10

I started setting up HQPlayer on an M1 Mac mini that had been sitting unused on my shelf; when I wasn’t satisfied with its performance, I spent a long time weighing the options between the M5 Pro with 15 or 18 cores. However, once I realized that single-core speed—which ultimately handles the bulk of the workload—is the most critical factor, and after seeing benchmarks for the M6, I made my decision and am very pleased with it. The M6 ​​can deliver over 90—perhaps even 95—percent of what I want from HQPlayer; achieving that remaining fraction would require a significantly larger investment in computers with Max or Ultra chips, or a PC with CUDA support—machines that simply don’t make sense to keep solely for running HQPlayer. The M6 ​​is highly capable, and its price point makes it a worthwhile choice to dedicate exclusively to HQPlayer.

1 Like

Same here as well and I still have that and I am thinking about installing Linux on it :roll_eyes:

At the moment the Mini M4 Pro seems to handle everything really well (with the extra 2 processors), though I am still tempted to to go for an M6 device in the near future. Your figures and information show that it is more capable again. If we were not living in the time of RAMMaggedon it would have been a no brainer

If I were you, since you have an M4Pro and not just the base M4, I’d wait for the M7…

This is also the biggest problem you face with technology, the best one to buy always seems to be the next one. :cooking:

1 Like

So true, and mostly what the logical part of my brain has decided to do, but it’s the illogical part of my brain which says it would be nice to have one, even if it replaced the M1 Mini :slightly_smiling_face:

I have added an R30 and an T10 in the last 2 months, so maybe saving the pennies and using what works really well is the way to go.

I (and I mean the M4 Pro) is managing to push to Mini with HQPlayer and Roon running to high levels of performance with some headroom to spare. Now I’m not using and convolution or anything else, but it’s working nicely. Only issue I had last night after updating metadata on 10s of thousand’s of Tracks was that it’s started the analysis process at 11PM which caused carnage as you can imagine

1 Like

I’ll be keeping a close eye on this as I have Cyan2 and May L2 plus Topping D900 with Red and perhaps PI2AES for NAA with MacMini M4 Pro and options to put in an M6 maybe too. Roon Core on Rock i7-10700

Which interface are you using? It looks very clear and useful to me… the embedded one isn’t user-friendly, but this one seems really interesting.

I am using the new docker app created by forum user @Johnny_Ooooops that is referenced in the thread below. I was doing some early testing for Johnny and I can honestly say it hits the 95% of my needs and I can run it on my mobile phone

2 Likes