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.

236 lines
6.3KB

  1. /*
  2. * Carla Native Plugins
  3. * Copyright (C) 2012-2015 Filipe Coelho <falktx@falktx.com>
  4. *
  5. * This program is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU General Public License as
  7. * published by the Free Software Foundation; either version 2 of
  8. * the License, or any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * For a full copy of the GNU General Public License see the doc/GPL.txt file.
  16. */
  17. #include "CarlaPipeUtils.cpp"
  18. #ifdef CARLA_OS_WIN
  19. #define errx(...)
  20. #define warnx(...)
  21. #endif
  22. #define PLUGINVERSION
  23. #define SOURCE_DIR "/usr/share/zynaddsubfx"
  24. #undef override
  25. CarlaString gUiPixmapPath("/usr/share/carla/resources/zynaddsubfx/");
  26. // zynaddsubfx ui includes
  27. #include "zynaddsubfx/UI/NioUI.cpp"
  28. #include "zynaddsubfx/UI/WidgetPDial.cpp"
  29. #include "zynaddsubfx/UI/ADnoteUI.cpp"
  30. #include "zynaddsubfx/UI/BankUI.cpp"
  31. #include "zynaddsubfx/UI/BankView.cpp"
  32. #include "zynaddsubfx/UI/ConfigUI.cpp"
  33. // #include "zynaddsubfx/UI/Connection.cpp"
  34. #include "zynaddsubfx/UI/EffUI.cpp"
  35. #include "zynaddsubfx/UI/EnvelopeFreeEdit.cpp"
  36. #include "zynaddsubfx/UI/EnvelopeUI.cpp"
  37. #include "zynaddsubfx/UI/FilterUI.cpp"
  38. #include "zynaddsubfx/UI/Fl_EQGraph.cpp"
  39. #include "zynaddsubfx/UI/Fl_Osc_Button.cpp"
  40. #include "zynaddsubfx/UI/Fl_Osc_Check.cpp"
  41. #include "zynaddsubfx/UI/Fl_Osc_Choice.cpp"
  42. #include "zynaddsubfx/UI/Fl_Osc_Counter.cpp"
  43. #include "zynaddsubfx/UI/Fl_Osc_Dial.cpp"
  44. #include "zynaddsubfx/UI/Fl_Osc_DialF.cpp"
  45. #include "zynaddsubfx/UI/Fl_Osc_Input.cpp"
  46. #include "zynaddsubfx/UI/Fl_Osc_ListView.cpp"
  47. #include "zynaddsubfx/UI/Fl_Osc_Output.cpp"
  48. #include "zynaddsubfx/UI/Fl_Osc_Pane.cpp"
  49. #include "zynaddsubfx/UI/Fl_Osc_Roller.cpp"
  50. #include "zynaddsubfx/UI/Fl_Osc_Slider.cpp"
  51. #include "zynaddsubfx/UI/Fl_Osc_Value.cpp"
  52. #include "zynaddsubfx/UI/Fl_Osc_VSlider.cpp"
  53. #include "zynaddsubfx/UI/Fl_Osc_Widget.cpp"
  54. #include "zynaddsubfx/UI/Fl_Resonance_Graph.cpp"
  55. #include "zynaddsubfx/UI/FormantFilterGraph.cpp"
  56. #include "zynaddsubfx/UI/LFOUI.cpp"
  57. #include "zynaddsubfx/UI/MasterUI.cpp"
  58. #include "zynaddsubfx/UI/MicrotonalUI.cpp"
  59. #include "zynaddsubfx/UI/OscilGenUI.cpp"
  60. #include "zynaddsubfx/UI/PADnoteUI.cpp"
  61. #include "zynaddsubfx/UI/PartNameButton.cpp"
  62. #include "zynaddsubfx/UI/PartUI.cpp"
  63. #include "zynaddsubfx/UI/PresetsUI.cpp"
  64. #include "zynaddsubfx/UI/ResonanceUI.cpp"
  65. #include "zynaddsubfx/UI/SUBnoteUI.cpp"
  66. #include "zynaddsubfx/UI/VirKeyboard.cpp"
  67. #include "zynaddsubfx/UI/guimain.cpp"
  68. class ZynPipeClient : public CarlaPipeClient
  69. {
  70. public:
  71. ZynPipeClient() noexcept
  72. : CarlaPipeClient(),
  73. fQuitReceived(false) {}
  74. ~ZynPipeClient() noexcept override
  75. {
  76. if (fQuitReceived)
  77. return;
  78. const CarlaMutexLocker cml(getPipeLock());
  79. writeMessage("exiting\n");
  80. flushMessages();
  81. }
  82. protected:
  83. bool msgReceived(const char* const msg) noexcept override
  84. {
  85. if (std::strcmp(msg, "show") == 0)
  86. {
  87. try {
  88. GUI::raiseUi(gui, "/show", "i", 1);
  89. } CARLA_SAFE_EXCEPTION("msgReceived show");
  90. return true;
  91. }
  92. if (std::strcmp(msg, "hide") == 0)
  93. {
  94. try {
  95. GUI::raiseUi(gui, "/hide", "");
  96. } CARLA_SAFE_EXCEPTION("msgReceived hide");
  97. return true;
  98. }
  99. if (std::strcmp(msg, "focus") == 0)
  100. {
  101. try {
  102. GUI::raiseUi(gui, "/focus", "");
  103. } CARLA_SAFE_EXCEPTION("msgReceived focus");
  104. return true;
  105. }
  106. if (std::strcmp(msg, "uiTitle") == 0)
  107. {
  108. const char* uiTitle;
  109. CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(uiTitle), true);
  110. try {
  111. GUI::raiseUi(gui, "/title", "s", uiTitle);
  112. } CARLA_SAFE_EXCEPTION("msgReceived uiTitle");
  113. return true;
  114. }
  115. if (std::strcmp(msg, "quit") == 0)
  116. {
  117. fQuitReceived = true;
  118. try {
  119. GUI::raiseUi(gui, "/close-ui", "");
  120. } CARLA_SAFE_EXCEPTION("msgReceived quit");
  121. return true;
  122. }
  123. carla_stderr("ZynPipeClient::msgReceived : %s", msg);
  124. }
  125. private:
  126. bool fQuitReceived;
  127. };
  128. int main(int argc, const char* argv[])
  129. {
  130. ZynPipeClient pipe;
  131. const char* uiTitle = nullptr;
  132. // Startup Liblo Link
  133. if (argc > 1) {
  134. sendtourl = argv[1];
  135. uiTitle = argv[2];
  136. if (! pipe.initPipeClient(argv))
  137. return 1;
  138. server = lo_server_new_with_proto(NULL, LO_UDP, liblo_error_cb);
  139. lo_server_add_method(server, NULL, NULL, handler_function, 0);
  140. }
  141. gui = GUI::createUi(new UI_Interface(), &Pexitprogram);
  142. if (argc == 1)
  143. GUI::raiseUi(gui, "/show", "i", 1);
  144. while(Pexitprogram == 0) {
  145. if(server)
  146. while(lo_server_recv_noblock(server, 0));
  147. pipe.idlePipe();
  148. GUI::tickUi(gui);
  149. }
  150. GUI::destroyUi(gui);
  151. gui = nullptr;
  152. return 0;
  153. }
  154. // --------------------------------------------------------------------------------------------
  155. // we need juce::Time::getMillisecondCounter()
  156. #ifdef CARLA_OS_WIN
  157. #include <ctime>
  158. #else
  159. #include <sys/time.h>
  160. #endif
  161. namespace juce {
  162. #include "juce_core/native/juce_BasicNativeHeaders.h"
  163. #include "juce_core/juce_core.h"
  164. static uint32 lastMSCounterValue = 0;
  165. #ifdef CARLA_OS_WIN
  166. uint32 juce_millisecondsSinceStartup() noexcept
  167. {
  168. return (uint32) timeGetTime();
  169. }
  170. #else
  171. uint32 juce_millisecondsSinceStartup() noexcept
  172. {
  173. timespec t;
  174. clock_gettime (CLOCK_MONOTONIC, &t);
  175. return t.tv_sec * 1000 + t.tv_nsec / 1000000;
  176. }
  177. #endif
  178. uint32 Time::getMillisecondCounter() noexcept
  179. {
  180. const uint32 now = juce_millisecondsSinceStartup();
  181. if (now < lastMSCounterValue)
  182. {
  183. // in multi-threaded apps this might be called concurrently, so
  184. // make sure that our last counter value only increases and doesn't
  185. // go backwards..
  186. if (now < lastMSCounterValue - 1000)
  187. lastMSCounterValue = now;
  188. }
  189. else
  190. {
  191. lastMSCounterValue = now;
  192. }
  193. return now;
  194. }
  195. } // namespace juce
  196. // --------------------------------------------------------------------------------------------