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.

103 lines
2.4KB

  1. #include "EventEmitter.hpp"
  2. namespace SynthDevKit {
  3. EventEmitter::EventEmitter ( ) {
  4. has_emitted = false;
  5. }
  6. void EventEmitter::clear (bool all) {
  7. for (int16_t i = 0; i < TOP_EVENT; i++) {
  8. if (i != (EVENT_MAX - EVENT_CLEAR) || all) {
  9. emitters[i].clear();
  10. }
  11. }
  12. // emit the clear event
  13. emit(EVENT_CLEAR, 0.0f);
  14. }
  15. void EventEmitter::on (int16_t event, void (*func)(int16_t, float)) {
  16. int16_t real_event = realEvent(event);
  17. // if this is an invalid event return
  18. if (real_event == -1) {
  19. return;
  20. }
  21. emitters[real_event].push_back(func);
  22. }
  23. void EventEmitter::emit (int16_t event, float value) {
  24. int16_t real_event = realEvent(event);
  25. // if this is an invalid event, or there is nothing to do, return
  26. if (real_event == -1) {
  27. return;
  28. }
  29. // event the first event if this is the first one fired
  30. if (!has_emitted) {
  31. has_emitted = true;
  32. emit(EVENT_FIRST, value);
  33. }
  34. // odd and even emitters - but only if normal event
  35. if (event >= 0) {
  36. if (real_event % 2) {
  37. emit(EVENT_ODD, 0.0f);
  38. } else {
  39. emit(EVENT_EVEN, 0.0f);
  40. }
  41. }
  42. // iterate through the events, and call each one
  43. for(auto const &iter: emitters[real_event]) {
  44. iter(event, value);
  45. }
  46. }
  47. void EventEmitter::removeListener (int16_t event, void (*func)(int16_t, float)) {
  48. int16_t real_event = realEvent(event);
  49. // if this is an invalid event, or there is nothing to do, return
  50. if (real_event == -1 || emitters[real_event].size() == 0) {
  51. return;
  52. }
  53. for (std::vector<void (*)(int16_t, float)>::iterator it = emitters[real_event].begin(); it != emitters[real_event].end(); ++it) {
  54. if (*it == func) {
  55. emitters[real_event].erase(it);
  56. return;
  57. }
  58. }
  59. }
  60. int16_t EventEmitter::listenerCount (int16_t event) {
  61. int16_t real_event = realEvent(event);
  62. // if this is an invalid event return 0
  63. if (real_event == -1) {
  64. return 0;
  65. }
  66. return emitters[real_event].size();
  67. }
  68. int16_t EventEmitter::realEvent (int16_t event) {
  69. int16_t real_event;
  70. // adjust the events to be positive event id's
  71. if (event < 0) {
  72. real_event = EVENT_MAX - event;
  73. } else {
  74. real_event = event;
  75. }
  76. if (real_event < 0 || real_event >= TOP_EVENT) {
  77. return -1;
  78. } else {
  79. return real_event;
  80. }
  81. }
  82. }