示例#1
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;
}
示例#2
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;
}