136 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			136 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // This example will show how to use sound effects such as echo, reverb and distortion.
 | |
| // irrKlang supports the effects Chorus, Compressor, Distortion, Echo, Flanger
 | |
| // Gargle, 3DL2Reverb, ParamEq and WavesReverb.
 | |
| 
 | |
| // Lets start: include the irrKlang headers and other input/output stuff
 | |
| // needed to print and get user input from the console. And as exlained
 | |
| // in the first tutorial, we use the namespace irr and audio and
 | |
| // link to the irrKlang.dll file.
 | |
| #if defined(WIN32)
 | |
| 	#include <conio.h>
 | |
| #else
 | |
| 	#include "../common/conio.h"
 | |
| #endif
 | |
| 
 | |
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| #include <irrKlang.h>
 | |
| using namespace irrklang;
 | |
| 
 | |
| #pragma comment(lib, "irrKlang.lib") // link with irrKlang.dll
 | |
| 
 | |
| 
 | |
| // Now let's start with the irrKlang 3D sound engine example 05,
 | |
| // demonstrating sound effects. Simply startup the engine using
 | |
| // using createIrrKlangDevice() with default options/parameters.
 | |
| int main(int argc, const char** argv)
 | |
| {
 | |
| 	// start the sound engine with default parameters
 | |
| 	ISoundEngine* engine = createIrrKlangDevice();
 | |
| 
 | |
| 	if (!engine)
 | |
| 		return 0; // error starting up the engine
 | |
| 
 | |
| 	// we play a .xm file as music here. Note that the last parameter 
 | |
| 	// named 'enableSoundEffects' has been set to 'true' here. If this
 | |
| 	// is not done, sound effects cannot be used with this sound.
 | |
| 	// After this, we print some help text and start a loop which reads
 | |
| 	// user keyboard input.
 | |
| 	
 | |
| 	const char* filename = "../../media/MF-W-90.XM";
 | |
| 
 | |
| 	#ifdef __BIG_ENDIAN__
 | |
| 		filename = "../../media/ophelia.mp3"; // no xm playback on power pcs currently
 | |
| 	#endif
 | |
| 	
 | |
| 	ISound* music = engine->play2D(filename,
 | |
| 		true, false, true, ESM_AUTO_DETECT, true);
 | |
| 
 | |
| 	// Print some help text and start the display loop
 | |
| 
 | |
| 	printf("\nSound effects example. Keys:\n");
 | |
| 	printf("\nESCAPE: quit\n");
 | |
| 	printf("w: enable/disable waves reverb\n");
 | |
| 	printf("d: enable/disable distortion\n");
 | |
| 	printf("e: enable/disable echo\n");
 | |
| 	printf("a: disable all effects\n");
 | |
| 
 | |
| 	while(true) // endless loop until user exits
 | |
| 	{
 | |
| 		int key = getch();
 | |
| 
 | |
| 		if (key == 27)
 | |
| 			break; // user pressed ESCAPE key
 | |
| 		else
 | |
| 		{
 | |
| 			// user maybe pressed an effects key,
 | |
| 			// now enable or disable a sound effect.
 | |
| 
 | |
| 			// We get a pointer to the ISoundEffectControl interface,
 | |
| 			// but this only exists if the sound driver supports sound effects
 | |
| 			// and if the sound was started setting the 'enableSoundeffects' flag
 | |
| 			// to 'true' as we did above. This pointer is only valid as long as
 | |
| 			// we don't call music->drop() and delete the music with this.
 | |
| 
 | |
| 			ISoundEffectControl* fx = 0;
 | |
| 			if (music)
 | |
| 				fx = music->getSoundEffectControl();
 | |
| 
 | |
| 			if (!fx)
 | |
| 			{
 | |
| 				// some sound devices do not support sound effects.
 | |
| 				printf("This device or sound does not support sound effects.\n");
 | |
| 				continue;
 | |
| 			}	
 | |
| 
 | |
| 			// here we disable or enable the sound effects of the music depending
 | |
| 			// on what key the user pressed. Note that every enableXXXSoundEffect()
 | |
| 			// method also accepts a lot of parameters, so it is easily possible
 | |
| 			// to influence the details of the effect. If the sound effect is 
 | |
| 			// already active, it is also possible to simply call the 
 | |
| 			// enableXXXSoundEffect() method again to just change the effect parameters,
 | |
| 			// although we aren't doing this here.
 | |
| 
 | |
| 			if (key < 'a') // make key lower
 | |
| 				key += 'a' - 'A';
 | |
| 
 | |
| 			switch(key)
 | |
| 			{
 | |
| 			case 'd':
 | |
| 				if (fx->isDistortionSoundEffectEnabled())
 | |
| 					fx->disableDistortionSoundEffect();
 | |
| 				else
 | |
| 					fx->enableDistortionSoundEffect();
 | |
| 				break;
 | |
| 
 | |
| 			case 'e':
 | |
| 				if (fx->isEchoSoundEffectEnabled())
 | |
| 					fx->disableEchoSoundEffect();
 | |
| 				else
 | |
| 					fx->enableEchoSoundEffect();
 | |
| 				break;
 | |
| 
 | |
| 			case 'w':
 | |
| 				if (fx->isWavesReverbSoundEffectEnabled())
 | |
| 					fx->disableWavesReverbSoundEffect();
 | |
| 				else
 | |
| 					fx->enableWavesReverbSoundEffect();
 | |
| 				break;
 | |
| 
 | |
| 			case 'a':
 | |
| 				fx->disableAllEffects(); 
 | |
| 				break;
 | |
| 			}
 | |
| 		}			
 | |
| 	}
 | |
| 
 | |
| 	// don't forget to release the resources
 | |
| 
 | |
| 	if (music)
 | |
| 		music->drop(); // release music stream.
 | |
| 
 | |
| 	engine->drop(); // delete Engine
 | |
| 
 | |
| 	return 0;
 | |
| }
 |