rtsp_events.h 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #pragma once
  2. #include <stdbool.h>
  3. #include <stddef.h>
  4. #include <stdint.h>
  5. /**
  6. * RTSP event system - Observer pattern for playback state changes.
  7. * Allows multiple listeners to react to RTSP events without coupling.
  8. */
  9. typedef enum {
  10. RTSP_EVENT_CLIENT_CONNECTED,
  11. RTSP_EVENT_PLAYING,
  12. RTSP_EVENT_PAUSED,
  13. RTSP_EVENT_DISCONNECTED,
  14. RTSP_EVENT_METADATA,
  15. } rtsp_event_t;
  16. // ============================================================================
  17. // Metadata Event Data
  18. // ============================================================================
  19. #define METADATA_STRING_MAX 64
  20. typedef struct {
  21. char title[METADATA_STRING_MAX]; // Track title (DMAP minm / bplist itemName)
  22. char artist[METADATA_STRING_MAX]; // Artist name (DMAP asar / bplist
  23. // artistName)
  24. char album[METADATA_STRING_MAX]; // Album name (DMAP asal / bplist albumName)
  25. char genre[METADATA_STRING_MAX]; // Genre (DMAP asgn)
  26. uint32_t duration_secs; // Total track duration in seconds
  27. uint32_t position_secs; // Current playback position in seconds
  28. bool has_artwork; // Whether artwork is available
  29. } rtsp_metadata_t;
  30. // ============================================================================
  31. // Event Data Union
  32. // ============================================================================
  33. typedef union {
  34. rtsp_metadata_t metadata; // Valid when event == RTSP_EVENT_METADATA
  35. } rtsp_event_data_t;
  36. /**
  37. * Event callback function type.
  38. * @param event The event that occurred
  39. * @param data Event-specific data (NULL for events with no data)
  40. * @param user_data Pointer registered with rtsp_events_register()
  41. */
  42. typedef void (*rtsp_event_callback_t)(rtsp_event_t event,
  43. const rtsp_event_data_t *data,
  44. void *user_data);
  45. /**
  46. * Register a listener for RTSP events.
  47. * @param callback Function to call when an event occurs
  48. * @param user_data Pointer passed to callback (can be NULL)
  49. * @return 0 on success, -1 if max listeners reached
  50. */
  51. int rtsp_events_register(rtsp_event_callback_t callback, void *user_data);
  52. /**
  53. * Unregister a previously registered listener.
  54. * @param callback The callback to remove
  55. */
  56. void rtsp_events_unregister(rtsp_event_callback_t callback);
  57. /**
  58. * Emit an event to all registered listeners.
  59. * Called internally by RTSP handlers.
  60. * @param event The event to emit
  61. * @param data Event-specific data (NULL for events with no data)
  62. */
  63. void rtsp_events_emit(rtsp_event_t event, const rtsp_event_data_t *data);
  64. /**
  65. * Format seconds as mm:ss string.
  66. * @param seconds Time in seconds
  67. * @param out Output buffer (at least 8 bytes for "999:59\0")
  68. * @param out_size Size of output buffer
  69. */
  70. void rtsp_format_time_mmss(uint32_t seconds, char *out, size_t out_size);