Remote control of play/pause skip/rewind via USB DAC


Many DAC’s have remote controls that can control media applications/servers via a USB connection. (On the Mac it’s the USB HID protocol). Both my Arcam DAC and Hegel DAC can control play/pause and skip/rewind in iTunes. Play/plause also works for Roon. However, I am now running Roon headless server and it doesn’t even recognize play/pause (because it has no gui obviously) and these buttons will cause iTunes to open and start playing. So I have to run roon app on the same headless mac as roon core server to avoid this.

It would be very helpful if you could:

  1. add skip/rewind control to Roon via the USB connection.

  2. even better, add both play/pause and skip/rewind to Roon Core Server. I realize that it is not intended as a control application but given typical setups where one has a headless mini mac/pc connected to a DAC via USB it would be really nice if it could catch these requests for controlling the output to the USB device that the input came from.

If you need any input/assistance on the USB HID protocol on the Mac side let me know. Though the fact that you are recognizing play/pause in the standard Roon application means that it should be easy to add these in.


1 Like

WIthout access to one of these devices, it will be hard. Do these get converted into UI events or do we need to use IOKit to receive the events?

What a great idea. I run roon server on an headless windows 10 pc which has a IR flirc dongle (which basically outputs keyboard commands to pc). It would be great if roonserver will accept simple controls such as pause/play etc so I don’t need to keep holding my ipad when I listen. Thanks!

the IR flirc should work fine with roon as you can get the flirc to send media keys to Roon – that works already.

Hi Danny,

I had assumed that you were already using IOKit/HID Manager to a degree as the play/pause USB Consumer Usage 0xCD element is already being captured by Roon - i.e. pressing play/pause on DAC remote controls causes roon to play/pause. But it’s quite possible that OS X simply traps this input and forwards it as a “spacebar” type UI event that plays/pauses almost all apps, as you suggested. This is why pressing space bar seems to universally play/pause almost any application? I wonder if OS X is likewise forwarding next/previous track as UI events as well?

All that said, the more robust solution is to directly use IOKit to catch these events. I think you just create queues to get notification of HID element value changes from the specified class of device (consumer class?) via HID manager, and associated callbacks. These are the 3 most common and important USB HID elements that DAC remotes seem to support, at least from the DACs I have owned:

0xB5 - Scan next track
0xB6 - Scan previous track
0xCD - Play/Pause

See, section 15 for more info. The benefit of this is that roon core server could also catch these events and control output to the given USB device.

If it’s not obvious, this is extremely useful for all of us who use USB DACS(with or without amp) for quick playback control, including volume when force max volume/disable volume is set. For example, my DAC remote allows me to control volume (of my integrated amp), play/pause, next/previous track. Once I have a playlist set up in iTunes, Audirvana, etc all I need to control things is the DAC remote. If Roon could do this too then one doesn’t need to use the Roon app/remote to control playback once started.

This page has most of what you need to implement via IOKit -

From my very quick perusal you would (simplistically) need to:

  1. instantiate an HIDManager matching USB Audio devices.

  2. schedule it in a runloop?

3a. either create a callback routine that traps changes in any input elements from this HIDManager or

3b. create queues to listen to the above mentioned 3 specific input elements

  1. process the change accordingly - eg. if B5 is changed then go to next track

Oh! Now I understand… I misunderstood what you said before… the HID commands for play/pause/next/previous we do handle using IOKit… they actually come from our support for the IR remote, not USB HID devices specifically.

The real issue here is actually not the HID support, but the mapping from the HID to the device. RIght now, those commands come in generically as an input device like a keyboard, and we map them to control the current zone, just like your keyboard’s media keys would.

Since RoonServer has no notion of “current zone”, since it has no UI, the media keys and IR Remote messages are ignored.

I really need to get my hands on a DAC that supports this, so UI can figure out how to map the USB HID device to the audio device that is currently playing, so when that command comes in, it controls the proper device.

Unfortunately, to do this across the board is going to be very difficult. For example, ASIO hides all the USB details away from us.

1 Like

Ah ok interesting, I never thought of even trying the IR remote. That said, one would still need to use a DAC remote to control hardware based volume. So does that mean that you are capturing 0xB3 (fast forward) and 0xB4 (rewind) from the IR Remote? Are you specifically matching your HID Manager to the IR remote or to all devices? If the latter, could you not just add 0xB5 and 0x6 to your handler so that next track/previous track inputs from DACs also work? That would at least allow DAC remotes to replay the IR remote with the Roon GUI app.

And then yes, for RoonServer, you would need to match up the zone with the device that sent the HID commands …


Sorry one last reply - I looked at what elements the IR remote uses and they are:

B0 - play
B1 - pause
B3 - ffwd
B4 - rewind

  • volume elements E2 (mute), E9 (volume up), EA (volume down)

Other (DAC) remotes use slightly different codes - If you could at least add support for the following right now that would be great:

B5 - next track
B6 - previous track
CD - play/pause (it’s a toggle)

And then hopefully the RoonServer could be dealt with later on … :wink:


Has there anymore development on this issue? As nquery explained, it would be incredibly convenient to control Roon play/pause and next/back through USB DAC remote controls. For me, the Hegel H360 has a built in USB DAC and its remote controls simple transport functions on a Mac running iTunes.



Can someone explain this: I am running Roon Core on a Mac mini. The original slim aluminum Apple TV IR remote provides transport functions to both ITunes and Roon. The RC8 remote supplied with my Hegel H360 has computer transport controls (back, next, play/pause) that control iTunes on the Mac, but do not control Roon. I would think that IR codes are IR codes and it wouldn’t make a difference what remote sent the code.

Any explanation would be greatly appreciated.

No the IR commands for those USB HID buttons on the Hegel (and other) remotes are not the same as the standard transport buttons. I created a small app that catches the USB HID commands sent back to the Mac from the DAC and sends keyboard shortcuts to Room to control transport (back, play/pause, skip). Its very inelegant but actually works very well- you would never know it’s there.

I am thinking of converting this to a Roon Extension using the new API though it looks like it’s only available as node/JS right now. The major benefit would be that I could run roon as a headless core and not the entire app (which is needed in order to pass through the keyboard shortcuts). Probably not worth it …

That would be Great to ret IT administrator and extension. +1

Does the Apple IR Remote actually work with Roon “Core”? Afaik, only the GUI version of Roon supports transport playback controls as core has no notion of the “current zone” as Danny mentioned when this thread first started …

Yes, the Apple TV remote will operate transport controls, but only with Roon Core running on Mac, not with Roon Server (with DAC connected to same Mac) or Roon Bridge. What I haven’t confrimed is whether the Mac is passing on commands from its IR receiver or the DAC is sending the commands through the USB port.

I’d like to try out your app. Can you it or the code available?

sorry my mistake, i meant to ask if it works with Roon Server, not core. As you confirmed, it does not. With Roon Core what is happening is that Roon is listening to the Apple IR remote, not via the DAC USB commands.

I can probably make my app available - but it is currently hardcoded to look for the ID of the USB receiver in the Hegel H80. Your H360 uses a different USB chip and the ID is different. I would have to make it respond to the USB HID commands from any attached device - I’ll take a look later today.

Hi nquery. I have a Hegel H80 and the same problem, but with the Audirvana Plus-player. My Hegel remote works fine with iTunes and TIDAL desktop, but not with Audirvana. With Audirvana only stop/play responds. Would it be possible that your app works for me? Would be very happy to try. Thanks.

Sorry but it won’t work with Audirvana. It’s coded to send keyboard shortcuts to Roon.

Any further development on this?