From: <tr...@ff...> - 2009-11-18 20:54:18
|
Author: arnonym Date: 2009-11-18 12:53:43 -0800 (Wed, 18 Nov 2009) New Revision: 1718 Modified: trunk/libffado/src/dice/focusrite/saffire_pro24.cpp trunk/libffado/src/dice/focusrite/saffire_pro24.h Log: Switching line/inst on channels 1+2 and low/high in channels 3+4 works now with the dbus-interface. Mixer is coming soon. Gotta ask back whether I am allowed to add the full description of the application-space here for all to see. Modified: trunk/libffado/src/dice/focusrite/saffire_pro24.cpp =================================================================== --- trunk/libffado/src/dice/focusrite/saffire_pro24.cpp 2009-11-16 22:37:28 UTC (rev 1717) +++ trunk/libffado/src/dice/focusrite/saffire_pro24.cpp 2009-11-18 20:53:43 UTC (rev 1718) @@ -27,24 +27,105 @@ namespace Dice { namespace Focusrite { +const int msgSet = 0x68; + SaffirePro24::SaffirePro24( DeviceManager& d, std::auto_ptr<ConfigRom>( configRom )) - : Dice::Device( d , configRom) + : Dice::Device(d , configRom) + , m_ch1(NULL) + , m_ch2(NULL) { - debugOutput( DEBUG_LEVEL_VERBOSE, "Created Dice::Focusrite::SaffirePro24 (NodeID %d)\n", - getConfigRom().getNodeId() ); + debugOutput(DEBUG_LEVEL_VERBOSE, "Created Dice::Focusrite::SaffirePro24 (NodeID %d)\n", + getConfigRom().getNodeId()); } SaffirePro24::~SaffirePro24() { + m_eap->deleteElement(m_ch1); + m_eap->deleteElement(m_ch2); + if (m_ch1) delete m_ch1; + if (m_ch2) delete m_ch2; } +bool SaffirePro24::discover() { + if (Dice::Device::discover()) { + fb_quadlet_t* tmp = (fb_quadlet_t *)calloc(2, sizeof(fb_quadlet_t)); + m_eap->readRegBlock(Dice::Device::EAP::eRT_Application, 0x58, tmp, 2*sizeof(fb_quadlet_t)); + hexDumpQuadlets(tmp, 2); -void -SaffirePro24::showDevice() + m_ch1 = new LineInstSwitch(getEAP(), "LineInstCh1", 0x58, 2); + getEAP()->addElement(m_ch1); + m_ch2 = new LineInstSwitch(getEAP(), "LineInstCh2", 0x58, 2<<16); + getEAP()->addElement(m_ch2); + m_ch3 = new LevelSwitch(getEAP(), "LevelCh3", 0x5C, 1); + getEAP()->addElement(m_ch3); + m_ch4 = new LevelSwitch(getEAP(), "LevelCh4", 0x5C, 1<<16); + getEAP()->addElement(m_ch4); + return true; + } + return false; +} +void SaffirePro24::showDevice() { debugOutput(DEBUG_LEVEL_VERBOSE, "This is a Dice::Focusrite::SaffirePro24\n"); Dice::Device::showDevice(); } +bool SaffirePro24::setNickName( std::string name ) { + return m_eap->writeRegBlock( Dice::Device::EAP::eRT_Application, 0x40, (fb_quadlet_t*)name.c_str(), name.size() ); +} +std::string SaffirePro24::getNickName() { + char name[16]; + m_eap->readRegBlock( Dice::Device::EAP::eRT_Application, 0x40, (fb_quadlet_t*)name, 16 ); + return std::string( name ); +} + +SaffirePro24::LineInstSwitch::LineInstSwitch(Dice::Device::EAP* eap, std::string name, size_t offset, int activevalue ) + : Control::Enum(eap, name) + , m_eap(eap) + , m_selected(0) + , m_offset(offset) + , m_activevalue(activevalue) +{ + m_eap->readReg(Dice::Device::EAP::eRT_Application, m_offset, &m_state_tmp); + printf("%s: Active?%i\n", name.c_str(), m_state_tmp&m_activevalue); + m_selected = (m_state_tmp&m_activevalue)?1:0; } +int SaffirePro24::LineInstSwitch::selected() { + return m_selected; } +bool SaffirePro24::LineInstSwitch::select(int n) { + if ( n != m_selected ) { + m_selected = n; + m_eap->readReg(Dice::Device::EAP::eRT_Application, m_offset, &m_state_tmp); + m_eap->writeReg(Dice::Device::EAP::eRT_Application, m_offset, m_state_tmp^m_activevalue); + m_eap->writeReg(Dice::Device::EAP::eRT_Application, msgSet, 4); + } + return true; +} +std::string SaffirePro24::LineInstSwitch::getEnumLabel(int n) { + if ( n == 1 ) { + return "Instrument"; + } + return "Line"; +} + +SaffirePro24::LevelSwitch::LevelSwitch(Dice::Device::EAP* eap, std::string name, size_t offset, int activevalue) + : LineInstSwitch(eap, name, offset, activevalue) +{ +} +std::string SaffirePro24::LevelSwitch::getEnumLabel(int n) { + switch (n) { + case 0: + return "Low"; + case 1: + return "High"; + default: + return ""; + } +} + + +} +} + +// vim: et Modified: trunk/libffado/src/dice/focusrite/saffire_pro24.h =================================================================== --- trunk/libffado/src/dice/focusrite/saffire_pro24.h 2009-11-16 22:37:28 UTC (rev 1717) +++ trunk/libffado/src/dice/focusrite/saffire_pro24.h 2009-11-18 20:53:43 UTC (rev 1718) @@ -36,14 +36,53 @@ public: SaffirePro24( DeviceManager& d, std::auto_ptr<ConfigRom>( configRom )); - virtual ~SaffirePro24(); + ~SaffirePro24(); - virtual void showDevice(); + bool discover(); + void showDevice(); + + bool canChangeNickname() { return true; } + bool setNickName( std::string name ); + std::string getNickName(); + + class LineInstSwitch : public Control::Enum + { + protected: + friend class Dice::Focusrite::SaffirePro24; + + LineInstSwitch(Dice::Device::EAP*, std::string name, size_t offset, int activevalue); + public: + int count() { return 2; } + + int selected(); + bool select(int); + + std::string getEnumLabel(int); + + private: + Dice::Device::EAP* m_eap; + int m_selected; + size_t m_offset; + int m_activevalue; + fb_quadlet_t m_state_tmp; + }; + class LevelSwitch : public LineInstSwitch + { + protected: + friend class Dice::Focusrite::SaffirePro24; + + LevelSwitch(Dice::Device::EAP*, std::string name, size_t offset, int activevalue); + public: + std::string getEnumLabel(int); + }; private: + LineInstSwitch *m_ch1, *m_ch2; + LevelSwitch *m_ch3, *m_ch4; }; } } #endif +// vim: et |