Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| oas:changelog [20.09.2026 00:22] – external edit 127.0.0.1 | oas:changelog [27.09.2026 02:22] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Changelog ====== | ====== Changelog ====== | ||
| - | All notable changes to OnAirScreen. Source: OnAirScreen '' | + | All notable changes to OnAirScreen. Source: OnAirScreen '' |
| + | < | ||
| + | All notable changes to this project will be documented in this file. | ||
| + | </ | ||
| + | |||
| + | ===== TBA ===== | ||
| < | < | ||
| + | ### Changed | ||
| - | All notable changes to this project will be documented | + | - The settings chapter |
| + | </ | ||
| + | ===== 1.0.10 ===== | ||
| - | ## [TBA] | + | < |
| + | ### Added | ||
| + | - MIDI input maps Note and CC messages from one interface to LEDs and AIR timers (Settings → GPIO → MIDI), with Learn, On/Off, Oneshot, or Toggle, and On/Off rows in GPIO Logic | ||
| + | |||
| + | ### Changed | ||
| + | |||
| + | - Settings reopen the last GPIO sub-tab (Raspberry Pi, Axia Livewire, MIDI, or Logic) instead of always showing Axia Livewire | ||
| + | - MIDI Oneshot honors Invert: a press sends OFF instead of ON | ||
| + | - MIDI settings rows flash when a Note or CC arrives that matches an enabled row | ||
| + | - Unnamed MIDI rows appear in GPIO Logic as MIDI1–MIDI8 | ||
| + | - The MIDI row highlight keeps the label width, so the row no longer shifts | ||
| + | - Web Settings groups each GPIO input and each Logic rule into its own band, so the fields that belong together are easier to see | ||
| + | - Web Settings groups Timer, Network, and General fields the same way: each AIR timer and LED, plus Station, Clock, MQTT, OSC, and SNMP | ||
| + | - Web Settings groups Audio Meter fields into Input, Meters, LUFS, Peak Hold, Too Loud, and Silence | ||
| + | |||
| + | ### Fixed | ||
| + | |||
| + | - A listen port that is already in use is reported in a dialog. HTTP, WebSocket, UDP, OSC, and SNMP no longer only leave a traceback in the log | ||
| + | - The Web Settings PIN field takes the cursor as soon as the prompt appears | ||
| + | - The empty "no other OnAirScreens" | ||
| + | - Changing the LUFS Reference Preset in the web settings now updates the LUFS Reference value to that preset | ||
| + | - A GPI with no action stays without an action. Raspberry Pi and Livewire inputs can feed Logic rules without also sending the default LED or AIR command | ||
| + | - The test run no longer opens Settings windows or modal dialogs that have to be clicked away. Hotkey and window-geometry tests supply the license fields those paths now read | ||
| + | </ | ||
| + | |||
| + | ===== 1.0.9 ===== | ||
| + | |||
| + | < | ||
| + | ### Changed | ||
| + | |||
| + | - Hardware ID is derived with an application-specific keyed hash. Computers activated with the 1.0.8 beta must be activated again. | ||
| + | </ | ||
| + | |||
| + | ===== 1.0.8 ===== | ||
| + | |||
| + | < | ||
| ### Added | ### Added | ||
| + | - GPIO Logic rules combine Raspberry Pi and Livewire inputs with AND or OR, and turn the chosen LEDs and AIR timers on or off only when that combined level changes | ||
| + | - Web Settings can import a license file from disk, and Updates actions show a dialog for success, errors, and license return | ||
| + | - Paid builds require a hardware-bound license: 14 days full use, then restricted mode (no fullscreen, GPIO, or audio meters; settings are not saved; window max 1280×800; exit after 15 minutes). Activate online or with a license file. One seat, one year by default, renewable. Return the license in the app to move it. | ||
| + | |||
| + | ### Changed | ||
| + | |||
| + | - Update check, the update key, and license activation are on their own Settings tab, with one full-width button per action | ||
| + | - The Updates tab says whether this computer can renew online now, or must import a new license file when the current one expires | ||
| + | - The update key is saved as soon as activation succeeds, without pressing Apply | ||
| + | - Shop manuals state that one license covers one PC or one Raspberry Pi | ||
| + | - Manuals point to support when the standard per-computer activation does not fit a use case | ||
| + | - macOS shop builds are signed with an Apple Developer ID and notarized; Gatekeeper no longer blocks the first launch | ||
| + | |||
| + | ### Fixed | ||
| + | |||
| + | - Web Settings keeps the Updates license panel when switching tabs, so the tab no longer renders empty and the license status line no longer throws | ||
| + | - Freeing a license seat deactivates that computer on the next update check, including startup and Check now. The local license is removed and OnAirScreen switches to restricted mode | ||
| + | - A paid build checks the update key at startup even when update checks are off. An invalid key removes the local license immediately and switches to restricted mode. Later automatic checks and the deactivation notice are skipped; Check now still runs | ||
| + | - After a license return and a new activation, the window keeps the last size that fit the screen | ||
| + | </ | ||
| + | |||
| + | ===== 1.0.7 ===== | ||
| + | |||
| + | < | ||
| + | ### Changed | ||
| + | |||
| + | - GPIO Custom command uses the same pencil editor as Links (Settings and Web UI) | ||
| + | - Links Custom command is edited from a pencil icon; the icon is highlighted when a command is set | ||
| + | ><> | ||
| + | ### Fixed | ||
| + | |||
| + | - Settings Links no longer leaves a blank gap between the instance hint and the nearby-screen list | ||
| + | - Web Settings Links instance hint stays in place so Add as replica / Use as source no longer shove the form | ||
| + | - Links mapping Custom field is extra API commands when the source is active; Local target **Custom only** skips LED/ | ||
| + | - Links Follow all disables Local target and Invert (full status copy does not use them) | ||
| + | - Links replica and source grids fit the Settings width without a horizontal scrollbar | ||
| + | - Add as replica / Use as source fill the next empty row; a notice is shown when all 8 are in use | ||
| + | - Links instance dropdowns no longer show Studio-1 or Studio-2 as the empty placeholder | ||
| + | - Web Settings hints wrap on the full row; Links Replicas/ | ||
| + | - Settings Links instance fields are nearby-screen dropdowns so each replica/ | ||
| + | - Link replicas no longer show host-local WARN copy (quit, reboot, shutdown, NTP) | ||
| + | - Link status is pushed on change (replicas and mapped sources); the HTTP poll is only a slow retry, not a per-screen chatter loop | ||
| + | - Replica LEDs and other runtime status push immediately instead of waiting for the 400 ms poll | ||
| + | - Link replicas and sources follow the instance name on the LAN; a stored host is only a fallback if discovery misses them | ||
| + | - Web UI Links matches Settings: Nearby list, Add as replica / Use as source, Replicas and Sources grids | ||
| + | - Settings Links keep the Nearby selection when the peer list refreshes | ||
| + | - Web UI and Settings Apply reject an instance name already used on the LAN and show the collision warning | ||
| + | </ | ||
| + | |||
| + | ===== 1.0.6 ===== | ||
| + | |||
| + | < | ||
| + | ### Added | ||
| + | |||
| + | - Settings **Links**: discover other OnAirScreens by instance name (multicast) or host/port; add replicas for 1→n full runtime status (LEDs, AIR, NOW/ | ||
| + | - Settings warn when another OnAirScreen on the LAN uses the same instance name; discovery no longer picks one host at random | ||
| - Right-click menu shows the current OnAirScreen version as info | - Right-click menu shows the current OnAirScreen version as info | ||
| - Raspberry Pi SD-card image allows passwordless host reboot and shutdown from OnAirScreen | - Raspberry Pi SD-card image allows passwordless host reboot and shutdown from OnAirScreen | ||
| - | ## [1.0.5] | + | ### Fixed |
| + | - Weather widget stays on the AIR LED column width; long city names are elided instead of pushing the clock | ||
| + | - Weather widget shows the searched city name instead of the OpenWeatherMap station or neighborhood name | ||
| + | - Weather widget keeps the current city when switching °C / °F / K (Apply uses the dialog city ID, not a stale settings read) | ||
| + | - Web UI Instance Name accepts at most 32 characters | ||
| + | - HTTP server no longer does reverse DNS on bind or request logging (avoids multi-second stalls) | ||
| + | </ | ||
| + | |||
| + | ===== 1.0.5 ===== | ||
| + | |||
| + | < | ||
| ### Added | ### Added | ||
| - Application log starts with a Starting OnAirScreen line (version and distribution) | - Application log starts with a Starting OnAirScreen line (version and distribution) | ||
| + | </ | ||
| - | ## [1.0.4] | + | ===== 1.0.4 ===== |
| + | < | ||
| ### Fixed | ### Fixed | ||
| - Linux PTP logs whether the 319/320 bind helper is missing or failed | - Linux PTP logs whether the 319/320 bind helper is missing or failed | ||
| - Linux PTP bind helper receives the comm socket on stdin | - Linux PTP bind helper receives the comm socket on stdin | ||
| + | </ | ||
| - | ## [1.0.3] | + | ===== 1.0.3 ===== |
| + | < | ||
| ### Added | ### Added | ||
| Line 45: | Line 158: | ||
| - Closing the main window while Settings is still open now exits the app | - Closing the main window while Settings is still open now exits the app | ||
| - Linux/ | - Linux/ | ||
| + | </ | ||
| - | ## [1.0.2] | + | ===== 1.0.2 ===== |
| + | < | ||
| ### Added | ### Added | ||
| Line 67: | Line 182: | ||
| - Web settings GPIO row fields are disabled unless that GPI Enable is on | - Web settings GPIO row fields are disabled unless that GPI Enable is on | ||
| - Desktop GPIO row fields are disabled unless that GPI On checkbox is on | - Desktop GPIO row fields are disabled unless that GPI On checkbox is on | ||
| + | </ | ||
| - | ## [1.0.1] | + | ===== 1.0.1 ===== |
| + | < | ||
| ### Added | ### Added | ||
| Line 79: | Line 196: | ||
| - PTP: retry UDP 319/320 bind when the ports are in use or permission is denied; log the cause; lock LED and WARN show `PTP ERROR` until bind succeeds | - PTP: retry UDP 319/320 bind when the ports are in use or permission is denied; log the cause; lock LED and WARN show `PTP ERROR` until bind succeeds | ||
| - German manual links to the English GPG wiki page (`gpg-en`); the German GPG how-to is removed | - German manual links to the English GPG wiki page (`gpg-en`); the German GPG how-to is removed | ||
| + | </ | ||
| - | ## [1.0.0] | + | ===== 1.0.0 ===== |
| + | < | ||
| First stable 1.0.0. Changes since 0.9.8 are listed in the 1.0.0beta sections below. | First stable 1.0.0. Changes since 0.9.8 are listed in the 1.0.0beta sections below. | ||
| + | </ | ||
| - | ## [1.0.0beta15] | + | ===== 1.0.0beta15 |
| + | < | ||
| ### Changed | ### Changed | ||
| Line 93: | Line 214: | ||
| - LED and AIR timer on and off color changes take effect immediately after Apply | - LED and AIR timer on and off color changes take effect immediately after Apply | ||
| + | </ | ||
| - | ## [1.0.0beta14] | + | ===== 1.0.0beta14 |
| + | < | ||
| ### Added | ### Added | ||
| Line 111: | Line 234: | ||
| - I/LRA no longer burns a CPU core on long sessions: history stays in a NumPy buffer, blocks below −70 LUFS are not stored, and gated I is refreshed about once per second | - I/LRA no longer burns a CPU core on long sessions: history stays in a NumPy buffer, blocks below −70 LUFS are not stored, and gated I is refreshed about once per second | ||
| + | </ | ||
| - | ## [1.0.0beta12] | + | ===== 1.0.0beta12 |
| + | < | ||
| ### Added | ### Added | ||
| Line 129: | Line 254: | ||
| - Long-press on the main screen no longer uses deprecated Qt mouse-position APIs | - Long-press on the main screen no longer uses deprecated Qt mouse-position APIs | ||
| + | </ | ||
| - | ## [1.0.0beta11] | + | ===== 1.0.0beta11 |
| + | < | ||
| ### Added | ### Added | ||
| Line 139: | Line 266: | ||
| - Raspberry Pi GPIO import of system gpiozero no longer fails for missing freeze stdlib modules (`colorsys`, | - Raspberry Pi GPIO import of system gpiozero no longer fails for missing freeze stdlib modules (`colorsys`, | ||
| + | </ | ||
| - | ## [1.0.0beta10] | + | ===== 1.0.0beta10 |
| + | < | ||
| ### Fixed | ### Fixed | ||
| - Raspberry Pi GPIO works in the packaged app by loading system `python3-gpiozero` / `python3-lgpio` (the freeze does not bundle them) | - Raspberry Pi GPIO works in the packaged app by loading system `python3-gpiozero` / `python3-lgpio` (the freeze does not bundle them) | ||
| + | </ | ||
| - | ## [1.0.0beta9] | + | ===== 1.0.0beta9 |
| + | < | ||
| ### Added | ### Added | ||
| Line 155: | Line 286: | ||
| - GPIO wiring diagrams in the manuals show a PC817 module with silkscreen terminals `IN1`–`IN8` / `GND` and `OUT1`–`OUT8` / `GND` | - GPIO wiring diagrams in the manuals show a PC817 module with silkscreen terminals `IN1`–`IN8` / `GND` and `OUT1`–`OUT8` / `GND` | ||
| + | </ | ||
| - | ## [1.0.0beta8] | + | ===== 1.0.0beta8 |
| + | < | ||
| ### Added | ### Added | ||
| Line 177: | Line 310: | ||
| - Opening Settings / Apply no longer segfaults on Raspberry Pi: the Python mouse event filter is gone; main-screen children let double-click and right-click through to the window | - Opening Settings / Apply no longer segfaults on Raspberry Pi: the Python mouse event filter is gone; main-screen children let double-click and right-click through to the window | ||
| - Audio meter heading " | - Audio meter heading " | ||
| + | </ | ||
| - | ## [1.0.0beta7] | + | ===== 1.0.0beta7 |
| + | < | ||
| ### Changed | ### Changed | ||
| Line 197: | Line 332: | ||
| - Web UI settings overlay (gear, top right): edit all OnAirScreen settings, optional PIN (`Network/ | - Web UI settings overlay (gear, top right): edit all OnAirScreen settings, optional PIN (`Network/ | ||
| - Web UI Audio Meters: **Livewire Source** and **AES67 Stream** dropdowns with live discovery and **Paste SDP**, matching the desktop Settings dialog | - Web UI Audio Meters: **Livewire Source** and **AES67 Stream** dropdowns with live discovery and **Paste SDP**, matching the desktop Settings dialog | ||
| + | </ | ||
| - | ## [1.0.0beta6] | + | ===== 1.0.0beta6 |
| + | < | ||
| ### Changed | ### Changed | ||
| Line 208: | Line 345: | ||
| - Windows: opening **Settings → Fonts** no longer access-violates on first open. The mouse event filter is installed after widgets exist, and the font database is warmed at startup | - Windows: opening **Settings → Fonts** no longer access-violates on first open. The mouse event filter is installed after widgets exist, and the font database is warmed at startup | ||
| - Main-screen hotkeys work again. The mouse event filter no longer consumes `ShortcutOverride` and key events, so `QShortcut` still reaches Qt | - Main-screen hotkeys work again. The mouse event filter no longer consumes `ShortcutOverride` and key events, so `QShortcut` still reaches Qt | ||
| + | </ | ||
| - | ## [1.0.0beta5] | + | ===== 1.0.0beta5 |
| + | < | ||
| ### Added | ### Added | ||
| Line 224: | Line 363: | ||
| - Fresh installs without `Audio/ | - Fresh installs without `Audio/ | ||
| - Settings audio-device Refresh re-scans PortAudio so newly plugged or unplugged inputs appear immediately | - Settings audio-device Refresh re-scans PortAudio so newly plugged or unplugged inputs appear immediately | ||
| + | </ | ||
| - | ## [1.0.0beta4] | + | ===== 1.0.0beta4 |
| + | < | ||
| ### Changed | ### Changed | ||
| - OnAirScreen Source-Available License (OASL 1.0): source may be used, modified, and redistributed; | - OnAirScreen Source-Available License (OASL 1.0): source may be used, modified, and redistributed; | ||
| - Application file headers point to OASL; Settings License tab shows OASL plus third-party notices | - Application file headers point to OASL; Settings License tab shows OASL plus third-party notices | ||
| + | </ | ||
| - | ## [1.0.0beta3] | + | ===== 1.0.0beta3 |
| + | < | ||
| ### Added | ### Added | ||
| Line 251: | Line 394: | ||
| - Application BSD text removed from `LICENSE` and the Settings license tab pending the forthcoming source license | - Application BSD text removed from `LICENSE` and the Settings license tab pending the forthcoming source license | ||
| - Default audio meter layout is L/R plus programme LUFS (`both`); default width is 115px and the maximum is 150px | - Default audio meter layout is L/R plus programme LUFS (`both`); default width is 115px and the maximum is 150px | ||
| + | </ | ||
| - | ## [1.0.0beta2] | + | ===== 1.0.0beta2 |
| + | < | ||
| ### Fixed | ### Fixed | ||
| Line 265: | Line 410: | ||
| - Station and slogan color pickers in Settings no longer show a live preview | - Station and slogan color pickers in Settings no longer show a live preview | ||
| - dBTP meter hides the orange ceiling peg when the Too Loud indicator is off | - dBTP meter hides the orange ceiling peg when the Too Loud indicator is off | ||
| + | </ | ||
| - | ## [1.0.0beta1] | + | ===== 1.0.0beta1 |
| + | < | ||
| ### Added | ### Added | ||
| Line 306: | Line 453: | ||
| - Web-UI restores the WebSocket after falling back to HTTP polling | - Web-UI restores the WebSocket after falling back to HTTP polling | ||
| - Opening Settings again brings the existing window to the front instead of reloading it | - Opening Settings again brings the existing window to the front instead of reloading it | ||
| + | </ | ||
| - | ## [0.9.9beta1] | + | ===== 0.9.9beta1 |
| + | < | ||
| ### Added | ### Added | ||
| Line 330: | Line 479: | ||
| - Autoflash / timedflash LED regression and Web-UI blink | - Autoflash / timedflash LED regression and Web-UI blink | ||
| - MQTT reconnect and AES67 capture restart stop during application quit | - MQTT reconnect and AES67 capture restart stop during application quit | ||
| + | </ | ||
| - | ## [0.9.8] | + | ===== 0.9.8 ===== |
| + | < | ||
| ### Added | ### Added | ||
| Line 434: | Line 585: | ||
| - MainScreen: Simplified update_ntp_status() to use priority -1 directly | - MainScreen: Simplified update_ntp_status() to use priority -1 directly | ||
| - API: get_status_json() now returns warnings array with priorities in addition to legacy warn field | - API: get_status_json() now returns warnings array with priorities in addition to legacy warn field | ||
| + | </ | ||
| - | ## [0.9.7beta4] | + | ===== 0.9.7beta4 |
| + | < | ||
| ### Added | ### Added | ||
| Line 457: | Line 610: | ||
| - Makefile: Follow symlinks when searching for rcc tool in Homebrew installations | - Makefile: Follow symlinks when searching for rcc tool in Homebrew installations | ||
| - Fixed: IP addresses now correctly displayed at startup | - Fixed: IP addresses now correctly displayed at startup | ||
| + | </ | ||
| - | ## [0.9.7beta3] | + | ===== 0.9.7beta3 |
| + | < | ||
| ### Added | ### Added | ||
| Line 480: | Line 635: | ||
| - Network: HTTP server now supports Web-UI in addition to command API | - Network: HTTP server now supports Web-UI in addition to command API | ||
| - Network: Improved thread-safety for GUI operations from HTTP thread using pyqtSignal | - Network: Improved thread-safety for GUI operations from HTTP thread using pyqtSignal | ||
| + | </ | ||
| - | ## [0.9.7beta2] | + | ===== 0.9.7beta2 |
| + | < | ||
| ### Added | ### Added | ||
| Line 492: | Line 649: | ||
| - Fixed weather widget API calls when widget is disabled or no API key is configured | - Fixed weather widget API calls when widget is disabled or no API key is configured | ||
| - Removed unused font button | - Removed unused font button | ||
| + | </ | ||
| - | ## [0.9.7beta1] | + | ===== 0.9.7beta1 |
| + | < | ||
| ### Added | ### Added | ||
| Line 519: | Line 678: | ||
| - Updated copyright strings | - Updated copyright strings | ||
| - Updated settings.ui | - Updated settings.ui | ||
| + | </ | ||
| - | ## [0.9.6 beta2] | + | ===== 0.9.6 beta2 ===== |
| + | < | ||
| ### Added | ### Added | ||
| - options to change icons on all 4 timers | - options to change icons on all 4 timers | ||
| + | </ | ||
| - | ## [0.9.6 beta1] | + | ===== 0.9.6 beta1 ===== |
| + | < | ||
| ### Added | ### Added | ||
| - option for preferred logo position | - option for preferred logo position | ||
| + | </ | ||
| - | ## [0.9.5] | + | ===== 0.9.5 ===== |
| + | < | ||
| ### Changed | ### Changed | ||
| Line 554: | Line 719: | ||
| - added option to select between no/ | - added option to select between no/ | ||
| - added logo to analog clock | - added logo to analog clock | ||
| + | </ | ||
| - | ## [0.9.4] | + | ===== 0.9.4 ===== |
| + | < | ||
| ### Changed | ### Changed | ||
| Line 564: | Line 731: | ||
| - added dutch language support (Thanks to [ywiskerke](https:// | - added dutch language support (Thanks to [ywiskerke](https:// | ||
| - fixed wrong hour in xx:45 textclock display | - fixed wrong hour in xx:45 textclock display | ||
| + | </ | ||
| - | ## [0.9.3] | + | ===== 0.9.3 ===== |
| + | < | ||
| ### Added | ### Added | ||
| Line 575: | Line 744: | ||
| - fixed logo size calculation for portrait format logos | - fixed logo size calculation for portrait format logos | ||
| - customizable font and size for various elements | - customizable font and size for various elements | ||
| + | </ | ||
| - | ## [0.9.2] | + | ===== 0.9.2 ===== |
| + | < | ||
| ### Changed | ### Changed | ||
| Line 592: | Line 763: | ||
| - Show/hide LED1-4 | - Show/hide LED1-4 | ||
| - Show/hide TextClock | - Show/hide TextClock | ||
| + | </ | ||
| - | ## [0.9.1 beta4] | + | ===== 0.9.1 beta4 ===== |
| + | < | ||
| ### Changed | ### Changed | ||
| - Fix window resize when displaying long text in NOW/ | - Fix window resize when displaying long text in NOW/ | ||
| + | </ | ||
| - | ## [0.9.1 beta3] | + | ===== 0.9.1 beta3 ===== |
| + | < | ||
| ### Added | ### Added | ||