changeset 33821:240ab28c7628

Simplify printing of error strings.
author reimar
date Sun, 24 Jul 2011 20:15:53 +0000
parents 4c888b1d8cac
children ac4ba12c8561
files libvo/vo_directx.c
diffstat 1 files changed, 37 insertions(+), 69 deletions(-) [+]
line wrap: on
line diff
--- a/libvo/vo_directx.c	Sun Jul 24 19:52:46 2011 +0000
+++ b/libvo/vo_directx.c	Sun Jul 24 20:15:53 2011 +0000
@@ -164,6 +164,40 @@
     return 0;
 }
 
+struct errmap {
+    HRESULT err;
+    const char *errstr;
+} static const dd_errmap[] = {
+    {DDERR_INCOMPATIBLEPRIMARY, "incompatible primary surface"},
+    {DDERR_INVALIDCAPS, "invalid caps"},
+    {DDERR_INVALIDOBJECT, "invalid object"},
+    {DDERR_INVALIDPARAMS, "invalid parameters"},
+    {DDERR_INVALIDRECT, "invalid rectangle"},
+    {DDERR_INVALIDSURFACETYPE, "invalid surfacetype"},
+    {DDERR_NODIRECTDRAWHW, "no directdraw hardware"},
+    {DDERR_NOEMULATION, "can't emulate"},
+    {DDERR_NOFLIPHW, "hardware can't do flip"},
+    {DDERR_NOOVERLAYHW, "hardware can't do overlay"},
+    {DDERR_NOSTRETCHHW, "hardware can't stretch: try to size the window back"},
+    {DDERR_OUTOFMEMORY, "not enough system memory"},
+    {DDERR_OUTOFVIDEOMEMORY, "not enough video memory"},
+    {DDERR_UNSUPPORTED, "unsupported"},
+    {DDERR_UNSUPPORTEDMODE, "unsupported mode"},
+    {DDERR_HEIGHTALIGN, "height align"},
+    {DDERR_XALIGN, "x align"},
+    {DDERR_SURFACELOST, "surfaces lost"},
+    {0, NULL}
+};
+
+static const char *dd_errstr(HRESULT res)
+{
+    int i;
+    for (i = 0; dd_errmap[i].errstr; i++)
+        if (dd_errmap[i].err == res)
+            return dd_errmap[i].errstr;
+    return "unknown error";
+}
+
 static uint32_t Directx_CreatePrimarySurface(void)
 {
     DDSURFACEDESC2 ddsd = { .dwSize = sizeof(ddsd) };
@@ -237,44 +271,7 @@
         if (ddrval == DDERR_INVALIDPIXELFORMAT)
             mp_msg(MSGT_VO, MSGL_V, "<vo_directx><ERROR> invalid pixelformat: %s\n", g_ddpf[i].img_format_name);
         else
-            mp_msg(MSGT_VO, MSGL_ERR, "<vo_directx><ERROR>");
-        switch (ddrval) {
-        case DDERR_INCOMPATIBLEPRIMARY:
-          mp_msg(MSGT_VO, MSGL_ERR, "incompatible primary surface\n");
-          break;
-        case DDERR_INVALIDCAPS:
-          mp_msg(MSGT_VO, MSGL_ERR, "invalid caps\n");
-          break;
-        case DDERR_INVALIDOBJECT:
-          mp_msg(MSGT_VO, MSGL_ERR, "invalid object\n");
-          break;
-        case DDERR_INVALIDPARAMS:
-          mp_msg(MSGT_VO, MSGL_ERR, "invalid parameters\n");
-          break;
-        case DDERR_NODIRECTDRAWHW:
-          mp_msg(MSGT_VO, MSGL_ERR, "no directdraw hardware\n");
-          break;
-        case DDERR_NOEMULATION:
-          mp_msg(MSGT_VO, MSGL_ERR, "can't emulate\n");
-          break;
-        case DDERR_NOFLIPHW:
-          mp_msg(MSGT_VO, MSGL_ERR, "hardware can't do flip\n");
-          break;
-        case DDERR_NOOVERLAYHW:
-          mp_msg(MSGT_VO, MSGL_ERR, "hardware can't do overlay\n");
-          break;
-        case DDERR_OUTOFMEMORY:
-          mp_msg(MSGT_VO, MSGL_ERR, "not enough system memory\n");
-          break;
-        case DDERR_UNSUPPORTEDMODE:
-          mp_msg(MSGT_VO, MSGL_ERR, "unsupported mode\n");
-          break;
-        case DDERR_OUTOFVIDEOMEMORY:
-          mp_msg(MSGT_VO, MSGL_ERR, "not enough video memory\n");
-          break;
-        default:
-            mp_msg(MSGT_VO, MSGL_ERR, "create surface failed with 0x%x\n", ddrval);
-        }
+            mp_msg(MSGT_VO, MSGL_ERR, "<vo_directx><ERROR>create surface failed: %s (0x%x)\n", dd_errstr(ddrval), ddrval);
         return 1;
     }
     g_lpddsBack = g_lpddsOverlay;
@@ -589,42 +586,13 @@
         // perhaps shrinking the source size
         mp_msg(MSGT_VO, MSGL_ERR, "<vo_directx><ERROR>UpdateOverlay failed\n");
         mp_msg(MSGT_VO, MSGL_ERR, "<vo_directx><ERROR>Overlay:x1:%i,y1:%i,x2:%i,y2:%i,w:%i,h:%i\n", rd.left, rd.top, rd.right, rd.bottom, rd.right - rd.left, rd.bottom - rd.top);
-        mp_msg(MSGT_VO, MSGL_ERR, "<vo_directx><ERROR>");
-        switch (ddrval) {
-        case DDERR_NOSTRETCHHW:
-          mp_msg(MSGT_VO, MSGL_ERR, "hardware can't stretch: try to size the window back\n");
-          break;
-        case DDERR_INVALIDRECT:
-          mp_msg(MSGT_VO, MSGL_ERR, "invalid rectangle\n");
-          break;
-        case DDERR_INVALIDPARAMS:
-          mp_msg(MSGT_VO, MSGL_ERR, "invalid parameters\n");
-          break;
-        case DDERR_HEIGHTALIGN:
-          mp_msg(MSGT_VO, MSGL_ERR, "height align\n");
-          break;
-        case DDERR_XALIGN:
-          mp_msg(MSGT_VO, MSGL_ERR, "x align\n");
-          break;
-        case DDERR_UNSUPPORTED:
-          mp_msg(MSGT_VO, MSGL_ERR, "unsupported\n");
-          break;
-        case DDERR_INVALIDSURFACETYPE:
-          mp_msg(MSGT_VO, MSGL_ERR, "invalid surfacetype\n");
-          break;
-        case DDERR_INVALIDOBJECT:
-          mp_msg(MSGT_VO, MSGL_ERR, "invalid object\n");
-          break;
-        case DDERR_SURFACELOST:
-            mp_msg(MSGT_VO, MSGL_ERR, "surfaces lost\n");
+        mp_msg(MSGT_VO, MSGL_ERR, "<vo_directx><ERROR>%s (0x%x)\n", dd_errstr(ddrval), ddrval);
+        if (ddrval == DDERR_SURFACELOST) {
             g_lpddsOverlay->lpVtbl->Restore(g_lpddsOverlay);                               //restore and try again
             g_lpddsPrimary->lpVtbl->Restore(g_lpddsPrimary);
             ddrval = g_lpddsOverlay->lpVtbl->UpdateOverlay(g_lpddsOverlay, &rs, g_lpddsPrimary, &rd, dwUpdateFlags, &ovfx);
             if (ddrval != DD_OK)
                 mp_msg(MSGT_VO, MSGL_FATAL, "<vo_directx><FATAL ERROR>UpdateOverlay failed again\n");
-            break;
-        default:
-            mp_msg(MSGT_VO, MSGL_ERR, " 0x%x\n", ddrval);
         }
         /*ok we can't do anything about it -> hide overlay*/
         if (ddrval != DD_OK) {