111
112
engine_repp->engine_iteration();
114
/* case 3a: engine finished and in batch mode -> exit */
115
if ((engine_repp->status() == ECA_ENGINE::engine_status_finished ||
116
engine_repp->status() == ECA_ENGINE::engine_status_error) &&
115
/* case 3a-i: engine finished and in batch mode -> exit */
116
if (engine_repp->status() == ECA_ENGINE::engine_status_finished &&
117
117
engine_repp->batch_mode() == true) {
118
/* batch operation finished (or error occured) */
118
ECA_LOG_MSG(ECA_LOGGER::system_objects, "batch finished in exec, exit");
122
/* case 3a-ii: engine error occured -> exit */
123
else if (engine_repp->status() == ECA_ENGINE::engine_status_error) {
124
ECA_LOG_MSG(ECA_LOGGER::system_objects, "engine error, exit");
326
332
void ECA_ENGINE::command(Engine_command_t cmd, double arg)
328
impl_repp->command_queue_rep.push_back(static_cast<int>(cmd),arg);
334
ECA_ENGINE::complex_command_t item;
336
item.m.legacy.value = arg;
337
impl_repp->command_queue_rep.push_back(item);
341
* Sends 'ccmd' to engines command queue. Commands are
342
* processed in the server's main loop. Passing a complex
343
* command allows to address objects regardless of
344
* the state of ECA_CHAINSETUP iterators (i.e. currently
348
* must no be called from exec() context
350
void ECA_ENGINE::command(complex_command_t ccmd)
352
impl_repp->command_queue_rep.push_back(ccmd);
459
483
void ECA_ENGINE::check_command_queue(void)
485
while(impl_repp->command_queue_rep.is_empty() != true) {
486
ECA_ENGINE::complex_command_t item;
487
int popres = impl_repp->command_queue_rep.pop_front(&item);
490
/* queue is empty or temporarily unavailable, unable to continue
491
* processing messages without blocking */
502
edit_lock_rep = true;
503
if (status() == engine_status_running ||
504
status() == engine_status_finished) request_stop();
505
impl_repp->command_queue_rep.clear();
506
ECA_LOG_MSG(ECA_LOGGER::system_objects,"ecasound_queue: exit!");
512
// Chain operators (stateless addressing)
515
csetup_repp->execute_edit(item.m.cs);
519
case ep_prepare: { if (is_prepared() != true) prepare_operation(); break; }
520
case ep_start: { if (status() != engine_status_running) request_start(); break; }
521
case ep_stop: { if (status() == engine_status_running ||
522
status() == engine_status_finished) request_stop(); break; }
527
case ep_edit_lock: { edit_lock_rep = true; break; }
528
case ep_edit_unlock: { edit_lock_rep = false; break; }
531
// Section/chain (en/dis)abling commands.
533
case ep_c_select: { csetup_repp->selected_chain_index_rep = static_cast<size_t>(item.m.legacy.value); break; }
534
case ep_c_muting: { chain_muting(); break; }
535
case ep_c_bypass: { chain_processing(); break; }
540
case ep_rewind: { change_position(- item.m.legacy.value); break; }
541
case ep_forward: { change_position(item.m.legacy.value); break; }
542
case ep_setpos: { set_position(item.m.legacy.value); break; }
543
case ep_setpos_samples: { set_position_samples(static_cast<SAMPLE_SPECS::sample_pos_t>(item.m.legacy.value)); break; }
544
case ep_setpos_live_samples: { set_position_samples_live(static_cast<SAMPLE_SPECS::sample_pos_t>(item.m.legacy.value)); break; }
546
case ep_debug: break;
1162
1255
/**********************************************************************
1163
* Engine implementation - Private functions for cmd queue handling
1164
**********************************************************************/
1167
* Processes messages from the command queue.
1168
* If no messages are available, function
1169
* will return immediately.
1171
* context: E-level-2
1172
* can be run at the same time as engine_iteration();
1173
* note! this is called with the engine lock held
1174
* so no long operations allowed!
1176
* @see check_command_queue()
1178
void ECA_ENGINE::interpret_queue(void)
1180
while(impl_repp->command_queue_rep.is_empty() != true) {
1181
const std::pair<int,double>* item_p = impl_repp->command_queue_rep.front();
1182
std::pair<int,double> item;
1183
if (item_p != impl_repp->command_queue_rep.invalid_item()) {
1187
/* queue temporarily unavailable, unable to continue processing
1199
edit_lock_rep = true;
1200
if (status() == engine_status_running ||
1201
status() == engine_status_finished) request_stop();
1202
while(impl_repp->command_queue_rep.is_empty() == false) impl_repp->command_queue_rep.pop_front();
1203
ECA_LOG_MSG(ECA_LOGGER::system_objects,"ecasound_queue: exit!");
1204
driver_repp->exit();
1208
case ep_prepare: { if (is_prepared() != true) prepare_operation(); break; }
1209
case ep_start: { if (status() != engine_status_running) request_start(); break; }
1210
case ep_stop: { if (status() == engine_status_running ||
1211
status() == engine_status_finished) request_stop(); break; }
1216
case ep_edit_lock: { edit_lock_rep = true; break; }
1217
case ep_edit_unlock: { edit_lock_rep = false; break; }
1220
// Section/chain (en/dis)abling commands.
1222
case ep_c_select: { csetup_repp->active_chain_index_rep = static_cast<size_t>(item.second); break; }
1223
case ep_c_muting: { chain_muting(); break; }
1224
case ep_c_bypass: { chain_processing(); break; }
1229
case ep_cop_select: {
1230
csetup_repp->active_chainop_index_rep = static_cast<size_t>(item.second);
1231
if (csetup_repp->active_chainop_index_rep - 1 < static_cast<int>((*chains_repp)[csetup_repp->active_chain_index_rep]->number_of_chain_operators()))
1232
(*chains_repp)[csetup_repp->active_chain_index_rep]->select_chain_operator(csetup_repp->active_chainop_index_rep);
1234
csetup_repp->active_chainop_index_rep = 0;
1237
case ep_copp_select: {
1238
csetup_repp->active_chainop_param_index_rep = static_cast<size_t>(item.second);
1239
(*chains_repp)[csetup_repp->active_chain_index_rep]->select_chain_operator_parameter(csetup_repp->active_chainop_param_index_rep);
1242
case ep_copp_value: {
1243
assert(chains_repp != 0);
1244
(*chains_repp)[csetup_repp->active_chain_index_rep]->set_parameter(item.second);
1251
case ep_ctrl_select: {
1252
csetup_repp->active_ctrl_index_rep = static_cast<size_t>(item.second);
1253
if (csetup_repp->active_ctrl_index_rep - 1 < static_cast<int>((*chains_repp)[csetup_repp->active_chain_index_rep]->number_of_controllers()))
1254
(*chains_repp)[csetup_repp->active_chain_index_rep]->select_controller(csetup_repp->active_ctrl_index_rep);
1256
csetup_repp->active_ctrl_index_rep = 0;
1259
case ep_ctrlp_select: {
1260
csetup_repp->active_ctrl_param_index_rep = static_cast<size_t>(item.second);
1261
(*chains_repp)[csetup_repp->active_chain_index_rep]->select_controller_parameter(csetup_repp->active_ctrl_param_index_rep);
1264
case ep_ctrlp_value: {
1265
assert(chains_repp != 0);
1266
(*chains_repp)[csetup_repp->active_chain_index_rep]->set_controller_parameter(item.second);
1272
case ep_rewind: { change_position(- item.second); break; }
1273
case ep_forward: { change_position(item.second); break; }
1274
case ep_setpos: { set_position(item.second); break; }
1275
case ep_setpos_samples: { set_position_samples(static_cast<SAMPLE_SPECS::sample_pos_t>(item.second)); break; }
1276
case ep_setpos_live_samples: { set_position_samples_live(static_cast<SAMPLE_SPECS::sample_pos_t>(item.second)); break; }
1279
impl_repp->command_queue_rep.pop_front();
1283
/**********************************************************************
1284
1256
* Engine implementation - Private functions for setup and cleanup
1285
1257
**********************************************************************/