The JUCE cross-platform C++ framework, with DISTRHO/KXStudio specific changes
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.

117 lines
3.7KB

  1. /*
  2. ==============================================================================
  3. This file is part of the JUCE library - "Jules' Utility Class Extensions"
  4. Copyright 2004-11 by Raw Material Software Ltd.
  5. ------------------------------------------------------------------------------
  6. JUCE can be redistributed and/or modified under the terms of the GNU General
  7. Public License (Version 2), as published by the Free Software Foundation.
  8. A copy of the license is included in the JUCE distribution, or can be found
  9. online at www.gnu.org/licenses.
  10. JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
  11. WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
  12. A PARTICULAR PURPOSE. See the GNU General Public License for more details.
  13. ------------------------------------------------------------------------------
  14. To release a closed-source product which uses JUCE, commercial licenses are
  15. available: visit www.rawmaterialsoftware.com/juce for more information.
  16. ==============================================================================
  17. */
  18. void MessageManager::doPlatformSpecificInitialisation() {}
  19. void MessageManager::doPlatformSpecificShutdown() {}
  20. //==============================================================================
  21. bool MessageManager::dispatchNextMessageOnSystemQueue (const bool returnIfNoPendingMessages)
  22. {
  23. Logger::outputDebugString ("*** Modal loops are not possible in Android!! Exiting...");
  24. exit (1);
  25. return true;
  26. }
  27. //==============================================================================
  28. bool MessageManager::postMessageToSystemQueue (Message* message)
  29. {
  30. message->incReferenceCount();
  31. getEnv()->CallVoidMethod (android.activity, JuceAppActivity.postMessage, (jlong) (pointer_sized_uint) message);
  32. return true;
  33. }
  34. JUCE_JNI_CALLBACK (JuceAppActivity, deliverMessage, void, (jobject activity, jlong value))
  35. {
  36. Message* const message = (Message*) (pointer_sized_uint) value;
  37. MessageManager::getInstance()->deliverMessage (message);
  38. message->decReferenceCount();
  39. }
  40. //==============================================================================
  41. class AsyncFunctionCaller : public AsyncUpdater
  42. {
  43. public:
  44. static void* call (MessageCallbackFunction* func_, void* parameter_)
  45. {
  46. if (MessageManager::getInstance()->isThisTheMessageThread())
  47. return func_ (parameter_);
  48. AsyncFunctionCaller caller (func_, parameter_);
  49. caller.triggerAsyncUpdate();
  50. caller.finished.wait();
  51. return caller.result;
  52. }
  53. void handleAsyncUpdate()
  54. {
  55. result = (*func) (parameter);
  56. finished.signal();
  57. }
  58. private:
  59. WaitableEvent finished;
  60. MessageCallbackFunction* func;
  61. void* parameter;
  62. void* volatile result;
  63. AsyncFunctionCaller (MessageCallbackFunction* func_, void* parameter_)
  64. : result (nullptr), func (func_), parameter (parameter_)
  65. {}
  66. JUCE_DECLARE_NON_COPYABLE (AsyncFunctionCaller);
  67. };
  68. void* MessageManager::callFunctionOnMessageThread (MessageCallbackFunction* func, void* parameter)
  69. {
  70. return AsyncFunctionCaller::call (func, parameter);
  71. }
  72. //==============================================================================
  73. void MessageManager::broadcastMessage (const String&)
  74. {
  75. }
  76. void MessageManager::runDispatchLoop()
  77. {
  78. }
  79. class QuitCallback : public CallbackMessage
  80. {
  81. public:
  82. QuitCallback() {}
  83. void messageCallback()
  84. {
  85. android.activity.callVoidMethod (JuceAppActivity.finish);
  86. }
  87. };
  88. void MessageManager::stopDispatchLoop()
  89. {
  90. (new QuitCallback())->post();
  91. quitMessagePosted = true;
  92. }