jack.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607
  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 <stdlib.h>
  22. #include <stdio.h>
  23. #include <memory.h>
  24. #include "alMain.h"
  25. #include "alu.h"
  26. #include "alconfig.h"
  27. #include "ringbuffer.h"
  28. #include "threads.h"
  29. #include "compat.h"
  30. #include "backends/base.h"
  31. #include <jack/jack.h>
  32. #include <jack/ringbuffer.h>
  33. static const ALCchar jackDevice[] = "JACK Default";
  34. #ifdef HAVE_DYNLOAD
  35. #define JACK_FUNCS(MAGIC) \
  36. MAGIC(jack_client_open); \
  37. MAGIC(jack_client_close); \
  38. MAGIC(jack_client_name_size); \
  39. MAGIC(jack_get_client_name); \
  40. MAGIC(jack_connect); \
  41. MAGIC(jack_activate); \
  42. MAGIC(jack_deactivate); \
  43. MAGIC(jack_port_register); \
  44. MAGIC(jack_port_unregister); \
  45. MAGIC(jack_port_get_buffer); \
  46. MAGIC(jack_port_name); \
  47. MAGIC(jack_get_ports); \
  48. MAGIC(jack_free); \
  49. MAGIC(jack_get_sample_rate); \
  50. MAGIC(jack_set_error_function); \
  51. MAGIC(jack_set_process_callback); \
  52. MAGIC(jack_set_buffer_size_callback); \
  53. MAGIC(jack_set_buffer_size); \
  54. MAGIC(jack_get_buffer_size);
  55. static void *jack_handle;
  56. #define MAKE_FUNC(f) static __typeof(f) * p##f
  57. JACK_FUNCS(MAKE_FUNC);
  58. static __typeof(jack_error_callback) * pjack_error_callback;
  59. #undef MAKE_FUNC
  60. #define jack_client_open pjack_client_open
  61. #define jack_client_close pjack_client_close
  62. #define jack_client_name_size pjack_client_name_size
  63. #define jack_get_client_name pjack_get_client_name
  64. #define jack_connect pjack_connect
  65. #define jack_activate pjack_activate
  66. #define jack_deactivate pjack_deactivate
  67. #define jack_port_register pjack_port_register
  68. #define jack_port_unregister pjack_port_unregister
  69. #define jack_port_get_buffer pjack_port_get_buffer
  70. #define jack_port_name pjack_port_name
  71. #define jack_get_ports pjack_get_ports
  72. #define jack_free pjack_free
  73. #define jack_get_sample_rate pjack_get_sample_rate
  74. #define jack_set_error_function pjack_set_error_function
  75. #define jack_set_process_callback pjack_set_process_callback
  76. #define jack_set_buffer_size_callback pjack_set_buffer_size_callback
  77. #define jack_set_buffer_size pjack_set_buffer_size
  78. #define jack_get_buffer_size pjack_get_buffer_size
  79. #define jack_error_callback (*pjack_error_callback)
  80. #endif
  81. static jack_options_t ClientOptions = JackNullOption;
  82. static ALCboolean jack_load(void)
  83. {
  84. ALCboolean error = ALC_FALSE;
  85. #ifdef HAVE_DYNLOAD
  86. if(!jack_handle)
  87. {
  88. al_string missing_funcs = AL_STRING_INIT_STATIC();
  89. #ifdef _WIN32
  90. #define JACKLIB "libjack.dll"
  91. #else
  92. #define JACKLIB "libjack.so.0"
  93. #endif
  94. jack_handle = LoadLib(JACKLIB);
  95. if(!jack_handle)
  96. {
  97. WARN("Failed to load %s\n", JACKLIB);
  98. return ALC_FALSE;
  99. }
  100. error = ALC_FALSE;
  101. #define LOAD_FUNC(f) do { \
  102. p##f = GetSymbol(jack_handle, #f); \
  103. if(p##f == NULL) { \
  104. error = ALC_TRUE; \
  105. alstr_append_cstr(&missing_funcs, "\n" #f); \
  106. } \
  107. } while(0)
  108. JACK_FUNCS(LOAD_FUNC);
  109. #undef LOAD_FUNC
  110. /* Optional symbols. These don't exist in all versions of JACK. */
  111. #define LOAD_SYM(f) p##f = GetSymbol(jack_handle, #f)
  112. LOAD_SYM(jack_error_callback);
  113. #undef LOAD_SYM
  114. if(error)
  115. {
  116. WARN("Missing expected functions:%s\n", alstr_get_cstr(missing_funcs));
  117. CloseLib(jack_handle);
  118. jack_handle = NULL;
  119. }
  120. alstr_reset(&missing_funcs);
  121. }
  122. #endif
  123. return !error;
  124. }
  125. typedef struct ALCjackPlayback {
  126. DERIVE_FROM_TYPE(ALCbackend);
  127. jack_client_t *Client;
  128. jack_port_t *Port[MAX_OUTPUT_CHANNELS];
  129. ll_ringbuffer_t *Ring;
  130. alsem_t Sem;
  131. ATOMIC(ALenum) killNow;
  132. althrd_t thread;
  133. } ALCjackPlayback;
  134. static int ALCjackPlayback_bufferSizeNotify(jack_nframes_t numframes, void *arg);
  135. static int ALCjackPlayback_process(jack_nframes_t numframes, void *arg);
  136. static int ALCjackPlayback_mixerProc(void *arg);
  137. static void ALCjackPlayback_Construct(ALCjackPlayback *self, ALCdevice *device);
  138. static void ALCjackPlayback_Destruct(ALCjackPlayback *self);
  139. static ALCenum ALCjackPlayback_open(ALCjackPlayback *self, const ALCchar *name);
  140. static ALCboolean ALCjackPlayback_reset(ALCjackPlayback *self);
  141. static ALCboolean ALCjackPlayback_start(ALCjackPlayback *self);
  142. static void ALCjackPlayback_stop(ALCjackPlayback *self);
  143. static DECLARE_FORWARD2(ALCjackPlayback, ALCbackend, ALCenum, captureSamples, void*, ALCuint)
  144. static DECLARE_FORWARD(ALCjackPlayback, ALCbackend, ALCuint, availableSamples)
  145. static ClockLatency ALCjackPlayback_getClockLatency(ALCjackPlayback *self);
  146. static DECLARE_FORWARD(ALCjackPlayback, ALCbackend, void, lock)
  147. static DECLARE_FORWARD(ALCjackPlayback, ALCbackend, void, unlock)
  148. DECLARE_DEFAULT_ALLOCATORS(ALCjackPlayback)
  149. DEFINE_ALCBACKEND_VTABLE(ALCjackPlayback);
  150. static void ALCjackPlayback_Construct(ALCjackPlayback *self, ALCdevice *device)
  151. {
  152. ALuint i;
  153. ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device);
  154. SET_VTABLE2(ALCjackPlayback, ALCbackend, self);
  155. alsem_init(&self->Sem, 0);
  156. self->Client = NULL;
  157. for(i = 0;i < MAX_OUTPUT_CHANNELS;i++)
  158. self->Port[i] = NULL;
  159. self->Ring = NULL;
  160. ATOMIC_INIT(&self->killNow, AL_TRUE);
  161. }
  162. static void ALCjackPlayback_Destruct(ALCjackPlayback *self)
  163. {
  164. ALuint i;
  165. if(self->Client)
  166. {
  167. for(i = 0;i < MAX_OUTPUT_CHANNELS;i++)
  168. {
  169. if(self->Port[i])
  170. jack_port_unregister(self->Client, self->Port[i]);
  171. self->Port[i] = NULL;
  172. }
  173. jack_client_close(self->Client);
  174. self->Client = NULL;
  175. }
  176. alsem_destroy(&self->Sem);
  177. ALCbackend_Destruct(STATIC_CAST(ALCbackend, self));
  178. }
  179. static int ALCjackPlayback_bufferSizeNotify(jack_nframes_t numframes, void *arg)
  180. {
  181. ALCjackPlayback *self = arg;
  182. ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice;
  183. ALuint bufsize;
  184. ALCjackPlayback_lock(self);
  185. device->UpdateSize = numframes;
  186. device->NumUpdates = 2;
  187. bufsize = device->UpdateSize;
  188. if(ConfigValueUInt(alstr_get_cstr(device->DeviceName), "jack", "buffer-size", &bufsize))
  189. bufsize = maxu(NextPowerOf2(bufsize), device->UpdateSize);
  190. device->NumUpdates = (bufsize+device->UpdateSize) / device->UpdateSize;
  191. TRACE("%u update size x%u\n", device->UpdateSize, device->NumUpdates);
  192. ll_ringbuffer_free(self->Ring);
  193. self->Ring = ll_ringbuffer_create(bufsize,
  194. FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder),
  195. true
  196. );
  197. if(!self->Ring)
  198. {
  199. ERR("Failed to reallocate ringbuffer\n");
  200. aluHandleDisconnect(device, "Failed to reallocate %u-sample buffer", bufsize);
  201. }
  202. ALCjackPlayback_unlock(self);
  203. return 0;
  204. }
  205. static int ALCjackPlayback_process(jack_nframes_t numframes, void *arg)
  206. {
  207. ALCjackPlayback *self = arg;
  208. jack_default_audio_sample_t *out[MAX_OUTPUT_CHANNELS];
  209. ll_ringbuffer_data_t data[2];
  210. jack_nframes_t total = 0;
  211. jack_nframes_t todo;
  212. ALsizei i, c, numchans;
  213. ll_ringbuffer_get_read_vector(self->Ring, data);
  214. for(c = 0;c < MAX_OUTPUT_CHANNELS && self->Port[c];c++)
  215. out[c] = jack_port_get_buffer(self->Port[c], numframes);
  216. numchans = c;
  217. todo = minu(numframes, data[0].len);
  218. for(c = 0;c < numchans;c++)
  219. {
  220. const ALfloat *restrict in = ((ALfloat*)data[0].buf) + c;
  221. for(i = 0;(jack_nframes_t)i < todo;i++)
  222. out[c][i] = in[i*numchans];
  223. out[c] += todo;
  224. }
  225. total += todo;
  226. todo = minu(numframes-total, data[1].len);
  227. if(todo > 0)
  228. {
  229. for(c = 0;c < numchans;c++)
  230. {
  231. const ALfloat *restrict in = ((ALfloat*)data[1].buf) + c;
  232. for(i = 0;(jack_nframes_t)i < todo;i++)
  233. out[c][i] = in[i*numchans];
  234. out[c] += todo;
  235. }
  236. total += todo;
  237. }
  238. ll_ringbuffer_read_advance(self->Ring, total);
  239. alsem_post(&self->Sem);
  240. if(numframes > total)
  241. {
  242. todo = numframes-total;
  243. for(c = 0;c < numchans;c++)
  244. {
  245. for(i = 0;(jack_nframes_t)i < todo;i++)
  246. out[c][i] = 0.0f;
  247. }
  248. }
  249. return 0;
  250. }
  251. static int ALCjackPlayback_mixerProc(void *arg)
  252. {
  253. ALCjackPlayback *self = arg;
  254. ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice;
  255. ll_ringbuffer_data_t data[2];
  256. SetRTPriority();
  257. althrd_setname(althrd_current(), MIXER_THREAD_NAME);
  258. ALCjackPlayback_lock(self);
  259. while(!ATOMIC_LOAD(&self->killNow, almemory_order_acquire) &&
  260. ATOMIC_LOAD(&device->Connected, almemory_order_acquire))
  261. {
  262. ALuint todo, len1, len2;
  263. if(ll_ringbuffer_write_space(self->Ring) < device->UpdateSize)
  264. {
  265. ALCjackPlayback_unlock(self);
  266. alsem_wait(&self->Sem);
  267. ALCjackPlayback_lock(self);
  268. continue;
  269. }
  270. ll_ringbuffer_get_write_vector(self->Ring, data);
  271. todo = data[0].len + data[1].len;
  272. todo -= todo%device->UpdateSize;
  273. len1 = minu(data[0].len, todo);
  274. len2 = minu(data[1].len, todo-len1);
  275. aluMixData(device, data[0].buf, len1);
  276. if(len2 > 0)
  277. aluMixData(device, data[1].buf, len2);
  278. ll_ringbuffer_write_advance(self->Ring, todo);
  279. }
  280. ALCjackPlayback_unlock(self);
  281. return 0;
  282. }
  283. static ALCenum ALCjackPlayback_open(ALCjackPlayback *self, const ALCchar *name)
  284. {
  285. ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice;
  286. const char *client_name = "alsoft";
  287. jack_status_t status;
  288. if(!name)
  289. name = jackDevice;
  290. else if(strcmp(name, jackDevice) != 0)
  291. return ALC_INVALID_VALUE;
  292. self->Client = jack_client_open(client_name, ClientOptions, &status, NULL);
  293. if(self->Client == NULL)
  294. {
  295. ERR("jack_client_open() failed, status = 0x%02x\n", status);
  296. return ALC_INVALID_VALUE;
  297. }
  298. if((status&JackServerStarted))
  299. TRACE("JACK server started\n");
  300. if((status&JackNameNotUnique))
  301. {
  302. client_name = jack_get_client_name(self->Client);
  303. TRACE("Client name not unique, got `%s' instead\n", client_name);
  304. }
  305. jack_set_process_callback(self->Client, ALCjackPlayback_process, self);
  306. jack_set_buffer_size_callback(self->Client, ALCjackPlayback_bufferSizeNotify, self);
  307. alstr_copy_cstr(&device->DeviceName, name);
  308. return ALC_NO_ERROR;
  309. }
  310. static ALCboolean ALCjackPlayback_reset(ALCjackPlayback *self)
  311. {
  312. ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice;
  313. ALsizei numchans, i;
  314. ALuint bufsize;
  315. for(i = 0;i < MAX_OUTPUT_CHANNELS;i++)
  316. {
  317. if(self->Port[i])
  318. jack_port_unregister(self->Client, self->Port[i]);
  319. self->Port[i] = NULL;
  320. }
  321. /* Ignore the requested buffer metrics and just keep one JACK-sized buffer
  322. * ready for when requested.
  323. */
  324. device->Frequency = jack_get_sample_rate(self->Client);
  325. device->UpdateSize = jack_get_buffer_size(self->Client);
  326. device->NumUpdates = 2;
  327. bufsize = device->UpdateSize;
  328. if(ConfigValueUInt(alstr_get_cstr(device->DeviceName), "jack", "buffer-size", &bufsize))
  329. bufsize = maxu(NextPowerOf2(bufsize), device->UpdateSize);
  330. device->NumUpdates = (bufsize+device->UpdateSize) / device->UpdateSize;
  331. /* Force 32-bit float output. */
  332. device->FmtType = DevFmtFloat;
  333. numchans = ChannelsFromDevFmt(device->FmtChans, device->AmbiOrder);
  334. for(i = 0;i < numchans;i++)
  335. {
  336. char name[64];
  337. snprintf(name, sizeof(name), "channel_%d", i+1);
  338. self->Port[i] = jack_port_register(self->Client, name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
  339. if(self->Port[i] == NULL)
  340. {
  341. ERR("Not enough JACK ports available for %s output\n", DevFmtChannelsString(device->FmtChans));
  342. if(i == 0) return ALC_FALSE;
  343. break;
  344. }
  345. }
  346. if(i < numchans)
  347. {
  348. if(i == 1)
  349. device->FmtChans = DevFmtMono;
  350. else
  351. {
  352. for(--i;i >= 2;i--)
  353. {
  354. jack_port_unregister(self->Client, self->Port[i]);
  355. self->Port[i] = NULL;
  356. }
  357. device->FmtChans = DevFmtStereo;
  358. }
  359. }
  360. ll_ringbuffer_free(self->Ring);
  361. self->Ring = ll_ringbuffer_create(bufsize,
  362. FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder),
  363. true
  364. );
  365. if(!self->Ring)
  366. {
  367. ERR("Failed to allocate ringbuffer\n");
  368. return ALC_FALSE;
  369. }
  370. SetDefaultChannelOrder(device);
  371. return ALC_TRUE;
  372. }
  373. static ALCboolean ALCjackPlayback_start(ALCjackPlayback *self)
  374. {
  375. const char **ports;
  376. ALsizei i;
  377. if(jack_activate(self->Client))
  378. {
  379. ERR("Failed to activate client\n");
  380. return ALC_FALSE;
  381. }
  382. ports = jack_get_ports(self->Client, NULL, NULL, JackPortIsPhysical|JackPortIsInput);
  383. if(ports == NULL)
  384. {
  385. ERR("No physical playback ports found\n");
  386. jack_deactivate(self->Client);
  387. return ALC_FALSE;
  388. }
  389. for(i = 0;i < MAX_OUTPUT_CHANNELS && self->Port[i];i++)
  390. {
  391. if(!ports[i])
  392. {
  393. ERR("No physical playback port for \"%s\"\n", jack_port_name(self->Port[i]));
  394. break;
  395. }
  396. if(jack_connect(self->Client, jack_port_name(self->Port[i]), ports[i]))
  397. ERR("Failed to connect output port \"%s\" to \"%s\"\n", jack_port_name(self->Port[i]), ports[i]);
  398. }
  399. jack_free(ports);
  400. ATOMIC_STORE(&self->killNow, AL_FALSE, almemory_order_release);
  401. if(althrd_create(&self->thread, ALCjackPlayback_mixerProc, self) != althrd_success)
  402. {
  403. jack_deactivate(self->Client);
  404. return ALC_FALSE;
  405. }
  406. return ALC_TRUE;
  407. }
  408. static void ALCjackPlayback_stop(ALCjackPlayback *self)
  409. {
  410. int res;
  411. if(ATOMIC_EXCHANGE(&self->killNow, AL_TRUE, almemory_order_acq_rel))
  412. return;
  413. alsem_post(&self->Sem);
  414. althrd_join(self->thread, &res);
  415. jack_deactivate(self->Client);
  416. }
  417. static ClockLatency ALCjackPlayback_getClockLatency(ALCjackPlayback *self)
  418. {
  419. ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice;
  420. ClockLatency ret;
  421. ALCjackPlayback_lock(self);
  422. ret.ClockTime = GetDeviceClockTime(device);
  423. ret.Latency = ll_ringbuffer_read_space(self->Ring) * DEVICE_CLOCK_RES /
  424. device->Frequency;
  425. ALCjackPlayback_unlock(self);
  426. return ret;
  427. }
  428. static void jack_msg_handler(const char *message)
  429. {
  430. WARN("%s\n", message);
  431. }
  432. typedef struct ALCjackBackendFactory {
  433. DERIVE_FROM_TYPE(ALCbackendFactory);
  434. } ALCjackBackendFactory;
  435. #define ALCJACKBACKENDFACTORY_INITIALIZER { { GET_VTABLE2(ALCjackBackendFactory, ALCbackendFactory) } }
  436. static ALCboolean ALCjackBackendFactory_init(ALCjackBackendFactory* UNUSED(self))
  437. {
  438. void (*old_error_cb)(const char*);
  439. jack_client_t *client;
  440. jack_status_t status;
  441. if(!jack_load())
  442. return ALC_FALSE;
  443. if(!GetConfigValueBool(NULL, "jack", "spawn-server", 0))
  444. ClientOptions |= JackNoStartServer;
  445. old_error_cb = (&jack_error_callback ? jack_error_callback : NULL);
  446. jack_set_error_function(jack_msg_handler);
  447. client = jack_client_open("alsoft", ClientOptions, &status, NULL);
  448. jack_set_error_function(old_error_cb);
  449. if(client == NULL)
  450. {
  451. WARN("jack_client_open() failed, 0x%02x\n", status);
  452. if((status&JackServerFailed) && !(ClientOptions&JackNoStartServer))
  453. ERR("Unable to connect to JACK server\n");
  454. return ALC_FALSE;
  455. }
  456. jack_client_close(client);
  457. return ALC_TRUE;
  458. }
  459. static void ALCjackBackendFactory_deinit(ALCjackBackendFactory* UNUSED(self))
  460. {
  461. #ifdef HAVE_DYNLOAD
  462. if(jack_handle)
  463. CloseLib(jack_handle);
  464. jack_handle = NULL;
  465. #endif
  466. }
  467. static ALCboolean ALCjackBackendFactory_querySupport(ALCjackBackendFactory* UNUSED(self), ALCbackend_Type type)
  468. {
  469. if(type == ALCbackend_Playback)
  470. return ALC_TRUE;
  471. return ALC_FALSE;
  472. }
  473. static void ALCjackBackendFactory_probe(ALCjackBackendFactory* UNUSED(self), enum DevProbe type)
  474. {
  475. switch(type)
  476. {
  477. case ALL_DEVICE_PROBE:
  478. AppendAllDevicesList(jackDevice);
  479. break;
  480. case CAPTURE_DEVICE_PROBE:
  481. break;
  482. }
  483. }
  484. static ALCbackend* ALCjackBackendFactory_createBackend(ALCjackBackendFactory* UNUSED(self), ALCdevice *device, ALCbackend_Type type)
  485. {
  486. if(type == ALCbackend_Playback)
  487. {
  488. ALCjackPlayback *backend;
  489. NEW_OBJ(backend, ALCjackPlayback)(device);
  490. if(!backend) return NULL;
  491. return STATIC_CAST(ALCbackend, backend);
  492. }
  493. return NULL;
  494. }
  495. DEFINE_ALCBACKENDFACTORY_VTABLE(ALCjackBackendFactory);
  496. ALCbackendFactory *ALCjackBackendFactory_getFactory(void)
  497. {
  498. static ALCjackBackendFactory factory = ALCJACKBACKENDFACTORY_INITIALIZER;
  499. return STATIC_CAST(ALCbackendFactory, &factory);
  500. }