Return to main.cpp CVS log | Up to Nevrax / code / nel / samples / sound_sources |
File: Nevrax / code / nel / samples / sound_sources / main.cpp (download) Revision 1.6, Wed Feb 20 18:07:22 2002 UTC (5 months ago) by lecroart Branch: MAIN CVS Tags: georges_v2, HEAD Changes since 1.5: +2 -2 lines #FIXED: doxygen warning |
/** \file sound_sources/main.cpp * Simple example of NeL sound engine usage * * $Id: main.cpp,v 1.6 2002/02/20 18:07:22 lecroart Exp $ */ /* Copyright, 2001 Nevrax Ltd. * * This file is part of NEVRAX NEL. * NEVRAX NEL is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * NEVRAX NEL is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * You should have received a copy of the GNU General Public License * along with NEVRAX NEL; see the file COPYING. If not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, * MA 02111-1307, USA. */ /* * This sample shows how to initialize the audio mixer (UAudioMixer), * how to create a source (USource), and how to move the listener * (UListener). */ #include "nel/misc/debug.h" #include "nel/misc/time_nl.h" #include "nel/misc/vector.h" using namespace NLMISC; #include "nel/sound/u_audio_mixer.h" #include "nel/sound/u_listener.h" using namespace NLSOUND; #include <stdio.h> // Pointer to the audio mixer object UAudioMixer *AudioMixer = NULL; /* * Initialization */ void Init() { try { /* * 1. Create the audio mixer object and init it. * If the sound driver cannot be loaded, an exception is thrown. */ AudioMixer = UAudioMixer::createAudioMixer(); AudioMixer->init(); /* * 2. Load a "sources sounds file" (.nss), its sound properties and * its attached wave data files (.wav) */ AudioMixer->loadSoundBuffers( "sample_sounds.nss" ); /* * In this small example, we don't have any environmental effects or * environment sounds. If so we would load an "environmental effects * file" (.nef) and an "environment sounds file" (.nes): * * AudioMixer->loadEnvEffects( "effects.nef" ); * * UEnvSound *root; * AudioMixer->loadEnvSounds( "envsounds.nes", &root ); */ /* * 3. Initialize listener's position and orientation (in NeL coordinate system). */ CVector initpos ( 0.0f, 0.0f, 0.0f ); CVector frontvec( 0.0f, 1.0f, 0.0f ); CVector upvec( 0.0f, 0.0f, 1.0f ); AudioMixer->getListener()->setPos( initpos ); AudioMixer->getListener()->setOrientation( frontvec, upvec ); } catch( Exception& e ) { nlerror( "Error: %s", e.what() ); } } /* * Adding a source */ USource *OnAddSource( const char *name, float x, float y, float z ) { /* * Create a source with sound 'name', and set some of its initial properties, if successful */ USource *source = AudioMixer->createSource( name ); if ( source != NULL ) { source->setPos( CVector(x,y,z) ); /* The initial gain, pitch and looping state are stored * in the "source sounds file". */ source->play(); // start playing immediately } else { nlwarning( "Sound '%s' not found", name ); } return source; } /* * When moving the listener, wait for a short delay */ void OnMove( const CVector& listenerpos ) { // Move forward AudioMixer->getListener()->setPos( listenerpos ); // Wait 20 ms TTime time = CTime::getLocalTime(); while ( CTime::getLocalTime() < time+20 ); /* If we used spawned sources or "envsounds" or if we had * a large number of sources, we should call: * AudioMixer->update(); */ } /* * main * * Note: The NeL vector coordinate system is described as follows: * \verbatim * (top) * z * | y (front) * | / * -----x (right) * \endverbatim */ void main() { // Initialization Init(); // First step: we create two sources printf( "Press ENTER to start playing the two sources\n" ); printf( "One is 20 meters ahead, on the right\n" ); printf( "The other is 5 meters ahead, on the left\n" ); getchar(); USource *src1 = OnAddSource( "Beep", 1.0f, 20.0f, 0.0f ); // Beep on the right, 20 meters ahead USource *src2 = OnAddSource( "Tuut", -2.0f, 5.0f, 0.0f ); // Tuut on the left, 5 meters ahead // Second step: we will move the listener ahead printf( "Press ENTER again to start moving the listener\n" ); getchar(); // Listener orientation is constant in this example (see initialization) // Move forward, then backward, twice CVector listenervel; CVector listenerpos ( 0.0f, 0.0f, 0.0f ); for ( uint i=0; i!=2; i++ ) { printf( "%u of 2\n", i+1 ); // Forward velocity listenervel.set( 0.0f, 0.5f, 0.0f ); AudioMixer->getListener()->setVelocity( listenervel ); // Move forward: set position every frame printf( "Moving forward, going past the sources...\n" ); for ( listenerpos.y=0.0f; listenerpos.y<30.0f; listenerpos.y+=0.1f ) { OnMove( listenerpos ); } // Backward velocity listenervel.set( 0.0f, -0.5f, 0.0f ); AudioMixer->getListener()->setVelocity( listenervel ); // Move backward: set position every frame printf( "Moving backward, going back to the start position...\n" ); for ( listenerpos.y=30.0f; listenerpos.y>0.0f; listenerpos.y-=0.1f ) { OnMove( listenerpos ); } } // Finalization printf( "Press ENTER again to exit\n" ); getchar(); delete AudioMixer; }