X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=vss.c;h=f9bf57b5575a7348fa5b5bb8a2db3c446d9dd92c;hp=737b77ac29e546fcdbf808dbd884e5dcf5b291e5;hb=329bf73b72eea2c5be1bcbd9a9602c0a8994d0be;hpb=f1164756a9ce8f61b12060a48b84977f24d9e2b3 diff --git a/vss.c b/vss.c index 737b77ac..f9bf57b5 100644 --- a/vss.c +++ b/vss.c @@ -348,7 +348,7 @@ static int initialize_fec_client(struct fec_client *fc, struct vss_task *vsst) } static int vss_get_chunk(int chunk_num, struct vss_task *vsst, - char **buf, size_t *sz) + char **buf, uint32_t *len) { int ret; @@ -363,15 +363,15 @@ static int vss_get_chunk(int chunk_num, struct vss_task *vsst, if (chunk_num == 0 && vsst->header_len > 0) { assert(vsst->header_buf); *buf = vsst->header_buf; /* stripped header */ - *sz = vsst->header_len; + *len = vsst->header_len; return 0; } ret = afh_get_chunk(chunk_num, &mmd->afd.afhi, mmd->afd.audio_format_id, vsst->map, vsst->mapsize, - (const char **)buf, sz, &vsst->afh_context); + (const char **)buf, len, &vsst->afh_context); if (ret < 0) { *buf = NULL; - *sz = 0; + *len = 0; } return ret; } @@ -380,7 +380,7 @@ static int compute_group_size(struct vss_task *vsst, struct fec_group *g, int max_bytes) { char *buf; - size_t len; + uint32_t len; int ret, i, max_chunks = PARA_MAX(1LU, 150 / tv2ms(vss_chunk_time())); if (g->first_chunk == 0) { @@ -416,7 +416,8 @@ static int compute_group_size(struct vss_task *vsst, struct fec_group *g, g->bytes += len; g->num_chunks++; } - assert(g->num_chunks); + if (g->num_chunks == 0) + return -E_EOF; PARA_DEBUG_LOG("group #%u: %u chunks, %u bytes total\n", g->num, g->num_chunks, g->bytes); return 1; @@ -586,7 +587,7 @@ static int setup_next_fec_group(struct fec_client *fc, struct vss_task *vsst) slice_copied = 0; for (c = g->first_chunk; c < g->first_chunk + g->num_chunks; c++) { char *buf; - size_t src_len; + uint32_t src_len; ret = vss_get_chunk(c, vsst, &buf, &src_len); if (ret < 0) return ret; @@ -689,9 +690,11 @@ void vss_del_fec_client(struct fec_client *fc) list_del(&fc->node); free(fc->enc_buf); - for (i = 0; i < fc_num_data_slices(fc); i++) - free(fc->src_data[i]); - free(fc->src_data); + if (fc->src_data) { + for (i = 0; i < fc_num_data_slices(fc); i++) + free(fc->src_data[i]); + free(fc->src_data); + } fec_free(fc->parms); free(fc); } @@ -842,7 +845,6 @@ static void vss_compute_timeout(struct sched *s, struct vss_task *vsst) static void vss_eof(struct vss_task *vsst) { - if (!vsst->map) return; if (mmd->new_vss_status_flags & VSS_NOMORE) @@ -853,8 +855,8 @@ static void vss_eof(struct vss_task *vsst) para_munmap(vsst->map, vsst->mapsize); vsst->map = NULL; mmd->chunks_sent = 0; - //mmd->offset = 0; mmd->afd.afhi.seconds_total = 0; + mmd->afd.afhi.chunks_total = 0; mmd->afd.afhi.chunk_tv.tv_sec = 0; mmd->afd.afhi.chunk_tv.tv_usec = 0; free(mmd->afd.afhi.chunk_table); @@ -962,6 +964,11 @@ static void recv_afs_result(struct vss_task *vsst, fd_set *rfds) if (ret < 0) goto err; vsst->afsss = AFS_SOCKET_READY; + if (afs_code == NO_ADMISSIBLE_FILES) { + PARA_NOTICE_LOG("no admissible files\n"); + ret = 0; + goto err; + } ret = -E_NOFD; if (afs_code != NEXT_AUDIO_FILE) { PARA_ERROR_LOG("afs code: %u, expected: %d\n", afs_code, @@ -998,9 +1005,11 @@ static void recv_afs_result(struct vss_task *vsst, fd_set *rfds) return; err: free(mmd->afd.afhi.chunk_table); + mmd->afd.afhi.chunk_table = NULL; if (passed_fd >= 0) close(passed_fd); - PARA_ERROR_LOG("%s\n", para_strerror(-ret)); + if (ret < 0) + PARA_ERROR_LOG("%s\n", para_strerror(-ret)); mmd->new_vss_status_flags = VSS_NEXT; } @@ -1020,7 +1029,7 @@ static void vss_send(struct vss_task *vsst) struct timeval due; struct fec_client *fc, *tmp_fc; char *buf; - size_t len; + uint32_t len; if (!vsst->map || !vss_playing()) return; @@ -1130,7 +1139,7 @@ static int vss_post_select(struct sched *s, void *context) if (vsst->afsss != AFS_SOCKET_CHECK_FOR_WRITE) recv_afs_result(vsst, &s->rfds); else if (FD_ISSET(vsst->afs_socket, &s->wfds)) { - PARA_NOTICE_LOG("requesting new fd from afs\n"); + PARA_INFO_LOG("requesting new fd from afs\n"); ret = write_buffer(vsst->afs_socket, "new"); if (ret < 0) PARA_CRIT_LOG("%s\n", para_strerror(-ret)); @@ -1168,7 +1177,7 @@ void vss_init(int afs_socket, struct sched *s) vsst->afs_socket = afs_socket; ms2tv(announce_time, &vsst->announce_tv); PARA_INFO_LOG("announce timeval: %lums\n", tv2ms(&vsst->announce_tv)); - INIT_LIST_HEAD(&fec_client_list); + init_list_head(&fec_client_list); FOR_EACH_SENDER(i) { PARA_NOTICE_LOG("initializing %s sender\n", senders[i]->name); senders[i]->init(); @@ -1199,11 +1208,14 @@ void vss_init(int afs_socket, struct sched *s) void vss_shutdown(void) { int i; + bool is_command_handler = process_is_command_handler(); FOR_EACH_SENDER(i) { if (!senders[i]->shutdown) continue; - PARA_NOTICE_LOG("shutting down %s sender\n", senders[i]->name); + if (!is_command_handler) + PARA_NOTICE_LOG("shutting down %s sender\n", + senders[i]->name); senders[i]->shutdown(); } }