4.06.15 worked, 4.16.07 does not
4.07 was the oldest version I could find that didnt work either

My situation is this:

I am using ASIO output, with 10 channels, in speakermode RAW

(below I refer to speaker numbers as zero based, not 1 based)

I modified a version of the multispeakeroutput example code to use setSpeakerLevels instead of setSpeakerMix

If I play a sound set the speakerlevels for speaker 2 to 1.0,1.0, and the rest to 0.0,0.0 — it works fine

If I do it for speaker 3, also works fine.. same for 4,5,6, and 7

If I do it for 8 and 9, I get nothing. No sound at all.

If I do it for 0, I get output on the 0th speaker, and also on the 8th speaker
If I do it for 1, I get output on the 1st speaker, and also on the 9th speaker

So setspeakerlevels is breaking for me on 0,1,8,9

This did not happen with 4.06 at all — it just worked properly there.

I am doing this on Windows right now. My code runs on both Linux and Windows, and in the past I have found FMOD bugs related to the assumption that > 6 channels means surround71 (but only in the ALSA FMOD code). (see for more info on that issue)

I’m wondering if something like this got introduced in the last 10 versions of FMOD Ex, in the common or ASIO codebase….

An example of my code can be found in an earlier posting I made a couple of years ago:

Even tho that posting is about the above mentioned ALSA/FMOD issues, the code is the same as what I use on Windows.

Once again, something has changed in FMOD to cause this to stop working, because if i just recompile my modified multispeakeroutput code with FMOD Ex 4.06.15, it works fine.

Any ideas? Any ideas on how I can diagnose? I’m pretty familar with the codebase so if you want me to get more info, I can do so

Also, I’m upgrading because I’m using FMOD’s callback system and ran into bugs with it on 4.06. 4.16.07 does not exhibit those bugs, and given that the FMOD team doesnt seem to like to support very old versions, I figured I’d move on instead of asking for a bugfix on 4.06

  • You must to post comments

So I found one fix.. looks like there is a default order of ASIO speakers now in the code, and it sadly stops at 8.

This seems to break a lot in FMOD. I realize that not many people are using FMOD to do 10 channel audio, but I would greatly appreciate it if you could keep me in mind when making changes to ASIO and multiple channel audio :-)

I got more playing working by doing this (but see the bottom of this post for more info on why it doesnt fully work):

int[] speakerlist = new int[] {
unsafe {
fixed(int *i = speakerlist) {
settings.cbsize = 0;
settings.maxMPEGcodecs = 0;
settings.maxADPCMcodecs = 0;
settings.maxXMAcodecs = 0;
settings.maxPCMcodecs = 0;
settings.ASIOChannelList = IntPtr.Zero;
settings.max3DReverbDSPs = 0;
settings.HRTFMinAngle = 0;
settings.HRTFMaxAngle = 0;
settings.HRTFFreq = 0;
settings.vol0virtualvol = 0;
settings.eventqueuesize = 0;
settings.defaultDecodeBufferSize = 0;
settings.debugLogFilename = IntPtr.Zero;
settings.profileport = 0;

                settings.cbsize = 66;
                settings.ASIONumChannels = 10;
                settings.ASIOSpeakerList = new IntPtr((void*)i);

                result = system.setAdvancedSettings(ref settings);


it also required a patch to fmod.cs:

[code:3e04um2z]— fmod.cs 2008-07-24 16:00:04.000000000 -0400
+++ newfmod.cs 2008-07-31 01:47:15.453125000 -0400
@@ -1603,7 +1603,8 @@
+ [StructLayout(LayoutKind.Sequential)]
+ public struct ADVANCEDSETTINGS
public int cbsize; /
Size of structure. Use sizeof(FMOD_ADVANCEDSETTINGS) /
public int maxMPEGcodecs; /
For use with FMOD_CREATECOMPRESSEDSAMPLE only. Mpeg codecs consume 48,696 per instance and this number will determine how many mpeg channels can be played simultaneously. Default = 16. /
@@ -1620,6 +1621,8 @@
public float vol0virtualvol; /
[in/out] For use with FMOD_INIT_VOL0_BECOMES_VIRTUAL. If this flag is used, and the volume is 0.0, then the sound will become virtual. Use this value to raise the threshold to a different point where a sound goes virtual. /
public int eventqueuesize; /
[in/out] Optional. Specify 0 to ignore. For use with FMOD Event system only. Specifies the number of slots available for simultaneous non blocking loads. Default = 32. /
public uint defaultDecodeBufferSize; /
[in/out] Optional. Specify 0 to ignore. For streams. This determines the default size of the double buffer (in milliseconds) that a stream uses. Default = 400ms /
+ public IntPtr debugLogFilename; /
[in/out] Optional. Specify 0 to ignore. Gives fmod’s logging system a path/filename. Normally the log is placed in the same directory as the executable and called fmod.log. When using System::getAdvancedSettings, provide at least 256 bytes of memory to copy into. /
+ public short profileport; /
[in/out] Optional. Specify 0 to ignore. For use with FMOD_INIT_ENABLE_PROFILE. Specify the port to listen on for connections by the profiler application. */


Now, that makes speakers 0,1, and 9 play properly, but speaker 8 is still not doing anything

I reordered the ASIO speaker numbers and I can actually get sound outputted from the second to last speaker, I just can’t get it to happen if its in the speakerlist[8] slot of the array.

Weird eh? This is just screaming FMOD 8 channel max assumption.. any ideas?

  • You must to post comments
Showing 1 result
Your Answer

Please first to submit.