pjsip音频设备中文名不全的问题

如题,经过pjsip的接口获得的音频设备名称老是不够长,貌似是编码的问题,可是我怎么改也不对。我看了源码,源码那里是经过C的接口来获取设备名称的(跟c++的很像),看起来是这里的问题。c++

PJ_DEF(const pjmedia_snd_dev_info*) pjmedia_snd_get_dev_info(unsigned index)
{
    pjmedia_snd_dev_info *oi = &g_sys.info[g_sys.info_counter];
    pjmedia_aud_dev_info di;

    g_sys.info_counter = (g_sys.info_counter+1) % PJ_ARRAY_SIZE(g_sys.info);

    if (pjmedia_aud_dev_get_info(index, &di) != PJ_SUCCESS)
	return NULL;

    pj_bzero(oi, sizeof(*oi));
    pj_ansi_strncpy(oi->name, di.name, sizeof(oi->name));
    oi->name[sizeof(oi->name)-1] = '\0';
    oi->input_count = di.input_count;
    oi->output_count = di.output_count;
    oi->default_samples_per_sec = di.default_samples_per_sec;

    return oi;
}
/* API: Get device information. */
PJ_DEF(pj_status_t) pjmedia_aud_dev_get_info(pjmedia_aud_dev_index id,
					     pjmedia_aud_dev_info *info)
{
    pjmedia_aud_dev_factory *f;
    unsigned index;
    pj_status_t status;

    PJ_ASSERT_RETURN(info && id!=PJMEDIA_AUD_INVALID_DEV, PJ_EINVAL);
    PJ_ASSERT_RETURN(aud_subsys.pf, PJMEDIA_EAUD_INIT);

    status = lookup_dev(id, &f, &index);
    if (status != PJ_SUCCESS)
	return status;

    return f->op->get_dev_info(f, index, info);
}

下面很差跟了,直接定位到了最根本的那里web

static void get_dev_names(pjmedia_aud_dev_factory *f)
{
    struct wmme_factory *wf = (struct wmme_factory*)f;
    HRESULT              coinit = S_OK;
    HRESULT              hr = S_OK;
    IMMDeviceEnumerator *pEnumerator = NULL;
    IMMDeviceCollection *pDevices = NULL;
    UINT                 cDevices = 0;
    UINT                 nDevice = 0;

    coinit = CoInitializeEx(NULL, COINIT_MULTITHREADED);
    if (coinit == RPC_E_CHANGED_MODE)
	coinit = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
    if (FAILED(coinit))
	goto on_error;

    hr = CoCreateInstance(&CLSID_MMDeviceEnumerator, NULL,
			  CLSCTX_INPROC_SERVER, &IID_IMMDeviceEnumerator,
			  (void**)&pEnumerator);
    if (FAILED(hr))
	goto on_error;
    hr = IMMDeviceEnumerator_EnumAudioEndpoints(pEnumerator, eAll,
						DEVICE_STATE_ACTIVE,
						&pDevices);
    if (FAILED(hr))
	goto on_error;
    hr = IMMDeviceCollection_GetCount(pDevices, &cDevices);
    if (FAILED(hr))
	goto on_error;

    for (nDevice = 0; nDevice < cDevices; ++nDevice) {
	IMMDevice      *pDevice = NULL;
	IPropertyStore *pProps = NULL;
	LPWSTR          pwszID = NULL;
	PROPVARIANT     varName;
	unsigned        i;

	PropVariantInit(&varName);

	hr = IMMDeviceCollection_Item(pDevices, nDevice, &pDevice);
	if (FAILED(hr))
	    goto cleanup;
	hr = IMMDevice_GetId(pDevice, &pwszID);
	if (FAILED(hr))
	    goto cleanup;
	hr = IMMDevice_OpenPropertyStore(pDevice, STGM_READ, &pProps);
	if (FAILED(hr))
	    goto cleanup;
	hr = IPropertyStore_GetValue(pProps, &PKEY_Device_FriendlyName,
				     &varName);
	if (FAILED(hr))
	    goto cleanup;

	for (i = 0; i < wf->dev_count; ++i) {
	    if (0 == wcscmp(wf->dev_info[i].endpointId, pwszID)) {
			pj_unicode_to_ansi(varName.pwszVal,
					wcslen(varName.pwszVal), 
					wf->dev_info[i].info.name, 
				   sizeof(wf->dev_info[i].info.name));
		break;
	    }
	}
	
	PropVariantClear(&varName);

    cleanup:
	if (pProps)
	    IPropertyStore_Release(pProps);
	if (pwszID)
	    CoTaskMemFree(pwszID);
	if (pDevice)
	    hr = IMMDevice_Release(pDevice);
    }

on_error:
    if (pDevices)
	hr = IMMDeviceCollection_Release(pDevices);

    if (pEnumerator)
	hr = IMMDeviceEnumerator_Release(pEnumerator);

    if (SUCCEEDED(coinit))
	CoUninitialize();
}

放弃了,我暂时没找到方法调试。svg