Initial revision
This commit is contained in:
54
intern/SoundSystem/Makefile
Normal file
54
intern/SoundSystem/Makefile
Normal file
@@ -0,0 +1,54 @@
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
# ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
#
|
||||
# This program 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
|
||||
# of the License, or (at your option) any later version. The Blender
|
||||
# Foundation also sells licenses for use in proprietary software under
|
||||
# the Blender License. See http://www.blender.org/BL/ for information
|
||||
# about this.
|
||||
#
|
||||
# This program 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 this program; if not, write to the Free Software Foundation,
|
||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
#
|
||||
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
# All rights reserved.
|
||||
#
|
||||
# The Original Code is: all of this file.
|
||||
#
|
||||
# Contributor(s): none yet.
|
||||
#
|
||||
# ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
#
|
||||
#
|
||||
|
||||
include nan_definitions.mk
|
||||
|
||||
SOURCEDIR = source/gameengine/SoundSystem
|
||||
DIR = $(OCGDIR)/SoundSystem
|
||||
DIRS = intern
|
||||
DIRS += dummy
|
||||
|
||||
ifeq ($(OS),windows)
|
||||
DIRS += fmod
|
||||
DIRS += openal
|
||||
endif
|
||||
ifeq ($(OS),freebsd)
|
||||
DIRS += openal
|
||||
endif
|
||||
ifeq ($(OS),$(findstring $(OS), "linux"))
|
||||
ifeq ($(CPU),i386)
|
||||
DIRS += openal
|
||||
endif
|
||||
endif
|
||||
|
||||
include nan_subdirs.mk
|
356
intern/SoundSystem/SND_C-api.h
Normal file
356
intern/SoundSystem/SND_C-api.h
Normal file
@@ -0,0 +1,356 @@
|
||||
/**
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
*
|
||||
* This program 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
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
*/
|
||||
#ifndef SND_BLENDER_H
|
||||
#define SND_BLENDER_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "SoundDefines.h"
|
||||
|
||||
#define SND_DECLARE_HANDLE(name) typedef struct name##__ { int unused; } *name
|
||||
|
||||
SND_DECLARE_HANDLE(SND_AudioDeviceInterfaceHandle);
|
||||
SND_DECLARE_HANDLE(SND_SceneHandle);
|
||||
SND_DECLARE_HANDLE(SND_ObjectHandle);
|
||||
SND_DECLARE_HANDLE(SND_ListenerHandle);
|
||||
|
||||
/**
|
||||
* set the specified type
|
||||
*/
|
||||
extern void SND_SetDeviceType(int device_type);
|
||||
|
||||
/**
|
||||
* get an audiodevice
|
||||
*/
|
||||
extern SND_AudioDeviceInterfaceHandle SND_GetAudioDevice(void);
|
||||
|
||||
/**
|
||||
* and let go of it
|
||||
*/
|
||||
extern void SND_ReleaseDevice(void);
|
||||
|
||||
/**
|
||||
* check if playback is desired
|
||||
*/
|
||||
extern int SND_IsPlaybackWanted(SND_SceneHandle scene);
|
||||
|
||||
/**
|
||||
* add memlocation to cache
|
||||
*/
|
||||
extern int SND_AddSample(SND_SceneHandle scene,
|
||||
const char* filename,
|
||||
void* memlocation,
|
||||
int size);
|
||||
|
||||
/**
|
||||
* remove all samples
|
||||
*/
|
||||
extern void SND_RemoveAllSamples(SND_SceneHandle scene);
|
||||
|
||||
/**
|
||||
* forces the object to check its buffer, and fix it if it's wrong
|
||||
*/
|
||||
extern int SND_CheckBuffer(SND_SceneHandle scene, SND_ObjectHandle object);
|
||||
|
||||
/**
|
||||
* Creates a scene, initializes it and returns a handle to that scene.
|
||||
*
|
||||
* @param audiodevice: handle to the audiodevice.
|
||||
*/
|
||||
extern SND_SceneHandle SND_CreateScene(SND_AudioDeviceInterfaceHandle audiodevice);
|
||||
|
||||
/**
|
||||
* Stops all sounds, suspends the scene (so all resources will be freed) and deletes the scene.
|
||||
*
|
||||
* @param scene: handle to the soundscene.
|
||||
*/
|
||||
extern void SND_DeleteScene(SND_SceneHandle scene);
|
||||
|
||||
/**
|
||||
* Adds a soundobject to the scene, gets the buffer the sample is loaded into.
|
||||
*
|
||||
* @param scene: handle to the soundscene.
|
||||
* @param object: handle to soundobject.
|
||||
*/
|
||||
extern void SND_AddSound(SND_SceneHandle scene, SND_ObjectHandle object);
|
||||
|
||||
/**
|
||||
* Removes a soundobject from the scene.
|
||||
*
|
||||
* @param scene: handle to the soundscene.
|
||||
* @param object: handle to soundobject.
|
||||
*/
|
||||
extern void SND_RemoveSound(SND_SceneHandle scene, SND_ObjectHandle object);
|
||||
|
||||
/**
|
||||
* Removes all soundobjects from the scene.
|
||||
*
|
||||
* @param scene: handle to the soundscene.
|
||||
*/
|
||||
extern void SND_RemoveAllSounds(SND_SceneHandle scene);
|
||||
|
||||
/**
|
||||
* Stopss all soundobjects in the scene.
|
||||
*
|
||||
* @param scene: handle to the soundscene.
|
||||
*/
|
||||
extern void SND_StopAllSounds(SND_SceneHandle scene);
|
||||
|
||||
/**
|
||||
* Updates the listener, checks the status of all soundobjects, builds a list of all active
|
||||
* objects, updates the active objects.
|
||||
*
|
||||
* @param audiodevice: handle to the audiodevice.
|
||||
* @param scene: handle to the soundscene.
|
||||
*/
|
||||
extern void SND_Proceed(SND_AudioDeviceInterfaceHandle audiodevice, SND_SceneHandle scene);
|
||||
|
||||
/**
|
||||
* Returns a handle to the listener.
|
||||
*
|
||||
* @param scene: handle to the soundscene.
|
||||
*/
|
||||
extern SND_ListenerHandle SND_GetListener(SND_SceneHandle scene);
|
||||
|
||||
/**
|
||||
* Sets the gain of the listener.
|
||||
*
|
||||
* @param scene: handle to the soundscene.
|
||||
* @param gain: factor the gain gets multiplied with.
|
||||
*/
|
||||
extern void SND_SetListenerGain(SND_SceneHandle scene, double gain);
|
||||
|
||||
/**
|
||||
* Sets a scaling to exaggerate or deemphasize the Doppler (pitch) shift resulting from the
|
||||
* calculation.
|
||||
* @attention $f' = dopplerfactor * f * frac{dopplervelocity - listener_velocity}{dopplervelocity + object_velocity}$
|
||||
* @attention f: frequency in sample (soundobject)
|
||||
* @attention f': effective Doppler shifted frequency
|
||||
*
|
||||
* @param object: handle to soundobject.
|
||||
* @param dopplerfactor: the dopplerfactor.
|
||||
*/
|
||||
extern void SND_SetDopplerFactor(SND_SceneHandle scene, double dopplerfactor);
|
||||
|
||||
/**
|
||||
* Sets the value of the propagation speed relative to which the source velocities are interpreted.
|
||||
* @attention $f' = dopplerfactor * f * frac{dopplervelocity - listener_velocity}{dopplervelocity + object_velocity}$
|
||||
* @attention f: frequency in sample (soundobject)
|
||||
* @attention f': effective Doppler shifted frequency
|
||||
*
|
||||
* @param object: handle to soundobject.
|
||||
* @param dopplervelocity: the dopplervelocity.
|
||||
*/
|
||||
extern void SND_SetDopplerVelocity(SND_SceneHandle scene, double dopplervelocity);
|
||||
|
||||
/**
|
||||
* Creates a new soundobject and returns a handle to it.
|
||||
*/
|
||||
extern SND_ObjectHandle SND_CreateSound(void);
|
||||
|
||||
/**
|
||||
* Deletes a soundobject.
|
||||
*
|
||||
* @param object: handle to soundobject.
|
||||
*/
|
||||
extern void SND_DeleteSound(SND_ObjectHandle object);
|
||||
|
||||
/**
|
||||
* Sets a soundobject to SND_MUST_PLAY, so with the next proceed it will be updated and played.
|
||||
*
|
||||
* @param object: handle to soundobject.
|
||||
*/
|
||||
extern void SND_StartSound(SND_SceneHandle scene, SND_ObjectHandle object);
|
||||
|
||||
/**
|
||||
* Sets a soundobject to SND_MUST_STOP, so with the next proceed it will be stopped.
|
||||
*
|
||||
* @param object: handle to soundobject.
|
||||
*/
|
||||
extern void SND_StopSound(SND_SceneHandle scene, SND_ObjectHandle object);
|
||||
|
||||
/**
|
||||
* Sets a soundobject to SND_MUST_PAUSE, so with the next proceed it will be paused.
|
||||
*
|
||||
* @param object: handle to soundobject.
|
||||
*/
|
||||
extern void SND_PauseSound(SND_SceneHandle scene, SND_ObjectHandle object);
|
||||
|
||||
/**
|
||||
* Sets the name of the sample to reference the soundobject to it.
|
||||
*
|
||||
* @param object: handle to soundobject.
|
||||
* @param samplename: the name of the sample
|
||||
*/
|
||||
extern void SND_SetSampleName(SND_ObjectHandle object, char* samplename);
|
||||
|
||||
/**
|
||||
* Sets the gain of a soundobject.
|
||||
*
|
||||
* @param object: handle to soundobject.
|
||||
* @param gain: factor the gain gets multiplied with.
|
||||
*/
|
||||
extern void SND_SetGain(SND_ObjectHandle object, double gain);
|
||||
|
||||
/**
|
||||
* Sets the minimum gain of a soundobject.
|
||||
*
|
||||
* @param object: handle to soundobject.
|
||||
* @param minimumgain: lower threshold for the gain.
|
||||
*/
|
||||
extern void SND_SetMinimumGain(SND_ObjectHandle object, double minimumgain);
|
||||
|
||||
/**
|
||||
* Sets the maximum gain of a soundobject.
|
||||
*
|
||||
* @param object: handle to soundobject.
|
||||
* @param maximumgain: upper threshold for the gain.
|
||||
*/
|
||||
extern void SND_SetMaximumGain(SND_ObjectHandle object, double maximumgain);
|
||||
|
||||
/**
|
||||
* Sets the rollofffactor. The rollofffactor is a per-Source parameter the application
|
||||
* can use to increase or decrease the range of a source by decreasing or increasing the
|
||||
* attenuation, respectively. The default value is 1. The implementation is free to optimize
|
||||
* for a rollofffactor value of 0, which indicates that the application does not wish any
|
||||
* distance attenuation on the respective Source.
|
||||
*
|
||||
* @param object: handle to soundobject.
|
||||
* @param rollofffactor: the rollofffactor.
|
||||
*/
|
||||
extern void SND_SetRollOffFactor(SND_ObjectHandle object, double rollofffactor);
|
||||
|
||||
/**
|
||||
* Sets the referencedistance at which the listener will experience gain.
|
||||
* @attention G_dB = gain - 20 * log10(1 + rollofffactor * (dist - referencedistance)/referencedistance);
|
||||
*
|
||||
* @param object: handle to soundobject.
|
||||
* @param distance: the reference distance.
|
||||
*/
|
||||
extern void SND_SetReferenceDistance(SND_ObjectHandle object, double referencedistance);
|
||||
|
||||
/**
|
||||
* Sets the pitch of a soundobject.
|
||||
*
|
||||
* @param object: handle to soundobject.
|
||||
* @param pitch: pitchingfactor: 2.0 for doubling the frequency, 0.5 for half the frequency.
|
||||
*/
|
||||
extern void SND_SetPitch(SND_ObjectHandle object, double pitch);
|
||||
|
||||
/**
|
||||
* Sets the position a soundobject.
|
||||
*
|
||||
* @param object: handle to soundobject.
|
||||
* @param position: position[3].
|
||||
*/
|
||||
extern void SND_SetPosition(SND_ObjectHandle object, double* position);
|
||||
|
||||
/**
|
||||
* Sets the velocity of a soundobject.
|
||||
*
|
||||
* @param object: handle to soundobject.
|
||||
* @param velocity: velocity[3].
|
||||
*/
|
||||
extern void SND_SetVelocity(SND_ObjectHandle object, double* velocity);
|
||||
|
||||
/**
|
||||
* Sets the orientation of a soundobject.
|
||||
*
|
||||
* @param object: handle to soundobject.
|
||||
* @param orientation: orientation[9].
|
||||
*/
|
||||
extern void SND_SetOrientation(SND_ObjectHandle object, double* orientation);
|
||||
|
||||
/**
|
||||
* Sets the loopmode of a soundobject.
|
||||
*
|
||||
* @param object: handle to soundobject.
|
||||
* @param loopmode type of the loop (SND_LOOP_OFF, SND_LOOP_NORMAL, SND_LOOP_BIDIRECTIONAL);
|
||||
*/
|
||||
extern void SND_SetLoopMode(SND_ObjectHandle object, int loopmode);
|
||||
|
||||
/**
|
||||
* Sets the looppoints of a soundobject.
|
||||
*
|
||||
* @param object: handle to soundobject.
|
||||
* @param loopstart startpoint of the loop
|
||||
* @param loopend endpoint of the loop
|
||||
*/
|
||||
extern void SND_SetLoopPoints(SND_ObjectHandle object, unsigned int loopstart, unsigned int loopend);
|
||||
|
||||
/**
|
||||
* Gets the gain of a soundobject.
|
||||
*
|
||||
* @param object: handle to soundobject.
|
||||
*/
|
||||
extern float SND_GetGain(SND_ObjectHandle object);
|
||||
|
||||
/**
|
||||
* Gets the pitch of a soundobject.
|
||||
*
|
||||
* @param object: handle to soundobject.
|
||||
*/
|
||||
extern float SND_GetPitch(SND_ObjectHandle object);
|
||||
|
||||
/**
|
||||
* Gets the looping of a soundobject.
|
||||
* 0: SND_LOOP_OFF
|
||||
* 1: SND_LOOP_NORMAL
|
||||
* 2: SND_LOOP_BIDIRECTIONAL
|
||||
*
|
||||
* @param object: handle to soundobject.
|
||||
*/
|
||||
extern int SND_GetLoopMode(SND_ObjectHandle object);
|
||||
|
||||
/**
|
||||
* Gets the playstate of a soundobject.
|
||||
* SND_UNKNOWN = -1
|
||||
* SND_INITIAL
|
||||
* SND_MUST_PLAY
|
||||
* SND_PLAYING
|
||||
* SND_MUST_STOP
|
||||
* SND_STOPPED
|
||||
* SND_MUST_PAUSE
|
||||
* SND_PAUSED
|
||||
* SND_MUST_BE_DELETED
|
||||
*
|
||||
* @param object: handle to soundobject.
|
||||
*/
|
||||
extern int SND_GetPlaystate(SND_ObjectHandle object);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
84
intern/SoundSystem/SND_CDObject.h
Normal file
84
intern/SoundSystem/SND_CDObject.h
Normal file
@@ -0,0 +1,84 @@
|
||||
/*
|
||||
* SND_CDObject.h
|
||||
*
|
||||
* Implementation for CD playback
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
*
|
||||
* This program 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
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
#ifndef __SND_CDOBJECT_H
|
||||
#define __SND_CDOBJECT_H
|
||||
|
||||
#include "SND_Object.h"
|
||||
|
||||
class SND_CDObject : public SND_Object
|
||||
{
|
||||
private:
|
||||
|
||||
/**
|
||||
* Private to enforce singleton
|
||||
*/
|
||||
SND_CDObject();
|
||||
SND_CDObject(const SND_CDObject&);
|
||||
|
||||
static SND_CDObject* m_instance;
|
||||
MT_Scalar m_gain; /* the gain of the object */
|
||||
int m_playmode; /* the way CD is played back (all, random, track, trackloop) */
|
||||
int m_track; /* the track for 'track' and 'trackloop' */
|
||||
int m_playstate; /* flag for current state of object */
|
||||
bool m_modified;
|
||||
bool m_used; /* flag for checking if we used the cd, if not don't
|
||||
call the stop cd at the end */
|
||||
|
||||
public:
|
||||
static bool CreateSystem();
|
||||
static bool DisposeSystem();
|
||||
static SND_CDObject* Instance();
|
||||
|
||||
~SND_CDObject();
|
||||
|
||||
void SetGain(MT_Scalar gain);
|
||||
void SetPlaymode(int playmode);
|
||||
void SetTrack(int track);
|
||||
void SetPlaystate(int playstate);
|
||||
void SetModified(bool modified);
|
||||
void SetUsed();
|
||||
bool GetUsed();
|
||||
|
||||
bool IsModified() const;
|
||||
|
||||
int GetTrack() const;
|
||||
MT_Scalar GetGain() const;
|
||||
int GetPlaymode() const;
|
||||
int GetPlaystate() const;
|
||||
|
||||
};
|
||||
#endif //__SND_CDOBJECT_H
|
56
intern/SoundSystem/SND_DependKludge.h
Normal file
56
intern/SoundSystem/SND_DependKludge.h
Normal file
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
* SND_DependKludge.h
|
||||
*
|
||||
* who needs what?
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
*
|
||||
* This program 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
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
|
||||
#if defined (_WIN32)
|
||||
#define USE_FMOD
|
||||
#else
|
||||
# if defined (__linux__)
|
||||
# if defined (__i386__)
|
||||
# define USE_OPENAL
|
||||
# endif
|
||||
# else
|
||||
# if defined (__FreeBSD__)
|
||||
# define USE_OPENAL
|
||||
# endif
|
||||
# ifdef USE_OPENAL
|
||||
# undef USE_OPENAL
|
||||
# endif
|
||||
# ifdef USE_FMOD
|
||||
# undef USE_FMOD
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
91
intern/SoundSystem/SND_DeviceManager.h
Normal file
91
intern/SoundSystem/SND_DeviceManager.h
Normal file
@@ -0,0 +1,91 @@
|
||||
/*
|
||||
* SND_DeviceManager.h
|
||||
*
|
||||
* singleton for creating, switching and deleting audiodevices
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
*
|
||||
* This program 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
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
#ifndef __SND_DEVICEMANAGER_H
|
||||
#define __SND_DEVICEMANAGER_H
|
||||
|
||||
#include "SND_IAudioDevice.h"
|
||||
|
||||
class SND_DeviceManager
|
||||
{
|
||||
public :
|
||||
|
||||
/**
|
||||
* a subscription is needed before instances are given away
|
||||
* applications must call subscribe first, get an instance, and
|
||||
* when they are finished with sound, unsubscribe
|
||||
*/
|
||||
static void Subscribe();
|
||||
static void Unsubscribe();
|
||||
|
||||
static SND_IAudioDevice* Instance();
|
||||
static void SetDeviceType(int device_type);
|
||||
|
||||
private :
|
||||
|
||||
/**
|
||||
* Private to enforce singleton
|
||||
*/
|
||||
SND_DeviceManager();
|
||||
SND_DeviceManager(const SND_DeviceManager&);
|
||||
~SND_DeviceManager();
|
||||
|
||||
static SND_IAudioDevice* m_instance;
|
||||
|
||||
/**
|
||||
* The type of device to be created on a call
|
||||
* to Instance().
|
||||
*/
|
||||
static int m_device_type;
|
||||
|
||||
/**
|
||||
* Remember the number of subscriptions.
|
||||
* if 0, delete the device
|
||||
*/
|
||||
static int m_subscriptions;;
|
||||
};
|
||||
|
||||
#endif //__SND_DEVICEMANAGER_H
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
346
intern/SoundSystem/SND_IAudioDevice.h
Normal file
346
intern/SoundSystem/SND_IAudioDevice.h
Normal file
@@ -0,0 +1,346 @@
|
||||
/**
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
*
|
||||
* This program 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
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
*/
|
||||
#ifndef SND_IAUDIODEVICE
|
||||
#define SND_IAUDIODEVICE
|
||||
|
||||
#include "SND_SoundObject.h"
|
||||
#include "SND_CDObject.h"
|
||||
#include "SND_WaveCache.h"
|
||||
#include "SND_WaveSlot.h"
|
||||
#include "MT_Matrix3x3.h"
|
||||
|
||||
|
||||
class SND_IAudioDevice
|
||||
{
|
||||
public:
|
||||
|
||||
/**
|
||||
* constructor
|
||||
*/
|
||||
SND_IAudioDevice() {};
|
||||
|
||||
/**
|
||||
* destructor
|
||||
*/
|
||||
virtual ~SND_IAudioDevice() {};
|
||||
|
||||
/**
|
||||
* check to see if initialization was successfull
|
||||
*
|
||||
* @return indication of succes
|
||||
*/
|
||||
virtual bool IsInitialized()=0;
|
||||
|
||||
/**
|
||||
* get the wavecache (which does sample (un)loading)
|
||||
*
|
||||
* @return pointer to the wavecache
|
||||
*/
|
||||
virtual SND_WaveCache* GetWaveCache() const =0;
|
||||
|
||||
/**
|
||||
* loads a sample into the device
|
||||
*
|
||||
* @param samplename the name of the sample
|
||||
* @param memlocation pointer where the sample is stored
|
||||
* @param size size of the sample in memory
|
||||
*
|
||||
* @return pointer to the slot with sample data
|
||||
*/
|
||||
virtual SND_WaveSlot* LoadSample(const STR_String& samplename,
|
||||
void* memlocation,
|
||||
int size)=0;
|
||||
|
||||
/**
|
||||
* remove a sample from the wavecache
|
||||
*
|
||||
* @param filename pointer to filename
|
||||
*/
|
||||
// virtual void RemoveSample(const char* filename)=0;
|
||||
|
||||
/**
|
||||
* remove all samples from the wavecache
|
||||
*/
|
||||
virtual void RemoveAllSamples()=0;
|
||||
|
||||
/**
|
||||
* get a new id from the device
|
||||
*
|
||||
* @param pObject pointer to soundobject
|
||||
*
|
||||
* @return indication of success
|
||||
*/
|
||||
virtual bool GetNewId(SND_SoundObject* pObject)=0;
|
||||
|
||||
/**
|
||||
* clear an id
|
||||
*
|
||||
* @param pObject pointer to soundobject
|
||||
*/
|
||||
virtual void ClearId(SND_SoundObject* pObject)=0;
|
||||
|
||||
/**
|
||||
* initialize the listener
|
||||
*/
|
||||
virtual void InitListener()=0;
|
||||
|
||||
/**
|
||||
* set the value of the propagation speed relative to which the
|
||||
* source velocities are interpreted.
|
||||
* f' = DOPPLER_FACTOR * f * (DOPPLER_VELOCITY - Vl) / (DOPPLER_VELOCITY + Vo)
|
||||
* f: frequency in sample (soundobject)
|
||||
* f': effective Doppler shifted frequency
|
||||
* Vl: velocity listener
|
||||
* Vo: velocity soundobject
|
||||
*
|
||||
* @param dopplervelocity scaling factor for doppler effect
|
||||
*/
|
||||
virtual void SetDopplerVelocity(MT_Scalar dopplervelocity) const =0;
|
||||
|
||||
/**
|
||||
* set a scaling to exaggerate or deemphasize the Doppler (pitch)
|
||||
* shift resulting from the calculation.
|
||||
* f' = DOPPLER_FACTOR * f * (DOPPLER_VELOCITY - Listener_velocity )/(DOPPLER_VELOCITY + object_velocity )
|
||||
*
|
||||
* @param dopplerfactor scaling factor for doppler effect
|
||||
*/
|
||||
virtual void SetDopplerFactor(MT_Scalar dopplerfactor) const =0;
|
||||
|
||||
/**
|
||||
* set the roll-off factor
|
||||
*
|
||||
* @param rollofffactor a global volume scaling factor
|
||||
*/
|
||||
virtual void SetListenerRollOffFactor(MT_Scalar rollofffactor) const =0;
|
||||
|
||||
/**
|
||||
* make the context the current one
|
||||
*/
|
||||
virtual void MakeCurrent() const =0;
|
||||
|
||||
/**
|
||||
* update the device
|
||||
*/
|
||||
virtual void NextFrame() const =0;
|
||||
|
||||
/**
|
||||
* set the volume of the listener.
|
||||
*
|
||||
* @param gain the mastergain
|
||||
*/
|
||||
virtual void SetListenerGain(float gain) const =0;
|
||||
|
||||
/**
|
||||
* connect the buffer with the source
|
||||
*
|
||||
* @param id the id of the object
|
||||
* @param buffer the buffer the sample is stored in
|
||||
*/
|
||||
virtual void SetObjectBuffer(int id, unsigned int buffer)=0;
|
||||
|
||||
/**
|
||||
* pause playback of the cd
|
||||
* @param id the id of the object
|
||||
*
|
||||
* @return the state the object is in
|
||||
*/
|
||||
virtual int GetPlayState(int id) =0;
|
||||
|
||||
/**
|
||||
* play a sound belonging to an object.
|
||||
*
|
||||
* @param id the id of the object
|
||||
*/
|
||||
virtual void PlayObject(int id) =0;
|
||||
|
||||
/**
|
||||
* stop a sound belonging to an object.
|
||||
*
|
||||
* @param id the id of the object
|
||||
*/
|
||||
virtual void StopObject(int id) const =0;
|
||||
|
||||
/**
|
||||
* stop all sounds.
|
||||
*/
|
||||
virtual void StopAllObjects()=0;
|
||||
|
||||
/**
|
||||
* pause the sound belonging to an object.
|
||||
*
|
||||
* @param id the id of the object
|
||||
*/
|
||||
virtual void PauseObject(int id) const =0;
|
||||
|
||||
/**
|
||||
* set the sound to looping or non-looping.
|
||||
*
|
||||
* @param id the id of the object
|
||||
* @param loopmode type of looping (no loop, normal, bidirectional)
|
||||
*/
|
||||
virtual void SetObjectLoop(int id, unsigned int loopmode) const =0;
|
||||
|
||||
/**
|
||||
* set the looppoints of a sound
|
||||
*
|
||||
* @param id the id of the object
|
||||
* @param loopstart the startpoint of the loop (in samples)
|
||||
* @param loopend the endpoint of the loop (in samples)
|
||||
*/
|
||||
virtual void SetObjectLoopPoints(int id, unsigned int loopstart, unsigned int loopend) const =0;
|
||||
|
||||
/**
|
||||
* set the pitch of the sound.
|
||||
*
|
||||
* @param id the id of the object
|
||||
* @param pitch the pitch
|
||||
*/
|
||||
virtual void SetObjectPitch(int id, MT_Scalar pitch) const =0;
|
||||
|
||||
/**
|
||||
* set the gain of the sound.
|
||||
*
|
||||
* @param id the id of the object
|
||||
* @param gain the gain
|
||||
*/
|
||||
virtual void SetObjectGain(int id, MT_Scalar gain) const =0;
|
||||
|
||||
/**
|
||||
* ROLLOFF_FACTOR is per-Source parameter the application can use to increase or decrease
|
||||
* the range of a source by decreasing or increasing the attenuation, respectively. The
|
||||
* default value is 1. The implementation is free to optimize for a ROLLOFF_FACTOR value
|
||||
* of 0, which indicates that the application does not wish any distance attenuation on
|
||||
* the respective Source.
|
||||
*
|
||||
* @param id the id of the object
|
||||
* @param rolloff a per-source volume scaling factor
|
||||
*/
|
||||
virtual void SetObjectRollOffFactor(int id, MT_Scalar rolloff) const =0;
|
||||
|
||||
/**
|
||||
* min_gain indicates the minimal gain which is always guaranteed for this sound
|
||||
*
|
||||
* @param id the id of the object
|
||||
* @param mingain the minimum gain of the object
|
||||
*/
|
||||
virtual void SetObjectMinGain(int id, MT_Scalar mingain) const =0;
|
||||
|
||||
/**
|
||||
* max_gain indicates the maximal gain which is always guaranteed for this sound
|
||||
*
|
||||
* @param id the id of the object
|
||||
* @param maxgain the maximum gain of the object
|
||||
*/
|
||||
virtual void SetObjectMaxGain(int id, MT_Scalar maxgain) const =0;
|
||||
/**
|
||||
* set the distance at which the Listener will experience gain.
|
||||
* G_dB = GAIN - 20*log10(1 + ROLLOFF_FACTOR*(dist-REFERENCE_DISTANCE)/REFERENCE_DISTANCE );
|
||||
*
|
||||
* @param id the id of the object
|
||||
* @param referencedistance the distance at which the listener will start hearing
|
||||
*/
|
||||
virtual void SetObjectReferenceDistance(int id, MT_Scalar referencedistance) const =0;
|
||||
|
||||
/**
|
||||
* set the position, velocity and orientation of a sound.
|
||||
*
|
||||
* @param id the id of the object
|
||||
* @param position the position of the object
|
||||
* @param velocity the velocity of the object
|
||||
* @param orientation the orientation of the object
|
||||
* @param lisposition the position of the listener
|
||||
* @param rollofffactor the rollofffactor of the object
|
||||
*/
|
||||
virtual void SetObjectTransform(int id,
|
||||
const MT_Vector3& position,
|
||||
const MT_Vector3& velocity,
|
||||
const MT_Matrix3x3& orientation,
|
||||
const MT_Vector3& lisposition,
|
||||
const MT_Scalar& rollofffactor) const =0;
|
||||
|
||||
/**
|
||||
* make a sound 2D
|
||||
*
|
||||
* @param id the id of the object
|
||||
*/
|
||||
virtual void ObjectIs2D(int id) const =0;
|
||||
|
||||
/**
|
||||
* tell the device we want cd suppport
|
||||
*/
|
||||
virtual void UseCD() const =0;
|
||||
|
||||
/**
|
||||
* start playback of the cd
|
||||
*
|
||||
* @param track the tracknumber to start playback from
|
||||
*/
|
||||
virtual void PlayCD(int track) const =0;
|
||||
|
||||
/**
|
||||
* pause playback of the cd (true == pause, false == resume)
|
||||
*/
|
||||
virtual void PauseCD(bool pause) const =0;
|
||||
|
||||
/**
|
||||
* stop playback of the cd
|
||||
*/
|
||||
virtual void StopCD() const =0;
|
||||
|
||||
/**
|
||||
* set the playbackmode of the cd
|
||||
* SND_CD_ALL play all tracks
|
||||
* SND_CD_TRACK play one track
|
||||
* SND_CD_TRACKLOOP play one track looped
|
||||
* SND_CD_RANDOM play all tracks in random order
|
||||
*
|
||||
* @param playmode playmode
|
||||
*/
|
||||
virtual void SetCDPlaymode(int playmode) const =0;
|
||||
|
||||
/**
|
||||
* set the volume playback of the cd
|
||||
*
|
||||
* @param gain the gain
|
||||
*/
|
||||
virtual void SetCDGain(MT_Scalar gain) const =0;
|
||||
|
||||
virtual void StartUsingDSP() =0;
|
||||
virtual float* GetSpectrum() =0;
|
||||
virtual void StopUsingDSP() =0;
|
||||
|
||||
protected:
|
||||
|
||||
virtual void RevokeSoundObject(SND_SoundObject* pObject)=0;
|
||||
};
|
||||
|
||||
#endif //SND_IAUDIODEVICE
|
55
intern/SoundSystem/SND_Object.h
Normal file
55
intern/SoundSystem/SND_Object.h
Normal file
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
* SND_Object.h
|
||||
*
|
||||
* Abstract sound object
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
*
|
||||
* This program 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
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
#ifndef __SND_OBJECT_H
|
||||
#define __SND_OBJECT_H
|
||||
|
||||
#include "GEN_List.h"
|
||||
#include "MT_Matrix3x3.h"
|
||||
#include "SoundDefines.h"
|
||||
|
||||
/**
|
||||
* SND_Object is an interface class for soundobjects, listeners and other
|
||||
* kinds of sound related thingies.
|
||||
*/
|
||||
|
||||
class SND_Object : public GEN_Link
|
||||
{
|
||||
public:
|
||||
SND_Object() {};
|
||||
virtual ~SND_Object() {};
|
||||
};
|
||||
#endif //__SND_OBJECT_H
|
106
intern/SoundSystem/SND_Scene.h
Normal file
106
intern/SoundSystem/SND_Scene.h
Normal file
@@ -0,0 +1,106 @@
|
||||
/*
|
||||
* SND_Scene.h
|
||||
*
|
||||
* The scene for sounds.
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
*
|
||||
* This program 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
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
#ifdef WIN32
|
||||
#pragma warning (disable:4786) // get rid of stupid stl-visual compiler debug warning
|
||||
#endif //WIN32
|
||||
|
||||
#ifndef __SND_SCENE_H
|
||||
#define __SND_SCENE_H
|
||||
|
||||
#include "SoundDefines.h"
|
||||
#include "SND_SoundObject.h"
|
||||
#include "SND_CDObject.h"
|
||||
#include "SND_SoundListener.h"
|
||||
#include "SND_WaveSlot.h"
|
||||
|
||||
#include "MT_Vector3.h"
|
||||
#include "MT_Matrix3x3.h"
|
||||
#include "STR_String.h"
|
||||
|
||||
#include <set>
|
||||
|
||||
|
||||
class SND_Scene
|
||||
{
|
||||
std::set<class SND_SoundObject*> m_soundobjects;
|
||||
|
||||
GEN_List m_activeobjects;
|
||||
class SND_IAudioDevice* m_audiodevice;
|
||||
class SND_WaveCache* m_wavecache;
|
||||
class SND_SoundListener m_listener;
|
||||
bool m_audio; // to check if audio works
|
||||
bool m_audioplayback; // to check if audioplayback is wanted
|
||||
|
||||
void UpdateListener();
|
||||
void BuildActiveList(MT_Scalar curtime);
|
||||
void UpdateActiveObects();
|
||||
void UpdateCD();
|
||||
|
||||
public:
|
||||
SND_Scene(SND_IAudioDevice* adi);
|
||||
~SND_Scene();
|
||||
|
||||
bool IsPlaybackWanted();
|
||||
|
||||
void AddActiveObject(SND_SoundObject* pObject, MT_Scalar curtime);
|
||||
void RemoveActiveObject(SND_SoundObject* pObject);
|
||||
void DeleteObjectWhenFinished(SND_SoundObject* pObject);
|
||||
|
||||
void Proceed();
|
||||
|
||||
int LoadSample(const STR_String& samplename,
|
||||
void* memlocation,
|
||||
int size);
|
||||
void RemoveAllSamples();
|
||||
bool CheckBuffer(SND_SoundObject* pObject);
|
||||
bool IsSampleLoaded(STR_String& samplename);
|
||||
|
||||
void AddObject(SND_SoundObject* pObject);
|
||||
bool SetCDObject(SND_CDObject* cdobject);
|
||||
void DeleteObject(SND_SoundObject* pObject);
|
||||
void RemoveAllObjects();
|
||||
void StopAllObjects();
|
||||
int GetObjectStatus(SND_SoundObject* pObject) const;
|
||||
|
||||
void SetListenerTransform(const MT_Vector3& pos,
|
||||
const MT_Vector3& vel,
|
||||
const MT_Matrix3x3& mat);
|
||||
|
||||
SND_SoundListener* GetListener();
|
||||
};
|
||||
|
||||
#endif //__SND_SCENE_H
|
84
intern/SoundSystem/SND_SoundListener.h
Normal file
84
intern/SoundSystem/SND_SoundListener.h
Normal file
@@ -0,0 +1,84 @@
|
||||
/*
|
||||
* SND_SoundListener.h
|
||||
*
|
||||
* A SoundListener is for sound what a camera is for vision.
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
*
|
||||
* This program 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
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
#ifndef __SND_SOUNDLISTENER_H
|
||||
#define __SND_SOUNDLISTENER_H
|
||||
|
||||
#include "SND_Object.h"
|
||||
|
||||
|
||||
class SND_SoundListener : public SND_Object
|
||||
{
|
||||
public:
|
||||
SND_SoundListener();
|
||||
virtual ~SND_SoundListener();
|
||||
|
||||
void SetStateFlag(unsigned int stateflags);
|
||||
void SetGain(MT_Scalar gain);
|
||||
void SetPosition(const MT_Vector3& pos);
|
||||
void SetVelocity(const MT_Vector3& vel);
|
||||
void SetOrientation(const MT_Matrix3x3& ori);
|
||||
void SetDopplerFactor(MT_Scalar dopplerfactor);
|
||||
void SetDopplerVelocity(MT_Scalar dopplervelocity);
|
||||
void SetScale(MT_Scalar scale);
|
||||
|
||||
void SetModified(bool modified);
|
||||
bool IsModified() const;
|
||||
|
||||
unsigned int GetStateFlags() const;
|
||||
MT_Scalar GetGain() const;
|
||||
MT_Vector3 GetPosition() const;
|
||||
MT_Vector3 GetVelocity() const;
|
||||
MT_Matrix3x3 GetOrientation();
|
||||
|
||||
MT_Scalar GetDopplerFactor() const;
|
||||
MT_Scalar GetDopplerVelocity() const;
|
||||
MT_Scalar GetScale() const;
|
||||
|
||||
private:
|
||||
void* m_listener;
|
||||
bool m_modified;
|
||||
|
||||
MT_Scalar m_gain; /* overall gain */
|
||||
MT_Vector3 m_position; /* position; left/right, up/down, in/out */
|
||||
MT_Vector3 m_velocity; /* velocity of the listener */
|
||||
MT_Matrix3x3 m_orientation; /* orientation of the listener */
|
||||
|
||||
MT_Scalar m_dopplerfactor; /* scaling factor for the Doppler (pitch) shift */
|
||||
MT_Scalar m_dopplervelocity; /* factor for the reference velocity (for Dopplereffect) */
|
||||
MT_Scalar m_scale;
|
||||
};
|
||||
#endif //__SND_SOUNDLISTENER_H
|
162
intern/SoundSystem/SND_SoundObject.h
Normal file
162
intern/SoundSystem/SND_SoundObject.h
Normal file
@@ -0,0 +1,162 @@
|
||||
/*
|
||||
* SND_SoundObject.h
|
||||
*
|
||||
* Implementation of the abstract sound object
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
*
|
||||
* This program 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
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
#ifndef __SND_SOUNDOBJECT_H
|
||||
#define __SND_SOUNDOBJECT_H
|
||||
|
||||
#include "SND_Object.h"
|
||||
#include "STR_String.h"
|
||||
|
||||
|
||||
/**
|
||||
* SND_SoundObject is a class for api independent sounddata storage conected to an actuator
|
||||
*/
|
||||
|
||||
class SND_SoundObject : public SND_Object
|
||||
{
|
||||
private:
|
||||
STR_String m_samplename; /* name of the sample */
|
||||
STR_String m_objectname; /* name of the object */
|
||||
unsigned int m_buffer;
|
||||
|
||||
bool m_active; /* is the object active or not? */
|
||||
int m_id;
|
||||
MT_Scalar m_lifespan; /* the lifespan of the sound seconds */
|
||||
MT_Scalar m_timestamp;
|
||||
|
||||
MT_Scalar m_length; /* length of the sample in seconds */
|
||||
|
||||
MT_Scalar m_gain; /* the gain of the object */
|
||||
MT_Scalar m_rollofffactor; /* the scaling factor to increase or decrease the range
|
||||
of a source by decreasing or increasing the
|
||||
attenuation, respectively */
|
||||
MT_Scalar m_referencedistance;/* the distance at which the listener will experience
|
||||
gain */
|
||||
MT_Scalar m_mingain; /* indicates the minimal gain which is always guaranteed
|
||||
for this source */
|
||||
MT_Scalar m_maxgain; /* indicates the maximal gain which is always guaranteed
|
||||
for this source */
|
||||
|
||||
MT_Scalar m_pitch; /* the pitch of the object */
|
||||
MT_Vector3 m_position; /* position; left/right, up/down, in/out */
|
||||
MT_Vector3 m_velocity; /* velocity of the object */
|
||||
MT_Matrix3x3 m_orientation; /* orientation of the object */
|
||||
unsigned int m_loopmode; /* loop normal or bidirectional? */
|
||||
unsigned int m_loopstart; /* start of looppoint in samples! */
|
||||
unsigned int m_loopend; /* end of looppoint in samples! */
|
||||
bool m_is3d; /* is the object 3D or 2D? */
|
||||
int m_playstate; /* flag for current state of object */
|
||||
bool m_modified;
|
||||
unsigned int m_running;
|
||||
bool m_highpriority; /* may the sound be ditched when we run out of voices? */
|
||||
|
||||
public:
|
||||
|
||||
SND_SoundObject();
|
||||
~SND_SoundObject();
|
||||
|
||||
void SetBuffer(unsigned int buffer);
|
||||
void SetActive(bool active);
|
||||
|
||||
void StartSound();
|
||||
void StopSound();
|
||||
void PauseSound();
|
||||
void DeleteWhenFinished();
|
||||
|
||||
void SetObjectName(STR_String objectname);
|
||||
void SetSampleName(STR_String samplename);
|
||||
void SetLength(MT_Scalar length);
|
||||
|
||||
void SetPitch(MT_Scalar pitch);
|
||||
void SetGain(MT_Scalar gain);
|
||||
void SetMinGain(MT_Scalar mingain);
|
||||
void SetMaxGain(MT_Scalar maxgain);
|
||||
void SetRollOffFactor(MT_Scalar rollofffactor);
|
||||
void SetReferenceDistance(MT_Scalar distance);
|
||||
void SetPosition(const MT_Vector3& pos);
|
||||
void SetVelocity(const MT_Vector3& vel);
|
||||
void SetOrientation(const MT_Matrix3x3& orient);
|
||||
void SetLoopMode(unsigned int loopmode);
|
||||
void SetLoopStart(unsigned int loopstart);
|
||||
void SetLoopEnd(unsigned int loopend);
|
||||
void Set3D(bool threedee);
|
||||
void SetPlaystate(int playstate);
|
||||
void SetHighPriority(bool priority);
|
||||
|
||||
void SetId(int id);
|
||||
void SetLifeSpan();
|
||||
void SetTimeStamp(MT_Scalar timestamp);
|
||||
|
||||
void SetModified(bool modified);
|
||||
|
||||
bool IsLifeSpanOver(MT_Scalar curtime) const;
|
||||
bool IsActive() const;
|
||||
bool IsModified() const;
|
||||
bool IsHighPriority() const;
|
||||
|
||||
void InitRunning();
|
||||
bool IsRunning() const;
|
||||
void AddRunning();
|
||||
|
||||
int GetId() const;
|
||||
MT_Scalar GetLifeSpan() const;
|
||||
MT_Scalar GetTimestamp() const;
|
||||
|
||||
unsigned int GetBuffer();
|
||||
const STR_String& GetSampleName();
|
||||
const STR_String& GetObjectName();
|
||||
|
||||
MT_Scalar GetLength() const;
|
||||
MT_Scalar GetGain() const;
|
||||
MT_Scalar GetPitch() const;
|
||||
|
||||
MT_Scalar GetMinGain() const;
|
||||
MT_Scalar GetMaxGain() const;
|
||||
MT_Scalar GetRollOffFactor() const;
|
||||
MT_Scalar GetReferenceDistance() const;
|
||||
|
||||
MT_Vector3 GetPosition() const;
|
||||
MT_Vector3 GetVelocity() const;
|
||||
MT_Matrix3x3 GetOrientation() const;
|
||||
unsigned int GetLoopMode() const;
|
||||
unsigned int GetLoopStart() const;
|
||||
unsigned int GetLoopEnd() const;
|
||||
bool Is3D() const;
|
||||
int GetPlaystate() const;
|
||||
|
||||
};
|
||||
#endif //__SND_SOUNDOBJECT_H
|
||||
|
113
intern/SoundSystem/SND_Utils.h
Normal file
113
intern/SoundSystem/SND_Utils.h
Normal file
@@ -0,0 +1,113 @@
|
||||
/**
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
*
|
||||
* This program 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
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
*/
|
||||
#ifndef SND_UTILS_H
|
||||
#define SND_UTILS_H
|
||||
|
||||
#include "SND_WaveSlot.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned char riff[4];
|
||||
signed int size;
|
||||
unsigned char type[4];
|
||||
} WavFileHeader;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned short format;
|
||||
unsigned short numberofchannels;
|
||||
unsigned int samplerate;
|
||||
unsigned int bytespersec;
|
||||
unsigned short blockalignment;
|
||||
unsigned short bitrate;
|
||||
} WavFmtHeader;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned short size;
|
||||
unsigned short samplesperblock;
|
||||
} WavFmtExHeader;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned int Manufacturer;
|
||||
unsigned int Product;
|
||||
unsigned int SamplePeriod;
|
||||
unsigned int Note;
|
||||
unsigned int FineTune;
|
||||
unsigned int SMPTEFormat;
|
||||
unsigned int SMPTEOffest;
|
||||
unsigned int loops;
|
||||
unsigned int SamplerData;
|
||||
struct
|
||||
{
|
||||
unsigned int Identifier;
|
||||
unsigned int Type;
|
||||
unsigned int Start;
|
||||
unsigned int End;
|
||||
unsigned int Fraction;
|
||||
unsigned int Count;
|
||||
} Loop[1];
|
||||
} WavSampleHeader;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned char id[4];
|
||||
unsigned int size;
|
||||
} WavChunkHeader;
|
||||
|
||||
/**
|
||||
* loads a sample and returns a pointer
|
||||
*/
|
||||
extern void* SND_LoadSample(char *filename);
|
||||
|
||||
extern bool SND_IsSampleValid(const STR_String& name, void* memlocation);
|
||||
extern unsigned int SND_GetSampleFormat(void* sample);
|
||||
extern unsigned int SND_GetNumberOfChannels(void* sample);
|
||||
extern unsigned int SND_GetSampleRate(void* sample);
|
||||
extern unsigned int SND_GetBitRate(void* sample);
|
||||
extern unsigned int SND_GetNumberOfSamples(void* sample);
|
||||
extern unsigned int SND_GetHeaderSize(void* sample);
|
||||
extern unsigned int SND_GetExtraChunk(void* sample);
|
||||
|
||||
extern void SND_GetSampleInfo(signed char* sample, SND_WaveSlot* waveslot);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
68
intern/SoundSystem/SND_WaveCache.h
Normal file
68
intern/SoundSystem/SND_WaveCache.h
Normal file
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
* SND_WaveCache.h
|
||||
*
|
||||
* abstract wavecache, a way to organize samples
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
*
|
||||
* This program 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
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
#ifdef WIN32
|
||||
#pragma warning (disable:4786) // get rid of stupid stl-visual compiler debug warning
|
||||
#endif //WIN32
|
||||
|
||||
#ifndef __SND_WAVECACHE_H
|
||||
#define __SND_WAVECACHE_H
|
||||
|
||||
#include "SND_WaveSlot.h"
|
||||
#include "SoundDefines.h"
|
||||
#include "SND_SoundObject.h"
|
||||
#include <map>
|
||||
|
||||
class SND_WaveCache
|
||||
{
|
||||
public:
|
||||
SND_WaveCache();
|
||||
virtual ~SND_WaveCache();
|
||||
|
||||
SND_WaveSlot* GetWaveSlot(const STR_String& samplename);
|
||||
|
||||
void RemoveAllSamples();
|
||||
void RemoveSample(const STR_String& samplename, int buffer);
|
||||
|
||||
private:
|
||||
std::map<STR_String, SND_WaveSlot*> m_samplecache;
|
||||
|
||||
SND_WaveSlot* m_bufferList[NUM_BUFFERS];
|
||||
|
||||
void FreeSamples();
|
||||
};
|
||||
|
||||
#endif //__SND_WAVECACHE_H
|
94
intern/SoundSystem/SND_WaveSlot.h
Normal file
94
intern/SoundSystem/SND_WaveSlot.h
Normal file
@@ -0,0 +1,94 @@
|
||||
/*
|
||||
* SND_WaveSlot.cpp
|
||||
*
|
||||
* class for storing sample related information
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
*
|
||||
* This program 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
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
#ifndef __SND_WAVESLOT_H
|
||||
#define __SND_WAVESLOT_H
|
||||
|
||||
#include "STR_String.h"
|
||||
|
||||
class SND_WaveSlot
|
||||
{
|
||||
STR_String m_samplename;
|
||||
bool m_loaded;
|
||||
void* m_data;
|
||||
unsigned int m_buffer;
|
||||
unsigned int m_sampleformat;
|
||||
unsigned int m_numberofchannels;
|
||||
unsigned int m_samplerate;
|
||||
unsigned int m_bitrate;
|
||||
unsigned int m_numberofsamples;
|
||||
unsigned int m_filesize;
|
||||
|
||||
public:
|
||||
|
||||
SND_WaveSlot(): m_loaded(false),
|
||||
m_data(NULL),
|
||||
m_buffer(0),
|
||||
m_sampleformat(0),
|
||||
m_numberofchannels(0),
|
||||
m_samplerate(0),
|
||||
m_bitrate(0),
|
||||
m_numberofsamples(0),
|
||||
m_filesize(0)
|
||||
{};
|
||||
~SND_WaveSlot();
|
||||
|
||||
void SetSampleName(STR_String samplename);
|
||||
void SetLoaded(bool loaded);
|
||||
void SetData(void* data);
|
||||
void SetBuffer(unsigned int buffer);
|
||||
void SetSampleFormat(unsigned int sampleformat);
|
||||
void SetNumberOfChannels(unsigned int numberofchannels);
|
||||
void SetSampleRate(unsigned int samplerate);
|
||||
void SetBitRate(unsigned int bitrate);
|
||||
void SetNumberOfSamples(unsigned int numberofsamples);
|
||||
void SetFileSize(unsigned int filesize);
|
||||
|
||||
|
||||
const STR_String& GetSampleName();
|
||||
bool IsLoaded() const;
|
||||
void* GetData();
|
||||
unsigned int GetBuffer() const;
|
||||
unsigned int GetSampleFormat() const;
|
||||
unsigned int GetNumberOfChannels() const;
|
||||
unsigned int GetSampleRate() const;
|
||||
unsigned int GetBitRate() const;
|
||||
unsigned int GetNumberOfSamples() const;
|
||||
unsigned int GetFileSize() const;
|
||||
|
||||
};
|
||||
|
||||
#endif //__SND_WAVESLOT_H
|
53
intern/SoundSystem/SND_test/Makefile
Normal file
53
intern/SoundSystem/SND_test/Makefile
Normal file
@@ -0,0 +1,53 @@
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
# ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
#
|
||||
# This program 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
|
||||
# of the License, or (at your option) any later version. The Blender
|
||||
# Foundation also sells licenses for use in proprietary software under
|
||||
# the Blender License. See http://www.blender.org/BL/ for information
|
||||
# about this.
|
||||
#
|
||||
# This program 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 this program; if not, write to the Free Software Foundation,
|
||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
#
|
||||
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
# All rights reserved.
|
||||
#
|
||||
# The Original Code is: all of this file.
|
||||
#
|
||||
# Contributor(s): none yet.
|
||||
#
|
||||
# ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
#
|
||||
#
|
||||
|
||||
LIBNAME = SoundSystem
|
||||
DIR = $(OCGDIR)/gameengine/$(LIBNAME)
|
||||
ALLTARGETS = $(OBJS) $(DIR)/$(DEBUG_DIR)SoundSystem
|
||||
|
||||
include nan_compile.mk
|
||||
|
||||
CPPFLAGS += $(NAN_LEVEL_1_WARNINGS)
|
||||
|
||||
CPPFLAGS += -I$(NAN_MOTO)/include
|
||||
CPPFLAGS += -I../../../kernel/gen_system
|
||||
CPPFLAGS += -I.. -I../SND_BlenderWaveCache -I../SND_OpenAL
|
||||
|
||||
TESTLIB = $(OCGDIR)/gameengine/OpenALSoundSystem/$(DEBUG_DIR)libOpenALSoundSystem.a
|
||||
TESTLIB += $(OCGDIR)/gameengine/BlenderWaveCache/$(DEBUG_DIR)libBlenderWaveCache.a
|
||||
TESTLIB += $(OCGDIR)/kernel/gen_system/$(DEBUG_DIR)libgen_system.a
|
||||
TESTLIB += $(OCGDIR)/gameengine/SoundSystem/$(DEBUG_DIR)libSoundSystem.a
|
||||
TESTLIB += $(NAN_OPENAL)/lib/libopenal.a
|
||||
|
||||
$(DIR)/$(DEBUG_DIR)SoundSystem: $(OBJS) $(TESTLIB)
|
||||
$(CC) $(LDFLAGS) -o $@ $(OBJS) $(TESTLIB) -lm -pthread -ldl -lstdc++
|
152
intern/SoundSystem/SND_test/SND_test.c
Normal file
152
intern/SoundSystem/SND_test/SND_test.c
Normal file
@@ -0,0 +1,152 @@
|
||||
/* SND_test.c nov 2000
|
||||
*
|
||||
* testfile for the SND module
|
||||
*
|
||||
* janco verduin
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
*
|
||||
* This program 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
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
#include "SND_C-api.h"
|
||||
#include "BlenderWaveCacheCApi.h"
|
||||
#include "OpenALC-Api.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#if defined(WIN32)
|
||||
#include <io.h>
|
||||
#else
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#include <fcntl.h>
|
||||
|
||||
static int buf[3];
|
||||
|
||||
float oPos[3]={3.0, 0.0,-1.0};
|
||||
float oVel[3]={0.0, 0.0, 1.0};
|
||||
float oOri[6]={0.0, 0.0, 1.0, 0.0, 1.0, 0.0};
|
||||
|
||||
void* ReadFile(char *filename)
|
||||
{
|
||||
int file, filelen;
|
||||
void *data = NULL;
|
||||
|
||||
#if defined(WIN32)
|
||||
file = open(filename, O_BINARY|O_RDONLY);
|
||||
#else
|
||||
file = open(filename, 0|O_RDONLY);
|
||||
#endif
|
||||
|
||||
if (file == -1) {
|
||||
printf("can't open file.\n");
|
||||
printf("press q for quit.\n");
|
||||
|
||||
}
|
||||
else {
|
||||
filelen = lseek(file, 0, SEEK_END);
|
||||
lseek(file, 0, SEEK_SET);
|
||||
|
||||
if (filelen != 0){
|
||||
data = malloc(filelen);
|
||||
if (read(file, data, filelen) != filelen) {
|
||||
free(data);
|
||||
data = NULL;
|
||||
}
|
||||
}
|
||||
close(file);
|
||||
|
||||
}
|
||||
return (data);
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
int ch;
|
||||
char* samplename = NULL;
|
||||
void* sampleinmemory = NULL;
|
||||
SND_CacheHandle wavecache = NULL;
|
||||
SND_SceneHandle scene = NULL;
|
||||
SND_ObjectHandle object = NULL;
|
||||
|
||||
wavecache = SND_GetWaveCache();
|
||||
scene = SND_CreateOpenALScene(wavecache);
|
||||
|
||||
samplename = "2.wav";
|
||||
sampleinmemory = ReadFile(samplename);
|
||||
|
||||
if (sampleinmemory) {
|
||||
|
||||
object = SND_CreateObject();
|
||||
SND_AddMemoryLocation(samplename, sampleinmemory);
|
||||
SND_SetSampleName(object, samplename);
|
||||
SND_AddObject(scene, object);
|
||||
printf("go your gang...\n");
|
||||
printf("1: play\n");
|
||||
printf("2: stop\n");
|
||||
printf("q: quit\n");
|
||||
}
|
||||
do
|
||||
{
|
||||
ch = getchar();
|
||||
ch = toupper(ch);
|
||||
switch (ch)
|
||||
{
|
||||
case '1':
|
||||
{
|
||||
SND_SetPitch(object, 1.0);
|
||||
SND_SetGain(object, 1.0);
|
||||
SND_StartSound(object);
|
||||
break;
|
||||
}
|
||||
case '2':
|
||||
{
|
||||
SND_StopSound(object);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
SND_Proceed(scene);
|
||||
|
||||
} while (ch != 'Q');
|
||||
|
||||
if (object) {
|
||||
|
||||
SND_RemoveObject(scene, object);
|
||||
SND_DeleteObject(object);
|
||||
}
|
||||
|
||||
SND_DeleteScene(scene);
|
||||
SND_DeleteCache();
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
119
intern/SoundSystem/SoundDefines.h
Normal file
119
intern/SoundSystem/SoundDefines.h
Normal file
@@ -0,0 +1,119 @@
|
||||
/*
|
||||
* SoundDefines.h
|
||||
*
|
||||
* this is where all kinds of defines are stored
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
*
|
||||
* This program 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
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
#ifndef __SOUNDDEFINES_H
|
||||
#define __SOUNDDEFINES_H
|
||||
|
||||
/* the types of devices */
|
||||
enum
|
||||
{
|
||||
snd_e_dummydevice = 0,
|
||||
snd_e_fmoddevice,
|
||||
snd_e_openaldevice
|
||||
};
|
||||
|
||||
/* general stuff */
|
||||
#define NUM_BUFFERS 128
|
||||
#define NUM_SOURCES 16
|
||||
|
||||
/* openal related stuff */
|
||||
#define AL_LOOPING 0x1007
|
||||
|
||||
/* fmod related stuff */
|
||||
#ifdef WIN32
|
||||
#define MIXRATE 22050
|
||||
#else
|
||||
#define MIXRATE 44100
|
||||
#endif
|
||||
#define NUM_FMOD_MIN_HW_CHANNELS 16
|
||||
#define NUM_FMOD_MAX_HW_CHANNELS 16
|
||||
|
||||
/* activelist defines */
|
||||
enum
|
||||
{
|
||||
SND_REMOVE_ACTIVE_OBJECT = 0,
|
||||
SND_ADD_ACTIVE_OBJECT,
|
||||
SND_DO_NOTHING
|
||||
};
|
||||
|
||||
/* playstate flags */
|
||||
enum
|
||||
{
|
||||
SND_UNKNOWN = -1,
|
||||
SND_INITIAL,
|
||||
SND_MUST_PLAY,
|
||||
SND_PLAYING,
|
||||
SND_MUST_STOP,
|
||||
SND_STOPPED,
|
||||
SND_MUST_PAUSE,
|
||||
SND_PAUSED,
|
||||
SND_MUST_RESUME,
|
||||
SND_MUST_STOP_WHEN_FINISHED,
|
||||
SND_MUST_BE_DELETED
|
||||
};
|
||||
|
||||
/* loopmodes */
|
||||
enum
|
||||
{
|
||||
SND_LOOP_OFF = 0,
|
||||
SND_LOOP_NORMAL,
|
||||
SND_LOOP_BIDIRECTIONAL
|
||||
};
|
||||
|
||||
|
||||
/* cd playstate flags */
|
||||
enum
|
||||
{
|
||||
SND_CD_ALL = 0,
|
||||
SND_CD_TRACK,
|
||||
SND_CD_TRACKLOOP
|
||||
};
|
||||
|
||||
/* sample types */
|
||||
enum
|
||||
{
|
||||
SND_WAVE_FORMAT_UNKNOWN = 0,
|
||||
SND_WAVE_FORMAT_PCM,
|
||||
SND_WAVE_FORMAT_ADPCM,
|
||||
SND_WAVE_FORMAT_ALAW = 6,
|
||||
SND_WAVE_FORMAT_MULAW,
|
||||
SND_WAVE_FORMAT_DIALOGIC_OKI_ADPCM = 17,
|
||||
SND_WAVE_FORMAT_CONTROL_RES_VQLPC = 34,
|
||||
SND_WAVE_FORMAT_GSM_610 = 49,
|
||||
SND_WAVE_FORMAT_MPEG3 = 85
|
||||
};
|
||||
|
||||
#endif //__SOUNDDEFINES_H
|
46
intern/SoundSystem/dummy/Makefile
Normal file
46
intern/SoundSystem/dummy/Makefile
Normal file
@@ -0,0 +1,46 @@
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
# ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
#
|
||||
# This program 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
|
||||
# of the License, or (at your option) any later version. The Blender
|
||||
# Foundation also sells licenses for use in proprietary software under
|
||||
# the Blender License. See http://www.blender.org/BL/ for information
|
||||
# about this.
|
||||
#
|
||||
# This program 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 this program; if not, write to the Free Software Foundation,
|
||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
#
|
||||
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
# All rights reserved.
|
||||
#
|
||||
# The Original Code is: all of this file.
|
||||
#
|
||||
# Contributor(s): none yet.
|
||||
#
|
||||
# ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
#
|
||||
#
|
||||
|
||||
LIBNAME = DummySoundSystem
|
||||
DIR = $(OCGDIR)/gameengine/$(LIBNAME)
|
||||
|
||||
include nan_compile.mk
|
||||
|
||||
CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
|
||||
|
||||
CPPFLAGS += -I$(NAN_STRING)/include
|
||||
CPPFLAGS += -I$(NAN_MOTO)/include
|
||||
CPPFLAGS += -I../../../../kernel/gen_system
|
||||
CPPFLAGS += -I../intern
|
||||
CPPFLAGS += -I..
|
||||
CPPFLAGS += -I.
|
53
intern/SoundSystem/dummy/SND_DummyDevice.cpp
Normal file
53
intern/SoundSystem/dummy/SND_DummyDevice.cpp
Normal file
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
*
|
||||
* This program 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
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
* SND_FmodDevice derived from SND_IAudioDevice
|
||||
*/
|
||||
|
||||
#ifdef WIN32
|
||||
#pragma warning (disable:4786) // get rid of stupid stl-visual compiler debug warning
|
||||
#endif //WIN32
|
||||
|
||||
#include "SND_DummyDevice.h"
|
||||
|
||||
SND_DummyDevice::SND_DummyDevice()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
SND_DummyDevice::~SND_DummyDevice()
|
||||
{
|
||||
#ifdef ONTKEVER
|
||||
printf("SND_DummyDevice destructor");
|
||||
#endif
|
||||
}
|
||||
|
||||
|
95
intern/SoundSystem/dummy/SND_DummyDevice.h
Normal file
95
intern/SoundSystem/dummy/SND_DummyDevice.h
Normal file
@@ -0,0 +1,95 @@
|
||||
/**
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
*
|
||||
* This program 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
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
*/
|
||||
#ifndef SND_DUMMYDEVICE
|
||||
#define SND_DUMMYDEVICE
|
||||
|
||||
#include "SND_AudioDevice.h"
|
||||
|
||||
class SND_DummyDevice : public SND_AudioDevice
|
||||
{
|
||||
public:
|
||||
SND_DummyDevice();
|
||||
~SND_DummyDevice();
|
||||
|
||||
bool Init() { return false; }
|
||||
|
||||
SND_WaveSlot* LoadSample(const STR_String& samplename,
|
||||
void* memlocation,
|
||||
int size) { return NULL; }
|
||||
|
||||
void InitListener() {};
|
||||
void SetListenerGain(float gain) const {};
|
||||
void SetDopplerVelocity(MT_Scalar dopplervelocity) const {};
|
||||
void SetDopplerFactor(MT_Scalar dopplerfactor) const {};
|
||||
void SetListenerRollOffFactor(MT_Scalar rollofffactor) const {};
|
||||
|
||||
void MakeCurrent() const {};
|
||||
|
||||
void NextFrame() const {};
|
||||
|
||||
void SetObjectBuffer(int id, unsigned int buffer) {};
|
||||
|
||||
int GetPlayState(int id) { return SND_UNKNOWN; }
|
||||
void PlayObject(int id) {};
|
||||
void StopObject(int id) const {};
|
||||
void StopAllObjects() {};
|
||||
void PauseObject(int id) const {};
|
||||
|
||||
void SetObjectLoop(int id, unsigned int loopmode) const {};
|
||||
void SetObjectLoopPoints(int id, unsigned int loopstart, unsigned int loopend) const {};
|
||||
void SetObjectPitch(int id, MT_Scalar pitch) const {};
|
||||
void SetObjectGain(int id, MT_Scalar gain) const {};
|
||||
void SetObjectMinGain(int id, MT_Scalar mingain) const {};
|
||||
void SetObjectMaxGain(int id, MT_Scalar maxgain) const {};
|
||||
void SetObjectRollOffFactor(int id, MT_Scalar rolloff) const {};
|
||||
void SetObjectReferenceDistance(int id, MT_Scalar distance) const {};
|
||||
|
||||
void SetObjectTransform(int id,
|
||||
const MT_Vector3& position,
|
||||
const MT_Vector3& velocity,
|
||||
const MT_Matrix3x3& orientation,
|
||||
const MT_Vector3& lisposition,
|
||||
const MT_Scalar& rollofffactor) const {};
|
||||
void ObjectIs2D(int id) const {};
|
||||
|
||||
void PlayCD(int track) const {};
|
||||
void PauseCD(bool pause) const {};
|
||||
void StopCD() const {};
|
||||
void SetCDPlaymode(int playmode) const {};
|
||||
void SetCDGain(MT_Scalar gain) const {};
|
||||
|
||||
void StartUsingDSP() {};
|
||||
float* GetSpectrum() { return NULL; }
|
||||
void StopUsingDSP() {};
|
||||
};
|
||||
|
||||
#endif //SND_DUMMYDEVICE
|
47
intern/SoundSystem/fmod/Makefile
Normal file
47
intern/SoundSystem/fmod/Makefile
Normal file
@@ -0,0 +1,47 @@
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
# ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
#
|
||||
# This program 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
|
||||
# of the License, or (at your option) any later version. The Blender
|
||||
# Foundation also sells licenses for use in proprietary software under
|
||||
# the Blender License. See http://www.blender.org/BL/ for information
|
||||
# about this.
|
||||
#
|
||||
# This program 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 this program; if not, write to the Free Software Foundation,
|
||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
#
|
||||
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
# All rights reserved.
|
||||
#
|
||||
# The Original Code is: all of this file.
|
||||
#
|
||||
# Contributor(s): none yet.
|
||||
#
|
||||
# ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
#
|
||||
#
|
||||
|
||||
LIBNAME = FmodSoundSystem
|
||||
DIR = $(OCGDIR)/gameengine/$(LIBNAME)
|
||||
|
||||
include nan_compile.mk
|
||||
|
||||
CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
|
||||
|
||||
CPPFLAGS += -I$(NAN_FMOD)/include
|
||||
CPPFLAGS += -I$(NAN_STRING)/include
|
||||
CPPFLAGS += -I$(NAN_MOTO)/include
|
||||
CPPFLAGS += -I../../../kernel/gen_system
|
||||
CPPFLAGS += -I../intern
|
||||
CPPFLAGS += -I..
|
||||
CPPFLAGS += -I.
|
543
intern/SoundSystem/fmod/SND_FmodDevice.cpp
Normal file
543
intern/SoundSystem/fmod/SND_FmodDevice.cpp
Normal file
@@ -0,0 +1,543 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
*
|
||||
* This program 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
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
* SND_FmodDevice derived from SND_IAudioDevice
|
||||
*/
|
||||
|
||||
#ifdef WIN32
|
||||
#pragma warning (disable:4786) // get rid of stupid stl-visual compiler debug warning
|
||||
#endif //WIN32
|
||||
|
||||
#include "SND_FmodDevice.h"
|
||||
#include "SoundDefines.h"
|
||||
#include "SYS_System.h"
|
||||
#include "SND_Utils.h"
|
||||
|
||||
SND_FmodDevice::SND_FmodDevice()
|
||||
{
|
||||
// check if audio is wanted
|
||||
SYS_SystemHandle syshandle = SYS_GetSystem();
|
||||
int audio = SYS_GetCommandLineInt(syshandle,"noaudio",0);
|
||||
|
||||
m_dspunit = NULL;
|
||||
|
||||
if (audio == 1)
|
||||
m_audio = false;
|
||||
else
|
||||
m_audio = true;
|
||||
|
||||
// let's check if we can get fmod to initialize...
|
||||
if (m_audio)
|
||||
{
|
||||
signed char MinHardwareChannels = FSOUND_SetMinHardwareChannels(NUM_FMOD_MIN_HW_CHANNELS);
|
||||
signed char MaxHardwareChannels = FSOUND_SetMaxHardwareChannels(NUM_FMOD_MAX_HW_CHANNELS);
|
||||
|
||||
if (FSOUND_Init(MIXRATE, NUM_SOURCES, 0))
|
||||
{
|
||||
m_max_channels = FSOUND_GetMaxChannels();
|
||||
m_num_hardware_channels = FSOUND_GetNumHardwareChannels();
|
||||
m_num_software_channels = NUM_SOURCES;
|
||||
|
||||
// let's get us a wavecache
|
||||
m_wavecache = new SND_WaveCache();
|
||||
|
||||
int i;
|
||||
for (i = 0; i < NUM_BUFFERS; i++)
|
||||
m_buffers[i] = NULL;
|
||||
|
||||
for (i = 0; i < NUM_SOURCES; i++)
|
||||
{
|
||||
m_sources[i] = NULL;
|
||||
m_frequencies[i] = 0;
|
||||
m_channels[i] = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_audio = false;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef ONTKEVER
|
||||
int numdrivers = FSOUND_GetNumDrivers();
|
||||
int output = FSOUND_GetOutput();
|
||||
int oputputrate = FSOUND_GetOutputRate();
|
||||
int mixer = FSOUND_GetMixer();
|
||||
|
||||
printf("maxchannels is: %d\n", m_max_channels);
|
||||
printf("num hw channels is: %d\n", m_num_hardware_channels);
|
||||
printf("num sw channels is: %d\n", m_num_software_channels);
|
||||
printf("numdrivers is: %d\n", numdrivers);
|
||||
printf("output is: %d\n", output);
|
||||
printf("oputputrate is: %d\n", oputputrate);
|
||||
printf("mixer is: %d\n", mixer);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
SND_FmodDevice::~SND_FmodDevice()
|
||||
{
|
||||
// let's see if we used the cd. if not, just leave it alone
|
||||
SND_CDObject* pCD = SND_CDObject::Instance();
|
||||
|
||||
if (pCD)
|
||||
{
|
||||
this->StopCD();
|
||||
SND_CDObject::DisposeSystem();
|
||||
}
|
||||
|
||||
StopUsingDSP();
|
||||
|
||||
FSOUND_Close();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_FmodDevice::UseCD() const
|
||||
{
|
||||
// only fmod has CD support, so only create it here
|
||||
SND_CDObject::CreateSystem();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_FmodDevice::MakeCurrent() const
|
||||
{
|
||||
// empty
|
||||
}
|
||||
|
||||
|
||||
|
||||
SND_WaveSlot* SND_FmodDevice::LoadSample(const STR_String& name,
|
||||
void* memlocation,
|
||||
int size)
|
||||
{
|
||||
SND_WaveSlot* waveslot = NULL;
|
||||
STR_String samplename = name;
|
||||
|
||||
if (m_audio)
|
||||
{
|
||||
/* first check if the sample is supported */
|
||||
if (SND_IsSampleValid(name, memlocation))
|
||||
{
|
||||
/* create the waveslot */
|
||||
waveslot = m_wavecache->GetWaveSlot(samplename);
|
||||
|
||||
if (waveslot)
|
||||
{
|
||||
int buffer = waveslot->GetBuffer();
|
||||
|
||||
/* load the sample from memory? */
|
||||
if (size && memlocation)
|
||||
{
|
||||
m_buffers[buffer] = FSOUND_Sample_Load(buffer, (char*)memlocation, FSOUND_LOADMEMORY, size);
|
||||
|
||||
/* if the loading succeeded, fill the waveslot with info */
|
||||
if (m_buffers[buffer])
|
||||
{
|
||||
int sampleformat = SND_GetSampleFormat(memlocation);
|
||||
int numberofchannels = SND_GetNumberOfChannels(memlocation);
|
||||
int samplerate = SND_GetSampleRate(memlocation);
|
||||
int bitrate = SND_GetBitRate(memlocation);
|
||||
int numberofsamples = SND_GetNumberOfSamples(memlocation);
|
||||
|
||||
waveslot->SetFileSize(size);
|
||||
waveslot->SetData(memlocation);
|
||||
waveslot->SetSampleFormat(sampleformat);
|
||||
waveslot->SetNumberOfChannels(numberofchannels);
|
||||
waveslot->SetSampleRate(samplerate);
|
||||
waveslot->SetBitRate(bitrate);
|
||||
waveslot->SetNumberOfSamples(numberofsamples);
|
||||
}
|
||||
}
|
||||
/* or from file? */
|
||||
else
|
||||
{
|
||||
m_buffers[buffer] = FSOUND_Sample_Load(buffer, samplename.Ptr(), FSOUND_LOOP_NORMAL, NULL);
|
||||
}
|
||||
|
||||
#ifdef ONTKEVER
|
||||
int error = FSOUND_GetError();
|
||||
printf("sample load: errornumber is: %d\n", error);
|
||||
#endif
|
||||
|
||||
/* if the loading succeeded, mark the waveslot */
|
||||
if (m_buffers[buffer])
|
||||
{
|
||||
waveslot->SetLoaded(true);
|
||||
}
|
||||
/* or when it failed, free the waveslot */
|
||||
else
|
||||
{
|
||||
m_wavecache->RemoveSample(waveslot->GetSampleName(), waveslot->GetBuffer());
|
||||
waveslot = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return waveslot;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// listener's and general stuff //////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
/* sets the global dopplervelocity */
|
||||
void SND_FmodDevice::SetDopplerVelocity(MT_Scalar dopplervelocity) const
|
||||
{
|
||||
/* not supported by fmod */
|
||||
FSOUND_3D_Listener_SetDopplerFactor(dopplervelocity);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* sets the global dopplerfactor */
|
||||
void SND_FmodDevice::SetDopplerFactor(MT_Scalar dopplerfactor) const
|
||||
{
|
||||
FSOUND_3D_Listener_SetDopplerFactor(dopplerfactor);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* sets the global rolloff factor */
|
||||
void SND_FmodDevice::SetListenerRollOffFactor(MT_Scalar rollofffactor) const
|
||||
{
|
||||
// not implemented in openal
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_FmodDevice::NextFrame() const
|
||||
{
|
||||
FSOUND_3D_Update();
|
||||
}
|
||||
|
||||
|
||||
|
||||
// set the gain for the listener
|
||||
void SND_FmodDevice::SetListenerGain(float gain) const
|
||||
{
|
||||
int fmod_gain = (int)(gain * 255);
|
||||
FSOUND_SetSFXMasterVolume(fmod_gain);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_FmodDevice::InitListener()
|
||||
{
|
||||
// initialize the listener with these values that won't change
|
||||
// (as long as we can have only one listener)
|
||||
// now we can superimpose all listeners on each other (for they
|
||||
// have the same settings)
|
||||
float lispos[3] = {0,0,0};
|
||||
float lisvel[3] = {0,0,0};
|
||||
|
||||
FSOUND_3D_Listener_SetAttributes(lispos, lisvel, 0, -1, 0, 0, 0, 1);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// source playstate stuff ////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
// check if the sound's still playing
|
||||
int SND_FmodDevice::GetPlayState(int id)
|
||||
{
|
||||
int result = SND_STOPPED;
|
||||
|
||||
// klopt niet, fixen
|
||||
signed char isplaying = FSOUND_IsPlaying(id);
|
||||
|
||||
if (isplaying)
|
||||
{
|
||||
result = SND_PLAYING;
|
||||
}
|
||||
|
||||
/* hi reevan, just swap // of these 2 lines */
|
||||
// return result;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* sets the buffer */
|
||||
void SND_FmodDevice::SetObjectBuffer(int id, unsigned int buffer)
|
||||
{
|
||||
m_sources[id] = m_buffers[buffer];
|
||||
}
|
||||
|
||||
|
||||
|
||||
// make the source play
|
||||
void SND_FmodDevice::PlayObject(int id)
|
||||
{
|
||||
m_channels[id] = FSOUND_PlaySound(FSOUND_FREE, m_sources[id]);
|
||||
m_frequencies[id] = FSOUND_GetFrequency(m_channels[id]);
|
||||
// printf("fmod: play \n");
|
||||
}
|
||||
|
||||
|
||||
|
||||
// make the source stop
|
||||
void SND_FmodDevice::StopObject(int id) const
|
||||
{
|
||||
FSOUND_StopSound(m_channels[id]);
|
||||
// printf("fmod: stop \n");
|
||||
}
|
||||
|
||||
|
||||
|
||||
// stop all sources
|
||||
void SND_FmodDevice::StopAllObjects()
|
||||
{
|
||||
FSOUND_StopSound(FSOUND_ALL);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// pause the source
|
||||
void SND_FmodDevice::PauseObject(int id) const
|
||||
{
|
||||
FSOUND_StopSound(m_channels[id]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// source properties stuff ////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
// give openal the object's pitch
|
||||
void SND_FmodDevice::SetObjectPitch(int id, MT_Scalar pitch) const
|
||||
{
|
||||
pitch = pitch * m_frequencies[id];
|
||||
char result = FSOUND_SetFrequency(m_channels[id], (int)pitch);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// give openal the object's gain
|
||||
void SND_FmodDevice::SetObjectGain(int id, MT_Scalar gain) const
|
||||
{
|
||||
int vol = (int)(gain * 255);
|
||||
FSOUND_SetVolume(m_channels[id], vol);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// give openal the object's looping
|
||||
void SND_FmodDevice::SetObjectLoop(int id, unsigned int loopmode) const
|
||||
{
|
||||
// printf("loopmode: %d\n", loopmode);
|
||||
switch (loopmode)
|
||||
{
|
||||
case SND_LOOP_OFF:
|
||||
{
|
||||
char result = FSOUND_Sample_SetLoopMode(m_sources[id], FSOUND_LOOP_OFF);
|
||||
// char result = FSOUND_SetLoopMode(m_channels[id], FSOUND_LOOP_OFF);
|
||||
break;
|
||||
}
|
||||
case SND_LOOP_NORMAL:
|
||||
{
|
||||
char result = FSOUND_Sample_SetLoopMode(m_sources[id], FSOUND_LOOP_NORMAL);
|
||||
// char result = FSOUND_SetLoopMode(m_channels[id], FSOUND_LOOP_NORMAL);
|
||||
break;
|
||||
}
|
||||
case SND_LOOP_BIDIRECTIONAL:
|
||||
{
|
||||
char result = FSOUND_Sample_SetLoopMode(m_sources[id], FSOUND_LOOP_BIDI);
|
||||
// char result = FSOUND_SetLoopMode(m_channels[id], FSOUND_LOOP_NORMAL);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_FmodDevice::SetObjectLoopPoints(int id, unsigned int loopstart, unsigned int loopend) const
|
||||
{
|
||||
FSOUND_Sample_SetLoopPoints(m_sources[id], loopstart, loopend);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_FmodDevice::SetObjectMinGain(int id, MT_Scalar mingain) const
|
||||
{
|
||||
/* not supported by fmod */
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_FmodDevice::SetObjectMaxGain(int id, MT_Scalar maxgain) const
|
||||
{
|
||||
/* not supported by fmod */
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_FmodDevice::SetObjectRollOffFactor(int id, MT_Scalar rollofffactor) const
|
||||
{
|
||||
/* not supported by fmod */
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_FmodDevice::SetObjectReferenceDistance(int id, MT_Scalar referencedistance) const
|
||||
{
|
||||
/* not supported by fmod */
|
||||
}
|
||||
|
||||
|
||||
|
||||
// give openal the object's position
|
||||
void SND_FmodDevice::ObjectIs2D(int id) const
|
||||
{
|
||||
float obpos[3] = {0,0,0};
|
||||
float obvel[3] = {0,0,0};
|
||||
|
||||
FSOUND_3D_SetAttributes(m_channels[id], obpos, obvel);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_FmodDevice::SetObjectTransform(int id,
|
||||
const MT_Vector3& position,
|
||||
const MT_Vector3& velocity,
|
||||
const MT_Matrix3x3& orientation,
|
||||
const MT_Vector3& lisposition,
|
||||
const MT_Scalar& rollofffactor) const
|
||||
{
|
||||
float obpos[3];
|
||||
float obvel[3];
|
||||
|
||||
obpos[0] = (float)position[0] * (float)rollofffactor; //x (l/r)
|
||||
obpos[1] = (float)position[1] * (float)rollofffactor;
|
||||
obpos[2] = (float)position[2] * (float)rollofffactor;
|
||||
|
||||
velocity.getValue(obvel);
|
||||
FSOUND_3D_SetAttributes(m_channels[id], obpos, obvel);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// cd support stuff ////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
void SND_FmodDevice::PlayCD(int track) const
|
||||
{
|
||||
signed char result = FSOUND_CD_Play(track);
|
||||
|
||||
#ifdef ONTKEVER
|
||||
printf("play track %d, result: %c\n", track, result);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_FmodDevice::PauseCD(bool pause) const
|
||||
{
|
||||
signed char result = FSOUND_CD_SetPaused(pause);
|
||||
|
||||
#ifdef ONTKEVER
|
||||
printf("pause cd: %d, result: %c\n", pause, result);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_FmodDevice::StopCD() const
|
||||
{
|
||||
SND_CDObject* pCD = SND_CDObject::Instance();
|
||||
|
||||
if (pCD)
|
||||
{
|
||||
if (pCD->GetUsed())
|
||||
{
|
||||
signed char result = FSOUND_CD_Stop();
|
||||
|
||||
#ifdef ONTKEVER
|
||||
printf("stop cd, result: %c\n", result);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_FmodDevice::SetCDPlaymode(int playmode) const
|
||||
{
|
||||
FSOUND_CD_SetPlayMode(playmode);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_FmodDevice::SetCDGain(MT_Scalar gain) const
|
||||
{
|
||||
int volume = gain * 255;
|
||||
signed char result = FSOUND_CD_SetVolume(volume);
|
||||
|
||||
#ifdef ONTKEVER
|
||||
printf("gain: %f, volume: %d, result: %c\n", gain, volume, result);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_FmodDevice::StartUsingDSP()
|
||||
{
|
||||
m_dspunit = FSOUND_DSP_GetFFTUnit();
|
||||
|
||||
FSOUND_DSP_SetActive(m_dspunit, true);
|
||||
}
|
||||
|
||||
|
||||
|
||||
float* SND_FmodDevice::GetSpectrum()
|
||||
{
|
||||
m_spectrum = FSOUND_DSP_GetSpectrum();
|
||||
|
||||
return m_spectrum;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_FmodDevice::StopUsingDSP()
|
||||
{
|
||||
if (m_dspunit)
|
||||
FSOUND_DSP_SetActive(m_dspunit, false);
|
||||
}
|
105
intern/SoundSystem/fmod/SND_FmodDevice.h
Normal file
105
intern/SoundSystem/fmod/SND_FmodDevice.h
Normal file
@@ -0,0 +1,105 @@
|
||||
/**
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
*
|
||||
* This program 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
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
*/
|
||||
#ifndef SND_FMODDEVICE
|
||||
#define SND_FMODDEVICE
|
||||
|
||||
#include "fmod.h"
|
||||
#include "SND_AudioDevice.h"
|
||||
#include "SoundDefines.h"
|
||||
|
||||
class SND_FmodDevice : public SND_AudioDevice
|
||||
{
|
||||
public:
|
||||
SND_FmodDevice();
|
||||
~SND_FmodDevice();
|
||||
|
||||
SND_WaveSlot* LoadSample(const STR_String& samplename,
|
||||
void* memlocation,
|
||||
int size);
|
||||
|
||||
void InitListener();
|
||||
void SetListenerGain(float gain) const;
|
||||
void SetDopplerVelocity(MT_Scalar dopplervelocity) const;
|
||||
void SetDopplerFactor(MT_Scalar dopplerfactor) const;
|
||||
void SetListenerRollOffFactor(MT_Scalar rollofffactor) const;
|
||||
|
||||
void MakeCurrent() const;
|
||||
void NextFrame() const;
|
||||
void UseCD() const;
|
||||
|
||||
void SetObjectBuffer(int id, unsigned int buffer);
|
||||
int GetPlayState(int id);
|
||||
void PlayObject(int id);
|
||||
void StopObject(int id) const;
|
||||
void StopAllObjects();
|
||||
void PauseObject(int id) const;
|
||||
|
||||
void SetObjectLoop(int id, unsigned int loopmode) const;
|
||||
void SetObjectLoopPoints(int id, unsigned int loopstart, unsigned int loopend) const;
|
||||
void SetObjectPitch(int id, MT_Scalar pitch) const;
|
||||
void SetObjectGain(int id, MT_Scalar gain) const;
|
||||
void SetObjectMinGain(int id, MT_Scalar mingain) const;
|
||||
void SetObjectMaxGain(int id, MT_Scalar maxgain) const;
|
||||
void SetObjectRollOffFactor(int id, MT_Scalar rolloff) const;
|
||||
void SetObjectReferenceDistance(int id, MT_Scalar distance) const;
|
||||
|
||||
void SetObjectTransform(int id,
|
||||
const MT_Vector3& position,
|
||||
const MT_Vector3& velocity,
|
||||
const MT_Matrix3x3& orientation,
|
||||
const MT_Vector3& lisposition,
|
||||
const MT_Scalar& rollofffactor) const;
|
||||
void ObjectIs2D(int id) const;
|
||||
|
||||
void PlayCD(int track) const;
|
||||
void PauseCD(bool pause) const;
|
||||
void StopCD() const;
|
||||
void SetCDPlaymode(int playmode) const;
|
||||
void SetCDGain(MT_Scalar gain) const;
|
||||
|
||||
void StartUsingDSP();
|
||||
float* GetSpectrum();
|
||||
void StopUsingDSP();
|
||||
|
||||
private:
|
||||
FSOUND_SAMPLE* m_buffers[NUM_BUFFERS];
|
||||
FSOUND_SAMPLE* m_sources[NUM_SOURCES];
|
||||
FSOUND_DSPUNIT* m_dspunit;
|
||||
int m_frequencies[NUM_SOURCES];
|
||||
int m_max_channels;
|
||||
int m_num_hardware_channels;
|
||||
int m_num_software_channels;
|
||||
int m_channels[NUM_SOURCES];
|
||||
float* m_spectrum;
|
||||
};
|
||||
|
||||
#endif //SND_FMODDEVICE
|
50
intern/SoundSystem/intern/Makefile
Normal file
50
intern/SoundSystem/intern/Makefile
Normal file
@@ -0,0 +1,50 @@
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
# ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
#
|
||||
# This program 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
|
||||
# of the License, or (at your option) any later version. The Blender
|
||||
# Foundation also sells licenses for use in proprietary software under
|
||||
# the Blender License. See http://www.blender.org/BL/ for information
|
||||
# about this.
|
||||
#
|
||||
# This program 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 this program; if not, write to the Free Software Foundation,
|
||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
#
|
||||
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
# All rights reserved.
|
||||
#
|
||||
# The Original Code is: all of this file.
|
||||
#
|
||||
# Contributor(s): none yet.
|
||||
#
|
||||
# ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
#
|
||||
#
|
||||
|
||||
LIBNAME = SoundSystem
|
||||
DIR = $(OCGDIR)/gameengine/$(LIBNAME)
|
||||
|
||||
include nan_compile.mk
|
||||
|
||||
CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
|
||||
|
||||
CPPFLAGS += -I$(NAN_FMOD)/include
|
||||
CPPFLAGS += -I$(NAN_STRING)/include
|
||||
CPPFLAGS += -I$(NAN_MOTO)/include
|
||||
CPPFLAGS += -I../../../kernel/gen_system
|
||||
CPPFLAGS += -I../../../blender/include
|
||||
CPPFLAGS += -I../dummy
|
||||
CPPFLAGS += -I../fmod
|
||||
CPPFLAGS += -I../openal
|
||||
CPPFLAGS += -I..
|
||||
CPPFLAGS += -I.
|
247
intern/SoundSystem/intern/SND_AudioDevice.cpp
Normal file
247
intern/SoundSystem/intern/SND_AudioDevice.cpp
Normal file
@@ -0,0 +1,247 @@
|
||||
/**
|
||||
* $Id$
|
||||
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
*
|
||||
* This program 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
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
#include "SND_AudioDevice.h"
|
||||
|
||||
#include "SND_SoundObject.h"
|
||||
|
||||
#ifdef WIN32
|
||||
// This warning tells us about truncation of __long__ stl-generated names.
|
||||
// It can occasionally cause DevStudio to have internal compiler warnings.
|
||||
#pragma warning( disable : 4786 )
|
||||
#endif
|
||||
|
||||
|
||||
SND_AudioDevice::SND_AudioDevice()
|
||||
{
|
||||
m_wavecache = NULL;
|
||||
m_audio = false;
|
||||
|
||||
for (int i = 0; i < NUM_SOURCES; i++)
|
||||
{
|
||||
m_idObjectArray[i] = new SND_IdObject();
|
||||
m_idObjectArray[i]->SetId(i);
|
||||
m_idObjectArray[i]->SetSoundObject(NULL);
|
||||
m_idObjectList.addTail(m_idObjectArray[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
SND_AudioDevice::~SND_AudioDevice()
|
||||
{
|
||||
for (int i = 0; i < NUM_SOURCES; i++)
|
||||
{
|
||||
delete m_idObjectArray[i];
|
||||
m_idObjectArray[i] = NULL;
|
||||
}
|
||||
|
||||
if (m_wavecache)
|
||||
{
|
||||
delete m_wavecache;
|
||||
m_wavecache = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool SND_AudioDevice::IsInitialized()
|
||||
{
|
||||
return m_audio;
|
||||
}
|
||||
|
||||
|
||||
|
||||
SND_WaveCache* SND_AudioDevice::GetWaveCache() const
|
||||
{
|
||||
return m_wavecache;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* seeks an unused id and returns it */
|
||||
bool SND_AudioDevice::GetNewId(SND_SoundObject* pObject)
|
||||
{
|
||||
#ifdef ONTKEVER
|
||||
printf("SND_AudioDevice::GetNewId\n");
|
||||
#endif
|
||||
|
||||
bool result;
|
||||
|
||||
// first, get the oldest (the first) idobject
|
||||
SND_IdObject* pIdObject = (SND_IdObject*)m_idObjectList.getHead();
|
||||
|
||||
if (pIdObject->isTail())
|
||||
{
|
||||
result = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// find the first id object which doesn't have a high priority soundobject
|
||||
bool ThisSoundMustStay = false;
|
||||
bool OutOfIds = false;
|
||||
|
||||
do
|
||||
{
|
||||
// if no soundobject present, it's seat may be taken
|
||||
if (pIdObject->GetSoundObject())
|
||||
{
|
||||
// and also if it ain't highprio
|
||||
if (pIdObject->GetSoundObject()->IsHighPriority())
|
||||
{
|
||||
ThisSoundMustStay = true;
|
||||
pIdObject = (SND_IdObject*)pIdObject->getNext();
|
||||
|
||||
// if the last one is a priority sound too, then there are no id's left
|
||||
// and we won't add any new sounds
|
||||
if (pIdObject->isTail())
|
||||
OutOfIds = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
ThisSoundMustStay = false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ThisSoundMustStay = false;
|
||||
}
|
||||
|
||||
} while (ThisSoundMustStay && !OutOfIds);
|
||||
|
||||
if (!OutOfIds)
|
||||
{
|
||||
SND_SoundObject* oldobject = oldobject = pIdObject->GetSoundObject();
|
||||
|
||||
// revoke the old object if present
|
||||
if (oldobject)
|
||||
{
|
||||
#ifdef ONTKEVER
|
||||
printf("oldobject: %x\n", oldobject);
|
||||
#endif
|
||||
RevokeSoundObject(oldobject);
|
||||
}
|
||||
|
||||
// set the new soundobject into the idobject
|
||||
pIdObject->SetSoundObject(pObject);
|
||||
|
||||
// set the id into the soundobject
|
||||
int id = pIdObject->GetId();
|
||||
pObject->SetId(id);
|
||||
|
||||
// connect the new id to the buffer the sample is stored in
|
||||
SetObjectBuffer(id, pObject->GetBuffer());
|
||||
|
||||
// remove the idobject from the list and add it in the back again
|
||||
pIdObject->remove();
|
||||
m_idObjectList.addTail(pIdObject);
|
||||
|
||||
result = true;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_AudioDevice::ClearId(SND_SoundObject* pObject)
|
||||
{
|
||||
#ifdef ONTKEVER
|
||||
printf("SND_AudioDevice::ClearId\n");
|
||||
#endif
|
||||
|
||||
if (pObject)
|
||||
{
|
||||
int id = pObject->GetId();
|
||||
|
||||
if (id != -1)
|
||||
{
|
||||
// lets get the idobject belonging to the soundobject
|
||||
SND_IdObject* pIdObject = m_idObjectArray[id];
|
||||
SND_SoundObject* oldobject = pIdObject->GetSoundObject();
|
||||
|
||||
if (oldobject)
|
||||
{
|
||||
RevokeSoundObject(oldobject);
|
||||
|
||||
// clear the idobject from the soundobject
|
||||
pIdObject->SetSoundObject(NULL);
|
||||
}
|
||||
|
||||
// remove the idobject and place it in front
|
||||
pIdObject->remove();
|
||||
m_idObjectList.addHead(pIdObject);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_AudioDevice::RevokeSoundObject(SND_SoundObject* pObject)
|
||||
{
|
||||
#ifdef ONTKEVER
|
||||
printf("SND_AudioDevice::RevokeSoundObject\n");
|
||||
#endif
|
||||
|
||||
// stop the soundobject
|
||||
int id = pObject->GetId();
|
||||
|
||||
if (id >= 0 && id < NUM_SOURCES)
|
||||
{
|
||||
StopObject(id);
|
||||
|
||||
// remove the object from the 'activelist'
|
||||
pObject->SetActive(false);
|
||||
|
||||
#ifdef ONTKEVER
|
||||
printf("pObject->remove();\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
// make sure its id is invalid
|
||||
pObject->SetId(-1);
|
||||
}
|
||||
|
||||
/*
|
||||
void SND_AudioDevice::RemoveSample(const char* filename)
|
||||
{
|
||||
if (m_wavecache)
|
||||
m_wavecache->RemoveSample(filename);
|
||||
}
|
||||
*/
|
||||
|
||||
void SND_AudioDevice::RemoveAllSamples()
|
||||
{
|
||||
if (m_wavecache)
|
||||
m_wavecache->RemoveAllSamples();
|
||||
}
|
||||
|
118
intern/SoundSystem/intern/SND_AudioDevice.h
Normal file
118
intern/SoundSystem/intern/SND_AudioDevice.h
Normal file
@@ -0,0 +1,118 @@
|
||||
/**
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
*
|
||||
* This program 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
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
*/
|
||||
#ifndef SND_AUDIODEVICE
|
||||
#define SND_AUDIODEVICE
|
||||
|
||||
#include "SND_IAudioDevice.h"
|
||||
#include "SoundDefines.h"
|
||||
#include "SND_IdObject.h"
|
||||
|
||||
|
||||
class SND_AudioDevice : public SND_IAudioDevice
|
||||
{
|
||||
public:
|
||||
SND_AudioDevice();
|
||||
virtual ~SND_AudioDevice();
|
||||
|
||||
virtual bool IsInitialized();
|
||||
|
||||
SND_WaveCache* GetWaveCache() const;
|
||||
|
||||
bool GetNewId(SND_SoundObject* pObject);
|
||||
void ClearId(SND_SoundObject* pObject);
|
||||
|
||||
void UseCD() const {};
|
||||
|
||||
/* to be implemented in derived class
|
||||
|
||||
virtual SND_WaveSlot* LoadSample(const STR_String& samplename,
|
||||
void* memlocation,
|
||||
int size) =0;
|
||||
*/
|
||||
// void RemoveSample(const char* filename);
|
||||
void RemoveAllSamples();
|
||||
|
||||
/* to be implemented in derived class
|
||||
|
||||
virtual void InitListener()=0;
|
||||
virtual void SetListenerGain(float gain) const =0;
|
||||
virtual void SetDopplerVelocity(MT_Scalar dopplervelocity) const =0;
|
||||
virtual void SetDopplerFactor(MT_Scalar dopplerfactor) const =0;
|
||||
virtual void SetListenerRollOffFactor(MT_Scalar rollofffactor) const =0;
|
||||
|
||||
virtual void MakeCurrent() const =0;
|
||||
|
||||
virtual void UpdateDevice() const =0;
|
||||
|
||||
virtual void SetObjectBuffer(int id, unsigned int buffer)=0;
|
||||
virtual int GetPlayState(int id)=0;
|
||||
virtual void PlayObject(int id)=0;
|
||||
virtual void StopObject(int id) const =0;
|
||||
virtual void StopAllObjects()=0;
|
||||
virtual void PauseObject(int id) const =0;
|
||||
|
||||
virtual void SetObjectLoop(int id, bool loop) const =0;
|
||||
virtual void SetObjectLoopPoints(int id, unsigned int loopstart, unsigned int loopend) const =0;
|
||||
virtual void SetObjectPitch(int id, MT_Scalar pitch) const =0;
|
||||
virtual void SetObjectGain(int id, MT_Scalar gain) const =0;
|
||||
virtual void SetObjectRollOffFactor(int id, MT_Scalar rolloff) const =0;
|
||||
virtual void SetObjectMinGain(int id, MT_Scalar mingain) const =0;
|
||||
virtual void SetObjectMaxGain(int id, MT_Scalar maxgain) const =0;
|
||||
virtual void SetObjectReferenceDistance(int id, MT_Scalar referencedistance) const =0;
|
||||
|
||||
virtual void SetObjectTransform(int id,
|
||||
const MT_Vector3& position,
|
||||
const MT_Vector3& velocity,
|
||||
const MT_Matrix3x3& orientation,
|
||||
const MT_Vector3& lisposition,
|
||||
const MT_Scalar& rollofffactor) const =0;
|
||||
virtual void ObjectIs2D(int id) const =0;
|
||||
|
||||
virtual void PlayCD(int track) const =0;
|
||||
virtual void PauseCD(bool pause) const =0;
|
||||
virtual void StopCD() const =0;
|
||||
virtual void SetCDPlaymode(int playmode) const =0;
|
||||
virtual void SetCDGain(MT_Scalar gain) const =0;
|
||||
virtual float* GetSpectrum() =0;
|
||||
*/
|
||||
|
||||
protected:
|
||||
bool m_audio;
|
||||
GEN_List m_idObjectList;
|
||||
SND_IdObject* m_idObjectArray[NUM_SOURCES];
|
||||
SND_WaveCache* m_wavecache;
|
||||
|
||||
private:
|
||||
void RevokeSoundObject(SND_SoundObject* pObject);
|
||||
};
|
||||
|
||||
#endif //SND_AUDIODEVICE
|
391
intern/SoundSystem/intern/SND_C-api.cpp
Normal file
391
intern/SoundSystem/intern/SND_C-api.cpp
Normal file
@@ -0,0 +1,391 @@
|
||||
/*
|
||||
* SND_C-Api.cpp
|
||||
*
|
||||
* C Api for soundmodule
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
*
|
||||
* This program 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
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
#include "SND_C-api.h"
|
||||
#include "SND_DeviceManager.h"
|
||||
#include "SND_Scene.h"
|
||||
|
||||
#ifdef WIN32
|
||||
#pragma warning (disable:4786) // get rid of stupid stl-visual compiler debug warning
|
||||
#endif //WIN32
|
||||
|
||||
|
||||
|
||||
void SND_SetDeviceType(int device_type)
|
||||
{
|
||||
SND_DeviceManager::SetDeviceType(device_type);
|
||||
}
|
||||
|
||||
|
||||
|
||||
SND_AudioDeviceInterfaceHandle SND_GetAudioDevice()
|
||||
{
|
||||
SND_IAudioDevice* audiodevice = NULL;
|
||||
|
||||
SND_DeviceManager::Subscribe();
|
||||
audiodevice = SND_DeviceManager::Instance();
|
||||
|
||||
if (!audiodevice->IsInitialized())
|
||||
{
|
||||
SND_DeviceManager::SetDeviceType(snd_e_dummydevice);
|
||||
audiodevice = SND_DeviceManager::Instance();
|
||||
}
|
||||
|
||||
return (SND_AudioDeviceInterfaceHandle)audiodevice;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_ReleaseDevice()
|
||||
{
|
||||
SND_DeviceManager::Unsubscribe();
|
||||
}
|
||||
|
||||
|
||||
|
||||
int SND_IsPlaybackWanted(SND_SceneHandle scene)
|
||||
{
|
||||
assert(scene);
|
||||
bool result = ((SND_Scene*)scene)->IsPlaybackWanted();
|
||||
|
||||
return (int)result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// create a scene
|
||||
SND_SceneHandle SND_CreateScene(SND_AudioDeviceInterfaceHandle audiodevice)
|
||||
{
|
||||
// initialize sound scene and object
|
||||
SND_Scene* scene = new SND_Scene((SND_IAudioDevice*)audiodevice);
|
||||
|
||||
return (SND_SceneHandle)scene;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_DeleteScene(SND_SceneHandle scene)
|
||||
{
|
||||
assert(scene);
|
||||
delete (SND_Scene*)scene;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int SND_AddSample(SND_SceneHandle scene,
|
||||
const char* filename,
|
||||
void* memlocation,
|
||||
int size)
|
||||
{
|
||||
assert(scene);
|
||||
assert(memlocation);
|
||||
int buffer = ((SND_Scene*)scene)->LoadSample(filename, memlocation, size);
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_RemoveAllSamples(SND_SceneHandle scene)
|
||||
{
|
||||
assert(scene);
|
||||
((SND_Scene*)scene)->RemoveAllSamples();
|
||||
}
|
||||
|
||||
|
||||
|
||||
int SND_CheckBuffer(SND_SceneHandle scene, SND_ObjectHandle object)
|
||||
{
|
||||
assert(scene);
|
||||
assert(object);
|
||||
int result = (int)((SND_Scene*)scene)->CheckBuffer((SND_SoundObject*)object);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_AddSound(SND_SceneHandle scene, SND_ObjectHandle object)
|
||||
{
|
||||
assert(scene);
|
||||
assert(object);
|
||||
((SND_Scene*)scene)->AddObject((SND_SoundObject *)object);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_RemoveSound(SND_SceneHandle scene, SND_ObjectHandle object)
|
||||
{
|
||||
assert(scene);
|
||||
assert(object);
|
||||
((SND_Scene*)scene)->DeleteObject((SND_SoundObject *)object);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_RemoveAllSounds(SND_SceneHandle scene)
|
||||
{
|
||||
assert(scene);
|
||||
((SND_Scene*)scene)->RemoveAllObjects();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_StopAllSounds(SND_SceneHandle scene)
|
||||
{
|
||||
assert(scene);
|
||||
((SND_Scene*)scene)->StopAllObjects();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_Proceed(SND_AudioDeviceInterfaceHandle audiodevice, SND_SceneHandle scene)
|
||||
{
|
||||
assert(scene);
|
||||
((SND_Scene*)scene)->Proceed();
|
||||
((SND_IAudioDevice*)audiodevice)->NextFrame();
|
||||
}
|
||||
|
||||
|
||||
|
||||
SND_ListenerHandle SND_GetListener(SND_SceneHandle scene)
|
||||
{
|
||||
assert(scene);
|
||||
return (SND_ListenerHandle)((SND_Scene*)scene)->GetListener();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SetListenerGain(SND_SceneHandle scene, double gain)
|
||||
{
|
||||
assert(scene);
|
||||
SND_SoundListener* listener = ((SND_Scene*)scene)->GetListener();
|
||||
listener->SetGain((MT_Scalar)gain);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SetDopplerFactor(SND_SceneHandle scene, double dopplerfactor)
|
||||
{
|
||||
assert(scene);
|
||||
SND_SoundListener* listener = ((SND_Scene*)scene)->GetListener();
|
||||
listener->SetDopplerFactor(dopplerfactor);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SetDopplerVelocity(SND_SceneHandle scene, double dopplervelocity)
|
||||
{
|
||||
assert(scene);
|
||||
SND_SoundListener* listener = ((SND_Scene*)scene)->GetListener();
|
||||
listener->SetDopplerVelocity(dopplervelocity);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Object instantiation
|
||||
SND_ObjectHandle SND_CreateSound()
|
||||
{
|
||||
return (SND_ObjectHandle)new SND_SoundObject();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_DeleteSound(SND_ObjectHandle object)
|
||||
{
|
||||
assert(object);
|
||||
delete (SND_SoundObject*)object;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Object control
|
||||
void SND_StartSound(SND_SceneHandle scene, SND_ObjectHandle object)
|
||||
{
|
||||
assert(scene);
|
||||
assert(object);
|
||||
((SND_Scene*)scene)->AddActiveObject((SND_SoundObject*)object, 0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_StopSound(SND_SceneHandle scene, SND_ObjectHandle object)
|
||||
{
|
||||
assert(scene);
|
||||
assert(object);
|
||||
((SND_Scene*)scene)->RemoveActiveObject((SND_SoundObject*)object);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_PauseSound(SND_SceneHandle scene, SND_ObjectHandle object)
|
||||
{
|
||||
assert(scene);
|
||||
assert(object);
|
||||
((SND_Scene*)scene)->RemoveActiveObject((SND_SoundObject*)object);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SetSampleName(SND_ObjectHandle object, char* samplename)
|
||||
{
|
||||
assert(object);
|
||||
STR_String name = samplename;
|
||||
((SND_SoundObject*)object)->SetSampleName(name);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SetGain(SND_ObjectHandle object, double gain)
|
||||
{
|
||||
assert(object);
|
||||
((SND_SoundObject*)object)->SetGain(gain);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SetMinimumGain(SND_ObjectHandle object, double minimumgain)
|
||||
{
|
||||
assert(object);
|
||||
((SND_SoundObject*)object)->SetMinGain(minimumgain);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SetMaximumGain(SND_ObjectHandle object, double maximumgain)
|
||||
{
|
||||
assert(object);
|
||||
((SND_SoundObject*)object)->SetMaxGain(maximumgain);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SetRollOffFactor(SND_ObjectHandle object, double rollofffactor)
|
||||
{
|
||||
assert(object);
|
||||
((SND_SoundObject*)object)->SetRollOffFactor(rollofffactor);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SetReferenceDistance(SND_ObjectHandle object, double referencedistance)
|
||||
{
|
||||
assert(object);
|
||||
((SND_SoundObject*)object)->SetReferenceDistance(referencedistance);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SetPitch(SND_ObjectHandle object, double pitch)
|
||||
{
|
||||
assert(object);
|
||||
((SND_SoundObject*)object)->SetPitch(pitch);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SetPosition(SND_ObjectHandle object, double* position)
|
||||
{
|
||||
assert(object);
|
||||
((SND_SoundObject*)object)->SetPosition(position);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SetVelocity(SND_ObjectHandle object, double* velocity)
|
||||
{
|
||||
assert(object);
|
||||
((SND_SoundObject*)object)->SetVelocity(velocity);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SetOrientation(SND_ObjectHandle object, double* orientation)
|
||||
{
|
||||
assert(object);
|
||||
((SND_SoundObject*)object)->SetOrientation(orientation);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SetLoopMode(SND_ObjectHandle object, int loopmode)
|
||||
{
|
||||
assert(object);
|
||||
((SND_SoundObject*)object)->SetLoopMode(loopmode);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SetLoopPoints(SND_ObjectHandle object, unsigned int loopstart, unsigned int loopend)
|
||||
{
|
||||
assert(object);
|
||||
((SND_SoundObject*)object)->SetLoopStart(loopstart);
|
||||
((SND_SoundObject*)object)->SetLoopEnd(loopend);
|
||||
}
|
||||
|
||||
|
||||
|
||||
float SND_GetGain(SND_ObjectHandle object)
|
||||
{
|
||||
assert(object);
|
||||
MT_Scalar gain = ((SND_SoundObject*)object)->GetGain();
|
||||
return (float) gain;
|
||||
}
|
||||
|
||||
|
||||
|
||||
float SND_GetPitch(SND_ObjectHandle object)
|
||||
{
|
||||
assert(object);
|
||||
MT_Scalar pitch = ((SND_SoundObject*)object)->GetPitch();
|
||||
return (float) pitch;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int SND_GetLoopMode(SND_ObjectHandle object)
|
||||
{
|
||||
assert(object);
|
||||
return ((SND_SoundObject*)object)->GetLoopMode();
|
||||
}
|
||||
|
||||
|
||||
|
||||
int SND_GetPlaystate(SND_ObjectHandle object)
|
||||
{
|
||||
assert(object);
|
||||
return ((SND_SoundObject*)object)->GetPlaystate();
|
||||
}
|
182
intern/SoundSystem/intern/SND_CDObject.cpp
Normal file
182
intern/SoundSystem/intern/SND_CDObject.cpp
Normal file
@@ -0,0 +1,182 @@
|
||||
/*
|
||||
* SND_CDObject.cpp
|
||||
*
|
||||
* Implementation for CD playback
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
*
|
||||
* This program 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
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
#include "SND_CDObject.h"
|
||||
|
||||
|
||||
SND_CDObject* SND_CDObject::m_instance = NULL;
|
||||
|
||||
bool SND_CDObject::CreateSystem()
|
||||
{
|
||||
bool result = false;
|
||||
|
||||
if (!m_instance)
|
||||
{
|
||||
m_instance = new SND_CDObject();
|
||||
result = true;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool SND_CDObject::DisposeSystem()
|
||||
{
|
||||
bool result = false;
|
||||
|
||||
if (m_instance)
|
||||
{
|
||||
delete m_instance;
|
||||
m_instance = NULL;
|
||||
result = true;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
SND_CDObject* SND_CDObject::Instance()
|
||||
{
|
||||
return m_instance;
|
||||
}
|
||||
|
||||
|
||||
|
||||
SND_CDObject::SND_CDObject()
|
||||
{
|
||||
m_gain = 1;
|
||||
m_playmode = SND_CD_ALL;
|
||||
m_track = 1;
|
||||
m_playstate = SND_STOPPED;
|
||||
m_used = false;
|
||||
|
||||
// don't set the cd standard on modified:
|
||||
// if not used, we don't wanna touch it (performance)
|
||||
m_modified = false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
SND_CDObject::~SND_CDObject()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_CDObject::SetGain(MT_Scalar gain)
|
||||
{
|
||||
m_gain = gain;
|
||||
m_modified = true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_CDObject::SetPlaymode(int playmode)
|
||||
{
|
||||
m_playmode = playmode;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_CDObject::SetPlaystate(int playstate)
|
||||
{
|
||||
m_playstate = playstate;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_CDObject::SetTrack(int track)
|
||||
{
|
||||
m_track = track;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int SND_CDObject::GetTrack() const
|
||||
{
|
||||
return m_track;
|
||||
}
|
||||
|
||||
|
||||
|
||||
MT_Scalar SND_CDObject::GetGain() const
|
||||
{
|
||||
return m_gain;
|
||||
}
|
||||
|
||||
|
||||
int SND_CDObject::GetPlaystate() const
|
||||
{
|
||||
return m_playstate;
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool SND_CDObject::IsModified() const
|
||||
{
|
||||
return m_modified;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_CDObject::SetModified(bool modified)
|
||||
{
|
||||
m_modified = modified;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int SND_CDObject::GetPlaymode() const
|
||||
{
|
||||
return m_playmode;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_CDObject::SetUsed()
|
||||
{
|
||||
m_used = true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool SND_CDObject::GetUsed()
|
||||
{
|
||||
return m_used;
|
||||
}
|
||||
|
137
intern/SoundSystem/intern/SND_DeviceManager.cpp
Normal file
137
intern/SoundSystem/intern/SND_DeviceManager.cpp
Normal file
@@ -0,0 +1,137 @@
|
||||
/*
|
||||
* SND_DeviceManager.h
|
||||
*
|
||||
* singleton for creating, switching and deleting audiodevices
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
*
|
||||
* This program 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
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
#include "SND_DeviceManager.h"
|
||||
#include "SND_DependKludge.h"
|
||||
#include "SND_DummyDevice.h"
|
||||
#ifdef USE_FMOD
|
||||
#include "SND_FmodDevice.h"
|
||||
#endif
|
||||
#ifdef USE_OPENAL
|
||||
#include "SND_OpenALDevice.h"
|
||||
#endif
|
||||
|
||||
SND_IAudioDevice* SND_DeviceManager::m_instance = NULL;
|
||||
int SND_DeviceManager::m_subscriptions = 0;
|
||||
|
||||
#ifdef USE_OPENAL
|
||||
int SND_DeviceManager::m_device_type = snd_e_openaldevice;
|
||||
#else
|
||||
# ifdef USE_FMOD
|
||||
int SND_DeviceManager::m_device_type = snd_e_fmoddevice;
|
||||
# else
|
||||
int SND_DeviceManager::m_device_type = snd_e_dummydevice;
|
||||
# endif
|
||||
#endif
|
||||
|
||||
void SND_DeviceManager::Subscribe()
|
||||
{
|
||||
++m_subscriptions;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_DeviceManager::Unsubscribe()
|
||||
{
|
||||
--m_subscriptions;
|
||||
|
||||
// only release memory if there is a m_instance but no subscriptions left
|
||||
if (m_subscriptions == 0 && m_instance)
|
||||
{
|
||||
delete m_instance;
|
||||
m_instance = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
SND_IAudioDevice* SND_DeviceManager::Instance()
|
||||
{
|
||||
// only give away an instance if there are subscriptions
|
||||
if (m_subscriptions)
|
||||
{
|
||||
// if there's no instance yet, set and create a new one
|
||||
if (m_instance == NULL)
|
||||
{
|
||||
SetDeviceType(m_device_type);
|
||||
}
|
||||
|
||||
return m_instance;
|
||||
}
|
||||
else
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_DeviceManager::SetDeviceType(int device_type)
|
||||
{
|
||||
// if we want to change devicetype, first delete the old one
|
||||
if (m_instance)
|
||||
{
|
||||
delete m_instance;
|
||||
m_instance = NULL;
|
||||
}
|
||||
|
||||
// let's create the chosen device
|
||||
switch (device_type)
|
||||
{
|
||||
#ifdef USE_FMOD
|
||||
case snd_e_fmoddevice:
|
||||
{
|
||||
m_instance = new SND_FmodDevice();
|
||||
m_device_type = device_type;
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
#ifdef USE_OPENAL
|
||||
case snd_e_openaldevice:
|
||||
{
|
||||
m_instance = new SND_OpenALDevice();
|
||||
m_device_type = device_type;
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
default:
|
||||
{
|
||||
m_instance = new SND_DummyDevice();
|
||||
m_device_type = device_type;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
75
intern/SoundSystem/intern/SND_IdObject.cpp
Normal file
75
intern/SoundSystem/intern/SND_IdObject.cpp
Normal file
@@ -0,0 +1,75 @@
|
||||
/*
|
||||
* SND_IdObject.cpp
|
||||
*
|
||||
* Object for storing runtime data, like id's, soundobjects etc
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
*
|
||||
* This program 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
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
#include "SND_IdObject.h"
|
||||
|
||||
SND_IdObject::SND_IdObject()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
SND_IdObject::~SND_IdObject()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
SND_SoundObject* SND_IdObject::GetSoundObject()
|
||||
{
|
||||
return m_soundObject;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_IdObject::SetSoundObject(SND_SoundObject* pObject)
|
||||
{
|
||||
m_soundObject = pObject;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int SND_IdObject::GetId()
|
||||
{
|
||||
return m_id;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_IdObject::SetId(int id)
|
||||
{
|
||||
m_id = id;
|
||||
}
|
59
intern/SoundSystem/intern/SND_IdObject.h
Normal file
59
intern/SoundSystem/intern/SND_IdObject.h
Normal file
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
* SND_IdObject.h
|
||||
*
|
||||
* Object for storing runtime data, like id's, soundobjects etc
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
*
|
||||
* This program 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
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
#ifndef __SND_IDOBJECT_H
|
||||
#define __SND_IDOBJECT_H
|
||||
|
||||
#include "SND_SoundObject.h"
|
||||
#include "GEN_List.h"
|
||||
#include "SoundDefines.h"
|
||||
|
||||
class SND_IdObject : public GEN_Link
|
||||
{
|
||||
SND_SoundObject* m_soundObject;
|
||||
int m_id;
|
||||
|
||||
public:
|
||||
SND_IdObject();
|
||||
virtual ~SND_IdObject();
|
||||
|
||||
SND_SoundObject* GetSoundObject();
|
||||
void SetSoundObject(SND_SoundObject* pObject);
|
||||
|
||||
int GetId();
|
||||
void SetId(int id);
|
||||
};
|
||||
#endif //__SND_OBJECT_H
|
569
intern/SoundSystem/intern/SND_Scene.cpp
Normal file
569
intern/SoundSystem/intern/SND_Scene.cpp
Normal file
@@ -0,0 +1,569 @@
|
||||
/*
|
||||
* SND_Scene.cpp
|
||||
*
|
||||
* The scene for sounds.
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
*
|
||||
* This program 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
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
#ifdef WIN32
|
||||
#pragma warning (disable:4786) // Get rid of stupid stl-visual compiler debug warning
|
||||
#endif //WIN32
|
||||
|
||||
#include "SND_Scene.h"
|
||||
#include "SND_DependKludge.h"
|
||||
#include "SYS_System.h"
|
||||
#include "SND_IAudioDevice.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <iostream>
|
||||
|
||||
//static unsigned int tijd = 0;
|
||||
|
||||
SND_Scene::SND_Scene(SND_IAudioDevice* audiodevice)
|
||||
: m_audiodevice(audiodevice)
|
||||
{
|
||||
if (m_audiodevice)
|
||||
m_wavecache = m_audiodevice->GetWaveCache();
|
||||
|
||||
if (!m_wavecache || !audiodevice)
|
||||
{
|
||||
m_audio = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
//if so, go ahead!
|
||||
m_audio = true;
|
||||
#ifdef ONTKEVER
|
||||
printf("SND_Scene::SND_Scene() m_audio == true\n");
|
||||
#endif
|
||||
m_audiodevice->InitListener();
|
||||
}
|
||||
|
||||
IsPlaybackWanted();
|
||||
}
|
||||
|
||||
|
||||
|
||||
SND_Scene::~SND_Scene()
|
||||
{
|
||||
StopAllObjects();
|
||||
}
|
||||
|
||||
|
||||
|
||||
// check if audioplayback is wanted
|
||||
bool SND_Scene::IsPlaybackWanted()
|
||||
{
|
||||
SYS_SystemHandle syshandle = SYS_GetSystem();
|
||||
int audio = SYS_GetCommandLineInt(syshandle,"noaudio",0);
|
||||
|
||||
if ((audio == 0) && m_audiodevice && m_wavecache)
|
||||
{
|
||||
m_audioplayback = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
StopAllObjects();
|
||||
m_audioplayback = false;
|
||||
}
|
||||
|
||||
return m_audioplayback;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int SND_Scene::LoadSample(const STR_String& samplename,
|
||||
void* memlocation,
|
||||
int size)
|
||||
{
|
||||
int result = -1;
|
||||
|
||||
if (m_audiodevice)
|
||||
{
|
||||
SND_WaveSlot* waveslot = m_audiodevice->LoadSample(samplename, memlocation, size);
|
||||
|
||||
if (waveslot)
|
||||
result = waveslot->GetBuffer();
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_Scene::RemoveAllSamples()
|
||||
{
|
||||
if (m_audio && m_audiodevice)
|
||||
m_audiodevice->RemoveAllSamples();
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool SND_Scene::CheckBuffer(SND_SoundObject* pObject)
|
||||
{
|
||||
bool result = false;
|
||||
|
||||
if (pObject && m_wavecache)
|
||||
{
|
||||
SND_WaveSlot* waveslot = m_wavecache->GetWaveSlot(pObject->GetSampleName());
|
||||
|
||||
if (waveslot)
|
||||
{
|
||||
pObject->SetBuffer(waveslot->GetBuffer());
|
||||
|
||||
result = true;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool SND_Scene::IsSampleLoaded(STR_String& samplename)
|
||||
{
|
||||
bool result = false;
|
||||
|
||||
if (samplename && m_wavecache)
|
||||
{
|
||||
SND_WaveSlot* waveslot = m_wavecache->GetWaveSlot(samplename);
|
||||
|
||||
if (waveslot && waveslot->IsLoaded())
|
||||
result = true;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_Scene::AddObject(SND_SoundObject* pObject)
|
||||
{
|
||||
if (m_audio)
|
||||
{
|
||||
STR_String samplename = pObject->GetSampleName();
|
||||
SND_WaveSlot* slot = NULL;
|
||||
|
||||
// don't add the object if no valid sample is referenced
|
||||
if (samplename != "")
|
||||
{
|
||||
// check if the sample is already loaded
|
||||
slot = m_wavecache->GetWaveSlot(samplename);
|
||||
}
|
||||
|
||||
if (slot)
|
||||
{
|
||||
pObject->SetBuffer(slot->GetBuffer());
|
||||
|
||||
// needed for expected lifespan of the sample, but ain't necesary anymore i think
|
||||
MT_Scalar samplelength = slot->GetNumberOfSamples();
|
||||
MT_Scalar samplerate = slot->GetSampleRate();
|
||||
MT_Scalar soundlength = samplelength/samplerate;
|
||||
pObject->SetLength(soundlength);
|
||||
|
||||
// add the object to the list
|
||||
m_soundobjects.insert((SND_SoundObject*)pObject);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_Scene::SetListenerTransform(const MT_Vector3& pos,
|
||||
const MT_Vector3& vel,
|
||||
const MT_Matrix3x3& ori)
|
||||
{
|
||||
if (m_audio)
|
||||
{
|
||||
GetListener()->SetPosition(pos);
|
||||
GetListener()->SetVelocity(vel);
|
||||
GetListener()->SetOrientation(ori);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_Scene::UpdateListener()
|
||||
{
|
||||
// process the listener if modified
|
||||
if (m_listener.IsModified())
|
||||
{
|
||||
m_audiodevice->SetListenerGain(m_listener.GetGain());
|
||||
|
||||
// fmod doesn't support dopplervelocity, so just use the dopplerfactor instead
|
||||
#ifdef USE_FMOD
|
||||
m_audiodevice->SetDopplerFactor(m_listener.GetDopplerVelocity());
|
||||
#else
|
||||
m_audiodevice->SetDopplerVelocity(m_listener.GetDopplerVelocity());
|
||||
m_audiodevice->SetDopplerFactor(m_listener.GetDopplerFactor());
|
||||
#endif
|
||||
m_listener.SetModified(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_Scene::AddActiveObject(SND_SoundObject* pObject, MT_Scalar curtime)
|
||||
{
|
||||
if (m_audio)
|
||||
{
|
||||
if (pObject)
|
||||
{
|
||||
#ifdef ONTKEVER
|
||||
printf("SND_Scene::AddActiveObject\n");
|
||||
#endif
|
||||
|
||||
// first check if the object is already on the list
|
||||
if (pObject->IsActive())
|
||||
{
|
||||
pObject->SetTimeStamp(curtime);
|
||||
pObject->StartSound();
|
||||
}
|
||||
else
|
||||
{
|
||||
pObject->SetTimeStamp(curtime);
|
||||
|
||||
// compute the expected lifespan
|
||||
pObject->SetLifeSpan();
|
||||
|
||||
// lets give the new active-to-be object an id
|
||||
if (m_audiodevice->GetNewId(pObject))
|
||||
{
|
||||
// and add the object
|
||||
m_activeobjects.addTail(pObject);
|
||||
pObject->StartSound();
|
||||
pObject->SetActive(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_Scene::RemoveActiveObject(SND_SoundObject* pObject)
|
||||
{
|
||||
if (m_audio)
|
||||
{
|
||||
if (pObject)
|
||||
{
|
||||
#ifdef ONTKEVER
|
||||
printf("SND_Scene::RemoveActiveObject\n");
|
||||
#endif
|
||||
// if inactive, remove it from the list
|
||||
if (pObject->IsActive())
|
||||
{
|
||||
// first make sure it is stopped
|
||||
m_audiodevice->ClearId(pObject);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_Scene::UpdateActiveObects()
|
||||
{
|
||||
// ++tijd;
|
||||
|
||||
SND_SoundObject* pObject;
|
||||
// update only the objects that need to be updated
|
||||
for (pObject = (SND_SoundObject*)m_activeobjects.getHead();
|
||||
!pObject->isTail();
|
||||
pObject = (SND_SoundObject*)pObject->getNext())
|
||||
{
|
||||
int id = pObject->GetId();
|
||||
|
||||
if (id >= 0)
|
||||
{
|
||||
bool juststartedplaying = false;
|
||||
#ifdef USE_FMOD
|
||||
// fmod wants these set before playing the sample
|
||||
if (pObject->IsModified())
|
||||
{
|
||||
m_audiodevice->SetObjectLoop(id, pObject->GetLoopMode());
|
||||
m_audiodevice->SetObjectLoopPoints(id, pObject->GetLoopStart(), pObject->GetLoopEnd());
|
||||
}
|
||||
|
||||
// ok, properties Set. now see if it must play
|
||||
if (pObject->GetPlaystate() == SND_MUST_PLAY)
|
||||
{
|
||||
m_audiodevice->PlayObject(id);
|
||||
pObject->SetPlaystate(SND_PLAYING);
|
||||
pObject->InitRunning();
|
||||
// printf("start play: %d\n", tijd);
|
||||
juststartedplaying = true;
|
||||
}
|
||||
#endif
|
||||
if (pObject->Is3D())
|
||||
{
|
||||
// Get the global positions and velocity vectors
|
||||
// of the listener and soundobject
|
||||
MT_Vector3 op = pObject->GetPosition();
|
||||
MT_Vector3 lp = m_listener.GetPosition();
|
||||
MT_Vector3 position = op - lp;
|
||||
|
||||
// Calculate relative velocity in global coordinates
|
||||
// of the sound with respect to the listener.
|
||||
MT_Vector3 ov = pObject->GetVelocity();
|
||||
MT_Vector3 lv = m_listener.GetVelocity();
|
||||
MT_Vector3 velocity = ov - lv;
|
||||
|
||||
// Now map the object position and velocity into
|
||||
// the local coordinates of the listener.
|
||||
MT_Matrix3x3 lo = m_listener.GetOrientation();
|
||||
|
||||
MT_Vector3 local_sound_pos = position * lo;
|
||||
MT_Vector3 local_sound_vel = velocity * lo;
|
||||
|
||||
m_audiodevice->SetObjectTransform(
|
||||
id,
|
||||
local_sound_pos,
|
||||
local_sound_vel,
|
||||
pObject->GetOrientation(), // make relative to listener!
|
||||
lp,
|
||||
pObject->GetRollOffFactor());
|
||||
}
|
||||
else
|
||||
{
|
||||
m_audiodevice->ObjectIs2D(id);
|
||||
}
|
||||
|
||||
// update the situation
|
||||
if (pObject->IsModified())
|
||||
{
|
||||
m_audiodevice->SetObjectPitch(id, pObject->GetPitch());
|
||||
m_audiodevice->SetObjectGain(id, pObject->GetGain());
|
||||
m_audiodevice->SetObjectMinGain(id, pObject->GetMinGain());
|
||||
m_audiodevice->SetObjectMaxGain(id, pObject->GetMaxGain());
|
||||
m_audiodevice->SetObjectReferenceDistance(id, pObject->GetReferenceDistance());
|
||||
m_audiodevice->SetObjectRollOffFactor(id, pObject->GetRollOffFactor());
|
||||
m_audiodevice->SetObjectLoop(id, pObject->GetLoopMode());
|
||||
m_audiodevice->SetObjectLoopPoints(id, pObject->GetLoopStart(), pObject->GetLoopEnd());
|
||||
pObject->SetModified(false);
|
||||
}
|
||||
|
||||
pObject->AddRunning();
|
||||
|
||||
#ifdef ONTKEVER
|
||||
STR_String naam = pObject->GetObjectName();
|
||||
STR_String sample = pObject->GetSampleName();
|
||||
|
||||
int id = pObject->GetId();
|
||||
int buffer = pObject->GetBuffer();
|
||||
|
||||
float gain = pObject->GetGain();
|
||||
float pitch = pObject->GetPitch();
|
||||
float timestamp = pObject->GetTimestamp();
|
||||
|
||||
printf("naam: %s, sample: %s \n", naam.Ptr(), sample.Ptr());
|
||||
printf("id: %d, buffer: %d \n", id, buffer);
|
||||
printf("gain: %f, pitch: %f, ts: %f \n\n", gain, pitch, timestamp);
|
||||
#endif
|
||||
#ifdef USE_OPENAL
|
||||
// ok, properties Set. now see if it must play
|
||||
if (pObject->GetPlaystate() == SND_MUST_PLAY)
|
||||
{
|
||||
m_audiodevice->PlayObject(id);
|
||||
pObject->SetPlaystate(SND_PLAYING);
|
||||
//break;
|
||||
}
|
||||
#endif
|
||||
|
||||
// check to see if the sound is still playing
|
||||
// if not: release its id
|
||||
int playstate = m_audiodevice->GetPlayState(id);
|
||||
#ifdef ONTKEVER
|
||||
if (playstate != 2)
|
||||
printf("%d - ",playstate);
|
||||
#endif
|
||||
|
||||
// if ((playstate == SND_STOPPED && (!juststartedplaying) && !pObject->GetLoopMode() && pObject->IsRunning())
|
||||
#ifdef WIN32
|
||||
if ((playstate == SND_STOPPED) && !pObject->GetLoopMode())
|
||||
#else
|
||||
if (!pObject->GetLoopMode())
|
||||
#endif
|
||||
{
|
||||
// printf("remove: %d\n", tijd);
|
||||
RemoveActiveObject(pObject);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_Scene::UpdateCD()
|
||||
{
|
||||
if (m_audiodevice)
|
||||
{
|
||||
SND_CDObject* pCD = SND_CDObject::Instance();
|
||||
|
||||
if (pCD)
|
||||
{
|
||||
int playstate = pCD->GetPlaystate();
|
||||
|
||||
switch (playstate)
|
||||
{
|
||||
case SND_MUST_PLAY:
|
||||
{
|
||||
// initialize the cd only when you need it
|
||||
m_audiodevice->SetCDGain(pCD->GetGain());
|
||||
m_audiodevice->SetCDPlaymode(pCD->GetPlaymode());
|
||||
m_audiodevice->PlayCD(pCD->GetTrack());
|
||||
pCD->SetPlaystate(SND_PLAYING);
|
||||
pCD->SetUsed();
|
||||
break;
|
||||
}
|
||||
case SND_MUST_PAUSE:
|
||||
{
|
||||
m_audiodevice->PauseCD(true);
|
||||
pCD->SetPlaystate(SND_PAUSED);
|
||||
break;
|
||||
}
|
||||
case SND_MUST_RESUME:
|
||||
{
|
||||
m_audiodevice->PauseCD(false);
|
||||
pCD->SetPlaystate(SND_PLAYING);
|
||||
break;
|
||||
}
|
||||
case SND_MUST_STOP:
|
||||
{
|
||||
m_audiodevice->StopCD();
|
||||
pCD->SetPlaystate(SND_STOPPED);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
// this one is only for realtime modifying settings
|
||||
if (pCD->IsModified())
|
||||
{
|
||||
m_audiodevice->SetCDGain(pCD->GetGain());
|
||||
pCD->SetModified(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_Scene::Proceed()
|
||||
{
|
||||
if (m_audio && m_audioplayback)
|
||||
{
|
||||
m_audiodevice->MakeCurrent();
|
||||
|
||||
UpdateListener();
|
||||
UpdateActiveObects();
|
||||
UpdateCD();
|
||||
|
||||
// m_audiodevice->UpdateDevice();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void SND_Scene::DeleteObject(SND_SoundObject* pObject)
|
||||
{
|
||||
#ifdef ONTKEVER
|
||||
printf("SND_Scene::DeleteObject\n");
|
||||
#endif
|
||||
|
||||
if (pObject)
|
||||
{
|
||||
if (m_audiodevice)
|
||||
m_audiodevice->ClearId(pObject);
|
||||
|
||||
// must remove object from m_activeList
|
||||
std::set<SND_SoundObject*>::iterator set_it;
|
||||
set_it = m_soundobjects.find(pObject);
|
||||
|
||||
if (set_it != m_soundobjects.end())
|
||||
m_soundobjects.erase(set_it);
|
||||
|
||||
// release the memory
|
||||
delete pObject;
|
||||
pObject = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_Scene::RemoveAllObjects()
|
||||
{
|
||||
#ifdef ONTKEVER
|
||||
printf("SND_Scene::RemoveAllObjects\n");
|
||||
#endif
|
||||
|
||||
StopAllObjects();
|
||||
|
||||
std::set<SND_SoundObject*>::iterator it = m_soundobjects.begin();
|
||||
|
||||
while (it != m_soundobjects.end())
|
||||
{
|
||||
delete (*it);
|
||||
it++;
|
||||
}
|
||||
|
||||
m_soundobjects.clear();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_Scene::StopAllObjects()
|
||||
{
|
||||
if (m_audio)
|
||||
{
|
||||
#ifdef ONTKEVER
|
||||
printf("SND_Scene::StopAllObjects\n");
|
||||
#endif
|
||||
|
||||
SND_SoundObject* pObject;
|
||||
|
||||
for (pObject = (SND_SoundObject*)m_activeobjects.getHead();
|
||||
!pObject->isTail();
|
||||
pObject = (SND_SoundObject*)pObject->getNext())
|
||||
{
|
||||
m_audiodevice->ClearId(pObject);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
SND_SoundListener* SND_Scene::GetListener()
|
||||
{
|
||||
return &m_listener;
|
||||
}
|
184
intern/SoundSystem/intern/SND_SoundListener.cpp
Normal file
184
intern/SoundSystem/intern/SND_SoundListener.cpp
Normal file
@@ -0,0 +1,184 @@
|
||||
/*
|
||||
* SND_SoundListener.cpp
|
||||
*
|
||||
* A SoundListener is for sound what a camera is for vision.
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
*
|
||||
* This program 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
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
#include "SND_SoundListener.h"
|
||||
|
||||
SND_SoundListener::SND_SoundListener()
|
||||
{
|
||||
m_modified = true;
|
||||
m_gain = 1.0;
|
||||
m_dopplerfactor = 1.0;
|
||||
m_dopplervelocity = 1.0;
|
||||
m_scale = 1.0;
|
||||
m_position[0] = 0.0;
|
||||
m_position[1] = 0.0;
|
||||
m_position[2] = 0.0;
|
||||
m_velocity[0] = 0.0;
|
||||
m_velocity[1] = 0.0;
|
||||
m_velocity[2] = 0.0;
|
||||
m_orientation[0][0] = 1.0;
|
||||
m_orientation[0][1] = 0.0;
|
||||
m_orientation[0][2] = 0.0;
|
||||
m_orientation[1][0] = 0.0;
|
||||
m_orientation[1][1] = 1.0;
|
||||
m_orientation[1][2] = 0.0;
|
||||
m_orientation[2][0] = 0.0;
|
||||
m_orientation[2][1] = 0.0;
|
||||
m_orientation[2][2] = 1.0;
|
||||
}
|
||||
|
||||
|
||||
SND_SoundListener::~SND_SoundListener()
|
||||
{
|
||||
; /* intentionally empty */
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundListener::SetGain(MT_Scalar gain)
|
||||
{
|
||||
m_gain = gain;
|
||||
m_modified = true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundListener::SetPosition (const MT_Vector3& pos)
|
||||
{
|
||||
m_position = pos;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundListener::SetVelocity(const MT_Vector3& vel)
|
||||
{
|
||||
m_velocity = vel;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundListener::SetOrientation(const MT_Matrix3x3& ori)
|
||||
{
|
||||
m_orientation = ori;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundListener::SetDopplerFactor(MT_Scalar dopplerfactor)
|
||||
{
|
||||
m_dopplerfactor = dopplerfactor;
|
||||
m_modified = true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundListener::SetDopplerVelocity(MT_Scalar dopplervelocity)
|
||||
{
|
||||
m_dopplervelocity = dopplervelocity;
|
||||
m_modified = true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundListener::SetScale(MT_Scalar scale)
|
||||
{
|
||||
m_scale = scale;
|
||||
m_modified = true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
MT_Scalar SND_SoundListener::GetGain() const
|
||||
{
|
||||
return m_gain;
|
||||
}
|
||||
|
||||
|
||||
|
||||
MT_Vector3 SND_SoundListener::GetPosition() const
|
||||
{
|
||||
return m_position;
|
||||
}
|
||||
|
||||
|
||||
|
||||
MT_Vector3 SND_SoundListener::GetVelocity() const
|
||||
{
|
||||
return m_velocity;
|
||||
}
|
||||
|
||||
|
||||
|
||||
MT_Matrix3x3 SND_SoundListener::GetOrientation()
|
||||
{
|
||||
return m_orientation;
|
||||
}
|
||||
|
||||
|
||||
|
||||
MT_Scalar SND_SoundListener::GetDopplerFactor() const
|
||||
{
|
||||
return m_dopplerfactor;
|
||||
}
|
||||
|
||||
|
||||
|
||||
MT_Scalar SND_SoundListener::GetDopplerVelocity() const
|
||||
{
|
||||
return m_dopplervelocity;
|
||||
}
|
||||
|
||||
|
||||
|
||||
MT_Scalar SND_SoundListener::GetScale() const
|
||||
{
|
||||
return m_scale;
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool SND_SoundListener::IsModified() const
|
||||
{
|
||||
return m_modified;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundListener::SetModified(bool modified)
|
||||
{
|
||||
m_modified = modified;
|
||||
}
|
506
intern/SoundSystem/intern/SND_SoundObject.cpp
Normal file
506
intern/SoundSystem/intern/SND_SoundObject.cpp
Normal file
@@ -0,0 +1,506 @@
|
||||
/*
|
||||
* SND_SoundObject.cpp
|
||||
*
|
||||
* Implementation of the abstract sound object
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
*
|
||||
* This program 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
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
#include "SND_SoundObject.h"
|
||||
|
||||
|
||||
|
||||
SND_SoundObject::SND_SoundObject()// : m_modified(true)
|
||||
{
|
||||
m_samplename = "";
|
||||
m_length = 0;
|
||||
m_buffer = 0;
|
||||
|
||||
m_gain = 0.0;
|
||||
m_pitch = 1.0;
|
||||
|
||||
m_mingain = 0.0;
|
||||
m_maxgain = 1.0;
|
||||
m_rollofffactor = 1.0;
|
||||
m_referencedistance = 1.0;
|
||||
|
||||
m_position[0] = 0.0;
|
||||
m_position[1] = 0.0;
|
||||
m_position[2] = 0.0;
|
||||
m_velocity[0] = 0.0;
|
||||
m_velocity[1] = 0.0;
|
||||
m_velocity[2] = 0.0;
|
||||
m_orientation[0][0] = 1.0;
|
||||
m_orientation[0][1] = 0.0;
|
||||
m_orientation[0][2] = 0.0;
|
||||
m_orientation[1][0] = 0.0;
|
||||
m_orientation[1][1] = 1.0;
|
||||
m_orientation[1][2] = 0.0;
|
||||
m_orientation[2][0] = 0.0;
|
||||
m_orientation[2][1] = 0.0;
|
||||
m_orientation[2][2] = 1.0;
|
||||
|
||||
m_loopstart = 0;
|
||||
m_loopend = 0;
|
||||
m_loopmode = SND_LOOP_NORMAL;
|
||||
m_is3d = true;
|
||||
m_playstate = SND_INITIAL;
|
||||
m_active = false;
|
||||
m_id = -1;
|
||||
m_lifespan = 0;
|
||||
m_timestamp = 0;
|
||||
m_modified = true;
|
||||
m_running = 0;
|
||||
m_highpriority = false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
SND_SoundObject::~SND_SoundObject()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundObject::StartSound()
|
||||
{
|
||||
m_playstate = SND_MUST_PLAY;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundObject::StopSound()
|
||||
{
|
||||
m_playstate = SND_MUST_STOP;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundObject::PauseSound()
|
||||
{
|
||||
m_playstate = SND_MUST_PAUSE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundObject::DeleteWhenFinished()
|
||||
{
|
||||
m_playstate = SND_MUST_BE_DELETED;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundObject::SetGain(MT_Scalar gain)
|
||||
{
|
||||
m_gain = gain;
|
||||
m_modified = true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundObject::SetMinGain(MT_Scalar mingain)
|
||||
{
|
||||
m_mingain = mingain;
|
||||
m_modified = true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundObject::SetMaxGain(MT_Scalar maxgain)
|
||||
{
|
||||
m_maxgain = maxgain;
|
||||
m_modified = true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundObject::SetRollOffFactor(MT_Scalar rollofffactor)
|
||||
{
|
||||
m_rollofffactor = rollofffactor;
|
||||
m_modified = true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundObject::SetReferenceDistance(MT_Scalar referencedistance)
|
||||
{
|
||||
m_referencedistance = referencedistance;
|
||||
m_modified = true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundObject::SetPitch(MT_Scalar pitch)
|
||||
{
|
||||
m_pitch = pitch;
|
||||
m_modified = true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundObject::SetLoopMode(unsigned int loopmode)
|
||||
{
|
||||
m_loopmode = loopmode;
|
||||
m_modified = true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundObject::SetLoopStart(unsigned int loopstart)
|
||||
{
|
||||
m_loopstart = loopstart;
|
||||
m_modified = true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundObject::SetLoopEnd(unsigned int loopend)
|
||||
{
|
||||
m_loopend = loopend;
|
||||
m_modified = true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundObject::Set3D(bool threedee)
|
||||
{
|
||||
m_is3d = threedee;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundObject::SetLifeSpan()
|
||||
{
|
||||
m_lifespan = m_length / m_pitch;
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool SND_SoundObject::IsLifeSpanOver(MT_Scalar curtime) const
|
||||
{
|
||||
bool result = false;
|
||||
|
||||
if ((curtime - m_timestamp) > m_lifespan)
|
||||
result = true;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundObject::SetActive(bool active)
|
||||
{
|
||||
m_active = active;
|
||||
|
||||
if (!active)
|
||||
{
|
||||
m_playstate = SND_STOPPED;
|
||||
(this)->remove();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundObject::SetBuffer(unsigned int buffer)
|
||||
{
|
||||
m_buffer = buffer;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundObject::SetObjectName(STR_String objectname)
|
||||
{
|
||||
m_objectname = objectname;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundObject::SetSampleName(STR_String samplename)
|
||||
{
|
||||
m_samplename = samplename;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundObject::SetLength(MT_Scalar length)
|
||||
{
|
||||
m_length = length;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundObject::SetPosition(const MT_Vector3& pos)
|
||||
{
|
||||
m_position = pos;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundObject::SetVelocity(const MT_Vector3& vel)
|
||||
{
|
||||
m_velocity = vel;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundObject::SetOrientation(const MT_Matrix3x3& orient)
|
||||
{
|
||||
m_orientation = orient;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundObject::SetPlaystate(int playstate)
|
||||
{
|
||||
m_playstate = playstate;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundObject::SetId(int id)
|
||||
{
|
||||
m_id = id;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundObject::SetTimeStamp(MT_Scalar timestamp)
|
||||
{
|
||||
m_timestamp = timestamp;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundObject::SetHighPriority(bool priority)
|
||||
{
|
||||
m_highpriority = priority;
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool SND_SoundObject::IsHighPriority() const
|
||||
{
|
||||
return m_highpriority;
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool SND_SoundObject::IsActive()const
|
||||
{
|
||||
return m_active;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int SND_SoundObject::GetId()const
|
||||
{
|
||||
return m_id;
|
||||
}
|
||||
|
||||
|
||||
|
||||
MT_Scalar SND_SoundObject::GetLifeSpan()const
|
||||
{
|
||||
return m_lifespan;
|
||||
}
|
||||
|
||||
|
||||
|
||||
MT_Scalar SND_SoundObject::GetTimestamp()const
|
||||
{
|
||||
return m_timestamp;
|
||||
}
|
||||
|
||||
|
||||
|
||||
unsigned int SND_SoundObject::GetBuffer()
|
||||
{
|
||||
return m_buffer;
|
||||
}
|
||||
|
||||
|
||||
|
||||
const STR_String& SND_SoundObject::GetSampleName()
|
||||
{
|
||||
return m_samplename;
|
||||
}
|
||||
|
||||
|
||||
|
||||
const STR_String& SND_SoundObject::GetObjectName()
|
||||
{
|
||||
return m_objectname;
|
||||
}
|
||||
|
||||
|
||||
|
||||
MT_Scalar SND_SoundObject::GetLength() const
|
||||
{
|
||||
return m_length;
|
||||
}
|
||||
|
||||
|
||||
|
||||
MT_Scalar SND_SoundObject::GetGain() const
|
||||
{
|
||||
return m_gain;
|
||||
}
|
||||
|
||||
|
||||
|
||||
MT_Scalar SND_SoundObject::GetPitch() const
|
||||
{
|
||||
return m_pitch;
|
||||
}
|
||||
|
||||
|
||||
|
||||
MT_Scalar SND_SoundObject::GetMinGain() const
|
||||
{
|
||||
return m_mingain;
|
||||
}
|
||||
|
||||
|
||||
|
||||
MT_Scalar SND_SoundObject::GetMaxGain() const
|
||||
{
|
||||
return m_maxgain;
|
||||
}
|
||||
|
||||
|
||||
|
||||
MT_Scalar SND_SoundObject::GetRollOffFactor() const
|
||||
{
|
||||
return m_rollofffactor;
|
||||
}
|
||||
|
||||
|
||||
|
||||
MT_Scalar SND_SoundObject::GetReferenceDistance() const
|
||||
{
|
||||
return m_referencedistance;
|
||||
}
|
||||
|
||||
|
||||
|
||||
MT_Vector3 SND_SoundObject::GetPosition() const
|
||||
{
|
||||
return m_position;
|
||||
}
|
||||
|
||||
|
||||
|
||||
MT_Vector3 SND_SoundObject::GetVelocity() const
|
||||
{
|
||||
return m_velocity;
|
||||
}
|
||||
|
||||
|
||||
|
||||
MT_Matrix3x3 SND_SoundObject::GetOrientation() const
|
||||
{
|
||||
return m_orientation;
|
||||
}
|
||||
|
||||
|
||||
|
||||
unsigned int SND_SoundObject::GetLoopMode() const
|
||||
{
|
||||
return m_loopmode;
|
||||
}
|
||||
|
||||
|
||||
|
||||
unsigned int SND_SoundObject::GetLoopStart() const
|
||||
{
|
||||
return m_loopstart;
|
||||
}
|
||||
|
||||
|
||||
|
||||
unsigned int SND_SoundObject::GetLoopEnd() const
|
||||
{
|
||||
return m_loopend;
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool SND_SoundObject::Is3D() const
|
||||
{
|
||||
return m_is3d;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int SND_SoundObject::GetPlaystate() const
|
||||
{
|
||||
return m_playstate;
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool SND_SoundObject::IsModified() const
|
||||
{
|
||||
return m_modified;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundObject::SetModified(bool modified)
|
||||
{
|
||||
m_modified = modified;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundObject::InitRunning()
|
||||
{
|
||||
m_running = 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool SND_SoundObject::IsRunning() const
|
||||
{
|
||||
bool result = false;
|
||||
|
||||
if (m_running > 100)
|
||||
result = true;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_SoundObject::AddRunning()
|
||||
{
|
||||
++m_running;
|
||||
}
|
395
intern/SoundSystem/intern/SND_Utils.cpp
Normal file
395
intern/SoundSystem/intern/SND_Utils.cpp
Normal file
@@ -0,0 +1,395 @@
|
||||
/*
|
||||
* SND_Utils.cpp
|
||||
*
|
||||
* Util functions for soundthingies
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
*
|
||||
* This program 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
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
#include "SND_Utils.h"
|
||||
#include "SoundDefines.h"
|
||||
#include "SND_DependKludge.h"
|
||||
/*
|
||||
extern "C" {
|
||||
#include "license_key.h"
|
||||
}
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <fcntl.h>
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
|
||||
#if defined(WIN32)
|
||||
#include <io.h>
|
||||
#else
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
//extern int LICENSE_KEY_VALID;
|
||||
#define LICENSE_KEY_VALID true
|
||||
|
||||
#define BUFFERSIZE 32
|
||||
|
||||
/* loads a file */
|
||||
void* SND_LoadSample(char *filename)
|
||||
{
|
||||
int file, filelen, buffersize = BUFFERSIZE;
|
||||
void* data = NULL;
|
||||
|
||||
#if defined(WIN32)
|
||||
file = open(filename, O_BINARY|O_RDONLY);
|
||||
#else
|
||||
file = open(filename, 0|O_RDONLY);
|
||||
#endif
|
||||
|
||||
if (file == -1)
|
||||
{
|
||||
//printf("can't open file.\n");
|
||||
//printf("press q for quit.\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
filelen = lseek(file, 0, SEEK_END);
|
||||
lseek(file, 0, SEEK_SET);
|
||||
|
||||
if (filelen != 0)
|
||||
{
|
||||
data = malloc(buffersize);
|
||||
|
||||
if (read(file, data, buffersize) != buffersize)
|
||||
{
|
||||
free(data);
|
||||
data = NULL;
|
||||
}
|
||||
}
|
||||
close(file);
|
||||
|
||||
}
|
||||
return (data);
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool SND_IsSampleValid(const STR_String& name, void* memlocation)
|
||||
{
|
||||
bool result = false;
|
||||
bool loadedsample = false;
|
||||
char buffer[BUFFERSIZE];
|
||||
|
||||
if (!memlocation)
|
||||
{
|
||||
STR_String samplename = name;
|
||||
memlocation = SND_LoadSample(samplename.Ptr());
|
||||
|
||||
if (memlocation)
|
||||
loadedsample = true;
|
||||
}
|
||||
|
||||
if (memlocation)
|
||||
{
|
||||
memcpy(&buffer, memlocation, BUFFERSIZE);
|
||||
|
||||
if(!(memcmp(buffer, "RIFF", 4) && memcmp(&(buffer[8]), "WAVEfmt ", 8)))
|
||||
{
|
||||
int shortbuf = * ((short *) &buffer[20]);
|
||||
if (shortbuf == SND_WAVE_FORMAT_PCM)
|
||||
result = true;
|
||||
|
||||
/* only fmod supports compressed wav */
|
||||
#ifdef USE_FMOD
|
||||
/* and only valid publishers may use compressed wav */
|
||||
if (LICENSE_KEY_VALID)
|
||||
{
|
||||
switch (shortbuf)
|
||||
{
|
||||
case SND_WAVE_FORMAT_ADPCM:
|
||||
case SND_WAVE_FORMAT_ALAW:
|
||||
case SND_WAVE_FORMAT_MULAW:
|
||||
case SND_WAVE_FORMAT_DIALOGIC_OKI_ADPCM:
|
||||
case SND_WAVE_FORMAT_CONTROL_RES_VQLPC:
|
||||
case SND_WAVE_FORMAT_GSM_610:
|
||||
case SND_WAVE_FORMAT_MPEG3:
|
||||
result = true;
|
||||
break;
|
||||
default:
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#ifdef USE_FMOD
|
||||
/* only valid publishers may use ogg vorbis */
|
||||
else if (!memcmp(buffer, "OggS", 4) && LICENSE_KEY_VALID)
|
||||
{
|
||||
result = true;
|
||||
}
|
||||
/* only valid publishers may use mp3 */
|
||||
else if (((!memcmp(buffer, "ID3", 3)) || (!memcmp(buffer, "<EFBFBD><EFBFBD>", 2))) && LICENSE_KEY_VALID)
|
||||
{
|
||||
result = true;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
if (loadedsample)
|
||||
{
|
||||
free(memlocation);
|
||||
memlocation = NULL;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* checks if the passed pointer is a valid sample */
|
||||
bool CheckSample(void* sample)
|
||||
{
|
||||
bool valid = false;
|
||||
char buffer[32];
|
||||
|
||||
memcpy(buffer, sample, 16);
|
||||
|
||||
if(!(memcmp(buffer, "RIFF", 4) && memcmp(&(buffer[8]), "WAVEfmt ", 8)))
|
||||
{
|
||||
valid = true;
|
||||
}
|
||||
|
||||
return valid;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* gets the type of the sample (0 == unknown, 1 == PCM etc */
|
||||
unsigned int SND_GetSampleFormat(void* sample)
|
||||
{
|
||||
short sampletype = 0;
|
||||
|
||||
if (CheckSample(sample))
|
||||
{
|
||||
memcpy(&sampletype, ((char*)sample) + 20, 2);
|
||||
}
|
||||
|
||||
return (unsigned int)sampletype;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* gets the number of channels in a sample */
|
||||
unsigned int SND_GetNumberOfChannels(void* sample)
|
||||
{
|
||||
short numberofchannels = 0;
|
||||
|
||||
if (CheckSample(sample))
|
||||
{
|
||||
memcpy(&numberofchannels, ((char*)sample) + 22, 2);
|
||||
}
|
||||
|
||||
return (unsigned int)numberofchannels;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* gets the samplerate of a sample */
|
||||
unsigned int SND_GetSampleRate(void* sample)
|
||||
{
|
||||
unsigned int samplerate = 0;
|
||||
|
||||
if (CheckSample(sample))
|
||||
{
|
||||
memcpy(&samplerate, ((char*)sample) + 24, 4);
|
||||
}
|
||||
|
||||
return samplerate;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* gets the bitrate of a sample */
|
||||
unsigned int SND_GetBitRate(void* sample)
|
||||
{
|
||||
short bitrate = 0;
|
||||
|
||||
if (CheckSample(sample))
|
||||
{
|
||||
memcpy(&bitrate, ((char*)sample) + 34, 2);
|
||||
}
|
||||
|
||||
return (unsigned int)bitrate;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* gets the length of the actual sample data (without the header) */
|
||||
unsigned int SND_GetNumberOfSamples(void* sample)
|
||||
{
|
||||
unsigned int chunklength, length = 0, offset = 16;
|
||||
char data[4];
|
||||
|
||||
if (CheckSample(sample))
|
||||
{
|
||||
memcpy(&chunklength, ((char*)sample) + offset, 4);
|
||||
offset = offset + chunklength + 4;
|
||||
memcpy(data, ((char*)sample) + offset, 4);
|
||||
|
||||
// lets find "data"
|
||||
while (memcmp(data, "data", 4))
|
||||
{
|
||||
offset += 4;
|
||||
memcpy(data, ((char*)sample) + offset, 4);
|
||||
}
|
||||
offset += 4;
|
||||
memcpy(&length, ((char*)sample) + offset, 4);
|
||||
}
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* gets the size of the entire header (file - sampledata) */
|
||||
unsigned int SND_GetHeaderSize(void* sample)
|
||||
{
|
||||
unsigned int chunklength, headersize = 0, offset = 16;
|
||||
char data[4];
|
||||
|
||||
if (CheckSample(sample))
|
||||
{
|
||||
memcpy(&chunklength, ((char*)sample) + offset, 4);
|
||||
offset = offset + chunklength + 4;
|
||||
memcpy(data, ((char*)sample) + offset, 4);
|
||||
|
||||
// lets find "data"
|
||||
while (memcmp(data, "data", 4))
|
||||
{
|
||||
offset += 4;
|
||||
memcpy(data, ((char*)sample) + offset, 4);
|
||||
}
|
||||
headersize = offset + 8;
|
||||
}
|
||||
|
||||
|
||||
return headersize;
|
||||
}
|
||||
|
||||
|
||||
|
||||
unsigned int SND_GetExtraChunk(void* sample)
|
||||
{
|
||||
unsigned int extrachunk = 0, chunklength, offset = 16;
|
||||
char data[4];
|
||||
|
||||
if (CheckSample(sample))
|
||||
{
|
||||
memcpy(&chunklength, ((char*)sample) + offset, 4);
|
||||
offset = offset + chunklength + 4;
|
||||
memcpy(data, ((char*)sample) + offset, 4);
|
||||
|
||||
// lets find "cue"
|
||||
while (memcmp(data, "cue", 3))
|
||||
{
|
||||
offset += 4;
|
||||
memcpy(data, ((char*)sample) + offset, 4);
|
||||
}
|
||||
}
|
||||
|
||||
return extrachunk;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_GetSampleInfo(signed char* sample, SND_WaveSlot* waveslot)
|
||||
{
|
||||
WavFileHeader fileheader;
|
||||
WavFmtHeader fmtheader;
|
||||
WavFmtExHeader fmtexheader;
|
||||
WavSampleHeader sampleheader;
|
||||
WavChunkHeader chunkheader;
|
||||
|
||||
if (CheckSample(sample))
|
||||
{
|
||||
memcpy(&fileheader, sample, sizeof(WavFileHeader));
|
||||
sample += sizeof(WavFileHeader);
|
||||
fileheader.size = ((fileheader.size+1) & ~1) - 4;
|
||||
|
||||
while ((fileheader.size != 0) && (memcpy(&chunkheader, sample, sizeof(WavChunkHeader))))
|
||||
{
|
||||
sample += sizeof(WavChunkHeader);
|
||||
if (!memcmp(chunkheader.id, "fmt ", 4))
|
||||
{
|
||||
memcpy(&fmtheader, sample, sizeof(WavFmtHeader));
|
||||
waveslot->SetSampleFormat(fmtheader.format);
|
||||
|
||||
if (fmtheader.format == 0x0001)
|
||||
{
|
||||
waveslot->SetNumberOfChannels(fmtheader.numberofchannels);
|
||||
waveslot->SetBitRate(fmtheader.bitrate);
|
||||
waveslot->SetSampleRate(fmtheader.samplerate);
|
||||
sample += chunkheader.size;
|
||||
}
|
||||
else
|
||||
{
|
||||
memcpy(&fmtexheader, sample, sizeof(WavFmtExHeader));
|
||||
sample += chunkheader.size;
|
||||
}
|
||||
}
|
||||
else if (!memcmp(chunkheader.id, "data", 4))
|
||||
{
|
||||
if (fmtheader.format == 0x0001)
|
||||
{
|
||||
waveslot->SetNumberOfSamples(chunkheader.size);
|
||||
sample += chunkheader.size;
|
||||
}
|
||||
else if (fmtheader.format == 0x0011)
|
||||
{
|
||||
//IMA ADPCM
|
||||
}
|
||||
else if (fmtheader.format == 0x0055)
|
||||
{
|
||||
//MP3 WAVE
|
||||
}
|
||||
}
|
||||
else if (!memcmp(chunkheader.id, "smpl", 4))
|
||||
{
|
||||
memcpy(&sampleheader, sample, sizeof(WavSampleHeader));
|
||||
//loop = sampleheader.loops;
|
||||
sample += chunkheader.size;
|
||||
}
|
||||
else
|
||||
sample += chunkheader.size;
|
||||
|
||||
sample += chunkheader.size & 1;
|
||||
fileheader.size -= (((chunkheader.size + 1) & ~1) + 8);
|
||||
}
|
||||
}
|
||||
}
|
134
intern/SoundSystem/intern/SND_WaveCache.cpp
Normal file
134
intern/SoundSystem/intern/SND_WaveCache.cpp
Normal file
@@ -0,0 +1,134 @@
|
||||
/*
|
||||
* SND_WaveCache.cpp
|
||||
*
|
||||
* abstract wavecache, a way to organize samples
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
*
|
||||
* This program 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
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
#ifdef WIN32
|
||||
#pragma warning (disable:4786) // Get rid of stupid stl-visual compiler debug warning
|
||||
#endif //WIN32
|
||||
|
||||
#include "SND_WaveCache.h"
|
||||
#include <stdio.h>
|
||||
|
||||
#ifndef __APPLE__
|
||||
#include <malloc.h>
|
||||
#else // __APPLE__
|
||||
#include <sys/malloc.h>
|
||||
#endif // __APPLE__
|
||||
|
||||
|
||||
SND_WaveCache::SND_WaveCache()
|
||||
{
|
||||
// do the buffer administration
|
||||
for (int i = 0; i < NUM_BUFFERS; i++)
|
||||
m_bufferList[i] = NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
SND_WaveCache::~SND_WaveCache()
|
||||
{
|
||||
// clean up the mess
|
||||
FreeSamples();
|
||||
RemoveAllSamples();
|
||||
}
|
||||
|
||||
|
||||
|
||||
SND_WaveSlot* SND_WaveCache::GetWaveSlot(const STR_String& samplename)
|
||||
{
|
||||
SND_WaveSlot* waveslot = NULL;
|
||||
|
||||
std::map<STR_String, SND_WaveSlot*>::iterator find_result = m_samplecache.find(samplename);
|
||||
|
||||
// let's see if we have already loaded this sample
|
||||
if (find_result != m_samplecache.end())
|
||||
{
|
||||
waveslot = (*find_result).second;
|
||||
}
|
||||
else
|
||||
{
|
||||
// so the sample wasn't loaded, so do it here
|
||||
for (int bufnum = 0; bufnum < NUM_BUFFERS; bufnum++)
|
||||
{
|
||||
// find an empty buffer
|
||||
if (m_bufferList[bufnum] == NULL)
|
||||
{
|
||||
waveslot = new SND_WaveSlot();
|
||||
waveslot->SetSampleName(samplename);
|
||||
waveslot->SetBuffer(bufnum);
|
||||
m_bufferList[bufnum] = waveslot;
|
||||
break;
|
||||
}
|
||||
}
|
||||
m_samplecache.insert(std::pair<STR_String, SND_WaveSlot*>(samplename, waveslot));
|
||||
}
|
||||
|
||||
return waveslot;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_WaveCache::RemoveAllSamples()
|
||||
{
|
||||
// remove all samples
|
||||
m_samplecache.clear();
|
||||
|
||||
// reset the list of buffers
|
||||
for (int i = 0; i < NUM_BUFFERS; i++)
|
||||
m_bufferList[i] = NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_WaveCache::RemoveSample(const STR_String& samplename, int buffer)
|
||||
{
|
||||
m_samplecache.erase(samplename);
|
||||
m_bufferList[buffer] = NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_WaveCache::FreeSamples()
|
||||
{
|
||||
// iterate through the bufferlist and delete the waveslot if present
|
||||
for (int i = 0; i < NUM_BUFFERS; i++)
|
||||
{
|
||||
if (m_bufferList[i])
|
||||
{
|
||||
delete m_bufferList[i];
|
||||
m_bufferList[i] = NULL;
|
||||
}
|
||||
}
|
||||
}
|
182
intern/SoundSystem/intern/SND_WaveSlot.cpp
Normal file
182
intern/SoundSystem/intern/SND_WaveSlot.cpp
Normal file
@@ -0,0 +1,182 @@
|
||||
/**
|
||||
* $Id$
|
||||
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
*
|
||||
* This program 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
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
|
||||
#include "SND_WaveSlot.h"
|
||||
|
||||
|
||||
|
||||
SND_WaveSlot::~SND_WaveSlot()
|
||||
{
|
||||
#ifdef ONTKEVER
|
||||
printf("neeeeeee...\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_WaveSlot::SetSampleName(STR_String samplename)
|
||||
{
|
||||
m_samplename = samplename;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_WaveSlot::SetLoaded(bool loaded)
|
||||
{
|
||||
m_loaded = loaded;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_WaveSlot::SetData(void* data)
|
||||
{
|
||||
m_data = data;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_WaveSlot::SetBuffer(unsigned int buffer)
|
||||
{
|
||||
m_buffer = buffer;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_WaveSlot::SetSampleFormat(unsigned int sampleformat)
|
||||
{
|
||||
m_sampleformat = sampleformat;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_WaveSlot::SetNumberOfChannels(unsigned int numberofchannels)
|
||||
{
|
||||
m_numberofchannels = numberofchannels;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_WaveSlot::SetSampleRate(unsigned int samplerate)
|
||||
{
|
||||
m_samplerate = samplerate;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_WaveSlot::SetBitRate(unsigned int bitrate)
|
||||
{
|
||||
m_bitrate = bitrate;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_WaveSlot::SetNumberOfSamples(unsigned int numberofsamples)
|
||||
{
|
||||
m_numberofsamples = numberofsamples;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_WaveSlot::SetFileSize(unsigned int filesize)
|
||||
{
|
||||
m_filesize = filesize;
|
||||
}
|
||||
|
||||
|
||||
|
||||
const STR_String& SND_WaveSlot::GetSampleName()
|
||||
{
|
||||
return m_samplename;
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool SND_WaveSlot::IsLoaded() const
|
||||
{
|
||||
return m_loaded;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void* SND_WaveSlot::GetData()
|
||||
{
|
||||
return m_data;
|
||||
}
|
||||
|
||||
|
||||
|
||||
unsigned int SND_WaveSlot::GetBuffer() const
|
||||
{
|
||||
return m_buffer;
|
||||
}
|
||||
|
||||
|
||||
|
||||
unsigned int SND_WaveSlot::GetSampleFormat() const
|
||||
{
|
||||
return m_sampleformat;
|
||||
}
|
||||
|
||||
|
||||
|
||||
unsigned int SND_WaveSlot::GetNumberOfChannels() const
|
||||
{
|
||||
return m_numberofchannels;
|
||||
}
|
||||
|
||||
|
||||
|
||||
unsigned int SND_WaveSlot::GetSampleRate() const
|
||||
{
|
||||
return m_samplerate;
|
||||
}
|
||||
|
||||
|
||||
|
||||
unsigned int SND_WaveSlot::GetBitRate() const
|
||||
{
|
||||
return m_bitrate;
|
||||
}
|
||||
|
||||
|
||||
|
||||
unsigned int SND_WaveSlot::GetNumberOfSamples() const
|
||||
{
|
||||
return m_numberofsamples;
|
||||
}
|
||||
|
||||
|
||||
|
||||
unsigned int SND_WaveSlot::GetFileSize() const
|
||||
{
|
||||
return m_filesize;
|
||||
}
|
47
intern/SoundSystem/openal/Makefile
Normal file
47
intern/SoundSystem/openal/Makefile
Normal file
@@ -0,0 +1,47 @@
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
# ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
#
|
||||
# This program 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
|
||||
# of the License, or (at your option) any later version. The Blender
|
||||
# Foundation also sells licenses for use in proprietary software under
|
||||
# the Blender License. See http://www.blender.org/BL/ for information
|
||||
# about this.
|
||||
#
|
||||
# This program 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 this program; if not, write to the Free Software Foundation,
|
||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
#
|
||||
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
# All rights reserved.
|
||||
#
|
||||
# The Original Code is: all of this file.
|
||||
#
|
||||
# Contributor(s): none yet.
|
||||
#
|
||||
# ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
#
|
||||
#
|
||||
|
||||
LIBNAME = OpenALSoundSystem
|
||||
DIR = $(OCGDIR)/gameengine/$(LIBNAME)
|
||||
|
||||
include nan_compile.mk
|
||||
|
||||
CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
|
||||
|
||||
CPPFLAGS += -I$(NAN_OPENAL)/include
|
||||
CPPFLAGS += -I$(NAN_STRING)/include
|
||||
CPPFLAGS += -I$(NAN_MOTO)/include
|
||||
CPPFLAGS += -I../../../kernel/gen_system
|
||||
CPPFLAGS += -I../intern
|
||||
CPPFLAGS += -I..
|
||||
CPPFLAGS += -I.
|
661
intern/SoundSystem/openal/SND_OpenALDevice.cpp
Normal file
661
intern/SoundSystem/openal/SND_OpenALDevice.cpp
Normal file
@@ -0,0 +1,661 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
*
|
||||
* This program 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
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
* SND_OpenALDevice derived from SND_IAudioDevice
|
||||
*/
|
||||
|
||||
#ifdef WIN32
|
||||
#pragma warning (disable:4786) // get rid of stupid stl-visual compiler debug warning
|
||||
#endif //WIN32
|
||||
|
||||
#include "SND_OpenALDevice.h"
|
||||
#include "SoundDefines.h"
|
||||
#include "SYS_System.h"
|
||||
|
||||
#include "SND_Utils.h"
|
||||
|
||||
#include <AL/al.h>
|
||||
#include <AL/alc.h>
|
||||
#include <AL/alut.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#if defined(WIN32)
|
||||
#include <io.h>
|
||||
#else
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#include <fcntl.h>
|
||||
|
||||
/* untill openal gets unified we need this hack for non-windows systems */
|
||||
#ifndef WIN32
|
||||
|
||||
#include <malloc.h>
|
||||
|
||||
ALvoid alutLoadWAVMemory(ALbyte *memory,ALenum *format,ALvoid **data,ALsizei *size,ALsizei *freq,ALboolean *loop);
|
||||
ALvoid alutUnloadWAV(ALenum format,ALvoid *data,ALsizei size,ALsizei freq);
|
||||
|
||||
typedef struct /* WAV File-header */
|
||||
{
|
||||
ALubyte Id[4];
|
||||
ALsizei Size;
|
||||
ALubyte Type[4];
|
||||
} WAVFileHdr_Struct;
|
||||
|
||||
typedef struct /* WAV Fmt-header */
|
||||
{
|
||||
ALushort Format;
|
||||
ALushort Channels;
|
||||
ALuint SamplesPerSec;
|
||||
ALuint BytesPerSec;
|
||||
ALushort BlockAlign;
|
||||
ALushort BitsPerSample;
|
||||
} WAVFmtHdr_Struct;
|
||||
|
||||
typedef struct /* WAV FmtEx-header */
|
||||
{
|
||||
ALushort Size;
|
||||
ALushort SamplesPerBlock;
|
||||
} WAVFmtExHdr_Struct;
|
||||
|
||||
typedef struct /* WAV Smpl-header */
|
||||
{
|
||||
ALuint Manufacturer;
|
||||
ALuint Product;
|
||||
ALuint SamplePeriod;
|
||||
ALuint Note;
|
||||
ALuint FineTune;
|
||||
ALuint SMPTEFormat;
|
||||
ALuint SMPTEOffest;
|
||||
ALuint Loops;
|
||||
ALuint SamplerData;
|
||||
struct
|
||||
{
|
||||
ALuint Identifier;
|
||||
ALuint Type;
|
||||
ALuint Start;
|
||||
ALuint End;
|
||||
ALuint Fraction;
|
||||
ALuint Count;
|
||||
} Loop[1];
|
||||
} WAVSmplHdr_Struct;
|
||||
|
||||
typedef struct /* WAV Chunk-header */
|
||||
{
|
||||
ALubyte Id[4];
|
||||
ALuint Size;
|
||||
} WAVChunkHdr_Struct;
|
||||
|
||||
ALvoid alutLoadWAVMemory(ALbyte *memory,ALenum *format,ALvoid **data,ALsizei *size,ALsizei *freq,ALboolean *loop)
|
||||
{
|
||||
WAVChunkHdr_Struct ChunkHdr;
|
||||
WAVFmtExHdr_Struct FmtExHdr;
|
||||
WAVFileHdr_Struct FileHdr;
|
||||
WAVSmplHdr_Struct SmplHdr;
|
||||
WAVFmtHdr_Struct FmtHdr;
|
||||
ALbyte *Stream;
|
||||
|
||||
*format=AL_FORMAT_MONO16;
|
||||
*data=NULL;
|
||||
*size=0;
|
||||
*freq=22050;
|
||||
*loop=AL_FALSE;
|
||||
if (memory)
|
||||
{
|
||||
Stream=memory;
|
||||
if (Stream)
|
||||
{
|
||||
memcpy(&FileHdr,Stream,sizeof(WAVFileHdr_Struct));
|
||||
Stream+=sizeof(WAVFileHdr_Struct);
|
||||
FileHdr.Size=((FileHdr.Size+1)&~1)-4;
|
||||
while ((FileHdr.Size!=0)&&(memcpy(&ChunkHdr,Stream,sizeof(WAVChunkHdr_Struct))))
|
||||
{
|
||||
Stream+=sizeof(WAVChunkHdr_Struct);
|
||||
if (!memcmp(ChunkHdr.Id,"fmt ",4))
|
||||
{
|
||||
memcpy(&FmtHdr,Stream,sizeof(WAVFmtHdr_Struct));
|
||||
if (FmtHdr.Format==0x0001)
|
||||
{
|
||||
*format=(FmtHdr.Channels==1?
|
||||
(FmtHdr.BitsPerSample==8?AL_FORMAT_MONO8:AL_FORMAT_MONO16):
|
||||
(FmtHdr.BitsPerSample==8?AL_FORMAT_STEREO8:AL_FORMAT_STEREO16));
|
||||
*freq=FmtHdr.SamplesPerSec;
|
||||
Stream+=ChunkHdr.Size;
|
||||
}
|
||||
else
|
||||
{
|
||||
memcpy(&FmtExHdr,Stream,sizeof(WAVFmtExHdr_Struct));
|
||||
Stream+=ChunkHdr.Size;
|
||||
}
|
||||
}
|
||||
else if (!memcmp(ChunkHdr.Id,"data",4))
|
||||
{
|
||||
if (FmtHdr.Format==0x0001)
|
||||
{
|
||||
*size=ChunkHdr.Size;
|
||||
*data=malloc(ChunkHdr.Size+31);
|
||||
if (*data) memcpy(*data,Stream,ChunkHdr.Size);
|
||||
memset(((char *)*data)+ChunkHdr.Size,0,31);
|
||||
Stream+=ChunkHdr.Size;
|
||||
}
|
||||
else if (FmtHdr.Format==0x0011)
|
||||
{
|
||||
//IMA ADPCM
|
||||
}
|
||||
else if (FmtHdr.Format==0x0055)
|
||||
{
|
||||
//MP3 WAVE
|
||||
}
|
||||
}
|
||||
else if (!memcmp(ChunkHdr.Id,"smpl",4))
|
||||
{
|
||||
memcpy(&SmplHdr,Stream,sizeof(WAVSmplHdr_Struct));
|
||||
*loop = (SmplHdr.Loops ? AL_TRUE : AL_FALSE);
|
||||
Stream+=ChunkHdr.Size;
|
||||
}
|
||||
else Stream+=ChunkHdr.Size;
|
||||
Stream+=ChunkHdr.Size&1;
|
||||
FileHdr.Size-=(((ChunkHdr.Size+1)&~1)+8);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ALvoid alutUnloadWAV(ALenum format,ALvoid *data,ALsizei size,ALsizei freq)
|
||||
{
|
||||
if (data)
|
||||
free(data);
|
||||
}
|
||||
|
||||
#endif /* WIN32 */
|
||||
|
||||
|
||||
|
||||
SND_OpenALDevice::SND_OpenALDevice()
|
||||
{
|
||||
// check if audio is wanted
|
||||
SYS_SystemHandle syshandle = SYS_GetSystem();
|
||||
int audio = SYS_GetCommandLineInt(syshandle,"noaudio",0);
|
||||
|
||||
if (audio != 0)
|
||||
m_audio = false;
|
||||
else
|
||||
m_audio = true;
|
||||
|
||||
m_buffersinitialized = false;
|
||||
m_sourcesinitialized = false;
|
||||
|
||||
// let's check if we can get openal to initialize...
|
||||
if (m_audio)
|
||||
{
|
||||
#ifdef OUDE_OPENAL
|
||||
m_audio = true; // openal_2.12
|
||||
alutInit(NULL, NULL); // openal_2.12
|
||||
#else
|
||||
m_audio = false;
|
||||
|
||||
ALCdevice *dev = alcOpenDevice(NULL);
|
||||
if (dev) {
|
||||
m_context = alcCreateContext(dev, NULL);
|
||||
|
||||
if (m_context) {
|
||||
alcMakeContextCurrent(m_context);
|
||||
m_audio = true;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
// then try to generate some buffers
|
||||
if (m_audio)
|
||||
{
|
||||
// let openal generate its buffers
|
||||
alGenBuffers(NUM_BUFFERS, m_buffers);
|
||||
m_buffersinitialized = true;
|
||||
|
||||
for (int i = 0; i < NUM_BUFFERS; i++)
|
||||
{
|
||||
if (!alIsBuffer(m_buffers[i]))
|
||||
{
|
||||
//printf("\n\n WARNING: OpenAL returned with an error. Continuing without audio.\n\n");
|
||||
m_audio = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// next: the sources
|
||||
if (m_audio)
|
||||
{
|
||||
#ifdef OUDE_OPENAL
|
||||
ALenum alc_error = ALC_NO_ERROR; // openal_2.12
|
||||
#else
|
||||
ALenum alc_error = alcGetError(); // openal_2.14+
|
||||
#endif
|
||||
|
||||
// let openal generate its sources
|
||||
if (alc_error == ALC_NO_ERROR)
|
||||
{
|
||||
alGenSources(NUM_SOURCES, m_sources);
|
||||
m_sourcesinitialized = true;
|
||||
}
|
||||
}
|
||||
|
||||
// let's get us a wavecache
|
||||
if (m_audio)
|
||||
{
|
||||
m_wavecache = new SND_WaveCache();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_OpenALDevice::MakeCurrent() const
|
||||
{
|
||||
#ifdef WIN32
|
||||
alcMakeContextCurrent(m_context);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
SND_OpenALDevice::~SND_OpenALDevice()
|
||||
{
|
||||
if (m_context) {
|
||||
alcMakeContextCurrent(m_context);
|
||||
|
||||
if (m_buffersinitialized)
|
||||
alDeleteBuffers(NUM_BUFFERS, m_buffers);
|
||||
|
||||
if (m_sourcesinitialized)
|
||||
alDeleteSources(NUM_SOURCES, m_sources);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
SND_WaveSlot* SND_OpenALDevice::LoadSample(const STR_String& name,
|
||||
void* memlocation,
|
||||
int size)
|
||||
{
|
||||
SND_WaveSlot* waveslot = NULL;
|
||||
STR_String samplename = name;
|
||||
|
||||
if (m_audio)
|
||||
{
|
||||
/* create the waveslot */
|
||||
waveslot = m_wavecache->GetWaveSlot(samplename);
|
||||
|
||||
/* do we support this sample? */
|
||||
if (SND_IsSampleValid(name, memlocation))
|
||||
{
|
||||
if (waveslot)
|
||||
{
|
||||
int buffer = waveslot->GetBuffer();
|
||||
void* data = NULL;
|
||||
char loop = 'a';
|
||||
int sampleformat, bitrate, numberofchannels;
|
||||
ALenum al_error = alGetError();
|
||||
|
||||
#ifdef OUDE_OPENAL
|
||||
unsigned int samplerate, numberofsamples; // openal_2.12
|
||||
#else
|
||||
int samplerate, numberofsamples, frequency; // openal_2.14+
|
||||
#endif
|
||||
|
||||
/* load the sample from memory? */
|
||||
if (size && memlocation)
|
||||
{
|
||||
waveslot->SetFileSize(size);
|
||||
|
||||
/* what was (our) buffer? */
|
||||
int buffer = waveslot->GetBuffer();
|
||||
|
||||
/* get some info out of the sample */
|
||||
SND_GetSampleInfo((signed char*)memlocation, waveslot);
|
||||
numberofchannels = SND_GetNumberOfChannels(memlocation);
|
||||
bitrate = SND_GetBitRate(memlocation);
|
||||
|
||||
/* load the sample into openal */
|
||||
#ifdef OUDE_OPENAL
|
||||
alutLoadWAVMemory((char*)memlocation, &sampleformat, &data, &numberofsamples, &samplerate); // openal_2.12
|
||||
#else
|
||||
alutLoadWAVMemory((signed char*)memlocation, &sampleformat, &data, &numberofsamples, &samplerate, &loop);// openal_2.14+
|
||||
#endif
|
||||
/* put it in the buffer */
|
||||
alBufferData(m_buffers[buffer], sampleformat, data, numberofsamples, samplerate);
|
||||
}
|
||||
/* or from file? */
|
||||
else
|
||||
{
|
||||
#ifdef WIN32
|
||||
alutLoadWAVFile((signed char*)samplename.Ptr(), &sampleformat, &data, &numberofsamples, &samplerate, &loop);
|
||||
#else
|
||||
alutLoadWAV((char*)samplename.Ptr(), &data,
|
||||
&sampleformat, &numberofsamples,
|
||||
&samplerate, &frequency);
|
||||
#endif
|
||||
/* put it in the buffer */
|
||||
alBufferData(m_buffers[buffer], sampleformat, data, numberofsamples, samplerate);
|
||||
}
|
||||
|
||||
/* fill the waveslot with info */
|
||||
al_error = alGetError();
|
||||
if (al_error == AL_NO_ERROR && m_buffers[buffer])
|
||||
{
|
||||
waveslot->SetData(data);
|
||||
waveslot->SetSampleFormat(sampleformat);
|
||||
waveslot->SetNumberOfChannels(numberofchannels);
|
||||
waveslot->SetSampleRate(samplerate);
|
||||
waveslot->SetBitRate(bitrate);
|
||||
waveslot->SetNumberOfSamples(numberofsamples);
|
||||
|
||||
/* if the loading succeeded, mark the waveslot */
|
||||
waveslot->SetLoaded(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* or when it failed, free the waveslot */
|
||||
m_wavecache->RemoveSample(waveslot->GetSampleName(), waveslot->GetBuffer());
|
||||
waveslot = NULL;
|
||||
}
|
||||
|
||||
/* and free the original stuff (copy was made in openal) */
|
||||
alutUnloadWAV(sampleformat, data, numberofsamples, samplerate);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* sample not supported, remove waveslot */
|
||||
m_wavecache->RemoveSample(waveslot->GetSampleName(), waveslot->GetBuffer());
|
||||
waveslot = NULL;
|
||||
}
|
||||
}
|
||||
return waveslot;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// listener's and general stuff //////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
/* sets the global dopplervelocity */
|
||||
void SND_OpenALDevice::SetDopplerVelocity(MT_Scalar dopplervelocity) const
|
||||
{
|
||||
alDopplerVelocity ((float)dopplervelocity);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* sets the global dopplerfactor */
|
||||
void SND_OpenALDevice::SetDopplerFactor(MT_Scalar dopplerfactor) const
|
||||
{
|
||||
alDopplerFactor ((float)dopplerfactor);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* sets the global rolloff factor */
|
||||
void SND_OpenALDevice::SetListenerRollOffFactor(MT_Scalar rollofffactor) const
|
||||
{
|
||||
// not implemented in openal
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_OpenALDevice::NextFrame() const
|
||||
{
|
||||
// not needed by openal
|
||||
}
|
||||
|
||||
|
||||
|
||||
// set the gain for the listener
|
||||
void SND_OpenALDevice::SetListenerGain(float gain) const
|
||||
{
|
||||
alListenerf (AL_GAIN, gain);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_OpenALDevice::InitListener()
|
||||
{
|
||||
// initialize the listener with these values that won't change
|
||||
// (as long as we can have only one listener)
|
||||
// now we can superimpose all listeners on each other (for they
|
||||
// have the same settings)
|
||||
float lispos[3] = {0,0,0};
|
||||
float lisvel[3] = {0,0,0};
|
||||
#ifdef WIN32
|
||||
float lisori[6] = {0,1,0,0,0,1};
|
||||
#else
|
||||
float lisori[6] = {0,0,1,0,-1,0};
|
||||
#endif
|
||||
|
||||
alListenerfv(AL_POSITION, lispos);
|
||||
alListenerfv(AL_VELOCITY, lisvel);
|
||||
alListenerfv(AL_ORIENTATION, lisori);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// source playstate stuff ////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
/* sets the buffer */
|
||||
void SND_OpenALDevice::SetObjectBuffer(int id, unsigned int buffer)
|
||||
{
|
||||
alSourcei (m_sources[id], AL_BUFFER, m_buffers[buffer]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// check if the sound's still playing
|
||||
int SND_OpenALDevice::GetPlayState(int id)
|
||||
{
|
||||
int alstate = 0;
|
||||
int result = 0;
|
||||
|
||||
alGetSourceiv(m_sources[id], AL_SOURCE_STATE, &alstate);
|
||||
|
||||
switch(alstate)
|
||||
{
|
||||
case AL_INITIAL:
|
||||
{
|
||||
result = SND_INITIAL;
|
||||
break;
|
||||
}
|
||||
case AL_PLAYING:
|
||||
{
|
||||
result = SND_PLAYING;
|
||||
break;
|
||||
}
|
||||
case AL_PAUSED:
|
||||
{
|
||||
result = SND_PAUSED;
|
||||
break;
|
||||
}
|
||||
case AL_STOPPED:
|
||||
{
|
||||
result = SND_STOPPED;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
result = SND_UNKNOWN;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// make the source play
|
||||
void SND_OpenALDevice::PlayObject(int id)
|
||||
{
|
||||
alSourcePlay(m_sources[id]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// make the source stop
|
||||
void SND_OpenALDevice::StopObject(int id) const
|
||||
{
|
||||
float obpos[3] = {0,0,0};
|
||||
float obvel[3] = {0,0,0};
|
||||
|
||||
alSourcefv(m_sources[id], AL_POSITION, obpos);
|
||||
|
||||
#ifdef WIN32
|
||||
alSourcefv(m_sources[id], AL_VELOCITY, obvel);
|
||||
#endif
|
||||
|
||||
alSourcef(m_sources[id], AL_GAIN, 1.0);
|
||||
alSourcef(m_sources[id], AL_PITCH, 1.0);
|
||||
alSourcei(m_sources[id], AL_LOOPING, AL_FALSE);
|
||||
alSourceStop(m_sources[id]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// stop all sources
|
||||
void SND_OpenALDevice::StopAllObjects()
|
||||
{
|
||||
alSourceStopv(NUM_SOURCES, m_sources);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// pause the source
|
||||
void SND_OpenALDevice::PauseObject(int id) const
|
||||
{
|
||||
alSourcePause(m_sources[id]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// source properties stuff ////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
// give openal the object's pitch
|
||||
void SND_OpenALDevice::SetObjectPitch(int id, MT_Scalar pitch) const
|
||||
{
|
||||
alSourcef (m_sources[id], AL_PITCH, (float)pitch);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// give openal the object's gain
|
||||
void SND_OpenALDevice::SetObjectGain(int id, MT_Scalar gain) const
|
||||
{
|
||||
alSourcef (m_sources[id], AL_GAIN, (float)gain);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// give openal the object's looping
|
||||
void SND_OpenALDevice::SetObjectLoop(int id, unsigned int loopmode) const
|
||||
{
|
||||
if (loopmode == SND_LOOP_OFF)
|
||||
{
|
||||
//printf("%d - ", id);
|
||||
alSourcei (m_sources[id], AL_LOOPING, AL_FALSE);
|
||||
}
|
||||
else
|
||||
alSourcei (m_sources[id], AL_LOOPING, AL_TRUE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_OpenALDevice::SetObjectMinGain(int id, MT_Scalar mingain) const
|
||||
{
|
||||
alSourcef (m_sources[id], AL_MIN_GAIN, (float)mingain);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_OpenALDevice::SetObjectMaxGain(int id, MT_Scalar maxgain) const
|
||||
{
|
||||
alSourcef (m_sources[id], AL_MAX_GAIN, (float)maxgain);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_OpenALDevice::SetObjectRollOffFactor(int id, MT_Scalar rollofffactor) const
|
||||
{
|
||||
alSourcef (m_sources[id], AL_ROLLOFF_FACTOR, (float)rollofffactor);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_OpenALDevice::SetObjectReferenceDistance(int id, MT_Scalar referencedistance) const
|
||||
{
|
||||
alSourcef (m_sources[id], AL_REFERENCE_DISTANCE, (float)referencedistance);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// give openal the object's position
|
||||
void SND_OpenALDevice::ObjectIs2D(int id) const
|
||||
{
|
||||
float obpos[3] = {0,0,0};
|
||||
float obvel[3] = {0,0,0};
|
||||
|
||||
alSourcefv(m_sources[id], AL_POSITION, obpos);
|
||||
alSourcefv(m_sources[id], AL_VELOCITY, obvel);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SND_OpenALDevice::SetObjectTransform(int id,
|
||||
const MT_Vector3& position,
|
||||
const MT_Vector3& velocity,
|
||||
const MT_Matrix3x3& orientation,
|
||||
const MT_Vector3& lisposition,
|
||||
const MT_Scalar& rollofffactor) const
|
||||
{
|
||||
float obpos[3];
|
||||
float obvel[3];
|
||||
|
||||
obpos[0] = (float)position[0] * (float)rollofffactor; //x (l/r)
|
||||
obpos[1] = (float)position[1] * (float)rollofffactor;
|
||||
obpos[2] = (float)position[2] * (float)rollofffactor;
|
||||
|
||||
alSourcefv(m_sources[id], AL_POSITION, obpos);
|
||||
|
||||
#ifdef WIN32
|
||||
velocity.getValue(obvel);
|
||||
alSourcefv(m_sources[id], AL_VELOCITY, obvel);
|
||||
#endif
|
||||
|
||||
}
|
102
intern/SoundSystem/openal/SND_OpenALDevice.h
Normal file
102
intern/SoundSystem/openal/SND_OpenALDevice.h
Normal file
@@ -0,0 +1,102 @@
|
||||
/**
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
*
|
||||
* This program 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
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
*/
|
||||
#ifndef SND_OPENALDEVICE
|
||||
#define SND_OPENALDEVICE
|
||||
|
||||
#include "SND_AudioDevice.h"
|
||||
#include "SoundDefines.h"
|
||||
|
||||
class SND_OpenALDevice : public SND_AudioDevice
|
||||
{
|
||||
public:
|
||||
SND_OpenALDevice();
|
||||
~SND_OpenALDevice();
|
||||
|
||||
SND_WaveSlot* LoadSample(const STR_String& samplename,
|
||||
void* memlocation,
|
||||
int size);
|
||||
|
||||
void InitListener();
|
||||
void SetListenerGain(float gain) const;
|
||||
void SetDopplerVelocity(MT_Scalar dopplervelocity) const;
|
||||
void SetDopplerFactor(MT_Scalar dopplerfactor) const;
|
||||
void SetListenerRollOffFactor(MT_Scalar rollofffactor) const;
|
||||
|
||||
void MakeCurrent() const;
|
||||
|
||||
void NextFrame() const;
|
||||
|
||||
void SetObjectBuffer(int id, unsigned int buffer);
|
||||
|
||||
int GetPlayState(int id);
|
||||
void PlayObject(int id);
|
||||
void StopObject(int id) const;
|
||||
void StopAllObjects();
|
||||
void PauseObject(int id) const;
|
||||
|
||||
void SetObjectLoop(int id, unsigned int loopmode) const;
|
||||
void SetObjectLoopPoints(int id, unsigned int loopstart, unsigned int loopend) const {};
|
||||
void SetObjectPitch(int id, MT_Scalar pitch) const;
|
||||
void SetObjectGain(int id, MT_Scalar gain) const;
|
||||
void SetObjectMinGain(int id, MT_Scalar mingain) const;
|
||||
void SetObjectMaxGain(int id, MT_Scalar maxgain) const;
|
||||
void SetObjectRollOffFactor(int id, MT_Scalar rolloff) const;
|
||||
void SetObjectReferenceDistance(int id, MT_Scalar distance) const;
|
||||
|
||||
void SetObjectTransform(int id,
|
||||
const MT_Vector3& position,
|
||||
const MT_Vector3& velocity,
|
||||
const MT_Matrix3x3& orientation,
|
||||
const MT_Vector3& lisposition,
|
||||
const MT_Scalar& rollofffactor) const;
|
||||
void ObjectIs2D(int id) const;
|
||||
|
||||
void PlayCD(int track) const {};
|
||||
void PauseCD(bool pause) const {};
|
||||
void StopCD() const {};
|
||||
void SetCDPlaymode(int playmode) const {};
|
||||
void SetCDGain(MT_Scalar gain) const {};
|
||||
|
||||
void StartUsingDSP() {};
|
||||
float* GetSpectrum() { return NULL; }
|
||||
void StopUsingDSP() {};
|
||||
|
||||
private:
|
||||
void* m_context;
|
||||
|
||||
unsigned int m_buffers[NUM_BUFFERS];
|
||||
unsigned int m_sources[NUM_SOURCES];
|
||||
bool m_buffersinitialized;
|
||||
bool m_sourcesinitialized;
|
||||
};
|
||||
|
||||
#endif //SND_OPENALDEVICE
|
65
intern/SoundSystem/openal/pthread_cancel.cpp
Normal file
65
intern/SoundSystem/openal/pthread_cancel.cpp
Normal file
@@ -0,0 +1,65 @@
|
||||
/* $Id$
|
||||
/*
|
||||
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
*
|
||||
* This program 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
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
* FreeBSD 3.4 does not yet have pthread_cancel (3.5 and above do)
|
||||
*/
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
#include <osreldate.h>
|
||||
|
||||
#if (__FreeBSD_version < 350000)
|
||||
#include <pthread.h>
|
||||
|
||||
#define FD_READ 0x1
|
||||
#define _FD_LOCK(_fd,_type,_ts) _thread_fd_lock(_fd, _type, _ts)
|
||||
#define _FD_UNLOCK(_fd,_type) _thread_fd_unlock(_fd, _type)
|
||||
|
||||
int pthread_cancel(pthread_t pthread) {
|
||||
pthread_exit(NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
long fpathconf(int fd, int name)
|
||||
{
|
||||
long ret;
|
||||
|
||||
if ((ret = _FD_LOCK(fd, FD_READ, NULL)) == 0) {
|
||||
ret = _thread_sys_fpathconf(fd, name);
|
||||
_FD_UNLOCK(fd, FD_READ);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
int pthread_atfork(void *a, void *b, void *c) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user