AudioController.cpp 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. #include "Base.h"
  2. #include "AudioController.h"
  3. #include "AudioListener.h"
  4. #include "AudioBuffer.h"
  5. #include "AudioSource.h"
  6. namespace gameplay
  7. {
  8. std::list<AudioSource*> AudioController::_playingSources;
  9. #ifndef __ANDROID__
  10. AudioController::AudioController()
  11. : _alcDevice(NULL), _alcContext(NULL)
  12. {
  13. }
  14. #else
  15. AudioController::AudioController()
  16. : _engineObject(NULL), _engineEngine(NULL), _outputMixObject(NULL), _listenerObject(NULL),
  17. _listenerDoppler(NULL), _listenerLocation(NULL)
  18. {
  19. }
  20. #endif
  21. AudioController::~AudioController()
  22. {
  23. }
  24. void AudioController::initialize()
  25. {
  26. #ifndef __ANDROID__
  27. _alcDevice = alcOpenDevice (NULL);
  28. if (!_alcDevice)
  29. {
  30. LOG_ERROR("AudioController::initialize() error. Unable to open OpenAL device.\n");
  31. return;
  32. }
  33. _alcContext = alcCreateContext(_alcDevice, NULL);
  34. ALCenum alcErr = alcGetError(_alcDevice);
  35. if (!_alcContext || alcErr != ALC_NO_ERROR)
  36. {
  37. alcCloseDevice (_alcDevice);
  38. LOG_ERROR_VARG("AudioController::initialize() error. Unable to create OpenAL context. Error: %d\n", alcErr);
  39. return;
  40. }
  41. alcMakeContextCurrent(_alcContext);
  42. alcErr = alcGetError(_alcDevice);
  43. if (alcErr != ALC_NO_ERROR)
  44. {
  45. LOG_ERROR_VARG("AudioController::initialize() error. Unable to make OpenAL context current. Error: %d\n", alcErr);
  46. }
  47. #else
  48. // Create the engine.
  49. SLresult result = slCreateEngine(&_engineObject, 0, NULL, 0, NULL, NULL);
  50. if (result != SL_RESULT_SUCCESS)
  51. {
  52. LOG_ERROR("AudioController::initialize() error. Unable to create OpenSL engine.");
  53. return;
  54. }
  55. // Realize the engine.
  56. result = (*_engineObject)->Realize(_engineObject, SL_BOOLEAN_FALSE);
  57. if (result != SL_RESULT_SUCCESS)
  58. {
  59. LOG_ERROR("AudioController::initialize() error. Unable to realize OpenSL engine.");
  60. return;
  61. }
  62. // Get the engine interface in order to create other objects later on.
  63. result = (*_engineObject)->GetInterface(_engineObject, SL_IID_ENGINE, &_engineEngine);
  64. if (result != SL_RESULT_SUCCESS)
  65. {
  66. LOG_ERROR("AudioController::initialize() error. Unable to retrieve OpenSL engine interface.");
  67. return;
  68. }
  69. // Create the output mix.
  70. result = (*_engineEngine)->CreateOutputMix(_engineEngine, &_outputMixObject, 0, NULL, NULL);
  71. if (result != SL_RESULT_SUCCESS)
  72. {
  73. LOG_ERROR("AudioController::initialize() error. Unable to create OpenSL output mix.");
  74. return;
  75. }
  76. // Realize the output mix.
  77. result = (*_outputMixObject)->Realize(_outputMixObject, SL_BOOLEAN_FALSE);
  78. if (result != SL_RESULT_SUCCESS)
  79. {
  80. LOG_ERROR("AudioController::initialize() error. Unable to realize OpenSL output mix.");
  81. return;
  82. }
  83. #endif
  84. }
  85. void AudioController::finalize()
  86. {
  87. #ifndef __ANDROID__
  88. alcMakeContextCurrent(NULL);
  89. if (_alcContext)
  90. {
  91. alcDestroyContext(_alcContext);
  92. _alcContext = NULL;
  93. }
  94. if (_alcDevice)
  95. {
  96. alcCloseDevice(_alcDevice);
  97. _alcDevice = NULL;
  98. }
  99. #else
  100. if (_outputMixObject != NULL)
  101. {
  102. (*_outputMixObject)->Destroy(_outputMixObject);
  103. _outputMixObject = NULL;
  104. }
  105. if (_engineObject != NULL)
  106. {
  107. (*_engineObject)->Destroy(_engineObject);
  108. _engineObject = NULL;
  109. _engineEngine = NULL;
  110. }
  111. #endif
  112. }
  113. void AudioController::pause()
  114. {
  115. std::list<AudioSource*>::iterator itr = _playingSources.begin();
  116. // For each source that is playing, pause it.
  117. AudioSource* source = NULL;
  118. while (itr != _playingSources.end())
  119. {
  120. source = *itr;
  121. if (source->getState() == AudioSource::PLAYING)
  122. {
  123. source->pause();
  124. }
  125. itr++;
  126. }
  127. }
  128. void AudioController::resume()
  129. {
  130. #ifndef __ANDROID__
  131. alcMakeContextCurrent(_alcContext);
  132. #endif
  133. std::list<AudioSource*>::iterator itr = _playingSources.begin();
  134. // For each source that is playing, resume it.
  135. AudioSource* source = NULL;
  136. while (itr != _playingSources.end())
  137. {
  138. source = *itr;
  139. if (source->getState() == AudioSource::PAUSED)
  140. {
  141. source->play();
  142. }
  143. itr++;
  144. }
  145. }
  146. void AudioController::update(long elapsedTime)
  147. {
  148. AudioListener* listener = AudioListener::getInstance();
  149. if (listener)
  150. {
  151. #ifndef __ANDROID__
  152. alListenerf(AL_GAIN, listener->getGain());
  153. alListenerfv(AL_ORIENTATION, (ALfloat*)listener->getOrientation());
  154. alListenerfv(AL_VELOCITY, (ALfloat*)&listener->getVelocity());
  155. alListenerfv(AL_POSITION, (ALfloat*)&listener->getPosition());
  156. #else
  157. if (!_listenerObject)
  158. {
  159. const SLInterfaceID interfaces[3] = {SL_IID_3DDOPPLER, SL_IID_3DLOCATION};
  160. const SLboolean required[3] = {SL_BOOLEAN_FALSE, SL_BOOLEAN_FALSE};
  161. SLresult result = (*_engineEngine)->CreateListener(_engineEngine, &_listenerObject, 2, interfaces, required);
  162. if (result != SL_RESULT_SUCCESS)
  163. {
  164. WARN_VARG("AudioController: failed to create listener (%u).", result);
  165. return;
  166. }
  167. result = (*_listenerObject)->Realize(_listenerObject, SL_BOOLEAN_FALSE);
  168. if (result != SL_RESULT_SUCCESS)
  169. {
  170. WARN("AudioController: failed to realize listener.");
  171. return;
  172. }
  173. // Get the doppler interface in order to set the listener's velocity.
  174. result = (*_listenerObject)->GetInterface(_listenerObject, SL_IID_3DDOPPLER, &_listenerDoppler);
  175. if (result != SL_RESULT_SUCCESS)
  176. {
  177. WARN("AudioController: Unable to retrieve listener doppler interface.");
  178. return;
  179. }
  180. // Get the location interface in order to set the listener's position and orientation.
  181. result = (*_listenerObject)->GetInterface(_listenerObject, SL_IID_3DLOCATION, &_listenerLocation);
  182. if (result != SL_RESULT_SUCCESS)
  183. {
  184. WARN("AudioController: Unable to retrieve listener location interface.");
  185. return;
  186. }
  187. }
  188. SLVec3D f;
  189. f.x = listener->getOrientationForward().x;
  190. f.y = listener->getOrientationForward().y;
  191. f.z = listener->getOrientationForward().z;
  192. SLVec3D a;
  193. a.x = listener->getOrientationUp().x;
  194. a.y = listener->getOrientationUp().y;
  195. a.z = listener->getOrientationUp().z;
  196. SLresult result = (*_listenerLocation)->SetOrientationVectors(_listenerLocation, &f, &a);
  197. if (result != SL_RESULT_SUCCESS)
  198. {
  199. WARN("AudioController: Unable to set listener orientation.");
  200. }
  201. SLVec3D p;
  202. p.x = listener->getPosition().x;
  203. p.y = listener->getPosition().y;
  204. p.z = listener->getPosition().z;
  205. result = (*_listenerLocation)->SetLocationCartesian(_listenerLocation, &p);
  206. if (result != SL_RESULT_SUCCESS)
  207. {
  208. WARN("AudioController: Unable to set listener location.");
  209. }
  210. SLVec3D v;
  211. v.x = listener->getVelocity().x;
  212. v.y = listener->getVelocity().y;
  213. v.z = listener->getVelocity().z;
  214. result = (*_listenerDoppler)->SetVelocityCartesian(_listenerDoppler, &v);
  215. if (result != SL_RESULT_SUCCESS)
  216. {
  217. WARN("AudioController: Unable to set listener velocity.");
  218. }
  219. #endif
  220. }
  221. }
  222. }