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); }
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); }
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; }
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; }
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; }