Skip to content

Commit 07771ad

Browse files
committed
Merge pull request #5 from applest/feature/downstreamkey
Implement downstream key features
2 parents 3962ea2 + 2569a4d commit 07771ad

2 files changed

Lines changed: 67 additions & 7 deletions

File tree

lib/atem.coffee

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,21 @@ class ATEM
4242
Program: 0x01
4343
Preview: 0x02
4444

45+
state:
46+
tallys : []
47+
channels: {}
48+
video:
49+
upstreamKeyNextState: []
50+
upstreamKeyState: []
51+
downstreamKeyOn: []
52+
downstreamKeyTie: []
53+
auxs: {}
54+
audio:
55+
channels: {}
56+
4557
constructor: (local_port = 0) ->
4658
local_port ||= 1024 + Math.floor(Math.random() * 64511) # 1024-65535
4759

48-
@state = {
49-
tallys : []
50-
channels: {}
51-
video: { upstreamKeyNextState: [], upstreamKeyState: [], auxs: {} }
52-
audio: { channels: {} }
53-
}
5460
@localPackedId = 1
5561

5662
@socket = dgram.createSocket 'udp4'
@@ -166,8 +172,14 @@ class ATEM
166172
@state.video.upstreamKeyNextState[2] = (buffer[2] >> 3 & 1) == 0x01
167173
@state.video.upstreamKeyNextState[3] = (buffer[2] >> 4 & 1) == 0x01
168174

175+
when 'DskS'
176+
@state.video.downstreamKeyOn[buffer[0]] = if buffer[1] == 1 then true else false
177+
178+
when 'DskP'
179+
@state.video.downstreamKeyTie[buffer[0]] = if buffer[1] == 1 then true else false
180+
169181
when 'KeOn'
170-
@state.video.upstreamKeyState[buffer[1]] = buffer[2] == 1 ? true : false
182+
@state.video.upstreamKeyState[buffer[1]] = if buffer[2] == 1 then true else false
171183

172184
when 'FtbS' # Fade To Black Setting
173185
@state.video.fadeToBlack = if buffer[1] > 0 then true else false
@@ -302,6 +314,12 @@ class ATEM
302314
changeTransitionType: (type) ->
303315
@_sendCommand('CTTp', [0x01, 0x00, type, 0x02])
304316

317+
changeDownstreamKeyOn: (number, state) ->
318+
@_sendCommand('CDsL', [number, state, 0xff, 0xff])
319+
320+
changeDownstreamKeyTie: (number, state) ->
321+
@_sendCommand('CDsT', [number, state, 0xff, 0xff])
322+
305323
changeUpstreamKeyState: (number, state) ->
306324
@_sendCommand('CKOn', [0x00, number, state, 0x90])
307325

test/test-atem.coffee

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,48 @@ describe 'Atem', ->
180180
sw.changeTransitionType(type)
181181
, done)
182182

183+
describe 'changeDownstreamKeyOn', ->
184+
initialize = (done) ->
185+
async.forEachOfSeries(sw.state.video.downstreamKeyOn, (state, index, next) ->
186+
sw.changeDownstreamKeyOn(index, false)
187+
next null, null
188+
)
189+
setTimeout(done, 100)
190+
191+
before initialize
192+
193+
it 'expects change', (done) ->
194+
async.forEachOfSeries(sw.state.video.downstreamKeyOn, (state, index, next) ->
195+
sw.once('stateChanged', (err, state) ->
196+
expect(state.video.downstreamKeyOn[index]).be.true
197+
next null, null
198+
)
199+
sw.changeDownstreamKeyOn(index, true)
200+
, done)
201+
202+
after initialize
203+
204+
describe 'changeDownstreamKeyTie', ->
205+
initialize = (done) ->
206+
async.forEachOfSeries(sw.state.video.downstreamKeyTie, (state, index, next) ->
207+
sw.changeDownstreamKeyTie(index, false)
208+
next null, null
209+
)
210+
setTimeout(done, 100)
211+
212+
before initialize
213+
214+
it 'expects change', (done) ->
215+
async.forEachOfSeries(sw.state.video.downstreamKeyTie, (state, index, next) ->
216+
sw.once('stateChanged', (err, state) ->
217+
expect(state.video.downstreamKeyTie[index]).be.true
218+
next null, null
219+
)
220+
sw.changeDownstreamKeyTie(index, true)
221+
, done)
222+
223+
after initialize
224+
183225
describe 'changeUpstreamKeyState', ->
184226
initialize = (done) ->
185227
async.forEachOfSeries(sw.state.video.upstreamKeyState, (state, index, next) ->

0 commit comments

Comments
 (0)