#include <pjsua-lib/pjsua.h>
static pj_status_t force_reopen_sound_device(unsigned clock_rate, unsigned channel_count, unsigned samples_per_frame)
{
pjsua_snd_dev_param param;
pj_status_t status;
printf("[AUDIO_REOPEN] Reopening via pjsua_set_snd_dev2 to %u Hz, SPF: %u...\n", clock_rate, samples_per_frame);
/* 1. Инициализируем структуру дефолтными значениями */
pjsua_snd_dev_param_default(¶m); // Вызов занулит структуру и поставит дефолтные ID девайсов
/* 2. Подтягиваем текущие рабочие ID устройств и режим pjsua */
pjsua_get_snd_dev2(¶m);
/* 3. Явно перезаписываем девайсы на те, которые реально используются в pjsua_var */
param.capture_dev = pjsua_var.cap_dev;
param.playback_dev = pjsua_var.play_dev;
/* 4. Убеждаемся, что устройство откроется прямо сейчас */
param.mode &= ~PJSUA_SND_DEV_NO_IMMEDIATE_OPEN;
/* 5. ХАК: Синхронизируем глобальный конфиг, так как внутренности моста привязаны к нему */
pjsua_var.media_cfg.snd_clock_rate = clock_rate;
pjsua_var.media_cfg.clock_rate = clock_rate;
pjsua_var.media_cfg.samples_per_frame = samples_per_frame;
pjsua_var.media_cfg.channel_count = channel_count;
/* 6. ГЛАВНОЕ: Передаем измененный медиа-конфиг напрямую в структуру переоткрытия девайса */
pj_memcpy(¶m.media_cfg, &pjsua_var.media_cfg, sizeof(pjsua_media_config));
/* 7. Вызываем официальное глубокое переоткрытие.
* Эта функция уничтожит старый snd_port, закроет старый аудио-стрим,
* возьмет переданные нами param.media_cfg.clock_rate, спустит их в I2S-драйвер Zephyr,
* создаст новый звуковой порт моста и сама обновит pjsua_var.snd_port!
*/
status = pjsua_set_snd_dev2(¶m);
if (status != PJ_SUCCESS) {
printf("[AUDIO_REOPEN] Error: pjsua_set_snd_dev2 failed: %d\n", status);
} else {
printf("[AUDIO_REOPEN] Success! Sound hardware and PJSIP layers re-initialized at %u Hz\n", clock_rate);
}
return status;
}