/Telegram/_openal_patch/Alc/ALc.c

https://gitlab.com/mba811/tdesktop · C · 3771 lines · 3003 code · 525 blank · 243 comment · 560 complexity · cf4dede07cefe854417a5ff6574ec021 MD5 · raw file

Large files are truncated click here to view the full file

  1. /**
  2. * OpenAL cross platform audio library
  3. * Copyright (C) 1999-2007 by authors.
  4. * This library is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU Library General Public
  6. * License as published by the Free Software Foundation; either
  7. * version 2 of the License, or (at your option) any later version.
  8. *
  9. * This library is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. * Library General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU Library General Public
  15. * License along with this library; if not, write to the
  16. * Free Software Foundation, Inc.,
  17. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  18. * Or go to http://www.gnu.org/copyleft/lgpl.html
  19. */
  20. #include "config.h"
  21. #include <math.h>
  22. #include <stdlib.h>
  23. #include <stdio.h>
  24. #include <memory.h>
  25. #include <ctype.h>
  26. #include <signal.h>
  27. #include "alMain.h"
  28. #include "alSource.h"
  29. #include "alListener.h"
  30. #include "alThunk.h"
  31. #include "alSource.h"
  32. #include "alBuffer.h"
  33. #include "alAuxEffectSlot.h"
  34. #include "alError.h"
  35. #include "alMidi.h"
  36. #include "bs2b.h"
  37. #include "alu.h"
  38. #include "compat.h"
  39. #include "threads.h"
  40. #include "alstring.h"
  41. #include "backends/base.h"
  42. #include "midi/base.h"
  43. /************************************************
  44. * Backends
  45. ************************************************/
  46. struct BackendInfo {
  47. const char *name;
  48. ALCbackendFactory* (*getFactory)(void);
  49. ALCboolean (*Init)(BackendFuncs*);
  50. void (*Deinit)(void);
  51. void (*Probe)(enum DevProbe);
  52. BackendFuncs Funcs;
  53. };
  54. #define EmptyFuncs { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }
  55. static struct BackendInfo BackendList[] = {
  56. #ifdef HAVE_PULSEAUDIO
  57. { "pulse", ALCpulseBackendFactory_getFactory, NULL, NULL, NULL, EmptyFuncs },
  58. #endif
  59. #ifdef HAVE_ALSA
  60. { "alsa", ALCalsaBackendFactory_getFactory, NULL, NULL, NULL, EmptyFuncs },
  61. #endif
  62. #ifdef HAVE_COREAUDIO
  63. { "core", NULL, alc_ca_init, alc_ca_deinit, alc_ca_probe, EmptyFuncs },
  64. #endif
  65. #ifdef HAVE_OSS
  66. { "oss", ALCossBackendFactory_getFactory, NULL, NULL, NULL, EmptyFuncs },
  67. #endif
  68. #ifdef HAVE_SOLARIS
  69. { "solaris", NULL, alc_solaris_init, alc_solaris_deinit, alc_solaris_probe, EmptyFuncs },
  70. #endif
  71. #ifdef HAVE_SNDIO
  72. { "sndio", NULL, alc_sndio_init, alc_sndio_deinit, alc_sndio_probe, EmptyFuncs },
  73. #endif
  74. #ifdef HAVE_QSA
  75. { "qsa", NULL, alc_qsa_init, alc_qsa_deinit, alc_qsa_probe, EmptyFuncs },
  76. #endif
  77. #ifdef HAVE_MMDEVAPI
  78. { "mmdevapi", ALCmmdevBackendFactory_getFactory, NULL, NULL, NULL, EmptyFuncs },
  79. #endif
  80. #ifdef HAVE_DSOUND
  81. { "dsound", ALCdsoundBackendFactory_getFactory, NULL, NULL, NULL, EmptyFuncs },
  82. #endif
  83. #ifdef HAVE_WINMM
  84. { "winmm", NULL, alcWinMMInit, alcWinMMDeinit, alcWinMMProbe, EmptyFuncs },
  85. #endif
  86. #ifdef HAVE_PORTAUDIO
  87. { "port", NULL, alc_pa_init, alc_pa_deinit, alc_pa_probe, EmptyFuncs },
  88. #endif
  89. #ifdef HAVE_OPENSL
  90. { "opensl", NULL, alc_opensl_init, alc_opensl_deinit, alc_opensl_probe, EmptyFuncs },
  91. #endif
  92. { "null", ALCnullBackendFactory_getFactory, NULL, NULL, NULL, EmptyFuncs },
  93. #ifdef HAVE_WAVE
  94. { "wave", ALCwaveBackendFactory_getFactory, NULL, NULL, NULL, EmptyFuncs },
  95. #endif
  96. { NULL, NULL, NULL, NULL, NULL, EmptyFuncs }
  97. };
  98. #undef EmptyFuncs
  99. static struct BackendInfo PlaybackBackend;
  100. static struct BackendInfo CaptureBackend;
  101. static bool SuspendAndProcessSupported = false;
  102. /************************************************
  103. * Functions, enums, and errors
  104. ************************************************/
  105. typedef struct ALCfunction {
  106. const ALCchar *funcName;
  107. ALCvoid *address;
  108. } ALCfunction;
  109. typedef struct ALCenums {
  110. const ALCchar *enumName;
  111. ALCenum value;
  112. } ALCenums;
  113. #define DECL(x) { #x, (ALCvoid*)(x) }
  114. static const ALCfunction alcFunctions[] = {
  115. DECL(alcCreateContext),
  116. DECL(alcMakeContextCurrent),
  117. DECL(alcProcessContext),
  118. DECL(alcSuspendContext),
  119. DECL(alcDestroyContext),
  120. DECL(alcGetCurrentContext),
  121. DECL(alcGetContextsDevice),
  122. DECL(alcOpenDevice),
  123. DECL(alcCloseDevice),
  124. DECL(alcGetError),
  125. DECL(alcIsExtensionPresent),
  126. DECL(alcGetProcAddress),
  127. DECL(alcGetEnumValue),
  128. DECL(alcGetString),
  129. DECL(alcGetIntegerv),
  130. DECL(alcCaptureOpenDevice),
  131. DECL(alcCaptureCloseDevice),
  132. DECL(alcCaptureStart),
  133. DECL(alcCaptureStop),
  134. DECL(alcCaptureSamples),
  135. DECL(alcSetThreadContext),
  136. DECL(alcGetThreadContext),
  137. DECL(alcLoopbackOpenDeviceSOFT),
  138. DECL(alcIsRenderFormatSupportedSOFT),
  139. DECL(alcRenderSamplesSOFT),
  140. DECL(alcDevicePauseSOFT),
  141. DECL(alcDeviceResumeSOFT),
  142. DECL(alcGetInteger64vSOFT),
  143. DECL(alEnable),
  144. DECL(alDisable),
  145. DECL(alIsEnabled),
  146. DECL(alGetString),
  147. DECL(alGetBooleanv),
  148. DECL(alGetIntegerv),
  149. DECL(alGetFloatv),
  150. DECL(alGetDoublev),
  151. DECL(alGetBoolean),
  152. DECL(alGetInteger),
  153. DECL(alGetFloat),
  154. DECL(alGetDouble),
  155. DECL(alGetError),
  156. DECL(alIsExtensionPresent),
  157. DECL(alGetProcAddress),
  158. DECL(alGetEnumValue),
  159. DECL(alListenerf),
  160. DECL(alListener3f),
  161. DECL(alListenerfv),
  162. DECL(alListeneri),
  163. DECL(alListener3i),
  164. DECL(alListeneriv),
  165. DECL(alGetListenerf),
  166. DECL(alGetListener3f),
  167. DECL(alGetListenerfv),
  168. DECL(alGetListeneri),
  169. DECL(alGetListener3i),
  170. DECL(alGetListeneriv),
  171. DECL(alGenSources),
  172. DECL(alDeleteSources),
  173. DECL(alIsSource),
  174. DECL(alSourcef),
  175. DECL(alSource3f),
  176. DECL(alSourcefv),
  177. DECL(alSourcei),
  178. DECL(alSource3i),
  179. DECL(alSourceiv),
  180. DECL(alGetSourcef),
  181. DECL(alGetSource3f),
  182. DECL(alGetSourcefv),
  183. DECL(alGetSourcei),
  184. DECL(alGetSource3i),
  185. DECL(alGetSourceiv),
  186. DECL(alSourcePlayv),
  187. DECL(alSourceStopv),
  188. DECL(alSourceRewindv),
  189. DECL(alSourcePausev),
  190. DECL(alSourcePlay),
  191. DECL(alSourceStop),
  192. DECL(alSourceRewind),
  193. DECL(alSourcePause),
  194. DECL(alSourceQueueBuffers),
  195. DECL(alSourceUnqueueBuffers),
  196. DECL(alGenBuffers),
  197. DECL(alDeleteBuffers),
  198. DECL(alIsBuffer),
  199. DECL(alBufferData),
  200. DECL(alBufferf),
  201. DECL(alBuffer3f),
  202. DECL(alBufferfv),
  203. DECL(alBufferi),
  204. DECL(alBuffer3i),
  205. DECL(alBufferiv),
  206. DECL(alGetBufferf),
  207. DECL(alGetBuffer3f),
  208. DECL(alGetBufferfv),
  209. DECL(alGetBufferi),
  210. DECL(alGetBuffer3i),
  211. DECL(alGetBufferiv),
  212. DECL(alDopplerFactor),
  213. DECL(alDopplerVelocity),
  214. DECL(alSpeedOfSound),
  215. DECL(alDistanceModel),
  216. DECL(alGenFilters),
  217. DECL(alDeleteFilters),
  218. DECL(alIsFilter),
  219. DECL(alFilteri),
  220. DECL(alFilteriv),
  221. DECL(alFilterf),
  222. DECL(alFilterfv),
  223. DECL(alGetFilteri),
  224. DECL(alGetFilteriv),
  225. DECL(alGetFilterf),
  226. DECL(alGetFilterfv),
  227. DECL(alGenEffects),
  228. DECL(alDeleteEffects),
  229. DECL(alIsEffect),
  230. DECL(alEffecti),
  231. DECL(alEffectiv),
  232. DECL(alEffectf),
  233. DECL(alEffectfv),
  234. DECL(alGetEffecti),
  235. DECL(alGetEffectiv),
  236. DECL(alGetEffectf),
  237. DECL(alGetEffectfv),
  238. DECL(alGenAuxiliaryEffectSlots),
  239. DECL(alDeleteAuxiliaryEffectSlots),
  240. DECL(alIsAuxiliaryEffectSlot),
  241. DECL(alAuxiliaryEffectSloti),
  242. DECL(alAuxiliaryEffectSlotiv),
  243. DECL(alAuxiliaryEffectSlotf),
  244. DECL(alAuxiliaryEffectSlotfv),
  245. DECL(alGetAuxiliaryEffectSloti),
  246. DECL(alGetAuxiliaryEffectSlotiv),
  247. DECL(alGetAuxiliaryEffectSlotf),
  248. DECL(alGetAuxiliaryEffectSlotfv),
  249. DECL(alBufferSubDataSOFT),
  250. DECL(alBufferSamplesSOFT),
  251. DECL(alBufferSubSamplesSOFT),
  252. DECL(alGetBufferSamplesSOFT),
  253. DECL(alIsBufferFormatSupportedSOFT),
  254. DECL(alDeferUpdatesSOFT),
  255. DECL(alProcessUpdatesSOFT),
  256. DECL(alSourcedSOFT),
  257. DECL(alSource3dSOFT),
  258. DECL(alSourcedvSOFT),
  259. DECL(alGetSourcedSOFT),
  260. DECL(alGetSource3dSOFT),
  261. DECL(alGetSourcedvSOFT),
  262. DECL(alSourcei64SOFT),
  263. DECL(alSource3i64SOFT),
  264. DECL(alSourcei64vSOFT),
  265. DECL(alGetSourcei64SOFT),
  266. DECL(alGetSource3i64SOFT),
  267. DECL(alGetSourcei64vSOFT),
  268. DECL(alGenSoundfontsSOFT),
  269. DECL(alDeleteSoundfontsSOFT),
  270. DECL(alIsSoundfontSOFT),
  271. DECL(alGetSoundfontivSOFT),
  272. DECL(alSoundfontPresetsSOFT),
  273. DECL(alGenPresetsSOFT),
  274. DECL(alDeletePresetsSOFT),
  275. DECL(alIsPresetSOFT),
  276. DECL(alPresetiSOFT),
  277. DECL(alPresetivSOFT),
  278. DECL(alGetPresetivSOFT),
  279. DECL(alPresetFontsoundsSOFT),
  280. DECL(alGenFontsoundsSOFT),
  281. DECL(alDeleteFontsoundsSOFT),
  282. DECL(alIsFontsoundSOFT),
  283. DECL(alFontsoundiSOFT),
  284. DECL(alFontsound2iSOFT),
  285. DECL(alFontsoundivSOFT),
  286. DECL(alGetFontsoundivSOFT),
  287. DECL(alFontsoundModulatoriSOFT),
  288. DECL(alGetFontsoundModulatorivSOFT),
  289. DECL(alMidiSoundfontSOFT),
  290. DECL(alMidiSoundfontvSOFT),
  291. DECL(alMidiEventSOFT),
  292. DECL(alMidiSysExSOFT),
  293. DECL(alMidiPlaySOFT),
  294. DECL(alMidiPauseSOFT),
  295. DECL(alMidiStopSOFT),
  296. DECL(alMidiResetSOFT),
  297. DECL(alMidiGainSOFT),
  298. DECL(alGetInteger64SOFT),
  299. DECL(alGetInteger64vSOFT),
  300. DECL(alLoadSoundfontSOFT),
  301. { NULL, NULL }
  302. };
  303. #undef DECL
  304. #define DECL(x) { #x, (x) }
  305. static const ALCenums enumeration[] = {
  306. DECL(ALC_INVALID),
  307. DECL(ALC_FALSE),
  308. DECL(ALC_TRUE),
  309. DECL(ALC_MAJOR_VERSION),
  310. DECL(ALC_MINOR_VERSION),
  311. DECL(ALC_ATTRIBUTES_SIZE),
  312. DECL(ALC_ALL_ATTRIBUTES),
  313. DECL(ALC_DEFAULT_DEVICE_SPECIFIER),
  314. DECL(ALC_DEVICE_SPECIFIER),
  315. DECL(ALC_ALL_DEVICES_SPECIFIER),
  316. DECL(ALC_DEFAULT_ALL_DEVICES_SPECIFIER),
  317. DECL(ALC_EXTENSIONS),
  318. DECL(ALC_FREQUENCY),
  319. DECL(ALC_REFRESH),
  320. DECL(ALC_SYNC),
  321. DECL(ALC_MONO_SOURCES),
  322. DECL(ALC_STEREO_SOURCES),
  323. DECL(ALC_CAPTURE_DEVICE_SPECIFIER),
  324. DECL(ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER),
  325. DECL(ALC_CAPTURE_SAMPLES),
  326. DECL(ALC_CONNECTED),
  327. DECL(ALC_EFX_MAJOR_VERSION),
  328. DECL(ALC_EFX_MINOR_VERSION),
  329. DECL(ALC_MAX_AUXILIARY_SENDS),
  330. DECL(ALC_FORMAT_CHANNELS_SOFT),
  331. DECL(ALC_FORMAT_TYPE_SOFT),
  332. DECL(ALC_MONO_SOFT),
  333. DECL(ALC_STEREO_SOFT),
  334. DECL(ALC_QUAD_SOFT),
  335. DECL(ALC_5POINT1_SOFT),
  336. DECL(ALC_6POINT1_SOFT),
  337. DECL(ALC_7POINT1_SOFT),
  338. DECL(ALC_BYTE_SOFT),
  339. DECL(ALC_UNSIGNED_BYTE_SOFT),
  340. DECL(ALC_SHORT_SOFT),
  341. DECL(ALC_UNSIGNED_SHORT_SOFT),
  342. DECL(ALC_INT_SOFT),
  343. DECL(ALC_UNSIGNED_INT_SOFT),
  344. DECL(ALC_FLOAT_SOFT),
  345. DECL(ALC_NO_ERROR),
  346. DECL(ALC_INVALID_DEVICE),
  347. DECL(ALC_INVALID_CONTEXT),
  348. DECL(ALC_INVALID_ENUM),
  349. DECL(ALC_INVALID_VALUE),
  350. DECL(ALC_OUT_OF_MEMORY),
  351. DECL(AL_INVALID),
  352. DECL(AL_NONE),
  353. DECL(AL_FALSE),
  354. DECL(AL_TRUE),
  355. DECL(AL_SOURCE_RELATIVE),
  356. DECL(AL_CONE_INNER_ANGLE),
  357. DECL(AL_CONE_OUTER_ANGLE),
  358. DECL(AL_PITCH),
  359. DECL(AL_POSITION),
  360. DECL(AL_DIRECTION),
  361. DECL(AL_VELOCITY),
  362. DECL(AL_LOOPING),
  363. DECL(AL_BUFFER),
  364. DECL(AL_GAIN),
  365. DECL(AL_MIN_GAIN),
  366. DECL(AL_MAX_GAIN),
  367. DECL(AL_ORIENTATION),
  368. DECL(AL_REFERENCE_DISTANCE),
  369. DECL(AL_ROLLOFF_FACTOR),
  370. DECL(AL_CONE_OUTER_GAIN),
  371. DECL(AL_MAX_DISTANCE),
  372. DECL(AL_SEC_OFFSET),
  373. DECL(AL_SAMPLE_OFFSET),
  374. DECL(AL_SAMPLE_RW_OFFSETS_SOFT),
  375. DECL(AL_BYTE_OFFSET),
  376. DECL(AL_BYTE_RW_OFFSETS_SOFT),
  377. DECL(AL_SOURCE_TYPE),
  378. DECL(AL_STATIC),
  379. DECL(AL_STREAMING),
  380. DECL(AL_UNDETERMINED),
  381. DECL(AL_METERS_PER_UNIT),
  382. DECL(AL_DIRECT_CHANNELS_SOFT),
  383. DECL(AL_DIRECT_FILTER),
  384. DECL(AL_AUXILIARY_SEND_FILTER),
  385. DECL(AL_AIR_ABSORPTION_FACTOR),
  386. DECL(AL_ROOM_ROLLOFF_FACTOR),
  387. DECL(AL_CONE_OUTER_GAINHF),
  388. DECL(AL_DIRECT_FILTER_GAINHF_AUTO),
  389. DECL(AL_AUXILIARY_SEND_FILTER_GAIN_AUTO),
  390. DECL(AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO),
  391. DECL(AL_SOURCE_STATE),
  392. DECL(AL_INITIAL),
  393. DECL(AL_PLAYING),
  394. DECL(AL_PAUSED),
  395. DECL(AL_STOPPED),
  396. DECL(AL_BUFFERS_QUEUED),
  397. DECL(AL_BUFFERS_PROCESSED),
  398. DECL(AL_FORMAT_MONO8),
  399. DECL(AL_FORMAT_MONO16),
  400. DECL(AL_FORMAT_MONO_FLOAT32),
  401. DECL(AL_FORMAT_MONO_DOUBLE_EXT),
  402. DECL(AL_FORMAT_STEREO8),
  403. DECL(AL_FORMAT_STEREO16),
  404. DECL(AL_FORMAT_STEREO_FLOAT32),
  405. DECL(AL_FORMAT_STEREO_DOUBLE_EXT),
  406. DECL(AL_FORMAT_MONO_IMA4),
  407. DECL(AL_FORMAT_STEREO_IMA4),
  408. DECL(AL_FORMAT_MONO_MSADPCM_SOFT),
  409. DECL(AL_FORMAT_STEREO_MSADPCM_SOFT),
  410. DECL(AL_FORMAT_QUAD8_LOKI),
  411. DECL(AL_FORMAT_QUAD16_LOKI),
  412. DECL(AL_FORMAT_QUAD8),
  413. DECL(AL_FORMAT_QUAD16),
  414. DECL(AL_FORMAT_QUAD32),
  415. DECL(AL_FORMAT_51CHN8),
  416. DECL(AL_FORMAT_51CHN16),
  417. DECL(AL_FORMAT_51CHN32),
  418. DECL(AL_FORMAT_61CHN8),
  419. DECL(AL_FORMAT_61CHN16),
  420. DECL(AL_FORMAT_61CHN32),
  421. DECL(AL_FORMAT_71CHN8),
  422. DECL(AL_FORMAT_71CHN16),
  423. DECL(AL_FORMAT_71CHN32),
  424. DECL(AL_FORMAT_REAR8),
  425. DECL(AL_FORMAT_REAR16),
  426. DECL(AL_FORMAT_REAR32),
  427. DECL(AL_FORMAT_MONO_MULAW),
  428. DECL(AL_FORMAT_MONO_MULAW_EXT),
  429. DECL(AL_FORMAT_STEREO_MULAW),
  430. DECL(AL_FORMAT_STEREO_MULAW_EXT),
  431. DECL(AL_FORMAT_QUAD_MULAW),
  432. DECL(AL_FORMAT_51CHN_MULAW),
  433. DECL(AL_FORMAT_61CHN_MULAW),
  434. DECL(AL_FORMAT_71CHN_MULAW),
  435. DECL(AL_FORMAT_REAR_MULAW),
  436. DECL(AL_FORMAT_MONO_ALAW_EXT),
  437. DECL(AL_FORMAT_STEREO_ALAW_EXT),
  438. DECL(AL_MONO8_SOFT),
  439. DECL(AL_MONO16_SOFT),
  440. DECL(AL_MONO32F_SOFT),
  441. DECL(AL_STEREO8_SOFT),
  442. DECL(AL_STEREO16_SOFT),
  443. DECL(AL_STEREO32F_SOFT),
  444. DECL(AL_QUAD8_SOFT),
  445. DECL(AL_QUAD16_SOFT),
  446. DECL(AL_QUAD32F_SOFT),
  447. DECL(AL_REAR8_SOFT),
  448. DECL(AL_REAR16_SOFT),
  449. DECL(AL_REAR32F_SOFT),
  450. DECL(AL_5POINT1_8_SOFT),
  451. DECL(AL_5POINT1_16_SOFT),
  452. DECL(AL_5POINT1_32F_SOFT),
  453. DECL(AL_6POINT1_8_SOFT),
  454. DECL(AL_6POINT1_16_SOFT),
  455. DECL(AL_6POINT1_32F_SOFT),
  456. DECL(AL_7POINT1_8_SOFT),
  457. DECL(AL_7POINT1_16_SOFT),
  458. DECL(AL_7POINT1_32F_SOFT),
  459. DECL(AL_MONO_SOFT),
  460. DECL(AL_STEREO_SOFT),
  461. DECL(AL_QUAD_SOFT),
  462. DECL(AL_REAR_SOFT),
  463. DECL(AL_5POINT1_SOFT),
  464. DECL(AL_6POINT1_SOFT),
  465. DECL(AL_7POINT1_SOFT),
  466. DECL(AL_BYTE_SOFT),
  467. DECL(AL_UNSIGNED_BYTE_SOFT),
  468. DECL(AL_SHORT_SOFT),
  469. DECL(AL_UNSIGNED_SHORT_SOFT),
  470. DECL(AL_INT_SOFT),
  471. DECL(AL_UNSIGNED_INT_SOFT),
  472. DECL(AL_FLOAT_SOFT),
  473. DECL(AL_DOUBLE_SOFT),
  474. DECL(AL_BYTE3_SOFT),
  475. DECL(AL_UNSIGNED_BYTE3_SOFT),
  476. DECL(AL_FREQUENCY),
  477. DECL(AL_BITS),
  478. DECL(AL_CHANNELS),
  479. DECL(AL_SIZE),
  480. DECL(AL_INTERNAL_FORMAT_SOFT),
  481. DECL(AL_BYTE_LENGTH_SOFT),
  482. DECL(AL_SAMPLE_LENGTH_SOFT),
  483. DECL(AL_SEC_LENGTH_SOFT),
  484. DECL(AL_UNPACK_BLOCK_ALIGNMENT_SOFT),
  485. DECL(AL_PACK_BLOCK_ALIGNMENT_SOFT),
  486. DECL(AL_UNUSED),
  487. DECL(AL_PENDING),
  488. DECL(AL_PROCESSED),
  489. DECL(AL_NO_ERROR),
  490. DECL(AL_INVALID_NAME),
  491. DECL(AL_INVALID_ENUM),
  492. DECL(AL_INVALID_VALUE),
  493. DECL(AL_INVALID_OPERATION),
  494. DECL(AL_OUT_OF_MEMORY),
  495. DECL(AL_VENDOR),
  496. DECL(AL_VERSION),
  497. DECL(AL_RENDERER),
  498. DECL(AL_EXTENSIONS),
  499. DECL(AL_DOPPLER_FACTOR),
  500. DECL(AL_DOPPLER_VELOCITY),
  501. DECL(AL_DISTANCE_MODEL),
  502. DECL(AL_SPEED_OF_SOUND),
  503. DECL(AL_SOURCE_DISTANCE_MODEL),
  504. DECL(AL_DEFERRED_UPDATES_SOFT),
  505. DECL(AL_INVERSE_DISTANCE),
  506. DECL(AL_INVERSE_DISTANCE_CLAMPED),
  507. DECL(AL_LINEAR_DISTANCE),
  508. DECL(AL_LINEAR_DISTANCE_CLAMPED),
  509. DECL(AL_EXPONENT_DISTANCE),
  510. DECL(AL_EXPONENT_DISTANCE_CLAMPED),
  511. DECL(AL_FILTER_TYPE),
  512. DECL(AL_FILTER_NULL),
  513. DECL(AL_FILTER_LOWPASS),
  514. DECL(AL_FILTER_HIGHPASS),
  515. DECL(AL_FILTER_BANDPASS),
  516. DECL(AL_LOWPASS_GAIN),
  517. DECL(AL_LOWPASS_GAINHF),
  518. DECL(AL_HIGHPASS_GAIN),
  519. DECL(AL_HIGHPASS_GAINLF),
  520. DECL(AL_BANDPASS_GAIN),
  521. DECL(AL_BANDPASS_GAINHF),
  522. DECL(AL_BANDPASS_GAINLF),
  523. DECL(AL_EFFECT_TYPE),
  524. DECL(AL_EFFECT_NULL),
  525. DECL(AL_EFFECT_REVERB),
  526. DECL(AL_EFFECT_EAXREVERB),
  527. DECL(AL_EFFECT_CHORUS),
  528. DECL(AL_EFFECT_DISTORTION),
  529. DECL(AL_EFFECT_ECHO),
  530. DECL(AL_EFFECT_FLANGER),
  531. #if 0
  532. DECL(AL_EFFECT_FREQUENCY_SHIFTER),
  533. DECL(AL_EFFECT_VOCAL_MORPHER),
  534. DECL(AL_EFFECT_PITCH_SHIFTER),
  535. #endif
  536. DECL(AL_EFFECT_RING_MODULATOR),
  537. #if 0
  538. DECL(AL_EFFECT_AUTOWAH),
  539. #endif
  540. DECL(AL_EFFECT_COMPRESSOR),
  541. DECL(AL_EFFECT_EQUALIZER),
  542. DECL(AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT),
  543. DECL(AL_EFFECT_DEDICATED_DIALOGUE),
  544. DECL(AL_EAXREVERB_DENSITY),
  545. DECL(AL_EAXREVERB_DIFFUSION),
  546. DECL(AL_EAXREVERB_GAIN),
  547. DECL(AL_EAXREVERB_GAINHF),
  548. DECL(AL_EAXREVERB_GAINLF),
  549. DECL(AL_EAXREVERB_DECAY_TIME),
  550. DECL(AL_EAXREVERB_DECAY_HFRATIO),
  551. DECL(AL_EAXREVERB_DECAY_LFRATIO),
  552. DECL(AL_EAXREVERB_REFLECTIONS_GAIN),
  553. DECL(AL_EAXREVERB_REFLECTIONS_DELAY),
  554. DECL(AL_EAXREVERB_REFLECTIONS_PAN),
  555. DECL(AL_EAXREVERB_LATE_REVERB_GAIN),
  556. DECL(AL_EAXREVERB_LATE_REVERB_DELAY),
  557. DECL(AL_EAXREVERB_LATE_REVERB_PAN),
  558. DECL(AL_EAXREVERB_ECHO_TIME),
  559. DECL(AL_EAXREVERB_ECHO_DEPTH),
  560. DECL(AL_EAXREVERB_MODULATION_TIME),
  561. DECL(AL_EAXREVERB_MODULATION_DEPTH),
  562. DECL(AL_EAXREVERB_AIR_ABSORPTION_GAINHF),
  563. DECL(AL_EAXREVERB_HFREFERENCE),
  564. DECL(AL_EAXREVERB_LFREFERENCE),
  565. DECL(AL_EAXREVERB_ROOM_ROLLOFF_FACTOR),
  566. DECL(AL_EAXREVERB_DECAY_HFLIMIT),
  567. DECL(AL_REVERB_DENSITY),
  568. DECL(AL_REVERB_DIFFUSION),
  569. DECL(AL_REVERB_GAIN),
  570. DECL(AL_REVERB_GAINHF),
  571. DECL(AL_REVERB_DECAY_TIME),
  572. DECL(AL_REVERB_DECAY_HFRATIO),
  573. DECL(AL_REVERB_REFLECTIONS_GAIN),
  574. DECL(AL_REVERB_REFLECTIONS_DELAY),
  575. DECL(AL_REVERB_LATE_REVERB_GAIN),
  576. DECL(AL_REVERB_LATE_REVERB_DELAY),
  577. DECL(AL_REVERB_AIR_ABSORPTION_GAINHF),
  578. DECL(AL_REVERB_ROOM_ROLLOFF_FACTOR),
  579. DECL(AL_REVERB_DECAY_HFLIMIT),
  580. DECL(AL_CHORUS_WAVEFORM),
  581. DECL(AL_CHORUS_PHASE),
  582. DECL(AL_CHORUS_RATE),
  583. DECL(AL_CHORUS_DEPTH),
  584. DECL(AL_CHORUS_FEEDBACK),
  585. DECL(AL_CHORUS_DELAY),
  586. DECL(AL_DISTORTION_EDGE),
  587. DECL(AL_DISTORTION_GAIN),
  588. DECL(AL_DISTORTION_LOWPASS_CUTOFF),
  589. DECL(AL_DISTORTION_EQCENTER),
  590. DECL(AL_DISTORTION_EQBANDWIDTH),
  591. DECL(AL_ECHO_DELAY),
  592. DECL(AL_ECHO_LRDELAY),
  593. DECL(AL_ECHO_DAMPING),
  594. DECL(AL_ECHO_FEEDBACK),
  595. DECL(AL_ECHO_SPREAD),
  596. DECL(AL_FLANGER_WAVEFORM),
  597. DECL(AL_FLANGER_PHASE),
  598. DECL(AL_FLANGER_RATE),
  599. DECL(AL_FLANGER_DEPTH),
  600. DECL(AL_FLANGER_FEEDBACK),
  601. DECL(AL_FLANGER_DELAY),
  602. DECL(AL_RING_MODULATOR_FREQUENCY),
  603. DECL(AL_RING_MODULATOR_HIGHPASS_CUTOFF),
  604. DECL(AL_RING_MODULATOR_WAVEFORM),
  605. #if 0
  606. DECL(AL_AUTOWAH_ATTACK_TIME),
  607. DECL(AL_AUTOWAH_PEAK_GAIN),
  608. DECL(AL_AUTOWAH_RELEASE_TIME),
  609. DECL(AL_AUTOWAH_RESONANCE),
  610. #endif
  611. DECL(AL_COMPRESSOR_ONOFF),
  612. DECL(AL_EQUALIZER_LOW_GAIN),
  613. DECL(AL_EQUALIZER_LOW_CUTOFF),
  614. DECL(AL_EQUALIZER_MID1_GAIN),
  615. DECL(AL_EQUALIZER_MID1_CENTER),
  616. DECL(AL_EQUALIZER_MID1_WIDTH),
  617. DECL(AL_EQUALIZER_MID2_GAIN),
  618. DECL(AL_EQUALIZER_MID2_CENTER),
  619. DECL(AL_EQUALIZER_MID2_WIDTH),
  620. DECL(AL_EQUALIZER_HIGH_GAIN),
  621. DECL(AL_EQUALIZER_HIGH_CUTOFF),
  622. DECL(AL_DEDICATED_GAIN),
  623. { NULL, (ALCenum)0 }
  624. };
  625. #undef DECL
  626. static const ALCchar alcNoError[] = "No Error";
  627. static const ALCchar alcErrInvalidDevice[] = "Invalid Device";
  628. static const ALCchar alcErrInvalidContext[] = "Invalid Context";
  629. static const ALCchar alcErrInvalidEnum[] = "Invalid Enum";
  630. static const ALCchar alcErrInvalidValue[] = "Invalid Value";
  631. static const ALCchar alcErrOutOfMemory[] = "Out of Memory";
  632. /************************************************
  633. * Global variables
  634. ************************************************/
  635. /* Enumerated device names */
  636. static const ALCchar alcDefaultName[] = "OpenAL Soft\0";
  637. static al_string alcAllDevicesList;
  638. static al_string alcCaptureDeviceList;
  639. /* Default is always the first in the list */
  640. static ALCchar *alcDefaultAllDevicesSpecifier;
  641. static ALCchar *alcCaptureDefaultDeviceSpecifier;
  642. /* Default context extensions */
  643. static const ALchar alExtList[] =
  644. "AL_EXT_ALAW AL_EXT_DOUBLE AL_EXT_EXPONENT_DISTANCE AL_EXT_FLOAT32 "
  645. "AL_EXT_IMA4 AL_EXT_LINEAR_DISTANCE AL_EXT_MCFORMATS AL_EXT_MULAW "
  646. "AL_EXT_MULAW_MCFORMATS AL_EXT_OFFSET AL_EXT_source_distance_model "
  647. "AL_LOKI_quadriphonic AL_SOFT_block_alignment AL_SOFT_buffer_samples "
  648. "AL_SOFT_buffer_sub_data AL_SOFT_deferred_updates AL_SOFT_direct_channels "
  649. "AL_SOFT_loop_points AL_SOFT_MSADPCM AL_SOFT_source_latency "
  650. "AL_SOFT_source_length";
  651. static ATOMIC(ALCenum) LastNullDeviceError = ATOMIC_INIT_STATIC(ALC_NO_ERROR);
  652. /* Thread-local current context */
  653. static altss_t LocalContext;
  654. /* Process-wide current context */
  655. static ATOMIC(ALCcontext*) GlobalContext = ATOMIC_INIT_STATIC(NULL);
  656. /* Mixing thread piority level */
  657. ALint RTPrioLevel;
  658. FILE *LogFile;
  659. #ifdef _DEBUG
  660. enum LogLevel LogLevel = LogWarning;
  661. #else
  662. enum LogLevel LogLevel = LogError;
  663. #endif
  664. /* Flag to trap ALC device errors */
  665. static ALCboolean TrapALCError = ALC_FALSE;
  666. /* One-time configuration init control */
  667. static alonce_flag alc_config_once = AL_ONCE_FLAG_INIT;
  668. /* Default effect that applies to sources that don't have an effect on send 0 */
  669. static ALeffect DefaultEffect;
  670. /************************************************
  671. * ALC information
  672. ************************************************/
  673. static const ALCchar alcNoDeviceExtList[] =
  674. "ALC_ENUMERATE_ALL_EXT ALC_ENUMERATION_EXT ALC_EXT_CAPTURE "
  675. "ALC_EXT_thread_local_context ALC_SOFT_loopback";
  676. static const ALCchar alcExtensionList[] =
  677. "ALC_ENUMERATE_ALL_EXT ALC_ENUMERATION_EXT ALC_EXT_CAPTURE "
  678. "ALC_EXT_DEDICATED ALC_EXT_disconnect ALC_EXT_EFX "
  679. "ALC_EXT_thread_local_context ALC_SOFTX_device_clock ALC_SOFTX_HRTF "
  680. "ALC_SOFT_loopback ALC_SOFTX_midi_interface ALC_SOFT_pause_device";
  681. static const ALCint alcMajorVersion = 1;
  682. static const ALCint alcMinorVersion = 1;
  683. static const ALCint alcEFXMajorVersion = 1;
  684. static const ALCint alcEFXMinorVersion = 0;
  685. /************************************************
  686. * Device lists
  687. ************************************************/
  688. static ATOMIC(ALCdevice*) DeviceList = ATOMIC_INIT_STATIC(NULL);
  689. static almtx_t ListLock;
  690. static inline void LockLists(void)
  691. {
  692. int lockret = almtx_lock(&ListLock);
  693. assert(lockret == althrd_success);
  694. }
  695. static inline void UnlockLists(void)
  696. {
  697. int unlockret = almtx_unlock(&ListLock);
  698. assert(unlockret == althrd_success);
  699. }
  700. /************************************************
  701. * Library initialization
  702. ************************************************/
  703. #if defined(_WIN32)
  704. static void alc_init(void);
  705. static void alc_deinit(void);
  706. static void alc_deinit_safe(void);
  707. #ifndef AL_LIBTYPE_STATIC
  708. BOOL APIENTRY DllMain(HINSTANCE hModule, DWORD reason, LPVOID lpReserved)
  709. {
  710. switch(reason)
  711. {
  712. case DLL_PROCESS_ATTACH:
  713. /* Pin the DLL so we won't get unloaded until the process terminates */
  714. GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_PIN | GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
  715. (WCHAR*)hModule, &hModule);
  716. alc_init();
  717. break;
  718. case DLL_THREAD_DETACH:
  719. break;
  720. case DLL_PROCESS_DETACH:
  721. if(!lpReserved)
  722. alc_deinit();
  723. else
  724. alc_deinit_safe();
  725. break;
  726. }
  727. return TRUE;
  728. }
  729. #elif defined(_MSC_VER)
  730. #pragma section(".CRT$XCU",read)
  731. static void alc_constructor(void);
  732. static void alc_destructor(void);
  733. __declspec(allocate(".CRT$XCU")) void (__cdecl* alc_constructor_)(void) = alc_constructor;
  734. static void alc_constructor(void)
  735. {
  736. atexit(alc_destructor);
  737. alc_init();
  738. }
  739. static void alc_destructor(void)
  740. {
  741. alc_deinit();
  742. }
  743. #elif defined(HAVE_GCC_DESTRUCTOR)
  744. static void alc_init(void) __attribute__((constructor));
  745. static void alc_deinit(void) __attribute__((destructor));
  746. #else
  747. #error "No static initialization available on this platform!"
  748. #endif
  749. #elif defined(HAVE_GCC_DESTRUCTOR)
  750. static void alc_init(void) __attribute__((constructor));
  751. static void alc_deinit(void) __attribute__((destructor));
  752. #else
  753. #error "No global initialization available on this platform!"
  754. #endif
  755. static void ReleaseThreadCtx(void *ptr);
  756. static void alc_init(void)
  757. {
  758. const char *str;
  759. int ret;
  760. LogFile = stderr;
  761. AL_STRING_INIT(alcAllDevicesList);
  762. AL_STRING_INIT(alcCaptureDeviceList);
  763. str = getenv("__ALSOFT_HALF_ANGLE_CONES");
  764. if(str && (strcasecmp(str, "true") == 0 || strtol(str, NULL, 0) == 1))
  765. ConeScale *= 0.5f;
  766. str = getenv("__ALSOFT_REVERSE_Z");
  767. if(str && (strcasecmp(str, "true") == 0 || strtol(str, NULL, 0) == 1))
  768. ZScale *= -1.0f;
  769. ret = altss_create(&LocalContext, ReleaseThreadCtx);
  770. assert(ret == althrd_success);
  771. ret = almtx_init(&ListLock, almtx_recursive);
  772. assert(ret == althrd_success);
  773. ThunkInit();
  774. }
  775. static void alc_initconfig(void)
  776. {
  777. const char *devs, *str;
  778. ALuint capfilter;
  779. float valf;
  780. int i, n;
  781. str = getenv("ALSOFT_LOGLEVEL");
  782. if(str)
  783. {
  784. long lvl = strtol(str, NULL, 0);
  785. if(lvl >= NoLog && lvl <= LogRef)
  786. LogLevel = lvl;
  787. }
  788. str = getenv("ALSOFT_LOGFILE");
  789. if(str && str[0])
  790. {
  791. FILE *logfile = al_fopen(str, "wt");
  792. if(logfile) LogFile = logfile;
  793. else ERR("Failed to open log file '%s'\n", str);
  794. }
  795. {
  796. char buf[1024] = "";
  797. int len = snprintf(buf, sizeof(buf), "%s", BackendList[0].name);
  798. for(i = 1;BackendList[i].name;i++)
  799. len += snprintf(buf+len, sizeof(buf)-len, ", %s", BackendList[i].name);
  800. TRACE("Supported backends: %s\n", buf);
  801. }
  802. ReadALConfig();
  803. capfilter = 0;
  804. #if defined(HAVE_SSE4_1)
  805. capfilter |= CPU_CAP_SSE | CPU_CAP_SSE2 | CPU_CAP_SSE4_1;
  806. #elif defined(HAVE_SSE2)
  807. capfilter |= CPU_CAP_SSE | CPU_CAP_SSE2;
  808. #elif defined(HAVE_SSE)
  809. capfilter |= CPU_CAP_SSE;
  810. #endif
  811. #ifdef HAVE_NEON
  812. capfilter |= CPU_CAP_NEON;
  813. #endif
  814. if(ConfigValueStr(NULL, "disable-cpu-exts", &str))
  815. {
  816. if(strcasecmp(str, "all") == 0)
  817. capfilter = 0;
  818. else
  819. {
  820. size_t len;
  821. const char *next = str;
  822. do {
  823. str = next;
  824. while(isspace(str[0]))
  825. str++;
  826. next = strchr(str, ',');
  827. if(!str[0] || str[0] == ',')
  828. continue;
  829. len = (next ? ((size_t)(next-str)) : strlen(str));
  830. while(len > 0 && isspace(str[len-1]))
  831. len--;
  832. if(len == 3 && strncasecmp(str, "sse", len) == 0)
  833. capfilter &= ~CPU_CAP_SSE;
  834. else if(len == 4 && strncasecmp(str, "sse2", len) == 0)
  835. capfilter &= ~CPU_CAP_SSE2;
  836. else if(len == 6 && strncasecmp(str, "sse4.1", len) == 0)
  837. capfilter &= ~CPU_CAP_SSE4_1;
  838. else if(len == 4 && strncasecmp(str, "neon", len) == 0)
  839. capfilter &= ~CPU_CAP_NEON;
  840. else
  841. WARN("Invalid CPU extension \"%s\"\n", str);
  842. } while(next++);
  843. }
  844. }
  845. FillCPUCaps(capfilter);
  846. #ifdef _WIN32
  847. RTPrioLevel = 1;
  848. #else
  849. RTPrioLevel = 0;
  850. #endif
  851. ConfigValueInt(NULL, "rt-prio", &RTPrioLevel);
  852. if(ConfigValueStr(NULL, "resampler", &str))
  853. {
  854. if(strcasecmp(str, "point") == 0 || strcasecmp(str, "none") == 0)
  855. DefaultResampler = PointResampler;
  856. else if(strcasecmp(str, "linear") == 0)
  857. DefaultResampler = LinearResampler;
  858. else if(strcasecmp(str, "cubic") == 0)
  859. DefaultResampler = CubicResampler;
  860. else
  861. {
  862. char *end;
  863. n = strtol(str, &end, 0);
  864. if(*end == '\0' && (n == PointResampler || n == LinearResampler || n == CubicResampler))
  865. DefaultResampler = n;
  866. else
  867. WARN("Invalid resampler: %s\n", str);
  868. }
  869. }
  870. str = getenv("ALSOFT_TRAP_ERROR");
  871. if(str && (strcasecmp(str, "true") == 0 || strtol(str, NULL, 0) == 1))
  872. {
  873. TrapALError = AL_TRUE;
  874. TrapALCError = AL_TRUE;
  875. }
  876. else
  877. {
  878. str = getenv("ALSOFT_TRAP_AL_ERROR");
  879. if(str && (strcasecmp(str, "true") == 0 || strtol(str, NULL, 0) == 1))
  880. TrapALError = AL_TRUE;
  881. TrapALError = GetConfigValueBool(NULL, "trap-al-error", TrapALError);
  882. str = getenv("ALSOFT_TRAP_ALC_ERROR");
  883. if(str && (strcasecmp(str, "true") == 0 || strtol(str, NULL, 0) == 1))
  884. TrapALCError = ALC_TRUE;
  885. TrapALCError = GetConfigValueBool(NULL, "trap-alc-error", TrapALCError);
  886. }
  887. if(ConfigValueFloat("reverb", "boost", &valf))
  888. ReverbBoost *= powf(10.0f, valf / 20.0f);
  889. EmulateEAXReverb = GetConfigValueBool("reverb", "emulate-eax", AL_FALSE);
  890. if(((devs=getenv("ALSOFT_DRIVERS")) && devs[0]) ||
  891. ConfigValueStr(NULL, "drivers", &devs))
  892. {
  893. int n;
  894. size_t len;
  895. const char *next = devs;
  896. int endlist, delitem;
  897. i = 0;
  898. do {
  899. devs = next;
  900. while(isspace(devs[0]))
  901. devs++;
  902. next = strchr(devs, ',');
  903. delitem = (devs[0] == '-');
  904. if(devs[0] == '-') devs++;
  905. if(!devs[0] || devs[0] == ',')
  906. {
  907. endlist = 0;
  908. continue;
  909. }
  910. endlist = 1;
  911. len = (next ? ((size_t)(next-devs)) : strlen(devs));
  912. while(len > 0 && isspace(devs[len-1]))
  913. len--;
  914. for(n = i;BackendList[n].name;n++)
  915. {
  916. if(len == strlen(BackendList[n].name) &&
  917. strncmp(BackendList[n].name, devs, len) == 0)
  918. {
  919. if(delitem)
  920. {
  921. do {
  922. BackendList[n] = BackendList[n+1];
  923. ++n;
  924. } while(BackendList[n].name);
  925. }
  926. else
  927. {
  928. struct BackendInfo Bkp = BackendList[n];
  929. while(n > i)
  930. {
  931. BackendList[n] = BackendList[n-1];
  932. --n;
  933. }
  934. BackendList[n] = Bkp;
  935. i++;
  936. }
  937. break;
  938. }
  939. }
  940. } while(next++);
  941. if(endlist)
  942. {
  943. BackendList[i].name = NULL;
  944. BackendList[i].getFactory = NULL;
  945. BackendList[i].Init = NULL;
  946. BackendList[i].Deinit = NULL;
  947. BackendList[i].Probe = NULL;
  948. }
  949. }
  950. for(i = 0;(BackendList[i].Init || BackendList[i].getFactory) && (!PlaybackBackend.name || !CaptureBackend.name);i++)
  951. {
  952. if(BackendList[i].getFactory)
  953. {
  954. ALCbackendFactory *factory = BackendList[i].getFactory();
  955. if(!V0(factory,init)())
  956. {
  957. WARN("Failed to initialize backend \"%s\"\n", BackendList[i].name);
  958. continue;
  959. }
  960. TRACE("Initialized backend \"%s\"\n", BackendList[i].name);
  961. if(!PlaybackBackend.name && V(factory,querySupport)(ALCbackend_Playback))
  962. {
  963. PlaybackBackend = BackendList[i];
  964. TRACE("Added \"%s\" for playback\n", PlaybackBackend.name);
  965. }
  966. if(!CaptureBackend.name && V(factory,querySupport)(ALCbackend_Capture))
  967. {
  968. CaptureBackend = BackendList[i];
  969. TRACE("Added \"%s\" for capture\n", CaptureBackend.name);
  970. }
  971. continue;
  972. }
  973. if(!BackendList[i].Init(&BackendList[i].Funcs))
  974. {
  975. WARN("Failed to initialize backend \"%s\"\n", BackendList[i].name);
  976. continue;
  977. }
  978. TRACE("Initialized backend \"%s\"\n", BackendList[i].name);
  979. if(BackendList[i].Funcs.OpenPlayback && !PlaybackBackend.name)
  980. {
  981. PlaybackBackend = BackendList[i];
  982. TRACE("Added \"%s\" for playback\n", PlaybackBackend.name);
  983. }
  984. if(BackendList[i].Funcs.OpenCapture && !CaptureBackend.name)
  985. {
  986. CaptureBackend = BackendList[i];
  987. TRACE("Added \"%s\" for capture\n", CaptureBackend.name);
  988. }
  989. }
  990. {
  991. ALCbackendFactory *factory = ALCloopbackFactory_getFactory();
  992. V0(factory,init)();
  993. }
  994. if(ConfigValueStr(NULL, "excludefx", &str))
  995. {
  996. size_t len;
  997. const char *next = str;
  998. do {
  999. str = next;
  1000. next = strchr(str, ',');
  1001. if(!str[0] || next == str)
  1002. continue;
  1003. len = (next ? ((size_t)(next-str)) : strlen(str));
  1004. for(n = 0;EffectList[n].name;n++)
  1005. {
  1006. if(len == strlen(EffectList[n].name) &&
  1007. strncmp(EffectList[n].name, str, len) == 0)
  1008. DisabledEffects[EffectList[n].type] = AL_TRUE;
  1009. }
  1010. } while(next++);
  1011. }
  1012. InitEffectFactoryMap();
  1013. InitEffect(&DefaultEffect);
  1014. str = getenv("ALSOFT_DEFAULT_REVERB");
  1015. if((str && str[0]) || ConfigValueStr(NULL, "default-reverb", &str))
  1016. LoadReverbPreset(str, &DefaultEffect);
  1017. }
  1018. #define DO_INITCONFIG() alcall_once(&alc_config_once, alc_initconfig)
  1019. /************************************************
  1020. * Library deinitialization
  1021. ************************************************/
  1022. static void alc_cleanup(void)
  1023. {
  1024. ALCdevice *dev;
  1025. AL_STRING_DEINIT(alcAllDevicesList);
  1026. AL_STRING_DEINIT(alcCaptureDeviceList);
  1027. free(alcDefaultAllDevicesSpecifier);
  1028. alcDefaultAllDevicesSpecifier = NULL;
  1029. free(alcCaptureDefaultDeviceSpecifier);
  1030. alcCaptureDefaultDeviceSpecifier = NULL;
  1031. if((dev=ATOMIC_EXCHANGE(ALCdevice*, &DeviceList, NULL)) != NULL)
  1032. {
  1033. ALCuint num = 0;
  1034. do {
  1035. num++;
  1036. } while((dev=dev->next) != NULL);
  1037. ERR("%u device%s not closed\n", num, (num>1)?"s":"");
  1038. }
  1039. DeinitEffectFactoryMap();
  1040. }
  1041. static void alc_deinit_safe(void)
  1042. {
  1043. alc_cleanup();
  1044. FreeHrtfs();
  1045. FreeALConfig();
  1046. ThunkExit();
  1047. almtx_destroy(&ListLock);
  1048. altss_delete(LocalContext);
  1049. if(LogFile != stderr)
  1050. fclose(LogFile);
  1051. LogFile = NULL;
  1052. }
  1053. static void alc_deinit(void)
  1054. {
  1055. int i;
  1056. alc_cleanup();
  1057. memset(&PlaybackBackend, 0, sizeof(PlaybackBackend));
  1058. memset(&CaptureBackend, 0, sizeof(CaptureBackend));
  1059. for(i = 0;BackendList[i].Deinit || BackendList[i].getFactory;i++)
  1060. {
  1061. if(!BackendList[i].getFactory)
  1062. BackendList[i].Deinit();
  1063. else
  1064. {
  1065. ALCbackendFactory *factory = BackendList[i].getFactory();
  1066. V0(factory,deinit)();
  1067. }
  1068. }
  1069. {
  1070. ALCbackendFactory *factory = ALCloopbackFactory_getFactory();
  1071. V0(factory,deinit)();
  1072. }
  1073. alc_deinit_safe();
  1074. }
  1075. /************************************************
  1076. * Device enumeration
  1077. ************************************************/
  1078. static void ProbeDevices(al_string *list, enum DevProbe type)
  1079. {
  1080. DO_INITCONFIG();
  1081. LockLists();
  1082. al_string_clear(list);
  1083. if(type == ALL_DEVICE_PROBE && (PlaybackBackend.Probe || PlaybackBackend.getFactory))
  1084. {
  1085. if(!PlaybackBackend.getFactory)
  1086. PlaybackBackend.Probe(type);
  1087. else
  1088. {
  1089. ALCbackendFactory *factory = PlaybackBackend.getFactory();
  1090. V(factory,probe)(type);
  1091. }
  1092. }
  1093. else if(type == CAPTURE_DEVICE_PROBE && (CaptureBackend.Probe || CaptureBackend.getFactory))
  1094. {
  1095. if(!CaptureBackend.getFactory)
  1096. CaptureBackend.Probe(type);
  1097. else
  1098. {
  1099. ALCbackendFactory *factory = CaptureBackend.getFactory();
  1100. V(factory,probe)(type);
  1101. }
  1102. }
  1103. UnlockLists();
  1104. }
  1105. static void ProbeAllDevicesList(void)
  1106. { ProbeDevices(&alcAllDevicesList, ALL_DEVICE_PROBE); }
  1107. static void ProbeCaptureDeviceList(void)
  1108. { ProbeDevices(&alcCaptureDeviceList, CAPTURE_DEVICE_PROBE); }
  1109. static void AppendDevice(const ALCchar *name, al_string *devnames)
  1110. {
  1111. size_t len = strlen(name);
  1112. if(len > 0)
  1113. {
  1114. al_string_append_range(devnames, name, name+len);
  1115. al_string_append_char(devnames, '\0');
  1116. }
  1117. }
  1118. void AppendAllDevicesList(const ALCchar *name)
  1119. { AppendDevice(name, &alcAllDevicesList); }
  1120. void AppendCaptureDeviceList(const ALCchar *name)
  1121. { AppendDevice(name, &alcCaptureDeviceList); }
  1122. /************************************************
  1123. * Device format information
  1124. ************************************************/
  1125. const ALCchar *DevFmtTypeString(enum DevFmtType type)
  1126. {
  1127. switch(type)
  1128. {
  1129. case DevFmtByte: return "Signed Byte";
  1130. case DevFmtUByte: return "Unsigned Byte";
  1131. case DevFmtShort: return "Signed Short";
  1132. case DevFmtUShort: return "Unsigned Short";
  1133. case DevFmtInt: return "Signed Int";
  1134. case DevFmtUInt: return "Unsigned Int";
  1135. case DevFmtFloat: return "Float";
  1136. }
  1137. return "(unknown type)";
  1138. }
  1139. const ALCchar *DevFmtChannelsString(enum DevFmtChannels chans)
  1140. {
  1141. switch(chans)
  1142. {
  1143. case DevFmtMono: return "Mono";
  1144. case DevFmtStereo: return "Stereo";
  1145. case DevFmtQuad: return "Quadraphonic";
  1146. case DevFmtX51: return "5.1 Surround";
  1147. case DevFmtX51Side: return "5.1 Side";
  1148. case DevFmtX61: return "6.1 Surround";
  1149. case DevFmtX71: return "7.1 Surround";
  1150. }
  1151. return "(unknown channels)";
  1152. }
  1153. extern inline ALuint FrameSizeFromDevFmt(enum DevFmtChannels chans, enum DevFmtType type);
  1154. ALuint BytesFromDevFmt(enum DevFmtType type)
  1155. {
  1156. switch(type)
  1157. {
  1158. case DevFmtByte: return sizeof(ALbyte);
  1159. case DevFmtUByte: return sizeof(ALubyte);
  1160. case DevFmtShort: return sizeof(ALshort);
  1161. case DevFmtUShort: return sizeof(ALushort);
  1162. case DevFmtInt: return sizeof(ALint);
  1163. case DevFmtUInt: return sizeof(ALuint);
  1164. case DevFmtFloat: return sizeof(ALfloat);
  1165. }
  1166. return 0;
  1167. }
  1168. ALuint ChannelsFromDevFmt(enum DevFmtChannels chans)
  1169. {
  1170. switch(chans)
  1171. {
  1172. case DevFmtMono: return 1;
  1173. case DevFmtStereo: return 2;
  1174. case DevFmtQuad: return 4;
  1175. case DevFmtX51: return 6;
  1176. case DevFmtX51Side: return 6;
  1177. case DevFmtX61: return 7;
  1178. case DevFmtX71: return 8;
  1179. }
  1180. return 0;
  1181. }
  1182. DECL_CONST static ALboolean DecomposeDevFormat(ALenum format,
  1183. enum DevFmtChannels *chans, enum DevFmtType *type)
  1184. {
  1185. static const struct {
  1186. ALenum format;
  1187. enum DevFmtChannels channels;
  1188. enum DevFmtType type;
  1189. } list[] = {
  1190. { AL_FORMAT_MONO8, DevFmtMono, DevFmtUByte },
  1191. { AL_FORMAT_MONO16, DevFmtMono, DevFmtShort },
  1192. { AL_FORMAT_MONO_FLOAT32, DevFmtMono, DevFmtFloat },
  1193. { AL_FORMAT_STEREO8, DevFmtStereo, DevFmtUByte },
  1194. { AL_FORMAT_STEREO16, DevFmtStereo, DevFmtShort },
  1195. { AL_FORMAT_STEREO_FLOAT32, DevFmtStereo, DevFmtFloat },
  1196. { AL_FORMAT_QUAD8, DevFmtQuad, DevFmtUByte },
  1197. { AL_FORMAT_QUAD16, DevFmtQuad, DevFmtShort },
  1198. { AL_FORMAT_QUAD32, DevFmtQuad, DevFmtFloat },
  1199. { AL_FORMAT_51CHN8, DevFmtX51, DevFmtUByte },
  1200. { AL_FORMAT_51CHN16, DevFmtX51, DevFmtShort },
  1201. { AL_FORMAT_51CHN32, DevFmtX51, DevFmtFloat },
  1202. { AL_FORMAT_61CHN8, DevFmtX61, DevFmtUByte },
  1203. { AL_FORMAT_61CHN16, DevFmtX61, DevFmtShort },
  1204. { AL_FORMAT_61CHN32, DevFmtX61, DevFmtFloat },
  1205. { AL_FORMAT_71CHN8, DevFmtX71, DevFmtUByte },
  1206. { AL_FORMAT_71CHN16, DevFmtX71, DevFmtShort },
  1207. { AL_FORMAT_71CHN32, DevFmtX71, DevFmtFloat },
  1208. };
  1209. ALuint i;
  1210. for(i = 0;i < COUNTOF(list);i++)
  1211. {
  1212. if(list[i].format == format)
  1213. {
  1214. *chans = list[i].channels;
  1215. *type = list[i].type;
  1216. return AL_TRUE;
  1217. }
  1218. }
  1219. return AL_FALSE;
  1220. }
  1221. DECL_CONST static ALCboolean IsValidALCType(ALCenum type)
  1222. {
  1223. switch(type)
  1224. {
  1225. case ALC_BYTE_SOFT:
  1226. case ALC_UNSIGNED_BYTE_SOFT:
  1227. case ALC_SHORT_SOFT:
  1228. case ALC_UNSIGNED_SHORT_SOFT:
  1229. case ALC_INT_SOFT:
  1230. case ALC_UNSIGNED_INT_SOFT:
  1231. case ALC_FLOAT_SOFT:
  1232. return ALC_TRUE;
  1233. }
  1234. return ALC_FALSE;
  1235. }
  1236. DECL_CONST static ALCboolean IsValidALCChannels(ALCenum channels)
  1237. {
  1238. switch(channels)
  1239. {
  1240. case ALC_MONO_SOFT:
  1241. case ALC_STEREO_SOFT:
  1242. case ALC_QUAD_SOFT:
  1243. case ALC_5POINT1_SOFT:
  1244. case ALC_6POINT1_SOFT:
  1245. case ALC_7POINT1_SOFT:
  1246. return ALC_TRUE;
  1247. }
  1248. return ALC_FALSE;
  1249. }
  1250. /************************************************
  1251. * Miscellaneous ALC helpers
  1252. ************************************************/
  1253. extern inline void LockContext(ALCcontext *context);
  1254. extern inline void UnlockContext(ALCcontext *context);
  1255. ALint64 ALCdevice_GetLatencyDefault(ALCdevice *UNUSED(device))
  1256. {
  1257. return 0;
  1258. }
  1259. ALint64 ALCdevice_GetLatency(ALCdevice *device)
  1260. {
  1261. return V0(device->Backend,getLatency)();
  1262. }
  1263. void ALCdevice_Lock(ALCdevice *device)
  1264. {
  1265. V0(device->Backend,lock)();
  1266. }
  1267. void ALCdevice_Unlock(ALCdevice *device)
  1268. {
  1269. V0(device->Backend,unlock)();
  1270. }
  1271. /* SetDefaultWFXChannelOrder
  1272. *
  1273. * Sets the default channel order used by WaveFormatEx.
  1274. */
  1275. void SetDefaultWFXChannelOrder(ALCdevice *device)
  1276. {
  1277. ALuint i;
  1278. for(i = 0;i < MaxChannels;i++)
  1279. device->ChannelOffsets[i] = INVALID_OFFSET;
  1280. switch(device->FmtChans)
  1281. {
  1282. case DevFmtMono: device->ChannelOffsets[FrontCenter] = 0;
  1283. break;
  1284. case DevFmtStereo: device->ChannelOffsets[FrontLeft] = 0;
  1285. device->ChannelOffsets[FrontRight] = 1;
  1286. break;
  1287. case DevFmtQuad: device->ChannelOffsets[FrontLeft] = 0;
  1288. device->ChannelOffsets[FrontRight] = 1;
  1289. device->ChannelOffsets[BackLeft] = 2;
  1290. device->ChannelOffsets[BackRight] = 3;
  1291. break;
  1292. case DevFmtX51: device->ChannelOffsets[FrontLeft] = 0;
  1293. device->ChannelOffsets[FrontRight] = 1;
  1294. device->ChannelOffsets[FrontCenter] = 2;
  1295. device->ChannelOffsets[LFE] = 3;
  1296. device->ChannelOffsets[BackLeft] = 4;
  1297. device->ChannelOffsets[BackRight] = 5;
  1298. break;
  1299. case DevFmtX51Side: device->ChannelOffsets[FrontLeft] = 0;
  1300. device->ChannelOffsets[FrontRight] = 1;
  1301. device->ChannelOffsets[FrontCenter] = 2;
  1302. device->ChannelOffsets[LFE] = 3;
  1303. device->ChannelOffsets[SideLeft] = 4;
  1304. device->ChannelOffsets[SideRight] = 5;
  1305. break;
  1306. case DevFmtX61: device->ChannelOffsets[FrontLeft] = 0;
  1307. device->ChannelOffsets[FrontRight] = 1;
  1308. device->ChannelOffsets[FrontCenter] = 2;
  1309. device->ChannelOffsets[LFE] = 3;
  1310. device->ChannelOffsets[BackCenter] = 4;
  1311. device->ChannelOffsets[SideLeft] = 5;
  1312. device->ChannelOffsets[SideRight] = 6;
  1313. break;
  1314. case DevFmtX71: device->ChannelOffsets[FrontLeft] = 0;
  1315. device->ChannelOffsets[FrontRight] = 1;
  1316. device->ChannelOffsets[FrontCenter] = 2;
  1317. device->ChannelOffsets[LFE] = 3;
  1318. device->ChannelOffsets[BackLeft] = 4;
  1319. device->ChannelOffsets[BackRight] = 5;
  1320. device->ChannelOffsets[SideLeft] = 6;
  1321. device->ChannelOffsets[SideRight] = 7;
  1322. break;
  1323. }
  1324. }
  1325. /* SetDefaultChannelOrder
  1326. *
  1327. * Sets the default channel order used by most non-WaveFormatEx-based APIs.
  1328. */
  1329. void SetDefaultChannelOrder(ALCdevice *device)
  1330. {
  1331. ALuint i;
  1332. for(i = 0;i < MaxChannels;i++)
  1333. device->ChannelOffsets[i] = INVALID_OFFSET;
  1334. switch(device->FmtChans)
  1335. {
  1336. case DevFmtX51: device->ChannelOffsets[FrontLeft] = 0;
  1337. device->ChannelOffsets[FrontRight] = 1;
  1338. device->ChannelOffsets[BackLeft] = 2;
  1339. device->ChannelOffsets[BackRight] = 3;
  1340. device->ChannelOffsets[FrontCenter] = 4;
  1341. device->ChannelOffsets[LFE] = 5;
  1342. return;
  1343. case DevFmtX71: device->ChannelOffsets[FrontLeft] = 0;
  1344. device->ChannelOffsets[FrontRight] = 1;
  1345. device->ChannelOffsets[BackLeft] = 2;
  1346. device->ChannelOffsets[BackRight] = 3;
  1347. device->ChannelOffsets[FrontCenter] = 4;
  1348. device->ChannelOffsets[LFE] = 5;
  1349. device->ChannelOffsets[SideLeft] = 6;
  1350. device->ChannelOffsets[SideRight] = 7;
  1351. return;
  1352. /* Same as WFX order */
  1353. case DevFmtMono:
  1354. case DevFmtStereo:
  1355. case DevFmtQuad:
  1356. case DevFmtX51Side:
  1357. case DevFmtX61:
  1358. break;
  1359. }
  1360. SetDefaultWFXChannelOrder(device);
  1361. }
  1362. /* alcSetError
  1363. *
  1364. * Stores the latest ALC device error
  1365. */
  1366. static void alcSetError(ALCdevice *device, ALCenum errorCode)
  1367. {
  1368. if(TrapALCError)
  1369. {
  1370. #ifdef _WIN32
  1371. /* DebugBreak() will cause an exception if there is no debugger */
  1372. if(IsDebuggerPresent())
  1373. DebugBreak();
  1374. #elif defined(SIGTRAP)
  1375. raise(SIGTRAP);
  1376. #endif
  1377. }
  1378. if(device)
  1379. ATOMIC_STORE(&device->LastError, errorCode);
  1380. else
  1381. ATOMIC_STORE(&LastNullDeviceError, errorCode);
  1382. }
  1383. /* UpdateClockBase
  1384. *
  1385. * Updates the device's base clock time with however many samples have been
  1386. * done. This is used so frequency changes on the device don't cause the time
  1387. * to jump forward or back.
  1388. */
  1389. static inline void UpdateClockBase(ALCdevice *device)
  1390. {
  1391. device->ClockBase += device->SamplesDone * DEVICE_CLOCK_RES / device->Frequency;
  1392. device->SamplesDone = 0;
  1393. }
  1394. /* UpdateDeviceParams
  1395. *
  1396. * Updates device parameters according to the attribute list (caller is
  1397. * responsible for holding the list lock).
  1398. */
  1399. static ALCenum UpdateDeviceParams(ALCdevice *device, const ALCint *attrList)
  1400. {
  1401. ALCcontext *context;
  1402. enum DevFmtChannels oldChans;
  1403. enum DevFmtType oldType;
  1404. ALCuint oldFreq;
  1405. FPUCtl oldMode;
  1406. // Check for attributes
  1407. if(device->Type == Loopback)
  1408. {
  1409. enum {
  1410. GotFreq = 1<<0,
  1411. GotChans = 1<<1,
  1412. GotType = 1<<2,
  1413. GotAll = GotFreq|GotChans|GotType
  1414. };
  1415. ALCuint freq, numMono, numStereo, numSends, flags;
  1416. enum DevFmtChannels schans;
  1417. enum DevFmtType stype;
  1418. ALCuint attrIdx = 0;
  1419. ALCint gotFmt = 0;
  1420. if(!attrList)
  1421. {
  1422. WARN("Missing attributes for loopback device\n");
  1423. return ALC_INVALID_VALUE;
  1424. }
  1425. numMono = device->NumMonoSources;
  1426. numStereo = device->NumStereoSources;
  1427. numSends = device->NumAuxSends;
  1428. schans = device->FmtChans;
  1429. stype = device->FmtType;
  1430. freq = device->Frequency;
  1431. flags = device->Flags;
  1432. while(attrList[attrIdx])
  1433. {
  1434. if(attrList[attrIdx] == ALC_FORMAT_CHANNELS_SOFT)
  1435. {
  1436. ALCint val = attrList[attrIdx + 1];
  1437. if(!IsValidALCChannels(val) || !ChannelsFromDevFmt(val))
  1438. return ALC_INVALID_VALUE;
  1439. schans = val;
  1440. gotFmt |= GotChans;
  1441. }
  1442. if(attrList[attrIdx] == ALC_FORMAT_TYPE_SOFT)
  1443. {
  1444. ALCint val = attrList[attrIdx + 1];
  1445. if(!IsValidALCType(val) || !BytesFromDevFmt(val))
  1446. return ALC_INVALID_VALUE;
  1447. stype = val;
  1448. gotFmt |= GotType;
  1449. }
  1450. if(attrList[attrIdx] == ALC_FREQUENCY)
  1451. {
  1452. freq = attrList[attrIdx + 1];
  1453. if(freq < MIN_OUTPUT_RATE)
  1454. return ALC_INVALID_VALUE;
  1455. gotFmt |= GotFreq;
  1456. }
  1457. if(attrList[attrIdx] == ALC_STEREO_SOURCES)
  1458. {
  1459. numStereo = attrList[attrIdx + 1];
  1460. if(numStereo > device->MaxNoOfSources)
  1461. numStereo = device->MaxNoOfSources;
  1462. numMono = device->MaxNoOfSources - numStereo;
  1463. }
  1464. if(attrList[attrIdx] == ALC_MAX_AUXILIARY_SENDS)
  1465. numSends = attrList[attrIdx + 1];
  1466. if(attrList[attrIdx] == ALC_HRTF_SOFT)
  1467. {
  1468. if(attrList[attrIdx + 1] != ALC_FALSE)
  1469. flags |= DEVICE_HRTF_REQUEST;
  1470. else
  1471. flags &= ~DEVICE_HRTF_REQUEST;
  1472. }
  1473. attrIdx += 2;
  1474. }
  1475. if(gotFmt != GotAll)
  1476. {
  1477. WARN("Missing format for loopback device\n");
  1478. return ALC_INVALID_VALUE;
  1479. }
  1480. ConfigValueUInt(NULL, "sends", &numSends);
  1481. numSends = minu(MAX_SENDS, numSends);
  1482. if((device->Flags&DEVICE_RUNNING))
  1483. V0(device->Backend,stop)();
  1484. device->Flags = (flags & ~DEVICE_RUNNING);
  1485. UpdateClockBase(device);
  1486. device->Frequency = freq;
  1487. device->FmtChans = schans;
  1488. device->FmtType = stype;
  1489. device->NumMonoSources = numMono;
  1490. device->NumStereoSources = numStereo;
  1491. device->NumAuxSends = numSends;
  1492. }
  1493. else if(attrList && attrList[0])
  1494. {
  1495. ALCuint freq, numMono, numStereo, numSends;
  1496. ALCuint attrIdx = 0;
  1497. /* If a context is already running on the device, stop playback so the
  1498. * device attributes can be updated. */
  1499. if((device->Flags&DEVICE_RUNNING))
  1500. V0(device->Backend,stop)();
  1501. device->Flags &= ~DEVICE_RUNNING;
  1502. freq = device->Frequency;
  1503. numMono = device->NumMonoSources;
  1504. numStereo = device->NumStereoSources;
  1505. numSends = device->NumAuxSends;
  1506. while(attrList[attrIdx])
  1507. {
  1508. if(attrList[attrIdx] == ALC_FREQUENCY)
  1509. {
  1510. freq = attrList[attrIdx + 1];
  1511. device->Flags |= DEVICE_FREQUENCY_REQUEST;
  1512. }
  1513. if(attrList[attrIdx] == ALC_STEREO_SOURCES)