X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;ds=sidebyside;f=vss.c;h=94134b515bcebebaf1410d8afbbc2c8ecb06b0ed;hb=5e5f74a84cb23f5584e799e09ff76ea50f9a35fe;hp=dbf8547c28e1bd091fac6f5a62e7f040e4bc8889;hpb=61250cf03241bf73662dac3753e44660a572fa2a;p=paraslash.git diff --git a/vss.c b/vss.c index dbf8547c..94134b51 100644 --- a/vss.c +++ b/vss.c @@ -164,6 +164,19 @@ const char *audio_format_name(int i) return i >= 0? afl[i].name : "(none)"; } +static void afh_init(void) +{ + int i; + + PARA_DEBUG_LOG("supported audio formats: %s\n", + SUPPORTED_AUDIO_FORMATS); + FOR_EACH_AUDIO_FORMAT(i) { + PARA_NOTICE_LOG("initializing %s handler\n", + audio_format_name(i)); + afl[i].init(&afl[i]); + } +} + /** * initialize the virtual streaming system * @@ -178,14 +191,7 @@ void vss_init(void) conf.announce_time_arg : 300, autoplay_delay = conf.autoplay_delay_arg > 0? conf.autoplay_delay_arg : 0; - - PARA_DEBUG_LOG("supported audio formats: %s\n", - SUPPORTED_AUDIO_FORMATS); - FOR_EACH_AUDIO_FORMAT(i) { - PARA_NOTICE_LOG("initializing %s handler\n", - afl[i].name); - afl[i].init(&afl[i]); - } + afh_init(); ms2tv(announce_time, &announce_tv); PARA_INFO_LOG("announce timeval: %lums\n", tv2ms(&announce_tv)); for (i = 0; senders[i].name; i++) { @@ -204,11 +210,6 @@ void vss_init(void) } } -static int get_file_info(int i) -{ - return afl[i].get_file_info(map, mmd->size, &mmd->afi); -} - /** * guess the audio format judging from filename * @@ -239,19 +240,6 @@ int guess_audio_format(const char *name) return -E_BAD_AUDIO_FILE_SUFFIX; } -static int get_audio_format(int omit) -{ - int i; - - FOR_EACH_AUDIO_FORMAT(i) { - if (i == omit) - continue; - if (get_file_info(i) > 0) - return i; - } - return -E_AUDIO_FORMAT; -} - /** * Call get_file_info() to obtain an afhi structure. * @@ -291,79 +279,6 @@ int compute_afhi(const char *path, char *data, size_t size, return -E_AUDIO_FORMAT; } -/* - * upddate shared mem - */ -static int update_mmd(void) -{ - int i; - - i = guess_audio_format(mmd->filename); - if (i < 0 || get_file_info(i) < 0) - i = get_audio_format(i); - if (i < 0) - return i; - mmd->audio_format = i; - mmd->chunks_sent = 0; - mmd->current_chunk = 0; - mmd->offset = 0; - mmd->events++; - return 1; -} - -static void vss_get_audio_file(void) -{ - char **sl = selectors[mmd->selector_num].get_audio_file_list(10); - int i; - struct stat file_status; - - if (!sl) - goto err_out; - for (i = 0; sl[i]; i++) { - struct timeval now; - PARA_INFO_LOG("trying %s\n", sl[i]); - if (strlen(sl[i]) >= _POSIX_PATH_MAX) - continue; - audio_file = open(sl[i], O_RDONLY); - if (audio_file < 0) - continue; - if (fstat(audio_file, &file_status) == -1 || - !file_status.st_size) { - close(audio_file); - continue; - } - mmd->size = file_status.st_size; - mmd->mtime = file_status.st_mtime; - map = para_mmap(mmd->size, PROT_READ, MAP_PRIVATE, - audio_file, 0); - strcpy(mmd->filename, sl[i]); - mmd->afi.header_len = 0; /* default: no header */ - if (update_mmd() < 0) { /* invalid file */ - close(audio_file); - munmap(map, mmd->size); - map = NULL; - continue; - } - mmd->num_played++; - if (selectors[mmd->selector_num].update_audio_file) - selectors[mmd->selector_num].update_audio_file(sl[i]); - PARA_NOTICE_LOG("next audio file: %s\n", mmd->filename); - mmd->new_vss_status_flags &= (~VSS_NEXT); - gettimeofday(&now, NULL); - tv_add(&now, &announce_tv, &data_send_barrier); - goto free; - } -err_out: - PARA_ERROR_LOG("%s", "no valid files found\n"); - mmd->new_vss_status_flags = VSS_NEXT; -free: - if (sl) { - for (i = 0; sl[i]; i++) - free(sl[i]); - free(sl); - } -} - static int chk_barrier(const char *bname, const struct timeval *now, const struct timeval *barrier, struct timeval *diff, int print_log) @@ -413,7 +328,7 @@ static struct timeval *vss_compute_timeout(void) if (mmd->audio_format < 0 || !vss_playing() || !map) return NULL; vss_next_chunk_time(&next_chunk); - if (chk_barrier(afl[mmd->audio_format].name, &now, &next_chunk, + if (chk_barrier(audio_format_name(mmd->audio_format), &now, &next_chunk, &the_timeout, 0) < 0) return &the_timeout; /* chunk is due or bof */ @@ -428,6 +343,7 @@ static void vss_eof(void) int i; char *tmp; + PARA_NOTICE_LOG("EOF\n"); if (!map) { for (i = 0; senders[i].name; i++) senders[i].shutdown_clients(); @@ -509,7 +425,7 @@ enum afs_socket_status { static enum afs_socket_status afsss; /** - * compute the timeout for para_server's main select-loop + * Compute the timeout for para_server's main select-loop. * * This function gets called from para_server to determine the timeout value * for its main select loop. @@ -518,36 +434,32 @@ static enum afs_socket_status afsss; * and acted upon by calling appropriate functions from the lower layers. * Possible actions include * - * - request a new file list from the current audio file selector - * - shutdown of all senders (stop/pause command) - * - reposition the stream (ff/jmp command) + * - request a new audio file from afs, + * - shutdown of all senders (stop/pause 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. */ struct timeval *vss_preselect(fd_set *rfds, fd_set *wfds, int *max_fileno) { - struct audio_format_handler *af = NULL; - int i, format; - struct timeval *ret; + int i; + struct timeval *tv; para_fd_set(afs_socket, rfds, max_fileno); - -//again: - format = mmd->audio_format; - if (format >= 0) - af = afl + format; - else + if (!map) for (i = 0; senders[i].name; i++) senders[i].shutdown_clients(); - if (vss_next() && af) { - vss_eof(); - return vss_compute_timeout(); + else { + if (vss_next()) { + vss_eof(); + return vss_compute_timeout(); + } } if (vss_paused() || vss_repos()) { for (i = 0; senders[i].name; i++) senders[i].shutdown_clients(); - if (af) { + if (map) { struct timeval now; gettimeofday(&now, NULL); if (!vss_paused() || mmd->chunks_sent) @@ -563,18 +475,18 @@ struct timeval *vss_preselect(fd_set *rfds, fd_set *wfds, int *max_fileno) mmd->new_vss_status_flags &= ~(VSS_REPOS); mmd->current_chunk = mmd->repos_request; } - ret = vss_compute_timeout(); - if (!ret && !map && vss_playing() && + tv = vss_compute_timeout(); + if (tv) + return tv; + if (!map && vss_playing() && !(mmd->new_vss_status_flags & VSS_NOMORE)) { PARA_DEBUG_LOG("%s", "ready and playing, but no audio file\n"); - //vss_get_audio_file(); if (afsss == AFS_SOCKET_READY) { para_fd_set(afs_socket, wfds, max_fileno); afsss = AFS_SOCKET_CHECK_FOR_WRITE; } -// goto again; } - return ret; + return tv; } static int recv_afs_msg(int *fd, uint32_t *code, uint32_t *data) @@ -618,6 +530,7 @@ static void recv_afs_result(void) struct stat statbuf; struct timeval now; + PARA_NOTICE_LOG("recv\n"); ret = recv_afs_msg(&passed_fd, &afs_code, &afs_data); if (ret < 0) goto err; @@ -670,6 +583,7 @@ void vss_post_select(fd_set *rfds, fd_set *wfds) recv_afs_result(); if (afsss != AFS_SOCKET_CHECK_FOR_WRITE || !FD_ISSET(afs_socket, wfds)) return; + PARA_NOTICE_LOG("requesting new socket\n"); ret = send_buffer(afs_socket, "new"); afsss = AFS_SOCKET_AFD_PENDING; } @@ -679,6 +593,10 @@ static void get_chunk(long unsigned chunk_num, char **buf, size_t *len) size_t pos = mmd->afi.chunk_table[chunk_num]; *buf = map + pos; *len = mmd->afi.chunk_table[chunk_num + 1] - pos; + + if (chunk_num + 5 > mmd->afd.afhi.chunks_total) + PARA_NOTICE_LOG("chunk %lu/%lu\n, len: %zu\n", chunk_num, + mmd->afd.afhi.chunks_total, *len); } /** @@ -712,12 +630,12 @@ int vss_get_chunk(long unsigned chunk_num, char **buf, size_t *len) void vss_send_chunk(void) { int i; - struct audio_format_handler *af; struct timeval now, due; + char *buf; + size_t len; if (mmd->audio_format < 0 || !map || !vss_playing()) return; - af = &afl[mmd->audio_format]; gettimeofday(&now, NULL); vss_next_chunk_time(&due); if (tv_diff(&due, &now, NULL) > 0) @@ -743,12 +661,9 @@ void vss_send_chunk(void) mmd->offset = tv2ms(&tmp); mmd->events++; } - for (i = 0; senders[i].name; i++) { - char *buf; - size_t len; - get_chunk(mmd->current_chunk, &buf, &len); + get_chunk(mmd->current_chunk, &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; mmd->chunks_sent++; mmd->current_chunk++;