Audio plugin host https://kx.studio/carla
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

195 lines
4.8KB

  1. /*
  2. * JackBridge (Part 2, Semaphore functions)
  3. * Copyright (C) 2013-2014 Filipe Coelho <falktx@falktx.com>
  4. *
  5. * Permission to use, copy, modify, and/or distribute this software for any purpose with
  6. * or without fee is hereby granted, provided that the above copyright notice and this
  7. * permission notice appear in all copies.
  8. *
  9. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
  10. * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN
  11. * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  12. * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
  13. * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  14. * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15. */
  16. #include "CarlaDefines.h"
  17. #include "JackBridge.hpp"
  18. #include "CarlaShmUtils.hpp"
  19. #ifndef JACKBRIDGE_HPP_INCLUDED
  20. // don't include the whole JACK API in this file
  21. CARLA_EXPORT bool jackbridge_sem_init(void* sem) noexcept;
  22. CARLA_EXPORT bool jackbridge_sem_destroy(void* sem) noexcept;
  23. CARLA_EXPORT bool jackbridge_sem_post(void* sem) noexcept;
  24. CARLA_EXPORT bool jackbridge_sem_timedwait(void* sem, int secs) noexcept;
  25. CARLA_EXPORT bool jackbridge_shm_is_valid(const void* shm) noexcept;
  26. CARLA_EXPORT void jackbridge_shm_init(void* shm) noexcept;
  27. CARLA_EXPORT void jackbridge_shm_attach(void* shm, const char* name) noexcept;
  28. CARLA_EXPORT void jackbridge_shm_close(void* shm) noexcept;
  29. CARLA_EXPORT void* jackbridge_shm_map(void* shm, size_t size) noexcept;
  30. #endif
  31. // -----------------------------------------------------------------------------
  32. #ifdef JACKBRIDGE_DUMMY
  33. bool jackbridge_sem_init(void*) noexcept
  34. {
  35. return false;
  36. }
  37. bool jackbridge_sem_destroy(void*) noexcept
  38. {
  39. return false;
  40. }
  41. bool jackbridge_sem_post(void*) noexcept
  42. {
  43. return false;
  44. }
  45. bool jackbridge_sem_timedwait(void*, int) noexcept
  46. {
  47. return false;
  48. }
  49. bool jackbridge_shm_is_valid(const void*) noexcept
  50. {
  51. return false;
  52. }
  53. void jackbridge_shm_init(void*) noexcept
  54. {
  55. }
  56. void jackbridge_shm_attach(void*, const char*) noexcept
  57. {
  58. }
  59. void jackbridge_shm_close(void*) noexcept
  60. {
  61. }
  62. void* jackbridge_shm_map(void*, size_t) noexcept
  63. {
  64. return nullptr;
  65. }
  66. #else //JACKBRIDGE_DUMMY
  67. #include <ctime>
  68. #include <sys/time.h>
  69. #include <sys/types.h>
  70. #include <semaphore.h>
  71. #ifdef CARLA_OS_MAC
  72. extern "C" {
  73. #include "osx_sem_timedwait.c"
  74. }
  75. #endif
  76. // TODO - check noexcept on OSX
  77. bool jackbridge_sem_init(void* sem) noexcept
  78. {
  79. #ifdef CARLA_OS_MAC
  80. static ulong sCounter = 0;
  81. ++sCounter;
  82. std::srand(static_cast<uint>(std::time(nullptr)));
  83. char strBuf[0xff+1];
  84. carla_zeroChar(strBuf, 0xff+1);
  85. std::sprintf(strBuf, "carla-sem-%i-%li", std::rand(), sCounter);
  86. sem_unlink(strBuf);
  87. sem_t* const sema = sem_open(strBuf, O_CREAT, O_RDWR, 0);
  88. std::memcpy(sem, &sema, sizeof(sem_t*));
  89. return (sema != nullptr && sema != SEM_FAILED);
  90. #else
  91. return (sem_init((sem_t*)sem, 1, 0) == 0);
  92. #endif
  93. }
  94. bool jackbridge_sem_destroy(void* sem) noexcept
  95. {
  96. #ifdef CARLA_OS_MAC
  97. return (sem_close(*(sem_t**)sem) == 0);
  98. #else
  99. return (sem_destroy((sem_t*)sem) == 0);
  100. #endif
  101. }
  102. bool jackbridge_sem_post(void* sem) noexcept
  103. {
  104. #ifdef CARLA_OS_MAC
  105. sem_t* const sema = *(sem_t**)sem;
  106. #else
  107. sem_t* const sema = (sem_t*)sem;
  108. #endif
  109. return (sem_post(sema) == 0);
  110. }
  111. bool jackbridge_sem_timedwait(void* sem, int secs) noexcept
  112. {
  113. CARLA_SAFE_ASSERT_RETURN(secs > 0, false);
  114. #ifdef CARLA_OS_MAC
  115. sem_t* const sema = *(sem_t**)sem;
  116. #else
  117. sem_t* const sema = (sem_t*)sem;
  118. #endif
  119. timespec timeout;
  120. #ifdef CARLA_OS_LINUX
  121. clock_gettime(CLOCK_REALTIME, &timeout);
  122. #else
  123. timeval now;
  124. gettimeofday(&now, nullptr);
  125. timeout.tv_sec = now.tv_sec;
  126. timeout.tv_nsec = now.tv_usec * 1000;
  127. #endif
  128. timeout.tv_sec += secs;
  129. try {
  130. return (sem_timedwait(sema, &timeout) == 0);
  131. } CARLA_SAFE_EXCEPTION_RETURN("sem_timedwait", false);
  132. }
  133. bool jackbridge_shm_is_valid(const void* shm) noexcept
  134. {
  135. CARLA_SAFE_ASSERT_RETURN(shm != nullptr, false);
  136. return carla_is_shm_valid(*(const shm_t*)shm);
  137. }
  138. void jackbridge_shm_init(void* shm) noexcept
  139. {
  140. CARLA_SAFE_ASSERT_RETURN(shm != nullptr,);
  141. carla_shm_init(*(shm_t*)shm);
  142. }
  143. void jackbridge_shm_attach(void* shm, const char* name) noexcept
  144. {
  145. CARLA_SAFE_ASSERT_RETURN(shm != nullptr,);
  146. *(shm_t*)shm = carla_shm_attach(name);
  147. }
  148. void jackbridge_shm_close(void* shm) noexcept
  149. {
  150. CARLA_SAFE_ASSERT_RETURN(shm != nullptr,);
  151. carla_shm_close(*(shm_t*)shm);
  152. }
  153. void* jackbridge_shm_map(void* shm, size_t size) noexcept
  154. {
  155. CARLA_SAFE_ASSERT_RETURN(shm != nullptr, nullptr);
  156. return carla_shm_map(*(shm_t*)shm, size);
  157. }
  158. #endif // ! JACKBRIDGE_DUMMY
  159. // -----------------------------------------------------------------------------