comparison main/OSCHandler.cpp @ 2441:3612bfc24950 spectrogram-export

More comprehensive debug output
author Chris Cannam
date Wed, 08 Jan 2020 15:40:58 +0000
parents d811380516f6
children b3330c31ea0e
comparison
equal deleted inserted replaced
2440:d811380516f6 2441:3612bfc24950
31 #include "widgets/AudioDial.h" 31 #include "widgets/AudioDial.h"
32 32
33 #include <bqaudioio/SystemPlaybackTarget.h> 33 #include <bqaudioio/SystemPlaybackTarget.h>
34 34
35 #include <QFileInfo> 35 #include <QFileInfo>
36 #include <QTime>
37 #include <QElapsedTimer>
38
39 #define NOW (QTime::currentTime().toString(Qt::ISODateWithMs))
36 40
37 void 41 void
38 MainWindow::handleOSCMessage(const OSCMessage &message) 42 MainWindow::handleOSCMessage(const OSCMessage &message)
39 { 43 {
40 SVDEBUG << "OSCHandler: method = \"" 44 QElapsedTimer timer;
41 << message.getMethod() << "\"" << endl; 45 timer.start();
46
47 SVDEBUG << "OSCHandler at " << NOW << ": handling message: "
48 << message.toString() << endl;
42 49
43 if (message.getMethod() == "open") { 50 if (message.getMethod() == "open") {
44 51
45 if (message.getArgCount() == 1 && 52 if (message.getArgCount() == 1 &&
46 message.getArg(0).canConvert(QVariant::String)) { 53 message.getArg(0).canConvert(QVariant::String)) {
47 QString path = message.getArg(0).toString(); 54 QString path = message.getArg(0).toString();
48 if (open(path, ReplaceMainModel) != FileOpenSucceeded) { 55 if (open(path, ReplaceMainModel) == FileOpenSucceeded) {
49 cerr << "OSCHandler: File open failed for path \"" 56 SVDEBUG << "OSCHandler: Opened path \""
50 << path << "\"" << endl; 57 << path << "\"" << endl;
58 } else {
59 SVCERR << "OSCHandler: File open failed for path \""
60 << path << "\"" << endl;
51 } 61 }
52 //!!! we really need to spin here and not return until the 62 //!!! we really need to spin here and not return until the
53 // file has been completely decoded... 63 // file has been completely decoded...
54 } 64 }
55 65
56 } else if (message.getMethod() == "openadditional") { 66 } else if (message.getMethod() == "openadditional") {
57 67
58 if (message.getArgCount() == 1 && 68 if (message.getArgCount() == 1 &&
59 message.getArg(0).canConvert(QVariant::String)) { 69 message.getArg(0).canConvert(QVariant::String)) {
60 QString path = message.getArg(0).toString(); 70 QString path = message.getArg(0).toString();
61 if (open(path, CreateAdditionalModel) != FileOpenSucceeded) { 71 if (open(path, CreateAdditionalModel) == FileOpenSucceeded) {
62 cerr << "OSCHandler: File open failed for path \"" 72 SVDEBUG << "OSCHandler: Opened additional path \""
73 << path << "\"" << endl;
74 } else {
75 SVCERR << "OSCHandler: File open failed for path \""
63 << path << "\"" << endl; 76 << path << "\"" << endl;
64 } 77 }
65 } 78 }
66 79
67 } else if (message.getMethod() == "recent" || 80 } else if (message.getMethod() == "recent" ||
73 message.getArg(0).canConvert(QVariant::Int)) { 86 message.getArg(0).canConvert(QVariant::Int)) {
74 n = message.getArg(0).toInt() - 1; 87 n = message.getArg(0).toInt() - 1;
75 } 88 }
76 std::vector<QString> recent = m_recentFiles.getRecent(); 89 std::vector<QString> recent = m_recentFiles.getRecent();
77 if (n >= 0 && n < int(recent.size())) { 90 if (n >= 0 && n < int(recent.size())) {
78 if (open(recent[n], ReplaceMainModel) != FileOpenSucceeded) { 91 QString path = recent[n];
79 cerr << "OSCHandler: File open failed for path \"" 92 if (open(path, ReplaceMainModel) == FileOpenSucceeded) {
80 << recent[n] << "\"" << endl; 93 SVDEBUG << "OSCHandler: Opened recent path \""
94 << path << "\"" << endl;
95 } else {
96 SVCERR << "OSCHandler: File open failed for path \""
97 << path << "\"" << endl;
81 } 98 }
82 } 99 }
83 100
84 } else if (message.getMethod() == "save") { 101 } else if (message.getMethod() == "save") {
85 102
86 QString path; 103 QString path;
87 if (message.getArgCount() == 1 && 104 if (message.getArgCount() == 1 &&
88 message.getArg(0).canConvert(QVariant::String)) { 105 message.getArg(0).canConvert(QVariant::String)) {
89 path = message.getArg(0).toString(); 106 path = message.getArg(0).toString();
90 if (QFileInfo(path).exists()) { 107 if (QFileInfo(path).exists()) {
91 SVDEBUG << "OSCHandler: Refusing to overwrite existing file in save" << endl; 108 SVCERR << "OSCHandler: Refusing to overwrite existing file in save" << endl;
109 } else if (saveSessionFile(path)) {
110 SVDEBUG << "OSCHandler: Saved session to path \""
111 << path << "\"" << endl;
92 } else { 112 } else {
93 saveSessionFile(path); 113 SVCERR << "OSCHandler: Save failed to path \""
114 << path << "\"" << endl;
94 } 115 }
95 } 116 }
96 117
97 } else if (message.getMethod() == "export") { 118 } else if (message.getMethod() == "export") {
98 119
100 if (getMainModel()) { 121 if (getMainModel()) {
101 if (message.getArgCount() == 1 && 122 if (message.getArgCount() == 1 &&
102 message.getArg(0).canConvert(QVariant::String)) { 123 message.getArg(0).canConvert(QVariant::String)) {
103 path = message.getArg(0).toString(); 124 path = message.getArg(0).toString();
104 if (QFileInfo(path).exists()) { 125 if (QFileInfo(path).exists()) {
105 SVDEBUG << "OSCHandler: Refusing to overwrite existing file in export" << endl; 126 SVCERR << "OSCHandler: Refusing to overwrite existing file in export" << endl;
106 } else { 127 } else {
107 WavFileWriter writer(path, 128 WavFileWriter writer(path,
108 getMainModel()->getSampleRate(), 129 getMainModel()->getSampleRate(),
109 getMainModel()->getChannelCount(), 130 getMainModel()->getChannelCount(),
110 WavFileWriter::WriteToTemporary); 131 WavFileWriter::WriteToTemporary);
111 MultiSelection ms = m_viewManager->getSelection(); 132 MultiSelection ms = m_viewManager->getSelection();
112 if (!ms.getSelections().empty()) { 133 if (writer.writeModel
113 //!!! todo: update WavFileWriter! 134 (getMainModel().get(),
114 writer.writeModel(getMainModel().get(), &ms); 135 ms.getSelections().empty() ? nullptr : &ms)) {
136 SVDEBUG << "OSCHandler: Exported audio to path \""
137 << path << "\"" << endl;
115 } else { 138 } else {
116 writer.writeModel(getMainModel().get()); 139 SVCERR << "OSCHandler: Export failed to path \""
140 << path << "\"" << endl;
117 } 141 }
118 } 142 }
119 } 143 }
120 } 144 }
121 145
211 if (message.getArgCount() == 1) { 235 if (message.getArgCount() == 1) {
212 236
213 if (message.getArg(0).canConvert(QVariant::String) && 237 if (message.getArg(0).canConvert(QVariant::String) &&
214 message.getArg(0).toString() == "similar") { 238 message.getArg(0).toString() == "similar") {
215 239
240 SVDEBUG << "OSCHandler: Calling ffwdSimilar" << endl;
216 ffwdSimilar(); 241 ffwdSimilar();
217 } 242 }
218 } else { 243 } else {
219 244
245 SVDEBUG << "OSCHandler: Calling ffwd" << endl;
220 ffwd(); 246 ffwd();
221 } 247 }
222 248
223 } else if (message.getMethod() == "rewind") { 249 } else if (message.getMethod() == "rewind") {
224 250
225 if (message.getArgCount() == 1) { 251 if (message.getArgCount() == 1) {
226 252
227 if (message.getArg(0).canConvert(QVariant::String) && 253 if (message.getArg(0).canConvert(QVariant::String) &&
228 message.getArg(0).toString() == "similar") { 254 message.getArg(0).toString() == "similar") {
229 255
256 SVDEBUG << "OSCHandler: Calling rewindSimilar" << endl;
230 rewindSimilar(); 257 rewindSimilar();
231 } 258 }
232 } else { 259 } else {
233 260
261 SVDEBUG << "OSCHandler: Calling rewind" << endl;
234 rewind(); 262 rewind();
235 } 263 }
236 264
237 } else if (message.getMethod() == "stop") { 265 } else if (message.getMethod() == "stop") {
238 266
239 if (m_playSource->isPlaying()) { 267 if (m_playSource->isPlaying()) {
240 // As with play, we want to use the MainWindow 268 // As with play, we want to use the MainWindow function
241 // function rather than call m_playSource directly 269 // rather than call m_playSource directly because that way
242 // because that way the audio driver suspend/resume 270 // the audio driver suspend/resume etc is handled properly
243 // etc is handled properly 271 SVDEBUG << "OSCHandler: Calling stop" << endl;
244 MainWindow::stop(); 272 MainWindow::stop();
245 } 273 } else {
274 SVDEBUG << "OSCHandler: Not playing, doing nothing" << endl;
275 }
246 276
247 } else if (message.getMethod() == "loop") { 277 } else if (message.getMethod() == "loop") {
248 278
249 if (message.getArgCount() == 1 && 279 if (message.getArgCount() == 1 &&
250 message.getArg(0).canConvert(QVariant::String)) { 280 message.getArg(0).canConvert(QVariant::String)) {
251 281
252 QString str = message.getArg(0).toString(); 282 QString str = message.getArg(0).toString();
253 if (str == "on") { 283 if (str == "on") {
284 SVDEBUG << "OSCHandler: Enabling loop mode" << endl;
254 m_viewManager->setPlayLoopMode(true); 285 m_viewManager->setPlayLoopMode(true);
255 } else if (str == "off") { 286 } else if (str == "off") {
287 SVDEBUG << "OSCHandler: Disabling loop mode" << endl;
256 m_viewManager->setPlayLoopMode(false); 288 m_viewManager->setPlayLoopMode(false);
257 } 289 }
258 } 290 }
259 291
260 } else if (message.getMethod() == "solo") { 292 } else if (message.getMethod() == "solo") {
262 if (message.getArgCount() == 1 && 294 if (message.getArgCount() == 1 &&
263 message.getArg(0).canConvert(QVariant::String)) { 295 message.getArg(0).canConvert(QVariant::String)) {
264 296
265 QString str = message.getArg(0).toString(); 297 QString str = message.getArg(0).toString();
266 if (str == "on") { 298 if (str == "on") {
299 SVDEBUG << "OSCHandler: Enabling solo mode" << endl;
267 m_viewManager->setPlaySoloMode(true); 300 m_viewManager->setPlaySoloMode(true);
268 } else if (str == "off") { 301 } else if (str == "off") {
302 SVDEBUG << "OSCHandler: Disabling solo mode" << endl;
269 m_viewManager->setPlaySoloMode(false); 303 m_viewManager->setPlaySoloMode(false);
270 } 304 }
271 } 305 }
272 306
273 } else if (message.getMethod() == "select" || 307 } else if (message.getMethod() == "select" ||
290 if (t0 < 0.0) t0 = 0.0; 324 if (t0 < 0.0) t0 = 0.0;
291 if (t1 < 0.0) t1 = 0.0; 325 if (t1 < 0.0) t1 = 0.0;
292 326
293 f0 = lrint(t0 * getMainModel()->getSampleRate()); 327 f0 = lrint(t0 * getMainModel()->getSampleRate());
294 f1 = lrint(t1 * getMainModel()->getSampleRate()); 328 f1 = lrint(t1 * getMainModel()->getSampleRate());
329
330 SVDEBUG << "OSCHandler: Converted selection extents to frames "
331 << f0 << " and " << f1 << endl;
295 332
296 Pane *pane = m_paneStack->getCurrentPane(); 333 Pane *pane = m_paneStack->getCurrentPane();
297 Layer *layer = nullptr; 334 Layer *layer = nullptr;
298 if (pane) layer = pane->getSelectedLayer(); 335 if (pane) layer = pane->getSelectedLayer();
299 if (layer) { 336 if (layer) {
300 int resolution; 337 int resolution;
301 layer->snapToFeatureFrame(pane, f0, resolution, 338 layer->snapToFeatureFrame(pane, f0, resolution,
302 Layer::SnapLeft, -1); 339 Layer::SnapLeft, -1);
303 layer->snapToFeatureFrame(pane, f1, resolution, 340 layer->snapToFeatureFrame(pane, f1, resolution,
304 Layer::SnapRight, -1); 341 Layer::SnapRight, -1);
342
343 SVDEBUG << "OSCHandler: Snapped selection extents to "
344 << f0 << " and " << f1 << " for current layer \""
345 << layer->getLayerPresentationName() << "\""
346 << endl;
305 } 347 }
306 348
307 } else if (message.getArgCount() == 1 && 349 } else if (message.getArgCount() == 1 &&
308 message.getArg(0).canConvert(QVariant::String)) { 350 message.getArg(0).canConvert(QVariant::String)) {
309 351
310 QString str = message.getArg(0).toString(); 352 QString str = message.getArg(0).toString();
311 if (str == "none") { 353 if (str == "none") {
354 SVDEBUG << "OSCHandler: Clearing selection" << endl;
312 m_viewManager->clearSelections(); 355 m_viewManager->clearSelections();
313 done = true; 356 done = true;
357 } else if (str == "all") {
358 SVDEBUG << "OSCHandler: Selecting all" << endl;
359 f0 = getModelsStartFrame();
360 f0 = getModelsEndFrame();
314 } 361 }
315 } 362 }
316 363
317 if (!done) { 364 if (!done) {
318 if (message.getMethod() == "select") { 365 if (message.getMethod() == "select") {
319 m_viewManager->setSelection(Selection(f0, f1)); 366 m_viewManager->setSelection(Selection(f0, f1));
320 } else { 367 } else {
321 m_viewManager->addSelection(Selection(f0, f1)); 368 m_viewManager->addSelection(Selection(f0, f1));
322 } 369 }
323 } 370 }
371
372 SVDEBUG << "OSCHandler: Selection now is "
373 << m_viewManager->getSelection().toString() << endl;
374
375 } else {
376 SVCERR << "OSCHandler: No main model, can't modify selection"
377 << endl;
324 } 378 }
325 379
326 } else if (message.getMethod() == "add") { 380 } else if (message.getMethod() == "add") {
327 381
328 if (getMainModel()) { 382 if (getMainModel()) {
334 if (message.getArgCount() == 2 && 388 if (message.getArgCount() == 2 &&
335 message.getArg(0).canConvert(QVariant::Int)) { 389 message.getArg(0).canConvert(QVariant::Int)) {
336 channel = message.getArg(0).toInt(); 390 channel = message.getArg(0).toInt();
337 if (channel < -1 || 391 if (channel < -1 ||
338 channel > int(getMainModel()->getChannelCount())) { 392 channel > int(getMainModel()->getChannelCount())) {
339 cerr << "WARNING: OSCHandler: channel " 393 SVCERR << "WARNING: OSCHandler: channel "
340 << channel << " out of range" << endl; 394 << channel << " out of range" << endl;
341 channel = -1; 395 channel = -1;
342 } 396 }
343 } 397 }
344 398
346 400
347 LayerFactory::LayerType type = 401 LayerFactory::LayerType type =
348 LayerFactory::getInstance()->getLayerTypeForName(str); 402 LayerFactory::getInstance()->getLayerTypeForName(str);
349 403
350 if (type == LayerFactory::UnknownLayer) { 404 if (type == LayerFactory::UnknownLayer) {
351 cerr << "WARNING: OSCHandler: unknown layer " 405 SVCERR << "WARNING: OSCHandler: unknown layer "
352 << "type " << str << endl; 406 << "type " << str << endl;
353 } else { 407 } else {
354 408
355 LayerConfiguration configuration(type, 409 LayerConfiguration configuration(type,
356 getMainModelId(), 410 getMainModelId(),
357 channel); 411 channel);
412
413 QString pname = LayerFactory::getInstance()->
414 getLayerPresentationName(type);
358 415
359 addPane(configuration, 416 addPane(configuration, tr("Add %1 Pane") .arg(pname));
360 tr("Add %1 Pane") 417
361 .arg(LayerFactory::getInstance()-> 418 SVDEBUG << "OSCHandler: Added pane \"" << pname
362 getLayerPresentationName(type))); 419 << "\"" << endl;
363 } 420 }
364 } 421 }
365 } 422 }
366 423
367 } else if (message.getMethod() == "undo") { 424 } else if (message.getMethod() == "undo") {
368 425
426 SVDEBUG << "OSCHandler: Calling undo" << endl;
369 CommandHistory::getInstance()->undo(); 427 CommandHistory::getInstance()->undo();
370 428
371 } else if (message.getMethod() == "redo") { 429 } else if (message.getMethod() == "redo") {
372 430
431 SVDEBUG << "OSCHandler: Calling redo" << endl;
373 CommandHistory::getInstance()->redo(); 432 CommandHistory::getInstance()->redo();
374 433
375 } else if (message.getMethod() == "set") { 434 } else if (message.getMethod() == "set") {
376 435
377 if (message.getArgCount() == 2 && 436 if (message.getArgCount() == 2 &&
472 } 531 }
473 532
474 if (paneIndex >= 0 && paneIndex < m_paneStack->getPaneCount()) { 533 if (paneIndex >= 0 && paneIndex < m_paneStack->getPaneCount()) {
475 Pane *pane = m_paneStack->getPane(paneIndex); 534 Pane *pane = m_paneStack->getPane(paneIndex);
476 m_paneStack->setCurrentPane(pane); 535 m_paneStack->setCurrentPane(pane);
536 SVDEBUG << "OSCHandler: Set current pane to index "
537 << paneIndex << " (pane id " << pane->getId()
538 << ")" << endl;
477 if (layerIndex >= 0 && layerIndex < pane->getLayerCount()) { 539 if (layerIndex >= 0 && layerIndex < pane->getLayerCount()) {
478 Layer *layer = pane->getFixedOrderLayer(layerIndex); 540 Layer *layer = pane->getFixedOrderLayer(layerIndex);
479 m_paneStack->setCurrentLayer(pane, layer); 541 m_paneStack->setCurrentLayer(pane, layer);
542 SVDEBUG << "OSCHandler: Set current layer to index "
543 << layerIndex << " (layer \""
544 << layer->getLayerPresentationName() << "\")" << endl;
480 } else if (wantLayer && layerIndex == -1) { 545 } else if (wantLayer && layerIndex == -1) {
481 m_paneStack->setCurrentLayer(pane, nullptr); 546 m_paneStack->setCurrentLayer(pane, nullptr);
482 } 547 } else if (wantLayer) {
548 SVCERR << "OSCHandler: Layer index "
549 << layerIndex << " out of range for pane" << endl;
550 }
483 } 551 }
484 552
485 } else if (message.getMethod() == "delete") { 553 } else if (message.getMethod() == "delete") {
486 554
487 if (message.getArgCount() == 1 && 555 if (message.getArgCount() == 1 &&
489 557
490 QString target = message.getArg(0).toString(); 558 QString target = message.getArg(0).toString();
491 559
492 if (target == "pane") { 560 if (target == "pane") {
493 561
562 SVDEBUG << "OSCHandler: Calling deleteCurrentPane" << endl;
494 deleteCurrentPane(); 563 deleteCurrentPane();
495 564
496 } else if (target == "layer") { 565 } else if (target == "layer") {
497 566
567 SVDEBUG << "OSCHandler: Calling deleteCurrentLayer" << endl;
498 deleteCurrentLayer(); 568 deleteCurrentLayer();
499 569
500 } else { 570 } else {
501 571
502 cerr << "WARNING: OSCHandler: Unknown delete target " << target << endl; 572 SVCERR << "WARNING: OSCHandler: Unknown delete target \""
573 << target << "\"" << endl;
503 } 574 }
504 } 575 }
505 576
506 } else if (message.getMethod() == "zoom") { 577 } else if (message.getMethod() == "zoom") {
507 578
528 } else { 599 } else {
529 zoomLevel = ZoomLevel(ZoomLevel::PixelsPerFrame, 600 zoomLevel = ZoomLevel(ZoomLevel::PixelsPerFrame,
530 int(round(1.0 / level))); 601 int(round(1.0 / level)));
531 } 602 }
532 if (currentPane) { 603 if (currentPane) {
604 SVDEBUG << "OSCHandler: Setting zoom level to "
605 << zoomLevel << endl;
533 currentPane->setZoomLevel(zoomLevel); 606 currentPane->setZoomLevel(zoomLevel);
607 } else {
608 SVCERR << "OSCHandler: No current pane, can't set zoom"
609 << endl;
534 } 610 }
535 } 611 }
536 } 612 }
537 613
538 } else if (message.getMethod() == "zoomvertical") { 614 } else if (message.getMethod() == "zoomvertical") {
599 } 675 }
600 } 676 }
601 677
602 } else if (message.getMethod() == "transform") { 678 } else if (message.getMethod() == "transform") {
603 679
604 Pane *pane = m_paneStack->getCurrentPane(); 680 if (message.getArgCount() == 1 &&
605
606 if (getMainModel() &&
607 pane &&
608 message.getArgCount() == 1 &&
609 message.getArg(0).canConvert(QVariant::String)) { 681 message.getArg(0).canConvert(QVariant::String)) {
610 682
611 TransformId transformId = message.getArg(0).toString(); 683 Pane *pane = m_paneStack->getCurrentPane();
612
613 Transform transform = TransformFactory::getInstance()->
614 getDefaultTransformFor(transformId);
615 684
616 Layer *newLayer = m_document->createDerivedLayer 685 if (getMainModel() && pane) {
617 (transform, getMainModelId()); 686
618 687 TransformId transformId = message.getArg(0).toString();
619 if (newLayer) { 688
620 m_document->addLayerToView(pane, newLayer); 689 Transform transform = TransformFactory::getInstance()->
621 m_recentTransforms.add(transformId); 690 getDefaultTransformFor(transformId);
622 m_paneStack->setCurrentLayer(pane, newLayer); 691
623 } 692 SVDEBUG << "OSCHandler: Running transform on main model:"
624 } 693 << transform.toXmlString() << endl;
694
695 Layer *newLayer = m_document->createDerivedLayer
696 (transform, getMainModelId());
697
698 if (newLayer) {
699 m_document->addLayerToView(pane, newLayer);
700 m_recentTransforms.add(transformId);
701 m_paneStack->setCurrentLayer(pane, newLayer);
702 } else {
703 SVCERR << "OSCHandler: Transform failed to run" << endl;
704 }
705 } else {
706 SVCERR << "OSCHandler: Lack main model or pane, "
707 << "can't run transform" << endl;
708 }
709 }
625 710
626 } else { 711 } else {
627 cerr << "WARNING: OSCHandler: Unknown or unsupported " 712 SVCERR << "WARNING: OSCHandler: Unknown or unsupported "
628 << "method \"" << message.getMethod() 713 << "method \"" << message.getMethod()
629 << "\"" << endl; 714 << "\"" << endl;
630 } 715 }
716
717 SVDEBUG << "OSCHandler at " << NOW << ": finished message: "
718 << message.toString() << " in " << timer.elapsed() << "ms" << endl;
631 } 719 }