437 lines
28 KiB
C
437 lines
28 KiB
C
|
// Copyright (C) 2002-2018 Nikolaus Gebhardt
|
||
|
// This file is part of the "irrKlang" library.
|
||
|
// For conditions of distribution and use, see copyright notice in irrKlang.h
|
||
|
|
||
|
#ifndef __I_IRRKLANG_SOUND_ENGINE_H_INCLUDED__
|
||
|
#define __I_IRRKLANG_SOUND_ENGINE_H_INCLUDED__
|
||
|
|
||
|
#include "ik_IRefCounted.h"
|
||
|
#include "ik_vec3d.h"
|
||
|
#include "ik_ISoundSource.h"
|
||
|
#include "ik_ISound.h"
|
||
|
#include "ik_EStreamModes.h"
|
||
|
#include "ik_IFileFactory.h"
|
||
|
#include "ik_ISoundMixedOutputReceiver.h"
|
||
|
|
||
|
|
||
|
namespace irrklang
|
||
|
{
|
||
|
class IAudioStreamLoader;
|
||
|
struct SInternalAudioInterface;
|
||
|
|
||
|
//! Interface to the sound engine, for playing 3d and 2d sound and music.
|
||
|
/** This is the main interface of irrKlang. You usually would create this using
|
||
|
the createIrrKlangDevice() function.
|
||
|
*/
|
||
|
class ISoundEngine : public virtual irrklang::IRefCounted
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
//! returns the name of the sound driver, like 'ALSA' for the alsa device
|
||
|
/** Possible returned strings are "NULL", "ALSA", "CoreAudio", "winMM",
|
||
|
"DirectSound" and "DirectSound8". */
|
||
|
virtual const char* getDriverName() = 0;
|
||
|
|
||
|
//! loads a sound source (if not loaded already) from a file and plays it.
|
||
|
/** \param sourceFileName Filename of sound, like "sounds/test.wav" or "foobar.ogg".
|
||
|
\param playLooped plays the sound in loop mode. If set to 'false', the sound is played once, then stopped and deleted from the internal playing list. Calls to
|
||
|
ISound have no effect after such a non looped sound has been stopped automaticly.
|
||
|
\param startPaused starts the sound paused. This implies that track=true. Use this if you want to modify some of the playing
|
||
|
parameters before the sound actually plays. Usually you would set this parameter to true, then use the ISound interface to
|
||
|
modify some of the sound parameters and then call ISound::setPaused(false);
|
||
|
Note: You need to call ISound::drop() when setting this parameter to true and you don't need the ISound
|
||
|
object anymore. See 'return' for details.
|
||
|
\param track Makes it possible to track the sound. Causes the method to return an ISound interface. See 'return' for details.
|
||
|
\param streamMode Specifies if the file should be streamed or loaded completely into memory for playing.
|
||
|
ESM_AUTO_DETECT sets this to autodetection. Note: if the sound has been loaded or played before into the
|
||
|
engine, this parameter has no effect.
|
||
|
\param enableSoundEffects Makes it possible to use sound effects such as chorus, distorsions, echo,
|
||
|
reverb and similar for this sound. Sound effects can then be controlled via ISound::getSoundEffectControl().
|
||
|
Only enable if necessary.
|
||
|
\return Only returns a pointer to an ISound if the parameters 'track', 'startPaused' or
|
||
|
'enableSoundEffects' have been set to true. Note: if this method returns an ISound as result,
|
||
|
you HAVE to call ISound::drop() after you don't need the ISound interface anymore. Otherwise this
|
||
|
will cause memory waste. This method also may return 0 altough 'track', 'startPaused' or
|
||
|
'enableSoundEffects' have been set to true, if the sound could not be played.*/
|
||
|
virtual ISound* play2D(const char* soundFileName,
|
||
|
bool playLooped = false,
|
||
|
bool startPaused = false,
|
||
|
bool track = false,
|
||
|
E_STREAM_MODE streamMode = ESM_AUTO_DETECT,
|
||
|
bool enableSoundEffects = false) = 0;
|
||
|
|
||
|
//! Plays a sound source as 2D sound with its default settings stored in ISoundSource.
|
||
|
/** An ISoundSource object will be created internally when playing a sound the first time,
|
||
|
or can be added with getSoundSource().
|
||
|
\param source The sound source, specifiying sound file source and default settings for this file.
|
||
|
Use the other ISoundEngine::play2D() overloads if you want to specify a filename string instead of this.
|
||
|
\param playLooped plays the sound in loop mode. If set to 'false', the sound is played once, then stopped and deleted from the internal playing list. Calls to
|
||
|
ISound have no effect after such a non looped sound has been stopped automaticly.
|
||
|
\param startPaused starts the sound paused. This implies that track=true. Use this if you want to modify some of the playing
|
||
|
parameters before the sound actually plays. Usually you would set this parameter to true, then use the ISound interface to
|
||
|
modify some of the sound parameters and then call ISound::setPaused(false);
|
||
|
Note: You need to call ISound::drop() when setting this parameter to true and you don't need the ISound
|
||
|
object anymore. See 'return' for details.
|
||
|
\param track Makes it possible to track the sound. Causes the method to return an ISound interface. See 'return' for details.
|
||
|
\param enableSoundEffects Makes it possible to use sound effects such as chorus, distorsions, echo,
|
||
|
reverb and similar for this sound. Sound effects can then be controlled via ISound::getSoundEffectControl().
|
||
|
Only enable if necessary.
|
||
|
\return Only returns a pointer to an ISound if the parameters 'track', 'startPaused' or
|
||
|
'enableSoundEffects' have been set to true. Note: if this method returns an ISound as result,
|
||
|
you HAVE to call ISound::drop() after you don't need the ISound interface anymore. Otherwise this
|
||
|
will cause memory waste. This method also may return 0 altough 'track', 'startPaused' or
|
||
|
'enableSoundEffects' have been set to true, if the sound could not be played.*/
|
||
|
virtual ISound* play2D(ISoundSource* source,
|
||
|
bool playLooped = false,
|
||
|
bool startPaused = false,
|
||
|
bool track = false,
|
||
|
bool enableSoundEffects = false) = 0;
|
||
|
|
||
|
//! Loads a sound source (if not loaded already) from a file and plays it as 3D sound.
|
||
|
/** There is some example code on how to work with 3D sound at @ref sound3d.
|
||
|
\param sourceFileName Filename of sound, like "sounds/test.wav" or "foobar.ogg".
|
||
|
\param pos Position of the 3D sound.
|
||
|
\param playLooped plays the sound in loop mode. If set to 'false', the sound is played once, then stopped and deleted from the internal playing list. Calls to
|
||
|
ISound have no effect after such a non looped sound has been stopped automaticly.
|
||
|
\param startPaused starts the sound paused. This implies that track=true. Use this if you want to modify some of the playing
|
||
|
parameters before the sound actually plays. Usually you would set this parameter to true, then use the ISound interface to
|
||
|
modify some of the sound parameters and then call ISound::setPaused(false);
|
||
|
Note: You need to call ISound::drop() when setting this parameter to true and you don't need the ISound
|
||
|
object anymore. See 'return' for details.
|
||
|
\param track Makes it possible to track the sound. Causes the method to return an ISound interface. See 'return' for details.
|
||
|
\param streamMode Specifies if the file should be streamed or loaded completely into memory for playing.
|
||
|
ESM_AUTO_DETECT sets this to autodetection. Note: if the sound has been loaded or played before into the
|
||
|
engine, this parameter has no effect.
|
||
|
\param enableSoundEffects Makes it possible to use sound effects such as chorus, distorsions, echo,
|
||
|
reverb and similar for this sound. Sound effects can then be controlled via ISound::getSoundEffectControl().
|
||
|
Only enable if necessary.
|
||
|
\return Only returns a pointer to an ISound if the parameters 'track', 'startPaused' or
|
||
|
'enableSoundEffects' have been set to true. Note: if this method returns an ISound as result,
|
||
|
you HAVE to call ISound::drop() after you don't need the ISound interface anymore. Otherwise this
|
||
|
will cause memory waste. This method also may return 0 altough 'track', 'startPaused' or
|
||
|
'enableSoundEffects' have been set to true, if the sound could not be played.*/
|
||
|
virtual ISound* play3D(const char* soundFileName, vec3df pos,
|
||
|
bool playLooped = false,
|
||
|
bool startPaused = false,
|
||
|
bool track = false,
|
||
|
E_STREAM_MODE streamMode = ESM_AUTO_DETECT,
|
||
|
bool enableSoundEffects = false) = 0;
|
||
|
|
||
|
//! Plays a sound source as 3D sound with its default settings stored in ISoundSource.
|
||
|
/** An ISoundSource object will be created internally when playing a sound the first time,
|
||
|
or can be added with getSoundSource(). There is some example code on how to work with 3D sound @ref sound3d.
|
||
|
\param source The sound source, specifiying sound file source and default settings for this file.
|
||
|
Use the other ISoundEngine::play2D() overloads if you want to specify a filename string instead of this.
|
||
|
\param pos Position of the 3D sound.
|
||
|
\param playLooped plays the sound in loop mode. If set to 'false', the sound is played once, then stopped and deleted from the internal playing list. Calls to
|
||
|
ISound have no effect after such a non looped sound has been stopped automaticly.
|
||
|
\param startPaused starts the sound paused. This implies that track=true. Use this if you want to modify some of the playing
|
||
|
parameters before the sound actually plays. Usually you would set this parameter to true, then use the ISound interface to
|
||
|
modify some of the sound parameters and then call ISound::setPaused(false);
|
||
|
Note: You need to call ISound::drop() when setting this parameter to true and you don't need the ISound
|
||
|
object anymore. See 'return' for details.
|
||
|
\param track Makes it possible to track the sound. Causes the method to return an ISound interface. See 'return' for details.
|
||
|
\param enableSoundEffects Makes it possible to use sound effects such as chorus, distorsions, echo,
|
||
|
reverb and similar for this sound. Sound effects can then be controlled via ISound::getSoundEffectControl().
|
||
|
Only enable if necessary.
|
||
|
\return Only returns a pointer to an ISound if the parameters 'track', 'startPaused' or
|
||
|
'enableSoundEffects' have been set to true. Note: if this method returns an ISound as result,
|
||
|
you HAVE to call ISound::drop() after you don't need the ISound interface anymore. Otherwise this
|
||
|
will cause memory waste. This method also may return 0 altough 'track', 'startPaused' or
|
||
|
'enableSoundEffects' have been set to true, if the sound could not be played.*/
|
||
|
virtual ISound* play3D(ISoundSource* source, vec3df pos,
|
||
|
bool playLooped = false,
|
||
|
bool startPaused = false,
|
||
|
bool track = false,
|
||
|
bool enableSoundEffects = false) = 0;
|
||
|
|
||
|
//! Stops all currently playing sounds.
|
||
|
virtual void stopAllSounds() = 0;
|
||
|
|
||
|
//! Pauses or unpauses all currently playing sounds.
|
||
|
virtual void setAllSoundsPaused( bool bPaused = true ) = 0;
|
||
|
|
||
|
//! Gets a sound source by sound name. Adds the sound source as file into the sound engine if not loaded already.
|
||
|
/** Please note: For performance reasons most ISoundEngine implementations will
|
||
|
not try to load the sound when calling this method, but only when play() is called
|
||
|
with this sound source as parameter.
|
||
|
\param addIfNotFound if 'true' adds the sound source to the list and returns the interface to it
|
||
|
if it cannot be found in the sound source list. If 'false', returns 0 if the sound
|
||
|
source is not in the list and does not modify the list. Default value: true.
|
||
|
\return Returns the sound source or 0 if not available.
|
||
|
Note: Don't call drop() to this pointer, it will be managed by irrKlang and
|
||
|
exist as long as you don't delete irrKlang or call removeSoundSource(). However,
|
||
|
you are free to call grab() if you want and drop() it then later of course. */
|
||
|
virtual ISoundSource* getSoundSource(const ik_c8* soundName, bool addIfNotFound=true) = 0;
|
||
|
|
||
|
//! Returns a sound source by index.
|
||
|
/** \param idx: Index of the loaded sound source, must by smaller than getSoundSourceCount().
|
||
|
\return Returns the sound source or 0 if not available.
|
||
|
Note: Don't call drop() to this pointer, it will be managed by irrKlang and
|
||
|
exist as long as you don't delete irrKlang or call removeSoundSource(). However,
|
||
|
you are free to call grab() if you want and drop() it then later of course. */
|
||
|
virtual ISoundSource* getSoundSource(ik_s32 index) = 0;
|
||
|
|
||
|
//! Returns amount of loaded sound sources.
|
||
|
virtual ik_s32 getSoundSourceCount() = 0;
|
||
|
|
||
|
//! Adds sound source into the sound engine as file.
|
||
|
/** \param fileName Name of the sound file (e.g. "sounds/something.mp3"). You can also use this
|
||
|
name when calling play3D() or play2D().
|
||
|
\param mode Streaming mode for this sound source
|
||
|
\param preload If this flag is set to false (which is default) the sound engine will
|
||
|
not try to load the sound file when calling this method, but only when play() is called
|
||
|
with this sound source as parameter. Otherwise the sound will be preloaded.
|
||
|
\return Returns the pointer to the added sound source or 0 if not sucessful because for
|
||
|
example a sound already existed with that name. If not successful, the reason will be printed
|
||
|
into the log. Note: Don't call drop() to this pointer, it will be managed by irrKlang and
|
||
|
exist as long as you don't delete irrKlang or call removeSoundSource(). However,
|
||
|
you are free to call grab() if you want and drop() it then later of course. */
|
||
|
virtual ISoundSource* addSoundSourceFromFile(const ik_c8* fileName, E_STREAM_MODE mode=ESM_AUTO_DETECT,
|
||
|
bool preload=false) = 0;
|
||
|
|
||
|
//! Adds a sound source into the sound engine as memory source.
|
||
|
/** Note: This method only accepts a file (.wav, .ogg, etc) which is totally loaded into memory.
|
||
|
If you want to add a sound source from decoded plain PCM data in memory, use addSoundSourceFromPCMData() instead.
|
||
|
\param memory Pointer to the memory to be treated as loaded sound file.
|
||
|
\param sizeInBytes Size of the memory chunk, in bytes.
|
||
|
\param soundName Name of the virtual sound file (e.g. "sounds/something.mp3"). You can also use this
|
||
|
name when calling play3D() or play2D(). Hint: If you include the extension of the original file
|
||
|
like .ogg, .mp3 or .wav at the end of the filename, irrKlang will be able to decide better what
|
||
|
file format it is and might be able to start playback faster.
|
||
|
\param copyMemory If set to true which is default, the memory block is copied
|
||
|
and stored in the engine, after calling addSoundSourceFromMemory() the memory pointer can be deleted
|
||
|
savely. If set to false, the memory is not copied and the user takes the responsibility that
|
||
|
the memory block pointed to remains there as long as the sound engine or at least this sound
|
||
|
source exists.
|
||
|
\return Returns the pointer to the added sound source or 0 if not sucessful because for example a sound already
|
||
|
existed with that name. If not successful, the reason will be printed into the log.
|
||
|
Note: Don't call drop() to this pointer, it will be managed by irrKlang and exist as long as you don't
|
||
|
delete irrKlang or call removeSoundSource(). However, you are free to call grab() if you
|
||
|
want and drop() it then later of course. */
|
||
|
virtual ISoundSource* addSoundSourceFromMemory(void* memory, ik_s32 sizeInBytes, const ik_c8* soundName,
|
||
|
bool copyMemory=true) = 0;
|
||
|
|
||
|
|
||
|
//! Adds a sound source into the sound engine from plain PCM data in memory.
|
||
|
/** \param memory Pointer to the memory to be treated as loaded sound file.
|
||
|
\param sizeInBytes Size of the memory chunk, in bytes.
|
||
|
\param soundName Name of the virtual sound file (e.g. "sounds/something.mp3"). You can also use this
|
||
|
name when calling play3D() or play2D().
|
||
|
\param copyMemory If set to true which is default, the memory block is copied
|
||
|
and stored in the engine, after calling addSoundSourceFromPCMData() the memory pointer can be deleted
|
||
|
savely. If set to true, the memory is not copied and the user takes the responsibility that
|
||
|
the memory block pointed to remains there as long as the sound engine or at least this sound
|
||
|
source exists.
|
||
|
\return Returns the pointer to the added sound source or 0 if not sucessful because for
|
||
|
example a sound already existed with that name. If not successful, the reason will be printed
|
||
|
into the log. */
|
||
|
virtual ISoundSource* addSoundSourceFromPCMData(void* memory, ik_s32 sizeInBytes,
|
||
|
const ik_c8* soundName, SAudioStreamFormat format,
|
||
|
bool copyMemory=true) = 0;
|
||
|
|
||
|
//! Adds a sound source as alias for an existing sound source, but with a different name or optional different default settings.
|
||
|
/** This is useful if you want to play multiple sounds but each sound isn't necessarily one single file.
|
||
|
Also useful if you want to or play the same sound using different names, volumes or min and max 3D distances.
|
||
|
\param baseSource The sound source where this sound source should be based on. This sound
|
||
|
source will use the baseSource as base to access the file and similar, but it will have its
|
||
|
own name and its own default settings.
|
||
|
\param soundName Name of the new sound source to be added.
|
||
|
\return Returns the pointer to the added sound source or 0 if not sucessful because for
|
||
|
example a sound already existed with that name. If not successful, the reason will be printed
|
||
|
into the log.*/
|
||
|
virtual ISoundSource* addSoundSourceAlias(ISoundSource* baseSource, const ik_c8* soundName) = 0;
|
||
|
|
||
|
//! Removes a sound source from the engine, freeing the memory it occupies.
|
||
|
/** This will also cause all currently playing sounds of this source to be stopped.
|
||
|
Also note that if the source has been removed successfully, the value returned
|
||
|
by getSoundSourceCount() will have been decreased by one.
|
||
|
Removing sound sources is only necessary if you know you won't use a lot of non-streamed
|
||
|
sounds again. Sound sources of streamed sounds do not cost a lot of memory.*/
|
||
|
virtual void removeSoundSource(ISoundSource* source) = 0;
|
||
|
|
||
|
//! Removes a sound source from the engine, freeing the memory it occupies.
|
||
|
/** This will also cause all currently playing sounds of this source to be stopped.
|
||
|
Also note that if the source has been removed successfully, the value returned
|
||
|
by getSoundSourceCount() will have been decreased by one.
|
||
|
Removing sound sources is only necessary if you know you won't use a lot of non-streamed
|
||
|
sounds again. Sound sources of streamed sounds do not cost a lot of memory. */
|
||
|
virtual void removeSoundSource(const ik_c8* name) = 0;
|
||
|
|
||
|
//! Removes all sound sources from the engine
|
||
|
/** This will also cause all sounds to be stopped.
|
||
|
Removing sound sources is only necessary if you know you won't use a lot of non-streamed
|
||
|
sounds again. Sound sources of streamed sounds do not cost a lot of memory. */
|
||
|
virtual void removeAllSoundSources() = 0;
|
||
|
|
||
|
//! Sets master sound volume. This value is multiplied with all sounds played.
|
||
|
/** \param volume 0 (silent) to 1.0f (full volume) */
|
||
|
virtual void setSoundVolume(ik_f32 volume) = 0;
|
||
|
|
||
|
//! Returns master sound volume.
|
||
|
/* A value between 0.0 and 1.0. Default is 1.0. Can be changed using setSoundVolume(). */
|
||
|
virtual ik_f32 getSoundVolume() = 0;
|
||
|
|
||
|
//! Sets the current listener 3d position.
|
||
|
/** When playing sounds in 3D, updating the position of the listener every frame should be
|
||
|
done using this function.
|
||
|
\param pos Position of the camera or listener.
|
||
|
\param lookdir Direction vector where the camera or listener is looking into. If you have a
|
||
|
camera position and a target 3d point where it is looking at, this would be cam->getTarget() - cam->getAbsolutePosition().
|
||
|
\param velPerSecond The velocity per second describes the speed of the listener and
|
||
|
is only needed for doppler effects.
|
||
|
\param upvector Vector pointing 'up', so the engine can decide where is left and right.
|
||
|
This vector is usually (0,1,0).*/
|
||
|
virtual void setListenerPosition(const vec3df& pos,
|
||
|
const vec3df& lookdir,
|
||
|
const vec3df& velPerSecond = vec3df(0,0,0),
|
||
|
const vec3df& upVector = vec3df(0,1,0)) = 0;
|
||
|
|
||
|
//! Updates the audio engine. This should be called several times per frame if irrKlang was started in single thread mode.
|
||
|
/** This updates the 3d positions of the sounds as well as their volumes, effects,
|
||
|
streams and other stuff. Call this several times per frame (the more the better) if you
|
||
|
specified irrKlang to run single threaded. Otherwise it is not necessary to use this method.
|
||
|
This method is being called by the scene manager automaticly if you are using one, so
|
||
|
you might want to ignore this. */
|
||
|
virtual void update() = 0;
|
||
|
|
||
|
//! Returns if a sound with the specified name is currently playing.
|
||
|
virtual bool isCurrentlyPlaying(const char* soundName) = 0;
|
||
|
|
||
|
//! Returns if a sound with the specified source is currently playing.
|
||
|
virtual bool isCurrentlyPlaying(ISoundSource* source) = 0;
|
||
|
|
||
|
//! Stops all sounds of a specific sound source
|
||
|
virtual void stopAllSoundsOfSoundSource(ISoundSource* source) = 0;
|
||
|
|
||
|
//! Registers a new audio stream loader in the sound engine.
|
||
|
/** Use this to enhance the audio engine to support other or new file formats.
|
||
|
To do this, implement your own IAudioStreamLoader interface and register it
|
||
|
with this method */
|
||
|
virtual void registerAudioStreamLoader(IAudioStreamLoader* loader) = 0;
|
||
|
|
||
|
//! Returns if irrKlang is running in the same thread as the application or is using multithreading.
|
||
|
/** This basicly returns the flag set by the user when creating the sound engine.*/
|
||
|
virtual bool isMultiThreaded() const = 0;
|
||
|
|
||
|
//! Adds a file factory to the sound engine, making it possible to override file access of the sound engine.
|
||
|
/** Derive your own class from IFileFactory, overwrite the createFileReader()
|
||
|
method and return your own implemented IFileReader to overwrite file access of irrKlang. */
|
||
|
virtual void addFileFactory(IFileFactory* fileFactory) = 0;
|
||
|
|
||
|
//! Sets the default minimal distance for 3D sounds.
|
||
|
/** This value influences how loud a sound is heard based on its distance.
|
||
|
See ISound::setMinDistance() for details about what the min distance is.
|
||
|
It is also possible to influence this default value for every sound file
|
||
|
using ISoundSource::setDefaultMinDistance().
|
||
|
This method only influences the initial distance value of sounds. For changing the
|
||
|
distance after the sound has been started to play, use ISound::setMinDistance() and ISound::setMaxDistance().
|
||
|
\param minDistance Default minimal distance for 3d sounds. The default value is 1.0f.*/
|
||
|
virtual void setDefault3DSoundMinDistance(ik_f32 minDistance) = 0;
|
||
|
|
||
|
//! Returns the default minimal distance for 3D sounds.
|
||
|
/** This value influences how loud a sound is heard based on its distance.
|
||
|
You can change it using setDefault3DSoundMinDistance().
|
||
|
See ISound::setMinDistance() for details about what the min distance is.
|
||
|
It is also possible to influence this default value for every sound file
|
||
|
using ISoundSource::setDefaultMinDistance().
|
||
|
\return Default minimal distance for 3d sounds. The default value is 1.0f. */
|
||
|
virtual ik_f32 getDefault3DSoundMinDistance() = 0;
|
||
|
|
||
|
//! Sets the default maximal distance for 3D sounds.
|
||
|
/** Changing this value is usually not necessary. Use setDefault3DSoundMinDistance() instead.
|
||
|
Don't change this value if you don't know what you are doing: This value causes the sound
|
||
|
to stop attenuating after it reaches the max distance. Most people think that this sets the
|
||
|
volume of the sound to 0 after this distance, but this is not true. Only change the
|
||
|
minimal distance (using for example setDefault3DSoundMinDistance()) to influence this.
|
||
|
See ISound::setMaxDistance() for details about what the max distance is.
|
||
|
It is also possible to influence this default value for every sound file
|
||
|
using ISoundSource::setDefaultMaxDistance().
|
||
|
This method only influences the initial distance value of sounds. For changing the
|
||
|
distance after the sound has been started to play, use ISound::setMinDistance() and ISound::setMaxDistance().
|
||
|
\param maxDistance Default maximal distance for 3d sounds. The default value is 1000000000.0f. */
|
||
|
virtual void setDefault3DSoundMaxDistance(ik_f32 maxDistance) = 0;
|
||
|
|
||
|
//! Returns the default maximal distance for 3D sounds.
|
||
|
/** This value influences how loud a sound is heard based on its distance.
|
||
|
You can change it using setDefault3DSoundmaxDistance(), but
|
||
|
changing this value is usually not necessary. This value causes the sound
|
||
|
to stop attenuating after it reaches the max distance. Most people think that this sets the
|
||
|
volume of the sound to 0 after this distance, but this is not true. Only change the
|
||
|
minimal distance (using for example setDefault3DSoundMinDistance()) to influence this.
|
||
|
See ISound::setMaxDistance() for details about what the max distance is.
|
||
|
It is also possible to influence this default value for every sound file
|
||
|
using ISoundSource::setDefaultMaxDistance().
|
||
|
\return Default maximal distance for 3d sounds. The default value is 1000000000.0f. */
|
||
|
virtual ik_f32 getDefault3DSoundMaxDistance() = 0;
|
||
|
|
||
|
//! Sets a rolloff factor which influences the amount of attenuation that is applied to 3D sounds.
|
||
|
/** The rolloff factor can range from 0.0 to 10.0, where 0 is no rolloff. 1.0 is the default
|
||
|
rolloff factor set, the value which we also experience in the real world. A value of 2 would mean
|
||
|
twice the real-world rolloff. */
|
||
|
virtual void setRolloffFactor(ik_f32 rolloff) = 0;
|
||
|
|
||
|
//! Sets parameters affecting the doppler effect.
|
||
|
/** \param dopplerFactor is a value between 0 and 10 which multiplies the doppler
|
||
|
effect. Default value is 1.0, which is the real world doppler effect, and 10.0f
|
||
|
would be ten times the real world doppler effect.
|
||
|
\param distanceFactor is the number of meters in a vector unit. The default value
|
||
|
is 1.0. Doppler effects are calculated in meters per second, with this parameter,
|
||
|
this can be changed, all velocities and positions are influenced by this. If
|
||
|
the measurement should be in foot instead of meters, set this value to 0.3048f
|
||
|
for example.*/
|
||
|
virtual void setDopplerEffectParameters(ik_f32 dopplerFactor=1.0f, ik_f32 distanceFactor=1.0f) = 0;
|
||
|
|
||
|
//! Loads irrKlang plugins from a custom path.
|
||
|
/** Plugins usually are .dll, .so or .dylib
|
||
|
files named for example ikpMP3.dll (= short for irrKlangPluginMP3) which
|
||
|
make it possible to play back mp3 files. Plugins are being
|
||
|
loaded from the current working directory at startup of the sound engine
|
||
|
if the parameter ESEO_LOAD_PLUGINS is set (which it is by default), but
|
||
|
using this method, it is possible to load plugins from a custom path in addition.
|
||
|
\param path Path to the plugin directory, like "C:\games\somegamegame\irrklangplugins".
|
||
|
\return returns true if sucessful or fals if not, for example because the path could
|
||
|
not be found. */
|
||
|
virtual bool loadPlugins(const ik_c8* path) = 0;
|
||
|
|
||
|
//! Returns a pointer to internal sound engine pointers, like the DirectSound interface.
|
||
|
/** Use this with caution. This is only exposed to make it possible for other libraries
|
||
|
such as Video playback packages to extend or use the sound driver irrklang uses. */
|
||
|
virtual const SInternalAudioInterface& getInternalAudioInterface() = 0;
|
||
|
|
||
|
//! Sets the OutputMixedDataReceiver, so you can receive the pure mixed output audio data while it is being played.
|
||
|
/** This can be used to store the sound output as .wav file or for creating a Oscillograph or similar.
|
||
|
This works only with software based audio drivers, that is ESOD_WIN_MM, ESOD_ALSA, and ESOD_CORE_AUDIO.
|
||
|
Returns true if sucessful and fals if the current audio driver doesn't support this feature. Set this to null
|
||
|
again once you don't need it anymore. */
|
||
|
virtual bool setMixedDataOutputReceiver(ISoundMixedOutputReceiver* receiver) = 0;
|
||
|
};
|
||
|
|
||
|
|
||
|
//! structure for returning pointers to the internal audio interface.
|
||
|
/** Use ISoundEngine::getInternalAudioInterface() to get this. */
|
||
|
struct SInternalAudioInterface
|
||
|
{
|
||
|
//! IDirectSound interface, this is not null when using the ESOD_DIRECT_SOUND audio driver
|
||
|
void* pIDirectSound;
|
||
|
|
||
|
//! IDirectSound8 interface, this is not null when using the ESOD_DIRECT_SOUND8 audio driver
|
||
|
void* pIDirectSound8;
|
||
|
|
||
|
//! HWaveout interface, this is not null when using the ESOD_WIN_MM audio driver
|
||
|
void* pWinMM_HWaveOut;
|
||
|
|
||
|
//! ALSA PCM Handle interface, this is not null when using the ESOD_ALSA audio driver
|
||
|
void* pALSA_SND_PCM;
|
||
|
|
||
|
//! AudioDeviceID handle, this is not null when using the ESOD_CORE_AUDIO audio driver
|
||
|
ik_u32 pCoreAudioDeciceID;
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
} // end namespace irrklang
|
||
|
|
||
|
|
||
|
#endif
|