]> git.sesse.net Git - vlc/commitdiff
Messages: add AndroidPrintMsg cb for Android
authorThomas Guillem <thomas@gllm.fr>
Tue, 2 Dec 2014 09:33:49 +0000 (09:33 +0000)
committerJean-Baptiste Kempf <jb@videolan.org>
Wed, 3 Dec 2014 11:05:36 +0000 (12:05 +0100)
On android 5.0, PrintMsg blocks on fprintf when stderr is locked by flockfile.

This commit adds a default log callback for android in order to fix this issue,
and in order to have early logs (before libvlc_log_set is called).

Signed-off-by: Jean-Baptiste Kempf <jb@videolan.org>
src/misc/messages.c

index 14f73f0cadd99551ce9b16e552765f6d95a44ce3..6c04b8cc3ccb5ded884079c8d2edff72b7b71ecf 100644 (file)
 #include <vlc_charset.h>
 #include "../libvlc.h"
 
+#ifdef __ANDROID__
+#include <android/log.h>
+#endif
+
 /**
  * Emit a log message.
  * \param obj VLC object emitting the message or NULL
@@ -227,6 +231,43 @@ static void Win32DebugOutputMsg (void* d, int type, const vlc_log_t *p_item,
 }
 #endif
 
+#ifdef __ANDROID__
+static void AndroidPrintMsg (void *d, int type, const vlc_log_t *p_item,
+                             const char *format, va_list ap)
+{
+    int verbose = (intptr_t)d;
+    int prio;
+
+    if (verbose < 0 || verbose < (type - VLC_MSG_ERR))
+        return;
+
+    int canc = vlc_savecancel ();
+
+    char *format2;
+    if (asprintf (&format2, "[%0*"PRIxPTR"] %s %s: %s",
+                  ptr_width, p_item->i_object_id, p_item->psz_module,
+                  p_item->psz_object_type, format) < 0)
+        return;
+    switch (type) {
+        case VLC_MSG_INFO:
+            prio = ANDROID_LOG_INFO;
+            break;
+        case VLC_MSG_ERR:
+            prio = ANDROID_LOG_ERROR;
+            break;
+        case VLC_MSG_WARN:
+            prio = ANDROID_LOG_WARN;
+            break;
+        default:
+        case VLC_MSG_DBG:
+            prio = ANDROID_LOG_DEBUG;
+    }
+    __android_log_vprint (prio, "VLC", format2, ap);
+    free (format2);
+    vlc_restorecancel (canc);
+}
+#endif
+
 /**
  * Sets the message logging callback.
  * \param cb message callback, or NULL to reset
@@ -238,12 +279,16 @@ void vlc_LogSet (libvlc_int_t *vlc, vlc_log_cb cb, void *opaque)
 
     if (cb == NULL)
     {
+#ifdef __ANDROID__
+        cb = AndroidPrintMsg;
+#else
 #if defined (HAVE_ISATTY) && !defined (_WIN32)
         if (isatty (STDERR_FILENO) && var_InheritBool (vlc, "color"))
             cb = PrintColorMsg;
         else
 #endif
             cb = PrintMsg;
+#endif // __ANDROID__
         opaque = (void *)(intptr_t)priv->log.verbose;
     }