def set_tonecontrol_filters(self, lowshelf=None, highshelf=None, mode=MODE_BOTH): (addr_left, length_left) = datatools.parse_int_length( self.sigmatcp.request_metadata(ATTRIBUTE_TONECONTROL_FILTER_LEFT)) (addr_right, length_right) = datatools.parse_int_length( self.sigmatcp.request_metadata(ATTRIBUTE_TONECONTROL_FILTER_RIGHT)) if mode == MODE_LEFT: maxlen = length_left elif mode == MODE_RIGHT: maxlen = length_right else: maxlen = min(length_left, length_right) assert maxlen % 5 == 0 maxlen = maxlen / 5 if maxlen < 2: raise ( DSPError("DSPprofile doesn't have tone controls or too short")) if lowshelf is not None: if mode == MODE_LEFT or mode == MODE_BOTH: self.sigmatcp.write_biquad(addr_left, lowshelf) if mode == MODE_RIGHT or mode == MODE_BOTH: self.sigmatcp.write_biquad(addr_right, lowshelf) if highshelf is not None: if mode == MODE_LEFT or mode == MODE_BOTH: self.sigmatcp.write_biquad(addr_left + 5, highshelf) if mode == MODE_RIGHT or mode == MODE_BOTH: self.sigmatcp.write_biquad(addr_right + 5, highshelf)
def write_fir(self, coefficients, mode=MODE_BOTH): (firleft, len_left) = datatools.parse_int_length( self.sigmatcp.request_metadata(ATTRIBUTE_FIR_FILTER_LEFT)) (firright, len_right) = datatools.parse_int_length( self.sigmatcp.request_metadata(ATTRIBUTE_FIR_FILTER_RIGHT)) if mode == MODE_BOTH or mode == MODE_LEFT: result = self.write_coefficients(firleft, len_left, coefficients) if mode == MODE_BOTH or mode == MODE_RIGHT: result = self.write_coefficients(firright, len_right, coefficients) return result
def set_filters(self, filters, mode=MODE_BOTH, cutoff_long=False): (addr_left, length_left) = datatools.parse_int_length( self.sigmatcp.request_metadata(ATTRIBUTE_IIR_FILTER_LEFT)) # Beocreate profiles use different naming if length_left <= 0: (addr_left, length_left) = datatools.parse_int_length( self.sigmatcp.request_metadata(ATTRIBUTE_CUSTOM_FILTER_LEFT)) (addr_right, length_right) = datatools.parse_int_length( self.sigmatcp.request_metadata(ATTRIBUTE_IIR_FILTER_RIGHT)) # Beocreate profiles use different naming if length_right <= 0: (addr_right, length_right) = datatools.parse_int_length( self.sigmatcp.request_metadata(ATTRIBUTE_CUSTOM_FILTER_RIGHT)) if mode == MODE_LEFT: maxlen = length_left elif mode == MODE_RIGHT: maxlen = length_right else: maxlen = min(length_left, length_right) assert maxlen % 5 == 0 maxlen = maxlen / 5 if len(filters) > maxlen and (cutoff_long == False): raise (DSPError( "{} filters given, but filter bank has only {:.0f} slots". format(len(filters), maxlen))) self.hibernate(True) logging.debug("deploying filters %s", filters) i = 0 for f in filters: logging.debug(f) if mode == MODE_LEFT or mode == MODE_BOTH: if i < length_left: self.sigmatcp.write_biquad(addr_left + i * 5, f) if mode == MODE_RIGHT or mode == MODE_BOTH: if i < length_right: self.sigmatcp.write_biquad(addr_right + i * 5, f) i += 1 if i >= maxlen: break self.hibernate(False)
def get_addr_length(self, attribute): addr = self.get_meta(attribute) return parse_int_length(addr)