/* =========================================================================== Return to Castle Wolfenstein single player GPL Source Code Copyright (C) 1999-2010 id Software LLC, a ZeniMax Media company. This file is part of the Return to Castle Wolfenstein single player GPL Source Code (“RTCW SP Source Code”). RTCW SP Source Code 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 3 of the License, or (at your option) any later version. RTCW SP Source Code 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 RTCW SP Source Code. If not, see . In addition, the RTCW SP Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the RTCW SP Source Code. If not, please request a copy in writing from id Software at the address below. If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. =========================================================================== */ /* * idSpeaker.h * osxDOOM * * Created by zaphod on Thu Mar 08 2001. * */ /* * idSpeaker is the container class for all sound stuff. It has static members that allow you to start, stop, and * so forth, and private members that will not be exposed to the public API. This class will start a thread that * plays independently of the game API. * * idSpeaker can handle various output devices, ranging from headphones, to speakers, to 5.1. The default setup * is Dolby 5.1 through at least six speakers (four surround, one front, and sub). * */ #define MAX_STREAMING_SOUNDS 24 class idSpeaker { public: void process(); idSpeaker(); ~idSpeaker(); bool activate(); bool loop( const char *intro, const char *filename, int channel, bool looping, bool in3D, bool useNotification ); void stopLoop( int channel ); void updateLoop(); idAudioHardware *hw; idAudioBuffer* find( const char* fname ) { idAudioBuffer **mat = NULL; // see if it has been asked for before if ( hashTable.Get( fname, &mat ) ) { return ( *mat ); } return NULL; } void setEntityVolume( const int entityNum, const float v ) { if ( entityNum >= 0 && entityNum < MAX_GENTITIES ) { entVol[entityNum] = v; } } void setEntityPosition( const int entityNum, const float x, const float y, const float z ) { if ( entityNum >= 0 && entityNum < MAX_GENTITIES ) { entPos[entityNum].x = x; entPos[entityNum].y = y; entPos[entityNum].z = z; } } void setEntityVelocity( const int entityNum, const float x, const float y, const float z ) { if ( entityNum >= 0 && entityNum < MAX_GENTITIES ) { entVel[entityNum].x = x; entVel[entityNum].y = y; entVel[entityNum].z = z; } } float getEntityVolume( const int entityNum ) { if ( entityNum >= 0 && entityNum < MAX_GENTITIES ) { return entVol[entityNum]; } else { return getMusicVolume(); } } idVec3& getEntityPosition( const int entityNum ) { if ( entityNum >= 0 && entityNum < MAX_GENTITIES ) { return entPos[entityNum]; } else { return listener; } } idVec3& getEntityVelocity( const int entityNum ) { if ( entityNum >= 0 && entityNum < MAX_GENTITIES ) { return entVel[entityNum]; } else { return listener; } } void setListenerPosition( const float x, const float y, const float z ) { listener.x = x; listener.y = y; listener.z = z; } void setListenerAxis( const vec3_t axis0, const vec3_t axis1 ) { listenerFront.x = axis0[0]; listenerFront.y = axis0[1]; listenerFront.z = axis0[2]; listenerTop.x = axis1[0]; listenerTop.y = axis1[1]; listenerTop.z = axis1[2]; } idVec3& getListenerPosition() { return listener; } float getMusicVolume() { return s_musicVolume->value; } float getMinDistance() { return s_minDistance->value; } float getMaxDistance() { return s_maxDistance->value; } void bind( const char *name, idAudioBuffer *nis ) { hashTable.Set( name, nis ); } void unbind( const char *name ) { hashTable.Remove( name ); } private: void LOCK(); void UNLOCK(); bool initAudioHardware(); bool releaseAudioHardware(); int getAudioHardwareChannel(); int getDMAPos( int channel ); bool beginPainting( int channel ); bool endPainting( int channel ); idVec3 entPos[MAX_GENTITIES]; idVec3 entVel[MAX_GENTITIES]; float entVol[MAX_GENTITIES]; idVec3 listener; idVec3 listenerFront; idVec3 listenerTop; cvar_t *s_dopplerFactor; cvar_t *s_distanceFactor; cvar_t *s_rolloffFactor; cvar_t *s_minDistance; cvar_t *s_maxDistance; cvar_t *s_musicVolume; idHashTable hashTable; // hashed version for loaded sounds friend class idSound; friend class idAudioChannel; LPDIRECTSOUND3DLISTENER pDSListener; DS3DLISTENER dsListenerParams; // Listener properties }; extern idSpeaker* idSpeak;