Giter Site home page Giter Site logo

nrkno / sofie-atem-connection Goto Github PK

View Code? Open in Web Editor NEW
126.0 20.0 36.0 13.86 MB

Sofie ATEM Connection: A Part of the Sofie TV Studio Automation System

Home Page: https://github.com/nrkno/Sofie-TV-automation/

License: MIT License

JavaScript 0.52% TypeScript 99.47% Shell 0.01%
sofie atem hacktoberfest blackmagicdesign blackmagicdesign-atem video-mixer protocol

sofie-atem-connection's Introduction

Sofie ATEM Connection Library

Node CI codecov npm

This is the ATEM Connection library of the Sofie TV Automation System. The library is used for connecting to Blackmagic Design's ATEM devices.

General Sofie System Information


Device support

Version Level of Support
v8.0 - v8.6 Primary focus. Target for new features
v7.2 Previous focus, should still work well
v7.3 - v7.5.2 Community tested, we may accept PRs but will not be testing these

Due to the nature of the ATEM firmware and its tendency to break things, it is likely that new firmwares will require updates to the library to be fully supported. Additionally any newly unimplemented functionality will generally only be written and tested for the latest firmware, even if it was added in an older firmware.

We have no intention of dropping support for older firmwares, but we may do at some point. If we do this will be done in a major version bump, and will only be for significantly older firmware.

The library is tested on a variety of models spanning every generation, and the aim is to provide support for every model.

Note: USB control of devices is not supported by this library.

Technology Highlights

  • Typescript
  • Jest
  • standard-version
  • codecov

Installation

For usage by library consumers installation is as easy as:

yarn add atem-connection

For library developers installation steps are as following:

git clone https://github.com/nrkno/tv-automation-atem-connection
yarn
yarn build

We welcome any contributions. Please read our guide on how to add new commands before raising a PR.

Usage

const { Atem } = require('atem-connection')
const myAtem = new Atem()
myAtem.on('info', console.log)
myAtem.on('error', console.error)

myAtem.connect('192.168.168.240')

myAtem.on('connected', () => {
	myAtem.changeProgramInput(3).then(() => {
		// Fired once the atem has acknowledged the command
		// Note: the state likely hasnt updated yet, but will follow shortly
		console.log('Program input set')
	})
	console.log(myAtem.state)
})

myAtem.on('stateChanged', (state, pathToChange) => {
	console.log(state) // catch the ATEM state.
})

Documentation

You can find the generated type docs here.

Events

  • error This event will be fired when an error occurs in the connection. Node requires you to handle these errors, or your application will quit.

  • info This event will be fired when the connection provides some logging information.

  • debug This event is not useful for most users. It will emit some messages useful to figure out why some data useful mostly to library developers.

  • connected This event will be fired once we have connected with the ATEM.

  • disconnected Whenever the connection to the ATEM fails and does not recover within 5 seconds this is called.

  • stateChanged(state, path) Whenever a packet from the ATEM is received that changes the state, this event will be fired. The path parameter is a path into the state that represents the change, to allow for filtering of events. eg video.mixEffects.0.programInput

  • receivedCommand(command) Whenever a packet from the ATEM is received that contains a command, this event will be fired. This should not be relied on in most usage, as the commands can and will have breaking changes in patch releases. This event is needed for some use cases, so if this is used you should likely pin the version down to a specific patch release to ensure nothing breaks.

Debug

Set debugBuffers=true config option in order to see raw packets. This is especially useful for library developers.

const myAtem = new Atem({ debugBuffers: true })
myAtem.on('info', console.log)
myAtem.on('debug', console.log)
myAtem.on('error', console.error)
SEND <Buffer 10 14 53 ab 00 00 00 00 00 3a 00 00 01 00 00 00 00 00 00 00>
SEND <Buffer 80 0c 53 ab 00 00 00 00 00 03 00 00>
SEND <Buffer 80 0c 53 ab 00 00 00 00 00 03 00 00>
SEND <Buffer 80 0c 80 0f 00 01 00 00 00 41 00 00>
RECV <Buffer 00 0c 90 60 5f 76 65 72 00 02 00 10>...

Test

This module run tests with jest.

$ yarn unit

There is a suite of generated serialization tests, using atem-connection-test-generator as the LibAtem project has tests to verify its serialization against the Blackmagic Design's ATEM SDK.


The NRK logo is a registered trademark of Norsk rikskringkasting AS. The license does not grant any right to use, in any way, any trademarks, service marks or logos of Norsk rikskringkasting AS.

sofie-atem-connection's People

Contributors

astral-arsonist avatar bevand10 avatar dependabot[bot] avatar endreszabo avatar hummelstrand avatar ianshade avatar jesperstarkar avatar julusian avatar keith8496 avatar kohbrax avatar krocheck avatar mint-dewit avatar nytamin avatar peterc89 avatar siljekristensen avatar sparkpunkd avatar stephan-nordnes-eriksen avatar superflytvab avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

sofie-atem-connection's Issues

CMPr, MRCP Macro Change Properties

  • I'm submitting a ...
    [ ] bug report
    [x] feature request
    [ ] question about the decisions made in the repository
    [ ] question about how to use this project

  • Summary
    Please implement command for Macro Run Change Properties for looping setting

KKFP/KeFS atem error Error: Number too big: 80 > 3

  • I'm submitting a ...
    [x] bug report
    [ ] feature request
    [ ] question about the decisions made in the repository
    [ ] question about how to use this project

  • Summary
    Throwing error while parsing commands KKFP and KeFS.
    I am using ATEM Television Studio, firmware version 8.2.3

  • Other information

COMMAND KKFP(60) <Buffer 00 3c 59 70 4b 4b 46 50 50 16 42 4c 4b 00 01 28 01 00 01 00 01 00 12 01 00 2c a2 80 49 6e 50 72 00 01 54 69 74 75 6c 6b 79 00 00 00 50 4f 0b 90 50 13 ... 10 more bytes>
atem error Error: Number too big: 80 > 3
    at Object.parseNumberBetween (/Users/fhanes/projects/atem-live-controller/node_modules/.pnpm/registry.npmjs.org/atem-connection/1.3.3/node_modules/atem-connection/dist/lib/atemUtil.js:28:19)
    at MixEffectKeyFlyKeyframeGetCommand.deserialize (/Users/fhanes/projects/atem-live-controller/node_modules/.pnpm/registry.npmjs.org/atem-connection/1.3.3/node_modules/atem-connection/dist/commands/MixEffects/Key/MixEffectKeyFlyKeyframeGetCommand.js:11:35)
    at AtemSocket._parseCommand (/Users/fhanes/projects/atem-live-controller/node_modules/.pnpm/registry.npmjs.org/atem-connection/1.3.3/node_modules/atem-connection/dist/lib/atemSocket.js:159:21)
COMMAND KeFS(16) <Buffer 00 10 50 72 4b 65 46 53 61 63 6b 00 50 bc 4e 90>
atem error Error: Number too big: 97 > 3
    at Object.parseNumberBetween (/Users/fhanes/projects/atem-live-controller/node_modules/.pnpm/registry.npmjs.org/atem-connection/1.3.3/node_modules/atem-connection/dist/lib/atemUtil.js:28:19)
    at MixEffectKeyFlyPropertiesGetCommand.deserialize (/Users/fhanes/projects/atem-live-controller/node_modules/.pnpm/registry.npmjs.org/atem-connection/1.3.3/node_modules/atem-connection/dist/commands/MixEffects/Key/MixEffectKeyFlyPropertiesGetCommand.js:11:35)
    at AtemSocket._parseCommand (/Users/fhanes/projects/atem-live-controller/node_modules/.pnpm/registry.npmjs.org/atem-connection/1.3.3/node_modules/atem-connection/dist/lib/atemSocket.js:159:21)
COMMAND KKFP(60) <Buffer 00 3c 00 02 4b 4b 46 50 00 2c 00 01 49 6e 50 72 00 02 56 69 64 65 6f 20 50 43 00 00 50 13 08 34 00 10 08 34 4d 50 56 49 44 00 00 00 00 02 00 02 00 00 ... 10 more bytes>
atem error Error: Number too big: 44 > 3
    at Object.parseNumberBetween (/Users/fhanes/projects/atem-live-controller/node_modules/.pnpm/registry.npmjs.org/atem-connection/1.3.3/node_modules/atem-connection/dist/lib/atemUtil.js:28:19)
    at MixEffectKeyFlyKeyframeGetCommand.deserialize (/Users/fhanes/projects/atem-live-controller/node_modules/.pnpm/registry.npmjs.org/atem-connection/1.3.3/node_modules/atem-connection/dist/commands/MixEffects/Key/MixEffectKeyFlyKeyframeGetCommand.js:12:41)
    at AtemSocket._parseCommand (/Users/fhanes/projects/atem-live-controller/node_modules/.pnpm/registry.npmjs.org/atem-connection/1.3.3/node_modules/atem-connection/dist/lib/atemSocket.js:159:21)

Set Flying Key Position

  • I'm submitting a ...
    [ ] bug report
    [X] feature request
    [ ] question about the decisions made in the repository
    [X] question about how to use this project

  • Summary
    I am trying to find a way to set the X/Y position and scale of a Upstream Flying Key, however I cannot find which Command to use for it.

v8/Constellation Support

I am currently working on this. Not sure if anyone else is, so I'd like to be careful about doubling up. There is some discussion in the #blackmagic Slack channel for Companion.

We can use this as an open discussion as well since I'm not going to drop a PR until I work through everything.

Currently major changes in the protocol are for SuperSource, which is to be expected since the new switcher supports two. The byte shifts are not awful and adding ssrcId = 0 as a parameter to existing calls seems ok. The main concern is that SSrc/CSSc has been split where SSrc maintains the existing structure (with ssrcId added) but all border related properties have moved to SSBd/CSBd. This would appear to break setSuperSourceProperties(..) as any calls to that for border properties would move to setSuperSourceBorder(..). Or there may be some trickery I'm not seeing to not break that.

Open question is how to handle a release for v8 since there would be an expectation that all users of downstream software need to update their switchers to v8 to maintain compatibility. For me, if it weren't for us buying a Constellation all of our switchers would remain on v7.5.2 for some time until a v8.0.x were to come out. Certainly downstream software can elect to wait for a period to add this support regardless of a release adding it. Not sure if there should be a branch for a period to allow bug fixes for v7.5.2?

WIP code is visible in this repo: https://github.com/krocheck/internal-dev/tree/master/_node_/atem-connection/src

Some recent breaking changes

  • I'm submitting a ...
    [ ] bug report
    [ ] feature request
    [ ] question about the decisions made in the repository
    [x] question about how to use this project

  • Summary

Up until yesterday I've been using a $previous version I installed from npm like 3 weeks ago. Now I use the recently published 2.1.0. There must have been some significant changes which made my simple node script fail.

I got the following problems:

  1. Major: The stateChange event gets emitted for tree item video.ME.0.programInput. I use the object-path to get the referenced tree item that returns undefined as the state tree has changed the name for ME leaf to mixEffects so the correct path would be video.mixEffects.0.programInput. My workaround is that now I replace .ME. in the emitted path string to .mixEffects. which is.. unprofessional. :)

  2. Minor: Formerly upon startup every state 'final' path node have emitted a stateChange event and using that I could fill up my macro and input variables. Now I have to use .on('connected') and fetch those values manually. Is it should be done this way from now on?

  3. stateChange now emits an array of state tree paths instead of a single path as before. Workaround is to use a .forEach() on the paths.

  • Other information (e.g. detailed explanation, stacktraces, related issues, suggestions how to fix, links for us to have context, eg. StackOverflow, personal fork, etc.)

I guess ME->mixEffects is a thing in transition. No idea about the others, pls confirm if things will go this way from now on and I'll adapt.

And as always, thank you very much for this lib. Keep up the good work! ๐Ÿ‘

Consider using `get-port` instead of Math.random

  • I'm submitting a ...
    [x] bug report
    [ ] feature request
    [ ] question about the decisions made in the repository
    [ ] question about how to use this project

  • Summary
    The _createSocket method currently relies on Math.random to choose its port (src/lib/atemSocket.ts#L130). This is not guaranteed to work, and could result in startup errors if it chooses a port already in use.

  • Other information (e.g. detailed explanation, stacktraces, related issues, suggestions how to fix, links for us to have context, eg. StackOverflow, personal fork, etc.)
    A better solution would be to use a library such as get-port. However, this would make the _createSocket method become asynchronous.

Fade to Black function missing?

  • I'm submitting a ...
    [ ] bug report
    [x ] feature request
    [ ] question about the decisions made in the repository
    [ ] question about how to use this project

Hi,

I've been playing around with atem-connection and it works perfectly on the old ATEM 2 M/E Production Switcher. But I can't find anything about FTB, I found followFadetoBlack under AudioMixerMasterCommand or is it hidden somewhere? It would be nice to be able to check if FTB is on and to enable/disable it...

Thanks in advance!

Best regards
Nicke

Socket-child can be left orphaned on parent crash

  • I'm submitting a ...
    [*] bug report

  • Summary
    I appear to have had another possible occurrence of #30. I noticed my cpu fan running pretty high and turns out I have 2 atem-connections still open and maxing out a core each.

  • Other information
    Running v0.8.0
    I had playout-gateway crash a couple of times on me earlier on today, this could have been caused by that, but the stack trace is unrelated

I found I could attach a debugger to the process (https://hackernoon.com/debugging-node-without-restarting-processes-bd5d5c98f200), and the console is being flooded with:

warning.js:18 (node:8448) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'emit' of undefined
    at log (/home/julus/Projects/tv-automation-playout-gateway/node_modules/atem-connection/dist/lib/atemSocketChild.js:80:14)
    at Object.onFailedAttempt (/home/julus/Projects/tv-automation-playout-gateway/node_modules/atem-connection/dist/lib/atemUtil.js:74:21)
    at Promise.resolve.then.then.error (/home/julus/Projects/tv-automation-playout-gateway/node_modules/p-retry/index.js:44:14)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:189:7)

warning.js:18 (node:8448) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 30132)

And a cpu profile: CPU-20181203T211452.zip
I cant think of anything else I can look at to get more info

Socket child can fail to initialize due to className mismatch

  • I'm submitting a ...
    [x] bug report
    [ ] feature request
    [ ] question about the decisions made in the repository
    [ ] question about how to use this project

  • Summary
    At src/lib/atemSocket.ts#L114, the name of the AtemSocketChild class can sometimes be a mangled/minified string, such as the single letter c.

    Later, when threadedClass@src/internalApi.ts#L296 loads the same module, it tries to find a class named c on the module export, which does not exist, because the actual class name is AtemSocketChild. This results in the following error being printed:

    INIT error {}
    
  • Other information
    This is when running on a Tessel 2 which runs Node v8.11.3, I haven't tested any other platforms or Node versions.

    I don't actually know how or where this mangling of the class name occurs, nor why.

Incompatible videoMode on AMP 8.2.3

  • I'm submitting a ...
    [x] bug report
    [ ] feature request
    [ ] question about the decisions made in the repository
    [ ] question about how to use this project

  • Summary
    I'm running a Atem Mini Pro. It is updated to 8.2.3. Its videoMode (this.state.settings.videoMode) is set to 27, while atemUtil_1.Util.getResolution only has an array of 20 elements. As a result, I am unable to upload stills.

  • Other information (e.g. detailed explanation, stacktraces, related issues, suggestions how to fix, links for us to have context, eg. StackOverflow, personal fork, etc.)
    The array in atemUtil.ts should probably be extended to fix this.

These are the modes I was able to identify with my AMP:

  • 8: 1080p23.98
  • 9: 1080p24
  • 10: 1080p25
  • 11: 1080p29.97
  • 12: 1080p50
  • 13: 1080p59.94
  • 26: 1080p30
  • 27: 1080p60

Add support for camera control

  • I'm submitting a ...
    [ ] bug report
    [x] feature request
    [ ] question about the decisions made in the repository
    [ ] question about how to use this project

  • Summary

I'm trying to dig into the Blackmagic Developer documentation and all I can see in the manual are the SDI camera control docs, however, the ATEM software now can control cameras over HDMI (BMPCC 4K, etc). I'm wondering if it is possible to add camera control support to this package.

I'll try throwing some commands at my ATEM Mini connected to a BMPCC 4K and see if I can get anything to work.

I would like the feature if possible. It would be so handy to do simple things like autofocus over a network command.

_sentQueue leaks

When we call sendCommand(...), we internally track the command in _sentQueue.
If the call to this.socket._sendCommand(...) fails, then we reject the promise, but don't remove the command from _sentQueue, and so will leak some commands.
Additionally, if the atem disconnects before a command is acked, I think we wont resolve or reject the promises remaining in _sentQueue, again leaking them and leading to unresolved promises which could cause logic errors in library consumers.

  • Other information
    This is all theoretical, none of these thoughts have been tested yet.

Updating input name doesn't update multiviewer

I'm submitting a ...
[*] bug report

Affected
Constellation in v8.0.2
TV Studio HD in v7.5.2
2ME in v8.0.2

Unaffected
Atem Mini Pro ISO v8.6.4
Atem Mini Extreme ISO v8.6.4
(It is assumed that all of the mini range are unaffected by this)

Summary
Using setInputSettings to set the longName of a source does not update the multiviewer.
Other connected clients picks up the new device name, so the set command does work successfully. But atem client is sending an encoded image with the new name, which we are not doing.

Notes
It is the same process as a stills upload, with the following differences:
storeId = 0xffff
mode (TransferMode) = 0x0201
transferIndex = sourceId
filename = 'Label'
description = ''
hash = 0x00

The image appears to be 8bit per pixel, with some unknown encoding. Viewing in greyscale looks weird, but is recognisable.
RLE encoding can be used during the upload.
For one model, the image is 640 x 190, and contains a render for each of 4k?, 1080, and 720. But this varies based on device capabilities.

WARNING
We found that sending images with a full gradient of grey would crash the ATEM, so this needs extensive testing to ensure that our implementation is safe.

Other information
Wireshark of example atem-set-source-name-does-upload.zip
Image extracted from wireshark capture: ripped-from-wireshark.zip

Rapidly (10ms) firing _retransmitTimer causes high CPU usage

  • I'm submitting a ...
    [ ] bug report
    [x] feature request
    [ ] question about the decisions made in the repository
    [ ] question about how to use this project

  • Summary

I'm running this lib in a simple script on a relatively low performance Raspberry PI and after a week of runtime I noticed that the node processes using atem-connection has high (8% average) overall CPU usage. Here is my proposal.

  • Other information (e.g. detailed explanation, stacktraces, related issues, suggestions how to fix, links for us to have context, eg. StackOverflow, personal fork, etc.)

I dug down deep and found that this timer called _retransmitTimer fires every 10 milliseconds a function called _checkForRetransmit to check if there is any packets to resend (or reconnect if stuck, etc).

Since all its logic depends on the members of the _inFlight array, I would kindly ask to enable the timer only when there are actual packets referenced in this array, and close() it once all packets are sent. This would also affect the startTimers function which creates this timer right after connecting. This way we can spare CPU time.

If busy I'm happy to create a PR later but first I'll have to get familiar with TS.

Helper function for audio input names

  • I'm submitting a ...
    [*] feature request

  • Summary

It can be quite tedious as a user of this library to give each audio input a name, as it requires knowledge of each input type and translating the ids etc.
There should be a function to generate/find the name of an input so that this doesnt have to figure out for each consuming project.

This should be based on https://github.com/bitfocus/companion-module-bmd-atem/blob/1080a0f893463638887ecb5a030996e5f006489a/src/choices.ts#L266

  • Other information (e.g. detailed explanation, stacktraces, related issues, suggestions how to fix, links for us to have context, eg. StackOverflow, personal fork, etc.)

Support for the ATEM Mini

  • I'm submitting a ...
    [ ] bug report
    [X] feature request
    [ ] question about the decisions made in the repository
    [ ] question about how to use this project

  • Summary
    Hi there - just wondering if the library does / will support the ATEM Mini?

Consider adding API for enumerating all visible Inputs in PVW and/or PGM

  • I'm submitting a ...
    [ ] bug report
    [x] feature request (I'll code it and open a PR if we think its a good idea)
    [ ] question about the decisions made in the repository
    [ ] question about how to use this project

  • Summary
    A common task is writing code which reacts to which Inputs are present in PGM and/or PVW. This is harder than it seems at first glance, because we can't simply use the previewInput/programInput property of the ME state object, because that wouldn't account for keyers and SuperSources. To figure out what Inputs are actually displaing in PVW/PGM right now, we have to loop through all keyers and SuperSources.

This is a common enough task that I think it should be provided by this library. This is my first thought at what this API would look like:

atem.on('stateChanged', state => {
    const me = state.video.getMe(0);

    // This includes the following Inputs:
    // 1. The current `programInput`
    // 2. If `programInput` is a SuperSource, then it also includes all inputs being used by that SS (recursively)
    // 3. Any inputs currently being shown as DSKs or USKs
    console.log(me.getVisibleInputs('program')); // => logs an array of numbers

    // Same as above but for PVW instead of PGM.
    console.log(me.getVisibleInputs('preview')); // => logs an array of numbers
});

I'm not completely married to this API design, and am very open to feedback and suggestions.

cc @baltedewit and @Julusian for their thoughts

Several errors from 8.0.1 version on ATEM Production Studio 4K

  • I'm submitting a ...
    [X] bug report
    [ ] feature request
    [ ] question about the decisions made in the repository
    [ ] question about how to use this project

  • Summary
    After updating the Atem to Version 8.0.1 we had several errors. A downgrade to version 7.5.2 is not working either. There are still he same errors. Seems that i has something to to with the missing DVE.

I modified the atemUtil.ts to output all errors. So there may be subsequent parsing errors.

Number too small -871665072 -1000000 1000000 (commands\MixEffects\Key\MixEffectKeyDVECommand.ts:97:20)

Number too big 1768187213 -1000000 1000000 (commands\MixEffects\Key\MixEffectKeyDVECommand.ts:98:20)

Number too big 1817190497 -332230 332230 (commands\MixEffects\Key\MixEffectKeyDVECommand.ts:99:19)

Value 101 is not a valid option in enum (DVEEffect Enum; MixEffectKeyDVECommand.ts)

Number too big 12832 0 1600 (commands\MixEffects\Key\MixEffectKeyDVECommand.ts:104:27)

Number too small -72 0 100 (commands\MixEffects\Key\MixEffectKeyDVECommand.ts:106:30)

Number too big 34305 0 1000 (commands\MixEffects\Key\MixEffectKeyDVECommand.ts:113:27)

Number too big 97 0 3 (commands\MixEffects\Key\MixEffectKeyFlyPropertiesGetCommand.ts:13:25)

Number too big 121 0 3 (commands\MixEffects\Key\MixEffectKeyFlyPropertiesGetCommand.ts:14:31)

Number too big 15 0 3 (commands\MixEffects\Key\MixEffectKeyFlyKeyframeGetCommand.ts:13:25)

Number too big 170 0 3 (commands\MixEffects\Key\MixEffectKeyFlyKeyframeGetCommand.ts:14:31)

Number too big 75 1 2 (commands\MixEffects\Key\MixEffectKeyFlyKeyframeGetCommand.ts:16:21)

Number too big 1296389120 -32768000 32768000 (commands\MixEffects\Key\MixEffectKeyFlyKeyframeGetCommand.ts:22:20)

Number too big 1869762592 -32768000 32768000 (commands\MixEffects\Key\MixEffectKeyFlyKeyframeGetCommand.ts:23:20)

Number too big 827159908 -332230 332230 (commands\MixEffects\Key\MixEffectKeyFlyKeyframeGetCommand.ts:24:19)

Number too small -28141 -9000 9000 (commands\MixEffects\Key\MixEffectKeyFlyKeyframeGetCommand.ts:42:18)

Number too big 21316 -9000 9000 (commands\MixEffects\Key\MixEffectKeyFlyKeyframeGetCommand.ts:43:21)

We have several ATEM 2 M/E Production Studio 4K devices where we can downgrade the firmware without any other issues. Then it is possible to use the Old 0.10.0 version.

  • Other information (e.g. detailed explanation, stacktraces, related issues, suggestions how to fix, links for us to have context, eg. StackOverflow, personal fork, etc.)

Do you have any current version of the protocol? The skaarhoj documentation does not support the new 8.0.1 version. With these informations i could fix the issues.

Repeated missed ping reconnections with no apparent lack of functionality

  • I'm submitting a ...
    [x] bug report?

  • Summary

version: 2.0.0-nightly-20200117-174823-3f8cfe7.0
I'm intermittently getting infinitely repeated "child missed 3 pings, exiting process!" followed by reconnection notices. All commands sent still seem to work and state updates received seem to be still be correct. I have had some unexplained things happen that could have been caused by incorrect state information, but every time I've checked, it's been correct.

Possibly related to #76

The socket process unexpectedly closed

  • I'm submitting a ...
    [x] bug report
    [ ] feature request
    [ ] question about the decisions made in the repository
    [ ] question about how to use this project

  • Summary

Child process keeps dying and spamming errors

Node v12.9.1
OS: MacOS
ATEM: 8.0.3

I get this error spammed into the console. Unfortunately no further info.

    err: {
      "type": "Error",
      "message": "The socket process unexpectedly closed (code: \"1\", signal: \"null\")",
      "stack":
          Error: The socket process unexpectedly closed (code: "1", signal: "null")
              at /Users/ronagy/GitHub/nxtedition/nxt/event/node_modules/atem-connection/dist/lib/atemSocket.js:102:36
              at processTicksAndRejections (internal/process/task_queues.js:75:11)
    }

Q: Why is a child process used here?

Unable to connect to Atem

  • I'm submitting a ...
    [x] bug report
    [ ] feature request
    [ ] question about the decisions made in the repository
    [ ] question about how to use this project

  • Summary

I am trying to use atem-connection to connect to a Atem TVS using this code:

const { Atem } = require('atem-connection');
const myAtem = new Atem({ debug: true, externalLog: console.log });
myAtem.connect('10.0.0.35');

If the mixer is off, node is logging 'reconnect' every second,
but if the mixer is on node crashes with this error:

events.js:183
throw er; // Unhandled 'error' event
^

Error: Number too small: 0 < 1
at Object.parseNumberBetween ( - - - \node_modules\atem-connection\dist\lib\atemUtil.js:23:19)
at TransitionDVECommand.deserialize ( - - - \node_modules\atem-connection\dist\commands\MixEffects\Transition\TransitionDVECommand.js:17:32)
at AtemSocket._parseCommand ( - - - \node_modules\atem-connection\dist\lib\atemSocket.js:162:21)
at AtemSocket._parseCommand ( - - - \node_modules\atem-connection\dist\lib\atemSocket.js:171:18)
at AtemSocket._parseCommand ( - - - \node_modules\atem-connection\dist\lib\atemSocket.js:171:18)
at AtemSocket._parseCommand ( - - - \node_modules\atem-connection\dist\lib\atemSocket.js:171:18)
at AtemSocket._parseCommand ( - - - \node_modules\atem-connection\dist\lib\atemSocket.js:171:18)
at AtemSocket._receivePacket ( - - - \node_modules\atem-connection\dist\lib\atemSocket.js:130:18)
at Socket._socket.on ( - - - \node_modules\atem-connection\dist\lib\atemSocket.js:110:60)
at emitTwo (events.js:126:13)

  • Other information (e.g. detailed explanation, stacktraces, related issues, suggestions how to fix, links for us to have context, eg. StackOverflow, personal fork, etc.)

Add support for ATEM Mini Pro

  • I'm submitting a ...

    • bug report
    • feature request
    • question about the decisions made in the repository
    • question about how to use this project
  • Summary
    I'm using my ATEM Mini Pro with my Bitfocus Companion that uses this project.

If it's possible to control the new functionality would be nice, but at least controlling the Pro like the ATEM Mini would be a great start.

Upload speed improvements

Currently the media uploading in this library is significantly slower than the atem software. There appear to be a couple of factors that could be improved in the library in that regard.

Max packets per tick constant

The amount of packets sent per tick are limited by this constant https://github.com/nrkno/tv-automation-atem-connection/blob/master/src/dataTransfer/index.ts#L10

Doing some testing under node 8 with the strict-config branch reveals that setting this property to 40 can reduce upload speeds from ~1800ms to ~1400ms. Setting it higher (80) gives little benefit and setting it too high (160) gave many packet resends. Possibly this value should not be constant but instead be variable based on how many packets are resent.

Multithreading overhead

Disabling multi threading in the strict-config branch gives me another 300-400ms benefit. Combining this with the aforementioned max packets constant optimization I can reach sub second transfers, which is an almost 2x improvement

RLE encoding

The atem software applies RLE encoding as an optimization. I don't know how much faster that would make our transfers but it would optimize things where a lot of black is included such as lower thirds and logo bugs.

AudioMixerInput/-Master not working

  • I'm submitting a ...
    [x?] bug report
    [ ] feature request
    [x] question about the decisions made in the repository
    [ ] question about how to use this project

  • Summary
    Im playing around with an ATEM Mini (Firmware: 8.2.3). Both AudioMixerInput- and AudioMixerMasterCommand do not work as expected (i.e. nothing noticably changes, ATEM does not send any response).
    I've been playing around with the CFSP command to send audio options successfully and FASP command to receive them successfully as well. One thing I stumbled upon is the AudioMixOption-enum which maps off to 0, on to 1 and afv to 2.
    As far as I was able to reverse-engineer said commands I found that off equals 1, on equals 2 and afv equals 4.

Does the API use different mappings for the same keys, are AudioMixerInputCommands restricted to other ATEM devices or are the existing commands deprecated?

Connection logic acking problems

  • I'm submitting a ...
    [*] bug report

  • Summary

https://github.com/nrkno/tv-automation-atem-connection/blob/fd3d045f8c2fcfb4ba4e12179ac50b3305f242b6/src/lib/atemSocketChild.ts#L157-L160
This acking strategy is dodgey. When you ack a packet, you are also acking any previous packets, meaning that if we dont get #101, but send an ack for #102, the atem thinks we received #101.
Something worth noting is that the atem appears to send acks on a timer instead of immediately, sending an ack for at most 16 packets at a time, with a max delay of a few ms. This could be good to do as a later perf improvement, as it will reduce the number of packets we need to send when receving a lot at once.
Depending on how the atem handles acks internally, it could also cause some confusion if we ack #102 then #101, as it is possible it could resend #102, although I am not sure if that happens or would be a problem for us.

The strategy I am using is to track the last packet, and if the received id is not the next number, then I discard it (knowing that id will be retransmitted) and I will batch the acking by the same rules as the atem uses.

https://github.com/nrkno/tv-automation-atem-connection/blob/fd3d045f8c2fcfb4ba4e12179ac50b3305f242b6/src/lib/atemSocketChild.ts#L192-L214

This retransmit strategy doesnt appear to work. (this looks to be new in feature/upload and 0.6.0 looks fine, so probably just needs a revert)
As far as I am aware, if the atem doesn't ack a packet, then it needs to be retransmitted with the same id (along with anything sent after it?). If the sequence it receives skips a number it will wait for that missing one to be received before continuing.
Julusian@c8caeaa
A crude example for simulating a packet drop by making the sending code skip an id. It gets stuck trying to resend the last command, until it times out. And the command is never processed by the atem.

inputMixOption does not work on the atem mini

  • I'm submitting a ...

[x ] bug report
[ ] feature request
[ ] question about the decisions made in the repository
[x ] question about how to use this project

  • Summary
    Good morning,
    Despite several tests, we are unable to change the inputMixOption to a mini atem.

Sorry for my english, i'm french

  • Other information (e.g. detailed explanation, stacktraces, related issues, suggestions how to fix, links for us to have context, eg. StackOverflow, personal fork, etc.)**

Here is our code used:

const Atem = require('atem-connection')
const myAtem = new Atem()
myAtem.on('info', console.log)
myAtem.on('error', console.error)

myAtem.connect('192.168.1.116')

myAtem.on('connected', () => {
myAtem.changeProgramInput(2).then(() => {
// Fired once the atem has acknowledged the command
// Note: the state likely hasnt updated yet, but will follow shortly
console.log('Program input set')

})
myAtem.setAudioMixerInputMixOption(1, 2).then(() => {
    console.log('test')
})

})

incorrect parsing of ATEM data

  • I'm submitting a ...
    [X] bug report
    [ ] feature request
    [ ] question about the decisions made in the repository
    [ ] question about how to use this project

  • Summary
    Some strange data sent from my ATEM Television Studio causes the state to go bananas.

  • Other information
    Among others, this data is sent into MixEffectKeyFlyPropertiesGetCommand.deserialize():
    Buffer(0x509be28400000000)
    this creates
    this.mixEffect = 80
    which in turn when calling state.video.getMe(this.mixEffect)
    creates ME[80], effectively making ME into a sparse array, causing problems further down the line

I'm appending a wireshark trace, there are some other trange data in there as well, causing the state.video.ME[] to become [ [Object], <72 empty items>, [Object], <6 empty items>, [Object], <26 empty items>, [Object] ]
on the indexes [ '0', '73', '80', '107' ]

Missing destroy/close functionality

  • I'm submitting a ...
    [X] bug report
    [ ] feature request
    [ ] question about the decisions made in the repository
    [ ] question about how to use this project

  • Summary
    There is no way of stopping the module from retrying connections. So if you want to remove the connection, or disconnect. It will continue to try to reconnect, even after removing the reference to the module.

AUX Problems on 2M/E

  • I'm submitting a ...
    [X] bug report

  • Summary

We seem to have problems controlling more than 3 aux outputs. I do not have access to an atem with more than 3 auxes myself, but several users has reported that 4,5,6 does not work.

I am just using setAuxSource with auxbus 0-5. Are the indexes non-linear?

Multiview weirdness

  • I'm submitting a ...
    [ ] bug report
    [ ] feature request
    [ ] question about the decisions made in the repository
    [*] question about how to use this project

  • Summary
    I'm changing an input's longName with myAtem.setInputSettings({longName: 'hey'}, 2)
    This is functional, but does not propagate to the multiview labels. How is that meant to be done?

ATEM Firmware 8.0.3 Support

  • I'm submitting a ...
    [x] bug report
    [ ] feature request
    [ ] question about the decisions made in the repository
    [ ] question about how to use this project

  • Summary

ATEM: ATEM 4 M/E Broadcast studio 4
ATEM FIRMWARE: 8.0.3

There are a log of reconnect logging and all commands throw error

How far along is 8.0.x firmware support?

Timers are not always stopped on disconnect()

https://github.com/nrkno/tv-automation-atem-connection/blob/f35250d6eb46287d3295c27a772b4a8c17c09181/src/lib/atemSocketChild.ts#L74

(In disconnect) The timers should be stopped even if the connection has not been established. The clearing of timers should be moved to above the "if (this._connectionState === ConnectionState.Established)" check. ( or in the else if you want :P )

If I run disconnect() on the instance that has not connected, because I am going to delete the instance, there will be freerunning timers that I have no way to stop.

Refactor DataTransfers

  • Summary
    During #60 all of the connection logic got reviewed, tested and refactored.
    This has not yet been done for DataTransfers, so this code could be a bit questionable and has a bunch of TODOs for things to check/test/improve

Tasks:

  • More unit tests
  • Review the logic flow in DataLock and the transfer types. Some bits look a bit broken/unused
  • Handle failed commands data transfers better
  • Handle waiting for lock in data transfers better

Provide option to raise socket child freezeLimit

  • I'm submitting a ...
    [ ] bug report
    [x] feature request
    [ ] question about the decisions made in the repository
    [ ] question about how to use this project

  • Summary
    On low-powered devices such as the Tessel 2, the default freezeLimit of 200ms is too aggressive, and causes the startup sequence to fail.

  • Other information (e.g. detailed explanation, stacktraces, related issues, suggestions how to fix, links for us to have context, eg. StackOverflow, personal fork, etc.)
    It seems to take about 15 seconds to complete the initial socket creation and handshakes, but after that it is fine and seems to run relatively normally. That itself might be indicative of a bug.

unhandled error event at first connection

  • I'm submitting a ...
    [X ] bug report
    [ ] feature request
    [ ] question about the decisions made in the repository
    [ ] question about how to use this project

Trying to connect to the Atem Television Studio (the older one, not the HD version) but I get this error trown. Tried with different firmware on the TVS (Atem Software Control V7.5.2 and V8.1) both with the same result.

.....
video.ME.0.programInput
video.ME.0.previewInput
video.ME.0.transitionProperties
video.ME.0.transitionPreview
video.ME.0.transition
video.ME.0.transitionSettings.mix
video.ME.0.transitionSettings.dip
video.ME.0.transitionSettings.wipe
events.js:183
throw er; // Unhandled 'error' event
^

Error: Number too small: 0 < 1
at Object.parseNumberBetween (/volume1/NodeJS/testatem/node_modules/atem-connection/dist/lib/atemUtil.js:30:19)
at TransitionDVEUpdateCommand.deserialize (/volume1/NodeJS/testatem/node_modules/atem-connection/dist/commands/MixEffects/Transition/TransitionDVECommand.js:56:32)
at AtemSocket._parseCommand (/volume1/NodeJS/testatem/node_modules/atem-connection/dist/lib/atemSocket.js:159:21)
at AtemSocket._parseCommand (/volume1/NodeJS/testatem/node_modules/atem-connection/dist/lib/atemSocket.js:172:18)
at AtemSocket._parseCommand (/volume1/NodeJS/testatem/node_modules/atem-connection/dist/lib/atemSocket.js:172:18)
at AtemSocket._parseCommand (/volume1/NodeJS/testatem/node_modules/atem-connection/dist/lib/atemSocket.js:172:18)
at AtemSocket._parseCommand (/volume1/NodeJS/testatem/node_modules/atem-connection/dist/lib/atemSocket.js:172:18)
at AtemSocket._parseCommand (/volume1/NodeJS/testatem/node_modules/atem-connection/dist/lib/atemSocket.js:172:18)
at AtemSocket._parseCommand (/volume1/NodeJS/testatem/node_modules/atem-connection/dist/lib/atemSocket.js:172:18)
at AtemSocket._receiveSubprocessMessage (/volume1/NodeJS/testatem/node_modules/atem-connection/dist/lib/atemSocket.js:142:22)

listVisibleInputs crash when supersource active during connection

Hi,

When you start a connection with an atem which have a supersource active and immediatly do a listVisibleInputs, Supersources Objects are not populated and the function listVisibleInput do crash

TypeError: Cannot read property 'artFillSource' of undefined
         at Object.listVisibleInputs (atem-connection/dist/lib/tally.js:42:48)

Steps to reproduce :

Put Supersource in ME1

atemclient.on('stateChanged', function(err, state) {
	console.log(atemclient.listVisibleInputs("program"))
});

Establish a connection with the atem.

Suggestion :
Check if supersource is populated during listVisibleInputs

atem-connection/dist/lib/tally.js at line 36, ssrc can return :
SuperSource { boxes: {}, index: 0 }

We need to check the existence of ssrc.properties before moving on.

Thank you very much !

listVisibleInputs, fail when supersource nested with MEs

Hi,

listVisibleInputs is not working properly when MEs and supersource are nested.

For example :

You have SuperSource on your ME1
You have Input 1 on your ME2
In Box1 of your supersource, you have ME2

listVisibleInputs does not return input1, but it should.

Thank you very much !

Why does pathToChange in stateChaged not correspond to object?

  • I'm submitting a ...
    [ ] bug report
    [ ] feature request
    [ x] question about the decisions made in the repository
    [x ] question about how to use this project

  • Summary

When the state changed event is fired, the pathtoChanged array does not contain valid paths into the object. Should you not be able to do state[pathToChanged] to get the value of what has changed?

Why is it video.ME.0.programInput?

Is there a function that will translate the path into the actual value / object that was changed?

  • Other information (e.g. detailed explanation, stacktraces, related issues, suggestions how to fix, links for us to have context, eg. StackOverflow, personal fork, etc.)

UnhandledPromiseRejectionWarning: #<ProgramInputCommand>

I'm submitting a ...
[ ] bug report
[ ] feature request
[ ] question about the decisions made in the repository
[x] question about how to use this project

First of all, thanks for a great library!

I've started receiving the following console error when attempting to use the 'changeProgramInput' command:

(node:16276) UnhandledPromiseRejectionWarning: #<ProgramInputCommand>
(node:16276) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:16276) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

My code follows:

myAtem = new Atem();

myAtem.on('connected', () => {
    myAtem.changeProgramInput(2);
});

myAtem.connect(IP_ADDRESS);

If I add a catch:

myAtem = new Atem();

myAtem.on('connected', () => {
    myAtem.changeProgramInput(2)
        .catch((resp) => {
            console.log(resp);
        });
});

myAtem.connect(IP_ADDRESS);

I get this in the console:

ProgramInputCommand {
  flag: 0,
  rawName: 'CPgI',
  mixEffect: 0,
  properties: { source: 2 },
  resolve: [Function],
  reject: [Function] }

Here's the full console debug:

PAYLOAD <Buffer 00 0c 00 00 43 50 67 49 00 00 00 02>
RESEND:  { packetId: 2,
  trackingId: 2,
  lastSent: 1573457567109,
  packet:
   <Buffer 08 18 80 1a 00 00 00 00 00 00 00 02 00 0c 00 00 43 50 67 49 00 00 00 02>,
  resent: 1 }
RESEND:  { packetId: 2,
  trackingId: 2,
  lastSent: 1573457567140,
  packet:
   <Buffer 08 18 80 1a 00 00 00 00 00 00 00 02 00 0c 00 00 43 50 67 49 00 00 00 02>,
  resent: 2 }
RESEND:  { packetId: 2,
  trackingId: 2,
  lastSent: 1573457567171,
  packet:
   <Buffer 08 18 80 1a 00 00 00 00 00 00 00 02 00 0c 00 00 43 50 67 49 00 00 00 02>,
  resent: 3 }
RESEND:  { packetId: 2,
  trackingId: 2,
  lastSent: 1573457567203,
  packet:
   <Buffer 08 18 80 1a 00 00 00 00 00 00 00 02 00 0c 00 00 43 50 67 49 00 00 00 02>,
  resent: 4 }
RESEND:  { packetId: 2,
  trackingId: 2,
  lastSent: 1573457567234,
  packet:
   <Buffer 08 18 80 1a 00 00 00 00 00 00 00 02 00 0c 00 00 43 50 67 49 00 00 00 02>,
  resent: 5 }
RESEND:  { packetId: 2,
  trackingId: 2,
  lastSent: 1573457567266,
  packet:
   <Buffer 08 18 80 1a 00 00 00 00 00 00 00 02 00 0c 00 00 43 50 67 49 00 00 00 02>,
  resent: 6 }
TIMED OUT:  <Buffer 08 18 80 1a 00 00 00 00 00 00 00 02 00 0c 00 00 43 50 67 49 00 00 00 02>

All of that said, the actual command works fine, since I can see the input sources being changed as expected. I know I can just add an empty catch, but I'm not sure why there's a reject in the first place? If you need any other info, please let me know and I'll add to the thread.

Thanks!

Other information

  • atem-connection version is 1.1.0
  • Device is an Atem TV Studio HD running 8.0.3

How to reconnect automatically

  • I'm submitting a ...
    [ ] bug report
    [ ] feature request
    [ ] question about the decisions made in the repository
    [X] question about how to use this project

  • Summary

I am writing an automation using this library, and need a way to automatically reconnect. There might be a case where there happens one of the following:

  • Server is started before ATEM
  • ATEM is rebooted
  • ATEM or server looses Network Connection

I need to make sure that the connection is automatically established (not only on server start). What would be the best pattern to do this?

Read audio signal levels

  • I'm submitting a ...
    [ ] bug report
    [ ] feature request
    [ ] question about the decisions made in the repository
    [ X] question about how to use this project

  • Summary
    I want to listen to the Atem so i can get the current level of an audio input.

  • Other information (e.g. detailed explanation, stacktraces, related issues, suggestions how to fix, links for us to have context, eg. StackOverflow, personal fork, etc.)

(2.0) Connected event emitted constantly

After reconnecting, the connected event can sometimes be emitted at least once a second

  • Other information (e.g. detailed explanation, stacktraces, related issues, suggestions how to fix, links for us to have context, eg. StackOverflow, personal fork, etc.)

Socket-child can be left orphaned on parent crash

  • I'm submitting a ...
    bug report

  • Summary
    Attempt 3 #30 #40

Companion crashed a bunch of times at startup due to mismatch in natives api version.
I think a bunch of these aren't from crashes, but are from running via nodemon. Every time it restarts another child gets added

image

unexpected states when parsing information for tally lights

  • I'm submitting a ...
    [ ] bug report
    [ ] feature request
    [ ] question about the decisions made in the repository
    [x] question about how to use this project

  • Summary
    I am building a dmx tally light solution for atem switchers. When I just cut between two cameras there is one state transmitted which has previous preview as program so preview and program are identical for one state. This results in the previous program tally switching off before switching to green again. (flickering)
    In this example I am only showing camera 1 tally information to make it easier to understand:
    image

Is there any way to catch this case or directly extract tally light information for example for one input with the atem-connection library?

Thank you all in advance for your help and this awesome open source library!
Kind regards
@lukas-runge

  • Other information
    To get the Tally light information I am parsing the state object to extract tally information out of it. (using listVisibleInputs() on the switcher object) and some ways to prevent weird states messing up my readout.

Here is my current code ๐Ÿ”ฝ
parseForTally
image created with Polacode for Visual Studio Code

copy/paste code
this.switcher.on('stateChanged', (state: any) => {
    // State does not always contain ME video data; Return if necessary data is missing.
    if(!state || !state.video || !state.video.ME || !state.video.ME[0])
        return;
    
    // There is some weird state change after a transition that I am able to catch with my glitch variable here
    if (state.video.ME[0].inTransition) {
        state.video.ME[0].transitionPosition == 0 || state.video.ME[0].transitionPosition == 10000 ? glitch = true : null;
    } else {
        glitch = false;
    }
    
    // checking out current preview and program information
    let new_preview = this.switcher.listVisibleInputs("preview", 0)
    let new_program = this.switcher.listVisibleInputs("program", 0)

    // comparing to old preview information, updating if changed
    if (_.isEqual(this.preview, new_preview) == false && glitch == false) {
        console.log(`PREVIEW: ${new_preview}`)
        this.preview = new_preview
        update_now = true
    }

    // comparing to old program information, updating if changed
    if (_.isEqual(this.program, new_program) == false && glitch == false) {
        console.log(`PROGRAM: ${new_program}`)
        this.program = new_program
        update_now = true
    }

    // notifing tallys ("Inputs") if there are changes
    if (update_now == true) {
        this.notifyInputs();
        update_now = false
    } 
});

preview / program tally info during transitions

  • I'm submitting a ...
    [ ] bug report
    [ ] feature request
    [ ] question about the decisions made in the repository
    [x] question about how to use this project

  • Summary
    I am trying to get the real tally info of this module, but could not find the right info so far.
    During transitions the tally info is showing a red indication on the Preview button (in Atem Software Control).
    I am using state.video.ME[0].programInput and state.video.ME[0].previewInput to get program and preview state. But during transition these values do not represent the right info.
    Below the info I have logged (timestamp in front)
    Immediatly after sending the AutoTransition action I got an event that repeats the previewInput state. To me it seems this is wrong, but maybe I am missing some details here.

1586875643417 state.video.ME[0].programInput= 2
1586875643419 state.video.ME[0].previewInput= 1
1586875652282 KeyPress= AUTO/CUT
1586875652322 state.video.ME[0].previewInput= 1
--- transitions is happening here ---
1586875654302 state.video.ME[0].programInput= 1
1586875654303 state.video.ME[0].previewInput= 2

  • Other information (e.g. detailed explanation, stacktraces, related issues, suggestions how to fix, links for us to have context, eg. StackOverflow, personal fork, etc.)

Socket-child can be left orphaned on parent crash

  • I'm submitting a ...
    [*] bug report

  • Summary
    I noticed today that I had a few socket-child processes running on my system with no node processes running that would be utilising an atem-connection.
    image
    I have tried to reproduce this and have managed to do so if the parent application crashes with an unhandled exception, but there could be other ways of achieving the same result.

I'm not sure how the memory usage got so high. I suspect that they have been running for a few days and have a huge number of commands to send to the parent buffered.

MSRc Macro Start Recording

  • I'm submitting a ...
    [ ] bug report
    [x] feature request
    [ ] question about the decisions made in the repository
    [ ] question about how to use this project

  • Summary
    Please implement command for Macro Start Recording

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.