// this should only be called once per device void ofMultiDeviceSoundPlayer::initializeFmodWithTargetDevice(int deviceIndex) { if(!sys_Array_init[deviceIndex]){ FMOD_System_Create(&sys_Array[deviceIndex]); int driverNum; FMOD_System_GetNumDrivers(sys_Array[deviceIndex], &driverNum); for(int i=0; i<driverNum; i++) { char name[256]; FMOD_System_GetDriverName(sys_Array[deviceIndex], i, name, 256); printf("%d : %s\n", i, name); } FMOD_System_SetDriver(sys_Array[deviceIndex], deviceIndex); FMOD_System_Init(sys_Array[deviceIndex], 2000, FMOD_INIT_NORMAL, NULL); //do we want just 32 channels? FMOD_System_GetMasterChannelGroup(sys_Array[deviceIndex], &channel_Array[deviceIndex]); sys_Array_init[deviceIndex] = true; } }
int main(int argc, char *argv[]) { FMOD_SYSTEM *system = 0; FMOD_SOUND *sound = 0; FMOD_CHANNEL *channel = 0; FMOD_RESULT result; FMOD_CREATESOUNDEXINFO exinfo; int key, driver, numdrivers, count, outputfreq, bin; unsigned int version; /* 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; } /* System initialization */ printf("---------------------------------------------------------\n"); printf("Select OUTPUT type\n"); printf("---------------------------------------------------------\n"); printf("1 : DirectSound\n"); printf("2 : Windows Multimedia WaveOut\n"); printf("3 : ASIO\n"); printf("---------------------------------------------------------\n"); printf("Press a corresponding number or ESC to quit\n"); do { key = getch(); } while (key != 27 && key < '1' && key > '5'); switch (key) { case '1' : result = FMOD_System_SetOutput(system, FMOD_OUTPUTTYPE_DSOUND); break; case '2' : result = FMOD_System_SetOutput(system, FMOD_OUTPUTTYPE_WINMM); break; case '3' : result = FMOD_System_SetOutput(system, FMOD_OUTPUTTYPE_ASIO); break; default : return 1; } ERRCHECK(result); /* Enumerate playback devices */ result = FMOD_System_GetNumDrivers(system, &numdrivers); ERRCHECK(result); printf("---------------------------------------------------------\n"); printf("Choose a PLAYBACK driver\n"); printf("---------------------------------------------------------\n"); for (count=0; count < numdrivers; count++) { char name[256]; result = FMOD_System_GetDriverName(system, count, name, 256); ERRCHECK(result); printf("%d : %s\n", count + 1, name); } printf("---------------------------------------------------------\n"); printf("Press a corresponding number or ESC to quit\n"); do { key = getch(); if (key == 27) { return 0; } driver = key - '1'; } while (driver < 0 || driver >= numdrivers); result = FMOD_System_SetDriver(system, driver); ERRCHECK(result); /* Enumerate record devices */ result = FMOD_System_GetRecordNumDrivers(system, &numdrivers); ERRCHECK(result); printf("---------------------------------------------------------\n"); printf("Choose a RECORD driver\n"); printf("---------------------------------------------------------\n"); for (count=0; count < numdrivers; count++) { char name[256]; result = FMOD_System_GetRecordDriverName(system, count, name, 256); ERRCHECK(result); printf("%d : %s\n", count + 1, name); } printf("---------------------------------------------------------\n"); printf("Press a corresponding number or ESC to quit\n"); do { key = getch(); if (key == 27) { return 0; } driver = key - '1'; } while (driver < 0 || driver >= numdrivers); printf("\n"); result = FMOD_System_SetRecordDriver(system, driver); ERRCHECK(result); result = FMOD_System_SetSoftwareFormat(system, OUTPUTRATE, FMOD_SOUND_FORMAT_PCM16, 1, 0); ERRCHECK(result); result = FMOD_System_Init(system, 32, FMOD_INIT_NORMAL, NULL); ERRCHECK(result); FMOD_System_GetSoftwareFormat(system, &outputfreq, 0, 0, 0, 0); ERRCHECK(result); /* Create a sound to record to. */ memset(&exinfo, 0, sizeof(FMOD_CREATESOUNDEXINFO)); exinfo.cbsize = sizeof(FMOD_CREATESOUNDEXINFO); exinfo.numchannels = 1; exinfo.format = FMOD_SOUND_FORMAT_PCM16; exinfo.defaultfrequency = OUTPUTRATE; exinfo.length = exinfo.defaultfrequency * sizeof(short) * exinfo.numchannels * 5; result = FMOD_System_CreateSound(system, 0, FMOD_2D | FMOD_SOFTWARE | FMOD_LOOP_NORMAL | FMOD_OPENUSER, &exinfo, &sound); ERRCHECK(result); /* Start the interface */ printf("=========================================================================\n"); printf("Pitch detection example. Copyright (c) Firelight Technologies 2004-2005.\n"); printf("=========================================================================\n"); printf("\n"); printf("Record something through the selected recording device and FMOD will\n"); printf("Determine the pitch. Sustain the tone for at least a second to get an\n"); printf("accurate reading.\n"); printf("Press 'Esc' to quit\n"); printf("\n"); result = FMOD_System_RecordStart(system, sound, TRUE); ERRCHECK(result); Sleep(200); /* Give it some time to record something */ result = FMOD_System_PlaySound(system, FMOD_CHANNEL_REUSE, sound, FALSE, &channel); ERRCHECK(result); /* Dont hear what is being recorded otherwise it will feedback. Spectrum analysis is done before volume scaling in the DSP chain */ result = FMOD_Channel_SetVolume(channel, 0); ERRCHECK(result); bin = 0; /* Main loop. */ do { static float spectrum[SPECTRUMSIZE]; float dominanthz = 0; float max; int dominantnote = 0; float binsize = BINSIZE; if (kbhit()) { key = getch(); } result = FMOD_Channel_GetSpectrum(channel, spectrum, SPECTRUMSIZE, 0, FMOD_DSP_FFT_WINDOW_TRIANGLE); ERRCHECK(result); max = 0; for (count = 0; count < SPECTRUMSIZE; count++) { if (spectrum[count] > 0.01f && spectrum[count] > max) { max = spectrum[count]; bin = count; } } dominanthz = (float)bin * BINSIZE; /* dominant frequency min */ dominantnote = 0; for (count = 0; count < 120; count++) { if (dominanthz >= notefreq[count] && dominanthz < notefreq[count + 1]) { /* which is it closer to. This note or the next note */ if (fabs(dominanthz - notefreq[count]) < fabs(dominanthz - notefreq[count+1])) { dominantnote = count; } else { dominantnote = count + 1; } break; } } printf("Detected rate : %7.1f -> %7.1f hz. Detected musical note. %-3s (%7.1f hz)\r", dominanthz, ((float)bin + 0.99f) * BINSIZE, note[dominantnote], notefreq[dominantnote]); FMOD_System_Update(system); Sleep(10); } while (key != 27); printf("\n"); /* Shut down */ result = FMOD_Sound_Release(sound); ERRCHECK(result); result = FMOD_System_Release(system); ERRCHECK(result); return 0; }
int main(int argc, char *argv[]) { FMOD_SYSTEM *systemA, *systemB; FMOD_SOUND *soundA, *soundB; FMOD_CHANNEL *channelA = 0, *channelB = 0; FMOD_RESULT result; int key, count, numdrivers, driver; unsigned int version; /* Create Sound Card A */ result = FMOD_System_Create(&systemA); ERRCHECK(result); result = FMOD_System_GetVersion(systemA, &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_GetNumDrivers(systemA, &numdrivers); ERRCHECK(result); printf("---------------------------------------------------------\n"); printf("Select soundcard A\n"); printf("---------------------------------------------------------\n"); for (count=0; count < numdrivers; count++) { char name[256]; result = FMOD_System_GetDriverName(systemA, count, name, 256); ERRCHECK(result); printf("%d : %s\n", count + 1, name); } printf("---------------------------------------------------------\n"); printf("Press a corresponding number or ESC to quit\n"); do { key = getch(); if (key == 27) { return 0; } driver = key - '1'; } while (driver < 0 || driver >= numdrivers); printf("\n"); result = FMOD_System_SetDriver(systemA, driver); ERRCHECK(result); result = FMOD_System_Init(systemA, 32, FMOD_INIT_NORMAL, NULL); ERRCHECK(result); /* Create Sound Card B */ result = FMOD_System_Create(&systemB); ERRCHECK(result); result = FMOD_System_GetVersion(systemB, &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_GetNumDrivers(systemB, &numdrivers); ERRCHECK(result); printf("---------------------------------------------------------\n"); printf("Select soundcard B\n"); printf("---------------------------------------------------------\n"); for (count=0; count < numdrivers; count++) { char name[256]; result = FMOD_System_GetDriverName(systemA, count, name, 256); ERRCHECK(result); printf("%d : %s\n", count + 1, name); } printf("---------------------------------------------------------\n"); printf("Press a corresponding number or ESC to quit\n"); do { key = getch(); if (key == 27) { return 0; } driver = key - '1'; } while (driver < 0 || driver >= numdrivers); printf("\n"); result = FMOD_System_SetDriver(systemB, driver); ERRCHECK(result); result = FMOD_System_Init(systemB, 32, FMOD_INIT_NORMAL, NULL); ERRCHECK(result); /* Load 1 sample into each soundcard. */ result = FMOD_System_CreateSound(systemA, "../media/drumloop.wav", FMOD_HARDWARE, 0, &soundA); ERRCHECK(result); result = FMOD_Sound_SetMode(soundA, FMOD_LOOP_OFF); ERRCHECK(result); result = FMOD_System_CreateSound(systemB, "../media/jaguar.wav", FMOD_HARDWARE, 0, &soundB); ERRCHECK(result); printf("===========================================================================\n"); printf("MultipleSoundCard Example. Copyright (c) Firelight Technologies 2004-2005.\n"); printf("===========================================================================\n"); printf("\n"); printf("Press '1' to play a sound on soundcard A\n"); printf("Press '2' to play a sound on soundcard B\n"); printf("Press 'Esc' to quit\n"); printf("\n"); /* Main loop. */ do { int channelsplayingA = 0; int channelsplayingB = 0; if (kbhit()) { key = getch(); switch (key) { case '1' : { result = FMOD_System_PlaySound(systemA, FMOD_CHANNEL_FREE, soundA, 0, &channelA); ERRCHECK(result); break; } case '2' : { result = FMOD_System_PlaySound(systemB, FMOD_CHANNEL_FREE, soundB, 0, &channelB); ERRCHECK(result); break; } } } FMOD_System_Update(systemA); FMOD_System_Update(systemB); FMOD_System_GetChannelsPlaying(systemA, &channelsplayingA); FMOD_System_GetChannelsPlaying(systemB, &channelsplayingB); printf("Channels Playing on A %2d. Channels Playing on B %2d.\r", channelsplayingA, channelsplayingB); Sleep(10); } while (key != 27); printf("\n"); /* Shut down */ result = FMOD_Sound_Release(soundA); ERRCHECK(result); result = FMOD_System_Close(systemA); ERRCHECK(result); result = FMOD_System_Release(systemA); ERRCHECK(result); result = FMOD_Sound_Release(soundB); ERRCHECK(result); result = FMOD_System_Close(systemB); ERRCHECK(result); result = FMOD_System_Release(systemB); ERRCHECK(result); return 0; }