1 // ------------------------------------------------------------------------
2 // eca-iamode-parser.cpp: Class that handles registering and querying
3 //                        interactive mode commands.
4 // Copyright (C) 1999-2005,2008,2012 Kai Vehmanen
5 // Copyright (C) 2005 Stuart Allie
6 //
7 // Attributes:
8 //     eca-style-version: 3 (see Ecasound Programmer's Guide)
9 //
10 // This program is free software; you can redistribute it and/or modify
11 // it under the terms of the GNU General Public License as published by
12 // the Free Software Foundation; either version 2 of the License, or
13 // (at your option) any later version.
14 //
15 // This program is distributed in the hope that it will be useful,
16 // but WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 // GNU General Public License for more details.
19 //
20 // You should have received a copy of the GNU General Public License
21 // along with this program; if not, write to the Free Software
22 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
23 // ------------------------------------------------------------------------
24 
25 #ifdef HAVE_CONFIG_H
26 #include <config.h>
27 #endif
28 
29 #include <map>
30 #include <vector>
31 #include <string>
32 #include <pthread.h>
33 
34 #include "kvu_message_item.h"
35 #include "kvu_locks.h"
36 
37 #include "eca-iamode-parser.h"
38 #include "eca-logger.h"
39 
40 using namespace std;
41 
42 map<string,int>* ECA_IAMODE_PARSER::cmd_map_repp = 0;
43 pthread_mutex_t ECA_IAMODE_PARSER::lock_rep = PTHREAD_MUTEX_INITIALIZER;
44 
ECA_IAMODE_PARSER(void)45 ECA_IAMODE_PARSER::ECA_IAMODE_PARSER(void)
46 {
47 }
48 
~ECA_IAMODE_PARSER(void)49 ECA_IAMODE_PARSER::~ECA_IAMODE_PARSER(void)
50 {
51 }
52 
registered_commands(void)53 const map<string,int>& ECA_IAMODE_PARSER::registered_commands(void)
54 {
55   //
56   // Note! Below we use the Double-Checked Locking Pattern
57   //       to protect against concurrent access
58 
59   if (cmd_map_repp == 0) {
60     KVU_GUARD_LOCK guard(&ECA_IAMODE_PARSER::lock_rep);
61     if (cmd_map_repp == 0) {
62       cmd_map_repp = new map<string,int>;
63       register_commands_misc();
64       register_commands_cs();
65       register_commands_c();
66       register_commands_aio();
67       register_commands_ai();
68       register_commands_ao();
69       register_commands_cop();
70       register_commands_copp();
71       register_commands_ctrl();
72       register_commands_ctrlp();
73       register_commands_dump();
74       register_commands_external();
75     }
76   }
77   return *cmd_map_repp;
78 }
79 
registered_commands_list(void)80 vector<string> ECA_IAMODE_PARSER::registered_commands_list(void)
81 {
82   vector<string> cmdlist;
83   const map<string,int>& map_ref = ECA_IAMODE_PARSER::registered_commands();
84   map<string,int>::const_iterator p = map_ref.begin();
85   while (p != map_ref.end()) {
86     cmdlist.push_back(p->first);
87     ++p;
88   }
89   return cmdlist;
90 }
91 
register_commands_misc(void)92 void ECA_IAMODE_PARSER::register_commands_misc(void)
93 {
94   (*cmd_map_repp)["help"] = ec_help;
95   (*cmd_map_repp)["?"] = ec_help;
96   (*cmd_map_repp)["h"] = ec_help;
97 
98   (*cmd_map_repp)["quit"] = ec_exit;
99   (*cmd_map_repp)["q"] = ec_exit;
100 
101   (*cmd_map_repp)["start"] = ec_start;
102   (*cmd_map_repp)["t"] = ec_start;
103   (*cmd_map_repp)["stop"] = ec_stop;
104   (*cmd_map_repp)["s"] = ec_stop;
105   (*cmd_map_repp)["stop-sync"] = ec_stop_sync;
106   (*cmd_map_repp)["run"] = ec_run;
107 
108   (*cmd_map_repp)["debug"] = ec_debug;
109   (*cmd_map_repp)["resource-file"] = ec_resource_file;
110 
111   (*cmd_map_repp)["engine-launch"] = ec_engine_launch;
112   (*cmd_map_repp)["engine-halt"] = ec_engine_halt;
113   (*cmd_map_repp)["engine-status"] = ec_engine_status;
114 
115   (*cmd_map_repp)["status"] = ec_cs_status;
116   (*cmd_map_repp)["st"] = ec_cs_status;
117   (*cmd_map_repp)["cs"] = ec_c_status;
118   (*cmd_map_repp)["es"] = ec_cop_status;
119   (*cmd_map_repp)["fs"] = ec_aio_status;
120 
121   (*cmd_map_repp)["int-cmd-list"] = ec_int_cmd_list;
122   (*cmd_map_repp)["int-log-history"] = ec_int_log_history;
123   (*cmd_map_repp)["int-output-mode-wellformed"] = ec_int_output_mode_wellformed;
124   (*cmd_map_repp)["int-set-float-to-string-precision"] = ec_int_set_float_to_string_precision;
125   (*cmd_map_repp)["int-set-log-history-length"] = ec_int_set_log_history_length;
126 
127   (*cmd_map_repp)["int-version-string"] = ec_int_version_string;
128   (*cmd_map_repp)["int-version-lib-current"] = ec_int_version_lib_current;
129   (*cmd_map_repp)["int-version-lib-revision"] = ec_int_version_lib_revision;
130   (*cmd_map_repp)["int-version-lib-age"] = ec_int_version_lib_age;
131 
132   (*cmd_map_repp)["preset-register"] = ec_preset_register;
133   (*cmd_map_repp)["ladspa-register"] = ec_ladspa_register;
134   (*cmd_map_repp)["lv2-register"] = ec_lv2_register;
135 
136   (*cmd_map_repp)["map-cop-list"] = ec_map_cop_list;
137   (*cmd_map_repp)["map-preset-list"] = ec_map_preset_list;
138   (*cmd_map_repp)["map-ladspa-list"] = ec_map_ladspa_list;
139   (*cmd_map_repp)["map-ladspa-id-list"] = ec_map_ladspa_id_list;
140   (*cmd_map_repp)["map-lv2-list"] = ec_map_lv2_list;
141   (*cmd_map_repp)["map-ctrl-list"] = ec_map_ctrl_list;
142 }
143 
register_commands_cs(void)144 void ECA_IAMODE_PARSER::register_commands_cs(void)
145 {
146   (*cmd_map_repp)["cs-add"] = ec_cs_add;
147   (*cmd_map_repp)["cs-remove"] = ec_cs_remove;
148   (*cmd_map_repp)["cs-list"] = ec_cs_list;
149   (*cmd_map_repp)["cs-select"] = ec_cs_select;
150   (*cmd_map_repp)["cs-selected"] = ec_cs_selected;
151   (*cmd_map_repp)["cs-index-select"] = ec_cs_index_select;
152   (*cmd_map_repp)["cs-iselect"] = ec_cs_index_select;
153   (*cmd_map_repp)["cs-load"] = ec_cs_load;
154   (*cmd_map_repp)["cs-save"] = ec_cs_save;
155   (*cmd_map_repp)["cs-save-as"] = ec_cs_save_as;
156   (*cmd_map_repp)["cs-edit"] = ec_cs_edit;
157   (*cmd_map_repp)["cs-is-valid"] = ec_cs_is_valid;
158   (*cmd_map_repp)["cs-connect"] = ec_cs_connect;
159   (*cmd_map_repp)["cs-connected"] = ec_cs_connected;
160   (*cmd_map_repp)["cs-disconnect"] = ec_cs_disconnect;
161   (*cmd_map_repp)["cs-set-param"] = ec_cs_set_param;
162   (*cmd_map_repp)["cs-set-audio-format"] = ec_cs_set_audio_format;
163   (*cmd_map_repp)["cs-status"] = ec_cs_status;
164   (*cmd_map_repp)["cs-rewind"] = ec_cs_rewind;
165   (*cmd_map_repp)["rewind"] = ec_cs_rewind;
166   (*cmd_map_repp)["rw"] = ec_cs_rewind;
167   (*cmd_map_repp)["cs-forward"] = ec_cs_forward;
168   (*cmd_map_repp)["forward"] = ec_cs_forward;
169   (*cmd_map_repp)["fw"] = ec_cs_forward;
170   (*cmd_map_repp)["cs-setpos"] = ec_cs_set_position;
171   (*cmd_map_repp)["cs-set-position"] = ec_cs_set_position;
172   (*cmd_map_repp)["cs-set-position-samples"] = ec_cs_set_position_samples;
173   (*cmd_map_repp)["setpos"] = ec_cs_set_position;
174   (*cmd_map_repp)["set-position"] = ec_cs_set_position;
175   (*cmd_map_repp)["cs-getpos"] = ec_cs_get_position;
176   (*cmd_map_repp)["cs-get-position"] = ec_cs_get_position;
177   (*cmd_map_repp)["cs-get-position-samples"] = ec_cs_get_position_samples;
178   (*cmd_map_repp)["getpos"] = ec_cs_get_position;
179   (*cmd_map_repp)["get-position"] = ec_cs_get_position;
180   (*cmd_map_repp)["cs-get-length"] = ec_cs_get_length;
181   (*cmd_map_repp)["cs-get-length-samples"] = ec_cs_get_length_samples;
182   (*cmd_map_repp)["get-length"] = ec_cs_get_length;
183   (*cmd_map_repp)["cs-set-length"] = ec_cs_set_length;
184   (*cmd_map_repp)["cs-set-length-samples"] = ec_cs_set_length_samples;
185   (*cmd_map_repp)["cs-toggle-loop"] = ec_cs_toggle_loop;
186   (*cmd_map_repp)["cs-option"] = ec_cs_option;
187 }
188 
register_commands_c(void)189 void ECA_IAMODE_PARSER::register_commands_c(void)
190 {
191   (*cmd_map_repp)["c-add"] = ec_c_add;
192   (*cmd_map_repp)["c-remove"] = ec_c_remove;
193   (*cmd_map_repp)["c-list"] = ec_c_list;
194   (*cmd_map_repp)["c-select"] = ec_c_select;
195   (*cmd_map_repp)["c-selected"] = ec_c_selected;
196   (*cmd_map_repp)["c-index-select"] = ec_c_index_select;
197   (*cmd_map_repp)["c-iselect"] = ec_c_index_select;
198   (*cmd_map_repp)["c-deselect"] = ec_c_deselect;
199   (*cmd_map_repp)["c-selected"] = ec_c_selected;
200   (*cmd_map_repp)["c-select-all"] = ec_c_select_all;
201   (*cmd_map_repp)["c-select-add"] = ec_c_select_add;
202   (*cmd_map_repp)["c-clear"] = ec_c_clear;
203   (*cmd_map_repp)["c-rename"] = ec_c_rename;
204   (*cmd_map_repp)["c-muting"] = ec_c_muting;
205   (*cmd_map_repp)["c-mute"] = ec_c_muting;
206   (*cmd_map_repp)["c-bypass"] = ec_c_bypass;
207   (*cmd_map_repp)["c-status"] = ec_c_status;
208   (*cmd_map_repp)["c-is-muted"] = ec_c_is_muted;
209   (*cmd_map_repp)["c-is-bypassed"] = ec_c_is_bypassed;
210 }
211 
register_commands_aio(void)212 void ECA_IAMODE_PARSER::register_commands_aio(void)
213 {
214   (*cmd_map_repp)["aio-register"] = ec_aio_register;
215   (*cmd_map_repp)["aio-status"] = ec_aio_status;
216 }
217 
register_commands_ai(void)218 void ECA_IAMODE_PARSER::register_commands_ai(void)
219 {
220   (*cmd_map_repp)["ai-add"] = ec_ai_add;
221   (*cmd_map_repp)["ai-describe"] = ec_ai_describe;
222   (*cmd_map_repp)["ai-remove"] = ec_ai_remove;
223   (*cmd_map_repp)["ai-list"] = ec_ai_list;
224   (*cmd_map_repp)["ai-select"] = ec_ai_select;
225   (*cmd_map_repp)["ai-index-select"] = ec_ai_index_select;
226   (*cmd_map_repp)["ai-iselect"] = ec_ai_index_select;
227   (*cmd_map_repp)["ai-selected"] = ec_ai_selected;
228   (*cmd_map_repp)["ai-attach"] = ec_ai_attach;
229   (*cmd_map_repp)["ai-status"] = ec_ai_status;
230   (*cmd_map_repp)["ai-forward"] = ec_ai_forward;
231   (*cmd_map_repp)["ai-rewind"] = ec_ai_rewind;
232   (*cmd_map_repp)["ai-setpos"] = ec_ai_set_position;
233   (*cmd_map_repp)["ai-set-position"] = ec_ai_set_position;
234   (*cmd_map_repp)["ai-set-position-samples"] = ec_ai_set_position_samples;
235   (*cmd_map_repp)["ai-getpos"] = ec_ai_get_position;
236   (*cmd_map_repp)["ai-get-position"] = ec_ai_get_position;
237   (*cmd_map_repp)["ai-get-position-samples"] = ec_ai_get_position_samples;
238   (*cmd_map_repp)["ai-get-length"] = ec_ai_get_length;
239   (*cmd_map_repp)["ai-get-length-samples"] = ec_ai_get_length_samples;
240   (*cmd_map_repp)["ai-get-format"] = ec_ai_get_format;
241   (*cmd_map_repp)["ai-wave-edit"] = ec_ai_wave_edit;
242 }
243 
register_commands_ao(void)244 void ECA_IAMODE_PARSER::register_commands_ao(void)
245 {
246   (*cmd_map_repp)["ao-add"] = ec_ao_add;
247   (*cmd_map_repp)["ao-add-default"] = ec_ao_add_default;
248   (*cmd_map_repp)["ao-describe"] = ec_ao_describe;
249   (*cmd_map_repp)["ao-list"] = ec_ao_list;
250   (*cmd_map_repp)["ao-select"] = ec_ao_select;
251   (*cmd_map_repp)["ao-index-select"] = ec_ao_index_select;
252   (*cmd_map_repp)["ao-iselect"] = ec_ao_index_select;
253   (*cmd_map_repp)["ao-selected"] = ec_ao_selected;
254   (*cmd_map_repp)["ao-attach"] = ec_ao_attach;
255   (*cmd_map_repp)["ao-remove"] = ec_ao_remove;
256   (*cmd_map_repp)["ao-status"] = ec_ao_status;
257   (*cmd_map_repp)["ao-forward"] = ec_ao_forward;
258   (*cmd_map_repp)["ao-rewind"] = ec_ao_rewind;
259   (*cmd_map_repp)["ao-setpos"] = ec_ao_set_position;
260   (*cmd_map_repp)["ao-set-position"] = ec_ao_set_position;
261   (*cmd_map_repp)["ao-set-position-samples"] = ec_ao_set_position_samples;
262   (*cmd_map_repp)["ao-getpos"] = ec_ao_get_position;
263   (*cmd_map_repp)["ao-get-position"] = ec_ao_get_position;
264   (*cmd_map_repp)["ao-get-position-samples"] = ec_ao_get_position_samples;
265   (*cmd_map_repp)["ao-get-length"] = ec_ao_get_length;
266   (*cmd_map_repp)["ao-get-length-samples"] = ec_ao_get_length_samples;
267   (*cmd_map_repp)["ao-get-format"] = ec_ao_get_format;
268   (*cmd_map_repp)["ao-wave-edit"] = ec_ao_wave_edit;
269 }
270 
register_commands_cop(void)271 void ECA_IAMODE_PARSER::register_commands_cop(void)
272 {
273   (*cmd_map_repp)["cop-add"] = ec_cop_add;
274   (*cmd_map_repp)["cop-bypass"] = ec_cop_bypass;
275   (*cmd_map_repp)["cop-describe"] = ec_cop_describe;
276   (*cmd_map_repp)["cop-remove"] = ec_cop_remove;
277   (*cmd_map_repp)["cop-list"] = ec_cop_list;
278   (*cmd_map_repp)["cop-select"] = ec_cop_select;
279   (*cmd_map_repp)["cop-index-select"] = ec_cop_select;
280   (*cmd_map_repp)["cop-iselect"] = ec_cop_select;
281   (*cmd_map_repp)["cop-is-bypassed"] = ec_cop_is_bypassed;
282   (*cmd_map_repp)["cop-register"] = ec_cop_register;
283   (*cmd_map_repp)["cop-selected"] = ec_cop_selected;
284   (*cmd_map_repp)["cop-set"] = ec_cop_set;
285   (*cmd_map_repp)["cop-get"] = ec_cop_get;
286   (*cmd_map_repp)["cop-status"] = ec_cop_status;
287 }
288 
register_commands_copp(void)289 void ECA_IAMODE_PARSER::register_commands_copp(void)
290 {
291   (*cmd_map_repp)["copp-list"] = ec_copp_list;
292   (*cmd_map_repp)["copp-select"] = ec_copp_select;
293   (*cmd_map_repp)["copp-index-select"] = ec_copp_select;
294   (*cmd_map_repp)["copp-iselect"] = ec_copp_select;
295   (*cmd_map_repp)["copp-selected"] = ec_copp_selected;
296   (*cmd_map_repp)["copp-set"] = ec_copp_set;
297   (*cmd_map_repp)["copp-get"] = ec_copp_get;
298 }
299 
register_commands_ctrl(void)300 void ECA_IAMODE_PARSER::register_commands_ctrl(void)
301 {
302   (*cmd_map_repp)["ctrl-add"] = ec_ctrl_add;
303   (*cmd_map_repp)["ctrl-describe"] = ec_ctrl_describe;
304   (*cmd_map_repp)["ctrl-remove"] = ec_ctrl_remove;
305   (*cmd_map_repp)["ctrl-list"] = ec_ctrl_list;
306   (*cmd_map_repp)["ctrl-select"] = ec_ctrl_select;
307   (*cmd_map_repp)["ctrl-index-select"] = ec_ctrl_select;
308   (*cmd_map_repp)["ctrl-iselect"] = ec_ctrl_select;
309   (*cmd_map_repp)["ctrl-register"] = ec_ctrl_register;
310   (*cmd_map_repp)["ctrl-selected"] = ec_ctrl_selected;
311   (*cmd_map_repp)["ctrl-status"] = ec_ctrl_status;
312   (*cmd_map_repp)["ctrl-get-target"] = ec_ctrl_get_target;
313 }
314 
register_commands_ctrlp(void)315 void ECA_IAMODE_PARSER::register_commands_ctrlp(void)
316 {
317   (*cmd_map_repp)["ctrlp-list"] = ec_ctrlp_list;
318   (*cmd_map_repp)["ctrlp-select"] = ec_ctrlp_select;
319   (*cmd_map_repp)["ctrlp-selected"] = ec_ctrlp_selected;
320   (*cmd_map_repp)["ctrlp-get"] = ec_ctrlp_get;
321   (*cmd_map_repp)["ctrlp-set"] = ec_ctrlp_set;
322 }
323 
register_commands_dump(void)324 void ECA_IAMODE_PARSER::register_commands_dump(void)
325 {
326   (*cmd_map_repp)["dump-target"] = ec_dump_target;
327   (*cmd_map_repp)["dump-status"] = ec_dump_status;
328   (*cmd_map_repp)["dump-position"] = ec_dump_position;
329   (*cmd_map_repp)["dump-length"] = ec_dump_length;
330   (*cmd_map_repp)["dump-cs-status"] = ec_dump_cs_status;
331   (*cmd_map_repp)["dump-c-selected"] = ec_dump_c_selected;
332   (*cmd_map_repp)["dump-ai-selected"] = ec_dump_ai_selected;
333   (*cmd_map_repp)["dump-ai-position"] = ec_dump_ai_position;
334   (*cmd_map_repp)["dump-ai-length"] = ec_dump_ai_length;
335   (*cmd_map_repp)["dump-ai-open-state"] = ec_dump_ai_open_state;
336   (*cmd_map_repp)["dump-ao-selected"] = ec_dump_ao_selected;
337   (*cmd_map_repp)["dump-ao-position"] = ec_dump_ao_position;
338   (*cmd_map_repp)["dump-ao-length"] = ec_dump_ao_length;
339   (*cmd_map_repp)["dump-ao-open-state"] = ec_dump_ao_open_state;
340   (*cmd_map_repp)["dump-cop-value"] = ec_dump_cop_value;
341 }
342 
register_commands_external(void)343 void ECA_IAMODE_PARSER::register_commands_external(void)
344 {
345 #if ECA_COMPILE_JACK
346   (*cmd_map_repp)["jack-connect"] = ec_jack_connect;
347   (*cmd_map_repp)["jack-disconnect"] = ec_jack_disconnect;
348   (*cmd_map_repp)["jack-list-connections"] = ec_jack_list_connections;
349 #endif
350 }
351 
command_to_action_id(const std::string & cmdstring)352 int ECA_IAMODE_PARSER::command_to_action_id(const std::string& cmdstring)
353 {
354   return (*cmd_map_repp)[cmdstring];
355 }
356 
action_requires_params(int id)357 bool ECA_IAMODE_PARSER::action_requires_params(int id)
358 {
359   switch(id) {
360   case ec_debug:
361 
362   case ec_cs_add:
363   case ec_cs_select:
364   case ec_cs_index_select:
365   case ec_cs_load:
366   case ec_cs_save_as:
367   case ec_cs_set_param:
368   case ec_cs_set_audio_format:
369   case ec_cs_set_length:
370   case ec_cs_set_length_samples:
371   case ec_cs_rewind:
372   case ec_cs_forward:
373   case ec_cs_set_position:
374   case ec_cs_option:
375 
376   case ec_c_add:
377   case ec_c_select:
378   case ec_c_index_select:
379   case ec_c_deselect:
380   case ec_c_select_add:
381   case ec_c_rename:
382 
383   case ec_ai_add:
384   case ec_ai_select:
385   case ec_ai_index_select:
386   case ec_ai_forward:
387   case ec_ai_rewind:
388   case ec_ai_set_position:
389   case ec_ai_set_position_samples:
390 
391   case ec_ao_add:
392   case ec_ao_select:
393   case ec_ao_index_select:
394   case ec_ao_forward:
395   case ec_ao_rewind:
396   case ec_ao_set_position:
397   case ec_ao_set_position_samples:
398 
399   case ec_cop_add:
400   case ec_cop_select:
401   case ec_cop_set:
402   case ec_cop_get:
403 
404   case ec_copp_select:
405   case ec_copp_set:
406 
407   case ec_ctrl_add:
408   case ec_ctrl_select:
409 
410   case ec_int_set_float_to_string_precision:
411 
412   case ec_dump_target:
413   case ec_dump_cop_value:
414 
415   case ec_jack_connect:
416   case ec_jack_disconnect:
417 
418     return true;
419 
420   default:
421     break;
422   }
423   return false;
424 }
425 
action_requires_connected(int id)426 bool ECA_IAMODE_PARSER::action_requires_connected(int id)
427 {
428   switch(id) {
429   case ec_engine_launch:
430   case ec_engine_halt:
431   case ec_start:
432   case ec_run:
433 
434   case ec_cs_disconnect:
435   case ec_cs_set_position:
436   case ec_cs_set_position_samples:
437     return true;
438 
439   default:
440     break;
441   }
442   return false;
443 }
444 
action_requires_selected(int id)445 bool ECA_IAMODE_PARSER::action_requires_selected(int id)
446 {
447   switch(id) {
448 
449   case ec_cs_remove:
450   case ec_cs_edit:
451   case ec_cs_is_valid:
452   case ec_cs_save:
453   case ec_cs_save_as:
454   case ec_cs_connect:
455   case ec_cs_set_param:
456   case ec_cs_rewind:
457   case ec_cs_forward:
458   case ec_cs_set_position:
459   case ec_cs_set_position_samples:
460   case ec_cs_get_position:
461   case ec_cs_get_position_samples:
462   case ec_cs_get_length:
463   case ec_cs_get_length_samples:
464   case ec_cs_set_length:
465   case ec_cs_set_length_samples:
466   case ec_cs_toggle_loop:
467   case ec_cs_option:
468 
469   case ec_c_remove:
470   case ec_c_clear:
471   case ec_c_rename:
472   case ec_c_muting:
473   case ec_c_bypass:
474   case ec_c_status:
475   case ec_c_list:
476   case ec_c_select:
477   case ec_c_selected:
478 
479   case ec_aio_status:
480 
481   case ec_ai_add:
482   case ec_ai_select:
483   case ec_ai_selected:
484   case ec_ai_index_select:
485   case ec_ai_remove:
486   case ec_ai_attach:
487   case ec_ai_status:
488   case ec_ai_forward:
489   case ec_ai_rewind:
490   case ec_ai_set_position:
491   case ec_ai_set_position_samples:
492   case ec_ai_get_position:
493   case ec_ai_get_position_samples:
494   case ec_ai_get_length:
495   case ec_ai_get_length_samples:
496   case ec_ai_get_format:
497   case ec_ai_wave_edit:
498 
499   case ec_ao_add:
500   case ec_ao_add_default:
501   case ec_ao_select:
502   case ec_ao_selected:
503   case ec_ao_index_select:
504   case ec_ao_remove:
505   case ec_ao_attach:
506   case ec_ao_status:
507   case ec_ao_forward:
508   case ec_ao_rewind:
509   case ec_ao_set_position:
510   case ec_ao_set_position_samples:
511   case ec_ao_get_position:
512   case ec_ao_get_position_samples:
513   case ec_ao_get_length:
514   case ec_ao_get_length_samples:
515   case ec_ao_get_format:
516   case ec_ao_wave_edit:
517 
518   case ec_cop_add:
519   case ec_cop_bypass:
520   case ec_cop_is_bypassed:
521   case ec_cop_list:
522   case ec_cop_select:
523   case ec_cop_selected:
524   case ec_cop_set:
525   case ec_cop_get:
526   case ec_cop_status:
527 
528   case ec_copp_list:
529   case ec_copp_select:
530   case ec_copp_selected:
531   case ec_copp_set:
532 
533   case ec_ctrl_add:
534   case ec_ctrl_select:
535   case ec_ctrl_selected:
536   case ec_ctrl_status:
537 
538     return true;
539 
540   default: break;
541   }
542 
543   return false;
544 }
545 
action_requires_selected_not_connected(int id)546 bool ECA_IAMODE_PARSER::action_requires_selected_not_connected(int id)
547 {
548   switch(id) {
549   case ec_cs_remove:
550   case ec_cs_set_length:
551   case ec_cs_set_length_samples:
552   case ec_cs_toggle_loop:
553   case ec_cs_set_param:
554   case ec_cs_option:
555 
556   case ec_c_add:
557   case ec_c_remove:
558   case ec_c_rename:
559   case ec_c_clear:
560 
561   case ec_cop_remove:
562   case ec_ctrl_remove:
563 
564   case ec_ai_add:
565   case ec_ai_remove:
566   case ec_ai_attach:
567   case ec_ai_forward:
568   case ec_ai_rewind:
569   case ec_ai_set_position:
570   case ec_ai_set_position_samples:
571   case ec_ai_wave_edit:
572 
573   case ec_ao_add:
574   case ec_ao_add_default:
575   case ec_ao_remove:
576   case ec_ao_attach:
577   case ec_ao_forward:
578   case ec_ao_rewind:
579   case ec_ao_set_position:
580   case ec_ao_set_position_samples:
581   case ec_ao_wave_edit:
582 
583     return true;
584 
585   default:
586     break;
587   }
588   return false;
589 
590 }
591 
action_requires_selected_audio_input(int id)592 bool ECA_IAMODE_PARSER::action_requires_selected_audio_input(int id)
593 {
594   switch(id) {
595   case ec_ai_describe:
596   case ec_ai_remove:
597   case ec_ai_attach:
598   case ec_ai_forward:
599   case ec_ai_rewind:
600   case ec_ai_set_position:
601   case ec_ai_set_position_samples:
602   case ec_ai_get_position:
603   case ec_ai_get_position_samples:
604   case ec_ai_selected:
605   case ec_ai_get_length:
606   case ec_ai_get_length_samples:
607   case ec_ai_get_format:
608   case ec_ai_wave_edit:
609     return true;
610 
611   default:
612     break;
613   }
614   return false;
615 
616 }
617 
action_requires_selected_audio_output(int id)618 bool ECA_IAMODE_PARSER::action_requires_selected_audio_output(int id)
619 {
620   switch(id) {
621   case ec_ao_describe:
622   case ec_ao_remove:
623   case ec_ao_attach:
624   case ec_ao_forward:
625   case ec_ao_rewind:
626   case ec_ao_set_position:
627   case ec_ao_set_position_samples:
628   case ec_ao_get_position:
629   case ec_ao_get_position_samples:
630   case ec_ao_selected:
631   case ec_ao_get_length:
632   case ec_ao_get_length_samples:
633   case ec_ao_get_format:
634   case ec_ao_wave_edit:
635     return true;
636 
637   default:
638     break;
639   }
640   return false;
641 
642 }
643 
show_controller_help(void)644 void show_controller_help(void)
645 {
646   MESSAGE_ITEM mitem;
647 
648   mitem << "\n-------------------------------------------------------------------";
649   mitem << "\n ecasound interactive-mode - command reference";
650   mitem << "\n-------------------------------------------------------------------";
651 
652   mitem << "\n'q' - Quits ecasound";
653   mitem << "\n'start', 't' - Processing is started (play)";
654   mitem << "\n'stop', 's' - Stops processing";
655   mitem << "\n'rewind time-in-seconds', 'rw time-in-seconds' - Rewind";
656   mitem << "\n'forward time-in-seconds', 'fw time-in-seconds' - Forward";
657   mitem << "\n'setpos time-in-seconds' - Sets the current position to 'time-in-seconds' seconds from the beginning.";
658   mitem << "\n'engine-launch' - Initialize and start engine";
659   mitem << "\n'engine-status' - Engine status";
660   mitem << "\n'cs-status', 'st' - Chainsetup status";
661   mitem << "\n'c-status', 'cs' - Chain status";
662   mitem << "\n'cop-status', 'es' - Chain operator status";
663   mitem << "\n'ctrl-status' - Controller status";
664   mitem << "\n'aio-status', 'fs' - Audio input/output status";
665 
666   mitem << "\n--- see ecasound-iam(1) manual page for more info -----------------\n";
667   //  mitem << "\n'chain chainname', 'c chainname' - Enable/disable the the chain 'chainname'";
668 
669   ECA_LOG_MSG(ECA_LOGGER::info, mitem.to_string());
670 }
671