* command. Of course, \a buf is a pointer to the chunk of data which
* should be sent, and \a len is the length of this buffer.
*/
- void (*send)(struct audio_format *af, long unsigned current_chunk,
- long unsigned chunks_sent, const char *buf, size_t len);
+ void (*send)(long unsigned current_chunk, long unsigned chunks_sent,
+ const char *buf, size_t len);
/** add file descriptors to fd_sets
*
* The pre_select function of each supported sender is called just before
*
* \sa select(2)
*/
- void (*pre_select)(struct audio_format *af, int *max_fileno, fd_set *rfds,
- fd_set *wfds);
+ void (*pre_select)(int *max_fileno, fd_set *rfds, fd_set *wfds);
/**
* handle the file descriptors which are ready for I/O
*
* set, this is the hook to check the result and do any I/O on those descriptors
* which are ready for reading/writing.
*/
- void (*post_select)(struct audio_format *af, fd_set *rfds, fd_set *wfds);
+ void (*post_select)(fd_set *rfds, fd_set *wfds);
/**
* terminate all connected clients
*
*/
int (*client_cmds[NUM_SENDER_CMDS])(struct sender_command_data*);
};
+
+/**
+ * check a file descriptor for writability
+ *
+ * \param fd the file desctiptor
+ *
+ * \return positive if fd is ready for writing, zero if it isn't, negative if
+ * an error occured.
+ */
+
+static inline int write_ok(int fd)
+{
+ struct timeval tv = {0, 0};
+ fd_set wfds;
+ int ret;
+again:
+ FD_ZERO(&wfds);
+ FD_SET(fd, &wfds);
+ tv.tv_sec = 0;
+ tv.tv_usec = 0;
+ ret = select(fd + 1, NULL, &wfds, NULL, &tv);
+ if (ret < 0 && errno == EINTR)
+ goto again;
+ return ret;
+}