/*
- * Copyright (C) 1997-2009 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 1997-2010 Andre Noll <maan@systemlinux.org>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
g->num = 0;
g->start = *now;
} else {
+ struct timeval tmp;
+ if (g->first_chunk + g->num_chunks >= mmd->afd.afhi.chunks_total)
+ return 0;
/*
* Start and duration of this group depend only on the previous
* group. Compute the new group start as g->start += g->duration.
*/
- struct timeval tmp = g->start;
+ tmp = g->start;
tv_add(&tmp, &g->duration, &g->start);
k = fc->fcp->data_slices_per_group + fc->num_extra_slices;
set_group_timing(fc, g);
g->first_chunk += g->num_chunks;
g->num++;
}
- if (g->first_chunk >= mmd->afd.afhi.chunks_total)
- return 0;
if (need_audio_header(fc, vsst)) {
ret = num_slices(vsst->header_len, fc, &g->num_header_slices);
if (ret < 0)
return 1;
}
+static void set_mmd_offset(void)
+{
+ struct timeval offset;
+ tv_scale(mmd->current_chunk, &mmd->afd.afhi.chunk_tv, &offset);
+ mmd->offset = tv2ms(&offset);
+}
+
/**
* Compute the timeout for the main select-loop of the scheduler.
*
set_eof_barrier(vsst);
mmd->chunks_sent = 0;
} else if (vss_repos()) {
- struct timeval offset;
tv_add(now, &vsst->announce_tv, &vsst->data_send_barrier);
set_eof_barrier(vsst);
mmd->chunks_sent = 0;
mmd->current_chunk = mmd->repos_request;
mmd->new_vss_status_flags &= ~VSS_REPOS;
- tv_scale(mmd->current_chunk, &mmd->afd.afhi.chunk_tv, &offset);
- mmd->offset = tv2ms(&offset);
+ set_mmd_offset();
}
if (need_to_request_new_audio_file(vsst)) {
PARA_DEBUG_LOG("ready and playing, but no audio file\n");
return 1;
}
-static void recv_afs_result(struct vss_task *vsst)
+static void recv_afs_result(struct vss_task *vsst, fd_set *rfds)
{
int ret, passed_fd, shmid;
uint32_t afs_code = 0, afs_data = 0;
struct stat statbuf;
- vsst->afsss = AFS_SOCKET_READY;
+ if (!FD_ISSET(vsst->afs_socket, rfds))
+ return;
ret = recv_afs_msg(vsst->afs_socket, &passed_fd, &afs_code, &afs_data);
+ if (ret == -ERRNO_TO_PARA_ERROR(EAGAIN))
+ return;
if (ret < 0)
goto err;
+ vsst->afsss = AFS_SOCKET_READY;
PARA_DEBUG_LOG("fd: %d, code: %u, shmid: %u\n", passed_fd, afs_code,
afs_data);
ret = -E_NOFD;
if (!mmd->chunks_sent) {
mmd->stream_start = *now;
mmd->events++;
+ set_mmd_offset();
}
/*
* We call the send function also in case of empty chunks as
senders[sender_num].client_cmds[num](&mmd->sender_cmd_data);
mmd->sender_cmd_data.cmd_num = -1;
}
- if (vsst->afsss != AFS_SOCKET_CHECK_FOR_WRITE) {
- if (FD_ISSET(vsst->afs_socket, &s->rfds))
- recv_afs_result(vsst);
- } else if (FD_ISSET(vsst->afs_socket, &s->wfds)) {
+ 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");
ret = send_buffer(vsst->afs_socket, "new");
if (ret < 0)