void Sound::Initialize() { FMOD_RESULT result = FMOD_OK; result = FMOD_System_Create(&fmodSystem); check_error(result); unsigned int version; result = FMOD_System_GetVersion(fmodSystem, &version); check_error(result); if(version < FMOD_VERSION) { LOG_ISSUE("AUDIO ERROR: fmodex.dll is an older version than needed. " "FMOD version should be at least %u.", FMOD_VERSION); } int numDrivers; result = FMOD_System_GetNumDrivers(fmodSystem, &numDrivers); check_error(result); if(numDrivers == 0) { result = FMOD_System_SetOutput(fmodSystem, FMOD_OUTPUTTYPE_NOSOUND); check_error(result); } else { FMOD_CAPS capabilities; FMOD_SPEAKERMODE speakerMode; result = FMOD_System_GetDriverCaps(fmodSystem, 0, &capabilities, nullptr, &speakerMode); check_error(result); result = FMOD_System_SetSpeakerMode(fmodSystem, speakerMode); check_error(result); // if hardware acceleration is not available, // extend the buffer size to make sure there is enough room if(capabilities & FMOD_CAPS_HARDWARE_EMULATED) { result = FMOD_System_SetDSPBufferSize(fmodSystem, 1024, 10); check_error(result); } char name[256]; result = FMOD_System_GetDriverInfo(fmodSystem, 0, name, 256, nullptr); check_error(result); // SigmaTel sound devices crackle when the sound format is PCM 16-bit // PCM Floating-Point seems to fix it if(strstr(name, "SigmaTel")) { result = FMOD_System_SetSoftwareFormat(fmodSystem, 48000, FMOD_SOUND_FORMAT_PCMFLOAT, 0, 0, FMOD_DSP_RESAMPLER_LINEAR); check_error(result); } } result = FMOD_System_Init(fmodSystem, MAX_CHANNELS, FMOD_INIT_NORMAL, 0); check_error(result); result = FMOD_System_CreateSoundGroup(fmodSystem, "Music", &musicGroup); check_error(result); result = FMOD_System_CreateSoundGroup(fmodSystem, "Sound Effects", &noiseGroup); check_error(result); numSounds = 0; for(int i = 0; i < MAX_SOUNDS; i++) sounds[i] = nullptr; }
int main(int argc, char * argv[]) { FMOD_SYSTEM *system; FMOD_SOUND *sound1, *sound2, *sound3; FMOD_SOUNDGROUP *soundgroup; FMOD_CHANNEL *channel[3]; FMOD_RESULT result; int key=0; int mode=1; unsigned int version; printf("======================================================================\n"); printf("soundgroups Example. Copyright (c) Firelight Technologies 2004-2011.\n"); printf("======================================================================\n"); printf("This example plays 3 sounds in a sound group, demonstrating the effect\n"); printf("of the three different sound group behavior modes\n"); printf("======================================================================\n\n"); /* Create a System object and initialize. */ result = FMOD_System_Create(&system); ERRCHECK(result); result = FMOD_System_GetVersion(system, &version); ERRCHECK(result); if (version < FMOD_VERSION) { printf("Error! You are using an old version of FMOD %08x. This program requires %08x\n", version, FMOD_VERSION); return 0; } result = FMOD_System_Init(system, 100, FMOD_INIT_NORMAL, 0); ERRCHECK(result); /* Load some sound files from the hard disk. */ result = FMOD_System_CreateSound(system, "../media/drumloop.wav", FMOD_HARDWARE | FMOD_LOOP_NORMAL, 0, &sound1); ERRCHECK(result); result = FMOD_System_CreateSound(system, "../media/jaguar.wav", FMOD_HARDWARE | FMOD_LOOP_NORMAL, 0, &sound2); ERRCHECK(result); result = FMOD_System_CreateSound(system, "../media/swish.wav", FMOD_HARDWARE | FMOD_LOOP_NORMAL, 0, &sound3); ERRCHECK(result); /* Create the sound group with the following attributes: Name = MyGroup MaxAudible = 1 Behavior = Mute */ result = FMOD_System_CreateSoundGroup(system, "MyGroup", &soundgroup); ERRCHECK(result); result = FMOD_SoundGroup_SetMaxAudible(soundgroup, 1); ERRCHECK(result); result = FMOD_SoundGroup_SetMaxAudibleBehavior(soundgroup, FMOD_SOUNDGROUP_BEHAVIOR_MUTE); ERRCHECK(result); result = FMOD_SoundGroup_SetMuteFadeSpeed(soundgroup, 2); ERRCHECK(result); /* Put the sounds in the sound group */ result = FMOD_Sound_SetSoundGroup(sound1, soundgroup); ERRCHECK(result); result = FMOD_Sound_SetSoundGroup(sound2, soundgroup); ERRCHECK(result); result = FMOD_Sound_SetSoundGroup(sound3, soundgroup); ERRCHECK(result); /* Play the sounds (two will be muted because of the behavior mode) */ result = FMOD_System_PlaySound(system, FMOD_CHANNEL_FREE, sound1, FALSE, &channel[0]); ERRCHECK(result); result = FMOD_System_PlaySound(system, FMOD_CHANNEL_FREE, sound2, FALSE, &channel[1]); ERRCHECK(result); result = FMOD_System_PlaySound(system, FMOD_CHANNEL_FREE, sound3, FALSE, &channel[2]); ERRCHECK(result); /* Display help */ printf("=========================================================================\n"); printf("Press 1 BEAVIOR_FAIL \n"); printf(" 2 BEAVIOR_MUTE \n"); printf(" 3 BEAVIOR_STEALLOWEST\n"); printf(" Q Play/stop drumloop sound\n"); printf(" W Play/stop Jaguar sound\n"); printf(" E Play/stop shwish sound\n"); printf(" ESC Quit\n"); printf("=========================================================================\n"); do { float audibility; int index; if( _kbhit()) { key = _getch(); if( key=='1' ) { result = FMOD_SoundGroup_SetMaxAudibleBehavior(soundgroup, FMOD_SOUNDGROUP_BEHAVIOR_FAIL); ERRCHECK(result); } if( key=='2' ) { result = FMOD_SoundGroup_SetMaxAudibleBehavior(soundgroup, FMOD_SOUNDGROUP_BEHAVIOR_MUTE); ERRCHECK(result); } if( key=='3' ) { result = FMOD_SoundGroup_SetMaxAudibleBehavior(soundgroup, FMOD_SOUNDGROUP_BEHAVIOR_STEALLOWEST); ERRCHECK(result); } if( key=='q' ) { result = FMOD_Channel_GetIndex(channel[0],&index); if (!index) { result = FMOD_System_PlaySound(system, FMOD_CHANNEL_FREE, sound1, FALSE, &channel[0]); if (result!=FMOD_ERR_MAXAUDIBLE) { ERRCHECK(result); } } else { result = FMOD_Channel_Stop(channel[0]); ERRCHECK(result); } } if( key=='w' ) { result = FMOD_Channel_GetIndex(channel[1],&index); if (!index) { result = FMOD_System_PlaySound(system, FMOD_CHANNEL_FREE, sound2, FALSE,&channel[1]); if (result!=FMOD_ERR_MAXAUDIBLE) { ERRCHECK(result); } } else { result = FMOD_Channel_Stop(channel[1]); ERRCHECK(result); } } if( key=='e' ) { result = FMOD_Channel_GetIndex(channel[2],&index); if (!index) { result = FMOD_System_PlaySound(system, FMOD_CHANNEL_FREE, sound3, FALSE,&channel[2]); if (result!=FMOD_ERR_MAXAUDIBLE) { ERRCHECK(result); } } else { result = FMOD_Channel_Stop(channel[2]); ERRCHECK(result); } } } // print out a small visual display { char s[80]; char s1[6]; char s2[3][6]; int i; FMOD_SOUNDGROUP_BEHAVIOR behavior; FMOD_SoundGroup_GetMaxAudibleBehavior(soundgroup, &behavior); switch (behavior) { case FMOD_SOUNDGROUP_BEHAVIOR_FAIL : { sprintf(s1,"FAIL"); break; } case FMOD_SOUNDGROUP_BEHAVIOR_MUTE : { sprintf(s1,"MUTE"); break; } case FMOD_SOUNDGROUP_BEHAVIOR_STEALLOWEST : { sprintf(s1,"STEAL"); break; } }; for (i=0; i<3; i++) { FMOD_Channel_GetAudibility(channel[i], &audibility); if (!audibility) { result = FMOD_Channel_GetIndex(channel[i], &index); if (!index) { sprintf(s2[i], "STOP"); } else { sprintf(s2[i], "MUTE"); } } else { sprintf(s2[i], "PLAY"); } } sprintf(s, "MODE:%6s | SOUND1: %s | SOUND2: %s | SOUND3: %s |", s1, s2[0], s2[1], s2[2]); printf("%s\r", s); } result = FMOD_System_Update(system); ERRCHECK(result); Sleep(10); }while (key!=27); return 0; }