Загрузка данных


    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;
        }
    }