7d4f8a4cd2
extension-reaper-macos: split main.cpp into tracking.cpp (polls selected envelope/automation items, reads/writes D_BASELINE) and socket.cpp (basic UDP listener, non-blocking, drains all pending packets per tick). Nudging now applies to every selected automation item across every track in the project, not just the first one found. app-desktop-macos: new "Extension" column (mirrors the OSC/Remote columns) to enable/disable the UDP connection and point it at a host/port, plus a log window. FocusFaderWidget gets an OSC/Ext output-mode toggle (mirrors TransportWidget's MIDI/OSC toggle) so a fader can drive the extension directly instead of/alongside OSC. Also renamed the Remote/Tablet buttons for clarity and split their status indicator into its own column. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
48 lines
1010 B
Python
48 lines
1010 B
Python
import socket
|
|
|
|
_ext_socket = None
|
|
_ext_ip = "127.0.0.1"
|
|
_ext_port = 9124
|
|
_ext_enabled = False
|
|
|
|
|
|
def get_extension_socket():
|
|
global _ext_socket
|
|
|
|
if _ext_socket is None:
|
|
_ext_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
|
|
|
return _ext_socket
|
|
|
|
|
|
def set_extension_target(ip=None, port=None):
|
|
global _ext_socket, _ext_ip, _ext_port
|
|
|
|
if ip is not None:
|
|
_ext_ip = ip
|
|
|
|
if port is not None:
|
|
_ext_port = port
|
|
|
|
_ext_socket = None
|
|
|
|
|
|
def set_extension_enabled(enabled):
|
|
global _ext_enabled
|
|
_ext_enabled = enabled
|
|
|
|
|
|
def is_extension_enabled():
|
|
return _ext_enabled
|
|
|
|
|
|
def send_to_extension(value):
|
|
"""Sends a plain numeric delta to extension-reaper-macos over UDP.
|
|
No-op (kill switch) unless set_extension_enabled(True) has been called."""
|
|
if not _ext_enabled:
|
|
return
|
|
try:
|
|
get_extension_socket().sendto(str(value).encode(), (_ext_ip, _ext_port))
|
|
except Exception as e:
|
|
print(f"[Extension send] Error: {e}")
|