first mono support (still glitches in audio)

This commit is contained in:
Anthony Rabine 2023-08-12 15:50:34 +02:00
parent 9e73d71f4b
commit a8c5ac4ba0
2 changed files with 13 additions and 19 deletions

View file

@ -21,7 +21,7 @@ void pico_i2s_set_frequency(const pio_i2s *i2s, const audio_i2s_config_t *config
// Pour le calcul de la fréquence, le nombre de canaux est toujours fixé à 2 // Pour le calcul de la fréquence, le nombre de canaux est toujours fixé à 2
// car c'est notre format de sortie I2S // car c'est notre format de sortie I2S
// Dans le cas du mono, on l'a détecté en amont et on a copié l'échantillon dans la voie de droite // Dans le cas du mono, on l'a détecté en amont et on a copié l'échantillon dans la voie de droite
float bitClk = config->freq * config->bps * config->channels /* channels */ * 2.0 /* edges per clock */; float bitClk = config->freq * config->bps * 2.0 /* channels */ * 2.0 /* edges per clock */;
pio_sm_set_clkdiv(i2s->pio, i2s->sm_dout, (float)clock_get_hz(clk_sys) / bitClk); pio_sm_set_clkdiv(i2s->pio, i2s->sm_dout, (float)clock_get_hz(clk_sys) / bitClk);
} }

View file

@ -176,12 +176,15 @@ static int get_audio_buf(audio_ctx_t *ctx, int32_t *buf_32b)
uint32_t lvl_l = 0; uint32_t lvl_l = 0;
uint32_t lvl_r = 0; uint32_t lvl_r = 0;
bool mono = ctx->audio_info.channels == 1;
number = 0; // number to transfer (en octets) number = 0; // number to transfer (en octets)
while (number < sizeof(raw_buf)) int raw_max_size = mono ? sizeof(raw_buf) / 2 : sizeof(raw_buf);
while (number < raw_max_size)
{ {
file_rest = ctx->audio_info.data_size - ctx->audio_info.data_offset; file_rest = ctx->audio_info.data_size - ctx->audio_info.data_offset;
trans_rest = sizeof(raw_buf) - number; // en octets, 2048 au début trans_rest = raw_max_size - number; // en octets, 2048 au début
trans = (file_rest >= trans_rest) ? trans_rest : file_rest; trans = (file_rest >= trans_rest) ? trans_rest : file_rest;
// LEDR(1); // LEDR(1);
fr = f_read(&ctx->fil, &raw_buf[number], trans, &br); fr = f_read(&ctx->fil, &raw_buf[number], trans, &br);
@ -206,41 +209,32 @@ static int get_audio_buf(audio_ctx_t *ctx, int32_t *buf_32b)
} }
} }
bool mono = ctx->audio_info.channels == 1; uint32_t index = 0;
uint32_t index = 4;
if (mono)
{
index = 2;
}
// samples : total bytes devided by 2 (16 bits) and by two again (2 channels) // samples : total bytes devided by 2 (16 bits) and by two again (2 channels)
for (i = 0; i < number / index; i++) for (i = 0; i < STEREO_BUFFER_SIZE / 2; i++)
{ {
// buf_32b[i * 2 + 0] = (int32_t)swap16b((int32_t)buf_16b[i * 2 + 0] * vol_table[ctx->volume]) + DAC_ZERO_VALUE; // L // buf_32b[i * 2 + 0] = (int32_t)swap16b((int32_t)buf_16b[i * 2 + 0] * vol_table[ctx->volume]) + DAC_ZERO_VALUE; // L
// buf_32b[i * 2 + 1] = (int32_t)swap16b((int32_t)buf_16b[i * 2 + 1] * vol_table[ctx->volume]) + DAC_ZERO_VALUE; // R // buf_32b[i * 2 + 1] = (int32_t)swap16b((int32_t)buf_16b[i * 2 + 1] * vol_table[ctx->volume]) + DAC_ZERO_VALUE; // R
// Avec le AUDIO PICO de waveshare, on entend un truc buf_32b[i * 2] = ((int32_t)((int16_t)leu16_get(&raw_buf[index]))) << 16;
index += 2;
buf_32b[i * 2] = ((int32_t)((int16_t)leu16_get(&raw_buf[i * index]))) << 16;
if (mono) if (mono)
{ {
buf_32b[i * 2 + 1] = buf_32b[i * 2]; buf_32b[i * 2 + 1] = buf_32b[i * 2];
} }
else else
{ {
buf_32b[i * 2 + 1] = ((int32_t)((int16_t)leu16_get(&raw_buf[i * index + 2]))) << 16; buf_32b[i * 2 + 1] = ((int32_t)((int16_t)leu16_get(&raw_buf[index]))) << 16;
index += 2;
} }
// buf_32b[i * 2] = 1;
// buf_32b[i * 2 + 1] = 4;
// lvl_l += ((int32_t)buf_16b[i * 2 + 0] * buf_16b[i * 2 + 0]) / 32768; // lvl_l += ((int32_t)buf_16b[i * 2 + 0] * buf_16b[i * 2 + 0]) / 32768;
// lvl_r += ((int32_t)buf_16b[i * 2 + 1] * buf_16b[i * 2 + 1]) / 32768; // lvl_r += ((int32_t)buf_16b[i * 2 + 1] * buf_16b[i * 2 + 1]) / 32768;
} }
// ctx->audio_info.lvl_l = get_level(lvl_l / (number / 4)); // ctx->audio_info.lvl_l = get_level(lvl_l / (number / 4));
// ctx->audio_info.lvl_r = get_level(lvl_r / (number / 4)); // ctx->audio_info.lvl_r = get_level(lvl_r / (number / 4));
ctx->transfer_size = number / 2; // 32 bytes tranfers ctx->transfer_size = STEREO_BUFFER_SIZE; // 32 bytes tranfers
return _next_is_end; return _next_is_end;
} }