0
0

Hi all,

I’m using a system with 14 speakers and trying to assign a mono sound to only play out of an arbitrary speaker.

To start off, I’m using speakermode_raw and outputtype_asio because I’m using a fireface 800 to run the multispeaker setup. I’ve used setSoftwareFormat to make sure that numOutputChannels is 14 . . . like so:

[code:22raps1n]
result = system.setSpeakerMode(FMOD.SPEAKERMODE.RAW);
ERRCHECK(result);

        result = system.setOutput(FMOD.OUTPUTTYPE.ASIO);
        ERRCHECK(result);

        result = system.setSoftwareFormat(48000, FMOD.SOUND_FORMAT.PCM16, numSpeakers, numSpeakers, FMOD.DSP_RESAMPLER.LINEAR);
        ERRCHECK(result);

[/code:22raps1n]

I’m then allowing the user to click on a button per speaker (just like a speaker test). I’m looping through the speakers one at a time and setting their volumes to either full or zero using setSpeakerLevels. It looks like this: (numSpeakers is set to 14)

[code:22raps1n]
result = system.playSound(FMOD.CHANNELINDEX.FREE, sound1, true, ref channel);
ERRCHECK(result);

        for (int i=0; i <numSpeakers; i++) 
        {
            if (button.Name == ("speaker" + (i+1).ToString()))
            {
                volumes[0] = 1.0f;
            } else
            {
                volumes[0] = 0.0f;
            }
            result = channel.setSpeakerLevels((FMOD.SPEAKER)i, volumes, 1);
            ERRCHECK(result);
        }

        result = channel.setPaused(false);
        ERRCHECK(result);

[/code:22raps1n]

The weird issue I’m getting is that when I play through speaker 1, I also get speakers 9, 11 and 13 playing. Also, when playing through speaker 2, I get 2, 10,12 and 14. Speakers 3-8 isolate perfectly and speakers 9-14 don’t play anything if I try to isolate to just them. I’ve checked my loop using console output and the volume levels it’s trying to set are definitely correct.

Is there something I’m missing that’s causing this weird behaviour?

  • You must to post comments
0
0

All channels except for channel 9 work fine, so yes you would be fine to get 15 channels out of a 16 channel sound card.

Adam

  • You must to post comments
0
0

well, there should not be a limitation on speaker 9 with my bugfix above. I would have expected a limitation at speaker 16 or something like that.
WIth this 10 channeled sound card over here it works pretty well. Let me explain what it does a bit more deeply:

channel –> mapped channel
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 9
9 10
10 11
11 12
12 13
13 14
14 15
15 16

that means if you want to control channel 1 you control channel 1, but if you want to control channel 8 you control channel 9. That means that is a shift by one to work around the issue. Actually, you need to take it in account whenever you setup anything for speakers in fmod. The remapping seems to work ok for me. As I said I don’t know how it works with more than 10 channels.

  • You must to post comments
0
0

Hey adam7th,

did you try out my bugfix code?
I have had only the chance to test it on a sound card with 10 channels. I’d be interessted if it works on 16 as well.

TIA
Martin

  • You must to post comments
0
0

I didn’t actually try the ‘shift by 1’ mapping.
I was simply referring to the fact that I am seeing audio on channels 1-8 and 10-16 when using ‘standard’ mapping. I would expect that if we shifted it we would get only channel 16 missing, but I need 16 channels of audio so this is not a solution for me.

  • You must to post comments
0
0

Any chance of some help on this?

Has anyone tried to use more than 8 channels and gotten the same issues?

  • You must to post comments
0
0

Hi Guys,

Just an update, this issue was cause by the fact that FMOD_SPEAKER_NULL had the value of 8 (the 9th speaker). The value for FMOD_SPEAKER_NULL has been changed in the latest version (4.37.04) so now all 16 channels can be mapped to when using ASIO.

  • You must to post comments
0
0

This is just a guess, but it might be a casting issue. You’re currently casting to FMOD.SPEAKER, which is just a bitwise enumerator for different speaker configuration:

typedef enum {
FMOD_SPEAKER_FRONT_LEFT,
FMOD_SPEAKER_FRONT_RIGHT,
FMOD_SPEAKER_FRONT_CENTER,
FMOD_SPEAKER_LOW_FREQUENCY,
FMOD_SPEAKER_BACK_LEFT,
FMOD_SPEAKER_BACK_RIGHT,
FMOD_SPEAKER_SIDE_LEFT,
FMOD_SPEAKER_SIDE_RIGHT,
FMOD_SPEAKER_MAX,
FMOD_SPEAKER_MONO,
FMOD_SPEAKER_NULL,
FMOD_SPEAKER_SBL,
FMOD_SPEAKER_SBR
} FMOD_SPEAKER;

As you can see, after 8, it goes into other types of configs. Try taking the casting out.

  • You must to post comments
0
0

Hi CuriousG, thanks for replying :)

I had a look through the Fmod Ex API which suggests that an int cast to this value type will allow me to address speakers up to 15.

Also if I don’t explicitly cast to FMOD.SPEAKER, then it won’t compile.

So I guess I’m still stuck for now.

  • You must to post comments
0
0

You are right to force cast with an integer, that’s what you do in RAW speakermode.

The part you are probably missing is FMOD_ADVANCEDSETTINGS to check the speaker map

See
[code:113ghco1]
int ASIONumChannels; /* [r/w] Optional. Specify 0 to ignore. Number of channels available on the ASIO device. */
char **ASIOChannelList; /* [r/w] Optional. Specify 0 to ignore. Pointer to an array of strings (number of entries defined by ASIONumChannels) with ASIO channel names. */
FMOD_SPEAKER *ASIOSpeakerList; /* [r/w] Optional. Specify 0 to ignore. Pointer to a list of speakers that the ASIO channels map to. This can be called after System::init to remap ASIO output. */
[/code:113ghco1]

  • You must to post comments
0
0

Awesome . . . thanks for your help.

I set the advanced settings and now I’m able to address speakers individually up to the 14 that I have.

The only strange thing is that channel 9 doesn’t seem to output anything. Is there something special about FMOD_SPEAKER 9 that could make it silent by default?

  • You must to post comments
0
0

How did you fix up the speaker9 issue?
Mapping the upper speakers to the corresponding speaker ID is sufficient to enable all RAW Speakers, but speaker9 is still not playing. I’s always silent. Has anyone an idea?

TIA
Martin

  • You must to post comments
0
0

I found the issue :) The problem is that FMOD_SPEAKER_MAX/FMOD_SPEAKER_NOSPEAKER is enum 8. That means an output at channel 8 is probably not valid.
Eventually, I’ve found a workaround. The idea is to leave channel 8 out of the scope. So we move the channel up just by one channel. After that you’ll need to take this change in the bahaviour in account. That means everytime you want to "talk" to channel 8 you’ll need to use channel 9.

[code]
system->getAdvancedSettings( &adv_settings ) ;
/** output speaker mapping */
int * speakerlist = new int[adv_settings.ASIONumChannels];

for( int speaker=0; speaker < adv_settings.ASIONumChannels; speaker++ )
{
speakerlist[speaker] = speaker + (speaker>=FMOD_SPEAKER_MAX?1:0);
}
adv_settings.ASIOSpeakerList = (FMOD_SPEAKER*)speakerlist;
system->setAdvancedSettings(&adv_settings);
[/code]

  • You must to post comments
0
0

Hi All,
I have just run across this problem now.
My problem is that I need all 16 channels though!

Brett, any chance that this can be fixed?

Thanks
Adam

  • You must to post comments
Showing 13 results
Your Answer

Please first to submit.