Changeset 2473

Show
Ignore:
Timestamp:
01/29/14 09:30:10 (9 years ago)
Author:
philippe
Message:

ffado-mixer/DICE EAP: file saving of settings. Complementary commit: Add saving of mixer section

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/libffado/src/dice/dice_eap.cpp

    r2413 r2473  
    13821382        return false; 
    13831383    } 
    1384     int nb_inputs = m_eap.m_mixer_nb_tx; 
    1385     int addr = ((nb_inputs * col) + row) * 4; 
     1384    int nb_outputs = m_eap.m_mixer_nb_tx; 
     1385    int addr = ((nb_outputs * col) + row) * 4; 
    13861386    quadlet_t tmp = (quadlet_t) val; 
    13871387    if(!m_eap.writeRegBlock(eRT_Mixer, 4+addr, &tmp, 4)) { 
     
    13951395EAP::Mixer::getValue( const int row, const int col) 
    13961396{ 
    1397     int nb_inputs = m_eap.m_mixer_nb_tx; 
    1398     int addr = ((nb_inputs * col) + row) * 4; 
     1397    int nb_outputs = m_eap.m_mixer_nb_tx; 
     1398    int addr = ((nb_outputs * col) + row) * 4; 
    13991399    quadlet_t tmp; 
    14001400    if(!m_eap.readRegBlock(eRT_Mixer, 4+addr, &tmp, 4)) { 
  • trunk/libffado/support/mixer-qt4/ffado/mixer/generic_dice_eap.py

    r2472 r2473  
    11# 
    22# Copyright (C) 2009-2010 by Arnold Krille 
     3#               2013 by Philippe Carriere 
    34# 
    45# This file is part of FFADO 
     
    6970    def saveSettings(self, indent): 
    7071        saveString = [] 
     72        idt = indent + "  " 
     73        saveString.append('%s<mixer>\n' % indent) 
     74        saveString.extend(self.mixer.saveSettings(idt)) 
     75        # Do not forget to mention the adopted rule for matrix columns mixer 
     76        #  This might be useful for future import function 
     77        saveString.append("%s  <col_rule>\n" % indent) 
     78        saveString.append("%s    Columns_are_outputs\n" % indent) 
     79        saveString.append("%s  </col_rule>\n" % indent) 
     80        saveString.append('%s</mixer>\n' % indent) 
    7181        saveString.append('%s<router>\n' % indent) 
    72         idt = indent + "  " 
    7382        saveString.extend(self.router.saveSettings(idt)) 
    7483        saveString.append('%s</router>\n' % indent) 
     
    7685 
    7786    def readSettings(self, readString): 
     87        try: 
     88            idxb = readString.index('<mixer>') 
     89            idxe = readString.index('</mixer>') 
     90        except Exception: 
     91            log.debug("No mixer settings found") 
     92            idxb = -1 
     93            idxe = -1 
     94        if idxb >= 0: 
     95            if idxe > idxb + 1: 
     96                stringMixer = [] 
     97                for s in readString[idxb+1:idxe]: 
     98                    stringMixer.append(s) 
     99                # When trying to import from a different device, the rule for column interpretation is 
     100                # not necessarily the same 
     101                try: 
     102                    idx = stringMixer.index('<col_rule>') 
     103                except Exception: 
     104                    log.debug('Do not know how to handle column versus input/output') 
     105                    idx = -1 
     106                transpose_coeff = False 
     107                if idx >=0: 
     108                    if stringMixer[idx+1].find("Columns_are_outputs") == -1: 
     109                        log.debug('Transposing the matrix coefficient; you are importing, are not you ?') 
     110                        transpose_coeff = True 
     111                if self.mixer.readSettings(stringMixer, transpose_coeff): 
     112                    log.debug("Mixer settings modified") 
     113                del stringMixer 
    78114        try: 
    79115            idxb = readString.index('<router>') 
     
    83119            idxb = -1 
    84120            idxe = -1 
    85         if idxb > 0: 
    86             if idxe > idxb
     121        if idxb >= 0: 
     122            if idxe > idxb + 1
    87123                stringRouter = [] 
    88                 for s in readString[idxb:idxe]: 
     124                for s in readString[idxb+1:idxe]: 
    89125                    stringRouter.append(s) 
    90126                if self.router.readSettings(stringRouter): 
  • trunk/libffado/support/mixer-qt4/ffado/mixer/globalmixer.py

    r2472 r2473  
    11# 
    22# Copyright (C) 2008 by Arnold Krille 
     3#               2013 by Philippe Carriere 
    34# 
    45# This file is part of FFADO 
  • trunk/libffado/support/mixer-qt4/ffado/panelmanager.py

    r2472 r2473  
    22# Copyright (C) 2005-2008 by Pieter Palmers 
    33#               2007-2008 by Arnold Krille 
     4#               2013 by Philippe Carriere 
    45# 
    56# This file is part of FFADO 
     
    486487          print "Unable to open file" 
    487488          return 
     489        log.debug("Opening file %s" % readfilename) 
    488490        # discard useless whitespace characters 
    489491        readString = [] 
     
    531533          idxb = readString.index('<device>') 
    532534          idxe = readString.index('</device>') 
    533           if idxe < idxb
     535          if idxe < idxb+1
    534536            print "Not a regular xml file: data must be enclosed between a <device> and </device> tag" 
    535537            return 
     
    544546              return 
    545547          guid = stringDev[idx+1] 
    546           log.debug("Device %s found\n" % guid) 
     548          log.debug("Device %s found" % guid) 
    547549 
    548550          if guid in self.panels: 
  • trunk/libffado/support/mixer-qt4/ffado/widgets/crossbarrouter.py

    r2472 r2473  
    11# 
    22# Copyright (C) 2009 by Arnold Krille 
     3#               2013 by Philippe Carriere 
    34# 
    45# This file is part of FFADO 
     
    124125        self.settings = QtCore.QSettings(self) 
    125126 
    126         destinations = self.interface.getDestinationNames() 
     127        self.destinations = self.interface.getDestinationNames() 
    127128        self.outgroups = [] 
    128         for ch in destinations: 
     129        for ch in self.destinations: 
    129130            tmp = str(ch).split(":")[0] 
    130131            if not tmp in self.outgroups: 
     
    146147 
    147148        self.switchers = {} 
    148         for out in destinations: 
     149        for out in self.destinations: 
    149150            btn = OutputSwitcher(self.interface, out, self) 
    150151            self.layout.addWidget(btn, int(out.split(":")[-1]) + 1, self.outgroups.index(out.split(":")[0])) 
     
    184185 
    185186    def saveSettings(self, indent): 
    186         destinations = self.interface.getDestinationNames() 
    187187        routerSaveString = [] 
    188         routerSaveString.append('%s<dimensions>\n' % indent) 
    189         routerSaveString.append('%s  %d 2\n' % (indent, len(destinations))) 
    190         routerSaveString.append('%s</dimensions>\n' % indent) 
     188        routerSaveString.append('%s<dest_number>\n' % indent) 
     189        routerSaveString.append('%s  %d\n' % (indent, len(self.destinations))) 
     190        routerSaveString.append('%s</dest_number>\n' % indent) 
     191        routerSaveString.append('%s<srcperdest>\n' % indent) 
     192        routerSaveString.append('%s  2\n' % indent) 
     193        routerSaveString.append('%s</srcperdest>\n' % indent) 
    191194        routerSaveString.append('%s<connections>\n' % indent) 
    192         for out in destinations: 
     195        for out in self.destinations: 
    193196            routerSaveString.append('%s  ' % indent + out + ' ') 
    194197            routerSaveString.append(self.interface.getSourceForDestination(out) + '\n') 
     
    197200 
    198201    def readSettings(self, routerReadString): 
    199         try: 
    200             idx = routerReadString.index('<dimensions>') 
    201         except Exception: 
    202             log.debug("Router dimensions must be specified\n") 
    203             return False 
    204         n_r = int(routerReadString[idx+1].split()[0]) 
    205         n_c = int(routerReadString[idx+1].split()[1]) 
    206         if n_c > 2: 
    207             print "Don't know how to handle more than one source for one destination" 
     202        sources = str(self.interface.getSourceNames()) 
     203        if routerReadString[0].find('<dest_number>') == -1: 
     204            log.debug("Number of router destinations must be specified\n") 
     205            return False 
     206        if routerReadString[2].find('</dest_number>') == -1: 
     207            log.debug("Incompatible xml file\n") 
     208            return False 
     209        n_dest = int(routerReadString[1]) 
     210        if n_dest != len(self.destinations): 
     211            log.debug("Caution: numbers of destinations mismatch") 
     212        if routerReadString[3].find('<srcperdest>') == -1: 
     213            log.debug("Number of sources per destinations must be specified\n") 
     214            return False 
     215        if routerReadString[5].find('</srcperdest>') == -1: 
     216            log.debug("Incompatible xml file\n") 
     217            return False 
     218        n_spd = int(routerReadString[4]) 
     219        if n_spd != 2: 
     220            log.debug("Unable to handle more than one source for each destination;") 
    208221        try: 
    209222            idxb = routerReadString.index('<connections>') 
     
    214227            idxe = -1 
    215228            return False 
    216         if idxb > 0: 
    217             if idxe > idxb
     229        if idxb >= 0: 
     230            if idxe > idxb + 1
    218231                for s in routerReadString[idxb+1:idxe]: 
    219232                    destination = s.split()[0] 
    220                     source = s.split()[1] 
    221                     idx = self.switchers[destination].combo.findText(source) 
    222                     self.switchers[destination].combo.setCurrentIndex(idx) 
    223                     self.switchers[destination].comboCurrentChanged(source) 
     233                    if str(self.destinations).find(destination) != -1: 
     234                        source = s.split()[1] 
     235                        if sources.find(source) != -1:                         
     236                            idx = self.switchers[destination].combo.findText(source) 
     237                            self.switchers[destination].combo.setCurrentIndex(idx) 
     238                            self.switchers[destination].comboCurrentChanged(source) 
    224239        return True 
    225240# 
  • trunk/libffado/support/mixer-qt4/ffado/widgets/matrixmixer.py

    r2411 r2473  
    22# 
    33# Copyright (C) 2009 by Arnold Krille 
    4 # Copyright (C) 2013 by Philippe Carriere 
     4#               2013 by Philippe Carriere 
    55# 
    66# This file is part of FFADO 
     
    477477                    self.items[x][y].setValue(val) 
    478478                    self.items[x][y].internalValueChanged(val) 
     479 
     480    def saveSettings(self, indent): 
     481        matrixSaveString = [] 
     482        matrixSaveString.append('%s  <row_number>\n' % indent) 
     483        matrixSaveString.append('%s    %d\n' % (indent, self.rows))         
     484        matrixSaveString.append('%s  </row_number>\n' % indent) 
     485        matrixSaveString.append('%s  <col_number>\n' % indent) 
     486        matrixSaveString.append('%s    %d\n' % (indent, self.cols))         
     487        matrixSaveString.append('%s  </col_number>\n' % indent) 
     488        matrixSaveString.append('%s  <coefficients>\n' % indent) 
     489        for i in range(self.rows): 
     490            line = '%s    ' % indent 
     491            for j in range(self.cols): 
     492                line += '%d ' % self.interface.getValue(i,j) 
     493            line += '\n' 
     494            matrixSaveString.append(line)         
     495        matrixSaveString.append('%s  </coefficients>\n' % indent) 
     496        if (self.mutes_interface != None): 
     497            matrixSaveString.append('%s  <mutes>\n' % indent) 
     498            for i in range(self.rows): 
     499                line = '%s    ' % indent 
     500                for j in range(self.cols): 
     501                    line += '%d ' % self.mutes_interface.getValue(i,j) 
     502                line += '\n' 
     503                matrixSaveString.append(line)         
     504            matrixSaveString.append('%s  </mutes>\n' % indent) 
     505 
     506        if (self.inverts_interface != None): 
     507            matrixSaveString.append('%s  <inverts>\n' % indent) 
     508            for i in range(self.rows): 
     509                line = '%s    ' % indent 
     510                for j in range(self.cols): 
     511                    line += '%d ' % self.inverts_interface.getValue(i,j) 
     512                line += '\n' 
     513                matrixSaveString.append(line)         
     514            matrixSaveString.append('%s  </inverts>\n' % indent) 
     515 
     516        return matrixSaveString 
     517 
     518    def readSettings(self, readMatrixString, transpose_coeff): 
     519        if readMatrixString[0].find("<row_number>") == -1: 
     520            log.debug("Number of matrix rows must be specified") 
     521            return False 
     522        if readMatrixString[2].find("</row_number>") == -1: 
     523            log.debug("Non-conformal xml file") 
     524            return False 
     525        n_rows = int(readMatrixString[1]) 
     526 
     527        if readMatrixString[3].find("<col_number>") == -1: 
     528            log.debug("Number of matrix columns must be specified") 
     529            return False 
     530        if readMatrixString[5].find("</col_number>") == -1: 
     531            log.debug("Non-conformal xml file") 
     532            return False 
     533        n_cols = int(readMatrixString[4]) 
     534 
     535        if transpose_coeff: 
     536            if n_rows > self.cols: 
     537                n_rows = self.cols 
     538            if n_cols > self.rows: 
     539                n_cols = self.rows 
     540        else: 
     541            if n_rows > self.rows: 
     542                n_rows = self.rows 
     543            if n_cols > self.cols: 
     544                n_cols = self.cols 
     545        log.debug("Setting %d rows and %d columns coefficients" % (n_rows, n_cols)) 
     546 
     547        try: 
     548            idxb = readMatrixString.index('<coefficients>') 
     549            idxe = readMatrixString.index('</coefficients>') 
     550        except Exception: 
     551            log.debug("No mixer matrix coefficients specified") 
     552            idxb = -1 
     553            idxe = -1 
     554        if idxb >= 0: 
     555            if idxe < idxb + n_rows + 1: 
     556                log.debug("Incoherent number of rows in coefficients") 
     557                return False 
     558            i = 0 
     559            for s in readMatrixString[idxb+1:idxb + n_rows + 1]: 
     560                coeffs = s.split() 
     561                if len(coeffs) < n_cols: 
     562                    log.debug("Incoherent number of columns in coefficients") 
     563                    return False 
     564                j = 0 
     565                for c in coeffs[0:n_cols]: 
     566                    if transpose_coeff: 
     567                        self.interface.setValue(j, i, int(c)) 
     568                    else: 
     569                        self.interface.setValue(i, j, int(c)) 
     570                    j += 1 
     571                i += 1 
     572                del coeffs 
     573 
     574        try: 
     575            idxb = readMatrixString.index('<mutes>') 
     576            idxe = readMatrixString.index('</mutes>') 
     577        except Exception: 
     578            log.debug("No mixer mute coefficients specified") 
     579            idxb = -1 
     580            idxe = -1 
     581        if idxb >= 0: 
     582            if idxe < idxb + n_rows + 1: 
     583                log.debug("Incoherent number of rows in mute") 
     584                return false 
     585            i = 0 
     586            for s in readMatrixString[idxb+1:idxb + n_rows + 1]: 
     587                coeffs = s.split() 
     588                if len(coeffs) < n_cols: 
     589                    log.debug("Incoherent number of columns in mute") 
     590                    return false 
     591                j = 0 
     592                for c in coeffs[0:n_cols]: 
     593                    if transpose_coeff: 
     594                        self.mutes_interface.setValue(j, i, int(c)) 
     595                    else: 
     596                        self.mutes_interface.setValue(i, j, int(c)) 
     597                    j += 1 
     598                i += 1 
     599                del coeffs 
     600 
     601        try: 
     602            idxb = readMatrixString.index('<inverts>') 
     603            idxe = readMatrixString.index('</inverts>') 
     604        except Exception: 
     605            log.debug("No mixer inverts coefficients specified") 
     606            idxb = -1 
     607            idxe = -1 
     608        if idxb >= 0: 
     609            if idxe < idxb + n_rows + 1: 
     610                log.debug("Incoherent number of rows in inverts") 
     611                return false 
     612            i = 0 
     613            for s in readMatrixString[idxb+1:idxb + n_rows + 1]: 
     614                coeffs = s.split() 
     615                if len(coeffs) < n_cols: 
     616                    log.debug("Incoherent number of columns in inverts") 
     617                    return false 
     618                j = 0 
     619                for c in coeffs[0:n_cols]: 
     620                    if transpose_coeff: 
     621                        self.inverts_interface.setValue(j, i, int(c)) 
     622                    else: 
     623                        self.inverts_interface.setValue(i, j, int(c)) 
     624                    j += 1 
     625                i += 1 
     626                del coeffs 
     627 
     628        self.refreshValues() 
     629        return True 
    479630 
    480631class VolumeSlider(QtGui.QSlider): 
     
    8581009                    self.out[i].svl[n_in].sliderSetValue(v) 
    8591010 
     1011    def saveSettings(self, indent): 
     1012        rows = self.interface.getRowCount() 
     1013        cols = self.interface.getColCount() 
     1014        matrixSaveString = [] 
     1015        matrixSaveString.append('%s  <row_number>\n' % indent) 
     1016        matrixSaveString.append('%s    %d\n' % (indent, rows))         
     1017        matrixSaveString.append('%s  </row_number>\n' % indent) 
     1018        matrixSaveString.append('%s  <col_number>\n' % indent) 
     1019        matrixSaveString.append('%s    %d\n' % (indent, cols))         
     1020        matrixSaveString.append('%s  </col_number>\n' % indent) 
     1021        matrixSaveString.append('%s  <coefficients>\n' % indent) 
     1022        for i in range(rows): 
     1023            line = '%s    ' % indent 
     1024            for j in range(cols): 
     1025                line += '%d ' % self.interface.getValue(i,j) 
     1026            line += '\n' 
     1027            matrixSaveString.append(line)         
     1028        matrixSaveString.append('%s  </coefficients>\n' % indent) 
     1029 
     1030        return matrixSaveString 
     1031 
     1032    def readSettings(self, readMatrixString, transpose_coeff): 
     1033        rows = self.interface.getRowCount() 
     1034        cols = self.interface.getColCount() 
     1035        if readMatrixString[0].find("<row_number>") == -1: 
     1036            log.debug("Number of matrix rows must be specified") 
     1037            return False 
     1038        if readMatrixString[2].find("</row_number>") == -1: 
     1039            log.debug("Non-conformal xml file") 
     1040            return False 
     1041        n_rows = int(readMatrixString[1]) 
     1042 
     1043        if readMatrixString[3].find("<col_number>") == -1: 
     1044            log.debug("Number of matrix columns must be specified") 
     1045            return False 
     1046        if readMatrixString[5].find("</col_number>") == -1: 
     1047            log.debug("Non-conformal xml file") 
     1048            return False 
     1049        n_cols = int(readMatrixString[4]) 
     1050 
     1051        if transpose_coeff: 
     1052            if n_rows > cols: 
     1053                n_rows = cols 
     1054            if n_cols > rows: 
     1055                n_cols = rows 
     1056        else: 
     1057            if n_rows > rows: 
     1058                n_rows = rows 
     1059            if n_cols > cols: 
     1060                n_cols = cols 
     1061        log.debug("Setting %d rows and %d columns coefficients" % (n_rows, n_cols)) 
     1062 
     1063        try: 
     1064            idxb = readMatrixString.index('<coefficients>') 
     1065            idxe = readMatrixString.index('</coefficients>') 
     1066        except Exception: 
     1067            log.debug("No mixer matrix coefficients specified") 
     1068            idxb = -1 
     1069            idxe = -1 
     1070        if idxb >= 0: 
     1071            if idxe < idxb + n_rows + 1: 
     1072                log.debug("Incoherent number of rows in coefficients") 
     1073                return False 
     1074            i = 0 
     1075            for s in readMatrixString[idxb+1:idxb + n_rows + 1]: 
     1076                coeffs = s.split() 
     1077                if len(coeffs) < n_cols: 
     1078                    log.debug("Incoherent number of columns in coefficients") 
     1079                    return False 
     1080                j = 0 
     1081                for c in coeffs[0:n_cols]: 
     1082                    if transpose_coeff: 
     1083                        self.interface.setValue(j, i, int(c)) 
     1084                    else: 
     1085                        self.interface.setValue(i, j, int(c)) 
     1086                    j += 1 
     1087                i += 1 
     1088                del coeffs 
     1089 
     1090        self.refreshValues() 
     1091        return True 
     1092 
    8601093from functools import partial 
    8611094 
     
    11531386        self.perOut.updateRouting() 
    11541387         
     1388    def saveSettings(self, indent): 
     1389        mixerString = [] 
     1390        mixerString.append("%s<matrices>\n" % indent) 
     1391        mixerString.extend(self.matrix.saveSettings(indent)) 
     1392        mixerString.append("%s</matrices>\n" % indent) 
     1393        mixerString.append("%s<stereo_outputs>\n" % indent) 
     1394        mixerString.append("%s  <number>\n" % indent) 
     1395        n = len(self.stereo_channels) 
     1396        mixerString.append("%s    %d\n" % (indent, n)) 
     1397        mixerString.append("%s  </number>\n" % indent) 
     1398        if n > 0: 
     1399            mixerString.append("%s  <channels>\n" % indent) 
     1400            for i in self.stereo_channels: 
     1401                mixerString.append("%s    %d %d\n" % (indent, i+1, i+2)) 
     1402            mixerString.append("%s  </channels>\n" % indent) 
     1403        mixerString.append("%s</stereo_outputs>\n" % indent) 
     1404        return mixerString 
     1405 
     1406    def readSettings(self, readMixerString, transpose_coeff): 
     1407        try: 
     1408            idxb = readMixerString.index('<matrices>') 
     1409            idxe = readMixerString.index('</matrices>') 
     1410        except Exception: 
     1411            log.debug("No matrices found") 
     1412            idxb = -1 
     1413            idxe = -1 
     1414        if idxb >= 0: 
     1415            if idxe > idxb+1: 
     1416                readString = [] 
     1417                for s in readMixerString[idxb+1:idxe]: 
     1418                    readString.append(s) 
     1419                if self.matrix.readSettings(readString, transpose_coeff): 
     1420                    log.debug("Mixer matrices settings modified") 
     1421                del readString 
     1422        try: 
     1423            idx = readMixerString.index('<stereo_outputs>') 
     1424        except Exception: 
     1425            log.debug("No stereo outputs channels information found") 
     1426            idx = -1 
     1427        if idx >= 0: 
     1428            if readMixerString[idx+1].find('<number>') == -1: 
     1429                log.debug("Number of stereo output channels must be specified") 
     1430                return False 
     1431            n = int(readMixerString[idx+2]) 
     1432            if n > self.perOut.nbOut/2: 
     1433                log.debug("Incoherent number of stereo channels") 
     1434                return False 
     1435            if n > 0: 
     1436                if readMixerString[idx+3].find('</number>') == -1: 
     1437                    log.debug("No </number> tag found") 
     1438                    return False 
     1439                if readMixerString[idx+4].find('<channels>') == -1: 
     1440                    log.debug("No <channels> tag found") 
     1441                    return False 
     1442                for s in readMixerString[idx+5:idx+5+n]: 
     1443                    i = (int(s.split()[0]) - 1)/2 
     1444                    self.stereo_switch[i].setChecked(True); 
     1445                    self.switchStereoChannel(i, True) 
     1446        return True 
     1447                     
    11551448# 
    11561449# vim: et ts=4 sw=4 fileencoding=utf8