Ejemplo n.º 1
0
dvb_config_t *dvb_get_config(void)
{
	int i, fd, type, size;
	char filename[30], *conf_file, *name;
	dvb_channels_list *list;
	dvb_card_config_t *cards = NULL, *tmp;
	dvb_config_t *conf = NULL;


	conf = malloc(sizeof(dvb_config_t));
	if(conf == NULL)
		return NULL;

	conf->priv = NULL;
	conf->count = 0;
	conf->cards = NULL;
	for(i=0; i<MAX_CARDS; i++)
	{
		snprintf(filename, sizeof(filename), "/dev/dvb/adapter%d/frontend0", i);
		fd = open(filename, O_RDONLY|O_NONBLOCK);
		if(fd < 0)
		{
			mp_msg(MSGT_DEMUX, MSGL_V, "DVB_CONFIG, can't open device %s, skipping\n", filename);
			continue;
		}

		type = dvb_get_tuner_type(fd);
		close(fd);
		if(type != TUNER_SAT && type != TUNER_TER && type != TUNER_CBL && type != TUNER_ATSC)
		{
			mp_msg(MSGT_DEMUX, MSGL_V, "DVB_CONFIG, can't detect tuner type of card %d, skipping\n", i);
			continue;
		}

        void *talloc_ctx = talloc_new(NULL);
        conf_file = talloc_steal(talloc_ctx,
                mp_find_user_config_file("channels.conf"));
        switch(type) {
            case TUNER_TER:
                conf_file = talloc_steal(talloc_ctx,
                        mp_find_user_config_file("channels.conf.ter"));
                break;
            case TUNER_CBL:
                conf_file = talloc_steal(talloc_ctx,
                        mp_find_user_config_file("channels.conf.cbl"));
                break;
            case TUNER_SAT:
                conf_file = talloc_steal(talloc_ctx,
                        mp_find_user_config_file("channels.conf.sat"));
                break;
            case TUNER_ATSC:
                conf_file = talloc_steal(talloc_ctx,
                        mp_find_user_config_file("channels.conf.atsc"));
                break;
        }

        if(conf_file && (access(conf_file, F_OK | R_OK) != 0)) {
            conf_file = talloc_steal(talloc_ctx,
                    mp_find_user_config_file("channels.conf"));

            if(conf_file && (access(conf_file, F_OK | R_OK) != 0)) {
                conf_file = talloc_steal(talloc_ctx,
                        mp_find_global_config_file("channels.conf"));
            }
        }

        list = dvb_get_channels(conf_file, type);
        talloc_free(talloc_ctx);

		if(list == NULL)
			continue;

		size = sizeof(dvb_card_config_t) * (conf->count + 1);
		tmp = realloc(conf->cards, size);

		if(tmp == NULL)
		{
			fprintf(stderr, "DVB_CONFIG, can't realloc %d bytes, skipping\n", size);
			continue;
		}
		cards = tmp;

		name = malloc(20);
		if(name==NULL)
		{
			fprintf(stderr, "DVB_CONFIG, can't realloc 20 bytes, skipping\n");
			continue;
		}

		conf->cards = cards;
		conf->cards[conf->count].devno = i;
		conf->cards[conf->count].list = list;
		conf->cards[conf->count].type = type;
		snprintf(name, 20, "DVB-%c card n. %d", type==TUNER_TER ? 'T' : (type==TUNER_CBL ? 'C' : 'S'), conf->count+1);
		conf->cards[conf->count].name = name;
		conf->count++;
	}

	if(conf->count == 0)
	{
		free(conf);
		conf = NULL;
	}

	return conf;
}
Ejemplo n.º 2
0
dvb_config_t *dvb_get_config(stream_t *stream)
{
        struct mp_log *log = stream->log;
        struct mpv_global *global = stream->global;
        dvb_priv_t *priv = stream->priv;
        int i, fd, type, size;
        char filename[30], *name;
        dvb_channels_list *list;
        dvb_card_config_t *cards = NULL, *tmp;
        dvb_config_t *conf = NULL;


        conf = malloc(sizeof(dvb_config_t));
        if(conf == NULL)
                return NULL;

        conf->priv = NULL;
        conf->count = 0;
        conf->cards = NULL;
        for(i=0; i<MAX_CARDS; i++)
        {
                snprintf(filename, sizeof(filename), "/dev/dvb/adapter%d/frontend0", i);
                fd = open(filename, O_RDONLY|O_NONBLOCK|O_CLOEXEC);
                if(fd < 0)
                {
                        mp_verbose(log, "DVB_CONFIG, can't open device %s, skipping\n", filename);
                        continue;
                }

                type = dvb_get_tuner_type(fd, log);
                close(fd);
                if(type != TUNER_SAT && type != TUNER_TER && type != TUNER_CBL && type != TUNER_ATSC)
                {
                        mp_verbose(log, "DVB_CONFIG, can't detect tuner type of card %d, skipping\n", i);
                        continue;
                }

        void *talloc_ctx = talloc_new(NULL);
        char *conf_file = NULL;
        if (priv->cfg_file && priv->cfg_file[0]) {
            conf_file = priv->cfg_file;
        } else {
            switch(type) {
            case TUNER_TER:
                conf_file = mp_find_config_file(talloc_ctx, global, "channels.conf.ter");
                break;
            case TUNER_CBL:
                conf_file = mp_find_config_file(talloc_ctx, global, "channels.conf.cbl");
                break;
            case TUNER_SAT:
                conf_file = mp_find_config_file(talloc_ctx, global, "channels.conf.sat");
                break;
            case TUNER_ATSC:
                conf_file = mp_find_config_file(talloc_ctx, global, "channels.conf.atsc");
                break;
            }
            if (conf_file) {
                mp_verbose(log, "Ignoring other channels.conf files.\n");
            } else {
                conf_file = mp_find_config_file(talloc_ctx, global, "channels.conf");
            }
        }

        list = dvb_get_channels(log, conf_file, type);
        talloc_free(talloc_ctx);

                if(list == NULL)
                        continue;

                size = sizeof(dvb_card_config_t) * (conf->count + 1);
                tmp = realloc(conf->cards, size);

                if(tmp == NULL)
                {
                        fprintf(stderr, "DVB_CONFIG, can't realloc %d bytes, skipping\n", size);
                        continue;
                }
                cards = tmp;

                name = malloc(20);
                if(name==NULL)
                {
                        fprintf(stderr, "DVB_CONFIG, can't realloc 20 bytes, skipping\n");
                        continue;
                }

                conf->cards = cards;
                conf->cards[conf->count].devno = i;
                conf->cards[conf->count].list = list;
                conf->cards[conf->count].type = type;
                snprintf(name, 20, "DVB-%c card n. %d", type==TUNER_TER ? 'T' : (type==TUNER_CBL ? 'C' : 'S'), conf->count+1);
                conf->cards[conf->count].name = name;
                conf->count++;
        }

        if(conf->count == 0)
        {
                free(conf);
                conf = NULL;
        }

        return conf;
}