/*===============================================================================================
MULTIPLE.EXE
Copyright (c), Firelight Technologies Pty, Ltd 1999-2004.
This example demonstrates how to use dynamic loading of fmod.dll to achieve multiple soundcard
output at the same time. If you do not have 2 soundcards you will have to select the same
device twice.
Besides this, it is a good helper to display how fmod.dll can be loaded dynamically without
having to link an import library.
IMPORTANT!!! You must copy fmod.dll to fmod2.dll or libfmod-3.63.so to libfmod-3.63_2.so to
avoid operating systems caching the dll!
===============================================================================================*/
/**
* I've ported the C++ FMOD example to use it with NativeFmod
*
* @author J�r�me JOUVIE (Jouvieje)
*
* WANT TO CONTACT ME ?
* E-mail :
* jerome.jouvie@gmail.com
* My web sites :
* http://jerome.jouvie.free.fr/
*/
package org.jouvieje.Fmod.Examples;
import java.nio.ByteBuffer;
import javax.swing.JPanel;
import org.jouvieje.Fmod.Fmod;
import org.jouvieje.Fmod.Init;
import org.jouvieje.Fmod.Defines.FSOUND_INIT_FLAGS;
import org.jouvieje.Fmod.Defines.FSOUND_MISC_VALUES;
import org.jouvieje.Fmod.Defines.FSOUND_MODES;
import org.jouvieje.Fmod.Defines.INIT_MODES;
import org.jouvieje.Fmod.Defines.VERSIONS;
import org.jouvieje.Fmod.Enumerations.FSOUND_OUTPUTTYPES;
import org.jouvieje.Fmod.Examples.Util.ConsoleGUI;
import org.jouvieje.Fmod.Examples.Util.FmodExampleFrame;
import org.jouvieje.Fmod.Examples.Util.Medias;
import org.jouvieje.Fmod.Exceptions.InitException;
import org.jouvieje.Fmod.Structures.FSOUND_SAMPLE;
import org.jouvieje.FmodDyn.FMOD_INSTANCE;
import org.jouvieje.FmodDyn.FmodDyn;
import org.jouvieje.libloader.LibLoader;
public class Multiple extends ConsoleGUI implements FSOUND_OUTPUTTYPES, FSOUND_INIT_FLAGS, FSOUND_MODES, FSOUND_MISC_VALUES, VERSIONS {
private static final long serialVersionUID = 1L;
public static void main(String[] args) {
new FmodExampleFrame(new Multiple());
}
public Multiple() {
super();
initFmod();
initialize();
}
public JPanel getPanel() {
return this;
}
public String getTitle() {
return "FMOD Multiple example.";
}
//two instances of fmod
private FMOD_INSTANCE fmod1;
private FMOD_INSTANCE fmod2;
//sample used
private FSOUND_SAMPLE samp1;
private FSOUND_SAMPLE samp2;
private boolean init = false;
private boolean deinit = false;
private ByteBuffer sampBuff = null;
public void initFmod() {
/*
* NativeFmod Init
*/
try {
Init.loadLibraries(INIT_MODES.INIT_FMOD_DYN);
}
catch(InitException e) {
printExit("NativeFmod error! " + e.getMessage() + "\n");
return;
}
/*
* Checking NativeFmodEx version
*/
if(NATIVEFMOD_LIBRARY_VERSION != NATIVEFMOD_JAR_VERSION) {
printExit("Error! NativeFmod library version (" + NATIVEFMOD_LIBRARY_VERSION
+ ") is different to jar version (" + NATIVEFMOD_JAR_VERSION + ")\n");
return;
}
init = true;
}
public void run() {
if(!init) {
return;
}
String FMOD_LIB = "", FMOD_LIB2 = "";
switch (LibLoader.getPlatform()) {
case LibLoader.PLATFORM_WINDOWS:
if(LibLoader.isWindowsCE()) {
FMOD_LIB = "fmodce.dll";
FMOD_LIB2 = "fmodce2.dll";
}
else {
FMOD_LIB = "fmod.dll";
FMOD_LIB2 = "fmod2.dll";
}
break;
case LibLoader.PLATFORM_LINUX:
FMOD_LIB = "libfmod-3.75.so";
FMOD_LIB2 = "libfmod-3.75_2.so";
break;
case LibLoader.PLATFORM_MACOSX:
printExit("This example does not support Mac.");
return;
default:
printExit("OS not recognized !");
return;
}
fmod1 = FmodDyn.FMOD_CreateInstance(FMOD_LIB);
fmod2 = FmodDyn.FMOD_CreateInstance(FMOD_LIB2);
if(fmod1 == null) {
printExit("Error : Cannot find " + FMOD_LIB + "\n");
return;
}
if(fmod2 == null) {
printExit("Error : Cannot find " + FMOD_LIB2 + "\n");
return;
}
if(fmod1.FSOUND_GetVersion() < FMOD_VERSION) {
printExit("Error : You are using the wrong DLL version! You should be using FMOD " + FMOD_VERSION);
return;
}
if(fmod2.FSOUND_GetVersion() < FMOD_VERSION) {
printExit("Error : You are using the wrong DLL version! You should be using FMOD " + FMOD_VERSION);
return;
}
switch (LibLoader.getPlatform()) {
case LibLoader.PLATFORM_WINDOWS:
fmod1.FSOUND_SetOutput(FSOUND_OUTPUT_DSOUND);
fmod2.FSOUND_SetOutput(FSOUND_OUTPUT_DSOUND);
break;
case LibLoader.PLATFORM_LINUX:
fmod1.FSOUND_SetOutput(FSOUND_OUTPUT_OSS);
fmod2.FSOUND_SetOutput(FSOUND_OUTPUT_OSS);
break;
case LibLoader.PLATFORM_MACOSX:
break;
}
/*
* SELECT DRIVER 1
*/
/*
* The following list are the drivers for the output method selected above.
*/
print("---------------------------------------------------------\n");
print("Select soundcard #1\n");
print("---------------------------------------------------------\n");
for(int i = 0; i <= fmod1.FSOUND_GetNumDrivers() - 1; i++) {
print(i + " - " + fmod1.FSOUND_GetDriverName(i) + "\n"); /* print driver names */
}
print("---------------------------------------------------------\n");
int driver = -1;
while(driver < 0 || driver > Fmod.FSOUND_GetNumDrivers() - 1) {
try {
driver = Integer.parseInt("" + getKey());
}
catch(NumberFormatException e) {
driver = -1;
}
Thread.yield();
}
fmod1.FSOUND_SetDriver(driver); /* Select sound card (0 = default) */
print("\n");
print("---------------------------------------------------------\n");
print("Select soundcard #2\n");
print("---------------------------------------------------------\n");
for(int i = 0; i <= fmod2.FSOUND_GetNumDrivers() - 1; i++) {
print(i + " - " + fmod2.FSOUND_GetDriverName(i) + "\n"); /* print driver names */
}
print("---------------------------------------------------------\n");
driver = -1;
while(driver < 0 || driver > Fmod.FSOUND_GetNumDrivers() - 1) {
try {
driver = Integer.parseInt("" + getKey());
}
catch(NumberFormatException e) {
driver = -1;
}
Thread.yield();
}
fmod2.FSOUND_SetDriver(driver); /* Select sound card (0 = default) */
/*
* INITIALIZE
*/
if(!fmod1.FSOUND_Init(44100, 32, FSOUND_INIT_USEDEFAULTMIDISYNTH)) {
printExit(Fmod.FMOD_ErrorString(fmod1.FSOUND_GetError()));
return;
}
/*
* INITIALIZE
*/
if(!fmod2.FSOUND_Init(44100, 32, FSOUND_INIT_USEDEFAULTMIDISYNTH)) {
printExit(Fmod.FMOD_ErrorString(fmod2.FSOUND_GetError()));
return;
}
/*
* LOAD SAMPLE (twice)
*/
sampBuff = Medias.loadMediaIntoMemory("/Media/drumloop.wav");
samp1 = fmod1.FSOUND_Sample_Load(FSOUND_UNMANAGED, sampBuff, FSOUND_NORMAL | FSOUND_2D | FSOUND_LOADMEMORY, 0,
sampBuff.capacity());
if(samp1 == null) {
printExit(Fmod.FMOD_ErrorString(fmod1.FSOUND_GetError()));
return;
}
fmod1.FSOUND_Sample_SetMode(samp1, FSOUND_LOOP_OFF); /* this wav has loop points in it which turns looping on.. turn it off! */
samp2 = fmod2.FSOUND_Sample_Load(FSOUND_UNMANAGED, sampBuff, FSOUND_NORMAL | FSOUND_2D | FSOUND_LOADMEMORY, 0,
sampBuff.capacity());
if(samp1 == null) {
printExit(Fmod.FMOD_ErrorString(fmod2.FSOUND_GetError()));
return;
}
fmod2.FSOUND_Sample_SetMode(samp2, FSOUND_LOOP_OFF); /* this wav has loop points in it which turns looping on.. turn it off! */
/*
* DISPLAY HELP
*/
print("\n");
print("=========================================================================\n");
print("Press 1 Play 16bit sound on soundcard #1\n");
print(" 2 Play 16bit sound on soundcard #2\n");
print(" e Quit\n");
print("=========================================================================\n");
boolean exit = false;
do {
switch(getKey()) {
case '1':
fmod1.FSOUND_PlaySound(FSOUND_FREE, samp1);
break;
case '2':
fmod2.FSOUND_PlaySound(FSOUND_FREE, samp2);
break;
case 'e':
exit = true;
break;
}
try {
Thread.sleep(100);
}
catch(Exception e) {}
}
while(!exit && !deinit);
stop();
}
public void stop() {
if(!init || deinit) {
return;
}
deinit = true;
print("\n");
/*
* CLEANUP AND SHUTDOWN
*/
if(fmod1 != null && !fmod1.isNull()) {
if(samp1 != null && !samp1.isNull()) {
fmod1.FSOUND_Sample_Free(samp1);
}
print("Shutdown FMOD Instance 1\n");
fmod1.FSOUND_Close();
FmodDyn.FMOD_FreeInstance(fmod1);
}
if(fmod2 != null && !fmod2.isNull()) {
if(samp2 != null && !samp2.isNull()) {
fmod2.FSOUND_Sample_Free(samp2);
}
print("Shutdown FMOD Instance 2\n");
fmod2.FSOUND_Close();
FmodDyn.FMOD_FreeInstance(fmod2);
}
sampBuff = null;
}
}