315 | | |
---|
316 | | const MatrixMixChannel MixerChannels_Traveler[] = { |
---|
317 | | {"Analog 1", MOTU_CTRL_STD_CHANNEL, 0x0000, }, |
---|
318 | | {"Analog 2", MOTU_CTRL_STD_CHANNEL, 0x0004, }, |
---|
319 | | {"Analog 3", MOTU_CTRL_STD_CHANNEL, 0x0008, }, |
---|
320 | | {"Analog 4", MOTU_CTRL_STD_CHANNEL, 0x000c, }, |
---|
321 | | {"Analog 5", MOTU_CTRL_STD_CHANNEL, 0x0010, }, |
---|
322 | | {"Analog 6", MOTU_CTRL_STD_CHANNEL, 0x0014, }, |
---|
323 | | {"Analog 7", MOTU_CTRL_STD_CHANNEL, 0x0018, }, |
---|
324 | | {"Analog 8", MOTU_CTRL_STD_CHANNEL, 0x001c, }, |
---|
325 | | {"AES/EBU 1", MOTU_CTRL_STD_CHANNEL, 0x0020, }, |
---|
326 | | {"AES/EBU 2", MOTU_CTRL_STD_CHANNEL, 0x0024, }, |
---|
327 | | {"SPDIF 1", MOTU_CTRL_STD_CHANNEL, 0x0028, }, |
---|
328 | | {"SPDIF 2", MOTU_CTRL_STD_CHANNEL, 0x002c, }, |
---|
329 | | {"ADAT 1", MOTU_CTRL_STD_CHANNEL, 0x0030, }, |
---|
330 | | {"ADAT 2", MOTU_CTRL_STD_CHANNEL, 0x0034, }, |
---|
331 | | {"ADAT 3", MOTU_CTRL_STD_CHANNEL, 0x0038, }, |
---|
332 | | {"ADAT 4", MOTU_CTRL_STD_CHANNEL, 0x003c, }, |
---|
333 | | {"ADAT 5", MOTU_CTRL_STD_CHANNEL, 0x0040, }, |
---|
334 | | {"ADAT 6", MOTU_CTRL_STD_CHANNEL, 0x0044, }, |
---|
335 | | {"ADAT 7", MOTU_CTRL_STD_CHANNEL, 0x0048, }, |
---|
336 | | {"ADAT 8", MOTU_CTRL_STD_CHANNEL, 0x004c, }, |
---|
337 | | }; |
---|
338 | | |
---|
339 | | const MixerCtrl MixerCtrls_Traveler[] = { |
---|
340 | | {"Mix1/Mix_", "Mix 1 ", "", MOTU_CTRL_STD_MIX, 0x0c20, }, |
---|
341 | | {"Mix2/Mix_", "Mix 2 ", "", MOTU_CTRL_STD_MIX, 0x0c24, }, |
---|
342 | | {"Mix3/Mix_", "Mix 3 ", "", MOTU_CTRL_STD_MIX, 0x0c28, }, |
---|
343 | | {"Mix4/Mix_", "Mix 4 ", "", MOTU_CTRL_STD_MIX, 0x0c2c, }, |
---|
344 | | {"Mainout_", "MainOut ", "", MOTU_CTRL_MIX_FADER, 0x0c0c, }, |
---|
345 | | {"Phones_", "Phones ", "", MOTU_CTRL_MIX_FADER, 0x0c10, }, |
---|
346 | | |
---|
347 | | /* For mic/line input controls, the "register" is the zero-based channel number */ |
---|
348 | | {"Control/Ana1_", "Analog 1 input ", "", MOTU_CTRL_TRAVELER_MIC_INPUT_CTRLS, 0}, |
---|
349 | | {"Control/Ana2_", "Analog 2 input ", "", MOTU_CTRL_TRAVELER_MIC_INPUT_CTRLS, 1}, |
---|
350 | | {"Control/Ana3_", "Analog 3 input ", "", MOTU_CTRL_TRAVELER_MIC_INPUT_CTRLS, 2}, |
---|
351 | | {"Control/Ana4_", "Analog 4 input ", "", MOTU_CTRL_TRAVELER_MIC_INPUT_CTRLS, 3}, |
---|
352 | | {"Control/Ana5_", "Analog 5 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 4}, |
---|
353 | | {"Control/Ana6_", "Analog 6 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 5}, |
---|
354 | | {"Control/Ana7_", "Analog 7 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 6}, |
---|
355 | | {"Control/Ana8_", "Analog 8 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 7}, |
---|
356 | | |
---|
357 | | /* For phones source control, "register" is currently unused */ |
---|
358 | | {"Control/Phones_", "Phones source", "", MOTU_CTRL_PHONES_SRC, 0}, |
---|
359 | | |
---|
360 | | /* For optical mode controls, the "register" is used to indicate direction */ |
---|
361 | | {"Control/OpticalIn_mode", "Optical input mode ", "", MOTU_CTRL_OPTICAL_MODE, MOTU_CTRL_DIR_IN}, |
---|
362 | | {"Control/OpticalOut_mode", "Optical output mode ", "", MOTU_CTRL_OPTICAL_MODE, MOTU_CTRL_DIR_OUT}, |
---|
363 | | }; |
---|
364 | | |
---|
365 | | const MatrixMixBus MixerBuses_Ultralite[] = { |
---|
366 | | {"Mix 1", 0x4000, }, |
---|
367 | | {"Mix 2", 0x4100, }, |
---|
368 | | {"Mix 3", 0x4200, }, |
---|
369 | | {"Mix 4", 0x4300, }, |
---|
370 | | }; |
---|
371 | | |
---|
372 | | const MatrixMixChannel MixerChannels_Ultralite[] = { |
---|
373 | | {"Analog 1", MOTU_CTRL_STD_CHANNEL, 0x0000, }, |
---|
374 | | {"Analog 2", MOTU_CTRL_STD_CHANNEL, 0x0004, }, |
---|
375 | | {"Analog 3", MOTU_CTRL_STD_CHANNEL, 0x0008, }, |
---|
376 | | {"Analog 4", MOTU_CTRL_STD_CHANNEL, 0x000c, }, |
---|
377 | | {"Analog 5", MOTU_CTRL_STD_CHANNEL, 0x0010, }, |
---|
378 | | {"Analog 6", MOTU_CTRL_STD_CHANNEL, 0x0014, }, |
---|
379 | | {"Analog 7", MOTU_CTRL_STD_CHANNEL, 0x0018, }, |
---|
380 | | {"Analog 8", MOTU_CTRL_STD_CHANNEL, 0x001c, }, |
---|
381 | | {"AES/EBU 1", MOTU_CTRL_STD_CHANNEL, MOTU_CTRL_NONE, }, |
---|
382 | | {"AES/EBU 2", MOTU_CTRL_STD_CHANNEL, MOTU_CTRL_NONE, }, |
---|
383 | | {"SPDIF 1", MOTU_CTRL_STD_CHANNEL, 0x0020, }, |
---|
384 | | {"SPDIF 2", MOTU_CTRL_STD_CHANNEL, 0x0024, }, |
---|
385 | | {"ADAT 1", MOTU_CTRL_STD_CHANNEL, MOTU_CTRL_NONE, }, |
---|
386 | | {"ADAT 2", MOTU_CTRL_STD_CHANNEL, MOTU_CTRL_NONE, }, |
---|
387 | | {"ADAT 3", MOTU_CTRL_STD_CHANNEL, MOTU_CTRL_NONE, }, |
---|
388 | | {"ADAT 4", MOTU_CTRL_STD_CHANNEL, MOTU_CTRL_NONE, }, |
---|
389 | | {"ADAT 5", MOTU_CTRL_STD_CHANNEL, MOTU_CTRL_NONE, }, |
---|
390 | | {"ADAT 6", MOTU_CTRL_STD_CHANNEL, MOTU_CTRL_NONE, }, |
---|
391 | | {"ADAT 7", MOTU_CTRL_STD_CHANNEL, MOTU_CTRL_NONE, }, |
---|
392 | | {"ADAT 8", MOTU_CTRL_STD_CHANNEL, MOTU_CTRL_NONE, }, |
---|
393 | | }; |
---|
394 | | |
---|
395 | | const MixerCtrl MixerCtrls_Ultralite[] = { |
---|
396 | | {"Mix1/Mix_", "Mix 1 ", "", MOTU_CTRL_STD_MIX, 0x0c20, }, |
---|
397 | | {"Mix2/Mix_", "Mix 2 ", "", MOTU_CTRL_STD_MIX, 0x0c24, }, |
---|
398 | | {"Mix3/Mix_", "Mix 3 ", "", MOTU_CTRL_STD_MIX, 0x0c28, }, |
---|
399 | | {"Mix4/Mix_", "Mix 4 ", "", MOTU_CTRL_STD_MIX, 0x0c2c, }, |
---|
400 | | {"Mainout_", "MainOut ", "", MOTU_CTRL_MIX_FADER, 0x0c0c, }, |
---|
401 | | {"Phones_", "Phones ", "", MOTU_CTRL_MIX_FADER, 0x0c10, }, |
---|
402 | | |
---|
403 | | /* For mic/line input controls, the "register" is the zero-based channel number */ |
---|
404 | | {"Control/Ana1_", "Analog 1 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 0}, |
---|
405 | | {"Control/Ana2_", "Analog 2 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 1}, |
---|
406 | | {"Control/Ana3_", "Analog 3 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 2}, |
---|
407 | | {"Control/Ana4_", "Analog 4 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 3}, |
---|
408 | | {"Control/Ana5_", "Analog 5 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 4}, |
---|
409 | | {"Control/Ana6_", "Analog 6 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 5}, |
---|
410 | | {"Control/Ana7_", "Analog 7 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 6}, |
---|
411 | | {"Control/Ana8_", "Analog 8 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 7}, |
---|
412 | | {"Control/Spdif1_", "SPDIF 1 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 6}, |
---|
413 | | {"Control/Spdif2_", "SPDIF 2 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 7}, |
---|
414 | | |
---|
415 | | /* For phones source control, "register" is currently unused */ |
---|
416 | | {"Control/Phones_", "Phones source", "", MOTU_CTRL_PHONES_SRC, 0}, |
---|
417 | | |
---|
418 | | /* For optical mode controls, the "register" is used to indicate direction */ |
---|
419 | | {"Control/OpticalIn_mode", "Optical input mode ", "", MOTU_CTRL_OPTICAL_MODE, MOTU_CTRL_DIR_IN}, |
---|
420 | | {"Control/OpticalOut_mode", "Optical output mode ", "", MOTU_CTRL_OPTICAL_MODE, MOTU_CTRL_DIR_OUT}, |
---|
421 | | }; |
---|
422 | | |
---|
423 | | const MatrixMixBus MixerBuses_896HD[] = { |
---|
424 | | {"Mix 1", 0x4000, }, |
---|
425 | | {"Mix 2", 0x4100, }, |
---|
426 | | {"Mix 3", 0x4200, }, |
---|
427 | | {"Mix 4", 0x4300, }, |
---|
428 | | }; |
---|
429 | | |
---|
430 | | const MatrixMixChannel MixerChannels_896HD[] = { |
---|
431 | | {"Analog 1", MOTU_CTRL_STD_CHANNEL, 0x0000, }, |
---|
432 | | {"Analog 2", MOTU_CTRL_STD_CHANNEL, 0x0004, }, |
---|
433 | | {"Analog 3", MOTU_CTRL_STD_CHANNEL, 0x0008, }, |
---|
434 | | {"Analog 4", MOTU_CTRL_STD_CHANNEL, 0x000c, }, |
---|
435 | | {"Analog 5", MOTU_CTRL_STD_CHANNEL, 0x0010, }, |
---|
436 | | {"Analog 6", MOTU_CTRL_STD_CHANNEL, 0x0014, }, |
---|
437 | | {"Analog 7", MOTU_CTRL_STD_CHANNEL, 0x0018, }, |
---|
438 | | {"Analog 8", MOTU_CTRL_STD_CHANNEL, 0x001c, }, |
---|
439 | | {"AES/EBU 1", MOTU_CTRL_STD_CHANNEL, 0x0020, }, |
---|
440 | | {"AES/EBU 2", MOTU_CTRL_STD_CHANNEL, 0x0024, }, |
---|
441 | | {"SPDIF 1", MOTU_CTRL_STD_CHANNEL, 0x0048, }, |
---|
442 | | {"SPDIF 2", MOTU_CTRL_STD_CHANNEL, 0x004c, }, |
---|
443 | | {"ADAT 1", MOTU_CTRL_STD_CHANNEL, 0x0028, }, |
---|
444 | | {"ADAT 2", MOTU_CTRL_STD_CHANNEL, 0x002c, }, |
---|
445 | | {"ADAT 3", MOTU_CTRL_STD_CHANNEL, 0x0030, }, |
---|
446 | | {"ADAT 4", MOTU_CTRL_STD_CHANNEL, 0x0034, }, |
---|
447 | | {"ADAT 5", MOTU_CTRL_STD_CHANNEL, 0x0038, }, |
---|
448 | | {"ADAT 6", MOTU_CTRL_STD_CHANNEL, 0x003c, }, |
---|
449 | | {"ADAT 7", MOTU_CTRL_STD_CHANNEL, 0x0040, }, |
---|
450 | | {"ADAT 8", MOTU_CTRL_STD_CHANNEL, 0x0044, }, |
---|
451 | | }; |
---|
452 | | |
---|
453 | | const MixerCtrl MixerCtrls_896HD[] = { |
---|
454 | | {"Mix1/Mix_", "Mix 1 ", "", MOTU_CTRL_STD_MIX, 0x0c20, }, |
---|
455 | | {"Mix2/Mix_", "Mix 2 ", "", MOTU_CTRL_STD_MIX, 0x0c24, }, |
---|
456 | | {"Mix3/Mix_", "Mix 3 ", "", MOTU_CTRL_STD_MIX, 0x0c28, }, |
---|
457 | | {"Mix4/Mix_", "Mix 4 ", "", MOTU_CTRL_STD_MIX, 0x0c2c, }, |
---|
458 | | {"Mainout_", "MainOut ", "", MOTU_CTRL_MIX_FADER, 0x0c0c, }, |
---|
459 | | {"Phones_", "Phones ", "", MOTU_CTRL_MIX_FADER, 0x0c10, }, |
---|
460 | | |
---|
461 | | /* For phones source control, "register" is currently unused */ |
---|
462 | | {"Control/Phones_", "Phones source", "", MOTU_CTRL_PHONES_SRC, 0}, |
---|
463 | | |
---|
464 | | /* For optical mode controls, the "register" is used to indicate direction */ |
---|
465 | | {"Control/OpticalIn_mode", "Optical input mode ", "", MOTU_CTRL_OPTICAL_MODE, MOTU_CTRL_DIR_IN}, |
---|
466 | | {"Control/OpticalOut_mode", "Optical output mode ", "", MOTU_CTRL_OPTICAL_MODE, MOTU_CTRL_DIR_OUT}, |
---|
467 | | |
---|
468 | | /* For meter controls the "register" indicates which meter controls are available */ |
---|
469 | | {"Control/Meter_", "Meter ", "", MOTU_CTRL_METER, |
---|
470 | | MOTU_CTRL_METER_PEAKHOLD | MOTU_CTRL_METER_CLIPHOLD | MOTU_CTRL_METER_AESEBU_SRC | |
---|
471 | | MOTU_CTRL_METER_PROG_SRC}, |
---|
472 | | }; |
---|
473 | | |
---|
474 | | const MatrixMixBus MixerBuses_828Mk2[] = { |
---|
475 | | {"Mix 1", 0x4000, }, |
---|
476 | | {"Mix 2", 0x4100, }, |
---|
477 | | {"Mix 3", 0x4200, }, |
---|
478 | | {"Mix 4", 0x4300, }, |
---|
479 | | }; |
---|
480 | | |
---|
481 | | const MatrixMixChannel MixerChannels_828Mk2[] = { |
---|
482 | | {"Analog 1", MOTU_CTRL_STD_CHANNEL, 0x0000, }, |
---|
483 | | {"Analog 2", MOTU_CTRL_STD_CHANNEL, 0x0004, }, |
---|
484 | | {"Analog 3", MOTU_CTRL_STD_CHANNEL, 0x0008, }, |
---|
485 | | {"Analog 4", MOTU_CTRL_STD_CHANNEL, 0x000c, }, |
---|
486 | | {"Analog 5", MOTU_CTRL_STD_CHANNEL, 0x0010, }, |
---|
487 | | {"Analog 6", MOTU_CTRL_STD_CHANNEL, 0x0014, }, |
---|
488 | | {"Analog 7", MOTU_CTRL_STD_CHANNEL, 0x0018, }, |
---|
489 | | {"Analog 8", MOTU_CTRL_STD_CHANNEL, 0x001c, }, |
---|
490 | | {"Mic 1", MOTU_CTRL_STD_CHANNEL, 0x0020, }, |
---|
491 | | {"Mic 2", MOTU_CTRL_STD_CHANNEL, 0x0024, }, |
---|
492 | | {"SPDIF 1", MOTU_CTRL_STD_CHANNEL, 0x0028, }, |
---|
493 | | {"SPDIF 2", MOTU_CTRL_STD_CHANNEL, 0x002c, }, |
---|
494 | | {"ADAT 1", MOTU_CTRL_STD_CHANNEL, 0x0030, }, |
---|
495 | | {"ADAT 2", MOTU_CTRL_STD_CHANNEL, 0x0034, }, |
---|
496 | | {"ADAT 3", MOTU_CTRL_STD_CHANNEL, 0x0038, }, |
---|
497 | | {"ADAT 4", MOTU_CTRL_STD_CHANNEL, 0x003c, }, |
---|
498 | | {"ADAT 5", MOTU_CTRL_STD_CHANNEL, 0x0040, }, |
---|
499 | | {"ADAT 6", MOTU_CTRL_STD_CHANNEL, 0x0044, }, |
---|
500 | | {"ADAT 7", MOTU_CTRL_STD_CHANNEL, 0x0048, }, |
---|
501 | | {"ADAT 8", MOTU_CTRL_STD_CHANNEL, 0x004c, }, |
---|
502 | | }; |
---|
503 | | |
---|
504 | | const MixerCtrl MixerCtrls_828Mk2[] = { |
---|
505 | | {"Mix1/Mix_", "Mix 1 ", "", MOTU_CTRL_STD_MIX, 0x0c20, }, |
---|
506 | | {"Mix2/Mix_", "Mix 2 ", "", MOTU_CTRL_STD_MIX, 0x0c24, }, |
---|
507 | | {"Mix3/Mix_", "Mix 3 ", "", MOTU_CTRL_STD_MIX, 0x0c28, }, |
---|
508 | | {"Mix4/Mix_", "Mix 4 ", "", MOTU_CTRL_STD_MIX, 0x0c2c, }, |
---|
509 | | {"Mainout_", "MainOut ", "", MOTU_CTRL_MIX_FADER, 0x0c0c, }, |
---|
510 | | {"Phones_", "Phones ", "", MOTU_CTRL_MIX_FADER, 0x0c10, }, |
---|
511 | | |
---|
512 | | /* For mic/line input controls, the "register" is the zero-based channel number */ |
---|
513 | | {"Control/Ana1_", "Analog 1 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 0}, |
---|
514 | | {"Control/Ana2_", "Analog 2 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 1}, |
---|
515 | | {"Control/Ana3_", "Analog 3 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 2}, |
---|
516 | | {"Control/Ana4_", "Analog 4 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 3}, |
---|
517 | | {"Control/Ana5_", "Analog 5 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 4}, |
---|
518 | | {"Control/Ana6_", "Analog 6 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 5}, |
---|
519 | | {"Control/Ana7_", "Analog 7 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 6}, |
---|
520 | | {"Control/Ana8_", "Analog 8 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 7}, |
---|
521 | | |
---|
522 | | /* For phones source control, "register" is currently unused */ |
---|
523 | | {"Control/Phones_", "Phones source", "", MOTU_CTRL_PHONES_SRC, 0}, |
---|
524 | | |
---|
525 | | /* For optical mode controls, the "register" is used to indicate direction */ |
---|
526 | | {"Control/OpticalIn_mode", "Optical input mode ", "", MOTU_CTRL_OPTICAL_MODE, MOTU_CTRL_DIR_IN}, |
---|
527 | | {"Control/OpticalOut_mode", "Optical output mode ", "", MOTU_CTRL_OPTICAL_MODE, MOTU_CTRL_DIR_OUT}, |
---|
528 | | }; |
---|
529 | | |
---|
530 | | const MotuMixer Mixer_Traveler = MOTUMIXER( |
---|
531 | | MixerCtrls_Traveler, MixerBuses_Traveler, MixerChannels_Traveler); |
---|
532 | | |
---|
533 | | const MotuMixer Mixer_Ultralite = MOTUMIXER( |
---|
534 | | MixerCtrls_Ultralite, MixerBuses_Ultralite, MixerChannels_Ultralite); |
---|
535 | | |
---|
536 | | const MotuMixer Mixer_828Mk2 = MOTUMIXER( |
---|
537 | | MixerCtrls_828Mk2, MixerBuses_828Mk2, MixerChannels_828Mk2); |
---|
538 | | |
---|
539 | | const MotuMixer Mixer_896HD = MOTUMIXER( |
---|
540 | | MixerCtrls_896HD, MixerBuses_896HD, MixerChannels_896HD); |
---|
586 | | } |
---|
587 | | |
---|
588 | | bool |
---|
589 | | MotuDevice::buildMixerAudioControls(void) { |
---|
590 | | |
---|
591 | | bool result = true; |
---|
592 | | MotuMatrixMixer *fader_mmixer = NULL; |
---|
593 | | MotuMatrixMixer *pan_mmixer = NULL; |
---|
594 | | MotuMatrixMixer *solo_mmixer = NULL; |
---|
595 | | MotuMatrixMixer *mute_mmixer = NULL; |
---|
596 | | const struct MatrixMixBus *buses = NULL; |
---|
597 | | const struct MatrixMixChannel *channels = NULL; |
---|
598 | | unsigned int bus, ch, i; |
---|
599 | | |
---|
600 | | if (DevicesProperty[m_motu_model-1].mixer == NULL) { |
---|
601 | | debugOutput(DEBUG_LEVEL_WARNING, "No mixer controls defined for model %d\n", m_motu_model); |
---|
602 | | result = false; |
---|
603 | | } else { |
---|
604 | | buses = DevicesProperty[m_motu_model-1].mixer->mixer_buses; |
---|
605 | | if (buses == NULL) { |
---|
606 | | debugOutput(DEBUG_LEVEL_WARNING, "No buses defined for model %d\n", m_motu_model); |
---|
607 | | result = false; |
---|
608 | | } |
---|
609 | | channels = DevicesProperty[m_motu_model-1].mixer->mixer_channels; |
---|
610 | | if (channels == NULL) { |
---|
611 | | debugOutput(DEBUG_LEVEL_WARNING, "No channels defined for model %d\n", m_motu_model); |
---|
612 | | result = false; |
---|
613 | | } |
---|
614 | | } |
---|
615 | | if (result == false) { |
---|
616 | | return true; |
---|
617 | | } |
---|
618 | | |
---|
619 | | /* Create the top-level matrix mixers */ |
---|
620 | | fader_mmixer = new ChannelFaderMatrixMixer(*this, "fader"); |
---|
621 | | result &= m_MixerContainer->addElement(fader_mmixer); |
---|
622 | | pan_mmixer = new ChannelPanMatrixMixer(*this, "pan"); |
---|
623 | | result &= m_MixerContainer->addElement(pan_mmixer); |
---|
624 | | solo_mmixer = new ChannelBinSwMatrixMixer(*this, "solo", |
---|
625 | | MOTU_CTRL_MASK_SOLO_VALUE, MOTU_CTRL_MASK_SOLO_SETENABLE); |
---|
626 | | result &= m_MixerContainer->addElement(solo_mmixer); |
---|
627 | | mute_mmixer = new ChannelBinSwMatrixMixer(*this, "mute", |
---|
628 | | MOTU_CTRL_MASK_MUTE_VALUE, MOTU_CTRL_MASK_MUTE_SETENABLE); |
---|
629 | | result &= m_MixerContainer->addElement(mute_mmixer); |
---|
630 | | |
---|
631 | | for (bus=0; bus<DevicesProperty[m_motu_model-1].mixer->n_mixer_buses; bus++) { |
---|
632 | | fader_mmixer->addRowInfo(buses[bus].name, 0, buses[bus].address); |
---|
633 | | pan_mmixer->addRowInfo(buses[bus].name, 0, buses[bus].address); |
---|
634 | | solo_mmixer->addRowInfo(buses[bus].name, 0, buses[bus].address); |
---|
635 | | mute_mmixer->addRowInfo(buses[bus].name, 0, buses[bus].address); |
---|
636 | | } |
---|
637 | | |
---|
638 | | for (ch=0; ch<DevicesProperty[m_motu_model-1].mixer->n_mixer_channels; ch++) { |
---|
639 | | uint32_t flags = channels[ch].flags; |
---|
640 | | if (flags & MOTU_CTRL_CHANNEL_FADER) |
---|
641 | | fader_mmixer->addColInfo(channels[ch].name, 0, channels[ch].addr_ofs); |
---|
642 | | if (flags & MOTU_CTRL_CHANNEL_PAN) |
---|
643 | | pan_mmixer->addColInfo(channels[ch].name, 0, channels[ch].addr_ofs); |
---|
644 | | if (flags & MOTU_CTRL_CHANNEL_SOLO) |
---|
645 | | solo_mmixer->addColInfo(channels[ch].name, 0, channels[ch].addr_ofs); |
---|
646 | | if (flags & MOTU_CTRL_CHANNEL_MUTE) |
---|
647 | | mute_mmixer->addColInfo(channels[ch].name, 0, channels[ch].addr_ofs); |
---|
648 | | flags &= ~(MOTU_CTRL_CHANNEL_FADER|MOTU_CTRL_CHANNEL_PAN|MOTU_CTRL_CHANNEL_SOLO|MOTU_CTRL_CHANNEL_MUTE); |
---|
649 | | if (flags) { |
---|
650 | | debugOutput(DEBUG_LEVEL_WARNING, "Control %s: unknown flag bits 0x%08x\n", channels[ch].name, flags); |
---|
651 | | } |
---|
652 | | } |
---|
653 | | |
---|
654 | | // Single non-matrixed mixer controls get added here. Channel controls are supported |
---|
655 | | // here, but usually these will be a part of a matrix mixer. |
---|
656 | | for (i=0; i<DevicesProperty[m_motu_model-1].mixer->n_mixer_ctrls; i++) { |
---|
657 | | const struct MixerCtrl *ctrl = &DevicesProperty[m_motu_model-1].mixer->mixer_ctrl[i]; |
---|
658 | | unsigned int type; |
---|
659 | | char name[100]; |
---|
660 | | char label[100]; |
---|
661 | | |
---|
662 | | if (ctrl == NULL) { |
---|
663 | | debugOutput(DEBUG_LEVEL_WARNING, "NULL control at index %d for model %d\n", i, m_motu_model); |
---|
664 | | continue; |
---|
665 | | } |
---|
666 | | type = ctrl->type; |
---|
667 | | if (type & MOTU_CTRL_CHANNEL_FADER) { |
---|
668 | | snprintf(name, 100, "%s%s", ctrl->name, "fader"); |
---|
669 | | snprintf(label,100, "%s%s", ctrl->label,"fader"); |
---|
670 | | result &= m_MixerContainer->addElement( |
---|
671 | | new ChannelFader(*this, ctrl->dev_register, name, label, ctrl->desc)); |
---|
672 | | type &= ~MOTU_CTRL_CHANNEL_FADER; |
---|
673 | | } |
---|
674 | | if (type & MOTU_CTRL_CHANNEL_PAN) { |
---|
675 | | snprintf(name, 100, "%s%s", ctrl->name, "pan"); |
---|
676 | | snprintf(label,100, "%s%s", ctrl->label,"pan"); |
---|
677 | | result &= m_MixerContainer->addElement( |
---|
678 | | new ChannelPan(*this, |
---|
679 | | ctrl->dev_register, |
---|
680 | | name, label, |
---|
681 | | ctrl->desc)); |
---|
682 | | type &= ~MOTU_CTRL_CHANNEL_PAN; |
---|
683 | | } |
---|
684 | | if (type & MOTU_CTRL_CHANNEL_MUTE) { |
---|
685 | | snprintf(name, 100, "%s%s", ctrl->name, "mute"); |
---|
686 | | snprintf(label,100, "%s%s", ctrl->label,"mute"); |
---|
687 | | result &= m_MixerContainer->addElement( |
---|
688 | | new MotuBinarySwitch(*this, ctrl->dev_register, |
---|
689 | | MOTU_CTRL_MASK_MUTE_VALUE, MOTU_CTRL_MASK_MUTE_SETENABLE, |
---|
690 | | name, label, ctrl->desc)); |
---|
691 | | type &= ~MOTU_CTRL_CHANNEL_MUTE; |
---|
692 | | } |
---|
693 | | if (type & MOTU_CTRL_CHANNEL_SOLO) { |
---|
694 | | snprintf(name, 100, "%s%s", ctrl->name, "solo"); |
---|
695 | | snprintf(label,100, "%s%s", ctrl->label,"solo"); |
---|
696 | | result &= m_MixerContainer->addElement( |
---|
697 | | new MotuBinarySwitch(*this, ctrl->dev_register, |
---|
698 | | MOTU_CTRL_MASK_SOLO_VALUE, MOTU_CTRL_MASK_SOLO_SETENABLE, |
---|
699 | | name, label, ctrl->desc)); |
---|
700 | | type &= ~MOTU_CTRL_CHANNEL_SOLO; |
---|
701 | | } |
---|
702 | | |
---|
703 | | if (type & MOTU_CTRL_MIX_FADER) { |
---|
704 | | snprintf(name, 100, "%s%s", ctrl->name, "fader"); |
---|
705 | | snprintf(label,100, "%s%s", ctrl->label,"fader"); |
---|
706 | | result &= m_MixerContainer->addElement( |
---|
707 | | new MixFader(*this, ctrl->dev_register, name, label, ctrl->desc)); |
---|
708 | | type &= ~MOTU_CTRL_MIX_FADER; |
---|
709 | | } |
---|
710 | | if (type & MOTU_CTRL_MIX_MUTE) { |
---|
711 | | snprintf(name, 100, "%s%s", ctrl->name, "mute"); |
---|
712 | | snprintf(label,100, "%s%s", ctrl->label,"mute"); |
---|
713 | | result &= m_MixerContainer->addElement( |
---|
714 | | new MixMute(*this, ctrl->dev_register, name, label, ctrl->desc)); |
---|
715 | | type &= ~MOTU_CTRL_MIX_MUTE; |
---|
716 | | } |
---|
717 | | if (type & MOTU_CTRL_MIX_DEST) { |
---|
718 | | snprintf(name, 100, "%s%s", ctrl->name, "dest"); |
---|
719 | | snprintf(label,100, "%s%s", ctrl->label,"dest"); |
---|
720 | | result &= m_MixerContainer->addElement( |
---|
721 | | new MixDest(*this, ctrl->dev_register, name, label, ctrl->desc)); |
---|
722 | | type &= ~MOTU_CTRL_MIX_DEST; |
---|
723 | | } |
---|
724 | | |
---|
725 | | if (type & MOTU_CTRL_INPUT_UL_GAIN) { |
---|
726 | | snprintf(name, 100, "%s%s", ctrl->name, "trimgain"); |
---|
727 | | snprintf(label,100, "%s%s", ctrl->label,"trimgain"); |
---|
728 | | result &= m_MixerContainer->addElement( |
---|
729 | | new InputGainPadInv(*this, ctrl->dev_register, MOTU_CTRL_MODE_UL_GAIN, |
---|
730 | | name, label, ctrl->desc)); |
---|
731 | | type &= ~MOTU_CTRL_INPUT_UL_GAIN; |
---|
732 | | } |
---|
733 | | if (type & MOTU_CTRL_INPUT_PHASE_INV) { |
---|
734 | | snprintf(name, 100, "%s%s", ctrl->name, "invert"); |
---|
735 | | snprintf(label,100, "%s%s", ctrl->label,"invert"); |
---|
736 | | result &= m_MixerContainer->addElement( |
---|
737 | | new InputGainPadInv(*this, ctrl->dev_register, MOTU_CTRL_MODE_PHASE_INV, |
---|
738 | | name, label, ctrl->desc)); |
---|
739 | | type &= ~MOTU_CTRL_INPUT_PHASE_INV; |
---|
740 | | } |
---|
741 | | if (type & MOTU_CTRL_INPUT_TRIMGAIN) { |
---|
742 | | snprintf(name, 100, "%s%s", ctrl->name, "trimgain"); |
---|
743 | | snprintf(label,100, "%s%s", ctrl->label,"trimgain"); |
---|
744 | | result &= m_MixerContainer->addElement( |
---|
745 | | new InputGainPadInv(*this, ctrl->dev_register, MOTU_CTRL_MODE_TRIMGAIN, |
---|
746 | | name, label, ctrl->desc)); |
---|
747 | | type &= ~MOTU_CTRL_INPUT_TRIMGAIN; |
---|
748 | | } |
---|
749 | | if (type & MOTU_CTRL_INPUT_PAD) { |
---|
750 | | snprintf(name, 100, "%s%s", ctrl->name, "pad"); |
---|
751 | | snprintf(label,100, "%s%s", ctrl->label,"pad"); |
---|
752 | | result &= m_MixerContainer->addElement( |
---|
753 | | new InputGainPadInv(*this, ctrl->dev_register, MOTU_CTRL_MODE_PAD, |
---|
754 | | name, label, ctrl->desc)); |
---|
755 | | type &= ~MOTU_CTRL_INPUT_PAD; |
---|
756 | | } |
---|
757 | | |
---|
758 | | if (type & MOTU_CTRL_INPUT_LEVEL) { |
---|
759 | | snprintf(name, 100, "%s%s", ctrl->name, "level"); |
---|
760 | | snprintf(label,100, "%s%s", ctrl->label,"level"); |
---|
761 | | result &= m_MixerContainer->addElement( |
---|
762 | | new MotuBinarySwitch(*this, MOTU_REG_INPUT_LEVEL, |
---|
763 | | 1<<ctrl->dev_register, 0, name, label, ctrl->desc)); |
---|
764 | | type &= ~MOTU_CTRL_INPUT_LEVEL; |
---|
765 | | } |
---|
766 | | if (type & MOTU_CTRL_INPUT_BOOST) { |
---|
767 | | snprintf(name, 100, "%s%s", ctrl->name, "boost"); |
---|
768 | | snprintf(label,100, "%s%s", ctrl->label,"boost"); |
---|
769 | | result &= m_MixerContainer->addElement( |
---|
770 | | new MotuBinarySwitch(*this, MOTU_REG_INPUT_BOOST, |
---|
771 | | 1<<ctrl->dev_register, 0, name, label, ctrl->desc)); |
---|
772 | | type &= ~MOTU_CTRL_INPUT_BOOST; |
---|
773 | | } |
---|
774 | | if (type & MOTU_CTRL_PHONES_SRC) { |
---|
775 | | snprintf(name, 100, "%s%s", ctrl->name, "src"); |
---|
776 | | snprintf(label,100, "%s%s", ctrl->label,"src"); |
---|
777 | | result &= m_MixerContainer->addElement( |
---|
778 | | new PhonesSrc(*this, name, label, ctrl->desc)); |
---|
779 | | type &= ~MOTU_CTRL_PHONES_SRC; |
---|
780 | | } |
---|
781 | | if (type & MOTU_CTRL_OPTICAL_MODE) { |
---|
782 | | result &= m_MixerContainer->addElement( |
---|
783 | | new OpticalMode(*this, ctrl->dev_register, |
---|
784 | | ctrl->name, ctrl->label, ctrl->desc)); |
---|
785 | | type &= ~MOTU_CTRL_OPTICAL_MODE; |
---|
786 | | } |
---|
787 | | if (type & MOTU_CTRL_METER) { |
---|
788 | | if (ctrl->dev_register & MOTU_CTRL_METER_PEAKHOLD) { |
---|
789 | | snprintf(name, 100, "%s%s", ctrl->name, "peakhold_time"); |
---|
790 | | snprintf(label,100, "%s%s", ctrl->label,"peakhold time"); |
---|
791 | | result &= m_MixerContainer->addElement( |
---|
792 | | new MeterControl(*this, MOTU_METER_PEAKHOLD_MASK, |
---|
793 | | MOTU_METER_PEAKHOLD_SHIFT, name, label, ctrl->desc)); |
---|
794 | | } |
---|
795 | | if (ctrl->dev_register & MOTU_CTRL_METER_CLIPHOLD) { |
---|
796 | | snprintf(name, 100, "%s%s", ctrl->name, "cliphold_time"); |
---|
797 | | snprintf(label,100, "%s%s", ctrl->label,"cliphold time"); |
---|
798 | | result &= m_MixerContainer->addElement( |
---|
799 | | new MeterControl(*this, MOTU_METER_CLIPHOLD_MASK, |
---|
800 | | MOTU_METER_CLIPHOLD_SHIFT, name, label, ctrl->desc)); |
---|
801 | | } |
---|
802 | | if (ctrl->dev_register & MOTU_CTRL_METER_AESEBU_SRC) { |
---|
803 | | snprintf(name, 100, "%s%s", ctrl->name, "aesebu_src"); |
---|
804 | | snprintf(label,100, "%s%s", ctrl->label,"AESEBU source"); |
---|
805 | | result &= m_MixerContainer->addElement( |
---|
806 | | new MeterControl(*this, MOTU_METER_AESEBU_SRC_MASK, |
---|
807 | | MOTU_METER_AESEBU_SRC_SHIFT, name, label, ctrl->desc)); |
---|
808 | | } |
---|
809 | | if (ctrl->dev_register & MOTU_CTRL_METER_PROG_SRC) { |
---|
810 | | snprintf(name, 100, "%s%s", ctrl->name, "src"); |
---|
811 | | snprintf(label,100, "%s%s", ctrl->label,"source"); |
---|
812 | | result &= m_MixerContainer->addElement( |
---|
813 | | new MeterControl(*this, MOTU_METER_PROG_SRC_MASK, |
---|
814 | | MOTU_METER_PROG_SRC_SHIFT, name, label, ctrl->desc)); |
---|
815 | | } |
---|
816 | | type &= ~MOTU_CTRL_METER; |
---|
817 | | } |
---|
818 | | |
---|
819 | | if (type) { |
---|
820 | | debugOutput(DEBUG_LEVEL_WARNING, "Unknown mixer control type flag bits 0x%08x\n", ctrl->type); |
---|
821 | | } |
---|
822 | | } |
---|
823 | | return result; |
---|
824 | | } |
---|
825 | | |
---|
826 | | bool |
---|
827 | | MotuDevice::buildMixer() { |
---|
828 | | bool result = true; |
---|
829 | | |
---|
830 | | destroyMixer(); |
---|
831 | | debugOutput(DEBUG_LEVEL_VERBOSE, "Building a MOTU mixer...\n"); |
---|
832 | | |
---|
833 | | // create the mixer object container |
---|
834 | | m_MixerContainer = new Control::Container(this, "Mixer"); |
---|
835 | | if (!m_MixerContainer) { |
---|
836 | | debugError("Could not create mixer container...\n"); |
---|
837 | | return false; |
---|
838 | | } |
---|
839 | | |
---|
840 | | // Create and populate the top-level matrix mixers |
---|
841 | | result = buildMixerAudioControls(); |
---|
842 | | |
---|
843 | | /* Now add some general device information controls. These may yet |
---|
844 | | * become device-specific if it turns out to be easier that way. |
---|
845 | | */ |
---|
846 | | result &= m_MixerContainer->addElement( |
---|
847 | | new InfoElement(*this, MOTU_INFO_MODEL, "Info/Model", "Model identifier", "")); |
---|
848 | | result &= m_MixerContainer->addElement( |
---|
849 | | new InfoElement(*this, MOTU_INFO_IS_STREAMING, "Info/IsStreaming", "Is device streaming", "")); |
---|
850 | | result &= m_MixerContainer->addElement( |
---|
851 | | new InfoElement(*this, MOTU_INFO_SAMPLE_RATE, "Info/SampleRate", "Device sample rate", "")); |
---|
852 | | |
---|
853 | | if (!addElement(m_MixerContainer)) { |
---|
854 | | debugWarning("Could not register mixer to device\n"); |
---|
855 | | // clean up |
---|
856 | | destroyMixer(); |
---|
857 | | return false; |
---|
858 | | } |
---|
859 | | |
---|
860 | | // Special controls |
---|
861 | | m_ControlContainer = new Control::Container(this, "Control"); |
---|
862 | | if (!m_ControlContainer) { |
---|
863 | | debugError("Could not create control container...\n"); |
---|
864 | | destroyMixer(); |
---|
865 | | return false; |
---|
866 | | } |
---|
867 | | |
---|
868 | | // Special controls get added here |
---|
869 | | |
---|
870 | | if (!result) { |
---|
871 | | debugWarning("One or more device control elements could not be created\n"); |
---|
872 | | // clean up those that couldn't be created |
---|
873 | | destroyMixer(); |
---|
874 | | return false; |
---|
875 | | } |
---|
876 | | if (!addElement(m_ControlContainer)) { |
---|
877 | | debugWarning("Could not register controls to device\n"); |
---|
878 | | // clean up |
---|
879 | | destroyMixer(); |
---|
880 | | return false; |
---|
881 | | } |
---|
882 | | |
---|
883 | | return true; |
---|
884 | | } |
---|
885 | | |
---|
886 | | |
---|
887 | | bool |
---|
888 | | MotuDevice::destroyMixer() { |
---|
889 | | bool ret = true; |
---|
890 | | debugOutput(DEBUG_LEVEL_VERBOSE, "destroy mixer...\n"); |
---|
891 | | |
---|
892 | | if (m_MixerContainer == NULL) { |
---|
893 | | debugOutput(DEBUG_LEVEL_VERBOSE, "no mixer to destroy...\n"); |
---|
894 | | } else |
---|
895 | | if (!deleteElement(m_MixerContainer)) { |
---|
896 | | debugError("Mixer present but not registered to the avdevice\n"); |
---|
897 | | ret = false; |
---|
898 | | } else { |
---|
899 | | // remove and delete (as in free) child control elements |
---|
900 | | m_MixerContainer->clearElements(true); |
---|
901 | | delete m_MixerContainer; |
---|
902 | | m_MixerContainer = NULL; |
---|
903 | | } |
---|
904 | | |
---|
905 | | // remove control container |
---|
906 | | if (m_ControlContainer == NULL) { |
---|
907 | | debugOutput(DEBUG_LEVEL_VERBOSE, "no controls to destroy...\n"); |
---|
908 | | } else |
---|
909 | | if (!deleteElement(m_ControlContainer)) { |
---|
910 | | debugError("Controls present but not registered to the avdevice\n"); |
---|
911 | | ret = false; |
---|
912 | | } else { |
---|
913 | | // remove and delete (as in free) child control elements |
---|
914 | | m_ControlContainer->clearElements(true); |
---|
915 | | delete m_ControlContainer; |
---|
916 | | m_ControlContainer = NULL; |
---|
917 | | } |
---|
918 | | return ret; |
---|