projects
/
paraslash.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Convert receivers to lopsub.
[paraslash.git]
/
audiod.c
diff --git
a/audiod.c
b/audiod.c
index fa4019160bf8148a8503fa856c5dac3f9103b260..181d6ab12e6370a4e0df6b661ce20132d6036e78 100644
(file)
--- a/
audiod.c
+++ b/
audiod.c
@@
-17,6
+17,7
@@
#include <pwd.h>
#include <lopsub.h>
#include <pwd.h>
#include <lopsub.h>
+#include "recv_cmd.lsg.h"
#include "para.h"
#include "error.h"
#include "crypt.h"
#include "para.h"
#include "error.h"
#include "crypt.h"
@@
-47,14
+48,12
@@
__printf_2_3 void (*para_log)(int, const char*, ...) = daemon_log;
/** define the array containing all supported audio formats */
const char *audio_formats[] = {AUDIOD_AUDIO_FORMAT_ARRAY NULL};
/** define the array containing all supported audio formats */
const char *audio_formats[] = {AUDIOD_AUDIO_FORMAT_ARRAY NULL};
-DEFINE_RECEIVER_ARRAY;
-
/** Defines how audiod handles one supported audio format. */
struct audio_format_info {
/** Defines how audiod handles one supported audio format. */
struct audio_format_info {
- /**
pointer to
the receiver for this audio format */
-
struct receiver *receiver
;
- /**
the receiver configuration
*/
-
void *receiver_conf
;
+ /** the receiver for this audio format */
+
int receiver_num
;
+ /**
Parsed receiver command line.
*/
+
struct lls_parse_result *receiver_lpr
;
/** the number of filters that should be activated for this audio format */
unsigned int num_filters;
/** Array of filter numbers to be activated. */
/** the number of filters that should be activated for this audio format */
unsigned int num_filters;
/** Array of filter numbers to be activated. */
@@
-89,6
+88,9
@@
struct slot_info {
struct writer_node *wns;
};
struct writer_node *wns;
};
+#define RECEIVER_CMD(_a) lls_cmd((_a)->receiver_num, recv_cmd_suite)
+#define RECEIVER(_a) ((const struct receiver *)lls_user_data(RECEIVER_CMD(_a)))
+
/** Maximal number of simultaneous instances. */
#define MAX_STREAM_SLOTS 5
/** Maximal number of simultaneous instances. */
#define MAX_STREAM_SLOTS 5
@@
-477,7
+479,7
@@
static void close_receiver(int slot_num)
a = &afi[s->format];
PARA_NOTICE_LOG("closing %s receiver in slot %d\n",
audio_formats[s->format], slot_num);
a = &afi[s->format];
PARA_NOTICE_LOG("closing %s receiver in slot %d\n",
audio_formats[s->format], slot_num);
-
a->receiver
->close(s->receiver_node);
+
RECEIVER(a)
->close(s->receiver_node);
btr_remove_node(&s->receiver_node->btrn);
task_reap(&s->receiver_node->task);
free(s->receiver_node);
btr_remove_node(&s->receiver_node->btrn);
task_reap(&s->receiver_node->task);
free(s->receiver_node);
@@
-639,7
+641,8
@@
static int open_receiver(int format)
struct audio_format_info *a = &afi[format];
struct slot_info *s;
int ret, slot_num;
struct audio_format_info *a = &afi[format];
struct slot_info *s;
int ret, slot_num;
- struct receiver *r = a->receiver;
+ const struct receiver *r = RECEIVER(a);
+ const char *name = lls_command_name(RECEIVER_CMD(a));
struct receiver_node *rn;
tv_add(now, &(struct timeval)EMBRACE(2, 0), &a->restart_barrier);
struct receiver_node *rn;
tv_add(now, &(struct timeval)EMBRACE(2, 0), &a->restart_barrier);
@@
-649,9
+652,9
@@
static int open_receiver(int format)
slot_num = ret;
rn = para_calloc(sizeof(*rn));
rn->receiver = r;
slot_num = ret;
rn = para_calloc(sizeof(*rn));
rn->receiver = r;
- rn->
conf = a->receiver_conf
;
+ rn->
lpr = a->receiver_lpr
;
rn->btrn = btr_new_node(&(struct btr_node_description)
rn->btrn = btr_new_node(&(struct btr_node_description)
- EMBRACE(.name =
r->
name, .context = rn));
+ EMBRACE(.name = name, .context = rn));
ret = r->open(rn);
if (ret < 0) {
btr_remove_node(&rn->btrn);
ret = r->open(rn);
if (ret < 0) {
btr_remove_node(&rn->btrn);
@@
-662,9
+665,9
@@
static int open_receiver(int format)
s->format = format;
s->receiver_node = rn;
PARA_NOTICE_LOG("started %s: %s receiver in slot %d\n",
s->format = format;
s->receiver_node = rn;
PARA_NOTICE_LOG("started %s: %s receiver in slot %d\n",
- audio_formats[format],
r->
name, slot_num);
+ audio_formats[format], name, slot_num);
rn->task = task_register(&(struct task_info) {
rn->task = task_register(&(struct task_info) {
- .name =
r->
name,
+ .name = name,
.pre_select = r->pre_select,
.post_select = r->post_select,
.context = rn,
.pre_select = r->pre_select,
.post_select = r->post_select,
.context = rn,
@@
-827,7
+830,7
@@
static int update_item(int itemnum, char *buf)
return 1;
}
return 1;
}
-static int parse_stream_command(const char *txt, char **cmd)
+static int parse_stream_command(const char *txt, c
onst c
har **cmd)
{
int ret, len;
char *re, *p = strchr(txt, ':');
{
int ret, len;
char *re, *p = strchr(txt, ':');
@@
-844,7
+847,7
@@
static int parse_stream_command(const char *txt, char **cmd)
return ret;
}
return ret;
}
-static int add_filter(int format, char *cmdline)
+static int add_filter(int format, c
onst c
har *cmdline)
{
struct audio_format_info *a = &afi[format];
int filter_num, nf = a->num_filters;
{
struct audio_format_info *a = &afi[format];
int filter_num, nf = a->num_filters;
@@
-868,7
+871,7
@@
static int add_filter(int format, char *cmdline)
static int parse_writer_args(void)
{
int i, ret;
static int parse_writer_args(void)
{
int i, ret;
- char *cmd;
+ c
onst c
har *cmd;
struct audio_format_info *a;
for (i = 0; i < conf.writer_given; i++) {
struct audio_format_info *a;
for (i = 0; i < conf.writer_given; i++) {
@@
-915,12
+918,13
@@
static int parse_writer_args(void)
static int parse_receiver_args(void)
{
static int parse_receiver_args(void)
{
- int i, ret
, receiver_num
;
- c
har *cmd = NULL
;
+ int i, ret;
+ c
onst char *arg
;
struct audio_format_info *a;
struct audio_format_info *a;
+ FOR_EACH_AUDIO_FORMAT(i)
+ afi[i].receiver_num = -1;
for (i = conf.receiver_given - 1; i >= 0; i--) {
for (i = conf.receiver_given - 1; i >= 0; i--) {
- char *arg;
int j, af_mask;
ret = parse_stream_command(conf.receiver_arg[i], &arg);
int j, af_mask;
ret = parse_stream_command(conf.receiver_arg[i], &arg);
@@
-937,37
+941,27
@@
static int parse_receiver_args(void)
* config here. Since we are iterating backwards, the winning
* receiver arg is in fact the first one given.
*/
* config here. Since we are iterating backwards, the winning
* receiver arg is in fact the first one given.
*/
- if (a->receiver_conf)
- a->receiver->free_config(a->receiver_conf);
- a->receiver_conf = check_receiver_arg(arg, &receiver_num);
- ret = -E_RECV_SYNTAX;
- if (!a->receiver_conf)
- goto out;
- a->receiver = receivers + receiver_num;
+ lls_free_parse_result(a->receiver_lpr, RECEIVER_CMD(a));
+ a->receiver_num = check_receiver_arg(arg, &a->receiver_lpr);
}
}
/*
}
}
/*
- * Use the
first available receiver with no arguments for those audi
o
- *
formats for which no
receiver was specified.
+ * Use the
default receiver for those audio formats for which n
o
+ * receiver was specified.
*/
*/
- cmd = para_strdup(receivers[0].name);
FOR_EACH_AUDIO_FORMAT(i) {
FOR_EACH_AUDIO_FORMAT(i) {
- a =
&afi[i]
;
- if (a->receiver_
conf
)
+ a =
afi + i
;
+ if (a->receiver_
num >= 0
)
continue;
continue;
- a->receiver_conf = check_receiver_arg(cmd, &receiver_num);
- if (!a->receiver_conf)
- return -E_RECV_SYNTAX;
- a->receiver = &receivers[receiver_num];
+ a->receiver_num = check_receiver_arg(NULL, &a->receiver_lpr);
}
FOR_EACH_AUDIO_FORMAT(i) {
a = afi + i;
PARA_INFO_LOG("receiving %s streams via %s receiver\n",
}
FOR_EACH_AUDIO_FORMAT(i) {
a = afi + i;
PARA_INFO_LOG("receiving %s streams via %s receiver\n",
- audio_formats[i],
a->receiver->name
);
+ audio_formats[i],
lls_command_name(RECEIVER_CMD(a))
);
}
ret = 1;
out:
}
ret = 1;
out:
- free(cmd);
return ret;
}
return ret;
}
@@
-977,6
+971,7
@@
static int init_default_filters(void)
FOR_EACH_AUDIO_FORMAT(i) {
struct audio_format_info *a = &afi[i];
FOR_EACH_AUDIO_FORMAT(i) {
struct audio_format_info *a = &afi[i];
+ const char *name = lls_command_name(RECEIVER_CMD(a));
char *tmp;
int j;
char *tmp;
int j;
@@
-986,8
+981,7
@@
static int init_default_filters(void)
* udp and dccp streams are fec-encoded, so add fecdec as the
* first filter.
*/
* udp and dccp streams are fec-encoded, so add fecdec as the
* first filter.
*/
- if (strcmp(afi[i].receiver->name, "udp") == 0 ||
- strcmp(afi[i].receiver->name, "dccp") == 0) {
+ if (strcmp(name, "udp") == 0 || strcmp(name, "dccp") == 0) {
tmp = para_strdup("fecdec");
add_filter(i, tmp);
free(tmp);
tmp = para_strdup("fecdec");
add_filter(i, tmp);
free(tmp);
@@
-1020,7
+1014,7
@@
static int parse_filter_args(void)
int i, j, ret, af_mask, num_matches;
for (i = 0; i < conf.filter_given; i++) {
int i, j, ret, af_mask, num_matches;
for (i = 0; i < conf.filter_given; i++) {
- char *arg;
+ c
onst c
har *arg;
ret = parse_stream_command(conf.filter_arg[i], &arg);
if (ret < 0)
goto out;
ret = parse_stream_command(conf.filter_arg[i], &arg);
if (ret < 0)
goto out;