123a1bbc3SMatthias Ringwald /* 223a1bbc3SMatthias Ringwald * Copyright (C) 2017 BlueKitchen GmbH 323a1bbc3SMatthias Ringwald * 423a1bbc3SMatthias Ringwald * Redistribution and use in source and binary forms, with or without 523a1bbc3SMatthias Ringwald * modification, are permitted provided that the following conditions 623a1bbc3SMatthias Ringwald * are met: 723a1bbc3SMatthias Ringwald * 823a1bbc3SMatthias Ringwald * 1. Redistributions of source code must retain the above copyright 923a1bbc3SMatthias Ringwald * notice, this list of conditions and the following disclaimer. 1023a1bbc3SMatthias Ringwald * 2. Redistributions in binary form must reproduce the above copyright 1123a1bbc3SMatthias Ringwald * notice, this list of conditions and the following disclaimer in the 1223a1bbc3SMatthias Ringwald * documentation and/or other materials provided with the distribution. 1323a1bbc3SMatthias Ringwald * 3. Neither the name of the copyright holders nor the names of 1423a1bbc3SMatthias Ringwald * contributors may be used to endorse or promote products derived 1523a1bbc3SMatthias Ringwald * from this software without specific prior written permission. 1623a1bbc3SMatthias Ringwald * 4. Any redistribution, use, or modification is done solely for 1723a1bbc3SMatthias Ringwald * personal benefit and not for any commercial purpose or for 1823a1bbc3SMatthias Ringwald * monetary gain. 1923a1bbc3SMatthias Ringwald * 2023a1bbc3SMatthias Ringwald * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS 2123a1bbc3SMatthias Ringwald * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2223a1bbc3SMatthias Ringwald * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 232fca4dadSMilanka Ringwald * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BLUEKITCHEN 242fca4dadSMilanka Ringwald * GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 2523a1bbc3SMatthias Ringwald * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 2623a1bbc3SMatthias Ringwald * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 2723a1bbc3SMatthias Ringwald * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 2823a1bbc3SMatthias Ringwald * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 2923a1bbc3SMatthias Ringwald * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 3023a1bbc3SMatthias Ringwald * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3123a1bbc3SMatthias Ringwald * SUCH DAMAGE. 3223a1bbc3SMatthias Ringwald * 3323a1bbc3SMatthias Ringwald * Please inquire about commercial licensing options at 3423a1bbc3SMatthias Ringwald * [email protected] 3523a1bbc3SMatthias Ringwald * 3623a1bbc3SMatthias Ringwald */ 3723a1bbc3SMatthias Ringwald 38fe5a6c4eSMilanka Ringwald /** 39fe5a6c4eSMilanka Ringwald * @title Audio Interface 40fe5a6c4eSMilanka Ringwald * 41fe5a6c4eSMilanka Ringwald * Abstraction layer for 16-bit audio playback and recording within BTstack. 42b57bbaeeSMatthias Ringwald * 43b57bbaeeSMatthias Ringwald * Most embedded implementations, e.g. the one for ESP32, use a single I2S interface which 44b57bbaeeSMatthias Ringwald * requires that the sample rate is the same for sink and source roles 45fe5a6c4eSMilanka Ringwald */ 46fe5a6c4eSMilanka Ringwald 4780e33422SMatthias Ringwald #ifndef BTSTACK_AUDIO_H 4880e33422SMatthias Ringwald #define BTSTACK_AUDIO_H 4923a1bbc3SMatthias Ringwald 5023a1bbc3SMatthias Ringwald #include <stdint.h> 5123a1bbc3SMatthias Ringwald 5223a1bbc3SMatthias Ringwald #if defined __cplusplus 5323a1bbc3SMatthias Ringwald extern "C" { 5423a1bbc3SMatthias Ringwald #endif 5523a1bbc3SMatthias Ringwald 56fe5a6c4eSMilanka Ringwald /* API_START */ 5723a1bbc3SMatthias Ringwald 5823a1bbc3SMatthias Ringwald typedef struct { 5923a1bbc3SMatthias Ringwald 6023a1bbc3SMatthias Ringwald /** 6123a1bbc3SMatthias Ringwald * @brief Setup audio codec for specified samplerate and number of channels 6223a1bbc3SMatthias Ringwald * @param Channels (1=mono, 2=stereo) 6323a1bbc3SMatthias Ringwald * @param Sample rate 6423a1bbc3SMatthias Ringwald * @param Playback callback 65e39d945bSDirk Helbig * @return 1 on success 66e39d945bSDirk Helbig */ 67e39d945bSDirk Helbig int (*init)(uint8_t channels, 68e39d945bSDirk Helbig uint32_t samplerate, 69e39d945bSDirk Helbig void (*playback) (int16_t * buffer, uint16_t num_samples)); 70e39d945bSDirk Helbig 71e39d945bSDirk Helbig /** 726926c297SDirk Helbig * @brief Get the current playback sample rate, may differ from the 736926c297SDirk Helbig * specified sample rate 746926c297SDirk Helbig */ 756926c297SDirk Helbig uint32_t (*get_samplerate)(void); 766926c297SDirk Helbig 776926c297SDirk Helbig /** 781b7f8fa1SMatthias Ringwald * @brief Set volume 791b7f8fa1SMatthias Ringwald * @param Volume 0..127 801b7f8fa1SMatthias Ringwald */ 811b7f8fa1SMatthias Ringwald void (*set_volume)(uint8_t volume); 821b7f8fa1SMatthias Ringwald 831b7f8fa1SMatthias Ringwald /** 84e39d945bSDirk Helbig * @brief Start stream 85e39d945bSDirk Helbig */ 86e39d945bSDirk Helbig void (*start_stream)(void); 87e39d945bSDirk Helbig 88e39d945bSDirk Helbig /** 89e39d945bSDirk Helbig * @brief Stop stream 90e39d945bSDirk Helbig */ 91e39d945bSDirk Helbig void (*stop_stream)(void); 92e39d945bSDirk Helbig 93e39d945bSDirk Helbig /** 94e39d945bSDirk Helbig * @brief Close audio codec 95e39d945bSDirk Helbig */ 96e39d945bSDirk Helbig void (*close)(void); 97e39d945bSDirk Helbig 98e39d945bSDirk Helbig } btstack_audio_sink_t; 99e39d945bSDirk Helbig 100e39d945bSDirk Helbig 101e39d945bSDirk Helbig typedef struct { 102e39d945bSDirk Helbig 103e39d945bSDirk Helbig /** 104e39d945bSDirk Helbig * @brief Setup audio codec for specified samplerate and number of channels 105e39d945bSDirk Helbig * @param Channels (1=mono, 2=stereo) 106e39d945bSDirk Helbig * @param Sample rate 10723a1bbc3SMatthias Ringwald * @param Recording callback 10823a1bbc3SMatthias Ringwald * @return 1 on success 10923a1bbc3SMatthias Ringwald */ 11023a1bbc3SMatthias Ringwald int (*init)(uint8_t channels, 11123a1bbc3SMatthias Ringwald uint32_t samplerate, 11223a1bbc3SMatthias Ringwald void (*recording)(const int16_t * buffer, uint16_t num_samples)); 11323a1bbc3SMatthias Ringwald 11423a1bbc3SMatthias Ringwald /** 1156926c297SDirk Helbig * @brief Get the current recording sample rate, may differ from the 1166926c297SDirk Helbig * specified sameple rate 1176926c297SDirk Helbig */ 1186926c297SDirk Helbig uint32_t (*get_samplerate)(void); 1196926c297SDirk Helbig 1206926c297SDirk Helbig /** 1211b7f8fa1SMatthias Ringwald * @brief Set Gain 1221b7f8fa1SMatthias Ringwald * @param Gain 0..127 1231b7f8fa1SMatthias Ringwald */ 1241b7f8fa1SMatthias Ringwald void (*set_gain)(uint8_t gain); 1251b7f8fa1SMatthias Ringwald 1261b7f8fa1SMatthias Ringwald /** 12723a1bbc3SMatthias Ringwald * @brief Start stream 12823a1bbc3SMatthias Ringwald */ 12923a1bbc3SMatthias Ringwald void (*start_stream)(void); 13023a1bbc3SMatthias Ringwald 13123a1bbc3SMatthias Ringwald /** 132e39d945bSDirk Helbig * @brief Stop stream 133e39d945bSDirk Helbig */ 134e39d945bSDirk Helbig void (*stop_stream)(void); 135e39d945bSDirk Helbig 136e39d945bSDirk Helbig /** 13723a1bbc3SMatthias Ringwald * @brief Close audio codec 13823a1bbc3SMatthias Ringwald */ 13923a1bbc3SMatthias Ringwald void (*close)(void); 14023a1bbc3SMatthias Ringwald 141e39d945bSDirk Helbig } btstack_audio_source_t; 142e39d945bSDirk Helbig 14323a1bbc3SMatthias Ringwald 14423a1bbc3SMatthias Ringwald /** 145e39d945bSDirk Helbig * @brief Get BTstack Audio Sink Instance 1466b65794dSMilanka Ringwald * @return btstack_audio_sink implementation 14723a1bbc3SMatthias Ringwald */ 148e39d945bSDirk Helbig const btstack_audio_sink_t * btstack_audio_sink_get_instance(void); 14923a1bbc3SMatthias Ringwald 15023a1bbc3SMatthias Ringwald /** 151e39d945bSDirk Helbig * @brief Get BTstack Audio Source Instance 1526b65794dSMilanka Ringwald * @return btstack_audio_source implementation 15323a1bbc3SMatthias Ringwald */ 154e39d945bSDirk Helbig const btstack_audio_source_t * btstack_audio_source_get_instance(void); 155e39d945bSDirk Helbig 156e39d945bSDirk Helbig 157e39d945bSDirk Helbig /** 158e39d945bSDirk Helbig * @brief Get BTstack Audio Sink Instance 159e39d945bSDirk Helbig * @param btstack_audio_sink implementation 160e39d945bSDirk Helbig */ 161e39d945bSDirk Helbig void btstack_audio_sink_set_instance(const btstack_audio_sink_t * audio_sink_impl); 162e39d945bSDirk Helbig 163e39d945bSDirk Helbig /** 164e39d945bSDirk Helbig * @brief Get BTstack Audio Source Instance 165e39d945bSDirk Helbig * @param btstack_audio_source implementation 166e39d945bSDirk Helbig */ 167e39d945bSDirk Helbig void btstack_audio_source_set_instance(const btstack_audio_source_t * audio_source_impl); 16823a1bbc3SMatthias Ringwald 16923a1bbc3SMatthias Ringwald 17023a1bbc3SMatthias Ringwald // common implementations 171e39d945bSDirk Helbig const btstack_audio_sink_t * btstack_audio_portaudio_sink_get_instance(void); 172e39d945bSDirk Helbig const btstack_audio_source_t * btstack_audio_portaudio_source_get_instance(void); 173e39d945bSDirk Helbig 17465ec5d42SMatthias Ringwald const btstack_audio_sink_t * btstack_audio_embedded_sink_get_instance(void); 17565ec5d42SMatthias Ringwald const btstack_audio_source_t * btstack_audio_embedded_source_get_instance(void); 17665ec5d42SMatthias Ringwald 17765ec5d42SMatthias Ringwald const btstack_audio_sink_t * btstack_audio_esp32_sink_get_instance(void); 178b57bbaeeSMatthias Ringwald const btstack_audio_source_t * btstack_audio_esp32_source_get_instance(void); 179fe5a6c4eSMilanka Ringwald 180*409f627cSMatthias Ringwald // platform-specific extension 181*409f627cSMatthias Ringwald void btstack_audio_portaudio_sink_set_device(const char * device_name); 182*409f627cSMatthias Ringwald void btstack_audio_portaudio_source_set_device(const char * device_name); 183*409f627cSMatthias Ringwald 184b57bbaeeSMatthias Ringwald /* API_END */ 18523a1bbc3SMatthias Ringwald 18623a1bbc3SMatthias Ringwald #if defined __cplusplus 18723a1bbc3SMatthias Ringwald } 18823a1bbc3SMatthias Ringwald #endif 18923a1bbc3SMatthias Ringwald 19023a1bbc3SMatthias Ringwald #endif 191