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


#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(&param); // Вызов занулит структуру и поставит дефолтные ID девайсов
    
    /* 2. Подтягиваем текущие рабочие ID устройств и режим pjsua */
    pjsua_get_snd_dev2(&param); 
    
    /* 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(&param.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(&param);
    
    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;
}