def set_processing_mixer_state(unit, subunit_id, attr, fb_id, in_fb, in_ch, out_ch, setting): attrs = ('current', 'minimum', 'maximum', 'resolution', 'default') if subunit_id > 0x07: raise ValueError('Invalid argument for subunit ID') if attrs.count(attr) == 0: raise ValueError('Invalid argument for attribute') if fb_id > 255: raise ValueError('Invalid argument for function block ID') if in_fb > 255: raise ValueError('Invalid argument for input function block ID') if in_ch > 255: raise ValueError('Invalid argument for input channel number') if out_ch > 255: raise ValueError('Invalid argument for output channel number') args = bytearray() args.append(0x00) args.append(0x08 | (subunit_id & 0x07)) args.append(0xb8) args.append(0x82) # Processing function block args.append(fb_id) args.append(AvcAudio.attribute_values[attr]) args.append(0x04) # Selector length is 4 args.append(in_fb) args.append(in_ch) args.append(out_ch) args.append(0x03) # Mixer control args.append(0x02) # Control data is 2 args.append(setting >> 8) # Higher part of setting args.append(setting & 0xff) # Lower part of setting AvcGeneral.command_control(unit, args)
def set_digital_channel_status(unit, spec, name, values): if spec is 'con': attrs = BcoVendorDependent.supported_con_status subcmds = BcoVendorDependent._con_subcmds elif spec is 'pro': attrs = BcoVendorDependent.supported_pro_status subcmds = BcoVendorDependent._pro_subcmds else: raise ValueError('Invalid argument for specification name') if name not in attrs: raise ValueError('Invalid argument for attribute name') if attrs[name] != 1: if type(values) is not 'list' or len(values) != attrs[name]: raise ValueError('Invalid argument for attribute value length') args = bytearray(0xff for i in range(10)) args[0] = 0x00 args[1] = 0xff args[2] = 0x00 args[3] = BcoVendorDependent.supported_spec.index(spec) args[4] = subcmds[name] args[5] = attrs[name] if attrs[name] == 1: args[6] = values else: for i in range(len(values)): args[6 + i] = values[i] AvcGeneral.command_control(unit, args)
def set_feature_mute_state(unit, subunit_id, attr, fb_id, ch, mute): if subunit_id > 0x07: raise ValueError('Invalid argument for subunit ID') if attr is not 'current': raise ValueError('Invalid argument for attribute') if fb_id > 255: raise ValueError('Invalid argument for function block ID') if ch > 255: raise ValueError('Invalid argument for channel number') if mute: mute = 0x70 else: mute = 0x80 args = bytearray() args.append(0x00) args.append(0x08 | (subunit_id & 0x07)) args.append(0xb8) args.append(0x81) # Feature function block args.append(fb_id) args.append(AvcAudio.attribute_values[attr]) args.append(0x02) # Selector length is 2 args.append(ch) args.append(0x01) # Mute control args.append(0x01) # Control data length is 1 args.append(mute) AvcGeneral.command_control(unit, args)
def set_processing_mixer_state_all(unit, subunit_id, attr, fb_id, in_fb, states): attrs = ('current', 'minimum', 'maximum', 'resolution', 'default') if subunit_id > 0x07: raise ValueError('Invalid argument for subunit ID') if attrs.count(attr) == 0: raise ValueError('Invalid argument for attribute') if fb_id > 255: raise ValueError('Invalid argument for function block ID') if in_fb > 255: raise ValueError('Invalid argument for input function block ID') data_count = len(states) // 2 args = bytearray() args.append(0x00) args.append(0x08 | (subunit_id & 0x07)) args.append(0xb8) args.append(0x82) # Processing function block args.append(fb_id) args.append(AvcAudio.attribute_values[attr]) args.append(0x04) # Selector length is 4 args.append(in_fb) args.append(0xff) args.append(0xff) args.append(0x03) # Mixer control args.append(data_count) # The length of control data for i in range(data_count): args.append((states[i * 2] << 8) | states[i * 2 + 1]) AvcGeneral.command_control(unit, args)
def set_digital_channel_status(cls, fcp, spec, name, values): if spec is 'con': attrs = BcoVendorDependent.supported_con_status subcmds = BcoVendorDependent._con_subcmds elif spec is 'pro': attrs = BcoVendorDependent.supported_pro_status subcmds = BcoVendorDependent._pro_subcmds else: raise ValueError('Invalid argument for specification name') if name not in attrs: raise ValueError('Invalid argument for attribute name') if attrs[name] != 1: if type(values) is not 'list' or len(values) != attrs[name]: raise ValueError('Invalid argument for attribute value length') args = bytearray(0xff for i in range(10)) args[0] = 0x00 args[1] = 0xff args[2] = 0x00 args[3] = BcoVendorDependent.supported_spec.index(spec) args[4] = subcmds[name] args[5] = attrs[name] if attrs[name] == 1: args[6] = values else: for i in range(len(values)): args[6 + i] = values[i] AvcGeneral.command_control(fcp, args)
def command_set_param(self, cmd, param): deps = bytearray() deps.append(0x46) deps.append(0x49) deps.append(0x31) deps.append(cmd) deps.append(param) AvcGeneral.set_vendor_dependent(unit, self.company_ids, deps)
def ask_signal_source(cls, fcp, src, dst): args = bytearray() args.append(0x02) args.append(0xff) args.append(0x1a) args.append(0xff) args.append(src[0]) args.append(src[1]) args.append(dst[0]) args.append(dst[1]) AvcGeneral.command_inquire(fcp, args)
def ask_signal_source(unit, src, dst): args = bytearray() args.append(0x02) args.append(0xff) args.append(0x1a) args.append(0xff) args.append(src[0]) args.append(src[1]) args.append(dst[0]) args.append(dst[1]) AvcGeneral.command_inquire(unit, args)
def command_set_param(self, cmd, param): deps = bytearray() deps.append(0x46) deps.append(0x49) deps.append(0x31) deps.append(cmd) deps.append(param) try: AvcGeneral.set_vendor_dependent(self.fcp, self.company_ids, deps) except Exception as e: if str(e) != 'Unknown status': raise e
def set_format(cls, fcp, direction, plug, fmt): args = bytearray() args.append(0x00) # Control args.append(0xff) # Addressing to unit args.append(0xbf) # Extended stream format information command args.append(0xc0) # SINGLE subfunction args.append(cls.plug_direction.index(direction)) args.append(0x00) args.append(0x00) args.append(plug) args.append(0xff) args.append(0xff) args.extend(cls._build_format(fmt)) AvcGeneral.command_control(fcp, args)
def __init__(self, path): super().__init__(path) for quad in self.get_config_rom(): # Vendor ID if quad >> 24 == 0x03: vendor_id = quad & 0x00FFFFFF continue # Model ID if quad >> 24 == 0x17: model_id = quad & 0x00FFFFFF break else: raise ValueError("Invalid argument for Yamaha/Terratec unit") # Check vendor ID for Yamaha/Terratec OUI if vendor_id != 0x00A0DE and vendor_id != 0x000AAC: raise ValueError("Invalid argument for Yamaha/Terratec unit") # Yamaha GO 44 or Terratec Phase 24 FW if model_id == 0x10000B or model_id == 0x000005: self.name = "GO44" self._output_sink_labels = ("analog-1/2", "headphone-1/2", "digital-1/2") self._mixer_output_fb = 1 self._input_level_labels = {"low": 0xF400, "middle": 0xFD00, "high": 0x0000} self._output_labels = () # Yamaha GO 46 or Terratec Phase X24 FW elif model_id == 0x10000C or model_id == 0x000007: self.name = "GO46" self._output_sink_labels = ("analog-1/2", "analog-3/4", "digital-1/2") self._mixer_output_fb = 2 self._output_fb = 1 self._input_level_labels = {} self._output_labels = ("analog-1/2", "analog-3/4") else: raise ValueError("Invalid argument for Yamaha/Terratec unit") unit_info = AvcGeneral.get_unit_info(self.fcp) self._company_ids = unit_info["company-id"]
def get_formats(unit, direction, plug): if AvcGeneral.plug_direction.count(direction) == 0: raise ValueError('Invalid argument for plug direction') if plug > 255: raise ValueError('Invalid argument for plug number') fmts = [] args = bytearray() args.append(0x01) args.append(0xff) args.append(0xbf) args.append(0xc1) args.append(AvcGeneral.plug_direction.index(direction)) args.append(0x00) args.append(0x00) args.append(plug) args.append(0xff) args.append(0xff) args.append(0x00) args.append(0xff) for i in range(255): args[10] = i try: fmt = AvcGeneral.command_status(unit, args) fmts.append(fmt) except: break return fmts
def get_entry_list(cls, fcp, addr): fmts = [] for i in range(0xff): # DM1500 tends to cause timeout. time.sleep(0.1) try: args = bytearray() args.append(0x01) args.append(addr[5]) args.append(0x2f) # Bco stream format support args.append(0xc1) # List request args.append(addr[0]) args.append(addr[1]) args.append(addr[2]) args.append(addr[3]) args.append(addr[4]) args.append(0xff) args.append(i) args.append(0xff) params = AvcGeneral.command_status(fcp, args) fmts.append(cls._parse_format(params[11:])) except OSError as e: if str(e) != 'Rejected': raise else: break return fmts
def get_plug_clusters(unit, addr): if addr[1] != BcoPlugInfo.addr_mode.index('unit') or \ addr[2] != BcoPlugInfo.addr_unit_type.index('isoc'): raise ValueError('Isochronous unit plugs just support this') args = bytearray() args.append(0x01) args.append(addr[5]) args.append(0x02) # Plug info command args.append(0xc0) # Bco plug info subcommand args.append(addr[0]) args.append(addr[1]) args.append(addr[2]) args.append(addr[3]) args.append(addr[4]) args.append(0x03) # Info type is 'channel position data' args.append(0xff) args.append(0xff) params = AvcGeneral.command_status(unit, args) data = params[10:] pos = 0 clusters = [[] for i in range(data[pos])] pos += 1 for cls in range(len(clusters)): num = data[pos] pos += 1 if num == 0: break; clusters[cls] = [[0, 0] for j in range(num)] for e in range(len(clusters[cls])): clusters[cls][e][0] = data[pos]; clusters[cls][e][1] = data[pos + 1]; pos += 2 return clusters
def get_feature_mute_state(unit, subunit_id, attr, fb_id, ch): if subunit_id > 0x07: raise ValueError('Invalid argument for subunit ID') if attr is not 'current': raise ValueError('Invalid argument for attribute') if fb_id > 255: raise ValueError('Invalid argument for function block ID') if ch > 255: raise ValueError('Invalid argument for channel number') args = bytearray() args.append(0x01) args.append(0x08 | (subunit_id & 0x07)) args.append(0xb8) args.append(0x81) # Feature function block args.append(fb_id) args.append(AvcAudio.attribute_values[attr]) args.append(0x02) # Selector length is 2 args.append(ch) args.append(0x01) # Mute control args.append(0x01) # Control data length is 1 args.append(0xff) # Status params = AvcGeneral.command_status(unit, args) if params[10] == 0x70: return True elif params[10] == 0x60: return False else: raise OSError('Unexpected value in response')
def get_entry_list(fcp, addr): fmts = [] for i in range(0xff): # DM1500 tends to cause timeout. time.sleep(0.1) try: args = bytearray() args.append(0x01) args.append(addr[5]) args.append(0x2f) # Bco stream format support args.append(0xc1) # List request args.append(addr[0]) args.append(addr[1]) args.append(addr[2]) args.append(addr[3]) args.append(addr[4]) args.append(0xff) args.append(i) args.append(0xff) params = AvcGeneral.command_status(fcp, args) fmts.append(BcoStreamFormatInfo._parse_format(params[11:])) except OSError as e: if str(e) != 'Rejected': raise else: break return fmts
def get_plug_clusters(unit, addr): if addr[1] != BcoPlugInfo.addr_mode.index('unit') or \ addr[2] != BcoPlugInfo.addr_unit_type.index('isoc'): raise ValueError('Isochronous unit plugs just support this') args = bytearray() args.append(0x01) args.append(addr[5]) args.append(0x02) # Plug info command args.append(0xc0) # Bco plug info subcommand args.append(addr[0]) args.append(addr[1]) args.append(addr[2]) args.append(addr[3]) args.append(addr[4]) args.append(0x03) # Info type is 'channel position data' args.append(0xff) args.append(0xff) params = AvcGeneral.command_status(unit, args) data = params[10:] pos = 0 clusters = [[] for i in range(data[pos])] pos += 1 for cls in range(len(clusters)): num = data[pos] pos += 1 if num == 0: break clusters[cls] = [[0, 0] for j in range(num)] for e in range(len(clusters[cls])): clusters[cls][e][0] = data[pos] clusters[cls][e][1] = data[pos + 1] pos += 2 return clusters
def get_subunit_fb_info(unit, subunit_type, subunit_id, page, fb_type): if AvcGeneral.subunit_types.count(subunit_type) == 0: raise ValueError('Invalid argument for subunit type') if subunit_id > 7: raise ValueError('Invalid argument for subunit id') args = bytearray(0xff for i in range(29)) args[0] = 0x01 args[1] = ( AvcGeneral.subunit_types.index(subunit_type) << 3) | subunit_id args[2] = 0x31 args[3] = page args[4] = 0xff params = AvcGeneral.command_status(unit, args) entries = [] for i in range(5): if params[5 + 5 * i] == 0xff: continue entry = {} entry['fb-type'] = params[5 + 5 * i] entry['fb-id'] = params[6 + 5 * i] entry['fb-purpose'] = BcoSubunitInfo.fb_purpose[params[7 + 5 * i]] entry['inputs'] = params[8 + 5 * i] entry['outputs'] = params[9 + 5 * i] entries.append(entry) return entries
def get_plug_clusters(cls, fcp, addr): args = bytearray() args.append(0x01) args.append(addr[5]) args.append(0x02) # Plug info command args.append(0xc0) # Bco plug info subcommand args.append(addr[0]) args.append(addr[1]) args.append(addr[2]) args.append(addr[3]) args.append(addr[4]) args.append(0x03) # Info type is 'channel position data' args.append(0xff) args.append(0xff) params = AvcGeneral.command_status(fcp, args) data = params[10:] pos = 0 clusters = [[] for i in range(data[pos])] pos += 1 for cls in range(len(clusters)): num = data[pos] pos += 1 if num == 0: break; clusters[cls] = [[0, 0] for j in range(num)] for e in range(len(clusters[cls])): clusters[cls][e][0] = data[pos]; clusters[cls][e][1] = data[pos + 1]; pos += 2 return clusters
def get_processing_mixer_state_all(unit, subunit_id, attr, fb_id, in_fb): attrs = ('current', 'minimum', 'maximum', 'resolution', 'default') if subunit_id > 0x07: raise ValueError('Invalid argument for subunit ID') if attrs.count(attr) == 0: raise ValueError('Invalid argument for attribute') if fb_id > 255: raise ValueError('Invalid argument for function block ID') if in_fb > 255: raise ValueError('Invalid argument for input function block ID') args = bytearray() args.append(0x01) args.append(0x08 | (subunit_id & 0x07)) args.append(0xb8) args.append(0x82) # Processing function block args.append(fb_id) args.append(AvcAudio.attribute_values[attr]) args.append(0x04) # Selector length is 4 args.append(in_fb) args.append(0xff) args.append(0xff) args.append(0x03) # Mixer control args.append(0xff) # The length of control data in response params = AvcGeneral.command_status(unit, args) count = params[11] // 2 status = [] for i in range(count): status.append((params[12 + i * 2] << 8) | params[13 + i * 2]) return status
def command_get_param(self, cmd): deps = bytearray() deps.append(0x46) deps.append(0x49) deps.append(0x31) deps.append(cmd) deps.append(0xff) params = AvcGeneral.get_vendor_dependent(unit, self.company_ids, deps) return params[4]
def set_selector_state(unit, subunit_id, attr, fb_id, value): if subunit_id > 0x07: raise ValueError('Invalid argument for subunit ID') if ('current', 'minimum', 'maximum', 'default').count(attr) == 0: raise ValueError('Invalid argument for attribute') if fb_id > 255: raise ValueError('Invalid argument for function block ID') if value > 255: raise ValueError('Invalid argument for selector value') args = bytearray() args.append(0x00) args.append(0x08 | (subunit_id & 0x07)) args.append(0xb8) args.append(0x80) # Selector function block args.append(fb_id) args.append(AvcAudio.attribute_values[attribute]) args.append(0x02) # Selector length is 2 args.append(value) args.append(0x01) # Selector control AvcGeneral.command_control(unit, args)
def set_signal_source(cls, fcp, src, dst): args = bytearray() args.append(0x00) args.append(0xff) args.append(0x1a) args.append(0x0f) args.append(src[0]) args.append(src[1]) args.append(dst[0]) args.append(dst[1]) return AvcGeneral.command_control(fcp, args)
def __init__(self, path): super().__init__(path) model_id = -1 for quad in self.get_config_rom(): if quad >> 24 == 0x17: model_id = quad & 0x00ffffff self._id = self._ids[model_id][0] info = AvcGeneral.get_unit_info(self.fcp) self._company_ids = info['company-id'] if model_id < 0: raise OSError('Not supported')
def set_signal_souarce(unit, src, dst): args = bytearray() args.append(0x01) args.append(0xff) args.append(0x1a) args.append(0x0f) args.append(src[0]) args.append(src[1]) args.append(dst[0]) args.append(dst[1]) return AvcGeneral.command_control(unit, args)
def get_signal_source(unit, dst): args = bytearray() args.append(0x01) args.append(0xff) args.append(0x1a) args.append(0xff) args.append(0xff) args.append(0xfe) args.append(dst[0]) args.append(dst[1]) params = AvcGeneral.command_status(unit, args) return AvcCcm.parse_signal_addr(params[6:])
def get_signal_source(cls, fcp, dst): args = bytearray() args.append(0x01) args.append(0xff) args.append(0x1a) args.append(0xff) args.append(0xff) args.append(0xfe) args.append(dst[0]) args.append(dst[1]) params = AvcGeneral.command_status(fcp, args) src = params[4:6] return cls.parse_signal_addr(src)
def set_feature_volume_state(cls, fcp, subunit_id, attr, fb_id, ch, vol): if subunit_id > 0x07: raise ValueError('Invalid argument for subunit ID') if cls.attributes.count(attr) == 0: raise ValueError('Invalid argument for attribute') if fb_id > 255: raise ValueError('Invalid argument for function block ID') if ch > 255: raise ValueError('Invalid argument for channel number') args = bytearray() args.append(0x00) args.append(0x08 | (subunit_id & 0x07)) args.append(0xb8) args.append(0x81) # Feature function block args.append(fb_id) args.append(cls.attribute_values[attr]) args.append(0x02) # Selector length is 2 args.append(ch) args.append(0x02) # Volume control args.append(0x02) # Control data length is 2 args.append(vol >> 8) # Higher part of volume args.append(vol & 0xff) # Lower part of volume AvcGeneral.command_control(fcp, args)
def set_feature_lr_state(unit, subunit_id, attr, fb_id, ch, balance): if subunit_id > 0x07: raise ValueError('Invalid argument for subunit ID') if AvcAudio.attributes.count(attr) == 0: raise ValueError('Invalid argument for attribute') if fb_id > 255: raise ValueError('Invalid argument for function block ID') if ch > 255: raise ValueError('Invalid argument for channel number') args = bytearray() args.append(0x00) args.append(0x08 | (subunit_id & 0x07)) args.append(0xb8) args.append(0x81) # Feature function block args.append(fb_id) args.append(AvcAudio.attribute_values[attr]) args.append(0x02) # Selector length is 2 args.append(ch) args.append(0x03) # LR control args.append(0x02) # Control data length is 2 args.append(balance >> 8) # Higher part of balance args.append(balance & 0xff) # Lower part of balance AvcGeneral.command_control(unit, args)
def __init__(self, path): super().__init__(path) model_id = -1 for quad in self.get_config_rom(): if quad >> 24 == 0x17: model_id = quad & 0x00FFFFFF self._id = self._ids[model_id][0] info = AvcGeneral.get_unit_info(self.fcp) self._company_ids = info["company-id"] if model_id < 0: raise OSError("Not supported") # For process local cache. self._cache = [0x00000000] * 40 # For permanent cache. self._filepath = "/tmp/hinawa-{0:08x}".format(self.get_property("guid")) self._load_cache()
def get_plug_channels(unit, addr): args = bytearray() args.append(0x01) args.append(addr[5]) args.append(0x02) # Plug info command args.append(0xc0) # Bco plug info subcommand args.append(addr[0]) args.append(addr[1]) args.append(addr[2]) args.append(addr[3]) args.append(addr[4]) args.append(0x02) # Info type is 'the number of channels' args.append(0xff) args.append(0xff) params = AvcGeneral.command_status(unit, args) return params[10]
def get_stream_detection(self, company_ids, dir, ext_plug): if BcoVendorDependent.addr_dir.count(dir) == 0: raise ValueError('Invalid argument for address direction') if ext_plug >= 255: raise ValueError('Invalid argument for external plug number') args = bytearray() args.append(0x00) args.append(BcoVendorDependent.addr_dir.index(dir)) args.append(plug) args.append(0x00) params = AvcGeneral.get_vendor_dependent(self, company_ids, args) if params[0] != args[0] or params[1] != args[1] or params[2] != args[2]: raise OSError('Unexpected value in response') if params[3] == 0x00: return False return True
def get_plug_channels(cls, fcp, addr): args = bytearray() args.append(0x01) args.append(addr[5]) args.append(0x02) # Plug info command args.append(0xc0) # Bco plug info subcommand args.append(addr[0]) args.append(addr[1]) args.append(addr[2]) args.append(addr[3]) args.append(addr[4]) args.append(0x02) # Info type is 'the number of channels' args.append(0xff) args.append(0xff) params = AvcGeneral.command_status(fcp, args) return params[10]
def get_plug_input(cls, fcp, addr): args = bytearray() args.append(0x01) args.append(addr[5]) args.append(0x02) # Plug info command args.append(0xc0) # Bco plug info subcommand args.append(addr[0]) args.append(addr[1]) args.append(addr[2]) args.append(addr[3]) args.append(addr[4]) args.append(0x05) # Info type is 'input data' args.append(0xff) args.append(0xff) params = AvcGeneral.command_status(fcp, args) return cls.parse_plug_addr(params[10:])
def get_plug_input(unit, addr): args = bytearray() args.append(0x01) args.append(addr[5]) args.append(0x02) # Plug info command args.append(0xc0) # Bco plug info subcommand args.append(addr[0]) args.append(addr[1]) args.append(addr[2]) args.append(addr[3]) args.append(addr[4]) args.append(0x05) # Info type is 'input data' args.append(0xff) args.append(0xff) params = AvcGeneral.command_status(unit, args) return BcoPlugInfo.parse_plug_addr(params[10:])
def get_stream_detection(cls, fcp, company_ids, dir, ext_plug): if BcoVendorDependent.addr_dir.count(dir) == 0: raise ValueError('Invalid argument for address direction') if ext_plug >= 255: raise ValueError('Invalid argument for external plug number') args = bytearray() args.append(0x00) args.append(BcoVendorDependent.addr_dir.index(dir)) args.append(ext_plug) args.append(0xff) params = AvcGeneral.get_vendor_dependent(fcp, company_ids, args) if params[0] != args[0] or params[1] != args[1] or params[2] != args[2]: raise OSError('Unexpected value in response') if params[3] == 0x00: return False return True
def get_plug_cluster_info(cls, fcp, addr, cluster): args = bytearray() args.append(0x01) args.append(addr[5]) args.append(0x02) # Plug info command args.append(0xc0) # Bco plug info subcommand args.append(addr[0]) args.append(addr[1]) args.append(addr[2]) args.append(addr[3]) args.append(addr[4]) args.append(0x07) # Info type is 'cluster info' args.append(cluster) args.append(0xff) params = AvcGeneral.command_status(fcp, args) length = params[12] return params[13:13+length].decode()
def get_plug_ch_name(unit, addr, pos): args = bytearray() args.append(0x01) args.append(addr[5]) args.append(0x02) # Plug info command args.append(0xc0) # Bco plug info subcommand args.append(addr[0]) args.append(addr[1]) args.append(addr[2]) args.append(addr[3]) args.append(addr[4]) args.append(0x04) # Info type is 'channel position name' args.append(pos) args.append(0xff) params = AvcGeneral.command_status(unit, args) length = params[11] return params[12:12 + length].decode()
def get_plug_ch_name(cls, fcp, addr, pos): args = bytearray() args.append(0x01) args.append(addr[5]) args.append(0x02) # Plug info command args.append(0xc0) # Bco plug info subcommand args.append(addr[0]) args.append(addr[1]) args.append(addr[2]) args.append(addr[3]) args.append(addr[4]) args.append(0x04) # Info type is 'channel position name' args.append(pos) args.append(0xff) params = AvcGeneral.command_status(fcp, args) length = params[11] return params[12:12+length].decode()
def get_plug_type(unit, addr): args = bytearray() args.append(0x01) args.append(addr[5]) args.append(0x02) # Plug info command args.append(0xc0) # Bco plug info subcommand args.append(addr[0]) args.append(addr[1]) args.append(addr[2]) args.append(addr[3]) args.append(addr[4]) args.append(0x00) # Info type is 'type' args.append(0xff) args.append(0xff) params = AvcGeneral.command_status(unit, args) if params[10] > len(BcoPlugInfo.plug_type): raise OSError('Unexpected value in response') return BcoPlugInfo.plug_type[params[10]]
def get_plug_name(unit, addr): args = bytearray() args.append(0x01) args.append(addr[5]) args.append(0x02) # Plug info command args.append(0xc0) # Bco plug info subcommand args.append(addr[0]) args.append(addr[1]) args.append(addr[2]) args.append(addr[3]) args.append(addr[4]) args.append(0x01) # Info type is 'name' args.append(0xff) args.append(0xff) params = AvcGeneral.command_status(unit, args) length = params[10] if length == 0: return "" return params[11:11 + length].decode()
def get_subunits(unit): args = bytearray() args.append(0x01) args.append(0xff) args.append(0x31) args.append(0x00) # Any values are approved. args.append(0xff) args.append(0xff) args.append(0xff) args.append(0xff) params = AvcGeneral.command_status(unit, args) subunits = [] for i in range(4, 7): if params[i] is not 0xff: subunit = {} subunit['type'] = AvcGeneral.subunit_types[params[i] >> 3] subunit['id'] = params[i] & 0x7 subunits.append(subunit) return subunits
def get_digital_channel_status(unit, spec, name): if spec is 'con': attrs = BcoVendorDependent.supported_con_status subcmds = BcoVendorDependent._con_subcmds elif spec is 'pro': attrs = BcoVendorDependent.supported_pro_status subcmds = BcoVendorDependent._pro_subcmds else: raise ValueError('Invalid argument for specification name') if name not in attrs: raise ValueError('Invalid argumetn for attribute name') args = bytearray(0xff for i in range(10)) args[0] = 0x01 args[1] = 0xff args[2] = 0x00 args[3] = BcoVendorDependent.supported_spec.index(spec) args[4] = subcmds[name] args[5] = attrs[name] params = AvcGeneral.command_status(unit, args) return params[6:6 + attrs[name]]
def get_plug_cluster_info(unit, addr, cls): if addr[1] != BcoPlugInfo.addr_mode.index('unit') or \ addr[2] != BcoPlugInfo.addr_unit_type.index('isoc'): raise ValueError('Isochronous unit plugs just support this') args = bytearray() args.append(0x01) args.append(addr[5]) args.append(0x02) # Plug info command args.append(0xc0) # Bco plug info subcommand args.append(addr[0]) args.append(addr[1]) args.append(addr[2]) args.append(addr[3]) args.append(addr[4]) args.append(0x07) # Info type is 'cluster info' args.append(cls) args.append(0xff) params = AvcGeneral.command_status(unit, args) length = params[12] return params[13:13 + length].decode()
def get_plug_outputs(unit, addr): args = bytearray() args.append(0x01) args.append(addr[5]) args.append(0x02) # Plug info command args.append(0xc0) # Bco plug info subcommand args.append(addr[0]) args.append(addr[1]) args.append(addr[2]) args.append(addr[3]) args.append(addr[4]) args.append(0x06) # Info type is 'output data' args.append(0xff) args.append(0xff) params = AvcGeneral.command_status(unit, args) info = [] plugs = params[10] if plugs != 0xff: for i in range(plugs): addr = BcoPlugInfo.parse_plug_addr(params[11 + i * 7:]) info.append(addr) return info
def get_feature_volume_state(unit, subunit_id, attr, fb_id, ch): if subunit_id > 0x07: raise ValueError('Invalid argument for subunit ID') if AvcAudio.attributes.count(attr) == 0: raise ValueError('Invalid argument for attribute') if fb_id > 255: raise ValueError('Invalid argument for function block ID') if ch > 255: raise ValueError('Invalid argument for channel number') args = bytearray() args.append(0x01) args.append(0x08 | (subunit_id & 0x07)) args.append(0xb8) args.append(0x81) # Feature function block args.append(fb_id) args.append(AvcAudio.attribute_values[attr]) args.append(0x02) # Selector length is 2 args.append(ch) args.append(0x02) # Volume control args.append(0x02) # Control data length is 2 args.append(0xff) # Higher part of volume args.append(0xff) # Lower part of volume params = AvcGeneral.command_status(unit, args) return (params[10] << 8) | params[11]
def _parse_unit_info(self, fcp): return AvcGeneral.get_unit_info(fcp)