X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=vss.c;h=704c39300e569d9da65fe2a043880e7966c4f8c2;hb=f41688f647116d0a17513cc86c60cc9729da6502;hp=1501052a87b8cc3c9eb1f86c834e6c2300e50f1d;hpb=c131db293f79b899e6a8a49ff5b4748df5b8a8c2;p=paraslash.git diff --git a/vss.c b/vss.c index 1501052a..704c3930 100644 --- a/vss.c +++ b/vss.c @@ -97,6 +97,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. * @@ -182,14 +201,8 @@ static struct timeval *vss_compute_timeout(void) static void vss_eof(void) { struct timeval now; - int i; char *tmp; - if (!map) { - for (i = 0; senders[i].name; i++) - senders[i].shutdown_clients(); - return; - } if (mmd->new_vss_status_flags & VSS_NOMORE) mmd->new_vss_status_flags = VSS_NEXT; gettimeofday(&now, NULL); @@ -299,44 +312,40 @@ static int need_to_request_new_audio_file(void) struct timeval *vss_preselect(fd_set *rfds, fd_set *wfds, int *max_fileno) { int i; - struct timeval *tv; + struct timeval now; - if (!map) - for (i = 0; senders[i].name; i++) - senders[i].shutdown_clients(); - else { - if (vss_next()) { - vss_eof(); - tv = vss_compute_timeout(); - goto out; - } - } - if (vss_paused() || vss_repos()) { + if (!map || vss_next() || vss_paused() || vss_repos()) for (i = 0; senders[i].name; i++) senders[i].shutdown_clients(); - if (map) { - struct timeval now; + if (vss_next()) + vss_eof(); + else if (vss_paused()) { + if (mmd->chunks_sent) { gettimeofday(&now, NULL); - if (!vss_paused() || mmd->chunks_sent) - tv_add(&mmd->afd.afhi.eof_tv, &now, &eof_barrier); - if (vss_repos()) - tv_add(&now, &announce_tv, &data_send_barrier); + tv_add(&mmd->afd.afhi.eof_tv, &now, &eof_barrier); } mmd->chunks_sent = 0; - } - if (vss_repos()) { - mmd->new_vss_status_flags &= ~(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); + mmd->chunks_sent = 0; mmd->current_chunk = mmd->repos_request; + mmd->new_vss_status_flags &= ~VSS_REPOS; } - tv = vss_compute_timeout(); -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); - return tv; + 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(); } static int recv_afs_msg(int *fd, uint32_t *code, uint32_t *data) @@ -425,41 +434,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. * @@ -469,7 +443,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; @@ -511,3 +485,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(); +}