X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=vss.c;h=7b84dcf5db24dcf3128be1e5453a45f01913f94f;hp=acac159537171c95560e5582dfef538554f04f23;hb=2fff03e8e4644cdf18780f920285e70ebf192af0;hpb=1d8ea0d046caf28d138fe510e2b3e2f20609071a diff --git a/vss.c b/vss.c index acac1595..7b84dcf5 100644 --- a/vss.c +++ b/vss.c @@ -36,7 +36,33 @@ static struct timeval eof_barrier; static struct timeval autoplay_barrier; extern struct misc_meta_data *mmd; -extern struct sender senders[]; + +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, + } +}; + + static char *map; @@ -97,6 +123,25 @@ unsigned int vss_stopped(void) && !(mmd->new_vss_status_flags & VSS_PLAYING); } +/** + * Get the data of the given chunk. + * + * \param chunk_num The number of the desired chunk. + * \param buf Chunk data. + * \param len Chunk length in bytes. + * + * \return Standard. + */ +int vss_get_chunk(long unsigned chunk_num, char **buf, size_t *len) +{ + if (!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); + return 1; +} + /** * Initialize the virtual streaming system. * @@ -119,6 +164,7 @@ void vss_init(void) } free(hn); free(home); + mmd->sender_cmd_data.cmd_num = -1; if (conf.autoplay_given) { struct timeval now, tmp; mmd->vss_status_flags |= VSS_PLAYING; @@ -184,11 +230,13 @@ static void vss_eof(void) struct timeval now; char *tmp; + if (!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); + para_munmap(map, mmd->size); map = NULL; mmd->chunks_sent = 0; mmd->offset = 0; @@ -298,19 +346,15 @@ struct timeval *vss_preselect(fd_set *rfds, fd_set *wfds, int *max_fileno) if (!map || vss_next() || vss_paused() || vss_repos()) for (i = 0; senders[i].name; i++) senders[i].shutdown_clients(); - if (vss_next()) { + if (vss_next()) vss_eof(); - goto out; - } - if (vss_paused()) { + else if (vss_paused()) { if (mmd->chunks_sent) { gettimeofday(&now, NULL); tv_add(&mmd->afd.afhi.eof_tv, &now, &eof_barrier); } mmd->chunks_sent = 0; - goto out; - } - if (vss_repos()) { + } 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); @@ -318,13 +362,18 @@ struct timeval *vss_preselect(fd_set *rfds, fd_set *wfds, int *max_fileno) mmd->current_chunk = mmd->repos_request; mmd->new_vss_status_flags &= ~VSS_REPOS; } -out: + 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; } else para_fd_set(afs_socket, rfds, max_fileno); + for (i = 0; senders[i].name; i++) { + if (!senders[i].pre_select) + continue; + senders[i].pre_select(max_fileno, rfds, wfds); + } return vss_compute_timeout(); } @@ -414,41 +463,6 @@ err: mmd->new_vss_status_flags = VSS_NEXT; } -void vss_post_select(fd_set *rfds, fd_set *wfds) -{ - int ret; - - if (afsss != AFS_SOCKET_CHECK_FOR_WRITE) { - if (FD_ISSET(afs_socket, rfds)) - recv_afs_result(); - return; - } - if (!FD_ISSET(afs_socket, wfds)) - return; - PARA_NOTICE_LOG("requesting new fd from afs\n"); - ret = send_buffer(afs_socket, "new"); - afsss = AFS_SOCKET_AFD_PENDING; -} - -/** - * Get the data of the given chunk. - * - * \param chunk_num The number of the desired chunk. - * \param buf Chunk data. - * \param len Chunk length in bytes. - * - * \return Standard. - */ -int vss_get_chunk(long unsigned chunk_num, char **buf, size_t *len) -{ - if (!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); - return 1; -} - /** * Main sending function. * @@ -458,7 +472,7 @@ int vss_get_chunk(long unsigned chunk_num, char **buf, size_t *len) * each supported sender's send() function which is supposed to send out the data * to all connected clients. */ -void vss_send_chunk(void) +static void vss_send_chunk(void) { int i; struct timeval now, due; @@ -500,3 +514,31 @@ void vss_send_chunk(void) mmd->chunks_sent++; mmd->current_chunk++; } + +void vss_post_select(fd_set *rfds, fd_set *wfds) +{ + int ret, i; + + if (mmd->sender_cmd_data.cmd_num >= 0) { + int num = mmd->sender_cmd_data.cmd_num, + s = mmd->sender_cmd_data.sender_num; + + if (senders[s].client_cmds[num]) + senders[s].client_cmds[num](&mmd->sender_cmd_data); + mmd->sender_cmd_data.cmd_num = -1; + } + if (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; + } + for (i = 0; senders[i].name; i++) { + if (!senders[i].post_select) + continue; + senders[i].post_select(rfds, wfds); + } + vss_send_chunk(); +}