xref: /btstack/platform/embedded/hal_audio.h (revision 80e33422a96c028b3a9c308fc4b9b874712dafb4)
1fa6e8062SMatthias Ringwald /*
2fa6e8062SMatthias Ringwald  * Copyright (C) 2018 BlueKitchen GmbH
3fa6e8062SMatthias Ringwald  *
4fa6e8062SMatthias Ringwald  * Redistribution and use in source and binary forms, with or without
5fa6e8062SMatthias Ringwald  * modification, are permitted provided that the following conditions
6fa6e8062SMatthias Ringwald  * are met:
7fa6e8062SMatthias Ringwald  *
8fa6e8062SMatthias Ringwald  * 1. Redistributions of source code must retain the above copyright
9fa6e8062SMatthias Ringwald  *    notice, this list of conditions and the following disclaimer.
10fa6e8062SMatthias Ringwald  * 2. Redistributions in binary form must reproduce the above copyright
11fa6e8062SMatthias Ringwald  *    notice, this list of conditions and the following disclaimer in the
12fa6e8062SMatthias Ringwald  *    documentation and/or other materials provided with the distribution.
13fa6e8062SMatthias Ringwald  * 3. Neither the name of the copyright holders nor the names of
14fa6e8062SMatthias Ringwald  *    contributors may be used to endorse or promote products derived
15fa6e8062SMatthias Ringwald  *    from this software without specific prior written permission.
16fa6e8062SMatthias Ringwald  * 4. Any redistribution, use, or modification is done solely for
17fa6e8062SMatthias Ringwald  *    personal benefit and not for any commercial purpose or for
18fa6e8062SMatthias Ringwald  *    monetary gain.
19fa6e8062SMatthias Ringwald  *
20fa6e8062SMatthias Ringwald  * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS
21fa6e8062SMatthias Ringwald  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22fa6e8062SMatthias Ringwald  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23fa6e8062SMatthias Ringwald  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS
24fa6e8062SMatthias Ringwald  * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25fa6e8062SMatthias Ringwald  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
26fa6e8062SMatthias Ringwald  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
27fa6e8062SMatthias Ringwald  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
28fa6e8062SMatthias Ringwald  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29fa6e8062SMatthias Ringwald  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
30fa6e8062SMatthias Ringwald  * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31fa6e8062SMatthias Ringwald  * SUCH DAMAGE.
32fa6e8062SMatthias Ringwald  *
33fa6e8062SMatthias Ringwald  * Please inquire about commercial licensing options at
34fa6e8062SMatthias Ringwald  * [email protected]
35fa6e8062SMatthias Ringwald  *
36fa6e8062SMatthias Ringwald  */
37fa6e8062SMatthias Ringwald 
38*80e33422SMatthias Ringwald #ifndef HAL_AUDIO_H
39*80e33422SMatthias Ringwald #define HAL_AUDIO_H
40fa6e8062SMatthias Ringwald 
41fa6e8062SMatthias Ringwald #include <stdint.h>
42fa6e8062SMatthias Ringwald 
43fa6e8062SMatthias Ringwald /*
44fa6e8062SMatthias Ringwald  *  hal_audio.h
45fa6e8062SMatthias Ringwald  *
46fa6e8062SMatthias Ringwald  *  Hardware abstraction layer that provides circular audio playback and recording
47fa6e8062SMatthias Ringwald  *
48fa6e8062SMatthias Ringwald  *  Assumptions:
49fa6e8062SMatthias Ringwald  *  - num buffers n >= 2
50fa6e8062SMatthias Ringwald  *  - after start, buffers are played in sequence 0, 1, ... , n-1, 0, 1, .. , n-1, ...
51fa6e8062SMatthias Ringwald  *  - after a buffer is played, the callback is called with tbe index of the played buffer
52fa6e8062SMatthias Ringwald  */
53fa6e8062SMatthias Ringwald 
54fa6e8062SMatthias Ringwald /**
55ff0081eeSMatthias Ringwald  * @brief Setup audio codec for playback using specified samplerate and number of channels
56fa6e8062SMatthias Ringwald  * @param Channels
57fa6e8062SMatthias Ringwald  * @param Sample rate
58fa6e8062SMatthias Ringwald  * @param Buffer played callback
59fa6e8062SMatthias Ringwald  */
60ff0081eeSMatthias Ringwald void hal_audio_sink_init(uint8_t channels,
61fa6e8062SMatthias Ringwald                          uint32_t sample_rate,
62ff0081eeSMatthias Ringwald                          void (*buffer_played_callback)(uint8_t buffer_index));
63fa6e8062SMatthias Ringwald 
64fa6e8062SMatthias Ringwald /**
65fa6e8062SMatthias Ringwald  * @brief Get number of output buffers in HAL
66fa6e8062SMatthias Ringwald  * @returns num buffers
67fa6e8062SMatthias Ringwald  */
68ff0081eeSMatthias Ringwald uint16_t hal_audio_sink_get_num_output_buffers(void);
69fa6e8062SMatthias Ringwald 
70fa6e8062SMatthias Ringwald /**
71fa6e8062SMatthias Ringwald  * @brief Get size of single output buffer in HAL
72fa6e8062SMatthias Ringwald  * @returns buffer size
73fa6e8062SMatthias Ringwald  */
74ff0081eeSMatthias Ringwald uint16_t hal_audio_sink_get_num_output_buffer_samples(void);
75fa6e8062SMatthias Ringwald 
76fa6e8062SMatthias Ringwald /**
77ff0081eeSMatthias Ringwald  * @brief Get output buffer
78fa6e8062SMatthias Ringwald  * @param buffer index
79fa6e8062SMatthias Ringwald  * @returns buffer
80fa6e8062SMatthias Ringwald  */
81ff0081eeSMatthias Ringwald int16_t * hal_audio_sink_get_output_buffer(uint8_t buffer_index);
82fa6e8062SMatthias Ringwald 
83fa6e8062SMatthias Ringwald /**
84fa6e8062SMatthias Ringwald  * @brief Start stream
85fa6e8062SMatthias Ringwald  */
86ff0081eeSMatthias Ringwald void hal_audio_sink_start(void);
87ff0081eeSMatthias Ringwald 
88ff0081eeSMatthias Ringwald /**
89ff0081eeSMatthias Ringwald  * @brief Stop stream
90ff0081eeSMatthias Ringwald  */
91ff0081eeSMatthias Ringwald void hal_audio_sink_stop(void);
92fa6e8062SMatthias Ringwald 
93fa6e8062SMatthias Ringwald /**
94fa6e8062SMatthias Ringwald  * @brief Close audio codec
95fa6e8062SMatthias Ringwald  */
96ff0081eeSMatthias Ringwald void hal_audio_sink_close(void);
97ff0081eeSMatthias Ringwald 
98ff0081eeSMatthias Ringwald 
99ff0081eeSMatthias Ringwald /**
100ff0081eeSMatthias Ringwald  * @brief Setup audio codec for recording using specified samplerate and number of channels
101ff0081eeSMatthias Ringwald  * @param Channels
102ff0081eeSMatthias Ringwald  * @param Sample rate
103ff0081eeSMatthias Ringwald  * @param Buffer recorded callback
104ff0081eeSMatthias Ringwald  */
105ff0081eeSMatthias Ringwald void hal_audio_source_init(uint8_t channels,
106ff0081eeSMatthias Ringwald                            uint32_t sample_rate,
107ff0081eeSMatthias Ringwald                            void (*buffer_recorded_callback)(const int16_t * buffer, uint16_t num_samples));
108ff0081eeSMatthias Ringwald 
109ff0081eeSMatthias Ringwald /**
110ff0081eeSMatthias Ringwald  * @brief Start stream
111ff0081eeSMatthias Ringwald  */
112ff0081eeSMatthias Ringwald void hal_audio_source_start(void);
113ff0081eeSMatthias Ringwald 
114ff0081eeSMatthias Ringwald /**
115ff0081eeSMatthias Ringwald  * @brief Stop stream
116ff0081eeSMatthias Ringwald  */
117ff0081eeSMatthias Ringwald void hal_audio_source_stop(void);
118ff0081eeSMatthias Ringwald 
119ff0081eeSMatthias Ringwald /**
120ff0081eeSMatthias Ringwald  * @brief Close audio codec
121ff0081eeSMatthias Ringwald  */
122ff0081eeSMatthias Ringwald void hal_audio_source_close(void);
123fa6e8062SMatthias Ringwald 
124fa6e8062SMatthias Ringwald #endif
125