Skip to content

Commit 48281de

Browse files
authored
Merge pull request #38 from bitfocus/jaw/add-talkback
Add Talkback Functionality
2 parents 58a46fc + 0c8a1fc commit 48281de

File tree

5 files changed

+218
-1
lines changed

5 files changed

+218
-1
lines changed

src/actions/config.ts

Lines changed: 116 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,29 @@ import { SetRequired } from 'type-fest' // eslint-disable-line n/no-missing-impo
44
export type CompanionActionWithCallback = SetRequired<CompanionActionDefinition, 'callback'>
55

66
import { CompanionActionDefinitions } from '@companion-module/base'
7-
import { GetDropdown, GetMuteDropdown } from '../choices/common.js'
7+
import { GetDropdown, GetMuteDropdown, GetNumberField } from '../choices/common.js'
88
import { InstanceBaseExt } from '../types.js'
99
import { WingConfig } from '../config.js'
1010
import * as ActionUtil from './utils.js'
1111
import { ConfigurationCommands } from '../commands/config.js'
1212
import { StateUtil } from '../state/index.js'
1313
import { getIdLabelPair } from '../choices/utils.js'
14+
import { getTalkbackOptions, getTalkbackModeOptions, getTalkbackIndividualOptions } from '../choices/config.js'
1415

1516
export enum CommonActions {
1617
// Solo
1718
SetSoloMute = 'set-solo-mute',
1819
SetSoloDim = 'set-solo-dim',
1920
SetSoloMono = 'set-solo-mono',
2021
SetSoloLRSwap = 'set-solo-swap',
22+
23+
// Talkback
24+
TalkbackOn = 'talkback-on',
25+
TalkbackMode = 'talkback-mode',
26+
TalkbackMonitorDim = 'talkback-monitor-dim',
27+
TalkbackBusDim = 'talkback-bus-dim',
28+
TalkbackAssign = 'talkback-destination',
29+
TalkbackIndividualLevels = 'talkback-individual-levels',
2130
}
2231

2332
export function createConfigurationActions(self: InstanceBaseExt<WingConfig>): CompanionActionDefinitions {
@@ -126,6 +135,112 @@ export function createConfigurationActions(self: InstanceBaseExt<WingConfig>): C
126135
ensureLoaded(cmd)
127136
},
128137
},
138+
////////////////////////////////////////////////////////////////
139+
// Talkback
140+
////////////////////////////////////////////////////////////////
141+
[CommonActions.TalkbackOn]: {
142+
name: 'Talkback On',
143+
description: 'Enable or disable the on state of a talkback.',
144+
options: [
145+
GetDropdown('Talkback', 'tb', getTalkbackOptions()),
146+
GetDropdown('On/Off', 'on', [getIdLabelPair('1', 'On'), getIdLabelPair('0', 'Off')]),
147+
],
148+
callback: async (event) => {
149+
const cmd = ConfigurationCommands.TalkbackOn(event.options.tb as string)
150+
const val = event.options.on as number
151+
send(cmd, val)
152+
},
153+
},
154+
[CommonActions.TalkbackMode]: {
155+
name: 'Talkback Mode',
156+
description: 'Set the mode of a talkback channel.',
157+
options: [
158+
GetDropdown('Talkback', 'tb', getTalkbackOptions()),
159+
GetDropdown('Mode', 'mode', getTalkbackModeOptions()),
160+
],
161+
callback: async (event) => {
162+
const cmd = ConfigurationCommands.TalkbackMode(event.options.tb as string)
163+
const val = event.options.mode as string
164+
send(cmd, val)
165+
},
166+
},
167+
[CommonActions.TalkbackMonitorDim]: {
168+
name: 'Talkback Monitor Dim',
169+
description: 'Set the the monitor dim amount of a talkback channel.',
170+
options: [
171+
GetDropdown('Talkback', 'tb', getTalkbackOptions()),
172+
GetNumberField('Dim [dB]', 'dim', 0, 40, 1, 10, true),
173+
],
174+
callback: async (event) => {
175+
const cmd = ConfigurationCommands.TalkbackMonitorDim(event.options.tb as string)
176+
const val = event.options.dim as number
177+
send(cmd, val, true)
178+
},
179+
},
180+
[CommonActions.TalkbackBusDim]: {
181+
name: 'Talkback Bus Dim',
182+
description: 'Set the the bus dim amount of a talkback channel.',
183+
options: [
184+
GetDropdown('Talkback', 'tb', getTalkbackOptions()),
185+
GetNumberField('Dim [dB]', 'dim', 0, 40, 1, 10, true),
186+
],
187+
callback: async (event) => {
188+
const cmd = ConfigurationCommands.TalkbackBusDim(event.options.tb as string)
189+
const val = event.options.dim as number
190+
send(cmd, val, true)
191+
},
192+
},
193+
[CommonActions.TalkbackAssign]: {
194+
name: 'Talkback Assign',
195+
description: 'Enable, disable or toggle the assignment of a talkback to a bus, matrix or main.',
196+
options: [
197+
GetDropdown('Talkback', 'tb', getTalkbackOptions()),
198+
GetDropdown('Destination', 'dest', [
199+
...state.namedChoices.busses,
200+
...state.namedChoices.matrices,
201+
...state.namedChoices.mains,
202+
]),
203+
GetDropdown('Assign', 'assign', [
204+
getIdLabelPair('1', 'Assign'),
205+
getIdLabelPair('0', 'Not Assign'),
206+
getIdLabelPair('2', 'Toggle'),
207+
]),
208+
],
209+
callback: async (event) => {
210+
const talkback = event.options.tb as string
211+
const destination = event.options.dest as string
212+
const cmd = ActionUtil.getTalkbackAssignCommand(talkback, destination)
213+
const val = event.options.assign as number
214+
if (val < 2) {
215+
send(cmd, val)
216+
} else {
217+
const currentVal = StateUtil.getBooleanFromState(cmd, state)
218+
send(cmd, Number(!currentVal))
219+
}
220+
},
221+
subscribe: (event) => {
222+
const val = event.options.mode as number
223+
if (val >= 2) {
224+
const talkback = event.options.tb as string
225+
const destination = event.options.dest as string
226+
const cmd = ActionUtil.getTalkbackAssignCommand(talkback, destination)
227+
ensureLoaded(cmd)
228+
}
229+
},
230+
},
231+
[CommonActions.TalkbackIndividualLevels]: {
232+
name: 'Talkback Individual Levels',
233+
description: 'Enable or disable individual bus and main talkback levels.',
234+
options: [
235+
GetDropdown('Talkback', 'tb', getTalkbackOptions()),
236+
GetDropdown('Mode', 'mode', getTalkbackIndividualOptions()),
237+
],
238+
callback: async (event) => {
239+
const cmd = ConfigurationCommands.TalkbackIndividual(event.options.tb as string)
240+
const val = event.options.mode as number
241+
send(cmd, val)
242+
},
243+
},
129244
}
130245
return actions
131246
}

src/actions/utils.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { MatrixCommands } from '../commands/matrix.js'
1010
import { MainCommands } from '../commands/main.js'
1111
import { DcaCommands } from '../commands/dca.js'
1212
import { MuteGroupCommands } from '../commands/mutegroup.js'
13+
import { ConfigurationCommands } from '../commands/config.js'
1314

1415
export function getNodeNumber(action: CompanionActionInfo | CompanionFeedbackInfo, id: string): number {
1516
return action.options[id]?.toString().split('/')[2] as unknown as number
@@ -266,3 +267,16 @@ export function getScribblelightCommand(sel: string, val: number): string {
266267
}
267268
return cmd
268269
}
270+
271+
export function getTalkbackAssignCommand(talkback: string, destination: string): string {
272+
let cmd = ''
273+
const num = destination.split('/')[2] as unknown as number
274+
if (destination.startsWith('/bus')) {
275+
cmd = ConfigurationCommands.TalkbackBusAssign(talkback, num)
276+
} else if (destination.startsWith('/mtx')) {
277+
cmd = ConfigurationCommands.TalkbackMatrixAssign(talkback, num)
278+
} else if (destination.startsWith('/main')) {
279+
cmd = ConfigurationCommands.TalkbackMainAssign(talkback, num)
280+
}
281+
return cmd
282+
}

src/choices/config.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { DropdownChoice } from '@companion-module/base'
2+
import { getIdLabelPair } from './utils.js'
3+
4+
export function getTalkbackOptions(): DropdownChoice[] {
5+
return [getIdLabelPair('A', 'Talkback A'), getIdLabelPair('B', 'Talkback B')]
6+
}
7+
8+
export function getTalkbackModeOptions(): DropdownChoice[] {
9+
return [getIdLabelPair('AUTO', 'Automatic'), getIdLabelPair('PUSH', 'Push'), getIdLabelPair('LATCH', 'Latch')]
10+
}
11+
12+
export function getTalkbackIndividualOptions(): DropdownChoice[] {
13+
return [getIdLabelPair('1', 'Individual'), getIdLabelPair('0', 'Linked')]
14+
}

src/commands/config.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,4 +213,40 @@ export namespace ConfigurationCommands {
213213
export function SoloLRSwap(): string {
214214
return `${SoloNode()}/$flip`
215215
}
216+
217+
export function TalkbackNode(talkback: string): string {
218+
return `${ConfigNode()}/talk/${talkback}`
219+
}
220+
221+
export function TalkbackOn(talkback: string): string {
222+
return `${TalkbackNode(talkback)}/$on`
223+
}
224+
225+
export function TalkbackMode(talkback: string): string {
226+
return `${TalkbackNode(talkback)}/mode`
227+
}
228+
229+
export function TalkbackMonitorDim(talkback: string): string {
230+
return `${TalkbackNode(talkback)}/mondim`
231+
}
232+
233+
export function TalkbackBusDim(talkback: string): string {
234+
return `${TalkbackNode(talkback)}/busdim`
235+
}
236+
237+
export function TalkbackIndividual(talkback: string): string {
238+
return `${TalkbackNode(talkback)}/indiv`
239+
}
240+
241+
export function TalkbackBusAssign(talkback: string, bus: number): string {
242+
return `${TalkbackNode(talkback)}/B${bus}`
243+
}
244+
245+
export function TalkbackMatrixAssign(talkback: string, matrix: number): string {
246+
return `${TalkbackNode(talkback)}/MX${matrix}`
247+
}
248+
249+
export function TalkbackMainAssign(talkback: string, main: number): string {
250+
return `${TalkbackNode(talkback)}/M${main}`
251+
}
216252
}

src/variables.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,19 @@ export function UpdateVariableDefinitions(self: WingInstance): void {
184184
})
185185
}
186186

187+
for (let bus = 1; bus <= model.busses; bus++) {
188+
variables.push({ variableId: `talkback_a_bus${bus}_assign`, name: `Talkback A to Bus ${bus} assign` })
189+
variables.push({ variableId: `talkback_b_bus${bus}_assign`, name: `Talkback B to Bus ${bus} assign` })
190+
}
191+
for (let mtx = 1; mtx <= model.matrices; mtx++) {
192+
variables.push({ variableId: `talkback_a_mtx${mtx}_assign`, name: `Talkback A to Matrix ${mtx} assign` })
193+
variables.push({ variableId: `talkback_b_mtx${mtx}_assign`, name: `Talkback B to Matrix ${mtx} assign` })
194+
}
195+
for (let main = 1; main <= model.mains; main++) {
196+
variables.push({ variableId: `talkback_a_main${main}_assign`, name: `Talkback A to Main ${main} assign` })
197+
variables.push({ variableId: `talkback_b_main${main}_assign`, name: `Talkback B to Main ${main} assign` })
198+
}
199+
187200
self.setVariableDefinitions(variables)
188201
}
189202

@@ -199,6 +212,7 @@ export function UpdateVariables(self: WingInstance, msgs: OscMessage[]): void {
199212
UpdatePanoramaVariables(self, path, args[0]?.value as number)
200213
UpdateUsbVariables(self, path, args[0])
201214
UpdateSdVariables(self, path, args[0])
215+
UpdateTalkbackVariables(self, path, args[0])
202216
}
203217
}
204218

@@ -368,3 +382,27 @@ function UpdateSdVariables(self: WingInstance, path: string, args: OSCMetaArgume
368382
}
369383
}
370384
}
385+
386+
function UpdateTalkbackVariables(self: WingInstance, path: string, args: OSCMetaArgument): void {
387+
const match = path.match(/^\/cfg\/talk\/(A|B)\/(B|MX|M)(\d+)$/)
388+
if (!match) {
389+
return
390+
}
391+
392+
const talkback = match[1].toLowerCase()
393+
let destination = ''
394+
if (match[2] == 'B') {
395+
destination = 'bus'
396+
} else if (match[2] == 'MX') {
397+
destination = 'mtx'
398+
} else if (match[2] == 'M') {
399+
destination = 'main'
400+
} else {
401+
return
402+
}
403+
const num = match[3]
404+
405+
self.setVariableValues({
406+
[`talkback_${talkback}_${destination}${num}_assign`]: args.value as number,
407+
})
408+
}

0 commit comments

Comments
 (0)