document lavc's 'level' option
[mplayer/glamo.git] / libmenu / menu_dvbin.c
blobf6e6253e9e2bb26646de6387240282382d940bfe
2 #include <stdlib.h>
3 #include <stdio.h>
4 #include <dirent.h>
5 #include <errno.h>
6 #include <string.h>
7 #include <sys/types.h>
8 #include <sys/stat.h>
9 #include <ctype.h>
10 #include <unistd.h>
11 #include <limits.h>
14 #include "config.h"
16 #include "m_struct.h"
17 #include "m_option.h"
19 #include "libmpcodecs/img_format.h"
20 #include "libmpcodecs/mp_image.h"
22 #include "menu.h"
23 #include "menu_list.h"
24 #include "input/input.h"
25 #include "osdep/keycodes.h"
27 #include "stream/dvbin.h"
31 struct list_entry_s {
32 struct list_entry p;
33 int num; //the position of the chosen channel in the list
36 struct menu_priv_s {
37 menu_list_priv_t p;
38 char* title;
39 char* file;
40 int card;
41 int level;
42 int auto_close;
43 dvb_config_t *config;
47 #define ST_OFF(m) M_ST_OFF(struct menu_priv_s, m)
48 #define mpriv (menu->priv)
50 static m_option_t cfg_fields[] = {
51 MENU_LIST_PRIV_FIELDS,
52 { "title", ST_OFF(title), CONF_TYPE_STRING, 0, 0, 0, NULL },
53 { "auto-close", ST_OFF(auto_close), CONF_TYPE_FLAG, 0, 0, 1, NULL },
54 { NULL, NULL, NULL, 0,0,0,NULL },
58 static struct menu_priv_s cfg_dflt = {
59 MENU_LIST_PRIV_DFLT,
60 "Select a channel: ",
61 "channels.conf",
65 NULL,
71 static void free_entry(list_entry_t* entry)
73 free(entry->p.txt);
74 free(entry);
78 static int fill_channels_menu(menu_t *menu, dvb_channels_list *dvb_list_ptr)
80 int n;
81 dvb_channel_t *channel;
82 list_entry_t* elem;
84 mpriv->level = 2;
85 if(dvb_list_ptr == NULL)
87 mp_msg(MSGT_DEMUX, MSGL_ERR, "dvb_set_channel: LIST NULL PTR, quit\n");
88 n = 1;
89 if((elem = calloc(1, sizeof(list_entry_t))) != NULL)
91 elem->p.next = NULL;
92 elem->p.txt = strdup("There are no channels for this DVB card!");
94 menu_list_add_entry(menu, elem);
96 return 1;
98 for(n = 0; n < dvb_list_ptr->NUM_CHANNELS; n++)
100 channel = &(dvb_list_ptr->channels[n]);
101 if((elem = calloc(1, sizeof(list_entry_t))) != NULL)
103 elem->p.next = NULL;
104 elem->p.txt = strdup(channel->name);
105 elem->num = n;
107 menu_list_add_entry(menu, elem);
109 else
111 mp_msg(MSGT_DEMUX, MSGL_ERR, "dvb_menu: fill_menu: couldn't malloc %d bytes for menu item: %s, exit\n",
112 sizeof(list_entry_t), strerror(errno));
114 break;
118 return n;
122 static int fill_cards_menu(menu_t *menu, dvb_config_t *conf)
124 int n;
125 list_entry_t* elem;
127 for(n = 0; n < conf->count; n++)
129 if((elem = calloc(1, sizeof(list_entry_t))) != NULL)
131 elem->p.next = NULL;
132 elem->p.txt = strdup(conf->cards[n].name);
133 elem->num = n;
135 if(n == 0)
136 elem->p.prev = NULL;
138 menu_list_add_entry(menu, elem);
140 else
142 fprintf(stderr, "dvb_menu: fill_menu: couldn't malloc %d bytes for menu item: %s, exit\n",
143 sizeof(list_entry_t), strerror(errno));
145 if(n)
146 return 1;
148 return 0;
152 return n;
156 static int fill_menu(menu_t* menu)
158 list_entry_t* elem;
159 dvb_channels_list *dvb_list_ptr;
161 menu_list_init(menu);
163 if(mpriv->config == NULL)
165 if((elem = calloc(1, sizeof(list_entry_t))) != NULL)
167 elem->p.prev = elem->p.next = NULL;
168 elem->p.txt = strdup("NO DVB configuration present!");
170 menu_list_add_entry(menu, elem);
171 return 1;
173 return 0;
176 mpriv->p.title = mpriv->title;
177 if(mpriv->level == 1 && mpriv->config->count > 1)
178 return fill_cards_menu(menu, mpriv->config);
179 else
181 dvb_list_ptr = mpriv->config->cards[mpriv->card].list;
182 return fill_channels_menu(menu, dvb_list_ptr);
187 static void read_cmd(menu_t* menu, int cmd)
189 list_entry_t *elem;
190 mp_cmd_t* c;
191 char *cmd_name;
192 switch(cmd)
194 case MENU_CMD_RIGHT:
195 case MENU_CMD_OK:
197 elem = mpriv->p.current;
199 if(mpriv->level == 1)
201 mpriv->card = mpriv->p.current->num;
202 mpriv->level = 2;
203 menu_list_uninit(menu, free_entry);
204 fill_menu(menu);
206 else
208 dvb_priv_t *dvbp = (dvb_priv_t*) mpriv->config->priv;
209 cmd_name = malloc(25 + strlen(elem->p.txt));
210 if(dvbp != NULL)
211 sprintf(cmd_name, "dvb_set_channel %d %d", elem->num, mpriv->card);
212 else
213 sprintf(cmd_name, "loadfile 'dvb://%d@%s'", mpriv->card+1, elem->p.txt);
215 c = mp_input_parse_cmd(cmd_name);
216 if(c)
218 if (mpriv->auto_close)
219 mp_input_queue_cmd (mp_input_parse_cmd ("menu hide"));
220 mp_input_queue_cmd(c);
224 break;
226 case MENU_CMD_LEFT:
227 case MENU_CMD_CANCEL:
229 elem = mpriv->p.current;
231 menu_list_uninit(menu, free_entry);
232 if(mpriv->config->count > 1)
233 mpriv->level--;
234 else
235 mpriv->level = 0;
237 if(mpriv->level > 0)
239 fill_menu(menu);
240 break;
244 default:
245 menu_list_read_cmd(menu, cmd);
250 static void close_menu(menu_t* menu)
252 menu_list_uninit(menu, free_entry);
256 static int open_dvb_sel(menu_t* menu, char* args)
258 mpriv->config = dvb_get_config();
259 if(mpriv->config == NULL)
260 return 0;
262 menu->draw = menu_list_draw;
263 menu->read_cmd = read_cmd;
264 menu->close = close_menu;
266 mpriv->card = 0;
267 mpriv->level = 1;
268 return fill_menu(menu);
271 const menu_info_t menu_info_dvbsel =
273 "DVB channels menu", //descr
274 "dvbsel", //name
275 "Nico", //author
276 "dvb_sel",
277 { //m_struct_t priv_st=
278 "dvb_cfg", //name
279 sizeof(struct menu_priv_s), //size
280 &cfg_dflt, //defaults
281 cfg_fields //settable fields
283 open_dvb_sel //open function