There is a long-standing issue in the host-side utilities of the ASIO SDK (specifically in host/asiodrivers.cpp) where hardcoded buffer limits of 32 are used when retrieving driver names. This causes AsioDrivers::loadDriver to fail silently when attempting to load physical hardware drivers with names longer than 31 characters (such as "M-Audio M-Track Solo and Duo ASIO").
What’s the cause? In host/asiodrivers.cpp, the loadDriver function allocates a char dname[64] buffer but queries the name with a hardcoded limit of 32 bytes:
bool AsioDrivers::loadDriver(char *name)
{
char dname[64];
char curName[64];
for(long i = 0; i < asioGetNumDev(); i++)
{
if(!asioGetDriverName(i, dname, 32) && !strcmp(name, dname)) // <--- Hardcoded 32
If the registered driver name exceeds 31 characters, AsioDriverList::asioGetDriverName (in asiolist.cpp) truncates the name and appends ... to fit within the requested 32-byte limit.
Because of this truncation, the subsequent string comparison strcmp(name, dname) fails because the target name (e.g., "M-Audio M-Track Solo and Duo ASIO") does not match the truncated dname (e.g., "M-Audio M-Track Solo and Duo..."). The loop exits, and the function returns false without ever calling asioOpenDriver.
Similar hardcoded 32 limits exist in getCurrentDriverName and getDriverNames within the same file.
Proposed Solution:
Instead of hardcoding the literal 32 in host/asiodrivers.cpp, the SDK should use the pre-existing constant MAXDRVNAMELEN (defined as 128 in asiolist.h), or at least use the full size of the allocated buffer (64).
Updating the calls to use MAXDRVNAMELEN or 64 ensures that standard long driver names are queried completely and match successfully during initialization:
// Suggested fix in host/asiodrivers.cpp:
if(!asioGetDriverName(i, dname, 64) && !strcmp(name, dname))