Index: /trunk/libffado/src/rme/rme_avdevice.h =================================================================== --- /trunk/libffado/src/rme/rme_avdevice.h (revision 2037) +++ /trunk/libffado/src/rme/rme_avdevice.h (revision 2038) @@ -190,5 +190,7 @@ signed int get_hardware_status(unsigned int *stat0, unsigned int *stat1); signed int get_hardware_streaming_status(unsigned int *stat, unsigned int n); +public: signed int get_hardware_state(FF_state_t *state); +private: signed int set_hardware_params(FF_software_settings_t *use_settings = NULL); Index: /trunk/libffado/src/rme/fireface_settings_ctrls.h =================================================================== --- /trunk/libffado/src/rme/fireface_settings_ctrls.h (revision 2033) +++ /trunk/libffado/src/rme/fireface_settings_ctrls.h (revision 2038) @@ -54,4 +54,10 @@ #define RME_CTRL_INFO_MODEL 0x0100 #define RME_CTRL_INFO_TCO_PRESENT 0x0200 +#define RME_CTRL_INFO_SYSCLOCK_MODE 0x0300 +#define RME_CTRL_INFO_SYSCLOCK_FREQ 0x0301 +#define RME_CTRL_INFO_AUTOSYNC_FREQ 0x0310 +#define RME_CTRL_INFO_AUTOSYNC_SRC 0x0311 +#define RME_CTRL_INFO_SYNC_STATUS 0x0312 +#define RME_CTRL_INFO_SPDIF_FREQ 0x0313 /* Control types for an RmeSettingsMatrixCtrl object */ Index: /trunk/libffado/src/rme/rme_avdevice.cpp =================================================================== --- /trunk/libffado/src/rme/rme_avdevice.cpp (revision 2037) +++ /trunk/libffado/src/rme/rme_avdevice.cpp (revision 2038) @@ -150,4 +150,22 @@ new RmeSettingsCtrl(*this, RME_CTRL_INFO_TCO_PRESENT, 0, "TCO_present", "TCO is present", "")); + result &= m_ControlContainer->addElement( + new RmeSettingsCtrl(*this, RME_CTRL_INFO_SYSCLOCK_MODE, 0, + "sysclock_mode", "System clock mode", "")); + result &= m_ControlContainer->addElement( + new RmeSettingsCtrl(*this, RME_CTRL_INFO_SYSCLOCK_FREQ, 0, + "sysclock_freq", "System clock frequency", "")); + result &= m_ControlContainer->addElement( + new RmeSettingsCtrl(*this, RME_CTRL_INFO_AUTOSYNC_FREQ, 0, + "autosync_freq", "Autosync frequency", "")); + result &= m_ControlContainer->addElement( + new RmeSettingsCtrl(*this, RME_CTRL_INFO_AUTOSYNC_SRC, 0, + "autosync_src", "Autosync source", "")); + result &= m_ControlContainer->addElement( + new RmeSettingsCtrl(*this, RME_CTRL_INFO_SYNC_STATUS, 0, + "sync_status", "Sync status", "")); + result &= m_ControlContainer->addElement( + new RmeSettingsCtrl(*this, RME_CTRL_INFO_SPDIF_FREQ, 0, + "spdif_freq", "SPDIF frequency", "")); result &= m_ControlContainer->addElement( Index: /trunk/libffado/src/rme/fireface_settings_ctrls.cpp =================================================================== --- /trunk/libffado/src/rme/fireface_settings_ctrls.cpp (revision 2037) +++ /trunk/libffado/src/rme/fireface_settings_ctrls.cpp (revision 2038) @@ -156,4 +156,9 @@ case RME_CTRL_INFO_MODEL: case RME_CTRL_INFO_TCO_PRESENT: + case RME_CTRL_INFO_SYSCLOCK_FREQ: + case RME_CTRL_INFO_AUTOSYNC_FREQ: + case RME_CTRL_INFO_AUTOSYNC_SRC: + case RME_CTRL_INFO_SYNC_STATUS: + case RME_CTRL_INFO_SPDIF_FREQ: debugOutput(DEBUG_LEVEL_ERROR, "Attempt to set readonly info control 0x%08x\n", m_type); err = 1; @@ -173,4 +178,5 @@ signed int i; signed int val = 0; +FF_state_t ff_state; switch (m_type) { @@ -225,4 +231,31 @@ case RME_CTRL_INFO_TCO_PRESENT: return m_parent.getTcoPresent(); + + case RME_CTRL_INFO_SYSCLOCK_MODE: + if (m_parent.get_hardware_state(&ff_state) == 0) + return ff_state.clock_mode; + break; + case RME_CTRL_INFO_SYSCLOCK_FREQ: + return m_parent.getSamplingFrequency(); + case RME_CTRL_INFO_AUTOSYNC_FREQ: + if (m_parent.get_hardware_state(&ff_state) == 0) + return ff_state.autosync_freq; + break; + case RME_CTRL_INFO_AUTOSYNC_SRC: + if (m_parent.get_hardware_state(&ff_state) == 0) + return ff_state.autosync_source; + break; + case RME_CTRL_INFO_SYNC_STATUS: + if (m_parent.get_hardware_state(&ff_state) == 0) + return (ff_state.adat1_sync_status) | + (ff_state.adat2_sync_status << 2) | + (ff_state.spdif_sync_status << 4) | + (ff_state.wclk_sync_status << 6) | + (ff_state.tco_sync_status << 8); + break; + case RME_CTRL_INFO_SPDIF_FREQ: + if (m_parent.get_hardware_state(&ff_state) == 0) + return ff_state.spdif_freq; + break; default: Index: /trunk/libffado/support/mixer-qt4/ffado/mixer/rme.ui =================================================================== --- /trunk/libffado/support/mixer-qt4/ffado/mixer/rme.ui (revision 2037) +++ /trunk/libffado/support/mixer-qt4/ffado/mixer/rme.ui (revision 2038) @@ -763,5 +763,5 @@ - + No lock @@ -777,5 +777,5 @@ - + No lock @@ -805,5 +805,5 @@ - + No lock @@ -812,4 +812,18 @@ + + + TCO + + + + + + + No lock + + + + @@ -841,5 +855,5 @@ - + [unset] @@ -855,5 +869,5 @@ - + [unset] @@ -908,5 +922,5 @@ - + 48 kHz @@ -991,5 +1005,5 @@ - + Slave @@ -1005,5 +1019,5 @@ - + 44100 kHz Index: /trunk/libffado/support/mixer-qt4/ffado/mixer/rme.py =================================================================== --- /trunk/libffado/support/mixer-qt4/ffado/mixer/rme.py (revision 2037) +++ /trunk/libffado/support/mixer-qt4/ffado/mixer/rme.py (revision 2038) @@ -23,5 +23,5 @@ from PyQt4 import QtGui -from PyQt4.QtCore import SIGNAL, SLOT, QObject, Qt +from PyQt4.QtCore import SIGNAL, SLOT, QObject, Qt, QTimer from PyQt4.QtGui import QWidget, QApplication from ffado.config import * @@ -127,4 +127,26 @@ log.debug("gain %s[%d] set to %d" % (self.Gains[sender][0], self.Gains[sender][1], a0)) self.hw.setMatrixMixerValue(self.Gains[sender][0], 0, self.Gains[sender][1], a0) + + def status_update(self): + # log.debug("timer event") + clk_mode = ['Master', 'Slave'] + src_str = ['None', 'ADAT 1', 'ADAT 2', 'SPDIF', 'Wordclock', 'TCO'] + sync_stat = ['No lock', 'Locked', 'Synced'] + sysclock_mode = self.hw.getDiscrete('/Control/sysclock_mode') + sysclock_freq = self.hw.getDiscrete('/Control/sysclock_freq') + autosync_freq = self.hw.getDiscrete('/Control/autosync_freq') + autosync_src = self.hw.getDiscrete('/Control/autosync_src') + sync_status = self.hw.getDiscrete('/Control/sync_status') + spdif_freq = self.hw.getDiscrete('/Control/spdif_freq') + self.sysclock_freq.setText("%d Hz" % (sysclock_freq)) + self.sysclock_mode.setText(clk_mode[sysclock_mode]) + self.autosync_freq.setText("%d Hz" % (autosync_freq)) + self.autosync_src.setText(src_str[autosync_src]) + self.sync_check_adat1_status.setText(sync_stat[sync_status & 0x03]) + self.sync_check_adat2_status.setText(sync_stat[(sync_status >> 2) & 0x03]) + self.sync_check_spdif_status.setText(sync_stat[(sync_status >> 4) & 0x03]) + self.sync_check_wclk_status.setText(sync_stat[(sync_status >> 6) & 0x03]) + self.sync_check_tco_status.setText(sync_stat[(sync_status >> 8) & 0x03]) + self.spdif_freq.setText("%d Hz" % (spdif_freq)) # Hide and disable a control @@ -193,4 +215,8 @@ self.sync_check_adat2_label.setEnabled(False) self.sync_check_adat2_status.setEnabled(False) + + if (not(self.tco_present)): + self.sync_check_tco_label.setEnabled(False) + self.sync_check_tco_status.setEnabled(False) # Only the FF400 has specific channel 3/4 options, input gain @@ -250,3 +276,7 @@ QObject.connect(ctrl, SIGNAL('valueChanged(int)'), self.updateGain) + self.update_timer = QTimer(self) + QObject.connect(self.update_timer, SIGNAL('timeout()'), self.status_update) + self.update_timer.start(1000) + # vim: et