Changeset 1315
- Timestamp:
- 08/18/08 16:23:16 (5 months ago)
- Files:
-
- branches/libffado-2.0/src/motu/motu_avdevice.cpp (modified) (3 diffs)
- branches/libffado-2.0/src/motu/motu_avdevice.h (modified) (1 diff)
- branches/libffado-2.0/src/motu/motu_controls.cpp (modified) (1 diff)
- branches/libffado-2.0/src/motu/motu_controls.h (modified) (3 diffs)
- branches/libffado-2.0/support/mixer/mixer_motu.py (modified) (2 diffs)
- branches/libffado-2.0/support/mixer/mixer_motu.ui (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/libffado-2.0/src/motu/motu_avdevice.cpp
r1300 r1315 302 302 }; 303 303 304 const MixerCtrl MixerCtrls_896HD[] = { 305 {"Mix1/Mix_", "Mix 1 ", "", MOTU_CTRL_STD_MIX, 0x0c20, }, 306 {"Mix2/Mix_", "Mix 2 ", "", MOTU_CTRL_STD_MIX, 0x0c24, }, 307 {"Mix3/Mix_", "Mix 3 ", "", MOTU_CTRL_STD_MIX, 0x0c28, }, 308 {"Mix4/Mix_", "Mix 4 ", "", MOTU_CTRL_STD_MIX, 0x0c2c, }, 309 310 /* For phones source control, "register" is currently unused */ 311 {"Control/Phones_", "Phones source", "", MOTU_CTRL_PHONES_SRC, 0}, 312 313 /* For optical mode controls, the "register" is used to indicate direction */ 314 {"Control/OpticalIn_mode", "Optical input mode ", "", MOTU_CTRL_OPTICAL_MODE, MOTU_DIR_IN}, 315 {"Control/OpticalOut_mode", "Optical output mode ", "", MOTU_CTRL_OPTICAL_MODE, MOTU_DIR_OUT}, 316 317 /* For meter controls the "register" indicates which meter controls are available */ 318 {"Control/Meter_", "Meter ", "", MOTU_CTRL_METER, 319 MOTU_CTRL_METER_PEAKHOLD | MOTU_CTRL_METER_CLIPHOLD | MOTU_CTRL_METER_AESEBU_SRC | 320 MOTU_CTRL_METER_PROG_SRC}, 321 }; 322 304 323 const MixerCtrl MixerCtrls_828Mk2[] = { 305 324 {"Mix1/Mix_", "Mix 1 ", "", MOTU_CTRL_STD_MIX, 0x0c20, }, … … 332 351 MixerCtrls_828Mk2, MixerBuses_Traveler, MixerChannels_Traveler); 333 352 334 // For convenience during initial testing, just make the 896HD use the 335 // Traveler's mixer definition. Separate definitions for these models will 336 // come once the final mixer structure is in place. For now it's in a state 337 // of flux and subject to significant change. 338 #define Mixer_896HD Mixer_Traveler 353 const MotuMixer Mixer_896HD = MOTUMIXER( 354 MixerCtrls_896HD, MixerBuses_Traveler, MixerChannels_Traveler); 339 355 340 356 /* The order of DevicesProperty entries must match the numeric order of the … … 548 564 ctrl->name, ctrl->label, ctrl->desc)); 549 565 type &= ~MOTU_CTRL_OPTICAL_MODE; 566 } 567 if (type & MOTU_CTRL_METER) { 568 if (ctrl->dev_register & MOTU_CTRL_METER_PEAKHOLD) { 569 snprintf(name, 100, "%s%s", ctrl->name, "peakhold_time"); 570 snprintf(label,100, "%s%s", ctrl->label,"peakhold time"); 571 result &= m_MixerContainer->addElement( 572 new MeterControl(*this, MOTU_METER_PEAKHOLD_MASK, 573 MOTU_METER_PEAKHOLD_SHIFT, name, label, ctrl->desc)); 574 } 575 if (ctrl->dev_register & MOTU_CTRL_METER_CLIPHOLD) { 576 snprintf(name, 100, "%s%s", ctrl->name, "cliphold_time"); 577 snprintf(label,100, "%s%s", ctrl->label,"cliphold time"); 578 result &= m_MixerContainer->addElement( 579 new MeterControl(*this, MOTU_METER_CLIPHOLD_MASK, 580 MOTU_METER_CLIPHOLD_SHIFT, name, label, ctrl->desc)); 581 } 582 if (ctrl->dev_register & MOTU_CTRL_METER_AESEBU_SRC) { 583 snprintf(name, 100, "%s%s", ctrl->name, "aesebu_src"); 584 snprintf(label,100, "%s%s", ctrl->label,"AESEBU source"); 585 result &= m_MixerContainer->addElement( 586 new MeterControl(*this, MOTU_METER_AESEBU_SRC_MASK, 587 MOTU_METER_AESEBU_SRC_SHIFT, name, label, ctrl->desc)); 588 } 589 if (ctrl->dev_register & MOTU_CTRL_METER_PROG_SRC) { 590 snprintf(name, 100, "%s%s", ctrl->name, "src"); 591 snprintf(label,100, "%s%s", ctrl->label,"source"); 592 result &= m_MixerContainer->addElement( 593 new MeterControl(*this, MOTU_METER_PROG_SRC_MASK, 594 MOTU_METER_PROG_SRC_SHIFT, name, label, ctrl->desc)); 595 } 596 type &= ~MOTU_CTRL_METER; 550 597 } 551 598 branches/libffado-2.0/src/motu/motu_avdevice.h
r1300 r1315 68 68 #define MOTU_DIR_INOUT (MOTU_DIR_IN | MOTU_DIR_OUT) 69 69 70 #define MOTU_METER_PEAKHOLD_MASK 0x3800 71 #define MOTU_METER_PEAKHOLD_SHIFT 11 72 #define MOTU_METER_CLIPHOLD_MASK 0x0700 73 #define MOTU_METER_CLIPHOLD_SHIFT 8 74 #define MOTU_METER_AESEBU_SRC_MASK 0x0004 75 #define MOTU_METER_AESEBU_SRC_SHIFT 2 76 #define MOTU_METER_PROG_SRC_MASK 0x0003 77 #define MOTU_METER_PROG_SRC_SHIFT 0 78 70 79 /* Device registers */ 71 80 #define MOTU_REG_ISOCTRL 0x0b00 72 81 #define MOTU_REG_OPTICAL_CTRL 0x0b10 73 82 #define MOTU_REG_CLK_CTRL 0x0b14 83 #define MOTU_REG_896HD_METER_REG 0x0b1c 84 #define MOTU_REG_896HD_METER_CONF 0x0b24 74 85 #define MOTU_REG_ROUTE_PORT_CONF 0x0c04 75 86 #define MOTU_REG_INPUT_LEVEL 0x0c08 branches/libffado-2.0/src/motu/motu_controls.cpp
r1300 r1315 727 727 } 728 728 729 MeterControl::MeterControl(MotuDevice &parent, unsigned int ctrl_mask, unsigned int ctrl_shift) 730 : MotuDiscreteCtrl(parent, ctrl_mask) 731 { 732 m_shift = ctrl_shift; 733 validate(); 734 } 735 736 MeterControl::MeterControl(MotuDevice &parent, unsigned int ctrl_mask, unsigned int ctrl_shift, 737 std::string name, std::string label, std::string descr) 738 : MotuDiscreteCtrl(parent, ctrl_mask, name, label, descr) 739 { 740 m_shift = ctrl_shift; 741 validate(); 742 } 743 744 void MeterControl::validate(void) { 745 if (m_register & (1<< m_shift) == 0) { 746 debugOutput(DEBUG_LEVEL_VERBOSE, "Inconsistent mask/shift: 0x%08x/%d\n", m_register, m_shift); 747 } 748 } 749 750 bool 751 MeterControl::setValue(int v) 752 { 753 unsigned int val; 754 debugOutput(DEBUG_LEVEL_VERBOSE, "setValue for meter control 0x%08x/%d: %d\n", 755 m_register, m_shift, v); 756 757 // Need to get current register setting so we can preserve the parts not 758 // being controlled by this object. m_register holds the mask for the 759 // parts we're changing. 760 val = m_parent.ReadRegister(MOTU_REG_896HD_METER_CONF) & ~m_register; 761 val |= (v << m_shift) & m_register; 762 763 m_parent.WriteRegister(MOTU_REG_896HD_METER_CONF, val); 764 765 // Drivers under other OSes set MOTU_REG_896HD_METER_REG (0x0b1c) to 766 // 0x0400 whenever MOTU_REG_896HD_METER_CONF (0x0b24) is changed. 767 // There's no obvious reason why they do this, but since it's no hassle 768 // we might as well do the same. 769 m_parent.WriteRegister(MOTU_REG_896HD_METER_REG, 0x0400); 770 771 return true; 772 } 773 774 int 775 MeterControl::getValue() 776 { 777 unsigned int val; 778 debugOutput(DEBUG_LEVEL_VERBOSE, "getValue for meter control 0x%08x/%d\n", 779 m_register, m_shift); 780 781 // m_register holds the mask of the part of interest 782 val = (m_parent.ReadRegister(MOTU_REG_896HD_METER_CONF) & m_register) >> m_shift; 783 784 return val; 785 } 786 729 787 InfoElement::InfoElement(MotuDevice &parent, unsigned infotype) 730 788 : MotuDiscreteCtrl(parent, infotype) branches/libffado-2.0/src/motu/motu_controls.h
r1300 r1315 41 41 #define MOTU_CTRL_MIX_DEST 0x00000400 42 42 43 #define MOTU_CTRL_METER 0x00001000 44 43 45 #define MOTU_CTRL_INPUT_TRIMGAIN 0x01000000 44 46 #define MOTU_CTRL_INPUT_PAD 0x02000000 … … 73 75 #define MOTU_CTRL_MODE_PAD 0x00000000 74 76 #define MOTU_CTRL_MODE_TRIMGAIN 0x00000001 77 78 #define MOTU_CTRL_METER_PEAKHOLD 0x00000000 79 #define MOTU_CTRL_METER_CLIPHOLD 0x00000001 80 #define MOTU_CTRL_METER_AESEBU_SRC 0x00000002 81 #define MOTU_CTRL_METER_PROG_SRC 0x00000004 75 82 76 83 #define MOTU_INFO_MODEL 0x00000001 … … 293 300 }; 294 301 302 class MeterControl 303 : public MotuDiscreteCtrl 304 { 305 public: 306 MeterControl(MotuDevice &parent, unsigned int ctrl_mask, unsigned int ctrl_shift); 307 MeterControl(MotuDevice &parent, unsigned int ctrl_mask, unsigned int ctrl_shift, 308 std::string name, std::string label, std::string descr); 309 310 virtual bool setValue(int v); 311 virtual int getValue(); 312 protected: 313 void validate(); 314 unsigned int m_shift; 315 }; 316 295 317 class InfoElement 296 318 : public MotuDiscreteCtrl branches/libffado-2.0/support/mixer/mixer_motu.py
r1313 r1315 560 560 self.optical_in_mode: ['/Mixer/Control/OpticalIn_mode'], 561 561 self.optical_out_mode: ['/Mixer/Control/OpticalOut_mode'], 562 563 self.meter_src_ctrl: ['/Mixer/Control/Meter_src'], 564 self.aesebu_meter_ctrl: ['/Mixer/Control/Meter_aesebu_src'], 565 self.peakhold_time_ctrl:['/Mixer/Control/Meter_peakhold_time'], 566 self.cliphold_time_ctrl:['/Mixer/Control/Meter_cliphold_time'], 562 567 } 563 568 … … 636 641 self.optical_in_mode.removeItem(2) 637 642 self.optical_out_mode.removeItem(2) 643 644 # Only the 896HD has meter controls 645 if (self.model != MOTU_MODEL_896HD): 646 self.disable_hide(self.meter_src) 647 self.disable_hide(self.aesebu_meter) 648 self.disable_hide(self.peakhold_time) 649 self.disable_hide(self.cliphold_time) 638 650 639 651 # Some controls must be disabled if the device is streaming branches/libffado-2.0/support/mixer/mixer_motu.ui
r1310 r1315 27 27 <x>0</x> 28 28 <y>0</y> 29 <width>9 58</width>29 <width>992</width> 30 30 <height>693</height> 31 31 </rect> … … 252 252 </vbox> 253 253 </widget> 254 <widget class="Line"> 255 <property name="name"> 256 <cstring>line2_2</cstring> 257 </property> 258 <property name="frameShape"> 259 <enum>HLine</enum> 260 </property> 261 <property name="frameShadow"> 262 <enum>Sunken</enum> 263 </property> 264 <property name="orientation"> 265 <enum>Horizontal</enum> 266 </property> 267 </widget> 268 <widget class="QGroupBox"> 269 <property name="name"> 270 <cstring>meter_src</cstring> 271 </property> 272 <property name="font"> 273 <font> 274 <pointsize>10</pointsize> 275 </font> 276 </property> 277 <property name="frameShape"> 278 <enum>NoFrame</enum> 279 </property> 280 <property name="title"> 281 <string>Meter source</string> 282 </property> 283 <vbox> 284 <property name="name"> 285 <cstring>unnamed</cstring> 286 </property> 287 <widget class="QComboBox"> 288 <item> 289 <property name="text"> 290 <string>Analog out</string> 291 </property> 292 </item> 293 <item> 294 <property name="text"> 295 <string>ADAT in</string> 296 </property> 297 </item> 298 <item> 299 <property name="text"> 300 <string>ADAT out</string> 301 </property> 302 </item> 303 <property name="name"> 304 <cstring>meter_src_ctrl</cstring> 305 </property> 306 <property name="font"> 307 <font> 308 <pointsize>9</pointsize> 309 </font> 310 </property> 311 </widget> 312 </vbox> 313 </widget> 314 <widget class="QGroupBox"> 315 <property name="name"> 316 <cstring>aesebu_meter</cstring> 317 </property> 318 <property name="font"> 319 <font> 320 <pointsize>10</pointsize> 321 </font> 322 </property> 323 <property name="frameShape"> 324 <enum>NoFrame</enum> 325 </property> 326 <property name="title"> 327 <string>AES/EBU Meter</string> 328 </property> 329 <vbox> 330 <property name="name"> 331 <cstring>unnamed</cstring> 332 </property> 333 <widget class="QComboBox"> 334 <item> 335 <property name="text"> 336 <string>AES/EBU out</string> 337 </property> 338 </item> 339 <item> 340 <property name="text"> 341 <string>AES/EBU in</string> 342 </property> 343 </item> 344 <property name="name"> 345 <cstring>aesebu_meter_ctrl</cstring> 346 </property> 347 <property name="font"> 348 <font> 349 <pointsize>9</pointsize> 350 </font> 351 </property> 352 </widget> 353 </vbox> 354 </widget> 355 <widget class="QGroupBox"> 356 <property name="name"> 357 <cstring>peakhold_time</cstring> 358 </property> 359 <property name="font"> 360 <font> 361 <pointsize>10</pointsize> 362 </font> 363 </property> 364 <property name="frameShape"> 365 <enum>NoFrame</enum> 366 </property> 367 <property name="title"> 368 <string>Peakhold time</string> 369 </property> 370 <vbox> 371 <property name="name"> 372 <cstring>unnamed</cstring> 373 </property> 374 <widget class="QComboBox"> 375 <item> 376 <property name="text"> 377 <string>Off</string> 378 </property> 379 </item> 380 <item> 381 <property name="text"> 382 <string>2 sec</string> 383 </property> 384 </item> 385 <item> 386 <property name="text"> 387 <string>4 sec</string> 388 </property> 389 </item> 390 <item> 391 <property name="text"> 392 <string>10 sec</string> 393 </property> 394 </item> 395 <item> 396 <property name="text"> 397 <string>1 min</string> 398 </property> 399 </item> 400 <item> 401 <property name="text"> 402 <string>5 min</string> 403 </property> 404 </item> 405 <item> 406 <property name="text"> 407 <string>8 min</string> 408 </property> 409 </item> 410 <item> 411 <property name="text"> 412 <string>infinite</string> 413 </property> 414 </item> 415 <property name="name"> 416 <cstring>peakhold_time_ctrl</cstring> 417 </property> 418 <property name="font"> 419 <font> 420 <pointsize>9</pointsize> 421 </font> 422 </property> 423 </widget> 424 </vbox> 425 </widget> 426 <widget class="QGroupBox"> 427 <property name="name"> 428 <cstring>cliphold_time</cstring> 429 </property> 430 <property name="font"> 431 <font> 432 <pointsize>10</pointsize> 433 </font> 434 </property> 435 <property name="frameShape"> 436 <enum>NoFrame</enum> 437 </property> 438 <property name="title"> 439 <string>Cliphold time</string> 440 </property> 441 <vbox> 442 <property name="name"> 443 <cstring>unnamed</cstring> 444 </property> 445 <widget class="QComboBox"> 446 <item> 447 <property name="text"> 448 <string>Off</string> 449 </property> 450 </item> 451 <item> 452 <property name="text"> 453 <string>2 sec</string> 454 </property> 455 </item> 456 <item> 457 <property name="text"> 458 <string>4 sec</string> 459 </property> 460 </item> 461 <item> 462 <property name="text"> 463 <string>10 sec</string> 464 </property> 465 </item> 466 <item> 467 <property name="text"> 468 <string>1 min</string> 469 </property> 470 </item> 471 <item> 472 <property name="text"> 473 <string>5 min</string> 474 </property> 475 </item> 476 <item> 477 <property name="text"> 478 <string>8 min</string> 479 </property> 480 </item> 481 <item> 482 <property name="text"> 483 <string>infinite</string> 484 </property> 485 </item> 486 <property name="name"> 487 <cstring>cliphold_time_ctrl</cstring> 488 </property> 489 <property name="font"> 490 <font> 491 <pointsize>9</pointsize> 492 </font> 493 </property> 494 </widget> 495 </vbox> 496 </widget> 254 497 <spacer> 255 498 <property name="name"> … … 265 508 <size> 266 509 <width>20</width> 267 <height> 321</height>510 <height>220</height> 268 511 </size> 269 512 </property>
