1

Topic: AVDECC Implementation

Moved posts to here.

Edit: some serious nerd programmer stuff following, prepare your headache pills... wink

Regards
Matthias Carstens
RME

Re: AVDECC Implementation

The listener tries to reestablish the connection on its own. To do this, it saves the status. That can't have anything to do with the Clock-Master. In which mode do you operate the Digiface AVB? Remember that Milan sabotaged the connection setup. The devices AVB-Tool and 12Mic cannot switch the Digiface but they can. Operate all devices in Milan Mode.

3 (edited by damarco 2022-01-23 21:24:19)

Re: AVDECC Implementation

AVB-Stack Control Discriptors AUDIO_UNIT base Value not correct:

Descriptors with Control Base Values wrongly set! The Base Values describes the offset with which the structures of the device are composed. The READ_DESCRIPTOR command only recognizes configuration,desc_type,desc_index → if base = 0, the same descriptor is overwritten. For example, if this reappears with base 0 in the AUDIO_UNIT. The offset describes which descriptor is to be read. desc_index = base+ num++. Also check other descriptors!

Many have a control type vendor. Why ?

Descriptor Entity and ADP Data:

EntityCapability →  ADDRESS_ACCESS_SUPPORTED missed → but is supported  → Logo, Firmware etc,

AECP_AA Read_TLV Command Timeout:

Does not respond at all if the length is wrong, e.g. TLV for read without zero data → not even with an error → command timeout (other commands may also be affected if they have incorrect lengths, if the header is valid and only the length is wrong Answers here TLV_INVALID → TLV could not be executed etc. ). A major stumbling block with this command is that when reading, you have to send exactly as much data as is requested. Who came up with that, presumably that the reception buffer can be used. With Apple, this also works without zero data, the TLV would actually be invalid

AECP READ_DESCRIPTOR Control index:1 value minimum invalid:

Descriptor Type: Control Index: 1 minimum is 0 , with command "START_OPERATION" → BAD_ARGUMENTS. 16 snapshots were probably intended and not 17 → minimum: 1

AECP GET/SET_NAME Not implemented :

Descriptor Type: Control Index: 1 → Type Snapshots command does not work with index over 0 → description of the snapshots

AECP START_OPERATION OPERATION_STATUS Unsolicited Response missed:

see 7.4.55 IEEE 1722.1



I think that's enough for now and provides enough work.

Re: AVDECC Implementation

Dear Marco,

thank you for joining the forum and commenting on the AVB implementation. Please keep these comments in a separate thread, because they are not directly related to the firmware update but to the entire AVB implementation. They deserve a concise title that describes the overall issue, so that other users facing the same issue can benefit from your feedback - which is exactly what this forum is for. It is not a forum to provide work for the RME developers.

Feel free to contact support directly if you come across a problem that is very specific to your usage, so that your findings/remarks get forwarded to a developer to take a look at. This way, ongoing development can benefit from your feedback.

Another forum to discuss details of an AVB implementation is the AVNU Alliance, where developers communicate in a friendly manner and agree on how the standards should be interpreted, used, or even changed (not "sabotaged") in order to allow for interoperability.

Best regards,
Max

Re: AVDECC Implementation

Hello, I know that problems that occur in the beta are included so that they can be delivered in the release as fixed.

The most important thing would be to correct the control descriptors. This will certainly result in further problems if I try them out wink.

Some things that were on my list were already fixed in the beta.
If you would be so kind as to move this thread according to your guidelines.

Re: AVDECC Implementation

damarco wrote:

AVB-Stack Control Discriptors AUDIO_UNIT base Value not correct:
Descriptors with Control Base Values wrongly set! The Base Values describes the offset with which the structures of the device are composed. The READ_DESCRIPTOR command only recognizes configuration,desc_type,desc_index → if base = 0, the same descriptor is overwritten. For example, if this reappears with base 0 in the AUDIO_UNIT. The offset describes which descriptor is to be read. desc_index = base+ num++. Also check other descriptors!

This is now implemented and will be available in the next beta.

damarco wrote:

Many have a control type vendor. Why ?

Because no suitabe standard control type exists.
12Mic and AVB Tool, for example, have standard control types for phantom power, gain and phase invert.
There is however no standard type for High-Z, XLR/TRS select, and Autoset-Gain, at least not that I'm aware of, so we are using a generic "ENABLE" here.
For Gain Group, we do use a vendor specific type, there's just no standard type available that fits the bill.


damarco wrote:

Descriptor Entity and ADP Data:
EntityCapability →  ADDRESS_ACCESS_SUPPORTED missed → but is supported  → Logo, Firmware etc,

Right, that bit was missing. Will land in the next beta as well.

damarco wrote:

AECP_AA Read_TLV Command Timeout:
Does not respond at all if the length is wrong, e.g. TLV for read without zero data → not even with an error → command timeout (other commands may also be affected if they have incorrect lengths, if the header is valid and only the length is wrong Answers here TLV_INVALID → TLV could not be executed etc. ). A major stumbling block with this command is that when reading, you have to send exactly as much data as is requested. Who came up with that, presumably that the reception buffer can be used. With Apple, this also works without zero data, the TLV would actually be invalid

The standard clearly states:
"The memory_data TLV field is always length octets in length. For READ TLVs in an
ADDRESS_ACCESS_COMMAND, this field is zero (0) octet filled and ignored"

If the memory_data is left out, i.e. the tlv is too short with regards to the length field, then it is deemed invalid and discarded, hence no response is sent.
But I agree that during development of an ATDECC application or library, it's nice to get some feedback if you send invalid PDUs.
On the other hand you could have just captured the communication between Hive or the Apple AVDECC controller and 12Mic or AVB Tool.
Both controllers are able to show entity logos, so obviously all implementations do agree here.

damarco wrote:

AECP READ_DESCRIPTOR Control index:1 value minimum invalid:
Descriptor Type: Control Index: 1 minimum is 0 , with command "START_OPERATION" → BAD_ARGUMENTS. 16 snapshots were probably intended and not 17 → minimum: 1

see IEEE 1722.1 7.3.4.9:

  • minimum is zero.

  • maximum is the number of presets (it's 16, we have 16 presets)

  • 0 as value for current is defined as: "no saved settings are currently active or that the recalled settings have since been modified"

...which is exactly how we implement it. It just doesn't make sense to try to load snapshot 0. So IMHO BAD_ARGUMENTS is perfectly fine here.


damarco wrote:

AECP GET/SET_NAME Not implemented :
Descriptor Type: Control Index: 1 → Type Snapshots command does not work with index over 0 → description of the snapshots

You mean name_index? From the standard: "Most descriptors only have one name field, and hence this will normally be zero (0)."
This control is no exception.

If you want to label snapshot though, you may want to re-read 7.4.17.1:
"A MEMORY_OBJECT descriptor of type SNAPSHOT_SETTINGS may have user settable names for each snapshot it contains. If this is the case, then when the name_index
field is zero (0), the name being addressed is the object_name of the descriptor, otherwise it is addressing the name of the index snapshot"
So you have to call SET_NAME on the MEMORY_OBJECT descriptor, not the control!

damarco wrote:

AECP START_OPERATION OPERATION_STATUS Unsolicited Response missed:
see 7.4.55 IEEE 1722.1

We do send OPERATION_STATUS on completion of all operations implemented:
- Recall preset
- Save preset
- Erase preset
Are you sure that your controller subscribes to unsolicited notifications in the first place?


May I ask what project you are working on? Some kind of system integration?
I'm happy to hear that someone uses the comprehensive ATDECC interface that we provide!
ATDECC is pretty unique among audio network standards, as it's the most obvious way to implement control in AVB/Milan-Networks.
There is no OSC, OCA, NMOS, AES70, ember+ to choose from, just ATDECC.
And with L-Acoustic's LA_avdecc there are now three open source implementations to choose from! Pretty cool.

7 (edited by damarco 2022-01-30 19:46:02)

Re: AVDECC Implementation

Control Index:4
  "controlType": "0x480bb2fffed40000(VENDOR)"
Control Index:6
"controlType": "0x480bb2fffed40005(VENDOR)"
Control Index:7
"controlType": "0x480bb2fffed40004(VENDOR)"

{
  "status": "SUCCESS",
  "authenticated": false,
  "locked": false,
  "aquired": false,
  "ownerId": "Unkown",
  "CONTROL": {
    "objName": "None",
    "localizedDescription": "0x00c9",
    "blockLatency": 0,
    "controlLatency": 0,
    "controlBlockIndex": 1,
    "controlValueType": "0x000b(SELECTOR_UINT8)",
    "valueReadOnly": false,
    "valueUnkown": false,
    "controlType": "0x480bb2fffed40004(VENDOR)",
    "resetTime": 0,
    "valuesOffset": 104,
    "numberValues": 2,
    "signalSourceType": "0xffff(INVALID)",
    "signalSourceIndex": 0,
    "signalOutput": 0,
    "value": {
      "SELECTOR_UINT8": {
        "current": 48,
        "default": 48,
        "option": [
          48,
          96
        ]
      }
    }
  },
  "_warnings": [
    "controlType is out of range"
  ],
  "_links": {
    "self": {
      "href": ""
    },
    "profile": {
      "href": "/avb/v1.0/profile/descriptors/control"
    },
    "controlBlock": {
      "href": "/avb/v1.0/devices/48-0b-b2-ff-fe-d0-81-1c/descriptor/entity/configuration/0/controlBlock/1"
    }
  }
}

I haven't looked through all of them now, but I think you will find the problem. In the Hive, these are also not displayed in the AUDO_UNIT.

{
  "status": "SUCCESS",
  "authenticated": false,
  "locked": false,
  "aquired": false,
  "ownerId": "Unkown",
  "CONTROL": {
    "objName": "None",
    "localizedDescription": "0x00ca",
    "blockLatency": 0,
    "controlLatency": 0,
    "controlBlockIndex": 1,
    "controlValueType": "0x0001(LINEAR_UINT8)",
    "valueReadOnly": false,
    "valueUnkown": false,
    "controlType": "0x90e0f00000000002(MUTE)",
    "resetTime": 0,
    "valuesOffset": 104,
    "numberValues": 1,
    "signalSourceType": "0x0002(AUDIO_UNIT)",
    "signalSourceIndex": 0,
    "signalOutput": 0,
    "value": {
      "LINEAR_UINT8": {
        "minimum": [
          0
        ],
        "maximum": [
          255
        ],
        "step": [
          255
        ],
        "default": [
          0
        ],
        "v": [
          0
        ],
        "unit": [
          "0x0000(type: Unitless|multiplier: 0)"
        ],
        "string": [
          "0x00cb"
        ]
      }
    }
  },
  "_warnings": [],
  "_links": {
    "self": {
      "href": ""
    },
    "profile": {
      "href": "/avb/v1.0/profile/descriptors/control"
    },
    "controlBlock": {
      "href": "/avb/v1.0/devices/48-0b-b2-ff-fe-d0-81-1c/descriptor/entity/configuration/0/controlBlock/1"
    },
    "signalSource": {
      "href": "/avb/v1.0/devices/48-0b-b2-ff-fe-d0-81-1c/descriptor/entity/configuration/0/audioUnit/0"
    }
  }
}

but there are also some that are correct, only the base value is wrong. You can't assign them to any function if you don't read the description.  wink
By the way, the descriptor CONTROL BLOCK is also missing. There is no flag if the index is valid. That's how one must be defined. The HAL link is invalid in my API. It is advantageous to control the entire block when muting.

Snapshots names

That was my mistake I had applied this to the CONTROL descriptor. Although that's how you said to use the MEMORY_OBJECT.

OPERATION_STATUS
In my opinion, controllers don't need to register. End devices always send this message, since there are also devices that do not support this. My controller hears these messages as soon as an operation has started.

There is another implementation

https://paforum.de/forum/index.php?thre … ;pageNo=16

works via a REST API and supports almost everything from the 1722.1

Just an LED controlled on an AVDECC event. Others take up the approach of the REST API wink
The project would be suitable to provide the AVB tool with an AVB controller. It reads the device in 5sec. from Hive it takes 15sec. Provides everything with a REST API. VIDEO_UNIT,SENSOR_UNIT are also supported. All security features can be used. But the project is still not finished for 3 years. Something changes from time to time, from experience wink. The controller is also visible on the AVB network if you wish.

https://paforum.de/index.php?attachment/3350-bildschirmfoto-2020-06-27-um-19-21-13-png/

Re: AVDECC Implementation

damarco wrote:

I haven't looked through all of them now, but I think you will find the problem.

I don't see a problem with this approach. Vendor control types that are using the vendor's OUI are well within the standard.
As I said, we discussed for every control if there is a suitable type in the standard, otherwise we assigned a vendor defined one.
If you find a standard control type more suitable, let us know and we will consider your suggestion.

damarco wrote:

By the way, the descriptor CONTROL BLOCK is also missing.

No, there is nothing missing. The use of CONTROL_BLOCKS is entirely optional and for the manageable amount of controls, most of them already grouped by attaching them to external ports, we didn't see any advantage in them. Quite on the contrary, not using control blocks lowers complexity.
Once ATDECC controllers start plopping up where grouping controls using blocks yields a better user experience we might reconsider them.

Judging from the JSON object you've posted, it looks like you've misread/misinterpreted a field in the CONTROL descriptor's PDU.
The field right after "control_latency" is "control_domain", not "control_block".
Controls are assigned to a block using the base_control and number_of_controls fields on the CONTROL_BLOCK descriptor, not by setting the block index on the CONTROL itself.
We are using control domains to assign different access levels to the controls.

damarco wrote:

In my opinion, controllers don't need to register.

I get that it's weird that the controller is not automatically notified about operations he has triggered, but that's what the standard says.
And for maximum interoperability with other vendors, we follow either 1722.1 or the according Milan specifications respectively.

As you are probably aware, the IEEE 1722.1 working group is open to anybody, so it might be a good idea to join the mailing list and propose a behaviour that you think is more reasonable. It will then be discussed and considered for the next revision.

damarco wrote:

There is another implementation .. works via a REST API and supports almost everything from the 1722.1

Cool stuff! Nice idea to use Node-RED, as it enables a huge existing ecosystem to use ATDECC interfaces. Quite some people, in this forum too, might be interested in your project!
Do you have plans to make it available to the public soon?

By the way, you are surely using Hive on Mac OS, where it indeed takes forever to enumerate larger AEMs. On Linux it only takes a few seconds as well.

9 (edited by damarco 2022-01-31 08:57:39)

Re: AVDECC Implementation

Marc S wrote:

No, there is nothing missing. The use of CONTROL_BLOCKS is entirely optional and for the manageable amount of controls, most of them already grouped by attaching them to external ports, we didn't see any advantage in them. Quite on the contrary, not using control blocks lowers complexity.
Once ATDECC controllers start plopping up where grouping controls using blocks yields a better user experience we might reconsider them.

You are right the Value control BlockIndex must be called controlDomain and has nothing to do with CONTROL_BLOCK. It's just an internal grouping. I interpreted it correctly and then changed it again. The name is just wrong wink

Marc S wrote:

I get that it's weird that the controller is not automatically notified about operations he has triggered, but that's what the standard says.
And for maximum interoperability with other vendors, we follow either 1722.1 or the according Milan specifications respectively.

As you are probably aware, the IEEE 1722.1 working group is open to anybody, so it might be a good idea to join the mailing list and propose a behaviour that you think is more reasonable. It will then be discussed and considered for the next revision.

The command is not listed under 7.5.2 IEEE 1722.1-2021/D13. End devices that do not support unsolicited notifications cannot carry out firmware updates. Since no controller listens to the OPERATION_STATUS response and devices do not send it. It is also not necessary to subscribe to the firmware update, controllers would not be notified. It seems to be a matter of interpretation, it is better to send it to the controller that starts the operation.

Marc S wrote:

I don't see a problem with this approach. Vendor control types that are using the vendor's OUI are well within the standard.
As I said, we discussed for every control if there is a suitable type in the standard, otherwise we assigned a vendor defined one.
If you find a standard control type more suitable, let us know and we will consider your suggestion.

Of course there are. The problem is that I want to make suggestions for UI controls. If you describe them so vaguely I can't suggest any items. E.g. mute button, fader, menu.. I will look at it again when the problem with the base value has been fixed.

It's a big problem even if they show control values in the controller. You can hardly use them sensibly. Because it is very difficult to edit the existing controllers. Using the parameters to then load standard elements is the only way to give users access. I've been thinking about how to solve that.

10 (edited by damarco 2022-02-01 18:14:28)

Re: AVDECC Implementation

I wanted to point out again that the problem with the wrong base value also affects other descriptors.

{
  "status": "SUCCESS",
  "authenticated": false,
  "locked": false,
  "aquired": false,
  "ownerId": "Unkown",
  "EXTERNAL_PORT_INPUT": {
    "clockDomainIndex": 0,
    "portFlags": "0x0000(None)",
    "signalSourceType": "0xffff(INVALID)",
    "signalSourceIndex": 0,
    "signalOutput": 0,
    "blockLatency": 0,
    "jackIndex": 3,
    "control": {
      "num": 7,
      "base": 0 <- fail 
    }
  },
  "_warnings": []
}

Therefore, as mentioned, it is very difficult at the moment to find the right descriptors that belong to the functional part. Please check all base values not only from the descriptor control wink

I can also send you a SQLite database of your descriptors. This makes it easier for you to search. I installed the support but don't use it because it's too slow when writing. For now, I'm working on a solution.

Re: AVDECC Implementation

Thanks for your offer, but that won't be necessary. Base ids are already fixed for all descriptors and support will be available in the next beta.

By the way, have you tested the current Hive version (1.2.7)? Christophe did some magic there, so enumerating larger AEMs is pretty fast now. 12Mic is fully enumerated in 3.5 s on my system.

12 (edited by damarco 2022-02-02 08:08:37)

Re: AVDECC Implementation

Not tested yet, primarily the time depends on the response of the device. The device has 250ms for an answer, with an active stream and traffic shaping this can sometimes take an unusually long time. the device may request even more time.

Their devices respond relatively slowly and they have a large number of descriptors. The Digiface AVB is conspicuously slow.  Christophe will not read all of them, only those that are really needed. Others are read on request. Also, not all descriptors are read under Hive. Jacks, Control in sub and extended descriptors are missing.

An Apple device is read with 9 configurations in less than 1s.

The problem with Hive was that the device was only displayed when it was completely read. It's just a matter of weighing up whether they show it with invalid data or not.

Of course, you can also query the descriptors in parallel. Then they have to hope for the reception buffer and Qos that the device also answers them. However, data bursts are not a good idea, because the 1722.1 traffic should be packed between the stream packets. That's why the payload of these packages is relatively small. So that they can be processed well by the Qos.

In addition, some devices have not implemented a Qos internally. They can disrupt the stream with 1722.1 traffic.

Re: AVDECC Implementation

I thought it was a mistake

But it's not, they return a json as a UTF 8 string. Right ? That looks a bit silly in JSON sad

an identifier is an array even if you think of it that way, but a string. They also don't show it as HEX as usual and that looks even more useless.

{
  "status": "SUCCESS",
  "authenticated": false,
  "locked": false,
  "aquired": false,
  "ownerId": "Unkown",
  "CONTROL": {
    "objName": "None",
    "localizedDescription": "0x0118",
    "blockLatency": 0,
    "controlLatency": 0,
    "controlDomain": 0,
    "controlValueType": "0x001f(UTF8)",
    "valueReadOnly": true,
    "valueUnkown": false,
    "controlType": "0x480bb2fffed4000d(VENDOR)",
    "resetTime": 0,
    "valuesOffset": 104,
    "numberValues": 1,
    "signalSourceType": "0xffff(INVALID)",
    "signalSourceIndex": 0,
    "signalOutput": 0,
    "value": {
      "UTF8": {
        "v": "{\"stream_id\":[72,11,178,208,129,28,0,5],\"dest_addr\":[145,224,240,0,185,62],\"state\":{\"t\":\"Disabled\"}}"
      }
    }
  },
  "_warnings": [
    "controlType is out of range"
  ],
  "_links": {
    "self": {
      "href": ""
    },
    "profile": {
      "href": "/avb/v1.0/profile/descriptors/control"
    }
  }
}

See here, the separator ":" or "-" can be used to use the identifier.

{
  "status": "SUCCESS",
  "STREAM_OUTPUT": {
    "flags": "0xf2000000(STREAM_VLAN_ID_VALID|STREAM_DEST_MAC_VALID|MSRP_ACC_LAT_VALID|STREAM_ID_VALID|STREAM_FORMAT_VALID)",
    "currentFormat": "02-05-02-20-02-00-60-00(AVTP_AUDIO|PCM-INT-32|48KHZ|32bit|8ch)",
    "streamId": "48-0b-b2-d0-81-1c-00-00",
    "msrpAccumulatedLatency": 125,
    "msrpFailureCode": "0x00(NO_ERROR)",
    "msrpFailureBridgeId": "00-00-00-00-00-00-00-00",
    "streamVlanId": 0,
    "IpFlags": "0x0000(NOT_USE)",
    "sourcePort": 0,
    "destinationPort": 0,
    "sourceIpAddress": "0000:0000:0000:0000:0000:0000:0000:0000",
    "destinationIpAddress": "0000:0000:0000:0000:0000:0000:0000:0000"
  },
  "_warnings": [],
  "_links": {
    "self": {
      "href": ""
    }
  }
}

Re: AVDECC Implementation

damarco wrote:

they return a json as a UTF 8 string. Right ? That looks a bit silly in JSON sad

Yes, it's UTF-8, which not only is the standard encoding according to the JSON standard (see https://www.ietf.org/rfc/rfc4627.txt, section 3) but also readily available as type for values in ATDECC.

What you probably mean is that the JSON is escaped, which is indeed the case. This way, the values can be encapsulated as "raw" object data into other JSON objects, which comes in quite handy.

As for the UUIDs: Its native type is u64, which isn't available as type in standard JSON, so we had to choose between encoding as string (and manually parsing every time we need the raw value) or a encoding as array of bytes, which is part of the JSON spec and easily transmuted/casted into a u64 value. Downside is that human readibility isn't good, but that's not something we care about in this descriptor.

Talking about "this descriptor": As you noticed we encode stream states there. The information can be easily collected by reading and combining other ATDECC commands (e.g. GET_STREAM_INFO, GET_TX/RX_STATE, etc).
To optimize for internal usage, we have this descriptor which has this data readily available.
However, it shouldn't be seen as public API, but rather as internal state that is, by coincidence, publicy accessible.

So, to sum this up, I really don't see any reason to rant about our engineering decisions here.

15 (edited by damarco 2022-02-25 17:05:27)

Re: AVDECC Implementation

What you probably mean is that the JSON is escaped, which is indeed the case. This way, the values can be encapsulated as "raw" object data into other JSON objects, which comes in quite handy

I don't scold smile. It is unusual to invalidate the characters in the raw data. This is the task of the client library, the result would be the same for me. Your my code would have invalidated the characters. The presentation of addresses is unusual, I know you can argue about that. MAC addresses or identifiers are usually stored as a string. You can't do much with the JSON array as an integer. Because this information is for display only.

Just as a suggestion, not as criticism wink

I also thought for a long time how to best present this, you can see from the example that these are very tidy and legible. The string can also be easily processed again.

We can only both learn from each other. The AVB tool has already paid off in the relationship.

Re: AVDECC Implementation

I just played around with the control descriptors. In so far I have to find out that the thing itself works. But there are a few shortcomings.

1. Gain ranges:

This has two ranges -> TRS +8db -> +50db and XLR 0db -> +75db.

However, this is represented by a descriptor example Channel 0 CONTROL Index: 37.
The range is described with minimum:0 and maximum:75 independent of the TRS/XLR mode. The device also responds in TRS mode with a value above 50 with "SUCCESS".

{
  "status": "SUCCESS",
  "authenticated": false,
  "locked": false,
  "aquired": false,
  "ownerId": "Unkown",
  "CONTROL": {
    "objName": "None",
    "localizedDescription": "0x02db",
    "blockLatency": 0,
    "controlLatency": 0,
    "controlDomain": 1,
    "controlValueType": "0x0001(LINEAR_UINT8)",
    "valueReadOnly": false,
    "valueUnkown": false,
    "controlType": "0x90e0f00000000004(GAIN)",
    "resetTime": 0,
    "valuesOffset": 104,
    "numberValues": 1,
    "signalSourceType": "0xffff(INVALID)",
    "signalSourceIndex": 0,
    "signalOutput": 0,
    "value": {
      "LINEAR_UINT8": {
        "minimum": [
          0
        ],
        "maximum": [
          75
        ],
        "step": [
          1
        ],
        "default": [
          0
        ],
        "v": [
          50
        ],
        "unit": [
          "0x00b0(type: dB|multiplier: 0)"
        ],
        "string": [
          "0x02dc"
        ]
      }
    }
  },
  "_warnings": [],
  "_links": {
    "self": {
      "href": ""
    },
    "profile": {
      "href": "/avb/v1.0/profile/descriptors/control"
    }
  }
}

2. Channel Groups

CONTROL: INDEX:38

Here the default option is 6, but only 2 groups make sense. The device also responds correctly if you choose a value above 2. However, it is still not clear to me how to use the group sensibly. If you then adjust the gain, it only affects one channel.

{
  "status": "SUCCESS",
  "authenticated": false,
  "locked": false,
  "aquired": false,
  "ownerId": "Unkown",
  "CONTROL": {
    "objName": "None",
    "localizedDescription": "0x02dd",
    "blockLatency": 0,
    "controlLatency": 0,
    "controlDomain": 1,
    "controlValueType": "0x000b(SELECTOR_UINT8)",
    "valueReadOnly": false,
    "valueUnkown": false,
    "controlType": "0x480bb2fffed40012(VENDOR)",
    "resetTime": 0,
    "valuesOffset": 104,
    "numberValues": 7,
    "signalSourceType": "0xffff(INVALID)",
    "signalSourceIndex": 0,
    "signalOutput": 0,
    "value": {
      "SELECTOR_UINT8": {
        "current": 1,
        "default": 0,
        "option": [
          0,
          1,
          2,
          3,
          4,
          5,
          6
        ]
      }
    }
  },
  "_warnings": [
    "controlType is out of range"
  ],
  "_links": {
    "self": {
      "href": ""
    },
    "profile": {
      "href": "/avb/v1.0/profile/descriptors/control"
    }
  }
}

Basically, the control descriptors are assigned to the "EXTERNAL PORTS" descriptor. Which isn't wrong, but the user would assume it was the Jacks. The current assignment means if you assign another JACK to the EXTERNAL_PORT, it inherits the values.

The problem can only be solved by writing the TRS/XLR inputs individually and inserting a SIGNAL_SELCTOR between them.

As an intermediate solution, I would recommend returning an error message in TRS mode if the value is over 50. The user of the interface believes that his command was successful.