如题,经过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