Add LYRICS_ID status item.
[paraslash.git] / para.h
diff --git a/para.h b/para.h
index 5e839215cadb9874231cff4370ce0fc0b76e53fb..9f2c59a885aa2ee028de2056e23641575f9c8ad6 100644 (file)
--- a/para.h
+++ b/para.h
@@ -1,19 +1,7 @@
 /*
  * Copyright (C) 1997-2007 Andre Noll <maan@systemlinux.org>
  *
- *     This program is free software; you can redistribute it and/or modify
- *     it under the terms of the GNU General Public License as published by
- *     the Free Software Foundation; either version 2 of the License, or
- *     (at your option) any later version.
- *
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public License
- *     along with this program; if not, write to the Free Software
- *     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
+ * Licensed under the GPL v2. For licencing details see COPYING.
  */
 
 /** \file para.h global paraslash definitions */
@@ -36,6 +24,7 @@
 #include <sys/socket.h>
 #include <sys/un.h> /* needed by create_pf_socket */
 #include <string.h>
+#include <assert.h>
 #include "gcc-compat.h"
 
 /** used in various contexts */
 /** last message before exit */
 #define EMERG 7
 
-/** log messages with lower proirity than that will not be compiled in*/
+/** Log messages with lower priority than that will not be compiled in. */
 #define COMPILE_TIME_LOGLEVEL 0
 
+/** \cond */
 #if DEBUG > COMPILE_TIME_LOGLEVEL
-#define PARA_DEBUG_LOG(f,...) para_log(DEBUG, "%s: " f, __FUNCTION__, __VA_ARGS__)
+#define PARA_DEBUG_LOG(f,...) para_log(DEBUG, "%s: " f, __FUNCTION__, ## __VA_ARGS__)
 #else
 #define PARA_DEBUG_LOG(...) do {;} while (0)
 #endif
 
 #if INFO > COMPILE_TIME_LOGLEVEL
-#define PARA_INFO_LOG(f,...) para_log(INFO, "%s: " f, __FUNCTION__, __VA_ARGS__)
+#define PARA_INFO_LOG(f,...) para_log(INFO, "%s: " f, __FUNCTION__, ## __VA_ARGS__)
 #else
 #define PARA_INFO_LOG(...) do {;} while (0)
 #endif
 
 #if NOTICE > COMPILE_TIME_LOGLEVEL
-#define PARA_NOTICE_LOG(f,...) para_log(NOTICE, "%s: " f, __FUNCTION__, __VA_ARGS__)
+#define PARA_NOTICE_LOG(f,...) para_log(NOTICE, "%s: " f, __FUNCTION__, ## __VA_ARGS__)
 #else
 #define PARA_NOTICE_LOG(...) do {;} while (0)
 #endif
 
 #if WARNING > COMPILE_TIME_LOGLEVEL
-#define PARA_WARNING_LOG(f,...) para_log(WARNING, "%s: " f, __FUNCTION__, __VA_ARGS__)
+#define PARA_WARNING_LOG(f,...) para_log(WARNING, "%s: " f, __FUNCTION__, ##  __VA_ARGS__)
 #else
 #define PARA_WARNING_LOG(...) do {;} while (0)
 #endif
 
 #if ERROR > COMPILE_TIME_LOGLEVEL
-#define PARA_ERROR_LOG(f,...) para_log(ERROR, "%s: " f, __FUNCTION__, __VA_ARGS__)
+#define PARA_ERROR_LOG(f,...) para_log(ERROR, "%s: " f, __FUNCTION__, ## __VA_ARGS__)
 #else
 #define PARA_ERROR_LOG(...) do {;} while (0)
 #endif
 
 #if CRIT > COMPILE_TIME_LOGLEVEL
-#define PARA_CRIT_LOG(f,...) para_log(CRIT, "%s: " f, __FUNCTION__, __VA_ARGS__)
+#define PARA_CRIT_LOG(f,...) para_log(CRIT, "%s: " f, __FUNCTION__, ## __VA_ARGS__)
 #else
 #define PARA_CRIT_LOG(...) do {;} while (0)
 #endif
 
 #if EMERG > COMPILE_TIME_LOGLEVEL
-#define PARA_EMERG_LOG(f,...) para_log(EMERG, "%s: " f, __FUNCTION__, __VA_ARGS__)
+#define PARA_EMERG_LOG(f,...) para_log(EMERG, "%s: " f, __FUNCTION__, ## __VA_ARGS__)
 #else
 #define PARA_EMERG_LOG(...)
 #endif
+/** \endcond */
 
 /**
  * define a standard log function that always writes to stderr
 /** sent by para_client, followed by the decrypted challenge number */
 #define CHALLENGE_RESPONSE_MSG "challenge_response:"
 
-/* gui_common */
-int para_open_audiod_pipe(char *);
-int read_audiod_pipe(int, void (*)(char *));
-
 /* exec */
 int para_exec_cmdline_pid(pid_t *pid, const char *cmdline, int *fds);
 
@@ -173,30 +160,38 @@ void ms2tv(const long unsigned n, struct timeval *tv);
 
 /* stat */
 enum {
-       SI_STATUS_BAR,          SI_STATUS,              SI_NUM_PLAYED,
+       SI_BASENAME,            SI_STATUS,              SI_NUM_PLAYED,
        SI_MTIME,               SI_LENGTH_MIN,          SI_LENGTH_SEC,
        SI_FILE_SIZE,           SI_STATUS_FLAGS,        SI_FORMAT,
        SI_SCORE,               SI_AUDIO_INFO1,         SI_AUDIO_INFO2,
-       SI_AUDIO_INFO3,         SI_DBINFO1,             SI_DBINFO2,
-       SI_DBINFO3,             SI_DECODER_FLAGS,       SI_AUDIOD_STATUS,
+       SI_AUDIO_INFO3,         SI_AFS_MODE,            SI_ATTRIBUTES,
+       SI_DIRECTORY,           SI_DECODER_FLAGS,       SI_AUDIOD_STATUS,
        SI_PLAY_TIME,           SI_UPTIME,              SI_OFFSET,
        SI_LENGTH,              SI_STREAM_START,        SI_CURRENT_TIME,
-       SI_AUDIOD_UPTIME,       SI_SELECTOR,            NUM_STAT_ITEMS
+       SI_AUDIOD_UPTIME,       SI_IMAGE_ID,            SI_LYRICS_ID,
+       NUM_STAT_ITEMS
 };
 
 int stat_item_valid(const char *item);
 int stat_line_valid(const char *);
-void stat_client_write(char *msg, int itemnum);
+void stat_client_write(const char *msg, int itemnum);
 int stat_client_add(int fd, long unsigned mask);
-unsigned for_each_line(char *, int, void (*)(char *));
+/** Loop over each status item. */
 #define FOR_EACH_STAT_ITEM(i) for (i = 0; i < NUM_STAT_ITEMS; i++)
 
 __printf_2_3 void para_log(int, const char*, ...);
 
-/* taken from printf man page */
+/**
+ * Write a log message to a dynamically allocated string.
+ *
+ * \param fmt Usual format string.
+ * \param p Result pointer.
+ *
+ * \sa printf(3). */
 #define PARA_VSPRINTF(fmt, p) \
 { \
-       int n, size = 100; \
+       int n; \
+       size_t size = 100; \
        p = para_malloc(size); \
        while (1) { \
                va_list ap; \
@@ -215,3 +210,21 @@ __printf_2_3 void para_log(int, const char*, ...);
                p = para_realloc(p, size); \
        } \
 }
+
+/**
+ *  Return a random non-negative integer in an interval.
+ *
+ * \param max Determines maximal possible return value.
+ *
+ * \return An integer between zero and \p max - 1, inclusively.
+ */
+static inline int para_random(unsigned max)
+{
+       return ((max + 0.0) * (rand() / (RAND_MAX + 1.0)));
+}
+
+/** Round up x to a multiple of y */
+#define ROUND_UP(x, y) (((x) + (y - 1) / (y)) * (y))
+
+/** Get the size of an array */
+#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))