eq_events.c 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #include "eq_events.h"
  2. #include <stddef.h>
  3. typedef struct {
  4. eq_event_callback_t callback;
  5. void *user_data;
  6. } eq_listener_t;
  7. static eq_listener_t s_listeners[EQ_MAX_LISTENERS];
  8. static int s_listener_count = 0;
  9. int eq_events_register(eq_event_callback_t callback, void *user_data) {
  10. if (callback == NULL || s_listener_count >= EQ_MAX_LISTENERS) {
  11. return -1;
  12. }
  13. /* Prevent duplicate registration */
  14. for (int i = 0; i < s_listener_count; i++) {
  15. if (s_listeners[i].callback == callback) {
  16. return 0;
  17. }
  18. }
  19. s_listeners[s_listener_count].callback = callback;
  20. s_listeners[s_listener_count].user_data = user_data;
  21. s_listener_count++;
  22. return 0;
  23. }
  24. void eq_events_unregister(eq_event_callback_t callback) {
  25. for (int i = 0; i < s_listener_count; i++) {
  26. if (s_listeners[i].callback == callback) {
  27. for (int j = i; j < s_listener_count - 1; j++) {
  28. s_listeners[j] = s_listeners[j + 1];
  29. }
  30. s_listener_count--;
  31. return;
  32. }
  33. }
  34. }
  35. void eq_events_emit(eq_event_t event, const eq_event_data_t *data) {
  36. for (int i = 0; i < s_listener_count; i++) {
  37. s_listeners[i].callback(event, data, s_listeners[i].user_data);
  38. }
  39. }