AudioController.cpp 7.6 KB

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