]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - vss.c
Make scheduler structs static.
[paraslash.git] / vss.c
diff --git a/vss.c b/vss.c
index 8a9d5f613f308db356756b090017d0ef88162080..42d39db00a2486f86d7e6e51fee3db5210852f12 100644 (file)
--- a/vss.c
+++ b/vss.c
 #include "ipc.h"
 #include "fd.h"
 
-static struct timeval announce_tv;
-static struct timeval data_send_barrier;
-static struct timeval eof_barrier;
-static struct timeval autoplay_barrier;
-
 extern struct misc_meta_data *mmd;
-extern struct sender senders[];
 
-static char *map;
+extern void dccp_send_init(struct sender *);
+extern void http_send_init(struct sender *);
+extern void ortp_send_init(struct sender *);
+
+/** the list of supported senders */
+struct sender senders[] = {
+       {
+               .name = "http",
+               .init = http_send_init,
+       },
+       {
+               .name = "dccp",
+               .init = dccp_send_init,
+       },
+#ifdef HAVE_ORTP
+       {
+               .name = "ortp",
+               .init = ortp_send_init,
+       },
+#endif
+       {
+               .name = NULL,
+       }
+};
+
+/** The possible states of the afs socket. See \ref afs_socket. */
+enum afs_socket_status {
+       /** Socket is inactive. */
+       AFS_SOCKET_READY,
+       /** Socket fd was included in the write fd set for select(). */
+       AFS_SOCKET_CHECK_FOR_WRITE,
+       /** vss wrote a request to the socket and waits for afs to reply. */
+       AFS_SOCKET_AFD_PENDING
+};
+
+
+struct vss_task {
+       struct timeval announce_tv;
+       struct timeval data_send_barrier;
+       struct timeval eof_barrier;
+       struct timeval autoplay_barrier;
+       enum afs_socket_status afsss;
+       char *map;
+};
+
+static struct vss_task vss_task_struct, *vsst = &vss_task_struct;
 
 /**
  * Check if vss status flag \a P (playing) is set.
@@ -108,11 +147,11 @@ unsigned int vss_stopped(void)
  */
 int vss_get_chunk(long unsigned chunk_num, char **buf, size_t *len)
 {
-       if (!map || !vss_playing())
+       if (!vsst->map || !vss_playing())
                return -E_CHUNK;
        if (chunk_num >= mmd->afd.afhi.chunks_total)
                return -E_CHUNK;
-       afh_get_chunk(chunk_num, &mmd->afd.afhi, map, buf, len);
+       afh_get_chunk(chunk_num, &mmd->afd.afhi, vsst->map, buf, len);
        return 1;
 }
 
@@ -130,8 +169,8 @@ void vss_init(void)
                        conf.announce_time_arg : 300,
                autoplay_delay = conf.autoplay_delay_arg > 0?
                        conf.autoplay_delay_arg : 0;
-       ms2tv(announce_time, &announce_tv);
-       PARA_INFO_LOG("announce timeval: %lums\n", tv2ms(&announce_tv));
+       ms2tv(announce_time, &vsst->announce_tv);
+       PARA_INFO_LOG("announce timeval: %lums\n", tv2ms(&vsst->announce_tv));
        for (i = 0; senders[i].name; i++) {
                PARA_NOTICE_LOG("initializing %s sender\n", senders[i].name);
                senders[i].init(&senders[i]);
@@ -145,7 +184,7 @@ void vss_init(void)
                mmd->new_vss_status_flags |= VSS_PLAYING;
                gettimeofday(&now, NULL);
                ms2tv(autoplay_delay, &tmp);
-               tv_add(&now, &tmp, &autoplay_barrier);
+               tv_add(&now, &tmp, &vsst->autoplay_barrier);
        }
 }
 
@@ -172,22 +211,22 @@ static struct timeval *vss_compute_timeout(void)
        static struct timeval the_timeout;
        struct timeval now, next_chunk;
 
-       if (vss_next() && map) {
+       if (vss_next() && vsst->map) {
                /* only sleep a bit, nec*/
                the_timeout.tv_sec = 0;
                the_timeout.tv_usec = 100;
                return &the_timeout;
        }
        gettimeofday(&now, NULL);
-       if (chk_barrier("autoplay_delay", &now, &autoplay_barrier,
+       if (chk_barrier("autoplay_delay", &now, &vsst->autoplay_barrier,
                        &the_timeout, 1) < 0)
                return &the_timeout;
-       if (chk_barrier("eof", &now, &eof_barrier, &the_timeout, 1) < 0)
+       if (chk_barrier("eof", &now, &vsst->eof_barrier, &the_timeout, 1) < 0)
                return &the_timeout;
-       if (chk_barrier("data send", &now, &data_send_barrier,
+       if (chk_barrier("data send", &now, &vsst->data_send_barrier,
                        &the_timeout, 1) < 0)
                return &the_timeout;
-       if (!vss_playing() || !map)
+       if (!vss_playing() || !vsst->map)
                return NULL;
        compute_chunk_time(mmd->chunks_sent, &mmd->afd.afhi.chunk_tv,
                &mmd->stream_start, &next_chunk);
@@ -204,12 +243,14 @@ static void vss_eof(void)
        struct timeval now;
        char *tmp;
 
+       if (!vsst->map)
+               return;
        if (mmd->new_vss_status_flags & VSS_NOMORE)
                mmd->new_vss_status_flags = VSS_NEXT;
        gettimeofday(&now, NULL);
-       tv_add(&mmd->afd.afhi.eof_tv, &now, &eof_barrier);
-       munmap(map, mmd->size);
-       map = NULL;
+       tv_add(&mmd->afd.afhi.eof_tv, &now, &vsst->eof_barrier);
+       para_munmap(vsst->map, mmd->size);
+       vsst->map = NULL;
        mmd->chunks_sent = 0;
        mmd->offset = 0;
        mmd->afd.afhi.seconds_total = 0;
@@ -236,7 +277,7 @@ static void vss_eof(void)
  */
 void vss_get_header(char **buf, size_t *len)
 {
-       afh_get_header(&mmd->afd.afhi, map, buf, len);
+       afh_get_header(&mmd->afd.afhi, vsst->map, buf, len);
 }
 
 /**
@@ -259,32 +300,20 @@ const char *supported_audio_formats(void)
  */
 struct timeval *vss_chunk_time(void)
 {
-       if (!map)
+       if (!vsst->map)
                return NULL;
        return &mmd->afd.afhi.chunk_tv;
 }
 
-/** The possible states of the afs socket. See \ref afs_socket. */
-enum afs_socket_status {
-       /** Socket is inactive. */
-       AFS_SOCKET_READY,
-       /** Socket fd was included in the write fd set for select(). */
-       AFS_SOCKET_CHECK_FOR_WRITE,
-       /** vss wrote a request to the socket and waits for afs to reply. */
-       AFS_SOCKET_AFD_PENDING
-};
-
-static enum afs_socket_status afsss;
-
 static int need_to_request_new_audio_file(void)
 {
-       if (map) /* have audio file */
+       if (vsst->map) /* have audio file */
                return 0;
        if (!vss_playing()) /* don't need one */
                return 0;
        if (mmd->new_vss_status_flags & VSS_NOMORE)
                return 0;
-       if (afsss == AFS_SOCKET_AFD_PENDING) /* already requested one */
+       if (vsst->afsss == AFS_SOCKET_AFD_PENDING) /* already requested one */
                return 0;
        return 1;
 }
@@ -315,7 +344,7 @@ struct timeval *vss_preselect(fd_set *rfds, fd_set *wfds, int *max_fileno)
        int i;
        struct timeval now;
 
-       if (!map || vss_next() || vss_paused() || vss_repos())
+       if (!vsst->map || vss_next() || vss_paused() || vss_repos())
                for (i = 0; senders[i].name; i++)
                        senders[i].shutdown_clients();
        if (vss_next())
@@ -323,13 +352,13 @@ struct timeval *vss_preselect(fd_set *rfds, fd_set *wfds, int *max_fileno)
        else if (vss_paused()) {
                if (mmd->chunks_sent) {
                        gettimeofday(&now, NULL);
-                       tv_add(&mmd->afd.afhi.eof_tv, &now, &eof_barrier);
+                       tv_add(&mmd->afd.afhi.eof_tv, &now, &vsst->eof_barrier);
                }
                mmd->chunks_sent = 0;
        } else if (vss_repos()) {
                gettimeofday(&now, NULL);
-               tv_add(&now, &announce_tv, &data_send_barrier);
-               tv_add(&mmd->afd.afhi.eof_tv, &now, &eof_barrier);
+               tv_add(&now, &vsst->announce_tv, &vsst->data_send_barrier);
+               tv_add(&mmd->afd.afhi.eof_tv, &now, &vsst->eof_barrier);
                mmd->chunks_sent = 0;
                mmd->current_chunk = mmd->repos_request;
                mmd->new_vss_status_flags &= ~VSS_REPOS;
@@ -338,7 +367,7 @@ struct timeval *vss_preselect(fd_set *rfds, fd_set *wfds, int *max_fileno)
        if (need_to_request_new_audio_file()) {
                PARA_DEBUG_LOG("ready and playing, but no audio file\n");
                para_fd_set(afs_socket, wfds, max_fileno);
-               afsss = AFS_SOCKET_CHECK_FOR_WRITE;
+               vsst->afsss = AFS_SOCKET_CHECK_FOR_WRITE;
        } else
                para_fd_set(afs_socket, rfds, max_fileno);
        for (i = 0; senders[i].name; i++) {
@@ -368,7 +397,7 @@ static int recv_afs_msg(int *fd, uint32_t *code, uint32_t *data)
        ret = recvmsg(afs_socket, &msg, 0);
        if (ret < 0)
                return -ERRNO_TO_PARA_ERROR(errno);
-       afsss = AFS_SOCKET_READY;
+       vsst->afsss = AFS_SOCKET_READY;
        if (iov.iov_len != sizeof(buf))
                return -E_AFS_SHORT_READ;
        *code = *(uint32_t*)buf;
@@ -415,7 +444,7 @@ static void recv_afs_result(void)
        }
        mmd->size = statbuf.st_size;
        mmd->mtime = statbuf.st_mtime;
-       map = para_mmap(mmd->size, PROT_READ, MAP_PRIVATE,
+       vsst->map = para_mmap(mmd->size, PROT_READ, MAP_PRIVATE,
                passed_fd, 0);
        close(passed_fd);
        mmd->chunks_sent = 0;
@@ -425,7 +454,7 @@ static void recv_afs_result(void)
        mmd->num_played++;
        mmd->new_vss_status_flags &= (~VSS_NEXT);
        gettimeofday(&now, NULL);
-       tv_add(&now, &announce_tv, &data_send_barrier);
+       tv_add(&now, &vsst->announce_tv, &vsst->data_send_barrier);
        return;
 err:
        free(mmd->afd.afhi.chunk_table);
@@ -451,16 +480,16 @@ static void vss_send_chunk(void)
        char *buf;
        size_t len;
 
-       if (!map || !vss_playing())
+       if (!vsst->map || !vss_playing())
                return;
        gettimeofday(&now, NULL);
        compute_chunk_time(mmd->chunks_sent, &mmd->afd.afhi.chunk_tv,
                &mmd->stream_start, &due);
        if (tv_diff(&due, &now, NULL) > 0)
                return;
-       if (chk_barrier("eof", &now, &eof_barrier, &due, 1) < 0)
+       if (chk_barrier("eof", &now, &vsst->eof_barrier, &due, 1) < 0)
                return;
-       if (chk_barrier("data send", &now, &data_send_barrier,
+       if (chk_barrier("data send", &now, &vsst->data_send_barrier,
                        &due, 1) < 0)
                return;
        mmd->new_vss_status_flags &= ~VSS_REPOS;
@@ -479,7 +508,7 @@ static void vss_send_chunk(void)
                mmd->offset = tv2ms(&tmp);
                mmd->events++;
        }
-       afh_get_chunk(mmd->current_chunk, &mmd->afd.afhi, map, &buf, &len);
+       afh_get_chunk(mmd->current_chunk, &mmd->afd.afhi, vsst->map, &buf, &len);
        for (i = 0; senders[i].name; i++)
                senders[i].send(mmd->current_chunk, mmd->chunks_sent, buf, len);
        mmd->new_vss_status_flags |= VSS_PLAYING;
@@ -499,13 +528,13 @@ void vss_post_select(fd_set *rfds, fd_set *wfds)
                        senders[s].client_cmds[num](&mmd->sender_cmd_data);
                mmd->sender_cmd_data.cmd_num = -1;
        }
-       if (afsss != AFS_SOCKET_CHECK_FOR_WRITE) {
+       if (vsst->afsss != AFS_SOCKET_CHECK_FOR_WRITE) {
                if (FD_ISSET(afs_socket, rfds))
                        recv_afs_result();
        } else if (FD_ISSET(afs_socket, wfds)) {
                PARA_NOTICE_LOG("requesting new fd from afs\n");
                ret = send_buffer(afs_socket, "new");
-               afsss = AFS_SOCKET_AFD_PENDING;
+               vsst->afsss = AFS_SOCKET_AFD_PENDING;
        }
        for (i = 0; senders[i].name; i++) {
                if (!senders[i].post_select)