v. 6.1.02 Release Notes

This release provides numerous new features and bug fixes, and is a recommended update for all customers. This version has been tested on macOS Ventura (macOS 13.0), as well as previous macOS releases.

Table of Contents

New Firmware

The new firmware version (6.0.176) includes important improvements that are required to interoperate with the new User Space driver. As a result, we recommend that you update the firmware before updating the driver.

This firmware also fixes a corner case bug that could cause host channels > 64 to get muted when a bus got soloed and then un-soloed in a multibox system. Under these conditions, a control register for the MHLink port connected to the computer got reset to a default value and would cause the channels over the default number to get disconnected. The symptom of this is that after re-launching MIOConsole3d, the mixer would pass all the host audio as expected, but after solo/unsolo channels 65 and greater would remain muted.

NOTE: The included firmware (6.0.176) includes a new runtime for the DSP environment; this new runtime has a different memory layout as compared to earlier versions of the firmware, and as a result, is incompatible with previously created boot states or hardware snapshots; this version of the firmware will not recall boot states or snapshots created on previous versions of the firmware; you will need to reload the .cnsl3d file you used to create the bootstate or snapshot and re-save the snapshot to the hardware.

New User-Space Driver

The big news in this release is the addition of a new user-space driver. In previous releases, the MHLink CoreAudio driver was packaged as a Kernel Extension (KEXT). The new driver does not require kernel access (e.g. it runs in user-space as a normal user process). The new driver will have a version ≥ 3.0.00. The version included in this release is v.3.0.18.

With each successive release of macOS, Apple has tightened the security requirements for KEXT drivers, and has continuously deprecated third-party kext drivers.

While macOS Ventura will still load and use the old MHLinkDriver.kext CoreAudio driver, the user-facing security requirements for third-party KEXTs are both confusing and flakey. Updating the driver (or other third-party KEXTS) generally requires a reboot, and may require multiple cycles of user driver approval and reboots, especially on newer versions of macOS. In addition, the use of third-party KEXTs requires lowering the overall security profile of macOS.

The new User-Space driver no longer requires a KEXT to function. As a result, the firmware security can be set to the highest level supplied by Apple (as long as you no longer have any reliance on any other third-party kexts). In addition installing and/or updating the driver does not require rebooting the computer.

We have determined that we were able to substantially improve the CoreAudio and latency performance of the MHLink <-> computer transport with the new driver as compared to the old KEXT based driver. While the improvements may not be as extreme on older computers and older versions of macOS, the improvement for current computers/NICs/OSes is substantial.

As a result, we recommend that all users migrate to the new driver.

Removing the old KEXT driver


While the new user-space driver will function properly even when the old kext driver is installed, some users have encountered situations where the two drivers being installed at the same time can interfere with MIOConsole3d being able to communicate with the hardware.

The symptom of this is that the MHLink audio device shows up in CoreAudio, but the hardware is offline in MIOConsole3d. While it is possible to unload the KEXT while the computer is running normally, it will be reloaded if you reboot your computer.

In order to fix this situation, you need to remove the old KEXT from your system and make macOS flush its cached copy of the driver.

Unfortunately, In macOS 10.15 and newer Apple has made it difficult to permanently remove a kext driver. The process is described in the following FAQ:

How do I remove the MHLink Kext driver?

Driver Control Window

Moving the driver to user-space allows the driver to maintain its own preferences independently of MIOConsole. This means that various parameters for the driver that used to rely on MIOConsole running to be recalled (for example the number of MHLink I/O channels) are now maintained persistently by the driver.

The fact that the driver can now maintain your preferences has allowed us to add more configurability to the driver. The configurable parameters of the driver are accessed via the I/O > Show MHLink CoreAudio Driver Control Window menu command.

The MHLink CoreAudio Driver Control Window provides you with a UI to control the driver's configurable parameters. These parameters include:

Some users have reported issues with other devices (like network routers) that receive MHLink discovery packets. Since we recommend dedicating a network port to MHLink, the other ports in your system do not need to be serviced by the MHLink driver. The Ethernet Interface table at the top of the window allows you to choose which Ethernet ports in your system will be serviced by MHLink.

If you do not need to use a specific port for MHLink, you can uncheck the "Use" button for that port, and the MHLink driver will detach from the port, and will not reattach in the future, unless you re-enable it. The EthernetInterface name displayed matches the name shown in Network pane of System Preferences/Settings.

In the past, with the KEXT driver, it was possible to disable IPv4 on a port that was dedicated to MHLink to reduce spurious traffic. The userspace driver cannot connect via a port if IPv4 is disabled, so any such ports will be be listed in red, with the message "[Unavailable; Enable IPv4]". If you wish to use this port please go to the Network pane of System Preferences/Settings and set the "Configure IPv4" to DHCP.

The kernel driver has always provided a CoreAudio control to change the Monitor Level via CoreAudio. The system volume control (e.g. keyboard volume keys) use this control when the MHLink CoreAudio device is selected as the System output. Some host apps will also use this control (e.g. Cubase and Nuendo). While this functionality is convenient, sometimes it can result in unexpected changes in the monitoring level. The user-space driver provides a preference via the Allow CA to Control Monitor checkbox. If you don't want CoreAudio to be able to control the monitor level, untick this checkbox, and the control will be removed from CoreAudio.

In addition the window shows driver performance statistics about how the OS's scheduling is affecting reliable performance at the current level of safety offset. The performance statistics area of the window shows the gap in samples between the driver and the audio sent to and read from the driver by the system on behalf of host apps. These readouts (especially the Output Gap) can be unreliable when a host starts audio, so you should reset the the statistics after you start audio streaming.

If the Input Gap goes < 0, then there will be a dropout on the input. If the Output Gap goes < 0 then there will be a dropout on the output. If the Max Packet Delay goes < 0 then there will likely be a dropout in both directions. If the Max Packet Delay goes < 0, increase the safety offset (see below for details).

If the Max Packet Delay and Input Gap are both greater than 0, but the Output Gap is < 0 then one or more of the host apps have had an overload and have delivered audio to the system late. This is not an issue caused by the driver.

The KEXT driver had a substantial amount of safety offset to deal with worst-case scheduling latencies in the kernel. The output offset was set to 6.5ms and the input offset was set to 1.5ms (for a total of 8ms of additional latency, above and beyond the CoreAudio buffer latency and the converter latency in the box).

We have found that with the userspace driver, for most modern systems, setting the safety offset to 1.0ms in both directions is consistently reliable, and so we have made that the default setting. As a result, all things being equal, switching to the new driver will reduce the RTL over MHLink by 6 ms and the output latency by 5.5ms.

For the most modern systems (Apple Silicon), we have found that you can further reduce the safety offsets; for instance we have found 0.5 or 0.8 to be reliable, which would further reduce the RTL by as much as 1ms.

For older systems (for example older Mac Pro towers), especially on older versions of the OS, or for Ethernet NICs that are bursty (e.g. some USB 1Gb adapters) you may find that the Max Packet delay exceeds the safety offset; in this case you would get a click; for these machines you should increase the safety offset to about 25-30% larger than the Max Packet Delay that you get while streaming through the interface with your usual CPU load. On older Mac Pro towers, that will probably mean increasing the safety offset to 2-2.5ms (which still leaves you with a substantial improvement in the RTL latency).

You can adjust the safety offsets with the sliders or by typing a number in one of the entry fields (the number is in milliseconds). While it is possible to change the safety offsets independently, in virtually all cases they should be set to the same value.

Note: Changing the Safety Offset while audio is running through the driver will cause the driver to start and stop audio transport while the offset is being updated. This may confuse some hosts. In addition, while the new offset is immediately reported to CoreAudio hosts, some hosts may not take note of the changed value. As a result we recommend that you quit and relaunch any DAWs you are running if you need to change the Safety Offset.

MIOConsole Changes

This release provides a number of additional useful features, bug fixes and usability enhancements.

Accidental Quit Protection

We added support to optionally prompt the user before actually quitting when the commit command is received from the user or the system.

There are 3 possible "Verify Quit" modes:

Never is the default mode. You can change the mode for your system via MIOConsole3d preferences (MIOConsole3d > Preferences… > Interaction > Verify Quit):

When the mode is set to Always the console will prompt you to confirm actually allowing the app to quit. When the mode is set to When Transport is Active the console will prompt you to confirm actually allowing the app to quit, if Session is actively in Play and/or Record. If the Session transport is stopped, then the app will quit without prompting for confirmation. The prompts look like:

Color Picker Choices

MIOConsole now allows you to choose which color picker you would like to use for choosing colors for strips and the theme color elements. The choice of color picker is in Preferences > Appearance > Color Picker:

The macOS System Color Picker is the original picker that has been available from the start.

The Popup HSB Color Picker is a popup window that allows you to choose via Hue, Saturation and Brightness controls or directly set the color components:

The Popup Swatch Color Picker is a popup window that allows you to choose via a fixed color palette:

Monitor Controller Enhancements

We have added additional Monitor Control input and output path speaker layout configurations. These include ATMOS layouts up to 9.2.6 and stereo with stereo subs (2.2). The "Type" menu is now sorted by the number of channels in the path:

The Monitor Controller has support for speakers up to ATMOS 9.2.6:

As before, the enhanced channel layouts are strictly for the Monitor Controller; the Mixer panner only supports busses up to 7.1.

New Plugins

This release of MIOConsole bundles additional new plugins, including:

Plugin updates

MBEQ has new usability enhancements, including having the drive link and sauce controls surfaced onto the top level of the UI. It also has a polarity invert added. In addition, we have added an enhancement to the transfer function UI that we call the "Training Wheel" which provides a detailed readout and controls around the band that you are currently editing.

All EQ transfer function displays now have a filled curve appearance.

Shared graphic assets are now cached to reduce time to open plugin UIs.

When a plugin window is opened, it is now centered on the screen that has the mixer window.

Presets in the preset picker are now listed in alphabetical order, and each preset has a tool tip that will allow you to see the full name if it is truncated in the picker list.

Plugin/Graph Preset Associations

In the past, it was possible for settings for plugin and graph insert instances to become disassociated from the preset that was either selected or saved; this could happen when new presets were saved, or old presets were deleted, or categories were added or removed. When this happened the instance would still show a preset name, but it would be the wrong one. This release of MIOConsole addresses this issue once and for all, moving forward, but does not resolve any such confusion that might exist in older .cnsl3d files.

Preset Association - Details

There are two types of presets in the MIO System; an older type that is used for the older plugins and graph settings, and a newer type (Generic Presets) that is used for all the Production Bundle plugins and the new plug-ins.

The Generic Presets allow for sharing with the native versions of the plugins, and have had Unique Id (UID) support for some time. The plug-in instances that use the Generic Presets remember which preset is associated with the instance by using the UID; this allows the preset name to be recalled even in the face of things like new settings being saved, old settings being deleted and categories being reorganized.

The older preset mechanism has not had UID support up until this build. For instances and graphs that use the older preset mechanism, the association between the instance and the selected preset was a raw index for the category and the preset within the category. Unfortunately this raw index is fragile and what appear to the user to be small, irrelevant changes to the catalog of presets (e.g. adding a new preset, deleting a preset or rearranging presets within categories) will effectively cause the instance to be associated with the wrong preset.

This build adds UID support to the older Presets and Graph settings, and uses the UIDs for the preset associations for instances.

Having the the UIDs available for the presets and associations solves an number of problems. As with the Generic Presets, the associations are now no longer fragile. This means that even with substantial changes to the presets catalog, the associations will correctly persist.

Now that UIDs are universally available we are also propagating the UID metadata to the clipboard and drag and drop (for both Generic Presets and the older presets), which means that dragged, copied and drag-copied instances will maintain the preset associations. It also means that instances dragged to other apps (which create preset files) will include the metadata, and preset files that contain UID metadata that are dragged into the mixer will connect to the associated preset (if it is present).

Caveats and Quid pro quos: Any existing non-generic presets will not have UIDs, and any instances in .cnsl3d files that were created before this build will be using the raw-index for associations rather than a UID; as a result, associations in existing files will exhibit the fragility discussed above. The missing UID can be resolved in one of two ways:

  1. When you select an existing preset for a plugin or graph window, it will automatically get upgraded with a UID, the upgraded preset will be re-saved into the catalog, and the instance will get the UID for association.

  2. When you save the settings for an instance that has a raw-index association, the setting will be upgraded with a UID and the saved preset will be written over the preset that is at the old raw-index, and the instance association will use the new UID moving forward. This will work fine as long as the raw-index aligns with the original setting; if it doesn't align, it will write over the whichever setting is at the old index. So be careful to check that the displayed preset name matches what you think it should before saving. If it doesn't, use "Save Parameters As…" in the hamburger menu to explicitly save as a new preset or over the preset you remember it to be.

When you save a new preset, the preset will automatically have a UID and the association will use the UID. Older builds of the console will properly load files that have UIDs and presets that have UIDs, but will not preserve them if the file is re-saved.

Miscellaneous Changes

The File > Save command is now always active, and saving will also save to the MIOConsole state saved in preferences.

OpenGL is disabled and removed for macOS 10.14 and newer as it is deprecated. We have removed the bottlenecks in the rendering on 10.14 and newer that caused us to implement OpenGL rendering in the first place. On newer versions of macOS, OpenGL appears to be the cause spurious crashes. This change removes the source of those potential intermittent crashes. Even if you are on a version of macOS older than 10.13, consider switching to Native or Layer backed as the performance is likely to be similar (or even better) than OpenGL.

Fix multiple intermittent crashes.

Fix layout of mixer strip controls under certain control visibility configurations.

Remove fonts from the theme font list that are known to result in an illegible UI. Promote certain known good fonts to the top of the list.

Enable state of the "Selected Strips" link group is restored properly from the .cnsl3d file.



Detailed changes since pb12

New Features

Bugfixes