static int FindDevicesCallback(vlc_object_t *object, const char *name, char ***values, char ***descs) { enum_context_t ctx; ctx.values = xmalloc(sizeof(char *)); ctx.descs = xmalloc(sizeof(char *)); ctx.values[0] = strdup(""); ctx.descs[0] = strdup(_("Default")); ctx.count = 1; /* Load direct draw DLL */ HINSTANCE hddraw_dll = LoadLibrary(_T("DDRAW.DLL")); if (hddraw_dll != NULL) { /* Enumerate displays */ HRESULT (WINAPI *OurDirectDrawEnumerateEx)(LPDDENUMCALLBACKEXA, LPVOID, DWORD) = (void *)GetProcAddress(hddraw_dll, DIRECTDRAWENUMERATEEX_NAME); if (OurDirectDrawEnumerateEx != NULL) OurDirectDrawEnumerateEx(DirectXEnumCallback2, &ctx, DDENUM_ATTACHEDSECONDARYDEVICES); FreeLibrary(hddraw_dll); } VLC_UNUSED(object); VLC_UNUSED(name); *values = ctx.values; *descs = ctx.descs; return ctx.count; }
static int FindDevicesCallback(vlc_object_t *object, char const *name, vlc_value_t newval, vlc_value_t oldval, void *data) { VLC_UNUSED(newval); VLC_UNUSED(oldval); VLC_UNUSED(data); module_config_t *item = config_FindConfig(object, name); if (!item) return VLC_SUCCESS; /* Clear-up the current list */ if (item->i_list > 0) { int i; /* Keep the first entry */ for (i = 1; i < item->i_list; i++) { free(item->ppsz_list[i]); free(item->ppsz_list_text[i]); } /* TODO: Remove when no more needed */ item->ppsz_list[i] = NULL; item->ppsz_list_text[i] = NULL; } item->i_list = 1; /* Load direct draw DLL */ HINSTANCE hddraw_dll = LoadLibrary(_T("DDRAW.DLL")); if (!hddraw_dll) return VLC_SUCCESS; /* Enumerate displays */ HRESULT (WINAPI *OurDirectDrawEnumerateEx)(LPDDENUMCALLBACKEXA, LPVOID, DWORD) = (void *)GetProcAddress(hddraw_dll, _T("DirectDrawEnumerateExA")); if (OurDirectDrawEnumerateEx) OurDirectDrawEnumerateEx(DirectXEnumCallback2, item, DDENUM_ATTACHEDSECONDARYDEVICES); FreeLibrary(hddraw_dll); /* Signal change to the interface */ item->b_dirty = true; return VLC_SUCCESS; }
static int DirectXOpenDDraw(vout_display_t *vd) { vout_display_sys_t *sys = vd->sys; HRESULT hr; /* */ HRESULT (WINAPI *OurDirectDrawCreate)(GUID *,LPDIRECTDRAW *,IUnknown *); OurDirectDrawCreate = (void *)GetProcAddress(sys->hddraw_dll, _T("DirectDrawCreate")); if (!OurDirectDrawCreate) { msg_Err(vd, "DirectXInitDDraw failed GetProcAddress"); return VLC_EGENERIC; } /* */ HRESULT (WINAPI *OurDirectDrawEnumerateEx)(LPDDENUMCALLBACKEXA, LPVOID, DWORD); OurDirectDrawEnumerateEx = (void *)GetProcAddress(sys->hddraw_dll, _T("DirectDrawEnumerateExA")); if (OurDirectDrawEnumerateEx) { char *device = var_GetString(vd, "directx-device"); if (device) { msg_Dbg(vd, "directx-device: %s", device); free(device); } sys->hmonitor = MonitorFromWindow(sys->hwnd, MONITOR_DEFAULTTONEAREST); /* Enumerate displays */ OurDirectDrawEnumerateEx(DirectXOpenDDrawCallback, vd, DDENUM_ATTACHEDSECONDARYDEVICES); } /* Initialize DirectDraw now */ LPDIRECTDRAW ddobject; hr = OurDirectDrawCreate(sys->display_driver, &ddobject, NULL); if (hr != DD_OK) { msg_Err(vd, "DirectXInitDDraw cannot initialize DDraw"); return VLC_EGENERIC; } /* Get the IDirectDraw2 interface */ hr = IDirectDraw_QueryInterface(ddobject, &IID_IDirectDraw2, &sys->ddobject); /* Release the unused interface */ IDirectDraw_Release(ddobject); if (hr != DD_OK) { msg_Err(vd, "cannot get IDirectDraw2 interface"); sys->ddobject = NULL; return VLC_EGENERIC; } /* Set DirectDraw Cooperative level, ie what control we want over Windows * display */ hr = IDirectDraw2_SetCooperativeLevel(sys->ddobject, NULL, DDSCL_NORMAL); if (hr != DD_OK) { msg_Err(vd, "cannot set direct draw cooperative level"); return VLC_EGENERIC; } /* Get the size of the current display device */ if (sys->hmonitor) { MONITORINFO monitor_info; monitor_info.cbSize = sizeof(MONITORINFO); GetMonitorInfoA(vd->sys->hmonitor, &monitor_info); sys->rect_display = monitor_info.rcMonitor; } else { sys->rect_display.left = 0; sys->rect_display.top = 0; sys->rect_display.right = GetSystemMetrics(SM_CXSCREEN); sys->rect_display.bottom = GetSystemMetrics(SM_CYSCREEN); } msg_Dbg(vd, "screen dimensions (%lix%li,%lix%li)", sys->rect_display.left, sys->rect_display.top, sys->rect_display.right, sys->rect_display.bottom); /* Probe the capabilities of the hardware */ DirectXGetDDrawCaps(vd); return VLC_SUCCESS; }