eq_events.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #pragma once
  2. /**
  3. * EQ event system — Observer pattern for equalizer state changes.
  4. *
  5. * Decouples the web interface, NVS persistence, and DAC driver so each
  6. * can react to EQ changes independently. Mirrors the RTSP event pattern.
  7. *
  8. * Compile-time gated: only available when CONFIG_DAC_TAS58XX is set.
  9. */
  10. #include "esp_err.h"
  11. #include <stdbool.h>
  12. #include <stdint.h>
  13. #ifdef CONFIG_DAC_TAS58XX
  14. #include "dac_tas58xx_eq.h"
  15. #else
  16. /* Provide the constant even when EQ hardware isn't present so that
  17. data structures compile cleanly. The event system simply won't
  18. be active. */
  19. #define TAS58XX_EQ_BANDS 15
  20. #endif
  21. /** Maximum number of EQ event listeners */
  22. #define EQ_MAX_LISTENERS 4
  23. /* ------------------------------------------------------------------ */
  24. /* Event types */
  25. /* ------------------------------------------------------------------ */
  26. typedef enum {
  27. /** A single band's gain changed. data->band_changed is valid. */
  28. EQ_EVENT_BAND_CHANGED,
  29. /** All 15 bands were set at once (bulk update / preset load).
  30. * data->all_bands is valid. */
  31. EQ_EVENT_ALL_BANDS_SET,
  32. /** All bands reset to 0 dB (flat). No extra data needed. */
  33. EQ_EVENT_FLAT,
  34. } eq_event_t;
  35. /* ------------------------------------------------------------------ */
  36. /* Event data */
  37. /* ------------------------------------------------------------------ */
  38. typedef struct {
  39. int band; /**< 0–14 */
  40. float gain_db; /**< new gain in dB */
  41. } eq_band_changed_t;
  42. typedef struct {
  43. float gains_db[TAS58XX_EQ_BANDS]; /**< all 15 gains */
  44. } eq_all_bands_t;
  45. typedef union {
  46. eq_band_changed_t band_changed; /**< EQ_EVENT_BAND_CHANGED */
  47. eq_all_bands_t all_bands; /**< EQ_EVENT_ALL_BANDS_SET */
  48. } eq_event_data_t;
  49. /* ------------------------------------------------------------------ */
  50. /* Callback signature */
  51. /* ------------------------------------------------------------------ */
  52. /**
  53. * EQ event callback.
  54. * @param event Which event fired
  55. * @param data Event-specific payload (NULL for EQ_EVENT_FLAT)
  56. * @param user_data Pointer registered with eq_events_register()
  57. */
  58. typedef void (*eq_event_callback_t)(eq_event_t event,
  59. const eq_event_data_t *data,
  60. void *user_data);
  61. /* ------------------------------------------------------------------ */
  62. /* Public API */
  63. /* ------------------------------------------------------------------ */
  64. /**
  65. * Register a listener for EQ events.
  66. * @return 0 on success, -1 if max listeners reached or callback is NULL
  67. */
  68. int eq_events_register(eq_event_callback_t callback, void *user_data);
  69. /**
  70. * Unregister a previously registered listener.
  71. */
  72. void eq_events_unregister(eq_event_callback_t callback);
  73. /**
  74. * Emit an EQ event to all registered listeners.
  75. * @param event The event type
  76. * @param data Event payload (may be NULL for EQ_EVENT_FLAT)
  77. */
  78. void eq_events_emit(eq_event_t event, const eq_event_data_t *data);