/* Copyright (C) 2005 Andre Noll , see file COPYING. */ /** \file recv.h Receiver-related structures and exported symbols of recv_common.c. */ /** * Describes one instance of a receiver. */ struct receiver_node { /** Points to the corresponding receiver. */ const struct receiver *receiver; /** Receiver-specific data. */ void *private_data; /** The parsed command line options for this instance. */ struct lls_parse_result *lpr; /** The task associated with this instance. */ struct task *task; /** The receiver node is always the root of the buffer tree. */ struct btr_node *btrn; /** Each receiver node maintains a buffer pool for the received data. */ struct btr_pool *btrp; /** * The file descriptor to receive the stream. * * The pre_select function of the receiver adds this file descriptor to * the set of file descriptors which are watched for readability or * writability, depending on the state of the connection (if any). * * If \a fd is readable, the post_select function of the receiver reads * data from this fd into the buffer pool area of \a btrp. * * \sa \ref receiver. */ int fd; }; /** * Describes one supported paraslash receiver. * * \sa \ref http_recv.c, \ref udp_recv.c. */ struct receiver { /** * Open one instance of the receiver. * * This should allocate the output buffer of the given receiver node * and prepare it for retrieving the audio stream according to the * configuration stored in rn->lpr. * * \sa struct \ref receiver_node. */ int (*open)(struct receiver_node *rn); /** * Close this instance of the receiver. * * It should free all resources associated with given receiver node * that were allocated during the corresponding open call. * * \sa \ref receiver_node. */ void (*close)(struct receiver_node *rn); /** * Add file descriptors to fd_sets and compute timeout for select(2). * * If this is not NULL, the function is called in each iteration of the * scheduler's select loop. The receiver may define it to add file * descriptors to the file descriptor sets given by s. Those will be * monitored in the subsequent call to select(2). The function may also * lower the timeout value of s to make select(2) return earlier if no * file descriptors are ready for I/O. * * \sa select(2), \ref time.c, struct \ref sched. */ void (*pre_select)(struct sched *s, void *context); /** * Evaluate the result from select(2). * * This is called after the call to select(2). It should check all file * descriptors which were added to any of the fd sets in the previous * call to ->pre_select() and perform (non-blocking) I/O operations on * those fds which are ready for I/O, for example in order to establish * a connection or to receive a part of the audio stream. * * \sa select(2), struct \ref receiver. */ int (*post_select)(struct sched *s, void *context); /** * Answer a buffer tree query. * * This optional function pointer allows for inter node communication * of the buffer tree nodes. See \ref btr_command_handler for details. */ btr_command_handler execute; }; #define RECV_CMD(_num) (lls_cmd(_num, recv_cmd_suite)) #define RECV_CMD_OPT_RESULT(_recv, _opt, _lpr) \ (lls_opt_result(LSG_RECV_CMD_ ## _recv ## _OPT_ ## _opt, _lpr)) #define RECV_CMD_OPT_GIVEN(_recv, _opt, _lpr) \ (lls_opt_given(RECV_CMD_OPT_RESULT(_recv, _opt, _lpr))) #define RECV_CMD_OPT_STRING_VAL(_recv, _opt, _lpr) \ (lls_string_val(0, RECV_CMD_OPT_RESULT(_recv, _opt, _lpr))) #define RECV_CMD_OPT_UINT32_VAL(_recv, _opt, _lpr) \ (lls_uint32_val(0, RECV_CMD_OPT_RESULT(_recv, _opt, _lpr))) #define RECV_CMD_OPT_INT32_VAL(_recv, _opt, _lpr) \ (lls_int32_val(0, RECV_CMD_OPT_RESULT(_recv, _opt, _lpr))) /** Iterate over all available receivers. */ #define FOR_EACH_RECEIVER(i) for (i = 1; lls_cmd(i, recv_cmd_suite); i++) int check_receiver_arg(const char *ra, struct lls_parse_result **lprp); void print_receiver_helps(bool detailed); int generic_recv_pre_select(struct sched *s, struct receiver_node *rn);