121 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using IrrKlang;
 | 
						|
 | 
						|
namespace CSharp._02._3DSound
 | 
						|
{
 | 
						|
	class Class1
 | 
						|
	{
 | 
						|
		[STAThread]
 | 
						|
		static void Main(string[] args)
 | 
						|
		{
 | 
						|
			// start the sound engine with default parameters
 | 
						|
			ISoundEngine engine = new ISoundEngine();
 | 
						|
 | 
						|
			// Now play some sound stream as music in 3d space, looped.
 | 
						|
			// We play it at position (0,0,0) in 3d space
 | 
						|
 | 
						|
			ISound music = engine.Play3D("../../media/ophelia.mp3",
 | 
						|
										 0,0,0, true);
 | 
						|
 | 
						|
			// the following step isn't necessary, but to adjust the distance where
 | 
						|
			// the 3D sound can be heard, we set some nicer minimum distance
 | 
						|
			// (the default min distance is 1, for a small object). The minimum
 | 
						|
			// distance simply is the distance in which the sound gets played
 | 
						|
			// at maximum volume.
 | 
						|
 | 
						|
			if (music != null)
 | 
						|
				music.MinDistance = 5.0f;
 | 
						|
 | 
						|
			// Print some help text and start the display loop
 | 
						|
 | 
						|
			Console.Out.Write("\nPlaying streamed sound in 3D.");
 | 
						|
			Console.Out.Write("\nPress ESCAPE to quit, any other key to play sound at random position.\n\n");
 | 
						|
 | 
						|
			Console.Out.Write("+ = Listener position\n");
 | 
						|
			Console.Out.Write("o = Playing sound\n");
 | 
						|
 | 
						|
			Random rand = new Random(); // we need random 3d positions
 | 
						|
			const float radius = 5;
 | 
						|
			float posOnCircle = 0;
 | 
						|
 | 
						|
			while(true) // endless loop until user exits
 | 
						|
			{
 | 
						|
				// Each step we calculate the position of the 3D music.
 | 
						|
				// For this example, we let the
 | 
						|
				// music position rotate on a circle:
 | 
						|
 | 
						|
				posOnCircle += 0.04f;
 | 
						|
				Vector3D pos3d = new Vector3D(radius * (float)Math.Cos(posOnCircle), 0,
 | 
						|
											  radius * (float)Math.Sin(posOnCircle * 0.5f));
 | 
						|
 | 
						|
				// After we know the positions, we need to let irrKlang know about the
 | 
						|
				// listener position (always position (0,0,0), facing forward in this example)
 | 
						|
				// and let irrKlang know about our calculated 3D music position
 | 
						|
 | 
						|
				engine.SetListenerPosition(0,0,0, 0,0,1);
 | 
						|
 | 
						|
				if (music != null)
 | 
						|
					music.Position = pos3d;
 | 
						|
 | 
						|
				// Now print the position of the sound in a nice way to the console
 | 
						|
				// and also print the play position
 | 
						|
 | 
						|
				string stringForDisplay = "          +         ";
 | 
						|
				int charpos = (int)((pos3d.X + radius) / radius * 10.0f);
 | 
						|
				if (charpos >= 0 && charpos < 20)
 | 
						|
				{
 | 
						|
					stringForDisplay = stringForDisplay.Remove(charpos, 1);
 | 
						|
					stringForDisplay = stringForDisplay.Insert(charpos, "o");					
 | 
						|
				}
 | 
						|
 | 
						|
				uint playPos = 0;
 | 
						|
				if (music != null)
 | 
						|
					playPos = music.PlayPosition;
 | 
						|
 | 
						|
				string output = String.Format("\rx:({0})   3dpos: {1:f} {2:f} {3:f}, playpos:{4}:{5:00}    ",
 | 
						|
					stringForDisplay, pos3d.X, pos3d.Y, pos3d.Z,
 | 
						|
					playPos/60000, (playPos%60000)/1000);
 | 
						|
 | 
						|
				Console.Write(output);
 | 
						|
 | 
						|
				System.Threading.Thread.Sleep(100);
 | 
						|
 | 
						|
				// Handle user input: Every time the user presses a key in the console,
 | 
						|
				// play a random sound or exit the application if he pressed ESCAPE.
 | 
						|
 | 
						|
				if (_kbhit()!=0)
 | 
						|
				{
 | 
						|
					int key = _getch();
 | 
						|
 | 
						|
					if (key == 27)
 | 
						|
						break; // user pressed ESCAPE key
 | 
						|
					else
 | 
						|
					{
 | 
						|
						// Play random sound at some random position.
 | 
						|
 | 
						|
						Vector3D pos = new Vector3D(((float)rand.NextDouble() % radius*2.0f) - radius, 0, 0);
 | 
						|
 | 
						|
						string filename;
 | 
						|
 | 
						|
						if (rand.Next()%2 != 0)
 | 
						|
							filename = "../../media/bell.wav";
 | 
						|
						else
 | 
						|
							filename = "../../media/explosion.wav";
 | 
						|
 | 
						|
						engine.Play3D(filename, pos.X, pos.Y, pos.Z);
 | 
						|
 | 
						|
						Console.Write("\nplaying {0} at {1:f} {2:f} {3:f}\n",
 | 
						|
							filename, pos.X, pos.Y, pos.Z);
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		// simple functions for reading keys from the console
 | 
						|
		[System.Runtime.InteropServices.DllImport("msvcrt")]
 | 
						|
		static extern int _kbhit();
 | 
						|
		[System.Runtime.InteropServices.DllImport("msvcrt")]
 | 
						|
		static extern int _getch();
 | 
						|
	}
 | 
						|
}
 |