Index: /branches/libffado-2.0/src/motu/motu_avdevice.h
===================================================================
--- /branches/libffado-2.0/src/motu/motu_avdevice.h (revision 1506)
+++ /branches/libffado-2.0/src/motu/motu_avdevice.h (revision 1579)
@@ -148,4 +148,5 @@
};
+// Structures used for pre-Mark3 device mixer definitions
struct MixerCtrl {
const char *name, *label, *desc;
@@ -153,10 +154,8 @@
unsigned int dev_register;
};
-
struct MatrixMixBus {
const char *name;
unsigned int address;
};
-
struct MatrixMixChannel {
const char *name;
@@ -164,5 +163,4 @@
unsigned int addr_ofs;
};
-
struct MotuMixer {
const MixerCtrl *mixer_ctrl;
@@ -174,11 +172,19 @@
};
+// Structures used for devices which use the "Mark3" mixer protocol
+struct MotuMark3Mixer {
+};
+
struct DevicePropertyEntry {
const PortEntry* port_entry;
unsigned int n_port_entries;
signed int MaxSampleRate;
+ // A device will set at most one of the *mixer fields
const struct MotuMixer *mixer;
+ const struct MotuMark3Mixer *m3mixer;
// Others features can be added here like MIDI port presence.
};
+
+extern const DevicePropertyEntry DevicesProperty[];
/* Macro to calculate the size of an array */
@@ -244,4 +250,5 @@
private:
bool buildMixerAudioControls(void);
+ bool buildMark3MixerAudioControls(void);
bool addPort(Streaming::StreamProcessor *s_processor,
char *name,
Index: /branches/libffado-2.0/src/motu/motu_mixerdefs.h
===================================================================
--- /branches/libffado-2.0/src/motu/motu_mixerdefs.h (revision 1579)
+++ /branches/libffado-2.0/src/motu/motu_mixerdefs.h (revision 1579)
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2005-2008 by Pieter Palmers
+ * Copyright (C) 2005-2009 by Jonathan Woithe
+ *
+ * This file is part of FFADO
+ * FFADO = Free Firewire (pro-)audio drivers for linux
+ *
+ * FFADO is based upon FreeBoB.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) version 3 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+/* Provide access to mixer details for devices which utilise the
+ * original "pre-Mark3" mixer control protocol.
+ */
+
+#ifndef MOTU_MIXERDEFS_H
+#define MOTU_MIXERDEFS_H
+
+#include "motu/motu_avdevice.h"
+
+namespace Motu {
+
+extern const MotuMixer Mixer_Traveler;
+extern const MotuMixer Mixer_Ultralite;
+extern const MotuMixer Mixer_828Mk2;
+extern const MotuMixer Mixer_896HD;
+
+}
+
+#endif
Index: /branches/libffado-2.0/src/motu/motu_mark3_mixerdefs.cpp
===================================================================
--- /branches/libffado-2.0/src/motu/motu_mark3_mixerdefs.cpp (revision 1579)
+++ /branches/libffado-2.0/src/motu/motu_mark3_mixerdefs.cpp (revision 1579)
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2005-2008 by Pieter Palmers
+ * Copyright (C) 2005-2009 by Jonathan Woithe
+ *
+ * This file is part of FFADO
+ * FFADO = Free Firewire (pro-)audio drivers for linux
+ *
+ * FFADO is based upon FreeBoB.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) version 3 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+/* This module contains definitions of mixers on devices which utilise the
+ * "Mark3" mixer control protocol.
+ */
+
+#include "motu/motu_avdevice.h"
+#include "motu/motu_mark3_mixerdefs.h"
+
+namespace Motu {
+
+}
Index: /branches/libffado-2.0/src/motu/motu_mixer.cpp
===================================================================
--- /branches/libffado-2.0/src/motu/motu_mixer.cpp (revision 1579)
+++ /branches/libffado-2.0/src/motu/motu_mixer.cpp (revision 1579)
@@ -0,0 +1,393 @@
+/*
+ * Copyright (C) 2005-2008 by Pieter Palmers
+ * Copyright (C) 2005-2009 by Jonathan Woithe
+ *
+ * This file is part of FFADO
+ * FFADO = Free Firewire (pro-)audio drivers for linux
+ *
+ * FFADO is based upon FreeBoB.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) version 3 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+/* This file collects together everything associated with the management
+ * of mixer controls in the MOTU device object.
+ */
+
+#include "motu/motu_avdevice.h"
+#include "motu/motu_mixerdefs.h"
+#include "motu/motu_mark3_mixerdefs.h"
+
+namespace Motu {
+
+bool
+MotuDevice::buildMixerAudioControls(void) {
+
+ bool result = true;
+ MotuMatrixMixer *fader_mmixer = NULL;
+ MotuMatrixMixer *pan_mmixer = NULL;
+ MotuMatrixMixer *solo_mmixer = NULL;
+ MotuMatrixMixer *mute_mmixer = NULL;
+ const struct MatrixMixBus *buses = NULL;
+ const struct MatrixMixChannel *channels = NULL;
+ unsigned int bus, ch, i;
+
+ if (DevicesProperty[m_motu_model-1].mixer == NULL) {
+ debugOutput(DEBUG_LEVEL_INFO, "No pre-Mark3 mixer controls defined for model %d\n", m_motu_model);
+ result = false;
+ } else {
+ buses = DevicesProperty[m_motu_model-1].mixer->mixer_buses;
+ if (buses == NULL) {
+ debugOutput(DEBUG_LEVEL_WARNING, "No buses defined for model %d\n", m_motu_model);
+ result = false;
+ }
+ channels = DevicesProperty[m_motu_model-1].mixer->mixer_channels;
+ if (channels == NULL) {
+ debugOutput(DEBUG_LEVEL_WARNING, "No channels defined for model %d\n", m_motu_model);
+ result = false;
+ }
+ }
+ if (result == false) {
+ return true;
+ }
+
+ /* Create the top-level matrix mixers */
+ fader_mmixer = new ChannelFaderMatrixMixer(*this, "fader");
+ result &= m_MixerContainer->addElement(fader_mmixer);
+ pan_mmixer = new ChannelPanMatrixMixer(*this, "pan");
+ result &= m_MixerContainer->addElement(pan_mmixer);
+ solo_mmixer = new ChannelBinSwMatrixMixer(*this, "solo",
+ MOTU_CTRL_MASK_SOLO_VALUE, MOTU_CTRL_MASK_SOLO_SETENABLE);
+ result &= m_MixerContainer->addElement(solo_mmixer);
+ mute_mmixer = new ChannelBinSwMatrixMixer(*this, "mute",
+ MOTU_CTRL_MASK_MUTE_VALUE, MOTU_CTRL_MASK_MUTE_SETENABLE);
+ result &= m_MixerContainer->addElement(mute_mmixer);
+
+ for (bus=0; busn_mixer_buses; bus++) {
+ fader_mmixer->addRowInfo(buses[bus].name, 0, buses[bus].address);
+ pan_mmixer->addRowInfo(buses[bus].name, 0, buses[bus].address);
+ solo_mmixer->addRowInfo(buses[bus].name, 0, buses[bus].address);
+ mute_mmixer->addRowInfo(buses[bus].name, 0, buses[bus].address);
+ }
+
+ for (ch=0; chn_mixer_channels; ch++) {
+ uint32_t flags = channels[ch].flags;
+ if (flags & MOTU_CTRL_CHANNEL_FADER)
+ fader_mmixer->addColInfo(channels[ch].name, 0, channels[ch].addr_ofs);
+ if (flags & MOTU_CTRL_CHANNEL_PAN)
+ pan_mmixer->addColInfo(channels[ch].name, 0, channels[ch].addr_ofs);
+ if (flags & MOTU_CTRL_CHANNEL_SOLO)
+ solo_mmixer->addColInfo(channels[ch].name, 0, channels[ch].addr_ofs);
+ if (flags & MOTU_CTRL_CHANNEL_MUTE)
+ mute_mmixer->addColInfo(channels[ch].name, 0, channels[ch].addr_ofs);
+ flags &= ~(MOTU_CTRL_CHANNEL_FADER|MOTU_CTRL_CHANNEL_PAN|MOTU_CTRL_CHANNEL_SOLO|MOTU_CTRL_CHANNEL_MUTE);
+ if (flags) {
+ debugOutput(DEBUG_LEVEL_WARNING, "Control %s: unknown flag bits 0x%08x\n", channels[ch].name, flags);
+ }
+ }
+
+ // Single non-matrixed mixer controls get added here. Channel controls are supported
+ // here, but usually these will be a part of a matrix mixer.
+ for (i=0; in_mixer_ctrls; i++) {
+ const struct MixerCtrl *ctrl = &DevicesProperty[m_motu_model-1].mixer->mixer_ctrl[i];
+ unsigned int type;
+ char name[100];
+ char label[100];
+
+ if (ctrl == NULL) {
+ debugOutput(DEBUG_LEVEL_WARNING, "NULL control at index %d for model %d\n", i, m_motu_model);
+ continue;
+ }
+ type = ctrl->type;
+ if (type & MOTU_CTRL_CHANNEL_FADER) {
+ snprintf(name, 100, "%s%s", ctrl->name, "fader");
+ snprintf(label,100, "%s%s", ctrl->label,"fader");
+ result &= m_MixerContainer->addElement(
+ new ChannelFader(*this, ctrl->dev_register, name, label, ctrl->desc));
+ type &= ~MOTU_CTRL_CHANNEL_FADER;
+ }
+ if (type & MOTU_CTRL_CHANNEL_PAN) {
+ snprintf(name, 100, "%s%s", ctrl->name, "pan");
+ snprintf(label,100, "%s%s", ctrl->label,"pan");
+ result &= m_MixerContainer->addElement(
+ new ChannelPan(*this,
+ ctrl->dev_register,
+ name, label,
+ ctrl->desc));
+ type &= ~MOTU_CTRL_CHANNEL_PAN;
+ }
+ if (type & MOTU_CTRL_CHANNEL_MUTE) {
+ snprintf(name, 100, "%s%s", ctrl->name, "mute");
+ snprintf(label,100, "%s%s", ctrl->label,"mute");
+ result &= m_MixerContainer->addElement(
+ new MotuBinarySwitch(*this, ctrl->dev_register,
+ MOTU_CTRL_MASK_MUTE_VALUE, MOTU_CTRL_MASK_MUTE_SETENABLE,
+ name, label, ctrl->desc));
+ type &= ~MOTU_CTRL_CHANNEL_MUTE;
+ }
+ if (type & MOTU_CTRL_CHANNEL_SOLO) {
+ snprintf(name, 100, "%s%s", ctrl->name, "solo");
+ snprintf(label,100, "%s%s", ctrl->label,"solo");
+ result &= m_MixerContainer->addElement(
+ new MotuBinarySwitch(*this, ctrl->dev_register,
+ MOTU_CTRL_MASK_SOLO_VALUE, MOTU_CTRL_MASK_SOLO_SETENABLE,
+ name, label, ctrl->desc));
+ type &= ~MOTU_CTRL_CHANNEL_SOLO;
+ }
+
+ if (type & MOTU_CTRL_MIX_FADER) {
+ snprintf(name, 100, "%s%s", ctrl->name, "fader");
+ snprintf(label,100, "%s%s", ctrl->label,"fader");
+ result &= m_MixerContainer->addElement(
+ new MixFader(*this, ctrl->dev_register, name, label, ctrl->desc));
+ type &= ~MOTU_CTRL_MIX_FADER;
+ }
+ if (type & MOTU_CTRL_MIX_MUTE) {
+ snprintf(name, 100, "%s%s", ctrl->name, "mute");
+ snprintf(label,100, "%s%s", ctrl->label,"mute");
+ result &= m_MixerContainer->addElement(
+ new MixMute(*this, ctrl->dev_register, name, label, ctrl->desc));
+ type &= ~MOTU_CTRL_MIX_MUTE;
+ }
+ if (type & MOTU_CTRL_MIX_DEST) {
+ snprintf(name, 100, "%s%s", ctrl->name, "dest");
+ snprintf(label,100, "%s%s", ctrl->label,"dest");
+ result &= m_MixerContainer->addElement(
+ new MixDest(*this, ctrl->dev_register, name, label, ctrl->desc));
+ type &= ~MOTU_CTRL_MIX_DEST;
+ }
+
+ if (type & MOTU_CTRL_INPUT_UL_GAIN) {
+ snprintf(name, 100, "%s%s", ctrl->name, "trimgain");
+ snprintf(label,100, "%s%s", ctrl->label,"trimgain");
+ result &= m_MixerContainer->addElement(
+ new InputGainPadInv(*this, ctrl->dev_register, MOTU_CTRL_MODE_UL_GAIN,
+ name, label, ctrl->desc));
+ type &= ~MOTU_CTRL_INPUT_UL_GAIN;
+ }
+ if (type & MOTU_CTRL_INPUT_PHASE_INV) {
+ snprintf(name, 100, "%s%s", ctrl->name, "invert");
+ snprintf(label,100, "%s%s", ctrl->label,"invert");
+ result &= m_MixerContainer->addElement(
+ new InputGainPadInv(*this, ctrl->dev_register, MOTU_CTRL_MODE_PHASE_INV,
+ name, label, ctrl->desc));
+ type &= ~MOTU_CTRL_INPUT_PHASE_INV;
+ }
+ if (type & MOTU_CTRL_INPUT_TRIMGAIN) {
+ snprintf(name, 100, "%s%s", ctrl->name, "trimgain");
+ snprintf(label,100, "%s%s", ctrl->label,"trimgain");
+ result &= m_MixerContainer->addElement(
+ new InputGainPadInv(*this, ctrl->dev_register, MOTU_CTRL_MODE_TRIMGAIN,
+ name, label, ctrl->desc));
+ type &= ~MOTU_CTRL_INPUT_TRIMGAIN;
+ }
+ if (type & MOTU_CTRL_INPUT_PAD) {
+ snprintf(name, 100, "%s%s", ctrl->name, "pad");
+ snprintf(label,100, "%s%s", ctrl->label,"pad");
+ result &= m_MixerContainer->addElement(
+ new InputGainPadInv(*this, ctrl->dev_register, MOTU_CTRL_MODE_PAD,
+ name, label, ctrl->desc));
+ type &= ~MOTU_CTRL_INPUT_PAD;
+ }
+
+ if (type & MOTU_CTRL_INPUT_LEVEL) {
+ snprintf(name, 100, "%s%s", ctrl->name, "level");
+ snprintf(label,100, "%s%s", ctrl->label,"level");
+ result &= m_MixerContainer->addElement(
+ new MotuBinarySwitch(*this, MOTU_REG_INPUT_LEVEL,
+ 1<dev_register, 0, name, label, ctrl->desc));
+ type &= ~MOTU_CTRL_INPUT_LEVEL;
+ }
+ if (type & MOTU_CTRL_INPUT_BOOST) {
+ snprintf(name, 100, "%s%s", ctrl->name, "boost");
+ snprintf(label,100, "%s%s", ctrl->label,"boost");
+ result &= m_MixerContainer->addElement(
+ new MotuBinarySwitch(*this, MOTU_REG_INPUT_BOOST,
+ 1<dev_register, 0, name, label, ctrl->desc));
+ type &= ~MOTU_CTRL_INPUT_BOOST;
+ }
+ if (type & MOTU_CTRL_PHONES_SRC) {
+ snprintf(name, 100, "%s%s", ctrl->name, "src");
+ snprintf(label,100, "%s%s", ctrl->label,"src");
+ result &= m_MixerContainer->addElement(
+ new PhonesSrc(*this, name, label, ctrl->desc));
+ type &= ~MOTU_CTRL_PHONES_SRC;
+ }
+ if (type & MOTU_CTRL_OPTICAL_MODE) {
+ result &= m_MixerContainer->addElement(
+ new OpticalMode(*this, ctrl->dev_register,
+ ctrl->name, ctrl->label, ctrl->desc));
+ type &= ~MOTU_CTRL_OPTICAL_MODE;
+ }
+ if (type & MOTU_CTRL_METER) {
+ if (ctrl->dev_register & MOTU_CTRL_METER_PEAKHOLD) {
+ snprintf(name, 100, "%s%s", ctrl->name, "peakhold_time");
+ snprintf(label,100, "%s%s", ctrl->label,"peakhold time");
+ result &= m_MixerContainer->addElement(
+ new MeterControl(*this, MOTU_METER_PEAKHOLD_MASK,
+ MOTU_METER_PEAKHOLD_SHIFT, name, label, ctrl->desc));
+ }
+ if (ctrl->dev_register & MOTU_CTRL_METER_CLIPHOLD) {
+ snprintf(name, 100, "%s%s", ctrl->name, "cliphold_time");
+ snprintf(label,100, "%s%s", ctrl->label,"cliphold time");
+ result &= m_MixerContainer->addElement(
+ new MeterControl(*this, MOTU_METER_CLIPHOLD_MASK,
+ MOTU_METER_CLIPHOLD_SHIFT, name, label, ctrl->desc));
+ }
+ if (ctrl->dev_register & MOTU_CTRL_METER_AESEBU_SRC) {
+ snprintf(name, 100, "%s%s", ctrl->name, "aesebu_src");
+ snprintf(label,100, "%s%s", ctrl->label,"AESEBU source");
+ result &= m_MixerContainer->addElement(
+ new MeterControl(*this, MOTU_METER_AESEBU_SRC_MASK,
+ MOTU_METER_AESEBU_SRC_SHIFT, name, label, ctrl->desc));
+ }
+ if (ctrl->dev_register & MOTU_CTRL_METER_PROG_SRC) {
+ snprintf(name, 100, "%s%s", ctrl->name, "src");
+ snprintf(label,100, "%s%s", ctrl->label,"source");
+ result &= m_MixerContainer->addElement(
+ new MeterControl(*this, MOTU_METER_PROG_SRC_MASK,
+ MOTU_METER_PROG_SRC_SHIFT, name, label, ctrl->desc));
+ }
+ type &= ~MOTU_CTRL_METER;
+ }
+
+ if (type) {
+ debugOutput(DEBUG_LEVEL_WARNING, "Unknown mixer control type flag bits 0x%08x\n", ctrl->type);
+ }
+ }
+ return result;
+}
+
+bool
+MotuDevice::buildMark3MixerAudioControls(void) {
+
+ bool result = true;
+
+ if (DevicesProperty[m_motu_model-1].m3mixer == NULL) {
+ debugOutput(DEBUG_LEVEL_INFO, "No Mark3 mixer controls defined for model %d\n", m_motu_model);
+ return false;
+ }
+
+ // FIXME: Details to come
+ result = false;
+
+ return result;
+}
+
+bool
+MotuDevice::buildMixer() {
+ bool result = true;
+ debugOutput(DEBUG_LEVEL_VERBOSE, "Building a MOTU mixer...\n");
+
+ destroyMixer();
+
+ // create the mixer object container
+ m_MixerContainer = new Control::Container(this, "Mixer");
+ if (!m_MixerContainer) {
+ debugError("Could not create mixer container...\n");
+ return false;
+ }
+
+ if (DevicesProperty[m_motu_model-1].mixer != NULL &&
+ DevicesProperty[m_motu_model-1].m3mixer != NULL) {
+ debugError("MOTU model %d has pre-Mark3 and Mark3 mixer descriptions\n", m_motu_model);
+ return false;
+ }
+
+ // Create and populate the top-level matrix mixers
+ result = buildMixerAudioControls() || buildMark3MixerAudioControls();
+
+ /* Now add some general device information controls. These may yet
+ * become device-specific if it turns out to be easier that way.
+ */
+ result &= m_MixerContainer->addElement(
+ new InfoElement(*this, MOTU_INFO_MODEL, "Info/Model", "Model identifier", ""));
+ result &= m_MixerContainer->addElement(
+ new InfoElement(*this, MOTU_INFO_IS_STREAMING, "Info/IsStreaming", "Is device streaming", ""));
+ result &= m_MixerContainer->addElement(
+ new InfoElement(*this, MOTU_INFO_SAMPLE_RATE, "Info/SampleRate", "Device sample rate", ""));
+
+ if (!addElement(m_MixerContainer)) {
+ debugWarning("Could not register mixer to device\n");
+ // clean up
+ destroyMixer();
+ return false;
+ }
+
+ // Special controls
+ m_ControlContainer = new Control::Container(this, "Control");
+ if (!m_ControlContainer) {
+ debugError("Could not create control container...\n");
+ return false;
+ }
+
+ // Special controls get added here
+
+ if (!result) {
+ debugWarning("One or more device control elements could not be created.");
+ // clean up those that couldn't be created
+ destroyMixer();
+ return false;
+ }
+ if (!addElement(m_ControlContainer)) {
+ debugWarning("Could not register controls to device\n");
+ // clean up
+ destroyMixer();
+ return false;
+ }
+
+ return true;
+}
+
+
+bool
+MotuDevice::destroyMixer() {
+ debugOutput(DEBUG_LEVEL_VERBOSE, "destroy mixer...\n");
+
+ if (m_MixerContainer == NULL) {
+ debugOutput(DEBUG_LEVEL_VERBOSE, "no mixer to destroy...\n");
+ return true;
+ }
+
+ if (!deleteElement(m_MixerContainer)) {
+ debugError("Mixer present but not registered to the avdevice\n");
+ return false;
+ }
+
+ // remove and delete (as in free) child control elements
+ m_MixerContainer->clearElements(true);
+ delete m_MixerContainer;
+ m_MixerContainer = NULL;
+
+ // remove control container
+ if (m_ControlContainer == NULL) {
+ debugOutput(DEBUG_LEVEL_VERBOSE, "no controls to destroy...\n");
+ return true;
+ }
+
+ if (!deleteElement(m_ControlContainer)) {
+ debugError("Controls present but not registered to the avdevice\n");
+ return false;
+ }
+
+ // remove and delete (as in free) child control elements
+ m_ControlContainer->clearElements(true);
+ delete m_ControlContainer;
+ m_ControlContainer = NULL;
+
+ return true;
+}
+
+}
Index: /branches/libffado-2.0/src/motu/motu_avdevice.cpp
===================================================================
--- /branches/libffado-2.0/src/motu/motu_avdevice.cpp (revision 1525)
+++ /branches/libffado-2.0/src/motu/motu_avdevice.cpp (revision 1579)
@@ -24,4 +24,6 @@
#include "motu/motu_avdevice.h"
+#include "motu/motu_mixerdefs.h"
+#include "motu/motu_mark3_mixerdefs.h"
#include "devicemanager.h"
@@ -304,249 +306,15 @@
};
-// Mixer registers
-const MatrixMixBus MixerBuses_Traveler[] = {
- {"Mix 1", 0x4000, },
- {"Mix 2", 0x4100, },
- {"Mix 3", 0x4200, },
- {"Mix 4", 0x4300, },
-};
-
-const MatrixMixChannel MixerChannels_Traveler[] = {
- {"Analog 1", MOTU_CTRL_STD_CHANNEL, 0x0000, },
- {"Analog 2", MOTU_CTRL_STD_CHANNEL, 0x0004, },
- {"Analog 3", MOTU_CTRL_STD_CHANNEL, 0x0008, },
- {"Analog 4", MOTU_CTRL_STD_CHANNEL, 0x000c, },
- {"Analog 5", MOTU_CTRL_STD_CHANNEL, 0x0010, },
- {"Analog 6", MOTU_CTRL_STD_CHANNEL, 0x0014, },
- {"Analog 7", MOTU_CTRL_STD_CHANNEL, 0x0018, },
- {"Analog 8", MOTU_CTRL_STD_CHANNEL, 0x001c, },
- {"AES/EBU 1", MOTU_CTRL_STD_CHANNEL, 0x0020, },
- {"AES/EBU 2", MOTU_CTRL_STD_CHANNEL, 0x0024, },
- {"SPDIF 1", MOTU_CTRL_STD_CHANNEL, 0x0028, },
- {"SPDIF 2", MOTU_CTRL_STD_CHANNEL, 0x002c, },
- {"ADAT 1", MOTU_CTRL_STD_CHANNEL, 0x0030, },
- {"ADAT 2", MOTU_CTRL_STD_CHANNEL, 0x0034, },
- {"ADAT 3", MOTU_CTRL_STD_CHANNEL, 0x0038, },
- {"ADAT 4", MOTU_CTRL_STD_CHANNEL, 0x003c, },
- {"ADAT 5", MOTU_CTRL_STD_CHANNEL, 0x0040, },
- {"ADAT 6", MOTU_CTRL_STD_CHANNEL, 0x0044, },
- {"ADAT 7", MOTU_CTRL_STD_CHANNEL, 0x0048, },
- {"ADAT 8", MOTU_CTRL_STD_CHANNEL, 0x004c, },
-};
-
-const MixerCtrl MixerCtrls_Traveler[] = {
- {"Mix1/Mix_", "Mix 1 ", "", MOTU_CTRL_STD_MIX, 0x0c20, },
- {"Mix2/Mix_", "Mix 2 ", "", MOTU_CTRL_STD_MIX, 0x0c24, },
- {"Mix3/Mix_", "Mix 3 ", "", MOTU_CTRL_STD_MIX, 0x0c28, },
- {"Mix4/Mix_", "Mix 4 ", "", MOTU_CTRL_STD_MIX, 0x0c2c, },
- {"Mainout_", "MainOut ", "", MOTU_CTRL_MIX_FADER, 0x0c0c, },
- {"Phones_", "Phones ", "", MOTU_CTRL_MIX_FADER, 0x0c10, },
-
- /* For mic/line input controls, the "register" is the zero-based channel number */
- {"Control/Ana1_", "Analog 1 input ", "", MOTU_CTRL_TRAVELER_MIC_INPUT_CTRLS, 0},
- {"Control/Ana2_", "Analog 2 input ", "", MOTU_CTRL_TRAVELER_MIC_INPUT_CTRLS, 1},
- {"Control/Ana3_", "Analog 3 input ", "", MOTU_CTRL_TRAVELER_MIC_INPUT_CTRLS, 2},
- {"Control/Ana4_", "Analog 4 input ", "", MOTU_CTRL_TRAVELER_MIC_INPUT_CTRLS, 3},
- {"Control/Ana5_", "Analog 5 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 4},
- {"Control/Ana6_", "Analog 6 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 5},
- {"Control/Ana7_", "Analog 7 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 6},
- {"Control/Ana8_", "Analog 8 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 7},
-
- /* For phones source control, "register" is currently unused */
- {"Control/Phones_", "Phones source", "", MOTU_CTRL_PHONES_SRC, 0},
-
- /* For optical mode controls, the "register" is used to indicate direction */
- {"Control/OpticalIn_mode", "Optical input mode ", "", MOTU_CTRL_OPTICAL_MODE, MOTU_CTRL_DIR_IN},
- {"Control/OpticalOut_mode", "Optical output mode ", "", MOTU_CTRL_OPTICAL_MODE, MOTU_CTRL_DIR_OUT},
-};
-
-const MatrixMixBus MixerBuses_Ultralite[] = {
- {"Mix 1", 0x4000, },
- {"Mix 2", 0x4100, },
- {"Mix 3", 0x4200, },
- {"Mix 4", 0x4300, },
-};
-
-const MatrixMixChannel MixerChannels_Ultralite[] = {
- {"Analog 1", MOTU_CTRL_STD_CHANNEL, 0x0000, },
- {"Analog 2", MOTU_CTRL_STD_CHANNEL, 0x0004, },
- {"Analog 3", MOTU_CTRL_STD_CHANNEL, 0x0008, },
- {"Analog 4", MOTU_CTRL_STD_CHANNEL, 0x000c, },
- {"Analog 5", MOTU_CTRL_STD_CHANNEL, 0x0010, },
- {"Analog 6", MOTU_CTRL_STD_CHANNEL, 0x0014, },
- {"Analog 7", MOTU_CTRL_STD_CHANNEL, 0x0018, },
- {"Analog 8", MOTU_CTRL_STD_CHANNEL, 0x001c, },
- {"AES/EBU 1", MOTU_CTRL_STD_CHANNEL, MOTU_CTRL_NONE, },
- {"AES/EBU 2", MOTU_CTRL_STD_CHANNEL, MOTU_CTRL_NONE, },
- {"SPDIF 1", MOTU_CTRL_STD_CHANNEL, 0x0020, },
- {"SPDIF 2", MOTU_CTRL_STD_CHANNEL, 0x0024, },
- {"ADAT 1", MOTU_CTRL_STD_CHANNEL, MOTU_CTRL_NONE, },
- {"ADAT 2", MOTU_CTRL_STD_CHANNEL, MOTU_CTRL_NONE, },
- {"ADAT 3", MOTU_CTRL_STD_CHANNEL, MOTU_CTRL_NONE, },
- {"ADAT 4", MOTU_CTRL_STD_CHANNEL, MOTU_CTRL_NONE, },
- {"ADAT 5", MOTU_CTRL_STD_CHANNEL, MOTU_CTRL_NONE, },
- {"ADAT 6", MOTU_CTRL_STD_CHANNEL, MOTU_CTRL_NONE, },
- {"ADAT 7", MOTU_CTRL_STD_CHANNEL, MOTU_CTRL_NONE, },
- {"ADAT 8", MOTU_CTRL_STD_CHANNEL, MOTU_CTRL_NONE, },
-};
-
-const MixerCtrl MixerCtrls_Ultralite[] = {
- {"Mix1/Mix_", "Mix 1 ", "", MOTU_CTRL_STD_MIX, 0x0c20, },
- {"Mix2/Mix_", "Mix 2 ", "", MOTU_CTRL_STD_MIX, 0x0c24, },
- {"Mix3/Mix_", "Mix 3 ", "", MOTU_CTRL_STD_MIX, 0x0c28, },
- {"Mix4/Mix_", "Mix 4 ", "", MOTU_CTRL_STD_MIX, 0x0c2c, },
- {"Mainout_", "MainOut ", "", MOTU_CTRL_MIX_FADER, 0x0c0c, },
- {"Phones_", "Phones ", "", MOTU_CTRL_MIX_FADER, 0x0c10, },
-
- /* For mic/line input controls, the "register" is the zero-based channel number */
- {"Control/Ana1_", "Analog 1 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 0},
- {"Control/Ana2_", "Analog 2 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 1},
- {"Control/Ana3_", "Analog 3 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 2},
- {"Control/Ana4_", "Analog 4 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 3},
- {"Control/Ana5_", "Analog 5 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 4},
- {"Control/Ana6_", "Analog 6 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 5},
- {"Control/Ana7_", "Analog 7 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 6},
- {"Control/Ana8_", "Analog 8 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 7},
- {"Control/Spdif1_", "SPDIF 1 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 6},
- {"Control/Spdif2_", "SPDIF 2 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 7},
-
- /* For phones source control, "register" is currently unused */
- {"Control/Phones_", "Phones source", "", MOTU_CTRL_PHONES_SRC, 0},
-
- /* For optical mode controls, the "register" is used to indicate direction */
- {"Control/OpticalIn_mode", "Optical input mode ", "", MOTU_CTRL_OPTICAL_MODE, MOTU_CTRL_DIR_IN},
- {"Control/OpticalOut_mode", "Optical output mode ", "", MOTU_CTRL_OPTICAL_MODE, MOTU_CTRL_DIR_OUT},
-};
-
-const MatrixMixBus MixerBuses_896HD[] = {
- {"Mix 1", 0x4000, },
- {"Mix 2", 0x4100, },
- {"Mix 3", 0x4200, },
- {"Mix 4", 0x4300, },
-};
-
-const MatrixMixChannel MixerChannels_896HD[] = {
- {"Analog 1", MOTU_CTRL_STD_CHANNEL, 0x0000, },
- {"Analog 2", MOTU_CTRL_STD_CHANNEL, 0x0004, },
- {"Analog 3", MOTU_CTRL_STD_CHANNEL, 0x0008, },
- {"Analog 4", MOTU_CTRL_STD_CHANNEL, 0x000c, },
- {"Analog 5", MOTU_CTRL_STD_CHANNEL, 0x0010, },
- {"Analog 6", MOTU_CTRL_STD_CHANNEL, 0x0014, },
- {"Analog 7", MOTU_CTRL_STD_CHANNEL, 0x0018, },
- {"Analog 8", MOTU_CTRL_STD_CHANNEL, 0x001c, },
- {"AES/EBU 1", MOTU_CTRL_STD_CHANNEL, 0x0020, },
- {"AES/EBU 2", MOTU_CTRL_STD_CHANNEL, 0x0024, },
- {"SPDIF 1", MOTU_CTRL_STD_CHANNEL, 0x0048, },
- {"SPDIF 2", MOTU_CTRL_STD_CHANNEL, 0x004c, },
- {"ADAT 1", MOTU_CTRL_STD_CHANNEL, 0x0028, },
- {"ADAT 2", MOTU_CTRL_STD_CHANNEL, 0x002c, },
- {"ADAT 3", MOTU_CTRL_STD_CHANNEL, 0x0030, },
- {"ADAT 4", MOTU_CTRL_STD_CHANNEL, 0x0034, },
- {"ADAT 5", MOTU_CTRL_STD_CHANNEL, 0x0038, },
- {"ADAT 6", MOTU_CTRL_STD_CHANNEL, 0x003c, },
- {"ADAT 7", MOTU_CTRL_STD_CHANNEL, 0x0040, },
- {"ADAT 8", MOTU_CTRL_STD_CHANNEL, 0x0044, },
-};
-
-const MixerCtrl MixerCtrls_896HD[] = {
- {"Mix1/Mix_", "Mix 1 ", "", MOTU_CTRL_STD_MIX, 0x0c20, },
- {"Mix2/Mix_", "Mix 2 ", "", MOTU_CTRL_STD_MIX, 0x0c24, },
- {"Mix3/Mix_", "Mix 3 ", "", MOTU_CTRL_STD_MIX, 0x0c28, },
- {"Mix4/Mix_", "Mix 4 ", "", MOTU_CTRL_STD_MIX, 0x0c2c, },
- {"Mainout_", "MainOut ", "", MOTU_CTRL_MIX_FADER, 0x0c0c, },
- {"Phones_", "Phones ", "", MOTU_CTRL_MIX_FADER, 0x0c10, },
-
- /* For phones source control, "register" is currently unused */
- {"Control/Phones_", "Phones source", "", MOTU_CTRL_PHONES_SRC, 0},
-
- /* For optical mode controls, the "register" is used to indicate direction */
- {"Control/OpticalIn_mode", "Optical input mode ", "", MOTU_CTRL_OPTICAL_MODE, MOTU_CTRL_DIR_IN},
- {"Control/OpticalOut_mode", "Optical output mode ", "", MOTU_CTRL_OPTICAL_MODE, MOTU_CTRL_DIR_OUT},
-
- /* For meter controls the "register" indicates which meter controls are available */
- {"Control/Meter_", "Meter ", "", MOTU_CTRL_METER,
- MOTU_CTRL_METER_PEAKHOLD | MOTU_CTRL_METER_CLIPHOLD | MOTU_CTRL_METER_AESEBU_SRC |
- MOTU_CTRL_METER_PROG_SRC},
-};
-
-const MatrixMixBus MixerBuses_828Mk2[] = {
- {"Mix 1", 0x4000, },
- {"Mix 2", 0x4100, },
- {"Mix 3", 0x4200, },
- {"Mix 4", 0x4300, },
-};
-
-const MatrixMixChannel MixerChannels_828Mk2[] = {
- {"Analog 1", MOTU_CTRL_STD_CHANNEL, 0x0000, },
- {"Analog 2", MOTU_CTRL_STD_CHANNEL, 0x0004, },
- {"Analog 3", MOTU_CTRL_STD_CHANNEL, 0x0008, },
- {"Analog 4", MOTU_CTRL_STD_CHANNEL, 0x000c, },
- {"Analog 5", MOTU_CTRL_STD_CHANNEL, 0x0010, },
- {"Analog 6", MOTU_CTRL_STD_CHANNEL, 0x0014, },
- {"Analog 7", MOTU_CTRL_STD_CHANNEL, 0x0018, },
- {"Analog 8", MOTU_CTRL_STD_CHANNEL, 0x001c, },
- {"Mic 1", MOTU_CTRL_STD_CHANNEL, 0x0020, },
- {"Mic 2", MOTU_CTRL_STD_CHANNEL, 0x0024, },
- {"SPDIF 1", MOTU_CTRL_STD_CHANNEL, 0x0028, },
- {"SPDIF 2", MOTU_CTRL_STD_CHANNEL, 0x002c, },
- {"ADAT 1", MOTU_CTRL_STD_CHANNEL, 0x0030, },
- {"ADAT 2", MOTU_CTRL_STD_CHANNEL, 0x0034, },
- {"ADAT 3", MOTU_CTRL_STD_CHANNEL, 0x0038, },
- {"ADAT 4", MOTU_CTRL_STD_CHANNEL, 0x003c, },
- {"ADAT 5", MOTU_CTRL_STD_CHANNEL, 0x0040, },
- {"ADAT 6", MOTU_CTRL_STD_CHANNEL, 0x0044, },
- {"ADAT 7", MOTU_CTRL_STD_CHANNEL, 0x0048, },
- {"ADAT 8", MOTU_CTRL_STD_CHANNEL, 0x004c, },
-};
-
-const MixerCtrl MixerCtrls_828Mk2[] = {
- {"Mix1/Mix_", "Mix 1 ", "", MOTU_CTRL_STD_MIX, 0x0c20, },
- {"Mix2/Mix_", "Mix 2 ", "", MOTU_CTRL_STD_MIX, 0x0c24, },
- {"Mix3/Mix_", "Mix 3 ", "", MOTU_CTRL_STD_MIX, 0x0c28, },
- {"Mix4/Mix_", "Mix 4 ", "", MOTU_CTRL_STD_MIX, 0x0c2c, },
- {"Mainout_", "MainOut ", "", MOTU_CTRL_MIX_FADER, 0x0c0c, },
- {"Phones_", "Phones ", "", MOTU_CTRL_MIX_FADER, 0x0c10, },
-
- /* For mic/line input controls, the "register" is the zero-based channel number */
- {"Control/Ana1_", "Analog 1 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 0},
- {"Control/Ana2_", "Analog 2 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 1},
- {"Control/Ana3_", "Analog 3 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 2},
- {"Control/Ana4_", "Analog 4 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 3},
- {"Control/Ana5_", "Analog 5 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 4},
- {"Control/Ana6_", "Analog 6 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 5},
- {"Control/Ana7_", "Analog 7 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 6},
- {"Control/Ana8_", "Analog 8 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 7},
-
- /* For phones source control, "register" is currently unused */
- {"Control/Phones_", "Phones source", "", MOTU_CTRL_PHONES_SRC, 0},
-
- /* For optical mode controls, the "register" is used to indicate direction */
- {"Control/OpticalIn_mode", "Optical input mode ", "", MOTU_CTRL_OPTICAL_MODE, MOTU_CTRL_DIR_IN},
- {"Control/OpticalOut_mode", "Optical output mode ", "", MOTU_CTRL_OPTICAL_MODE, MOTU_CTRL_DIR_OUT},
-};
-
-const MotuMixer Mixer_Traveler = MOTUMIXER(
- MixerCtrls_Traveler, MixerBuses_Traveler, MixerChannels_Traveler);
-
-const MotuMixer Mixer_Ultralite = MOTUMIXER(
- MixerCtrls_Ultralite, MixerBuses_Ultralite, MixerChannels_Ultralite);
-
-const MotuMixer Mixer_828Mk2 = MOTUMIXER(
- MixerCtrls_828Mk2, MixerBuses_828Mk2, MixerChannels_828Mk2);
-
-const MotuMixer Mixer_896HD = MOTUMIXER(
- MixerCtrls_896HD, MixerBuses_896HD, MixerChannels_896HD);
-
/* The order of DevicesProperty entries must match the numeric order of the
* MOTU model enumeration (EMotuModel).
*/
const DevicePropertyEntry DevicesProperty[] = {
-// { Ports_map, N_ELEMENTS( Ports_map ), MaxSR, MixerDescrPtr },
- { Ports_828MKII, N_ELEMENTS( Ports_828MKII ), 96000, &Mixer_828Mk2, },
- { Ports_TRAVELER, N_ELEMENTS( Ports_TRAVELER ), 192000, &Mixer_Traveler, },
- { Ports_ULTRALITE, N_ELEMENTS( Ports_ULTRALITE ), 96000, &Mixer_Ultralite, },
+// { Ports_map, N_ELEMENTS( Ports_map ), MaxSR, MixerDescrPtr, Mark3MixerDescrPtr },
+ { Ports_828MKII, N_ELEMENTS( Ports_828MKII ), 96000, &Mixer_828Mk2, NULL, },
+ { Ports_TRAVELER, N_ELEMENTS( Ports_TRAVELER ), 192000, &Mixer_Traveler, NULL, },
+ { Ports_ULTRALITE, N_ELEMENTS( Ports_ULTRALITE ), 96000, &Mixer_Ultralite, NULL, },
{ Ports_8PRE, N_ELEMENTS( Ports_8PRE ), 96000 },
{ Ports_828MKI, N_ELEMENTS( Ports_828MKI ), 48000 },
- { Ports_896HD, N_ELEMENTS( Ports_896HD ), 192000, &Mixer_896HD, },
+ { Ports_896HD, N_ELEMENTS( Ports_896HD ), 192000, &Mixer_896HD, NULL, },
{ Ports_828mk3, N_ELEMENTS( Ports_828mk3 ), 192000 },
};
@@ -582,340 +350,4 @@
destroyMixer();
-}
-
-bool
-MotuDevice::buildMixerAudioControls(void) {
-
- bool result = true;
- MotuMatrixMixer *fader_mmixer = NULL;
- MotuMatrixMixer *pan_mmixer = NULL;
- MotuMatrixMixer *solo_mmixer = NULL;
- MotuMatrixMixer *mute_mmixer = NULL;
- const struct MatrixMixBus *buses = NULL;
- const struct MatrixMixChannel *channels = NULL;
- unsigned int bus, ch, i;
-
- if (DevicesProperty[m_motu_model-1].mixer == NULL) {
- debugOutput(DEBUG_LEVEL_WARNING, "No mixer controls defined for model %d\n", m_motu_model);
- result = false;
- } else {
- buses = DevicesProperty[m_motu_model-1].mixer->mixer_buses;
- if (buses == NULL) {
- debugOutput(DEBUG_LEVEL_WARNING, "No buses defined for model %d\n", m_motu_model);
- result = false;
- }
- channels = DevicesProperty[m_motu_model-1].mixer->mixer_channels;
- if (channels == NULL) {
- debugOutput(DEBUG_LEVEL_WARNING, "No channels defined for model %d\n", m_motu_model);
- result = false;
- }
- }
- if (result == false) {
- return true;
- }
-
- /* Create the top-level matrix mixers */
- fader_mmixer = new ChannelFaderMatrixMixer(*this, "fader");
- result &= m_MixerContainer->addElement(fader_mmixer);
- pan_mmixer = new ChannelPanMatrixMixer(*this, "pan");
- result &= m_MixerContainer->addElement(pan_mmixer);
- solo_mmixer = new ChannelBinSwMatrixMixer(*this, "solo",
- MOTU_CTRL_MASK_SOLO_VALUE, MOTU_CTRL_MASK_SOLO_SETENABLE);
- result &= m_MixerContainer->addElement(solo_mmixer);
- mute_mmixer = new ChannelBinSwMatrixMixer(*this, "mute",
- MOTU_CTRL_MASK_MUTE_VALUE, MOTU_CTRL_MASK_MUTE_SETENABLE);
- result &= m_MixerContainer->addElement(mute_mmixer);
-
- for (bus=0; busn_mixer_buses; bus++) {
- fader_mmixer->addRowInfo(buses[bus].name, 0, buses[bus].address);
- pan_mmixer->addRowInfo(buses[bus].name, 0, buses[bus].address);
- solo_mmixer->addRowInfo(buses[bus].name, 0, buses[bus].address);
- mute_mmixer->addRowInfo(buses[bus].name, 0, buses[bus].address);
- }
-
- for (ch=0; chn_mixer_channels; ch++) {
- uint32_t flags = channels[ch].flags;
- if (flags & MOTU_CTRL_CHANNEL_FADER)
- fader_mmixer->addColInfo(channels[ch].name, 0, channels[ch].addr_ofs);
- if (flags & MOTU_CTRL_CHANNEL_PAN)
- pan_mmixer->addColInfo(channels[ch].name, 0, channels[ch].addr_ofs);
- if (flags & MOTU_CTRL_CHANNEL_SOLO)
- solo_mmixer->addColInfo(channels[ch].name, 0, channels[ch].addr_ofs);
- if (flags & MOTU_CTRL_CHANNEL_MUTE)
- mute_mmixer->addColInfo(channels[ch].name, 0, channels[ch].addr_ofs);
- flags &= ~(MOTU_CTRL_CHANNEL_FADER|MOTU_CTRL_CHANNEL_PAN|MOTU_CTRL_CHANNEL_SOLO|MOTU_CTRL_CHANNEL_MUTE);
- if (flags) {
- debugOutput(DEBUG_LEVEL_WARNING, "Control %s: unknown flag bits 0x%08x\n", channels[ch].name, flags);
- }
- }
-
- // Single non-matrixed mixer controls get added here. Channel controls are supported
- // here, but usually these will be a part of a matrix mixer.
- for (i=0; in_mixer_ctrls; i++) {
- const struct MixerCtrl *ctrl = &DevicesProperty[m_motu_model-1].mixer->mixer_ctrl[i];
- unsigned int type;
- char name[100];
- char label[100];
-
- if (ctrl == NULL) {
- debugOutput(DEBUG_LEVEL_WARNING, "NULL control at index %d for model %d\n", i, m_motu_model);
- continue;
- }
- type = ctrl->type;
- if (type & MOTU_CTRL_CHANNEL_FADER) {
- snprintf(name, 100, "%s%s", ctrl->name, "fader");
- snprintf(label,100, "%s%s", ctrl->label,"fader");
- result &= m_MixerContainer->addElement(
- new ChannelFader(*this, ctrl->dev_register, name, label, ctrl->desc));
- type &= ~MOTU_CTRL_CHANNEL_FADER;
- }
- if (type & MOTU_CTRL_CHANNEL_PAN) {
- snprintf(name, 100, "%s%s", ctrl->name, "pan");
- snprintf(label,100, "%s%s", ctrl->label,"pan");
- result &= m_MixerContainer->addElement(
- new ChannelPan(*this,
- ctrl->dev_register,
- name, label,
- ctrl->desc));
- type &= ~MOTU_CTRL_CHANNEL_PAN;
- }
- if (type & MOTU_CTRL_CHANNEL_MUTE) {
- snprintf(name, 100, "%s%s", ctrl->name, "mute");
- snprintf(label,100, "%s%s", ctrl->label,"mute");
- result &= m_MixerContainer->addElement(
- new MotuBinarySwitch(*this, ctrl->dev_register,
- MOTU_CTRL_MASK_MUTE_VALUE, MOTU_CTRL_MASK_MUTE_SETENABLE,
- name, label, ctrl->desc));
- type &= ~MOTU_CTRL_CHANNEL_MUTE;
- }
- if (type & MOTU_CTRL_CHANNEL_SOLO) {
- snprintf(name, 100, "%s%s", ctrl->name, "solo");
- snprintf(label,100, "%s%s", ctrl->label,"solo");
- result &= m_MixerContainer->addElement(
- new MotuBinarySwitch(*this, ctrl->dev_register,
- MOTU_CTRL_MASK_SOLO_VALUE, MOTU_CTRL_MASK_SOLO_SETENABLE,
- name, label, ctrl->desc));
- type &= ~MOTU_CTRL_CHANNEL_SOLO;
- }
-
- if (type & MOTU_CTRL_MIX_FADER) {
- snprintf(name, 100, "%s%s", ctrl->name, "fader");
- snprintf(label,100, "%s%s", ctrl->label,"fader");
- result &= m_MixerContainer->addElement(
- new MixFader(*this, ctrl->dev_register, name, label, ctrl->desc));
- type &= ~MOTU_CTRL_MIX_FADER;
- }
- if (type & MOTU_CTRL_MIX_MUTE) {
- snprintf(name, 100, "%s%s", ctrl->name, "mute");
- snprintf(label,100, "%s%s", ctrl->label,"mute");
- result &= m_MixerContainer->addElement(
- new MixMute(*this, ctrl->dev_register, name, label, ctrl->desc));
- type &= ~MOTU_CTRL_MIX_MUTE;
- }
- if (type & MOTU_CTRL_MIX_DEST) {
- snprintf(name, 100, "%s%s", ctrl->name, "dest");
- snprintf(label,100, "%s%s", ctrl->label,"dest");
- result &= m_MixerContainer->addElement(
- new MixDest(*this, ctrl->dev_register, name, label, ctrl->desc));
- type &= ~MOTU_CTRL_MIX_DEST;
- }
-
- if (type & MOTU_CTRL_INPUT_UL_GAIN) {
- snprintf(name, 100, "%s%s", ctrl->name, "trimgain");
- snprintf(label,100, "%s%s", ctrl->label,"trimgain");
- result &= m_MixerContainer->addElement(
- new InputGainPadInv(*this, ctrl->dev_register, MOTU_CTRL_MODE_UL_GAIN,
- name, label, ctrl->desc));
- type &= ~MOTU_CTRL_INPUT_UL_GAIN;
- }
- if (type & MOTU_CTRL_INPUT_PHASE_INV) {
- snprintf(name, 100, "%s%s", ctrl->name, "invert");
- snprintf(label,100, "%s%s", ctrl->label,"invert");
- result &= m_MixerContainer->addElement(
- new InputGainPadInv(*this, ctrl->dev_register, MOTU_CTRL_MODE_PHASE_INV,
- name, label, ctrl->desc));
- type &= ~MOTU_CTRL_INPUT_PHASE_INV;
- }
- if (type & MOTU_CTRL_INPUT_TRIMGAIN) {
- snprintf(name, 100, "%s%s", ctrl->name, "trimgain");
- snprintf(label,100, "%s%s", ctrl->label,"trimgain");
- result &= m_MixerContainer->addElement(
- new InputGainPadInv(*this, ctrl->dev_register, MOTU_CTRL_MODE_TRIMGAIN,
- name, label, ctrl->desc));
- type &= ~MOTU_CTRL_INPUT_TRIMGAIN;
- }
- if (type & MOTU_CTRL_INPUT_PAD) {
- snprintf(name, 100, "%s%s", ctrl->name, "pad");
- snprintf(label,100, "%s%s", ctrl->label,"pad");
- result &= m_MixerContainer->addElement(
- new InputGainPadInv(*this, ctrl->dev_register, MOTU_CTRL_MODE_PAD,
- name, label, ctrl->desc));
- type &= ~MOTU_CTRL_INPUT_PAD;
- }
-
- if (type & MOTU_CTRL_INPUT_LEVEL) {
- snprintf(name, 100, "%s%s", ctrl->name, "level");
- snprintf(label,100, "%s%s", ctrl->label,"level");
- result &= m_MixerContainer->addElement(
- new MotuBinarySwitch(*this, MOTU_REG_INPUT_LEVEL,
- 1<dev_register, 0, name, label, ctrl->desc));
- type &= ~MOTU_CTRL_INPUT_LEVEL;
- }
- if (type & MOTU_CTRL_INPUT_BOOST) {
- snprintf(name, 100, "%s%s", ctrl->name, "boost");
- snprintf(label,100, "%s%s", ctrl->label,"boost");
- result &= m_MixerContainer->addElement(
- new MotuBinarySwitch(*this, MOTU_REG_INPUT_BOOST,
- 1<dev_register, 0, name, label, ctrl->desc));
- type &= ~MOTU_CTRL_INPUT_BOOST;
- }
- if (type & MOTU_CTRL_PHONES_SRC) {
- snprintf(name, 100, "%s%s", ctrl->name, "src");
- snprintf(label,100, "%s%s", ctrl->label,"src");
- result &= m_MixerContainer->addElement(
- new PhonesSrc(*this, name, label, ctrl->desc));
- type &= ~MOTU_CTRL_PHONES_SRC;
- }
- if (type & MOTU_CTRL_OPTICAL_MODE) {
- result &= m_MixerContainer->addElement(
- new OpticalMode(*this, ctrl->dev_register,
- ctrl->name, ctrl->label, ctrl->desc));
- type &= ~MOTU_CTRL_OPTICAL_MODE;
- }
- if (type & MOTU_CTRL_METER) {
- if (ctrl->dev_register & MOTU_CTRL_METER_PEAKHOLD) {
- snprintf(name, 100, "%s%s", ctrl->name, "peakhold_time");
- snprintf(label,100, "%s%s", ctrl->label,"peakhold time");
- result &= m_MixerContainer->addElement(
- new MeterControl(*this, MOTU_METER_PEAKHOLD_MASK,
- MOTU_METER_PEAKHOLD_SHIFT, name, label, ctrl->desc));
- }
- if (ctrl->dev_register & MOTU_CTRL_METER_CLIPHOLD) {
- snprintf(name, 100, "%s%s", ctrl->name, "cliphold_time");
- snprintf(label,100, "%s%s", ctrl->label,"cliphold time");
- result &= m_MixerContainer->addElement(
- new MeterControl(*this, MOTU_METER_CLIPHOLD_MASK,
- MOTU_METER_CLIPHOLD_SHIFT, name, label, ctrl->desc));
- }
- if (ctrl->dev_register & MOTU_CTRL_METER_AESEBU_SRC) {
- snprintf(name, 100, "%s%s", ctrl->name, "aesebu_src");
- snprintf(label,100, "%s%s", ctrl->label,"AESEBU source");
- result &= m_MixerContainer->addElement(
- new MeterControl(*this, MOTU_METER_AESEBU_SRC_MASK,
- MOTU_METER_AESEBU_SRC_SHIFT, name, label, ctrl->desc));
- }
- if (ctrl->dev_register & MOTU_CTRL_METER_PROG_SRC) {
- snprintf(name, 100, "%s%s", ctrl->name, "src");
- snprintf(label,100, "%s%s", ctrl->label,"source");
- result &= m_MixerContainer->addElement(
- new MeterControl(*this, MOTU_METER_PROG_SRC_MASK,
- MOTU_METER_PROG_SRC_SHIFT, name, label, ctrl->desc));
- }
- type &= ~MOTU_CTRL_METER;
- }
-
- if (type) {
- debugOutput(DEBUG_LEVEL_WARNING, "Unknown mixer control type flag bits 0x%08x\n", ctrl->type);
- }
- }
- return result;
-}
-
-bool
-MotuDevice::buildMixer() {
- bool result = true;
- debugOutput(DEBUG_LEVEL_VERBOSE, "Building a MOTU mixer...\n");
-
- destroyMixer();
-
- // create the mixer object container
- m_MixerContainer = new Control::Container(this, "Mixer");
- if (!m_MixerContainer) {
- debugError("Could not create mixer container...\n");
- return false;
- }
-
- // Create and populate the top-level matrix mixers
- result = buildMixerAudioControls();
-
- /* Now add some general device information controls. These may yet
- * become device-specific if it turns out to be easier that way.
- */
- result &= m_MixerContainer->addElement(
- new InfoElement(*this, MOTU_INFO_MODEL, "Info/Model", "Model identifier", ""));
- result &= m_MixerContainer->addElement(
- new InfoElement(*this, MOTU_INFO_IS_STREAMING, "Info/IsStreaming", "Is device streaming", ""));
- result &= m_MixerContainer->addElement(
- new InfoElement(*this, MOTU_INFO_SAMPLE_RATE, "Info/SampleRate", "Device sample rate", ""));
-
- if (!addElement(m_MixerContainer)) {
- debugWarning("Could not register mixer to device\n");
- // clean up
- destroyMixer();
- return false;
- }
-
- // Special controls
- m_ControlContainer = new Control::Container(this, "Control");
- if (!m_ControlContainer) {
- debugError("Could not create control container...\n");
- return false;
- }
-
- // Special controls get added here
-
- if (!result) {
- debugWarning("One or more device control elements could not be created.");
- // clean up those that couldn't be created
- destroyMixer();
- return false;
- }
- if (!addElement(m_ControlContainer)) {
- debugWarning("Could not register controls to device\n");
- // clean up
- destroyMixer();
- return false;
- }
-
- return true;
-}
-
-
-bool
-MotuDevice::destroyMixer() {
- debugOutput(DEBUG_LEVEL_VERBOSE, "destroy mixer...\n");
-
- if (m_MixerContainer == NULL) {
- debugOutput(DEBUG_LEVEL_VERBOSE, "no mixer to destroy...\n");
- return true;
- }
-
- if (!deleteElement(m_MixerContainer)) {
- debugError("Mixer present but not registered to the avdevice\n");
- return false;
- }
-
- // remove and delete (as in free) child control elements
- m_MixerContainer->clearElements(true);
- delete m_MixerContainer;
- m_MixerContainer = NULL;
-
- // remove control container
- if (m_ControlContainer == NULL) {
- debugOutput(DEBUG_LEVEL_VERBOSE, "no controls to destroy...\n");
- return true;
- }
-
- if (!deleteElement(m_ControlContainer)) {
- debugError("Controls present but not registered to the avdevice\n");
- return false;
- }
-
- // remove and delete (as in free) child control elements
- m_ControlContainer->clearElements(true);
- delete m_ControlContainer;
- m_ControlContainer = NULL;
-
- return true;
}
Index: /branches/libffado-2.0/src/motu/motu_mixerdefs.cpp
===================================================================
--- /branches/libffado-2.0/src/motu/motu_mixerdefs.cpp (revision 1579)
+++ /branches/libffado-2.0/src/motu/motu_mixerdefs.cpp (revision 1579)
@@ -0,0 +1,268 @@
+/*
+ * Copyright (C) 2005-2008 by Pieter Palmers
+ * Copyright (C) 2005-2009 by Jonathan Woithe
+ *
+ * This file is part of FFADO
+ * FFADO = Free Firewire (pro-)audio drivers for linux
+ *
+ * FFADO is based upon FreeBoB.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) version 3 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+/* This module contains definitions of mixers on devices which utilise the
+ * original "pre-Mark3" mixer control protocol.
+ */
+
+#include "motu/motu_avdevice.h"
+#include "motu/motu_mixerdefs.h"
+
+namespace Motu {
+
+// Mixer registers
+const MatrixMixBus MixerBuses_Traveler[] = {
+ {"Mix 1", 0x4000, },
+ {"Mix 2", 0x4100, },
+ {"Mix 3", 0x4200, },
+ {"Mix 4", 0x4300, },
+};
+
+const MatrixMixChannel MixerChannels_Traveler[] = {
+ {"Analog 1", MOTU_CTRL_STD_CHANNEL, 0x0000, },
+ {"Analog 2", MOTU_CTRL_STD_CHANNEL, 0x0004, },
+ {"Analog 3", MOTU_CTRL_STD_CHANNEL, 0x0008, },
+ {"Analog 4", MOTU_CTRL_STD_CHANNEL, 0x000c, },
+ {"Analog 5", MOTU_CTRL_STD_CHANNEL, 0x0010, },
+ {"Analog 6", MOTU_CTRL_STD_CHANNEL, 0x0014, },
+ {"Analog 7", MOTU_CTRL_STD_CHANNEL, 0x0018, },
+ {"Analog 8", MOTU_CTRL_STD_CHANNEL, 0x001c, },
+ {"AES/EBU 1", MOTU_CTRL_STD_CHANNEL, 0x0020, },
+ {"AES/EBU 2", MOTU_CTRL_STD_CHANNEL, 0x0024, },
+ {"SPDIF 1", MOTU_CTRL_STD_CHANNEL, 0x0028, },
+ {"SPDIF 2", MOTU_CTRL_STD_CHANNEL, 0x002c, },
+ {"ADAT 1", MOTU_CTRL_STD_CHANNEL, 0x0030, },
+ {"ADAT 2", MOTU_CTRL_STD_CHANNEL, 0x0034, },
+ {"ADAT 3", MOTU_CTRL_STD_CHANNEL, 0x0038, },
+ {"ADAT 4", MOTU_CTRL_STD_CHANNEL, 0x003c, },
+ {"ADAT 5", MOTU_CTRL_STD_CHANNEL, 0x0040, },
+ {"ADAT 6", MOTU_CTRL_STD_CHANNEL, 0x0044, },
+ {"ADAT 7", MOTU_CTRL_STD_CHANNEL, 0x0048, },
+ {"ADAT 8", MOTU_CTRL_STD_CHANNEL, 0x004c, },
+};
+
+const MixerCtrl MixerCtrls_Traveler[] = {
+ {"Mix1/Mix_", "Mix 1 ", "", MOTU_CTRL_STD_MIX, 0x0c20, },
+ {"Mix2/Mix_", "Mix 2 ", "", MOTU_CTRL_STD_MIX, 0x0c24, },
+ {"Mix3/Mix_", "Mix 3 ", "", MOTU_CTRL_STD_MIX, 0x0c28, },
+ {"Mix4/Mix_", "Mix 4 ", "", MOTU_CTRL_STD_MIX, 0x0c2c, },
+ {"Mainout_", "MainOut ", "", MOTU_CTRL_MIX_FADER, 0x0c0c, },
+ {"Phones_", "Phones ", "", MOTU_CTRL_MIX_FADER, 0x0c10, },
+
+ /* For mic/line input controls, the "register" is the zero-based channel number */
+ {"Control/Ana1_", "Analog 1 input ", "", MOTU_CTRL_TRAVELER_MIC_INPUT_CTRLS, 0},
+ {"Control/Ana2_", "Analog 2 input ", "", MOTU_CTRL_TRAVELER_MIC_INPUT_CTRLS, 1},
+ {"Control/Ana3_", "Analog 3 input ", "", MOTU_CTRL_TRAVELER_MIC_INPUT_CTRLS, 2},
+ {"Control/Ana4_", "Analog 4 input ", "", MOTU_CTRL_TRAVELER_MIC_INPUT_CTRLS, 3},
+ {"Control/Ana5_", "Analog 5 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 4},
+ {"Control/Ana6_", "Analog 6 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 5},
+ {"Control/Ana7_", "Analog 7 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 6},
+ {"Control/Ana8_", "Analog 8 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 7},
+
+ /* For phones source control, "register" is currently unused */
+ {"Control/Phones_", "Phones source", "", MOTU_CTRL_PHONES_SRC, 0},
+
+ /* For optical mode controls, the "register" is used to indicate direction */
+ {"Control/OpticalIn_mode", "Optical input mode ", "", MOTU_CTRL_OPTICAL_MODE, MOTU_CTRL_DIR_IN},
+ {"Control/OpticalOut_mode", "Optical output mode ", "", MOTU_CTRL_OPTICAL_MODE, MOTU_CTRL_DIR_OUT},
+};
+
+const MatrixMixBus MixerBuses_Ultralite[] = {
+ {"Mix 1", 0x4000, },
+ {"Mix 2", 0x4100, },
+ {"Mix 3", 0x4200, },
+ {"Mix 4", 0x4300, },
+};
+
+const MatrixMixChannel MixerChannels_Ultralite[] = {
+ {"Analog 1", MOTU_CTRL_STD_CHANNEL, 0x0000, },
+ {"Analog 2", MOTU_CTRL_STD_CHANNEL, 0x0004, },
+ {"Analog 3", MOTU_CTRL_STD_CHANNEL, 0x0008, },
+ {"Analog 4", MOTU_CTRL_STD_CHANNEL, 0x000c, },
+ {"Analog 5", MOTU_CTRL_STD_CHANNEL, 0x0010, },
+ {"Analog 6", MOTU_CTRL_STD_CHANNEL, 0x0014, },
+ {"Analog 7", MOTU_CTRL_STD_CHANNEL, 0x0018, },
+ {"Analog 8", MOTU_CTRL_STD_CHANNEL, 0x001c, },
+ {"AES/EBU 1", MOTU_CTRL_STD_CHANNEL, MOTU_CTRL_NONE, },
+ {"AES/EBU 2", MOTU_CTRL_STD_CHANNEL, MOTU_CTRL_NONE, },
+ {"SPDIF 1", MOTU_CTRL_STD_CHANNEL, 0x0020, },
+ {"SPDIF 2", MOTU_CTRL_STD_CHANNEL, 0x0024, },
+ {"ADAT 1", MOTU_CTRL_STD_CHANNEL, MOTU_CTRL_NONE, },
+ {"ADAT 2", MOTU_CTRL_STD_CHANNEL, MOTU_CTRL_NONE, },
+ {"ADAT 3", MOTU_CTRL_STD_CHANNEL, MOTU_CTRL_NONE, },
+ {"ADAT 4", MOTU_CTRL_STD_CHANNEL, MOTU_CTRL_NONE, },
+ {"ADAT 5", MOTU_CTRL_STD_CHANNEL, MOTU_CTRL_NONE, },
+ {"ADAT 6", MOTU_CTRL_STD_CHANNEL, MOTU_CTRL_NONE, },
+ {"ADAT 7", MOTU_CTRL_STD_CHANNEL, MOTU_CTRL_NONE, },
+ {"ADAT 8", MOTU_CTRL_STD_CHANNEL, MOTU_CTRL_NONE, },
+};
+
+const MixerCtrl MixerCtrls_Ultralite[] = {
+ {"Mix1/Mix_", "Mix 1 ", "", MOTU_CTRL_STD_MIX, 0x0c20, },
+ {"Mix2/Mix_", "Mix 2 ", "", MOTU_CTRL_STD_MIX, 0x0c24, },
+ {"Mix3/Mix_", "Mix 3 ", "", MOTU_CTRL_STD_MIX, 0x0c28, },
+ {"Mix4/Mix_", "Mix 4 ", "", MOTU_CTRL_STD_MIX, 0x0c2c, },
+ {"Mainout_", "MainOut ", "", MOTU_CTRL_MIX_FADER, 0x0c0c, },
+ {"Phones_", "Phones ", "", MOTU_CTRL_MIX_FADER, 0x0c10, },
+
+ /* For mic/line input controls, the "register" is the zero-based channel number */
+ {"Control/Ana1_", "Analog 1 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 0},
+ {"Control/Ana2_", "Analog 2 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 1},
+ {"Control/Ana3_", "Analog 3 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 2},
+ {"Control/Ana4_", "Analog 4 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 3},
+ {"Control/Ana5_", "Analog 5 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 4},
+ {"Control/Ana6_", "Analog 6 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 5},
+ {"Control/Ana7_", "Analog 7 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 6},
+ {"Control/Ana8_", "Analog 8 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 7},
+ {"Control/Spdif1_", "SPDIF 1 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 6},
+ {"Control/Spdif2_", "SPDIF 2 input ", "", MOTU_CTRL_ULTRALITE_INPUT_CTRLS, 7},
+
+ /* For phones source control, "register" is currently unused */
+ {"Control/Phones_", "Phones source", "", MOTU_CTRL_PHONES_SRC, 0},
+
+ /* For optical mode controls, the "register" is used to indicate direction */
+ {"Control/OpticalIn_mode", "Optical input mode ", "", MOTU_CTRL_OPTICAL_MODE, MOTU_CTRL_DIR_IN},
+ {"Control/OpticalOut_mode", "Optical output mode ", "", MOTU_CTRL_OPTICAL_MODE, MOTU_CTRL_DIR_OUT},
+};
+
+const MatrixMixBus MixerBuses_896HD[] = {
+ {"Mix 1", 0x4000, },
+ {"Mix 2", 0x4100, },
+ {"Mix 3", 0x4200, },
+ {"Mix 4", 0x4300, },
+};
+
+const MatrixMixChannel MixerChannels_896HD[] = {
+ {"Analog 1", MOTU_CTRL_STD_CHANNEL, 0x0000, },
+ {"Analog 2", MOTU_CTRL_STD_CHANNEL, 0x0004, },
+ {"Analog 3", MOTU_CTRL_STD_CHANNEL, 0x0008, },
+ {"Analog 4", MOTU_CTRL_STD_CHANNEL, 0x000c, },
+ {"Analog 5", MOTU_CTRL_STD_CHANNEL, 0x0010, },
+ {"Analog 6", MOTU_CTRL_STD_CHANNEL, 0x0014, },
+ {"Analog 7", MOTU_CTRL_STD_CHANNEL, 0x0018, },
+ {"Analog 8", MOTU_CTRL_STD_CHANNEL, 0x001c, },
+ {"AES/EBU 1", MOTU_CTRL_STD_CHANNEL, 0x0020, },
+ {"AES/EBU 2", MOTU_CTRL_STD_CHANNEL, 0x0024, },
+ {"SPDIF 1", MOTU_CTRL_STD_CHANNEL, 0x0048, },
+ {"SPDIF 2", MOTU_CTRL_STD_CHANNEL, 0x004c, },
+ {"ADAT 1", MOTU_CTRL_STD_CHANNEL, 0x0028, },
+ {"ADAT 2", MOTU_CTRL_STD_CHANNEL, 0x002c, },
+ {"ADAT 3", MOTU_CTRL_STD_CHANNEL, 0x0030, },
+ {"ADAT 4", MOTU_CTRL_STD_CHANNEL, 0x0034, },
+ {"ADAT 5", MOTU_CTRL_STD_CHANNEL, 0x0038, },
+ {"ADAT 6", MOTU_CTRL_STD_CHANNEL, 0x003c, },
+ {"ADAT 7", MOTU_CTRL_STD_CHANNEL, 0x0040, },
+ {"ADAT 8", MOTU_CTRL_STD_CHANNEL, 0x0044, },
+};
+
+const MixerCtrl MixerCtrls_896HD[] = {
+ {"Mix1/Mix_", "Mix 1 ", "", MOTU_CTRL_STD_MIX, 0x0c20, },
+ {"Mix2/Mix_", "Mix 2 ", "", MOTU_CTRL_STD_MIX, 0x0c24, },
+ {"Mix3/Mix_", "Mix 3 ", "", MOTU_CTRL_STD_MIX, 0x0c28, },
+ {"Mix4/Mix_", "Mix 4 ", "", MOTU_CTRL_STD_MIX, 0x0c2c, },
+ {"Mainout_", "MainOut ", "", MOTU_CTRL_MIX_FADER, 0x0c0c, },
+ {"Phones_", "Phones ", "", MOTU_CTRL_MIX_FADER, 0x0c10, },
+
+ /* For phones source control, "register" is currently unused */
+ {"Control/Phones_", "Phones source", "", MOTU_CTRL_PHONES_SRC, 0},
+
+ /* For optical mode controls, the "register" is used to indicate direction */
+ {"Control/OpticalIn_mode", "Optical input mode ", "", MOTU_CTRL_OPTICAL_MODE, MOTU_CTRL_DIR_IN},
+ {"Control/OpticalOut_mode", "Optical output mode ", "", MOTU_CTRL_OPTICAL_MODE, MOTU_CTRL_DIR_OUT},
+
+ /* For meter controls the "register" indicates which meter controls are available */
+ {"Control/Meter_", "Meter ", "", MOTU_CTRL_METER,
+ MOTU_CTRL_METER_PEAKHOLD | MOTU_CTRL_METER_CLIPHOLD | MOTU_CTRL_METER_AESEBU_SRC |
+ MOTU_CTRL_METER_PROG_SRC},
+};
+
+const MatrixMixBus MixerBuses_828Mk2[] = {
+ {"Mix 1", 0x4000, },
+ {"Mix 2", 0x4100, },
+ {"Mix 3", 0x4200, },
+ {"Mix 4", 0x4300, },
+};
+
+const MatrixMixChannel MixerChannels_828Mk2[] = {
+ {"Analog 1", MOTU_CTRL_STD_CHANNEL, 0x0000, },
+ {"Analog 2", MOTU_CTRL_STD_CHANNEL, 0x0004, },
+ {"Analog 3", MOTU_CTRL_STD_CHANNEL, 0x0008, },
+ {"Analog 4", MOTU_CTRL_STD_CHANNEL, 0x000c, },
+ {"Analog 5", MOTU_CTRL_STD_CHANNEL, 0x0010, },
+ {"Analog 6", MOTU_CTRL_STD_CHANNEL, 0x0014, },
+ {"Analog 7", MOTU_CTRL_STD_CHANNEL, 0x0018, },
+ {"Analog 8", MOTU_CTRL_STD_CHANNEL, 0x001c, },
+ {"Mic 1", MOTU_CTRL_STD_CHANNEL, 0x0020, },
+ {"Mic 2", MOTU_CTRL_STD_CHANNEL, 0x0024, },
+ {"SPDIF 1", MOTU_CTRL_STD_CHANNEL, 0x0028, },
+ {"SPDIF 2", MOTU_CTRL_STD_CHANNEL, 0x002c, },
+ {"ADAT 1", MOTU_CTRL_STD_CHANNEL, 0x0030, },
+ {"ADAT 2", MOTU_CTRL_STD_CHANNEL, 0x0034, },
+ {"ADAT 3", MOTU_CTRL_STD_CHANNEL, 0x0038, },
+ {"ADAT 4", MOTU_CTRL_STD_CHANNEL, 0x003c, },
+ {"ADAT 5", MOTU_CTRL_STD_CHANNEL, 0x0040, },
+ {"ADAT 6", MOTU_CTRL_STD_CHANNEL, 0x0044, },
+ {"ADAT 7", MOTU_CTRL_STD_CHANNEL, 0x0048, },
+ {"ADAT 8", MOTU_CTRL_STD_CHANNEL, 0x004c, },
+};
+
+const MixerCtrl MixerCtrls_828Mk2[] = {
+ {"Mix1/Mix_", "Mix 1 ", "", MOTU_CTRL_STD_MIX, 0x0c20, },
+ {"Mix2/Mix_", "Mix 2 ", "", MOTU_CTRL_STD_MIX, 0x0c24, },
+ {"Mix3/Mix_", "Mix 3 ", "", MOTU_CTRL_STD_MIX, 0x0c28, },
+ {"Mix4/Mix_", "Mix 4 ", "", MOTU_CTRL_STD_MIX, 0x0c2c, },
+ {"Mainout_", "MainOut ", "", MOTU_CTRL_MIX_FADER, 0x0c0c, },
+ {"Phones_", "Phones ", "", MOTU_CTRL_MIX_FADER, 0x0c10, },
+
+ /* For mic/line input controls, the "register" is the zero-based channel number */
+ {"Control/Ana1_", "Analog 1 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 0},
+ {"Control/Ana2_", "Analog 2 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 1},
+ {"Control/Ana3_", "Analog 3 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 2},
+ {"Control/Ana4_", "Analog 4 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 3},
+ {"Control/Ana5_", "Analog 5 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 4},
+ {"Control/Ana6_", "Analog 6 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 5},
+ {"Control/Ana7_", "Analog 7 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 6},
+ {"Control/Ana8_", "Analog 8 input ", "", MOTU_CTRL_TRAVELER_LINE_INPUT_CTRLS, 7},
+
+ /* For phones source control, "register" is currently unused */
+ {"Control/Phones_", "Phones source", "", MOTU_CTRL_PHONES_SRC, 0},
+
+ /* For optical mode controls, the "register" is used to indicate direction */
+ {"Control/OpticalIn_mode", "Optical input mode ", "", MOTU_CTRL_OPTICAL_MODE, MOTU_CTRL_DIR_IN},
+ {"Control/OpticalOut_mode", "Optical output mode ", "", MOTU_CTRL_OPTICAL_MODE, MOTU_CTRL_DIR_OUT},
+};
+
+const MotuMixer Mixer_Traveler = MOTUMIXER(
+ MixerCtrls_Traveler, MixerBuses_Traveler, MixerChannels_Traveler);
+
+const MotuMixer Mixer_Ultralite = MOTUMIXER(
+ MixerCtrls_Ultralite, MixerBuses_Ultralite, MixerChannels_Ultralite);
+
+const MotuMixer Mixer_828Mk2 = MOTUMIXER(
+ MixerCtrls_828Mk2, MixerBuses_828Mk2, MixerChannels_828Mk2);
+
+const MotuMixer Mixer_896HD = MOTUMIXER(
+ MixerCtrls_896HD, MixerBuses_896HD, MixerChannels_896HD);
+
+}
Index: /branches/libffado-2.0/src/motu/motu_mark3_mixerdefs.h
===================================================================
--- /branches/libffado-2.0/src/motu/motu_mark3_mixerdefs.h (revision 1579)
+++ /branches/libffado-2.0/src/motu/motu_mark3_mixerdefs.h (revision 1579)
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2005-2008 by Pieter Palmers
+ * Copyright (C) 2005-2009 by Jonathan Woithe
+ *
+ * This file is part of FFADO
+ * FFADO = Free Firewire (pro-)audio drivers for linux
+ *
+ * FFADO is based upon FreeBoB.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) version 3 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+/* Provide access to mixer details for devices which utilise the "Mark3"
+ * mixer control protocol.
+ */
+
+#ifndef MOTU_MARK3_MIXERDEFS_H
+#define MOTU_MARK3_MIXERDEFS_H
+
+#include "motu/motu_avdevice.h"
+
+namespace Motu {
+
+}
+
+#endif
Index: /branches/libffado-2.0/src/SConscript
===================================================================
--- /branches/libffado-2.0/src/SConscript (revision 1559)
+++ /branches/libffado-2.0/src/SConscript (revision 1579)
@@ -145,4 +145,7 @@
motu/motu_avdevice.cpp \
motu/motu_controls.cpp \
+ motu/motu_mixerdefs.cpp \
+ motu/motu_mark3_mixerdefs.cpp \
+ motu/motu_mixer.cpp \
libstreaming/motu/MotuPort.cpp \
libstreaming/motu/MotuPortInfo.cpp \