Changeset 1385

Show
Ignore:
Timestamp:
10/27/08 16:27:56 (12 years ago)
Author:
ppalmers
Message:

Implement a mechanism to disable the samplerate and clock source controls while the device is streaming in order to avoid changes that could mess up jack. The saffire pro controls that cause a device reset to
happen are also disabled while streaming is active.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/libffado-2.0/src/ffadodevice.cpp

    r1366 r1385  
    154154FFADODevice::getSyncState( ) { 
    155155    return eSS_Unknown; 
     156} 
     157 
     158enum FFADODevice::eStreamingState 
     159FFADODevice::getStreamingState() 
     160{ 
     161    return eSS_Idle; 
    156162} 
    157163 
  • branches/libffado-2.0/src/ffadodevice.h

    r1366 r1385  
    261261 
    262262    /** 
     263     * @brief stream states 
     264     */ 
     265    enum eStreamingState { 
     266        eSS_Idle,        ///> not streaming 
     267        eSS_Sending,     ///> the device is sending a stream 
     268        eSS_Receiving,   ///> the device is receiving a stream 
     269        eSS_Both,        ///> the device is sending and receiving a stream 
     270    }; 
     271 
     272    /** 
     273     * @brief gets the devices current synchronization state 
     274     * @return the device's sync state 
     275     */ 
     276    virtual enum eStreamingState getStreamingState(); 
     277 
     278    /** 
    263279     * @brief This is called by the device manager to give the device a unique ID. 
    264280     * 
  • branches/libffado-2.0/src/genericavc/avc_avdevice.cpp

    r1299 r1385  
    163163    AVC::Unit::setVerboseLevel(l); 
    164164    debugOutput( DEBUG_LEVEL_VERBOSE, "Setting verbose level to %d...\n", l ); 
     165} 
     166 
     167#include <libieee1394/IEC61883.h> 
     168enum FFADODevice::eStreamingState 
     169AvDevice::getStreamingState() 
     170{ 
     171    // check the IEC plug control registers to see if the device is streaming 
     172    // a bit of a hack, but will do until we come up with something better 
     173    struct iec61883_oPCR oPCR0; 
     174    struct iec61883_iPCR iPCR0; 
     175     
     176    quadlet_t *oPCR0q = (quadlet_t *)&oPCR0; 
     177    quadlet_t *iPCR0q = (quadlet_t *)&iPCR0; 
     178     
     179    if(!get1394Service().read(getNodeId() | 0xFFC0, CSR_REGISTER_BASE + CSR_O_PCR_0, 1, oPCR0q)) { 
     180        debugWarning("Could not read oPCR0 register\n"); 
     181    } 
     182    if(!get1394Service().read(getNodeId() | 0xFFC0, CSR_REGISTER_BASE + CSR_I_PCR_0, 1, iPCR0q)) { 
     183        debugWarning("Could not read iPCR0 register\n"); 
     184    } 
     185 
     186    *oPCR0q = CondSwapFromBus32(*oPCR0q); 
     187    *iPCR0q = CondSwapFromBus32(*iPCR0q); 
     188 
     189    debugOutput(DEBUG_LEVEL_VERBOSE, "iPCR0: %08X, oPCR0: %08X\n", *iPCR0q, *oPCR0q); 
     190 
     191    if(iPCR0.n_p2p_connections > 0 && oPCR0.n_p2p_connections > 0) { 
     192        return eSS_Both; 
     193    } else if (iPCR0.n_p2p_connections > 0) { 
     194        return eSS_Receiving; 
     195    } else if (oPCR0.n_p2p_connections > 0) { 
     196        return eSS_Sending; 
     197    } else { 
     198        return eSS_Idle; 
     199    } 
    165200} 
    166201 
  • branches/libffado-2.0/src/genericavc/avc_avdevice.h

    r1299 r1385  
    7474    virtual Streaming::StreamProcessor *getStreamProcessorByIndex(int i); 
    7575 
     76    virtual enum eStreamingState getStreamingState(); 
     77 
    7678    virtual bool prepare(); 
    7779    virtual bool lock(); 
  • branches/libffado-2.0/src/libcontrol/ClockSelect.cpp

    r1295 r1385  
    171171} 
    172172 
     173bool 
     174ClockSelect::canChangeValue() 
     175{ 
     176    return m_Device.getStreamingState() == FFADODevice::eSS_Idle; 
     177} 
     178 
    173179void 
    174180ClockSelect::show() 
     
    240246} 
    241247 
     248bool 
     249SamplerateSelect::canChangeValue() 
     250{ 
     251    return m_Device.getStreamingState() == FFADODevice::eSS_Idle; 
     252} 
     253 
    242254void 
    243255SamplerateSelect::show() 
  • branches/libffado-2.0/src/libcontrol/ClockSelect.h

    r1288 r1385  
    5858    virtual std::string getAttributeName(int attridx); 
    5959 
     60    virtual bool canChangeValue(); 
     61 
    6062    virtual void show(); 
    6163 
     
    8082    virtual std::string getEnumLabel(int idx); 
    8183 
     84    virtual bool canChangeValue(); 
     85 
    8286    virtual void show(); 
    8387 
  • branches/libffado-2.0/src/libcontrol/Element.cpp

    r1295 r1385  
    103103} 
    104104 
     105bool 
     106Element::canChangeValue() 
     107{ 
     108    return true; 
     109} 
     110 
    105111void 
    106112Element::show() 
  • branches/libffado-2.0/src/libcontrol/Element.h

    r1295 r1385  
    8282    uint64_t getId() 
    8383        {return m_id;}; 
     84 
     85    // can the value of this element change? 
     86    virtual bool canChangeValue(); 
    8487 
    8588    // these allow to prevent external access to the control elements 
  • branches/libffado-2.0/src/libieee1394/ieee1394service.cpp

    r1373 r1385  
    7474        m_channels[i].recv_plug=-1; 
    7575    } 
    76  
    7776} 
    7877 
     
    128127 
    129128bool 
    130 Ieee1394Service:: useConfiguration(Util::Configuration *c) 
     129Ieee1394Service::useConfiguration(Util::Configuration *c) 
    131130{ 
    132131    m_configuration = c; 
     
    135134 
    136135bool 
    137 Ieee1394Service:: configurationUpdated() 
     136Ieee1394Service::configurationUpdated() 
    138137{ 
    139138    if(m_configuration) { 
  • branches/libffado-2.0/src/motu/motu_avdevice.cpp

    r1384 r1385  
    849849} 
    850850 
     851enum FFADODevice::eStreamingState 
     852MotuDevice::getStreamingState() 
     853{ 
     854    unsigned int val = ReadRegister(MOTU_REG_ISOCTRL); 
     855    /* Streaming is active if either bit 22 (Motu->PC streaming 
     856     * enable) or bit 30 (PC->Motu streaming enable) is set. 
     857     */ 
     858    debugOutput(DEBUG_LEVEL_VERBOSE, "MOTU_REG_ISOCTRL: %08x\n", val); 
     859 
     860    if((val & 0x40400000) != 0) { 
     861        return eSS_Both; 
     862    } else if ((val & 0x40000000) != 0) { 
     863        return eSS_Receiving; 
     864    } else if ((val & 0x00400000) != 0) { 
     865        return eSS_Sending; 
     866    } else { 
     867        return eSS_Idle; 
     868    } 
     869} 
     870 
    851871int 
    852872MotuDevice::getSamplingFrequency( ) { 
  • branches/libffado-2.0/src/motu/motu_avdevice.h

    r1355 r1385  
    209209    virtual int getStreamCount(); 
    210210    virtual Streaming::StreamProcessor *getStreamProcessorByIndex(int i); 
     211    enum FFADODevice::eStreamingState getStreamingState(); 
    211212 
    212213    virtual bool prepare(); 
  • branches/libffado-2.0/support/dbus/control-interface.xml

    r1297 r1385  
    1414      <method name="getDescription"> 
    1515          <arg type="s" name="description" direction="out"/> 
     16      </method> 
     17      <method name="canChangeValue"> 
     18          <arg type="b" name="can_change" direction="out"/> 
    1619      </method> 
    1720      <method name="getVerboseLevel"> 
  • branches/libffado-2.0/support/dbus/controlserver.cpp

    r1321 r1385  
    6262{ 
    6363    return getDebugLevel(); 
     64} 
     65 
     66DBus::Bool 
     67Element::canChangeValue() 
     68{ 
     69    return m_Slave.canChangeValue(); 
    6470} 
    6571 
  • branches/libffado-2.0/support/dbus/controlserver.h

    r1297 r1385  
    114114    DBus::String getDescription( ); 
    115115 
     116    DBus::Bool canChangeValue( ); 
     117 
    116118    void setVerboseLevel( const DBus::Int32 &); 
    117119    DBus::Int32 getVerboseLevel(); 
  • branches/libffado-2.0/support/mixer-qt4/ffado_dbus_util.py

    r1367 r1385  
    295295        self.dev = self.bus.get_object(self.servername, self.basepath) 
    296296        self.iface = dbus.Interface(self.dev, dbus_interface='org.ffado.Control.Element.AttributeEnum') 
     297        self.iface_element = dbus.Interface(self.dev, dbus_interface='org.ffado.Control.Element.Element') 
    297298    def count(self): 
    298299        return self.iface.count() 
     
    309310    def getAttributeName(self, idx): 
    310311        return self.iface.getAttributeName(idx) 
     312    def canChangeValue(self): 
     313        return self.iface_element.canChangeValue() 
    311314 
    312315class SamplerateSelectInterface: 
     
    317320        self.dev = self.bus.get_object(self.servername, self.basepath) 
    318321        self.iface = dbus.Interface(self.dev, dbus_interface='org.ffado.Control.Element.Enum') 
     322        self.iface_element = dbus.Interface(self.dev, dbus_interface='org.ffado.Control.Element.Element') 
    319323    def count(self): 
    320324        return self.iface.count() 
     
    325329    def getEnumLabel(self, idx): 
    326330        return self.iface.getEnumLabel(idx) 
     331    def canChangeValue(self): 
     332        return self.iface_element.canChangeValue() 
    327333 
    328334class TextInterface: 
  • branches/libffado-2.0/support/mixer-qt4/mixer_global.py

    r1367 r1385  
    3434    def clockChanged( self, clock ): 
    3535        #print "updateClockSource( " + str(clock) + " )" 
    36         self.clockselect.select( clock ) 
     36        if self.clockselect.canChangeValue(): 
     37            self.clockselect.select( clock ) 
     38        else: 
     39            msg = QMessageBox() 
     40            msg.question( msg, "Error", \ 
     41                "<qt>Clock source change not permitted. Is streaming active?</qt>", \ 
     42                QMessageBox.Ok ) 
     43            self.clocksource.setEnabled(False) 
     44            return 
     45 
    3746        selected = self.clockselect.selected() 
    38  
    3947        if selected != clock: 
    4048            clockname = self.clockselect.getEnumLabel( clock ) 
     
    4856        log.debug("samplerateChanged( " + str(sr) + " )") 
    4957        self.samplerateselect.select( sr ) 
     58        if self.samplerateselect.canChangeValue(): 
     59            self.samplerateselect.select( st ) 
     60        else: 
     61            msg = QMessageBox() 
     62            msg.question( msg, "Error", \ 
     63                "<qt>Sample rate change not permitted. Is streaming active?</qt>", \ 
     64                QMessageBox.Ok ) 
     65            self.samplerate.setEnabled(False) 
     66            return 
     67 
    5068        selected = self.samplerateselect.selected() 
    51  
    5269        if selected != sr: 
    5370            srname = self.samplerateselect.getEnumLabel( sr ) 
     
    7794        self.txtNickname.setText( self.nickname.text() ) 
    7895 
     96    def polledUpdate(self): 
     97        self.samplerate.setEnabled(self.samplerateselect.canChangeValue()) 
     98        self.clocksource.setEnabled(self.clockselect.canChangeValue()) 
  • branches/libffado-2.0/support/mixer-qt4/mixer_saffirepro.py

    r1370 r1385  
    2121# 
    2222 
    23 from PyQt4.QtGui import QWidget, QHBoxLayout 
     23from PyQt4.QtGui import QWidget, QHBoxLayout, QMessageBox 
    2424from mixer_saffire_base import SaffireMixerBase 
    2525from mixer_saffirepro_largeui import Ui_SaffireProMixerLargeUI 
     
    6767 
    6868    def initValues(self): 
     69        self.is_not_streaming = self.samplerateselect.canChangeValue() 
    6970        selected = self.samplerateselect.selected() 
    7071        self.samplerate = int(self.samplerateselect.getEnumLabel( selected )) 
     
    101102 
    102103    def polledUpdate(self): 
     104        self.is_not_streaming = self.samplerateselect.canChangeValue() 
    103105        if self.samplerate <= 96000: 
    104106            self.large.polledUpdate() 
     
    272274        SaffireMixerBase.updateLowResVolume(self,a0) 
    273275    def updateSelector(self,a0): 
     276        sender = self.sender() 
     277        #if sender == self.chkAC3 and not self.my_parent.is_not_streaming: 
     278            #msg = QMessageBox() 
     279            #msg.question( msg, "Error", \ 
     280                #"<qt>Change not permitted. Is streaming active?</qt>", \ 
     281                #QMessageBox.Ok ) 
     282            #self.chkAC3.setEnabled(False) 
     283            #if a0: 
     284                #self.chkAC3.setChecked(False) 
     285            #else: 
     286                #self.chkAC3.setChecked(True) 
     287            #return 
     288        if sender == self.chkMidiEnable and not self.my_parent.is_not_streaming: 
     289            msg = QMessageBox() 
     290            msg.question( msg, "Error", \ 
     291                "<qt>Change not permitted. Is streaming active?</qt>", \ 
     292                QMessageBox.Ok ) 
     293            self.chkMidiEnable.setEnabled(False) 
     294            state = self.hw.getDiscrete(self.SelectorControls[self.chkMidiEnable][0]) 
     295            if state: 
     296                self.chkMidiEnable.setChecked(True) 
     297            else: 
     298                self.chkMidiEnable.setChecked(False) 
     299            return 
     300        if sender == self.chkAdatDisable and not self.my_parent.is_not_streaming: 
     301            msg = QMessageBox() 
     302            msg.question( msg, "Error", \ 
     303                "<qt>Change not permitted. Is streaming active?</qt>", \ 
     304                QMessageBox.Ok ) 
     305            self.chkAdatDisable.setEnabled(False) 
     306            state = self.hw.getDiscrete(self.SelectorControls[self.chkAdatDisable][0]) 
     307            if state: 
     308                self.chkAdatDisable.setChecked(True) 
     309            else: 
     310                self.chkAdatDisable.setChecked(False) 
     311            return 
    274312        SaffireMixerBase.updateSelector(self,a0) 
     313 
    275314    def triggerButton(self): 
     315        sender = self.sender() 
     316        if sender == self.btnReboot and not self.my_parent.is_not_streaming: 
     317            msg = QMessageBox() 
     318            msg.question( msg, "Error", \ 
     319                "<qt>Operation not permitted. Is streaming active?</qt>", \ 
     320                QMessageBox.Ok ) 
     321            self.btnReboot.setEnabled(False) 
     322            return 
    276323        SaffireMixerBase.triggerButton(self) 
     324 
    277325    def saveText(self): 
    278326        SaffireMixerBase.saveText(self) 
     
    304352        self.polledUpdateHwCtrl(self.chkHwCtrl56, self.sldOut56Level) 
    305353        self.polledUpdateHwCtrl(self.chkHwCtrl78, self.sldOut78Level) 
     354 
     355        #make these inaccessible whenever streaming is running 
     356        #self.chkAC3.setEnabled(self.my_parent.is_not_streaming) 
     357        self.chkMidiEnable.setEnabled(self.my_parent.is_not_streaming) 
     358        self.chkAdatDisable.setEnabled(self.my_parent.is_not_streaming) 
     359        self.btnReboot.setEnabled(self.my_parent.is_not_streaming) 
    306360 
    307361    def polledUpdateHwCtrl(self, selector, volctrl): 
     
    426480        SaffireMixerBase.updateLowResVolume(self,a0) 
    427481    def updateSelector(self,a0): 
     482        sender = self.sender() 
     483        #if sender == self.chkAC3 and not self.my_parent.is_not_streaming: 
     484            #msg = QMessageBox() 
     485            #msg.question( msg, "Error", \ 
     486                #"<qt>Change not permitted. Is streaming active?</qt>", \ 
     487                #QMessageBox.Ok ) 
     488            #self.chkAC3.setEnabled(False) 
     489            #if a0: 
     490                #self.chkAC3.setChecked(False) 
     491            #else: 
     492                #self.chkAC3.setChecked(True) 
     493            #return 
     494        if sender == self.chkMidiEnable and not self.my_parent.is_not_streaming: 
     495            msg = QMessageBox() 
     496            msg.question( msg, "Error", \ 
     497                "<qt>Change not permitted. Is streaming active?</qt>", \ 
     498                QMessageBox.Ok ) 
     499            self.chkMidiEnable.setEnabled(False) 
     500            state = self.hw.getDiscrete(self.SelectorControls[self.chkMidiEnable][0]) 
     501            if state: 
     502                self.chkMidiEnable.setChecked(True) 
     503            else: 
     504                self.chkMidiEnable.setChecked(False) 
     505            return 
     506        if sender == self.chkAdatDisable and not self.my_parent.is_not_streaming: 
     507            msg = QMessageBox() 
     508            msg.question( msg, "Error", \ 
     509                "<qt>Change not permitted. Is streaming active?</qt>", \ 
     510                QMessageBox.Ok ) 
     511            self.chkAdatDisable.setEnabled(False) 
     512            state = self.hw.getDiscrete(self.SelectorControls[self.chkAdatDisable][0]) 
     513            if state: 
     514                self.chkAdatDisable.setChecked(True) 
     515            else: 
     516                self.chkAdatDisable.setChecked(False) 
     517            return 
    428518        SaffireMixerBase.updateSelector(self,a0) 
     519 
    429520    def triggerButton(self): 
     521        sender = self.sender() 
     522        if sender == self.btnReboot and not self.my_parent.is_not_streaming: 
     523            msg = QMessageBox() 
     524            msg.question( msg, "Error", \ 
     525                "<qt>Operation not permitted. Is streaming active?</qt>", \ 
     526                QMessageBox.Ok ) 
     527            self.btnReboot.setEnabled(False) 
     528            return 
    430529        SaffireMixerBase.triggerButton(self) 
     530 
    431531    def saveText(self): 
    432532        SaffireMixerBase.saveText(self) 
     
    445545        self.polledUpdateHwCtrl(self.chkHwCtrl56, self.sldOut56Level) 
    446546        self.polledUpdateHwCtrl(self.chkHwCtrl78, self.sldOut78Level) 
     547 
     548        #make these inaccessible whenever streaming is running 
     549        #self.chkAC3.setEnabled(self.my_parent.is_not_streaming) 
     550        self.chkMidiEnable.setEnabled(self.my_parent.is_not_streaming) 
     551        self.chkAdatDisable.setEnabled(self.my_parent.is_not_streaming) 
     552        self.btnReboot.setEnabled(self.my_parent.is_not_streaming) 
    447553 
    448554    def polledUpdateHwCtrl(self, selector, volctrl):