Adjusting a Composite's colour no longer freezes it until the source is restarted.
Pressing Start on a Blackmagic source finds a card connected after the Show opened, such as an enclosure switched on late. It used to need Refresh Devices in the external output's settings.
The last thousands separators are gone. On a Mac set to a language that groups digits, a handful of labels still did: a source's delay range read "0–2 000 ms", the recording's canvas "1 920 × 1 080", and the stream's "sending 4 500" warning, as did dropped frames, data-source row counts, replay clip counts, audio device channels and the loudness and plug-in scan progress. They now read the same on every Mac.
Typing into a field no longer changes things as you type. Every field that sets something live — bitrates, names, durations, overlay text, a source's gain, position and crop, and the rest — now applies what you typed when you press Return or move to another field, and Escape puts the old value back. Before, each keystroke went live, and a half-typed number could be rejected and replaced while you were still typing it: deleting the first digits of a 5000 kbit/s bitrate to type 4500 snapped the field to its minimum. Fields with an Apply button apply only when Apply is pressed. Numbers you edit no longer show a thousands separator.
A rare crash when an audio device changed while an audio input or output was being torn down. Removing the device-change listener did not wait for a notification already being handled, and the state that notification reads was freed straight afterwards. Each listener now keeps that state alive for as long as it needs it.
Loudness matching applies from the first second. A media source set to match loudness played at its file's own level after opening a Show — or after being restarted — until a fader was moved, and only then jumped to the level it should have had. It now starts at the matched level. A file InterDirector has never measured still plays at its own level until its measurement finishes, as before.
The crash that took the Mini down hours into long runs. InterDirector checked for Blackmagic output hardware every ten seconds — even on a Show not using SDI output — and the source settings windows checked every time they were drawn. Each check made Blackmagic's driver open and close a connection to every connector, and every so often the system lost track of one being torn down and the application crashed, with nothing to show for it. Found by watching it happen with a debugger rather than by guessing. Devices are now read once and kept; a Refresh Devices button reads them again after you connect a card, which means a card plugged in while InterDirector is running appears when you press it rather than on its own.
A plug-in that crashes internally is switched off rather than restarted. An effect that failed was put back to work at the next reset whatever had gone wrong with it — including when it had crashed inside itself, which is the one case where nothing is known about the state it left behind. It is now switched off for the rest of the session, the card says which effect went, and removing and re-adding it, or reopening the Show, builds a fresh one. An effect that merely refused a moment of audio still comes back by itself, as before.
One bad source can no longer silence the whole mix. A source producing an impossibly large value overflowed the mix it joined, and the safeguard downstream could not tell the overflow from the healthy audio beside it, so it silenced both. Each source's contribution is now held to something a mix can hold before it is summed, so a source that goes wrong takes only itself down. Ordinary loud mixes are untouched — this is not a limiter.
Quitting waits for the stream to actually finish leaving. Stopping a stream reported itself done the moment it had asked its destinations to close, not when they had — and pressing Stop removed the stream from the list of things the application waits for before quitting. Quit in that gap and the sockets were still open when the process went. Both now hold until the destinations have really closed, with a two-second limit so a destination that will not close cannot hold the application open.
A data source refuses a runaway feed before it costs anything. The limits on how large a feed may be were checked after the expensive part had already happened: one enormous row was expanded in full before being told it was too big, a file that was nothing but a giant header row met no limit at all, and a local file was measured and then read by a separate call that ignored the measurement. All three are now bounded as the work happens, so an unreasonable feed is stopped rather than absorbed and then rejected.
A Blackmagic connector opens on the format it is actually receiving. The card reports the signal reaching it as capture opens, and that report was arriving fractionally before the connector considered itself started — so it was thrown away, and the connector stayed opened as 1080p50 until some later format change came along. With a camera that never changes format, none ever did. A 1080p30 source could therefore run the whole show on the wrong timing. It is now acted on whenever it arrives.
Changing your Mac's output device is noticed. With the audio output set to follow the system default, picking a different output in Sound Settings — or plugging in headphones — left the mix going to the device you had just stopped listening to. Nothing was watching for it: the set of devices had not changed, only which one the machine was using. It follows now, as it always said it would.
Removing an effect can no longer take the show down with it. Shutting a VST3 plug-in down means calling into somebody else's code, and that happened inside a destructor — the one place a fault cannot be caught, because an exception reaching a destructor ends the process outright instead of being handled. So a plug-in that misbehaved while being removed or replaced took the stream, the recording, the external picture and every healthy source with it. Shutting one down is now done somewhere the fault can be contained, and a plug-in that misbehaves on its way out is simply set aside and never used again for the rest of the session. Opening and closing a plug-in's own window is protected the same way.
Stopping a stream now finishes before it says it has. Stopping cancelled the timer and immediately flushed the encoder, which could overlap work still in progress — and an edit made a moment earlier could still open a connection after the stream had been declared stopped. Teardown now waits for the work in flight, and anything that arrives after a stop is ignored.
A copied source's effects actually run. Copying an input carried its effect chain into the Show but never built the plug-ins behind it, so the copy passed audio through dry and its effect editors reported the plug-in as unavailable. Copying is the only way to make an input that already has a chain — a new one starts empty — which is why this only ever showed up on a copy. The graph is now rebuilt when a copy is made, and handed to the mixer if audio is running.
Replay captures triggered by automation are bounded. The limit on how many clips could be written at once was enforced by the panel's button, so a rule firing on a burst of events started a capture for every one of them — each holding its own copy of the audio and its own writer while the show carried on. Three at a time now, whoever asks; beyond that a capture is refused and says so.
Your audio device comes back on its own after a failed reconnection. If reconnecting to the output device failed once — the device busy for a moment, say — nothing ever tried again, and the monitoring stayed silent until the engine was restarted, even though the stream, the recording and NDI carried on. It now keeps trying until the device is usable, and tells you once rather than every half second.
Plugging in an unrelated device no longer interrupts your audio. Any microphone or capture device appearing or disappearing used to silence the output until the application had checked that your chosen device was still there — a nominal half-second, longer when the interface was busy, for an event with nothing to do with audio output. It now checks whether the change could have affected your device before silencing anything, so it usually does not.
Fixed a crash when opening a Blackmagic source's settings. Asking whether Blackmagic hardware was present opened a fresh connection to the Desktop Video driver and closed it again, every single time — and closing the last one could pull the ground out from under the driver's own notifications, taking the application with it. This is the crash that had twice appeared during shows with nothing to explain it. One connection is now kept open for as long as the application runs.
Data feeds keep watching a file that is replaced or deleted. A file watched for changes was followed by name, so an editor that saves by writing a new file and renaming it over the old one left the watcher holding something nobody would ever write to again. The containing folder is watched as well now, which also means a file that does not exist yet is picked up when it appears.
A switch for logging what the audio is costing. Under Developer Controls: it writes how many cores' worth of work the desk is doing, how much of that is plug-ins, and the busiest single source — which is the number that predicts a dropout, since sources are processed in parallel now. Useful for deciding whether a Show's effects fit the machine. Off by default, because a line every ten seconds per source is noise during a show; the timing itself is always measured and costs nothing worth counting.
Effects on Master, Bus A and Bus B run at the same time. They are three independent chains and were processed one after another, so a Show using all three paid the sum of them. A Show with effects on only one — which is most — is unaffected and pays nothing for the change.
Audio threads now tell the system they share one deadline. Spreading the work across threads is only half of it: without this the system knows several threads are important but not that they are cooperating on the same moment, which is worst exactly when another application is competing for the machine. Every source's thread and the thread that mixes now join the audio device's own real-time group.
Microphone chains now run on separate cores instead of queueing behind each other. Every source's plug-in chain used to run on the one thread that also mixes and renders, so the whole desk's processing capacity was a single core however many the machine had. Measured against a real vocal chain, one microphone was using 44% of that core — two were at the edge, three saturated, and five were simply impossible, which is why a second machine running a DAW has been in the signal path. Each source now processes on its own thread. A chain that stalls costs its own microphone rather than silencing the desk.
A data source that returns far more than expected is refused instead of loaded. A CSV or JSON feed was read and expanded with no limit anywhere, so an endpoint answering with fifty thousand rows turned into a million values and a hundred megabytes inside the running application. Feeds are now bounded — 8 MB, 10,000 rows, 100,000 values, all far above any real scoreboard or start list — and one that exceeds a limit keeps the rows it already had and tells you why, rather than emptying itself. A file that is saved repeatedly, or a feed polled faster than it answers, no longer stacks up overlapping loads: one runs, one is remembered, and a superseded load now actually stops instead of finishing work nobody wanted.
Quitting no longer crashes when certain plug-ins are loaded. Some plug-in vendors crash inside their own shutdown code after the application has already closed everything down — nothing of yours is lost, but it produces a crash report every time you quit. There was already a workaround for one vendor; it is now applied to every plug-in, because the problem is third-party code with global state rather than any particular brand of it.
An NDI source that stops sending picture but keeps sending sound is now reported. This was invisible: the sound kept the source looking alive, so it never tried to reconnect, and its last frame simply stayed on Program looking like a camera that was working. The log now says which source has gone quiet and for how long. Audio-only NDI senders are unaffected — they are never accused of losing a picture they never had.
A stream that has stopped sending picture or sound now says so. The streaming status only ever noticed an encoder rejecting something. If the picture simply stopped arriving, or the audio encoder failed over and over, nothing was rejected and nothing was counted — and because either one alone keeps a destination connected, the stream stayed green while viewers had a frozen picture or silence. Both are now watched by the clock as well: several seconds with nothing encoded reads as strained, and the wording says whether the encoder is failing or nothing is reaching it, because those are different problems.
Stopping or re-plugging a Blackmagic input is safe while it is running. Stopping a connector cleared the handlers the card's own thread was reading at that moment, and a detected format change ran its restart from that same thread with nothing keeping it clear of a stop — either could corrupt memory and take the whole application down, from something as ordinary as removing a source. Start, stop and format restarts now happen one at a time, a restart that arrives after a stop does nothing, and a connector is quiet before its handlers are let go. A format restart that fails is also reported instead of leaving the input looking healthy with a frozen picture.
An image transition's picture can no longer change underneath the frame that was accepted. The same fault as the Composite one below, and the same fix seen from the other side: transitions are mixed by a GPU kernel that needs somewhere of its own to write, so that stays as working space and what gets published is a copy nobody else can rewrite.
A Composite's picture can no longer change underneath the frame that was accepted. A Composite published its rendered frames from a fixed set of four, reusing each one four frames later whether or not something was still reading it — so a reader held up by a busy moment could find the picture it had accepted replaced by a newer one, on air. Each frame now gets its own surface, handed back only when everything has finished with it, and if a Composite's readers have not let go it drops its own frame and says so rather than overwriting one in use. Image transitions still work the old way; that is a separate change with its own check.
A destination added at the moment streaming starts is no longer silently left out. Adding or removing a destination in the first instant of a broadcast could land between two steps of the encoder announcing itself, and the new destination would then sit there unopened until something else changed the configuration. It now opens exactly once whichever way the two land.
One stalled output can no longer freeze the picture on all the others. Every output is handed the same Program frame, and that frame only returns to the shared supply once everyone has finished with it. An output running at canvas size used to skip its own copy and pass that shared frame straight to its encoder, which holds it for as long as it likes — so one slow encoder could drain the supply and leave the stream, the recording, the external display, NDI and your own Program monitor all without a fresh picture. Outputs now always copy into their own buffer first, so an encoder that falls behind stalls only itself. The shared supply is also sized from how many outputs are actually attached rather than a fixed number chosen when there were fewer of them — with a stream, a recording, NDI, an external display, a monitor and replay all running, the old fixed size could be exceeded before any encoder held anything at all.
Camera and NDI delivery is no longer the lowest-priority work in the application. The threads every NDI and every camera frame arrives on told the scheduler nothing about themselves, which on Apple Silicon means they could be put on the efficiency cores while less important work ran on the fast ones. They now declare what they are. This should matter most when the machine is busy with something else.
Source clock correction actually runs now. Every camera, card and NDI sender has its own crystal, and none of them is at exactly 48 kHz — one measured on a real show was 73 parts per million slow, which is a quarter of a second an hour in one direction. Correcting that continuously is inaudible; letting it build until the timeline has to be yanked back is not, and that is what was happening: the correction was measuring a timeline the application had itself constructed at the nominal rate, so it always concluded the sender was perfect and never corrected anything. It now measures against this machine's own clock, and the corrected block length and the position it is placed at are decided together, so they cannot disagree. Long shows should drift less and re-anchor less.
Unplugging your speakers no longer takes the audio off the broadcast. When the output device changed or came back under a new identity, the whole mixer was rebuilt — and the mixer is what feeds the stream, the recording, replay and every NDI send, none of which have anything to do with the interface you monitor on. All of them lost their audio while the hardware was rebuilt, and if that rebuild failed they stayed silent indefinitely. Only the hardware is replaced now. The mix, its plug-ins and their state are left running, so a change of speaker no longer rebuilds your effect chain, and if the device cannot be opened the broadcast keeps its audio while the application waits for the device to come back. This matches the report of the stream losing its sound while the physical outputs kept playing. Needs a hardware test before it can be called confirmed.
A slow video encoder can no longer stop the stream's audio. The stream worker drained video until the queue was empty, and Program refills that queue from another thread as fast as it drains — so an encoder that could not keep up held the worker inside video for ever, and nothing else it does ever ran again: not audio, not the bitrate adjustment, not adding a destination, not stopping. This matches the shape of the stream that kept publishing while losing its sound. Each turn now takes only the frames that were waiting when it began, and audio is encoded between video frames rather than after all of them, so the longest a viewer can go without audio is one frame's encode. If the encoder cannot keep up, the picture sheds frames and stays current, which it already did. The recording drains the same way and had the same fault, so it is fixed with it.
A misbehaving plug-in reports a failure instead of ending the show. A VST3 effect that threw from its processing, its reset or while its state was being saved ended the application outright, because that kind of failure cannot be caught by the code that called it. The calls a running show makes are now guarded the way the plug-in scan already was: the effect is marked failed and bypassed, the rest of the chain carries on, and the log names what the plug-in was doing. An effect that keeps failing stays bypassed rather than being reset behind your back.
A corrupt media file can no longer end the application. A decoder reading a damaged header can report a playback time billions of years long. That number is finite, which was the only thing checked, and converting it to a deadline ended the application outright — taking the stream, the recording, the external picture and every healthy source with it. Timestamps that cannot be placed on the clock, and ones so distant that waiting for them would be indistinguishable from hanging, are now skipped: one frame of an already broken file is lost and the show carries on. The same checked conversion is used by replay and by the stream's own timestamps.
A source declaring a nonsense sample rate is refused instead of believed. The rate a source announces was taken at face value and used to reserve storage before anything could reject it, so a network source claiming a rate of 1 Hz could ask for a gigabyte and a half from a packet carrying a single sample — on the queue every other source and the mix wait on. Rates outside 8 kHz to 384 kHz are now refused where they arrive, as is a source more than six times below the Show's own rate, which is more than the mix timeline is built to hold. Ordinary content is unaffected, including older 22.05 kHz media. A Show file's own sample rate is bounded the same way.
A single bad sample can no longer silence a mix or end the show. Audio that is not a number — a NaN or an infinity, which a sender, a driver or a plug-in can produce — used to spread rather than stay put: added into a mix it took every healthy source in that mix silent with it, and no later stage could undo it. Sent to an SDI card it was worse, because converting it for the card ended the application outright and took the stream, the recording and the external picture with it. Such samples are now replaced with silence where they arrive, again after a source's own effects, and again after the mix effects, and the log names the inputs involved. Not yet exercised on a real show: nothing in production is known to have produced one.
The credits roll costs a fraction of what it did. A long roll was being re-photographed twice a second — a picture that cannot change, at eight times the size of the canvas — which took about twenty points of CPU on a Mac mini and put a regular hitch into Program, visible in recordings. A scrolling overlay is now photographed when it loads, when its text changes, and at no other time. Editing the credits still updates the picture straight away.
A Web input showing video plays at full rate again. A page whose motion was a background video — rather than something moving in the page itself — was photographed only about ten times a second, and jumped back to normal for as long as any animation on the page happened to run. Web inputs are now photographed on the frame rate set on the input, whatever the page is doing, and that setting is the lever if one costs more than you want to give it. The saving it used to share with Overlays now applies to Overlays alone, where the page is a package and what it does is known. A Web input showing nothing is still not photographed at all.
A compacted card meters whatever has sound. An NDI source carrying only audio showed nothing at all once its card was collapsed, while an audio input beside it metered normally.
Refreshing NDI sources finds them the first time. Each refresh used to start looking from nothing and give up after a second, so a sender that was plainly running often needed several attempts. The search now runs for as long as the application does and answers from what it has already heard.
Replay sound is clean. Playing a bucket crackled through every crossfade, and quieter ticks ran through the rest of it. A clip's sound is now mixed with the one it is dissolving into before either reaches the mixer, the way the picture already was, and each clip's audio is laid down exactly end to end. The clips on disk were never affected — only what you heard when they played.
The installer replaces the application it finds. It compared version numbers and quietly declined to go backwards, so a machine that had once been given a build claiming version 1 kept it: every installer after that reported success and installed nothing, and the Show would not open there because the application was months of work out of date.
A corrected camera keeps its colour inside a Composite. With two or more corrected sources layered, the one drawn first took a flat colour cast from the one above it — visible as soon as the second source started, and gone again when it stopped. Reordering the layers moved the fault rather than fixing it. Tone and grading caused it; white balance alone did not.
File ▸ New Show closes the Show that is open and starts an empty one. It did nothing at all. It asks first, the same way closing does — and unlike closing, it does not quit the application.
Development builds report their build number instead of build 1, so a development bundle installed over a signed one is obvious rather than looking like a version bug.
Choose Images… when adding an image input opens the file chooser. It did nothing at all; only Choose Folder… worked.
A source that lost signal now says when it comes back. The log recorded a capture being rebuilt but never recorded it recovering, so a source that was in fact fine after a moment read as one stuck in a restart loop. A stall also reports how long it lasted, which is what tells a cable or a hub apart from a camera.
The audio output no longer follows an unplugged interface to the Mac's own speaker. It waits, in silence, for the device the operator chose.
Overlays are captured at the rate and size something is actually watching, and a page that has not moved is not photographed at all. Measured on a six-overlay Show: roughly 320% CPU to 52%.
AVFoundation capture recovers by itself after a source resets its HDMI output.
Program no longer brightened every frame relative to the source.