Skip to content

Commit

Permalink
Merge pull request #726 from josephdadams/contributiontally
Browse files Browse the repository at this point in the history
add contribution tally protocol support
  • Loading branch information
josephdadams authored Sep 11, 2024
2 parents 4c1c04a + 5ba2b34 commit 4f42473
Show file tree
Hide file tree
Showing 12 changed files with 1,042 additions and 63 deletions.
2 changes: 1 addition & 1 deletion UI/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "tallyarbiter-ui",
"version": "3.0.6",
"version": "3.1.0",
"scripts": {
"prestart": "node git.version.js && cd .. && npm run redundancyjs",
"prebuild": "node git.version.js && cd .. && npm run redundancyjs",
Expand Down
11 changes: 8 additions & 3 deletions UI/src/app/_components/settings/settings.component.html
Original file line number Diff line number Diff line change
Expand Up @@ -339,6 +339,7 @@ <h3>Bus Options</h3>
</tbody>
</table>
</div>
<button class="btn btn-sm btn-success" (click)="addBusOption(busOptionModal)"><i class="fas fa-plus"></i> Add </button>
</div>
</div>
<div *ngIf="!configLoaded" class="d-flex justify-content-center mt-3 pt-3">
Expand Down Expand Up @@ -481,7 +482,7 @@ <h3>
<table class="table table-hover align-middle" *ngIf="socketService.devices.length > 0">
<thead>
<tr>
<th *ngFor="let bus of socketService.busOptions">{{bus.label}}</th>
<th *ngFor="let bus of socketService.busOptionsVisible">{{bus.label}}</th>
<th style="min-width: 100px;">Name</th>
<th></th>
<th style="min-width: 200px;">Description</th>
Expand All @@ -490,7 +491,7 @@ <h3>
</thead>
<tbody>
<tr *ngFor="let device of socketService.devices; index as index" [class.text-muted]="!device.enabled">
<td *ngFor="let bus of socketService.busOptions" [style.background-color]="deviceBusColors[device.id].includes(bus.id) ? bus.color : '#FFFFFF'"></td>
<td *ngFor="let bus of socketService.busOptionsVisible" [style.background-color]="deviceBusColors[device.id].includes(bus.id) ? bus.color : '#FFFFFF'"></td>
<td>
<small><b>{{ index + 1 }}</b></small> {{ device.name }}
</td>
Expand Down Expand Up @@ -635,7 +636,7 @@ <h4 class="modal-title" id="modal-basic-title">
<div class="mb-3">
<b>Linked Busses:</b><br>
<small>
By default busses are unlinked. That means the device will be (for example) in PVW if it is in PVW in <b>any</b> Device Source. All busses you select here will only be in that bus if it is in PVW across <b>all</b> Device Sources.
By default busses are unlinked. That means the device will be (for example) in Preview if it is in Preview in <b>any</b> Device Source. By linking, all busses you select here will only be in that bus within Tally Arbiter if it is in Preview across <b>all</b> Device Sources.
</small>
<div>
<select class="form-select" [(ngModel)]="currentDevice.linkedBusses" multiple="multiple">
Expand Down Expand Up @@ -903,6 +904,10 @@ <h4 class="modal-title" id="modal-basic-title">
<label for="busColor" class="form-label">Color</label>
<input type="color" class="form-control color-input" id="busColor" [(ngModel)]="currentBusOption.color" />
</div>
<div class="mb-3">
<input type="checkbox" class="form-check-input" id="busVisible" [(ngModel)]="currentBusOption.visible" />
<label class="form-check-label" for="busVisible">Visible in UI</label>
</div>
<div class="d-flex justify-content-end">
<button class="btn btn-primary" (click)="saveCurrentBusOption()">
<i class="fas fa-save"></i> {{ editingBusOption ? "Save Changes" : "Add Bus Option" }}
Expand Down
11 changes: 11 additions & 0 deletions UI/src/app/_components/settings/settings.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,10 @@ export class SettingsComponent {
type: "device_source",
device_source: deviceSourceObj,
};

//reset the currentDeviceSource
this.currentDeviceSource = {} as DeviceSource;

this.socketService.socket.emit('manage', arbiterObj);
}

Expand Down Expand Up @@ -743,6 +747,13 @@ export class SettingsComponent {
} as CloudDestination;
this.modalService.open(modal);
}

public addBusOption(modal: any) {
this.editingBusOption = false;
this.currentBusOption = { } as BusOption;
this.modalService.open(modal);
}

public editBusOption(bus: BusOption, modal: any) {
this.editingBusOption = true;
this.currentBusOptionSelectedTypeIdx = this.socketService.busOptions.findIndex((t) => t.id == bus.id);
Expand Down
2 changes: 2 additions & 0 deletions UI/src/app/_services/socket.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ export class SocketService {
public vmixClients: VmixClient[] = [];
public sources: Source[] = [];
public busOptions: BusOption[] = [];
public busOptionsVisible: BusOption[] = [];
public remoteErrorOpt: boolean = true;
public initialDataLoaded = false;
public version?: string;
Expand Down Expand Up @@ -231,6 +232,7 @@ export class SocketService {
this.outputTypes = outputTypes;
this.outputTypeDataFields = outputTypesDataFields;
this.busOptions = busOptions;
this.busOptionsVisible = busOptions.filter((b) => b.visible);
this.sources = this.prepareSources(sourcesData);
this.devices = devicesData;
this.deviceSources = deviceSources;
Expand Down
68 changes: 38 additions & 30 deletions docs/docs/usage/sections/sources.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,49 +6,35 @@ sidebar_position: 2
Sources represent all of the tally data that is generated. This is usually your video switcher or mixing software. Multiple sources can be added and they can all be different types.

The following source types are supported:
* TSL 3.1/5.0 UDP/TCP (Ross switchers, Streamstar, FOR-A, etc. - any device that uses the TSL UMD protocol)
* Analog Way Livecore Image Processors
* Blackmagic ATEM
* Blackmagic VideoHub
* Grass Valley Contribution Tally
* Newtek Tricaster
* OBS Studio
* Open Sound Control (OSC)
* Panasonic AV-HS410
* StudioCoast VMix
* Riedel SimplyLive
* Roland Smart Tally
* Roland VR-50HD-MKII
* Ross Vision (through GV Contribution Tally Protocol)
* Ross Carbonite/Carbonite Black/Carbonite Black Solo/Carbonite Ultra/Graphite
* Newtek Tricaster
* Open Sound Control (OSC)
* Panasonic AV-HS410
* Analog Way Livecore Image Processors
* Riedel SimplyLive
* TSL 3.1/5.0 UDP/TCP (Ross switchers, Streamstar, FOR-A, etc. - any device that uses the TSL UMD protocol)

When you add a source and the connection to the tally source (video switcher, software, etc.) is successfully made, the source will be green. If there is an error, the source will be red. Look at the logs for more error information.

## TSL 3.1 UDP/TCP
Your switcher or service that uses this protocol must be configured to send the data to Tally Arbiter at the port you specify.
## Analog Way Livecore Image Processors
You will need the IP address of the device, and the port (standard port is 10600).

## Blackmagic ATEM
You will need the IP address of the ATEM. The ATEM can only have 5 simultaneous connections, so you may need to disconnect another connection in order for Tally Arbiter to connect to the ATEM.

## Blackmagic VideoHub
You will need the IP address of the VideoHub. You can choose to have any destination be configured as a preview bus, program bus, or both. Enter multiple destination routes by separating them with commas.

## OBS Studio
For OBS Studio v27 (or older) the `obs-websockets` plugin must be installed and configured in order for Tally Arbiter to connect. You can get the plugin here: https://github.com/Palakis/obs-websocket/releases.

For OBS Studio v28 and later is `obs-websockets` included with OBS Studio. Note that the included `obs-websockets` in OBS Studio uses port 4455. This will cause a port conflict with TallyArbiter. In OBS Studion can an alternative port be configured in Tools -> WebSocket Server Settings. An alternative is to re-configure Tally Aribiter with another port by editing the [config file](../../usage/control-interface.md).

You will need to supply the IP address, port, and password configured in the OBS Websockets plugin.

## StudioCoast VMix
You will need the IP address of the computer running VMix.

## Roland Smart Tally
You will need the IP address of the Roland switcher.

## Roland VR-50HD-MKII
You will need the IP address of the Roland switcher.

## Ross Carbonite Models
You will need the IP address of the Ross Carbonite switcher. Your Carbonite must be configured to send the data to Tally Arbiter at the port you specify. All Ross products use the TSL 3.1/5.0 protocols, however this specific source type allows you to process tally information by specific supported busses (ME1, MME1, Auxes, etc.) regardless of the "OnAir" setting that is configured on the Carbonite itself.
## Grass Valley Contribution Tally
It's an older protocol sir, but it checks out. Any Grass Valley switcher that uses this protocol. Choose whether the data is arriving via TCP or UDP, and the port you are sending data on.

## Newtek Tricaster
You will need the IP address of the Tricaster.
Expand All @@ -66,12 +52,34 @@ OSC paths must be one of the following:

The device source address should be sent as an integer or a string. Send one argument of any type (integer, float, or string). If you send multiple arguments, they will be ignored.

## OBS Studio
For OBS Studio v27 (or older) the `obs-websockets` plugin must be installed and configured in order for Tally Arbiter to connect. You can get the plugin here: https://github.com/Palakis/obs-websocket/releases.

For OBS Studio v28 and later is `obs-websockets` included with OBS Studio. Note that the included `obs-websockets` in OBS Studio uses port 4455. This will cause a port conflict with TallyArbiter. In OBS Studion can an alternative port be configured in Tools -> WebSocket Server Settings. An alternative is to re-configure Tally Aribiter with another port by editing the [config file](../../usage/control-interface.md).

You will need to supply the IP address, port, and password configured in the OBS Websockets plugin.

## Panasonic AV-HS410
You will need the IP address of the switcher. Multicast must also be enabled on the switcher and your network in order to receive the tally data, therefore Tally Arbiter and the Panasonic device must reside on the same subnet.

## Analog Way Livecore Image Processors
You will need the IP address of the device, and the port (standard port is 10600).

## Riedel SimplyLive
You need to configure TSL in the SimplyLive backend to send the data to Tally Arbiter at the port you specify.
Uses an TSL v5 UDP connection internally.
Uses an TSL v5 UDP connection internally.

## Roland Smart Tally
You will need the IP address of the Roland switcher.

## Roland VR-50HD-MKII
You will need the IP address of the Roland switcher.

## Ross Vision (through Contrib Tally)
Some of Ross's older Vision models use the Contribution Tally protocol instead of TSL.

## Ross Carbonite Models
You will need the IP address of the Ross Carbonite switcher. Your Carbonite must be configured to send the data to Tally Arbiter at the port you specify. All Ross products use the TSL 3.1/5.0 protocols, however this specific source type allows you to process tally information by specific supported busses (ME1, MME1, Auxes, etc.) regardless of the "OnAir" setting that is configured on the Carbonite itself.

## StudioCoast VMix
You will need the IP address of the computer running VMix.

## TSL 3.1 UDP/TCP
Your switcher or service that uses this protocol must be configured to send the data to Tally Arbiter at the port you specify.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "tallyarbiter",
"version": "3.0.10",
"version": "3.1.0",
"description": "The flexible and customizable tally system",
"keywords": [
"util",
Expand Down
15 changes: 11 additions & 4 deletions src/_helpers/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,17 @@ export const ConfigDefaults: Config = {
tsl_clients: [],
tsl_clients_1secupdate: false,
bus_options: [
{ id: 'e393251c', label: 'Preview', type: 'preview', color: '#3fe481', priority: 50},
{ id: '334e4eda', label: 'Program', type: 'program', color: '#e43f5a', priority: 200},
{ id: '12c8d699', label: 'Aux 1', type: 'aux', color: '#0000FF', priority: 100},
{ id: '12c8d689', label: 'Aux 2', type: 'aux', color: '#0000FF', priority: 100}
{ id: 'e393251c', label: 'Preview', type: 'preview', color: '#3fe481', priority: 50, visible: true},
{ id: '334e4eda', label: 'Program', type: 'program', color: '#e43f5a', priority: 200, visible: true},
{ id: '12c8d699', label: 'Aux 1', type: 'aux', color: '#0000FF', priority: 100, visible: true},
{ id: '0449b0c7', label: 'Aux 2', type: 'aux', color: '#0000FF', priority: 100, visible: true},
{ id: '5d94f273', label: 'Aux 3', type: 'aux', color: '#0000FF', priority: 100, visible: false},
{ id: '77ffb605', label: 'Aux 4', type: 'aux', color: '#0000FF', priority: 100, visible: false},
{ id: '09d4975d', label: 'Aux 5', type: 'aux', color: '#0000FF', priority: 100, visible: false},
{ id: 'e2c2e192', label: 'Aux 6', type: 'aux', color: '#0000FF', priority: 100, visible: false},
{ id: '734f7395', label: 'Aux 7', type: 'aux', color: '#0000FF', priority: 100, visible: false},
{ id: '3011d34a', label: 'Aux 8', type: 'aux', color: '#0000FF', priority: 100, visible: false},

],
externalAddress: "http://0.0.0.0:4455/#/tally",
remoteErrorReporting: false,
Expand Down
1 change: 1 addition & 0 deletions src/_models/BusOption.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ export interface BusOption {
id: string;
color: string;
priority: number;
visible: boolean;
}
Loading

0 comments on commit 4f42473

Please sign in to comment.