14 #include "../config.h"
16 #include "../m_struct.h"
17 #include "../m_option.h"
19 #include "img_format.h"
23 #include "menu_list.h"
24 #include "../input/input.h"
25 #include "../osdep/keycodes.h"
27 #include "../libmpdemux/dvbin.h"
33 int num
; //the position of the chosen channel in the list
46 #define ST_OFF(m) M_ST_OFF(struct menu_priv_s, m)
47 #define mpriv (menu->priv)
49 static m_option_t cfg_fields
[] = {
50 MENU_LIST_PRIV_FIELDS
,
51 { "title", ST_OFF(title
), CONF_TYPE_STRING
, 0, 0, 0, NULL
},
52 { NULL
, NULL
, NULL
, 0,0,0,NULL
},
56 static struct menu_priv_s cfg_dflt
= {
68 static void free_entry(list_entry_t
* entry
)
75 static int fill_channels_menu(menu_t
*menu
, dvb_channels_list
*dvb_list_ptr
)
78 dvb_channel_t
*channel
;
82 if(dvb_list_ptr
== NULL
)
84 mp_msg(MSGT_DEMUX
, MSGL_ERR
, "dvb_set_channel: LIST NULL PTR, quit\n");
86 if((elem
= calloc(1, sizeof(list_entry_t
))) != NULL
)
89 elem
->p
.txt
= strdup("There are no channels for this DVB card!");
91 menu_list_add_entry(menu
, elem
);
95 for(n
= 0; n
< dvb_list_ptr
->NUM_CHANNELS
; n
++)
97 channel
= &(dvb_list_ptr
->channels
[n
]);
98 if((elem
= calloc(1, sizeof(list_entry_t
))) != NULL
)
101 elem
->p
.txt
= strdup(channel
->name
);
104 menu_list_add_entry(menu
, elem
);
108 mp_msg(MSGT_DEMUX
, MSGL_ERR
, "dvb_menu: fill_menu: couldn't malloc %d bytes for menu item: %s, exit\n",
109 sizeof(list_entry_t
), strerror(errno
));
119 static int fill_cards_menu(menu_t
*menu
, dvb_config_t
*conf
)
124 for(n
= 0; n
< conf
->count
; n
++)
126 if((elem
= calloc(1, sizeof(list_entry_t
))) != NULL
)
129 elem
->p
.txt
= strdup(conf
->cards
[n
].name
);
135 menu_list_add_entry(menu
, elem
);
139 fprintf(stderr
, "dvb_menu: fill_menu: couldn't malloc %d bytes for menu item: %s, exit\n",
140 sizeof(list_entry_t
), strerror(errno
));
153 static int fill_menu(menu_t
* menu
)
156 dvb_channels_list
*dvb_list_ptr
;
158 menu_list_init(menu
);
160 if(mpriv
->config
== NULL
)
162 if((elem
= calloc(1, sizeof(list_entry_t
))) != NULL
)
164 elem
->p
.prev
= elem
->p
.next
= NULL
;
165 elem
->p
.txt
= strdup("NO DVB configuration present!");
167 menu_list_add_entry(menu
, elem
);
173 mpriv
->p
.title
= mpriv
->title
;
174 if(mpriv
->level
== 1 && mpriv
->config
->count
> 1)
175 return fill_cards_menu(menu
, mpriv
->config
);
178 dvb_list_ptr
= mpriv
->config
->cards
[mpriv
->card
].list
;
179 return fill_channels_menu(menu
, dvb_list_ptr
);
184 static void read_cmd(menu_t
* menu
, int cmd
)
193 elem
= mpriv
->p
.current
;
195 if(mpriv
->level
== 1)
197 mpriv
->card
= mpriv
->p
.current
->num
;
199 menu_list_uninit(menu
, free_entry
);
204 dvb_priv_t
*dvbp
= (dvb_priv_t
*) mpriv
->config
->priv
;
205 cmd_name
= malloc(25 + strlen(elem
->p
.txt
));
207 sprintf(cmd_name
, "dvb_set_channel %d %d", elem
->num
, mpriv
->card
);
209 sprintf(cmd_name
, "loadfile 'dvb://%d@%s'", mpriv
->card
+1, elem
->p
.txt
);
211 c
= mp_input_parse_cmd(cmd_name
);
213 mp_input_queue_cmd(c
);
218 case MENU_CMD_CANCEL
:
220 elem
= mpriv
->p
.current
;
222 menu_list_uninit(menu
, free_entry
);
223 if(mpriv
->config
->count
> 1)
236 menu_list_read_cmd(menu
, cmd
);
241 static void close_menu(menu_t
* menu
)
243 menu_list_uninit(menu
, free_entry
);
247 static int open_dvb_sel(menu_t
* menu
, char* args
)
249 mpriv
->config
= dvb_get_config();
250 if(mpriv
->config
== NULL
)
253 menu
->draw
= menu_list_draw
;
254 menu
->read_cmd
= read_cmd
;
255 menu
->close
= close_menu
;
259 return fill_menu(menu
);
262 const menu_info_t menu_info_dvbsel
=
264 "DVB channels menu", //descr
268 { //m_struct_t priv_st=
270 sizeof(struct menu_priv_s
), //size
271 &cfg_dflt
, //defaults
272 cfg_fields
//settable fields
274 open_dvb_sel
//open function