mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-02-11 09:40:24 +00:00
embedded: add HAVE_HAL_AUDIO_SINK_STEREO_ONLY
This commit is contained in:
parent
2e62f88c7e
commit
329d55f343
@ -50,6 +50,8 @@ Embedded platform properties:
|
|||||||
-----------------------------------|------------------------------------
|
-----------------------------------|------------------------------------
|
||||||
HAVE_EMBEDDED_TIME_MS | System provides time in milliseconds
|
HAVE_EMBEDDED_TIME_MS | System provides time in milliseconds
|
||||||
HAVE_EMBEDDED_TICK | System provides tick interrupt
|
HAVE_EMBEDDED_TICK | System provides tick interrupt
|
||||||
|
HAVE_HAL_AUDIO | Audio HAL is available
|
||||||
|
HAVE_HAL_AUDIO_SINK_STEREO_ONLY | Duplicate samples for mono playback
|
||||||
|
|
||||||
FreeRTOS platform properties:
|
FreeRTOS platform properties:
|
||||||
|
|
||||||
|
@ -71,10 +71,16 @@ static unsigned int output_buffer_samples;
|
|||||||
static volatile int input_buffer_ready;
|
static volatile int input_buffer_ready;
|
||||||
static volatile const int16_t * input_buffer_samples;
|
static volatile const int16_t * input_buffer_samples;
|
||||||
static volatile uint16_t input_buffer_num_samples;
|
static volatile uint16_t input_buffer_num_samples;
|
||||||
|
static unsigned int output_channels;
|
||||||
|
|
||||||
static int source_active;
|
static int source_active;
|
||||||
static int sink_active;
|
static int sink_active;
|
||||||
|
|
||||||
|
// Support for stereo-only audio hal
|
||||||
|
#ifdef HAVE_HAL_AUDIO_SINK_STEREO_ONLY
|
||||||
|
static bool output_duplicate_samples;
|
||||||
|
#endif
|
||||||
|
|
||||||
static void btstack_audio_audio_played(uint8_t buffer_index){
|
static void btstack_audio_audio_played(uint8_t buffer_index){
|
||||||
output_buffer_to_play = (buffer_index + 1) % output_buffer_count;
|
output_buffer_to_play = (buffer_index + 1) % output_buffer_count;
|
||||||
}
|
}
|
||||||
@ -92,6 +98,18 @@ static void driver_timer_handler_sink(btstack_timer_source_t * ts){
|
|||||||
int16_t * buffer = hal_audio_sink_get_output_buffer(output_buffer_to_fill);
|
int16_t * buffer = hal_audio_sink_get_output_buffer(output_buffer_to_fill);
|
||||||
(*playback_callback)(buffer, output_buffer_samples);
|
(*playback_callback)(buffer, output_buffer_samples);
|
||||||
|
|
||||||
|
#ifdef HAVE_HAL_AUDIO_SINK_STEREO_ONLY
|
||||||
|
if (output_duplicate_samples){
|
||||||
|
unsigned int i = output_buffer_samples;
|
||||||
|
do {
|
||||||
|
i--;
|
||||||
|
int16_t sample = buffer[i];
|
||||||
|
buffer[2*i + 0] = sample;
|
||||||
|
buffer[2*i + 1] = sample;
|
||||||
|
} while ( i > 0 );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// next
|
// next
|
||||||
output_buffer_to_fill = (output_buffer_to_fill + 1 ) % output_buffer_count;
|
output_buffer_to_fill = (output_buffer_to_fill + 1 ) % output_buffer_count;
|
||||||
}
|
}
|
||||||
@ -118,10 +136,14 @@ static int btstack_audio_embedded_sink_init(
|
|||||||
uint32_t samplerate,
|
uint32_t samplerate,
|
||||||
void (*playback)(int16_t * buffer, uint16_t num_samples)
|
void (*playback)(int16_t * buffer, uint16_t num_samples)
|
||||||
){
|
){
|
||||||
if (!playback){
|
btstack_assert(playback != NULL);
|
||||||
log_error("No playback callback");
|
btstack_assert(channels != 0);
|
||||||
return 1;
|
|
||||||
}
|
#ifdef HAVE_HAL_AUDIO_SINK_STEREO_ONLY
|
||||||
|
// always use stereo from hal, duplicate samples if needed
|
||||||
|
output_duplicate_samples = num_channels != 2;
|
||||||
|
channels = 2;
|
||||||
|
#endif
|
||||||
|
|
||||||
playback_callback = playback;
|
playback_callback = playback;
|
||||||
|
|
||||||
@ -159,6 +181,8 @@ static void btstack_audio_embedded_sink_start_stream(void){
|
|||||||
output_buffer_count = hal_audio_sink_get_num_output_buffers();
|
output_buffer_count = hal_audio_sink_get_num_output_buffers();
|
||||||
output_buffer_samples = hal_audio_sink_get_num_output_buffer_samples();
|
output_buffer_samples = hal_audio_sink_get_num_output_buffer_samples();
|
||||||
|
|
||||||
|
btstack_assert(output_buffer_samples > 0);
|
||||||
|
|
||||||
// pre-fill HAL buffers
|
// pre-fill HAL buffers
|
||||||
uint16_t i;
|
uint16_t i;
|
||||||
for (i=0;i<output_buffer_count;i++){
|
for (i=0;i<output_buffer_count;i++){
|
||||||
|
Loading…
x
Reference in New Issue
Block a user