FMOD Studio not seeing ASIO Driver

I’m running Windows 7, 64bit and FMOD Studio 64bit (vers 1.07.07) with a 7.1 surround setup. Unfortunately FMOD Studio is not seeing the ASIO driver for the MOTU 24/IO. I have the latest driver installed for the 24/IO (4.0.6.6814), and the only time I get signal to the IO is if I select Direct Sound or WASAPI which is useless to me since it can only output 2 channels. Any help would be appreciated.

Thanks,

Just to clarify, are you seeing no entry in the Studio device drop down list, or are you seeing a device but getting no audio?

I do not see the device on the drop down entry. However I do see it in my DAW that I use to design in.

Can you try the 32 bit version of FMOD Studio? Can you see it there?

I do not see the ASIO driver in the 32bit app as well. I’ve also tested FMOD on other ASIO drivers that was installed, and FMOD doesn’t see those as well. Can FMOD be looking at the ASIO drivers in the wrong directory?

A couple of other things to try, open Studio, go to Window -> Console -> Logging and check for any errors / warnings when toggling between ASIO and No Sound. Also if you go to the registry: Start -> Run -> Regedit, what do you see in HKEY_LOCAL_MACHINE\SOFTWARE\ASIO ? This is what FMOD reads to get your ASIO list.

I’m getting errors when switching to ASIO drivers.

fmod_outputasio.cpp(185), OutputASIO::enumerate(): IASIO::init failed for driver 0: ‘Unknown Error’
fmod_outputasio.cpp(185), OutputASIO::enumerate(): IASIO::init failed for driver 5: ‘Device not connected’
fmod_outputasio.cpp(185), OutputASIO::enumerate(): IASIO::init failed for driver 6: ‘Device not connected’
fmod_outputasio.cpp(185), OutputASIO::enumerate(): IASIO::init failed for driver 6: ‘’.

…and so on.

Registry Editor
Name Data
(Default) (Value not set)
InstallDir c:\Program Files\native Instruments
InstallVST64Dir c:\Program Files\VSTPlugins
InstallVSTDir c:\Program Files (x86)\VSTPlugins
KEY …
SNO …
SYSTEMID …

There is a bug where if the first ASIO driver fails initialization, for example due to the device being disconnected the enumerated list will not be shown.

EDIT: This is fixed for 1.07.08.

Bumping this thread up as this still happens in FMOD for Unity (v2.01.11/v2.02.05)

It only tries first ASIO device then returns NOSOUND output immediately.
Heres log of FMOD and my ASIO registry structure.

[FMOD] SystemI::setOutputInternal : Setting output to 'FMOD ASIO Output'
[FMOD] OutputASIO::enumerate : CoCreateInstance returned 0x80040154 for driver 0.
[FMOD] OutputASIO::init : CoCreateInstance returned 0x80040154.

[FMOD] SystemI::setOutputInternal : Setting output to 'FMOD NoSound Output'
[FMOD] OutputNoSound::init : Initializing.
[FMOD] OutputNoSound::init : Done.

[FMOD] Thread::initThread : Init FMOD mixer thread. Affinity: 0x8000000000000001, Priority: 0xFFFF7FFA, Stack Size: 81920, Semaphore: No, Sleep Time: 1, Looping: Yes.

[Unity] setOutput to ASIO : OK
[Unity] getOutput Result : NOSOUND
[Unity] getNumDrivers : OK
[Unity] asioDrivers : 1

[Unity] DriverInfo NOSOUND id = 0 / NoSound Driver, Guid = 00000000-0000-0000-0000-000000000000, Systemrate = 48000, Speakermode = STEREO, channels = 2

[FMOD] Thread::callback : FMOD mixer thread finished.
[FMOD] SystemI::setOutputInternal : Setting output to 'FMOD WASAPI Output'
[FMOD] OutputWASAPI::init : Mix Format (WAVEFORMATEX): wFormatTag=0xFFFE, nChannels=2, nSamplesPerSec=48000, nAvgBytesPerSec=384000, nBlockAlign=8, wBitsPerSample=32, cbSize=22.
[FMOD] OutputWASAPI::init : Mix Format (WAVEFORMATEXTENSIBLE): wValidBitsPerSample=32, dwChannelMask=0x00000003, SubFormat=00000003-0000-0010-8000-00AA00389B71.
[FMOD] OutputWASAPI::init : Output buffer size: 1056 samples, latency: 0.00ms, period: 10.00ms, DSP buffer: 64 * 2
[FMOD] Thread::initThread : Init FMOD mixer thread. Affinity: 0x8000000000000001, Priority: 0xFFFF7FFA, Stack Size: 81920, Semaphore: No, Sleep Time: 0, Looping: Yes.

[Unity] DriverInfo WASAPI id = 0 / Speaker (Komplete Audio 2), Guid = 0f5612e2-300d-4e43-9f4d-6c060b515cd1, Systemrate = 48000, Speakermode = STEREO, channels = 2

reg_lists

When FMOD detects an error enumerating an ASIO device it no longer stops enumerating, however it will keep the failed device in the device list. The reason for this is sometimes devices are only in an error state temporarily due to mutual exclusion with another app or perhaps disconnected.

What you are seeing is a failure to enumerate the first device, the other devices likely enumerated fine since no further errors were displayed. Then FMOD will try and init using the first device (the one that failed) which fails again (the second instance of error 0x80040154), causing FMOD to switch to NO-SOUND mode.

Once initialized, calling setOutput ASIO will try to switch from NO-SOUND back to ASIO, however it will try that same failed device again and fallback to NO-SOUND again, Where you print out asioDriver: 1 it looks like you are actually printing out the number of NO-SOUND drivers (due to the fallback).

To access the other devices, I recommend you call System::setDriver and pick a different one before System::init. If you are in Unity you can add a custom handler script which we have an example for in the context of Oculus but could be tweaked for ASIO.

Additionally I’ll write up a task to have ASIO print out its device list as it enumerates them for debugging purposes.

Thanks for your reply but that didn’t worked.

That would works If coreSystem.getNumDrivers retrieves all output devices no matter which output type is,
But at least in Unity version [v2.01.11] it only retrieves current OUTPUTTYPE devices.
So in order to get other OUTPUTTYPE devices I had to call coreSystem.setOutput then coreSystem.getNumDrivers.

But here comes the problem as It enumerates and initialize and fallback in the same time when coreSystem.setOutput called, it simply returns NO-SOUND device.

[with working asio devices]

[FMOD] SystemI::setOutputInternal : Setting output to 'FMOD WASAPI Output'
[FMOD] OutputWASAPI::init : Mix Format (WAVEFORMATEX): wFormatTag=0xFFFE, nChannels=2, nSamplesPerSec=48000, nAvgBytesPerSec=384000, nBlockAlign=8, wBitsPerSample=32, cbSize=22.
[FMOD] OutputWASAPI::init : Mix Format (WAVEFORMATEXTENSIBLE): wValidBitsPerSample=32, dwChannelMask=0x00000003, SubFormat=00000003-0000-0010-8000-00AA00389B71.
[FMOD] OutputWASAPI::init : Output buffer size: 1056 samples, latency: 0.00ms, period: 10.00ms, DSP buffer: 64 * 2
[FMOD] Thread::initThread : Init FMOD mixer thread. Affinity: 0x8000000000000001, Priority: 0xFFFF7FFA, Stack Size: 81920, Semaphore: No, Sleep Time: 0, Looping: Yes.

[Unity] setOutput to AUTODETECT : OK
[Unity] getNumDrivers : 1
[Unity] getDriverInfo Loop Count = 1
[Unity] DriverInfo WASAPI id = 0 / Speaker (Komplete Audio 2), Guid = 0f5612e2-300d-4e43-9f4d-6c060b515cd1, Systemrate = 48000, Speakermode = STEREO, channels = 2

[FMOD] SystemI::setOutputInternal : Setting output to 'FMOD ASIO Output'
[FMOD] OutputASIO::init : DSP buffer size = 64 supported by ASIO driver, low latnecy mode enabled. 

[Unity] setOutput to ASIO : OK
[Unity] getNumDrivers : 2
[Unity] getDriverInfo Loop Count : 2
[Unity] DriverInfo ASIO id = 0 / Komplete Audio ASIO Driver, Guid = 1a6dd4e6-0947-4f56-b2d9-ed91a2a7d260, Systemrate = 48000, Speakermode = STEREO, channels = 2
[Unity] DriverInfo ASIO id = 1 / Realtek ASIO, Guid = a80362ff-ce76-4dd9-874a-704c57bf0d6a, Systemrate = 48000, Speakermode = STEREO, channels = 2

[with non-working asio devices]

[FMOD] SystemI::setOutputInternal : Setting output to 'FMOD WASAPI Output'
[FMOD] OutputWASAPI::init : Mix Format (WAVEFORMATEX): wFormatTag=0xFFFE, nChannels=2, nSamplesPerSec=48000, nAvgBytesPerSec=384000, nBlockAlign=8, wBitsPerSample=32, cbSize=22.
[FMOD] OutputWASAPI::init : Mix Format (WAVEFORMATEXTENSIBLE): wValidBitsPerSample=32, dwChannelMask=0x00000003, SubFormat=00000003-0000-0010-8000-00AA00389B71.
[FMOD] OutputWASAPI::init : Output buffer size: 1056 samples, latency: 0.00ms, period: 10.00ms, DSP buffer: 64 * 2
[FMOD] Thread::initThread : Init FMOD mixer thread. Affinity: 0x8000000000000001, Priority: 0xFFFF7FFA, Stack Size: 81920, Semaphore: No, Sleep Time: 0, Looping: Yes.

[Unity] setOutput to AUTODETECT : OK
[Unity] getNumDrivers : 1
[Unity] getDriverInfo Loop Count = 1
[Unity] DriverInfo WASAPI id = 0 / Speaker (Komplete Audio 2), Guid = 0f5612e2-300d-4e43-9f4d-6c060b515cd1, Systemrate = 48000, Speakermode = STEREO, channels = 2

[FMOD] SystemI::setOutputInternal : Setting output to 'FMOD ASIO Output'
[FMOD] OutputASIO::enumerate : CoCreateInstance returned 0x80040154 for driver 0.
[FMOD] OutputASIO::init : CoCreateInstance returned 0x80040154.

[FMOD] SystemI::setOutputInternal : Setting output to 'FMOD NoSound Output'
[FMOD] OutputNoSound::init : Initializing.
[FMOD] OutputNoSound::init : Done.

[Unity] setOutput to ASIO : OK
[Unity] getNumDrivers : 1
[Unity] getDriverInfo Loop Count : 1
[Unity] DriverInfo NOSOUND id = 0 / NoSound Driver, Guid = 00000000-0000-0000-0000-000000000000, Systemrate = 48000, Speakermode = STEREO, channels = 2

GetNumDrivers does indeed return the number of drivers for the currently selected output type, so if you want to see a list that includes ASIO devices and WASAPI devices you will need to call SetOutput to switch and enumerate each list. It’s important to do this enumeration before you Initialize the System, which with Unity happens automatically, so you need to put this code in a callback handler for PreInitialize or use a new (uninitialized) System object to build the list.

EDIT : It works and I was being idiot, works fine with disconnected device but halts when it mets invalid class.

EDIT2 : All drivers are listed up but still setOutput and setDriver returns NOSOUND or ERR_INVALID_PARAM, probably will works in same PreInitialize callback but what i am trying to do here was giving a sound output device option in game without requiring restart.

[PreInitialize-FMODCallback] DriverInfo WASAPI id = 0 / Realtek Digital Output(Realtek High Definition Audio), Guid = 0f22cb19-66b3-40f7-9224-90fcad979252, Systemrate = 48000, Speakermode = STEREO, channels = 2
[PreInitialize-FMODCallback] DriverInfo ASIO id = 0 / Komplete Audio ASIO Driver, Guid = 1a6dd4e6-0947-4f56-b2d9-ed91a2a7d260, Systemrate = 48000, Speakermode = STEREO, channels = 2
[PreInitialize-FMODCallback] DriverInfo ASIO id = 1 / Realtek ASIO, Guid = a80362ff-ce76-4dd9-874a-704c57bf0d6a, Systemrate = 48000, Speakermode = STEREO, channels = 2

[Unity] Request to setOutput : ASIO / OK
[Unity] Request to setDriver : 0 / OK / NOSOUND

[Unity] Request to setOutput : ASIO / OK
[Unity] Request to setDriver : 1 / ERR_INVALID_PARAM / NOSOUND

Unfortunately, adding PreInitialize Callback didn’t help either.

[FMOD] System::create : Header version = 2.01.11. Current version = 2.01.07.
[FMOD] SystemI::setOutputInternal : Setting output to 'FMOD WASAPI Output'

[PreInitialize-FMODCallback] Callback Start
[PreInitialize-FMODCallback] Current OutputDevices : 1

[FMOD] SystemI::setOutputInternal : Setting output to 'FMOD ASIO Output'
[FMOD] OutputASIO::enumerate : CLSIDFromString returned 0x800401F3.

[PreInitialize-FMODCallback] ASIO OutputDevices : 0
[PreInitialize-FMODCallback] Callback End

[FMOD] Manager::init : maxchannels = 2048 studioflags = 00000009 flags 00000000 extradriverdata 0000000000000000.
[FMOD] SystemI::init : Initialize version=20107 (113487), maxchannels=2048, flags=0x00030000

[FMOD] OutputASIO::enumerate : CLSIDFromString returned 0x800401F3.
[FMOD] OutputASIO::enumerate : CLSIDFromString returned 0x800401F3.

[FMOD] SystemI::close : Closed.

[FMOD] LiveUpdate::release : 
[FMOD] LiveUpdate::reset : Reset connection (reason Disconnected)

I see, the CLSIDFromString is currently considered fatal, this is something we can fix. Currently if there is a failure in the registry parsing bit the enumeration stops, we should be just moving onto the next device for that case (and excluding that device from the enumeration).

The issue with switching device and switching output plugin after init is when you call System::setOutput, we switch to device zero (which fails for your case and returns you to no sound). You don’t get an opportunity to switch to device 1 or 2 (which you know works). This is a bit tricky and isn’t a case we’ve encountered before, usually people choose their output plugin up-front then just switch devices as needed.

Perhaps the ability to switch output and driver index in one go would help here?

Oh, I see. Thank you for your clarification.

That would be nice to have.