From e39d945b26cebddb2e28a3ae932371da73f658f1 Mon Sep 17 00:00:00 2001 From: Dirk Helbig Date: Wed, 6 Feb 2019 17:51:13 +0100 Subject: [PATCH] btstack_audio: split audio interface into source / sink --- example/a2dp_sink_demo.c | 8 ++-- src/btstack_audio.c | 37 +++++++++++++----- src/btstack_audio.h | 82 ++++++++++++++++++++++++++++++++-------- 3 files changed, 98 insertions(+), 29 deletions(-) diff --git a/example/a2dp_sink_demo.c b/example/a2dp_sink_demo.c index 14b80b138..970b1a1b0 100644 --- a/example/a2dp_sink_demo.c +++ b/example/a2dp_sink_demo.c @@ -386,9 +386,9 @@ static int media_processing_init(avdtp_media_codec_configuration_sbc_t configura btstack_resample_init(&resample_instance, configuration.num_channels); // setup audio playback - const btstack_audio_t * audio = btstack_audio_get_instance(); + const btstack_audio_sink_t * audio = btstack_audio_sink_get_instance(); if (audio){ - audio->init(NUM_CHANNELS, configuration.sampling_frequency, &playback_handler, NULL); + audio->init(NUM_CHANNELS, configuration.sampling_frequency, &playback_handler); } audio_stream_started = 0; @@ -415,7 +415,7 @@ static void media_processing_close(void){ #endif // stop audio playback - const btstack_audio_t * audio = btstack_audio_get_instance(); + const btstack_audio_sink_t * audio = btstack_audio_sink_get_instance(); if (audio){ audio->close(); } @@ -442,7 +442,7 @@ static void handle_l2cap_media_data_packet(uint8_t seid, uint8_t *packet, uint16 avdtp_sbc_codec_header_t sbc_header; if (!read_sbc_header(packet, size, &pos, &sbc_header)) return; - const btstack_audio_t * audio = btstack_audio_get_instance(); + const btstack_audio_sink_t * audio = btstack_audio_sink_get_instance(); // process data right away if there's no audio implementation active, e.g. on posix systems to store as .wav if (!audio){ diff --git a/src/btstack_audio.c b/src/btstack_audio.c index e8c49174b..6baf2c3ff 100644 --- a/src/btstack_audio.c +++ b/src/btstack_audio.c @@ -42,20 +42,39 @@ * */ -static const btstack_audio_t * btstack_audio_instance; +static const btstack_audio_sink_t * btstack_audio_sink_instance; + +static const btstack_audio_source_t * btstack_audio_source_instance; /** - * @brief Get BTstack Audio Instance - * @returns btstack_audio implementation + * @brief Get BTstack Audio Sink Instance + * @returns btstack_audio_sink implementation */ -const btstack_audio_t * btstack_audio_get_instance(void){ - return btstack_audio_instance; +const btstack_audio_sink_t * btstack_audio_sink_get_instance(void){ + return btstack_audio_sink_instance; } /** - * @brief Get BTstack Audio Instance - * @param btstack_audio implementation + * @brief Get BTstack Audio Source Instance + * @returns btstack_audio_source implementation */ -void btstack_audio_set_instance(const btstack_audio_t * audio_impl){ - btstack_audio_instance = audio_impl; +const btstack_audio_source_t * btstack_audio_source_get_instance(void){ + return btstack_audio_source_instance; } + +/** + * @brief Get BTstack Audio Sink Instance + * @param btstack_audio_sink implementation + */ +void btstack_audio_sink_set_instance(const btstack_audio_sink_t * audio_sink_impl){ + btstack_audio_sink_instance = audio_sink_impl; +} + +/** + * @brief Get BTstack Audio Source Instance + * @param btstack_audio_source implementation + */ +void btstack_audio_source_set_instance(const btstack_audio_source_t * audio_source_impl){ + btstack_audio_source_instance = audio_source_impl; +} + diff --git a/src/btstack_audio.h b/src/btstack_audio.h index 07b67798a..e7f04caf6 100644 --- a/src/btstack_audio.h +++ b/src/btstack_audio.h @@ -52,48 +52,98 @@ extern "C" { typedef struct { - /** + /** * @brief Setup audio codec for specified samplerate and number of channels * @param Channels (1=mono, 2=stereo) * @param Sample rate * @param Playback callback - * @param Recording callback * @return 1 on success */ int (*init)(uint8_t channels, uint32_t samplerate, - void (*playback) ( int16_t * buffer, uint16_t num_samples), - void (*recording)(const int16_t * buffer, uint16_t num_samples)); + void (*playback) ( int16_t * buffer, uint16_t num_samples)); - /** + /** * @brief Start stream */ void (*start_stream)(void); - /** + /** + * @brief Stop stream + */ + void (*stop_stream)(void); + + /** * @brief Close audio codec */ void (*close)(void); -} btstack_audio_t; +} btstack_audio_sink_t; + + +typedef struct { + + /** + * @brief Setup audio codec for specified samplerate and number of channels + * @param Channels (1=mono, 2=stereo) + * @param Sample rate + * @param Recording callback + * @return 1 on success + */ + int (*init)(uint8_t channels, + uint32_t samplerate, + void (*recording)(const int16_t * buffer, uint16_t num_samples)); + + /** + * @brief Start stream + */ + void (*start_stream)(void); + + /** + * @brief Stop stream + */ + void (*stop_stream)(void); + + /** + * @brief Close audio codec + */ + void (*close)(void); + +} btstack_audio_source_t; + /** - * @brief Get BTstack Audio Instance - * @returns btstack_audio implementation + * @brief Get BTstack Audio Sink Instance + * @returns btstack_audio_sink implementation */ -const btstack_audio_t * btstack_audio_get_instance(void); +const btstack_audio_sink_t * btstack_audio_sink_get_instance(void); /** - * @brief Get BTstack Audio Instance - * @param btstack_audio implementation + * @brief Get BTstack Audio Source Instance + * @returns btstack_audio_source implementation */ -void btstack_audio_set_instance(const btstack_audio_t * audio_impl); +const btstack_audio_source_t * btstack_audio_source_get_instance(void); + + +/** + * @brief Get BTstack Audio Sink Instance + * @param btstack_audio_sink implementation + */ +void btstack_audio_sink_set_instance(const btstack_audio_sink_t * audio_sink_impl); + +/** + * @brief Get BTstack Audio Source Instance + * @param btstack_audio_source implementation + */ +void btstack_audio_source_set_instance(const btstack_audio_source_t * audio_source_impl); // common implementations -const btstack_audio_t * btstack_audio_portaudio_get_instance(void); -const btstack_audio_t * btstack_audio_embedded_get_instance(void); -const btstack_audio_t * btstack_audio_esp32_get_instance(void); +const btstack_audio_sink_t * btstack_audio_portaudio_sink_get_instance(void); +const btstack_audio_source_t * btstack_audio_portaudio_source_get_instance(void); + +//const btstack_audio_t * btstack_audio_embedded_get_instance(void); +//const btstack_audio_t * btstack_audio_esp32_get_instance(void); #if defined __cplusplus }