如题,通过pjsip的接口得到的音频设备名称总是不够长,貌似是编码的问题,但是我怎么改也不对。我看了源码,源码那里是通过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);
}
下面不好跟了,直接定位到了最根本的那里
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();
}
放弃了,我暂时没找到方法调试。