test: use stride feature

This commit is contained in:
Matthias Ringwald 2022-04-22 09:56:31 +02:00
parent e40ee29a88
commit c3e2434db7
6 changed files with 36 additions and 86 deletions

View File

@ -212,7 +212,7 @@ int main (int argc, const char * argv[]){
uint8_t tmp_BEC_detect;
uint8_t BFI = 0;
uint8_t status = lc3_decoder->decode_signed_16(&decoder_contexts[channel], read_buffer, bytes_per_frame, BFI, &pcm[channel * MAX_SAMPLES_PER_FRAME], 1, &tmp_BEC_detect);
uint8_t status = lc3_decoder->decode_signed_16(&decoder_contexts[channel], read_buffer, bytes_per_frame, BFI, &pcm[channel], num_channels, &tmp_BEC_detect);
if (status != ERROR_CODE_SUCCESS){
printf("Error %u\n", status);
done = true;
@ -222,14 +222,7 @@ int main (int argc, const char * argv[]){
if (done) break;
uint16_t sample;
int16_t wav_frame[MAX_NUM_CHANNELS];
for (sample = 0 ; sample < number_samples_per_frame ; sample++){
for (channel = 0; channel < num_channels; channel++) {
wav_frame[channel] = pcm[channel * MAX_SAMPLES_PER_FRAME + sample];
}
wav_writer_write_int16(num_channels, wav_frame);
}
wav_writer_write_int16(num_channels * number_samples_per_frame, pcm);
frame_count++;
}

View File

@ -60,7 +60,6 @@
static uint8_t write_buffer[200];
static int16_t samples_buffer[MAX_SAMPLES_PER_FRAME + MAX_NUM_CHANNELS];
static int16_t frame_buffer[MAX_SAMPLES_PER_FRAME];
static uint32_t frame_count = 0;
@ -164,11 +163,7 @@ int main (int argc, const char * argv[]){
// encode frame by frame
for (channel = 0; channel < num_channels ; channel++){
uint16_t sample;
for (sample = 0 ; sample < number_samples_per_frame ; sample++){
frame_buffer[sample] = samples_buffer[ sample * num_channels + channel];
}
status = lc3_encoder->encode_signed_16(&encoder_contexts[channel], frame_buffer, 1, write_buffer, bytes_per_frame);
status = lc3_encoder->encode_signed_16(&encoder_contexts[channel], &samples_buffer[channel], num_channels, write_buffer, bytes_per_frame);
if (status != ERROR_CODE_SUCCESS){
printf("Error %u\n", status);
break;

View File

@ -599,32 +599,20 @@ static void iso_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *p
uint8_t tmp_BEC_detect;
uint8_t BFI = 0;
(void) lc3_decoder->decode_signed_16(&decoder_contexts[bis_channel], &packet[offset], iso_sdu_length, BFI,
&pcm[bis_channel * MAX_SAMPLES_PER_FRAME], 1,
&pcm[bis_channel], num_bis,
&tmp_BEC_detect);
// interleave channel samples
// process complete iso frame
if ((bis_channel + 1) == num_bis) {
uint16_t sample;
int16_t wav_frame[MAX_NUM_BIS];
uint8_t wav_channel;
for (sample = 0; sample < number_samples_per_frame; sample++) {
for (wav_channel = 0; wav_channel < num_bis; wav_channel++) {
wav_frame[wav_channel] = pcm[wav_channel * MAX_SAMPLES_PER_FRAME + sample];
}
// write wav sample
if (lc3_frames < DUMP_LEN_LC3_FRAMES) {
wav_writer_write_int16(num_bis, wav_frame);
}
// store sample in playback buffer
uint32_t bytes_to_store = num_bis * 2;
samples_received++;
if (btstack_ring_buffer_bytes_free(&playback_buffer) >= bytes_to_store) {
btstack_ring_buffer_write(&playback_buffer, (uint8_t *) wav_frame, bytes_to_store);
} else {
samples_dropped++;
}
// write wav samples
wav_writer_write_int16(num_bis * number_samples_per_frame, pcm);
// store samples in playback buffer
uint32_t bytes_to_store = num_bis * number_samples_per_frame * 2;
samples_received += number_samples_per_frame;
if (btstack_ring_buffer_bytes_free(&playback_buffer) >= bytes_to_store) {
btstack_ring_buffer_write(&playback_buffer, (uint8_t *) pcm, bytes_to_store);
} else {
samples_dropped += number_samples_per_frame;
}
}

View File

@ -253,7 +253,6 @@ static uint8_t menu_variant;
static int hxcmod_initialized;
static modcontext mod_context;
static tracker_buffer_state trkbuf;
static int16_t mod_pcm[MAX_NUM_BIS * MAX_SAMPLES_PER_FRAME];
// sine generator
static uint8_t sine_step;
@ -379,7 +378,7 @@ static void generate_audio(void){
uint8_t channel;
for (channel = 0; channel < num_bis; channel++) {
int16_t value = sine_int16[sine_phases[channel]] / 4;
pcm[channel * MAX_SAMPLES_PER_FRAME + sample] = value;
pcm[sample * num_bis + channel] = value;
sine_phases[channel] += sine_step * (1+channel); // second channel, double frequency
if (sine_phases[channel] >= (sizeof(sine_int16) / sizeof(int16_t))) {
sine_phases[channel] = 0;
@ -389,18 +388,12 @@ static void generate_audio(void){
break;
case AUDIO_SOURCE_MODPLAYER:
// mod player configured for stereo
hxcmod_fillbuffer(&mod_context, (unsigned short *) &mod_pcm[0], number_samples_per_frame, &trkbuf);
uint16_t i;
if (num_bis == 1){
hxcmod_fillbuffer(&mod_context, (unsigned short *) pcm, number_samples_per_frame, &trkbuf);
if (num_bis == 1) {
// stereo -> mono
uint16_t i;
for (i=0;i<number_samples_per_frame;i++){
pcm[i] = (mod_pcm[2*i] / 2) + (mod_pcm[2*i+1] / 2);
}
} else {
// sort interleaved samples
for (i=0;i<number_samples_per_frame;i++){
pcm[i] = mod_pcm[2*i];
pcm[MAX_SAMPLES_PER_FRAME+i] = mod_pcm[2*i+1];
pcm[i] = (pcm[2*i] / 2) + (pcm[2*i+1] / 2);
}
}
break;
@ -446,7 +439,7 @@ static void encode_and_send(uint8_t bis_index){
memset(&buffer[9], iso_frame_counter, octets_per_frame - 1);
#else
// encode as lc3
lc3_encoder->encode_signed_16(&encoder_contexts[bis_index], &pcm[bis_index * MAX_SAMPLES_PER_FRAME], 1, &buffer[8], octets_per_frame);
lc3_encoder->encode_signed_16(&encoder_contexts[bis_index], &pcm[bis_index], num_bis, &buffer[8], octets_per_frame);
#endif
// send
hci_send_iso_packet_buffer(4 + 0 + 4 + octets_per_frame);

View File

@ -582,33 +582,21 @@ static void iso_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *p
uint8_t tmp_BEC_detect;
uint8_t BFI = 0;
(void) lc3_decoder->decode_signed_16(&decoder_contexts[channel], &packet[offset], octets_per_frame, BFI,
&pcm[channel * MAX_SAMPLES_PER_FRAME], 1,
&pcm[channel], num_channels,
&tmp_BEC_detect);
offset += octets_per_frame;
}
// interleave channel samples
uint16_t sample;
int16_t wav_frame[MAX_CHANNELS];
uint8_t wav_channel;
for (sample = 0; sample < number_samples_per_frame; sample++) {
for (wav_channel = 0; wav_channel < num_channels; wav_channel++) {
wav_frame[wav_channel] = pcm[wav_channel * MAX_SAMPLES_PER_FRAME + sample];
}
// write wav samples
wav_writer_write_int16(num_channels * number_samples_per_frame, pcm);
// write wav sample
if (lc3_frames < DUMP_LEN_LC3_FRAMES) {
wav_writer_write_int16(num_channels, wav_frame);
}
// store sample in playback buffer
uint32_t bytes_to_store = num_channels * 2;
samples_received++;
if (btstack_ring_buffer_bytes_free(&playback_buffer) >= bytes_to_store) {
btstack_ring_buffer_write(&playback_buffer, (uint8_t *) wav_frame, bytes_to_store);
} else {
samples_dropped++;
}
// store samples in playback buffer
uint32_t bytes_to_store = num_channels * number_samples_per_frame * 2;
samples_received += number_samples_per_frame;
if (btstack_ring_buffer_bytes_free(&playback_buffer) >= bytes_to_store) {
btstack_ring_buffer_write(&playback_buffer, (uint8_t *) pcm, bytes_to_store);
} else {
samples_dropped += number_samples_per_frame;
}
log_info("Samples in playback buffer %5u", btstack_ring_buffer_bytes_available(&playback_buffer) / (num_channels * 2));

View File

@ -170,7 +170,6 @@ static uint8_t menu_variant;
static int hxcmod_initialized;
static modcontext mod_context;
static tracker_buffer_state trkbuf;
static int16_t mod_pcm[MAX_CHANNELS * MAX_SAMPLES_PER_FRAME];
// sine generator
static uint8_t sine_step;
@ -296,7 +295,7 @@ static void generate_audio(void){
uint8_t channel;
for (channel = 0; channel < num_channels; channel++) {
int16_t value = sine_int16[sine_phases[channel]] / 4;
pcm[channel * MAX_SAMPLES_PER_FRAME + sample] = value;
pcm[sample * num_channels + channel] = value;
sine_phases[channel] += sine_step * (1+channel); // second channel, double frequency
if (sine_phases[channel] >= (sizeof(sine_int16) / sizeof(int16_t))) {
sine_phases[channel] = 0;
@ -306,18 +305,12 @@ static void generate_audio(void){
break;
case AUDIO_SOURCE_MODPLAYER:
// mod player configured for stereo
hxcmod_fillbuffer(&mod_context, (unsigned short *) &mod_pcm[0], number_samples_per_frame, &trkbuf);
uint16_t i;
if (num_channels == 1){
hxcmod_fillbuffer(&mod_context, (unsigned short *) pcm, number_samples_per_frame, &trkbuf);
if (num_channels == 1) {
// stereo -> mono
uint16_t i;
for (i=0;i<number_samples_per_frame;i++){
pcm[i] = (mod_pcm[2*i] / 2) + (mod_pcm[2*i+1] / 2);
}
} else {
// sort interleaved samples
for (i=0;i<number_samples_per_frame;i++){
pcm[i] = mod_pcm[2*i];
pcm[MAX_SAMPLES_PER_FRAME+i] = mod_pcm[2*i+1];
pcm[i] = (pcm[2*i] / 2) + (pcm[2*i+1] / 2);
}
}
break;
@ -366,7 +359,7 @@ static void encode_and_send(uint8_t cis_index){
uint8_t channel;
uint16_t offset = 8;
for (channel = 0; channel < num_channels; channel++){
lc3_encoder->encode_signed_16(&encoder_contexts[channel], &pcm[channel * MAX_SAMPLES_PER_FRAME], 1, &buffer[offset], octets_per_frame);
lc3_encoder->encode_signed_16(&encoder_contexts[channel], &pcm[channel], num_channels, &buffer[offset], octets_per_frame);
offset += octets_per_frame;
}
#endif