ortp_recv: Set remote address
[paraslash.git] / afs.c
diff --git a/afs.c b/afs.c
index 918c5636a5bf8d58c916e0225a96f1dab78fa8c6..49aabafb30fd7dd4e743d3fd9bfd3cab916d8a7d 100644 (file)
--- a/afs.c
+++ b/afs.c
@@ -26,6 +26,7 @@
 #include <sys/time.h> /* gettimeofday */
 #include "server.cmdline.h"
 #include "db.h"
+#include "afh.h"
 #include "afs.h"
 #include "send.h"
 #include "error.h"
@@ -40,7 +41,6 @@ static struct timeval eof_barrier;
 extern struct misc_meta_data *mmd;
 extern struct audio_file_selector selectors[];
 extern struct sender senders[];
-extern struct gengetopt_args_info conf;
 
 static FILE *audio_file = NULL;
 
@@ -58,7 +58,7 @@ static FILE *audio_file = NULL;
 /**
  * the list of supported  audio formats
  */
-struct audio_format_handler afl[] = {
+static struct audio_format_handler afl[] = {
 #if 1
        {
                .name = "mp3",
@@ -81,7 +81,7 @@ struct audio_format_handler afl[] = {
                .name = NULL,
        }
 };
-
+#define FOR_EACH_AUDIO_FORMAT(i) for (i = 0; afl[i].name; i++)
 
 /**
  * check if audio file sender is playing
@@ -174,25 +174,30 @@ static int get_file_info(int i)
                &mmd->chunks_total, &mmd->seconds_total);
 }
 
-/*
+/**
  * guess the audio format judging from filename
+ *
  * \param name the filename
  *
  * \return This function returns -1 if it has no idea what kind of audio
  * file this might be. Otherwise the (non-negative) number of the audio format
  * is returned.
  */
-static int guess_audio_format(const char *name)
+int guess_audio_format(const char *name)
 {
-
-       int i, len1 = strlen(name), len2;
-
-       for (i = 0; afl[i].name; i++) {
-               len2 = strlen(afl[i].name);
-               if (len1 < len2)
-                       continue;
-               if (!strncasecmp(name + (len1 - len2), afl[i].name, len2)) {
-                       PARA_DEBUG_LOG("might be %s\n", afl[i].name);
+       int i,j, len = strlen(name);
+
+       FOR_EACH_AUDIO_FORMAT(i) {
+               for (j = 0; afl[i].suffixes[j]; j++) {
+                       const char *p = afl[i].suffixes[j];
+                       int plen = strlen(p);
+                       if (len < plen + 1)
+                               continue;
+                       if (name[len - plen - 1] != '.')
+                               continue;
+                       if (strcasecmp(name + len - plen, p))
+                               continue;
+//                     PARA_DEBUG_LOG("might be %s\n", audio_format_name(i));
                        return i;
                }
        }
@@ -203,7 +208,7 @@ static int get_audio_format(int omit)
 {
        int i;
 
-       for (i = 0; afl[i].name; i++) {
+       FOR_EACH_AUDIO_FORMAT(i) {
                if (i == omit || !afl[i].get_file_info)
                        continue;
                rewind(audio_file);
@@ -369,6 +374,43 @@ static void afs_eof(struct audio_format_handler *af)
        mmd->events++;
 }
 
+/**
+ * get the header and of the current audio file
+ *
+ * \param header_len the length of the header is stored here
+ *
+ * \return a pointer to a buffer containing the header, or NULL, if no audio
+ * file is selected or if the current audio format does not need special header
+ * treamtment.
+ *
+ */
+char *afs_get_header(int *header_len)
+{
+       *header_len = 0;
+       if (mmd->audio_format < 0)
+               return NULL;
+       if (!afl[mmd->audio_format].get_header_info)
+               return NULL;
+       return afl[mmd->audio_format].get_header_info(header_len);
+}
+const char *supported_audio_formats(void)
+{
+       return SUPPORTED_AUDIO_FORMATS;
+}
+
+/**
+ * get the chunk time of the current audio file
+ *
+ * \return a pointer to a struct containing the chunk time, or NULL,
+ * if currently no audio file is selected.
+ */
+struct timeval *afs_chunk_time(void)
+{
+       if (mmd->audio_format < 0)
+               return NULL;
+       return &afl[mmd->audio_format].chunk_tv;
+}
+
 /**
  * compute the timeout for para_server's main select-loop
  *
@@ -379,9 +421,9 @@ static void afs_eof(struct audio_format_handler *af)
  * and acted upon by calling appropriate functions from the lower layers.
  * Possible actions include
  *
- *     - request a new file list from the current dabase tool (audio file change)
+ *     - request a new file list from the current audio file selector
  *     - shutdown of all senders (stop/pause command)
- *     - repositioning of the stream (ff/jmp command)
+ *     - reposition the stream (ff/jmp command)
  *
  * \return A pointer to a struct timeval containing the timeout for the next
  * chunk of data to be sent, or NULL if we're not sending right now.
@@ -484,8 +526,7 @@ void afs_send_chunk(void)
                mmd->events++;
        }
        for (i = 0; senders[i].name; i++)
-               senders[i].send(af, mmd->current_chunk,
-                       mmd->chunks_sent, buf, ret);
+               senders[i].send(mmd->current_chunk, mmd->chunks_sent, buf, ret);
        mmd->new_afs_status_flags |= AFS_PLAYING;
        mmd->chunks_sent++;
        mmd->current_chunk++;