/*
- * Copyright (C) 1997-2008 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 1997-2009 Andre Noll <maan@systemlinux.org>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
extern void dccp_send_init(struct sender *);
extern void http_send_init(struct sender *);
-extern void ortp_send_init(struct sender *);
+extern void udp_send_init(struct sender *);
/** The list of supported senders. */
struct sender senders[] = {
.name = "dccp",
.init = dccp_send_init,
},
-#ifdef HAVE_ORTP
{
- .name = "ortp",
- .init = ortp_send_init,
+ .name = "udp",
+ .init = udp_send_init,
},
-#endif
{
.name = NULL,
}
/** The task structure for the virtual streaming system. */
struct vss_task {
+ /** Copied from the -announce_time command line option. */
struct timeval announce_tv;
+ /** End of the announcing interval. */
struct timeval data_send_barrier;
+ /** End of the EOF interval. */
struct timeval eof_barrier;
+ /** Only used if --autoplay_delay was given. */
struct timeval autoplay_barrier;
+ /** Used for afs-server communication. */
int afs_socket;
+ /** The current state of \a afs_socket. */
enum afs_socket_status afsss;
+ /** The memory mapped audio file. */
char *map;
+ /** Used by the scheduler. */
struct task task;
+ /** Pointer to the header of the mapped audio file. */
const char *header_buf;
+ /** Length of the audio file header. */
size_t header_len;
};
static int need_to_request_new_audio_file(struct vss_task *vsst)
{
+ struct timeval diff;
+
if (vsst->map) /* have audio file */
return 0;
if (!vss_playing()) /* don't need one */
return 0;
if (vsst->afsss == AFS_SOCKET_AFD_PENDING) /* already requested one */
return 0;
+ if (chk_barrier("autoplay_delay", &vsst->autoplay_barrier,
+ &diff, 1) < 0)
+ return 0;
return 1;
}
mmd->current_chunk = mmd->repos_request;
mmd->new_vss_status_flags &= ~VSS_REPOS;
}
-
if (need_to_request_new_audio_file(vsst)) {
PARA_DEBUG_LOG("ready and playing, but no audio file\n");
para_fd_set(vsst->afs_socket, &s->wfds, &s->max_fileno);
}
mmd->size = statbuf.st_size;
mmd->mtime = statbuf.st_mtime;
- vsst->map = para_mmap(mmd->size, PROT_READ, MAP_PRIVATE,
- passed_fd, 0);
+ ret = para_mmap(mmd->size, PROT_READ, MAP_PRIVATE, passed_fd,
+ 0, &vsst->map);
+ if (ret < 0)
+ goto err;
close(passed_fd);
mmd->chunks_sent = 0;
mmd->current_chunk = 0;
mmd->events++;
mmd->num_played++;
mmd->new_vss_status_flags &= (~VSS_NEXT);
- tv_add(now, &vsst->announce_tv, &vsst->data_send_barrier);
afh_get_header(&mmd->afd.afhi, vsst->map, &vsst->header_buf,
&vsst->header_len);
return;
if (chk_barrier("data send", &vsst->data_send_barrier,
&due, 1) < 0)
return;
- mmd->new_vss_status_flags &= ~VSS_REPOS;
if (mmd->current_chunk >= mmd->afd.afhi.chunks_total) { /* eof */
mmd->new_vss_status_flags |= VSS_NEXT;
return;
continue;
senders[i].post_select(&s->rfds, &s->wfds);
}
+ if ((vss_playing() && !(mmd->vss_status_flags & VSS_PLAYING)) ||
+ (vss_next() && vss_playing()))
+ tv_add(now, &vsst->announce_tv, &vsst->data_send_barrier);
vss_send_chunk(vsst);
}
free(hn);
free(home);
mmd->sender_cmd_data.cmd_num = -1;
+ make_empty_status_items(mmd->afd.verbose_ls_output);
if (conf.autoplay_given) {
struct timeval tmp;
mmd->vss_status_flags |= VSS_PLAYING;
mmd->new_vss_status_flags |= VSS_PLAYING;
ms2tv(autoplay_delay, &tmp);
tv_add(now, &tmp, &vsst->autoplay_barrier);
+ tv_add(&vsst->autoplay_barrier, &vsst->announce_tv,
+ &vsst->data_send_barrier);
}
register_task(&vsst->task);
}