rtsp_events.c 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #include "rtsp_events.h"
  2. #include <inttypes.h>
  3. #include <stddef.h>
  4. #include <stdio.h>
  5. #define MAX_LISTENERS 4
  6. typedef struct {
  7. rtsp_event_callback_t callback;
  8. void *user_data;
  9. } listener_t;
  10. static listener_t listeners[MAX_LISTENERS];
  11. static int listener_count = 0;
  12. int rtsp_events_register(rtsp_event_callback_t callback, void *user_data) {
  13. if (callback == NULL || listener_count >= MAX_LISTENERS) {
  14. return -1;
  15. }
  16. // Check if already registered
  17. for (int i = 0; i < listener_count; i++) {
  18. if (listeners[i].callback == callback) {
  19. return 0;
  20. }
  21. }
  22. listeners[listener_count].callback = callback;
  23. listeners[listener_count].user_data = user_data;
  24. listener_count++;
  25. return 0;
  26. }
  27. void rtsp_events_unregister(rtsp_event_callback_t callback) {
  28. for (int i = 0; i < listener_count; i++) {
  29. if (listeners[i].callback == callback) {
  30. // Shift remaining listeners
  31. for (int j = i; j < listener_count - 1; j++) {
  32. listeners[j] = listeners[j + 1];
  33. }
  34. listener_count--;
  35. return;
  36. }
  37. }
  38. }
  39. void rtsp_events_emit(rtsp_event_t event, const rtsp_event_data_t *data) {
  40. for (int i = 0; i < listener_count; i++) {
  41. listeners[i].callback(event, data, listeners[i].user_data);
  42. }
  43. }
  44. void rtsp_format_time_mmss(uint32_t seconds, char *out, size_t out_size) {
  45. uint32_t mins = seconds / 60;
  46. uint32_t secs = seconds % 60;
  47. snprintf(out, out_size, "%" PRIu32 ":%02" PRIu32, mins, secs);
  48. }