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


/**
 * @brief Универсальный апсэмплинг звукового блока до целевой частоты 32 кГц.
 * 
 * @param src           Указатель на исходный (входной) буфер данных.
 * @param dst           Указатель на целевой (выходной) буфер данных (должен быть заранее выделен).
 * @param src_channels  Количество каналов записи (1 — моно, 2 — стерео).
 * @param src_framerate Частота дискретизации записи в Гц (например, 8000 или 16000).
 */
void audio_upsample_to_32k(const int16_t *src, int16_t *dst, uint8_t src_channels, uint32_t src_framerate)
{
	/* Целевая частота усилителя всегда 32000 Гц */
	const uint32_t target_framerate = 32000;
	
	/* Вычисляем во сколько раз нужно увеличить частоту (для 8 кГц фактор = 4, для 16 кГц = 2) */
	uint32_t factor = target_framerate / src_framerate;
	
	/* Вычисляем сколько фреймов (отсчетов времени) находится в исходном блоке */
	/* Фрейм — это один полноценный замер (для моно это 1 сэмпл, для стерео — пара сэмплов L+R) */
	uint32_t src_frames = (src_framerate / 10); 
	
	uint32_t dst_idx = 0;

	for (uint32_t f = 0; f < src_frames; f++) {
		/* Для каждого исходного временного фрейма делаем 'factor' копий в выходной буфер */
		for (uint32_t rep = 0; rep < factor; rep++) {
			
			if (src_channels == 2) {
				/* Режим СТЕРЕО: Копируем пару Левый + Правый каналы */
				dst[dst_idx]     = src[f * 2];     // Левый
				dst[dst_idx + 1] = src[f * 2 + 1]; // Правый
				dst_idx += 2;
			} else {
				/* Режим МОНО: TFA9882 ожидает данные по двум каналам шины I2S. */
				/* Дублируем моно-сигнал в левый и правый каналы выходного фрейма */
				dst[dst_idx]     = src[f]; // Левый
				dst[dst_idx + 1] = src[f]; // Правый
				dst_idx += 2;
			}
		}
	}
}