+ int ret, i;
+ struct vss_task *vsst = context;
+
+ ret = task_get_notification(vsst->task);
+ if (ret < 0)
+ return ret;
+ if (!vsst->map || vss_next() || vss_paused() || vss_repos()) {
+ /* shut down senders and fec clients */
+ struct fec_client *fc, *tmp;
+ FOR_EACH_SENDER(i)
+ if (senders[i]->shutdown_clients)
+ senders[i]->shutdown_clients();
+ list_for_each_entry_safe(fc, tmp, &fec_client_list, node)
+ fc->state = FEC_STATE_NONE;
+ mmd->stream_start.tv_sec = 0;
+ mmd->stream_start.tv_usec = 0;
+ }
+ if (vss_next())
+ vss_eof(vsst);
+ else if (vss_paused()) {
+ if (mmd->chunks_sent)
+ set_eof_barrier(vsst);
+ mmd->chunks_sent = 0;
+ } else if (vss_repos()) { /* repositioning due to ff/jmp command */
+ tv_add(now, &vsst->announce_tv, &vsst->data_send_barrier);
+ set_eof_barrier(vsst);
+ mmd->chunks_sent = 0;
+ mmd->current_chunk = afh_get_start_chunk(mmd->repos_request,
+ &mmd->afd.afhi, mmd->afd.audio_format_id);
+ mmd->new_vss_status_flags &= ~VSS_REPOS;
+ set_mmd_offset();
+ }
+ /* If a sender command is pending, run it. */
+ if (mmd->sender_cmd_data.cmd_num >= 0) {
+ int num = mmd->sender_cmd_data.cmd_num,
+ sender_num = mmd->sender_cmd_data.sender_num;
+
+ if (senders[sender_num]->client_cmds[num]) {
+ ret = senders[sender_num]->client_cmds[num]
+ (&mmd->sender_cmd_data);
+ if (ret < 0)
+ PARA_ERROR_LOG("%s\n", para_strerror(-ret));
+ }
+ mmd->sender_cmd_data.cmd_num = -1;
+ }
+ 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 = write_buffer(vsst->afs_socket, "new");
+ if (ret < 0)
+ PARA_CRIT_LOG("%s\n", para_strerror(-ret));
+ else
+ vsst->afsss = AFS_SOCKET_AFD_PENDING;
+ }
+ FOR_EACH_SENDER(i) {
+ if (!senders[i]->post_select)
+ 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(vsst);
+ return 0;