esp32-sip-client-with-headset/main/audio/audio_router.h

129 lines
2.8 KiB
C

#pragma once
#include <stdbool.h>
#include <stdint.h>
#include "esp_err.h"
#ifdef __cplusplus
extern "C" {
#endif
// Audio-Quelle
typedef enum {
AUDIO_SOURCE_NONE = 0,
AUDIO_SOURCE_USB, // USB Headset (höchste Priorität)
AUDIO_SOURCE_BLUETOOTH // Bluetooth Headset
} audio_source_t;
// Audio-Format
typedef struct {
uint32_t sample_rate;
uint8_t channels;
uint8_t bits_per_sample;
} audio_format_t;
// Audio-Statistiken
typedef struct {
uint32_t packets_sent;
uint32_t packets_received;
uint32_t underruns;
uint32_t overruns;
int16_t input_level_db;
int16_t output_level_db;
} audio_stats_t;
// Button Event Callback (vereinheitlicht USB und BT)
typedef enum {
HEADSET_BUTTON_ANSWER = 0,
HEADSET_BUTTON_HANGUP,
HEADSET_BUTTON_REJECT,
HEADSET_BUTTON_MUTE,
HEADSET_BUTTON_VOLUME_UP,
HEADSET_BUTTON_VOLUME_DOWN
} headset_button_t;
typedef void (*headset_button_callback_t)(headset_button_t button, audio_source_t source);
typedef void (*audio_source_change_callback_t)(audio_source_t old_source, audio_source_t new_source);
/**
* Initialisiert den Audio-Router
*/
esp_err_t audio_router_init(void);
/**
* Deinitalisiert den Audio-Router
*/
esp_err_t audio_router_deinit(void);
/**
* Gibt die aktuell aktive Audio-Quelle zurück
* USB hat immer Priorität über Bluetooth
*/
audio_source_t audio_router_get_active_source(void);
/**
* Prüft ob eine Audio-Quelle verfügbar ist
*/
bool audio_router_is_source_available(audio_source_t source);
/**
* Startet Audio-Routing für einen Anruf
*/
esp_err_t audio_router_start_call(void);
/**
* Stoppt Audio-Routing
*/
esp_err_t audio_router_stop_call(void);
/**
* Sendet Audio-Daten von SIP zum aktiven Headset
*/
esp_err_t audio_router_send_to_headset(const uint8_t* data, size_t len, const audio_format_t* format);
/**
* Empfängt Audio-Daten vom aktiven Headset für SIP
* Wird intern über Callback verarbeitet
*/
typedef void (*audio_from_headset_callback_t)(const uint8_t* data, size_t len, const audio_format_t* format);
void audio_router_register_input_callback(audio_from_headset_callback_t callback);
/**
* Registriert Callback für Headset-Button-Events
*/
void audio_router_register_button_callback(headset_button_callback_t callback);
/**
* Registriert Callback für Quellenwechsel
*/
void audio_router_register_source_change_callback(audio_source_change_callback_t callback);
/**
* Setzt die Master-Lautstärke (0-100)
*/
esp_err_t audio_router_set_volume(uint8_t volume);
/**
* Gibt die aktuelle Lautstärke zurück
*/
uint8_t audio_router_get_volume(void);
/**
* Setzt Mute
*/
esp_err_t audio_router_set_mute(bool mute);
/**
* Gibt den Mute-Status zurück
*/
bool audio_router_is_muted(void);
/**
* Gibt Audio-Statistiken zurück
*/
esp_err_t audio_router_get_stats(audio_stats_t* stats);
#ifdef __cplusplus
}
#endif