raSystem  1.0 bata
raFMODSystem.cpp
Go to the documentation of this file.
1 #include "..\include\raMain.h"
2 
3 namespace raSystem
4 {
5  bool ERRCHECK(FMOD_RESULT result)
6  {
7  if (result != FMOD_OK)
8  {
9  char errstring[1024];
10 
11  sprintf(errstring, "FMOD (%d) %s", result, FMOD_ErrorString(result));
12 
13  RERROR(errstring);
14  return false;
15  }
16  return true;
17  }
18  raFMODSystem::raFMODSystem(raCamera *Cam) : raSoundDriver(Cam)
19  {
20  m_system = NULL;
21  m_Created = false;
22  m_format = FMOD_SOUND_FORMAT_PCM16;
23  m_Config = NULL;
24 
25  }
26 
27  bool raFMODSystem::Create(raConfig* altConfig, int toUseMemory)
28  {
29  unsigned int version = 0;
30  FMOD_RESULT result;
31  #ifdef _WIN64
32  INT_PTR retval = 0;
33  #else
34  int retval = 0;
35  #endif
36 
37  if(altConfig)
38  {
39  RINFO("Verwende alternative Sound Konfiguration");
40  m_Config = altConfig;
41  }
42  else
43  {
44  m_Config = new raConfig();
45  m_Config->Sound.Bit = raConfigLoader::Instance().GetConfig().Sound.Bit;
46  m_Config->Sound.b3D = raConfigLoader::Instance().GetConfig().Sound.b3D;
47  m_Config->Sound.Channels = raConfigLoader::Instance().GetConfig().Sound.Channels;
48  m_Config->Sound.Driver = raConfigLoader::Instance().GetConfig().Sound.Driver;
49  m_Config->Sound.Hardware = raConfigLoader::Instance().GetConfig().Sound.Hardware;
50  m_Config->Sound.SampleRate = raConfigLoader::Instance().GetConfig().Sound.SampleRate;
51  m_Config->Sound.Soundkarte = raConfigLoader::Instance().GetConfig().Sound.Soundkarte;
52  }
53  /*
54  Initialise FMOD
55  */
56  result = FMOD::Memory_Initialize(raSystem::raMemManager::Instance().MemAlloc(toUseMemory), toUseMemory, 0, 0, 0);
57  if(!ERRCHECK(result)) return false;
58 
59  result = FMOD::System_Create(&m_system);
60  if(!ERRCHECK(result)) return false;
61 
62  result = m_system->getVersion(&version);
63  if(!ERRCHECK(result)) return false;
64 
65  if (version < FMOD_VERSION)
66  {
67  MessageBox(GetForegroundWindow(), "INCORRECT DLL VERSION!!", "FMOD ERROR", MB_OK);
68  }
69  #ifdef _WIN64
70  result = m_system->setPluginPath("raPlugins/x64");
71  #else
72  result = m_system->setPluginPath("raPlugins/x86");
73  #endif
74  if(!ERRCHECK(result)) return false;
75 
76  switch (m_Config->Sound.Driver)
77  {
78  case 0:
79  {
80  m_system->setOutput(FMOD_OUTPUTTYPE_ASIO);
81  RINFO("SetOutput: ASIO");
82  break;
83  }
84  case 1:
85  {
86  m_system->setOutput(FMOD_OUTPUTTYPE_WINMM);
87  RINFO("SetOutput: WinMM");
88  break;
89  }
90  case 2:
91  {
92  m_system->setOutput(FMOD_OUTPUTTYPE_DSOUND);
93  RINFO("SetOutput: DSOUND");
94  break;
95  }
96  case 3:
97  {
98  m_system->setOutput(FMOD_OUTPUTTYPE_WASAPI);
99  RINFO("SetOutput: WASAPI");
100  break;
101  }
102  }
103 
104 
105  // FMOD PCM Format wählen
106  switch(m_Config->Sound.Bit)
107  {
108  case 0:
109  m_format = FMOD_SOUND_FORMAT_PCMFLOAT;
110  RINFO("SetSoundFormat: PCM_FLOAT");
111  break;
112  case 16:
113  m_format = FMOD_SOUND_FORMAT_PCM16;
114  RINFO("SetSoundFormat: PCM_16");
115  break;
116  case 24:
117  m_format = FMOD_SOUND_FORMAT_PCM24;
118  RINFO("SetSoundFormat: PCM_24");
119  break;
120  case 32:
121  m_format = FMOD_SOUND_FORMAT_PCM32;
122  RINFO("SetSoundFormat: PCM_32");
123  break;
124  };
125 
126  // FMOD Software Format setzen
127  result = m_system->setSoftwareFormat(m_Config->Sound.SampleRate,
128  m_format, 0, 0, FMOD_DSP_RESAMPLER_LINEAR);
129  if(!ERRCHECK(result)) return false;
130 
131  switch(m_Config->Sound.Channels)
132  {
133  case 1:
134  m_speakermode = FMOD_SPEAKERMODE_MONO;
135  RINFO("SetChannelMode: Mono");
136  break;
137  case 2:
138  m_speakermode = FMOD_SPEAKERMODE_STEREO;
139  RINFO("SetChannelMode: Stereo");
140  break;
141  case 4:
142  m_speakermode = FMOD_SPEAKERMODE_QUAD;
143  RINFO("SetChannelMode: 4.0");
144  break;
145  case 6:
146  m_speakermode = FMOD_SPEAKERMODE_5POINT1;
147  RINFO("SetChannelMode: 5.1");
148  break;
149  case 8:
150  m_speakermode = FMOD_SPEAKERMODE_7POINT1;
151  RINFO("SetChannelMode: 7.1");
152  break;
153  };
154  // FMOD Speakermode
155  result = m_system->setSpeakerMode(m_speakermode);
156  if(!ERRCHECK(result)) return false;
157 
158  result = m_system->setDriver(m_Config->Sound.Soundkarte);
159  if(!ERRCHECK(result)) return false;
160 
161  // FMOD Initialisieren
162  result = m_system->init(32, FMOD_INIT_NORMAL, 0);
163  if(!ERRCHECK(result)) return false;
164 
165  if(m_Config->Sound.b3D)
166  {
167  m_system->set3DSettings(1.0, DISTANCEFACTOR, 1.0f);
168  }
169 
170  ROK("SoundEnginnee Erstellt");
171  return true;
172  }
174  {
175  m_system->close();
176  m_system->release();
177 
178  SAFE_DELETE(m_system);
179  SAFE_DELETE(m_Config);
180 
181 
182  }
184  {
185  if(!m_Cam) return false;
186 
187  if(m_Config->Sound.b3D)
188  {
189  FMOD_RESULT result;
190 
191  result = m_system->set3DListenerAttributes(0, (FMOD_VECTOR*)m_Cam->GetEyePt(),
192  (FMOD_VECTOR*)m_Cam->GetVelocity(),
193  (FMOD_VECTOR*)m_Cam->GetWorldAhead(),
194  (FMOD_VECTOR*)m_Cam->GetWorldUp());
195 
196  m_system->update();
197  }
198  return true;
199  }
200 };
virtual void Destroy()
bool ERRCHECK(FMOD_RESULT result)
Definition: raFMODSystem.cpp:5
virtual bool Create(raConfig *altConfig=NULL, int toUseMemory=RASYSTEMEMMORYUSE)
void RAPI ROK(raString x)
Definition: raMain.cpp:114
void RAPI RINFO(raString x)
Definition: raMain.cpp:119
raFMODSystem(raCamera *Cam)
#define SAFE_DELETE(p)
Definition: d3dxGlobal.h:26
void RAPI RERROR(raString x)
Definition: raMain.cpp:129