while (k_sem_take(&toggle_transfer, K_NO_WAIT) == -EBUSY) {
void *mem_block_rx;
void *mem_block_tx;
size_t block_size_rx;
int ret;
/* 1. Читаем блок 16 кГц с микрофона кодека */
ret = i2s_read(i2s_dev_rx, &mem_block_rx, &block_size_rx);
if (ret < 0) break;
/* Обрабатываем эхо на частоте 16 кГц */
process_block_data(mem_block_rx, block_size_rx / BYTES_PER_SAMPLE);
/* 2. Выделяем новый чистый блок под отправку на 32 кГц */
ret = k_mem_slab_alloc(&mem_slab_tx, &mem_block_tx, K_NO_WAIT);
if (ret < 0) {
k_mem_slab_free(&mem_slab_rx, mem_block_rx);
break;
}
/* 3. Простейший Upsampling х2 (Повторение стерео-сэмплов) */
int16_t *src = (int16_t *)mem_block_rx;
int16_t *dst = (int16_t *)mem_block_tx;
int samples_count = block_size_rx / BYTES_PER_SAMPLE; // Всего отсчетов (L+R)
for (int i = 0; i < samples_count; i += 2) {
int16_t left_channel = src[i];
int16_t right_channel = src[i+1];
// Первая копия стерео-пары
dst[2*i] = left_channel;
dst[2*i + 1] = right_channel;
// Вторая копия стерео-пары (удвоение частоты)
dst[2*i + 2] = left_channel;
dst[2*i + 3] = right_channel;
}
/* Освобождаем входной RX-блок, он больше не нужен */
k_mem_slab_free(&mem_slab_rx, mem_block_rx);
/* 4. Отправляем готовый апсэмпленный блок 32 кГц на TFA9882 */
ret = i2s_write(i2s_dev_tx, mem_block_tx, BLOCK_SIZE_TX);
if (ret < 0) {
k_mem_slab_free(&mem_slab_tx, mem_block_tx);
break;
}
}