示例#1
0
int dvb_step_channel(stream_t *stream, int dir)
{
	int new_current;
	dvb_channels_list *list;
	dvb_priv_t *priv = stream->priv;

	mp_msg(MSGT_DEMUX, MSGL_V, "DVB_STEP_CHANNEL dir %d\n", dir);

	if(priv == NULL)
	{
		mp_msg(MSGT_DEMUX, MSGL_ERR, "dvb_step_channel: NULL priv_ptr, quit\n");
		return 0;
	}

	list = priv->list;
	if(list == NULL)
	{
		mp_msg(MSGT_DEMUX, MSGL_ERR, "dvb_step_channel: NULL list_ptr, quit\n");
		return 0;
	}

	new_current = (list->NUM_CHANNELS + list->current + (dir == DVB_CHANNEL_HIGHER ? 1 : -1)) % list->NUM_CHANNELS;

	return dvb_set_channel(stream, priv->card, new_current);
}
示例#2
0
文件: stream_dvb.c 项目: Deadsign/mpv
int dvb_step_channel(stream_t *stream, int dir)
{
        int new_current;
        dvb_channels_list *list;
        dvb_priv_t *priv = stream->priv;

        MP_VERBOSE(stream, "DVB_STEP_CHANNEL dir %d\n", dir);

        if(priv == NULL)
        {
                MP_ERR(stream, "dvb_step_channel: NULL priv_ptr, quit\n");
                return 0;
        }

        list = priv->list;
        if(list == NULL)
        {
                MP_ERR(stream, "dvb_step_channel: NULL list_ptr, quit\n");
                return 0;
        }

        new_current = (list->NUM_CHANNELS + list->current + (dir >= 0 ? 1 : -1)) % list->NUM_CHANNELS;

        return dvb_set_channel(stream, priv->card, new_current);
}
示例#3
0
文件: stream_dvb.c 项目: Deadsign/mpv
static int dvbin_stream_control(struct stream *s, int cmd, void *arg)
{
    int r;
    switch (cmd) {
    case STREAM_CTRL_DVB_SET_CHANNEL: {
        int *iarg = arg;
        r = dvb_set_channel(s, iarg[1], iarg[0]);
        return r ? STREAM_OK : STREAM_ERROR;
    }
    case STREAM_CTRL_DVB_STEP_CHANNEL:
        r = dvb_step_channel(s, *(int *)arg);
        return r ? STREAM_OK : STREAM_ERROR;
    }
    return STREAM_UNSUPPORTED;
}
示例#4
0
static int dvb_streaming_start(stream_t *stream, int tuner_type, char *progname)
{
	int i;
	dvb_channel_t *channel = NULL;
	dvb_priv_t *priv = stream->priv;
        dvb_priv_t *opts = priv;

	mp_msg(MSGT_DEMUX, MSGL_V, "\r\ndvb_streaming_start(PROG: %s, CARD: %d)\r\n",
	    opts->cfg_prog, opts->cfg_card);

	priv->is_on = 0;

	i = 0;
	while((channel == NULL) && i < priv->list->NUM_CHANNELS)
	{
		if(! strcmp(priv->list->channels[i].name, progname))
			channel = &(priv->list->channels[i]);

		i++;
	}

	if(channel != NULL)
	{
		priv->list->current = i-1;
		mp_msg(MSGT_DEMUX, MSGL_V, "PROGRAM NUMBER %d: name=%s, freq=%u\n", i-1, channel->name, channel->freq);
	}
	else
	{
		mp_msg(MSGT_DEMUX, MSGL_ERR, "\n\nDVBIN: no such channel \"%s\"\n\n", progname);
		return 0;
	}


	if(!dvb_set_channel(stream, priv->card, priv->list->current))
	{
		mp_msg(MSGT_DEMUX, MSGL_ERR, "ERROR, COULDN'T SET CHANNEL  %i: ", priv->list->current);
		dvbin_close(stream);
		return 0;
	}

	mp_msg(MSGT_DEMUX, MSGL_V,  "SUCCESSFUL EXIT from dvb_streaming_start\n");

	return 1;
}
示例#5
0
文件: stream_dvb.c 项目: AddictXQ/mpv
static int dvbin_stream_control(struct stream *s, int cmd, void *arg)
{
    int r;
    switch (cmd) {
    case STREAM_CTRL_DVB_SET_CHANNEL: {
        int *iarg = arg;
        r = dvb_set_channel(s, iarg[1], iarg[0]);
        if (r) {
          // Stream will be pulled down after channel switch,
          // persist state.
          dvb_priv_t *priv  = (dvb_priv_t *) s->priv;
          dvb_state_t* state = priv->state;
          state->switching_channel = true;
          return STREAM_OK;
        }
        return STREAM_ERROR;
    }
    case STREAM_CTRL_DVB_SET_CHANNEL_NAME: {
        char *progname = *((char**)arg);
        dvb_priv_t *priv  = (dvb_priv_t *) s->priv;
        dvb_state_t* state = priv->state;
        int new_channel = -1;
        for (int i=0; i < state->list->NUM_CHANNELS; ++i) {
          if (!strcmp(state->list->channels[i].name, progname)) {
            new_channel = i;
            break;
          }
        }
        if (new_channel == -1) {
          MP_ERR(s, "Program '%s' not found for card %d!\n",
                 progname, state->card);
          return STREAM_ERROR;
        }
        r = dvb_set_channel(s, state->card, new_channel);
        if (r) {
          // Stream will be pulled down after channel switch,
          // persist state.
          state->switching_channel = true;
          return STREAM_OK;
        }
        return STREAM_ERROR;
    }
    case STREAM_CTRL_DVB_STEP_CHANNEL: {
        r = dvb_step_channel(s, *(int *)arg);
        if (r) {
          // Stream will be pulled down after channel switch,
          // persist state.
          dvb_priv_t *priv  = (dvb_priv_t *) s->priv;
          dvb_state_t* state = priv->state;
          state->switching_channel = true;
          return STREAM_OK;
        }
        return STREAM_ERROR;
    }
    case STREAM_CTRL_DVB_GET_CHANNEL_NAME: {
      dvb_priv_t *priv  = (dvb_priv_t *) s->priv;
      dvb_state_t* state = priv->state;
      int current_channel = state->list->current;
      char* progname = state->list->channels[current_channel].name;
      *(char **)arg = talloc_strdup(NULL, progname);
      return STREAM_OK;
    }
    case STREAM_CTRL_GET_METADATA: {
      struct mp_tags* metadata = talloc_zero(NULL, struct mp_tags);
      dvb_priv_t *priv  = (dvb_priv_t *) s->priv;
      dvb_state_t* state = priv->state;
      int current_channel = state->list->current;
      char* progname = state->list->channels[current_channel].name;
      mp_tags_set_str(metadata, "title", progname);
      *(struct mp_tags **)arg = metadata;
      return STREAM_OK;
    }
    }
    return STREAM_UNSUPPORTED;
}