Authentication-Results: mail-b.sr.ht; dkim=pass header.d=jankundrat.com header.i=@jankundrat.com; dkim=pass header.d=messagingengine.com header.i=@messagingengine.com Received: from wout5-smtp.messagingengine.com (wout5-smtp.messagingengine.com [64.147.123.21]) by mail-b.sr.ht (Postfix) with ESMTPS id 85C7911EF01 for <~martijnbraam/openatem@lists.sr.ht>; Thu, 4 Nov 2021 21:28:29 +0000 (UTC) Received: from compute3.internal (compute3.nyi.internal [10.202.2.43]) by mailout.west.internal (Postfix) with ESMTP id A530B32015ED for <~martijnbraam/openatem@lists.sr.ht>; Thu, 4 Nov 2021 17:28:28 -0400 (EDT) Received: from mailfrontend2 ([10.202.2.163]) by compute3.internal (MEProxy); Thu, 04 Nov 2021 17:28:28 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jankundrat.com; h=resent-date:resent-message-id:resent-from:resent-to :message-id:in-reply-to:references:from:date:subject :mime-version:content-type:content-transfer-encoding:to; s=fm3; bh=2ZO1jQYqPgqr9tnGw9OfcsrAvA89KPqLjBOvSp8rKWM=; b=iQnfNKMb9NPv f8XhJQ19Uux/XH9OSuuij/zPI+/1kpLVdSE9dhjLqla2e9EK75L1vP/KyTvpNd2C vXMSv0DsbTmzMkdpAHLhFI7Whcty+H4wO9fpWn//7AyCgtghvMgSKCFj4bEVZtsw y6uHt/euxTFr/GE50GcUAEUp7P6l4RfjaOsQvLurRcNB5XVkUS3pBGhSEs1V94J/ MHjLl+nDcRaOSxDsqJ/maLV2WA4HgGejmDKmrPMtwaLl2g78Ik/3uMHFPbPLdbWu uDJ+bVbk0JbvFLHYxTrEoqkneBgdufqw3goBC68cx26KdO2IR2aj+XuknCppRD84 faGUyYBUUw== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=content-transfer-encoding:content-type :date:from:in-reply-to:message-id:mime-version:references :resent-date:resent-from:resent-message-id:resent-to:subject:to :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm1; bh=2ZO1jQYqPgqr9tnGw9OfcsrAvA89KPqLjBOvSp8rKWM=; b=MPTGbXSQ tpqlwg6Vt9kPIL1GIEOjRRzhobuK5Ui4YfdU5qXFCqTXKyxW+Rbdq0xcElzn25b9 6BgLMaM/r0DYlQ0QY553rVq2FRtZ1bZ7xAtOEzS7da4kjqKykh4+MzuAqkaPMt26 FYqsLw6ILx1pkCJLrcXuAK6SodayE3L7JzvKTAGFSLc7qAgUP7XK8bBEulJd0KaD 2toiDFRVO5IMDe/I1yYB+Zsz0ZkGrtgkrOHhKWdqGmvOLMGfKsyHYa85SelE26MH xk4zQaIZOgzmoCkXe9HbrEsOdJr0qVibcdKmD6BoTZnNN+9r2I3UCyLQtqALbBWG rMXZ9hrwOpEI/Q== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvuddrtdeggddugeefucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucenucfjughrpefkjghfhfffufggtgfgvfesthekre dttddtjeenucfhrhhomheplfgrnhcumfhunhgurhojthcuoehjkhhtsehjrghnkhhunhgu rhgrthdrtghomheqnecuggftrfgrthhtvghrnhepjeekvedukeeftdelteegfefhteeuke eutdduffevveegvedttdfhveffteeuudfhnecuvehluhhsthgvrhfuihiivgeptdenucfr rghrrghmpehmrghilhhfrhhomhepjhhkthesjhgrnhhkuhhnughrrghtrdgtohhm X-ME-Proxy: Received: by mail.messagingengine.com (Postfix) with ESMTPA for <~martijnbraam/openatem@lists.sr.ht>; Thu, 4 Nov 2021 17:28:27 -0400 (EDT) Resent-Date: Thu, 04 Nov 2021 22:28:26 +0100 Resent-Message-ID: <5d04bcf0-09f3-418c-be27-9540b6e0fccd@jankundrat.com> Resent-From: =?iso-8859-1?Q?Jan_Kundr=E1t?= Resent-To: openswitcher ML <~martijnbraam/openatem@lists.sr.ht> Message-Id: In-Reply-To: References: From: =?UTF-8?q?Jan=20Kundr=C3=A1t?= Date: Thu, 20 May 2021 02:09:45 +0200 Subject: [PATCH 5/5] Implement reading of headphone monitoring: FMHP and FAMS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit To: "openswitcher ML" <~martijnbraam/openatem@lists.sr.ht> Signed-off-by: Jan Kundrát --- pyatem/field.py | 53 ++++++++++++++++++++++++++++++++++++++++++++++ pyatem/protocol.py | 2 ++ 2 files changed, 55 insertions(+) diff --git a/pyatem/field.py b/pyatem/field.py index 67e03af..d2cd92f 100644 --- a/pyatem/field.py +++ b/pyatem/field.py @@ -1560,6 +1560,59 @@ class FairlightTallyField(FieldBase): return ''.format(self.tally) +class FairlightHeadphonesField(FieldBase): + """ + Data from the `FMHP`, phones output volume and mute + + This doesn't get triggered when soloing channels. + + ====== ==== ====== =========== + Offset Size Type Descriptions + ====== ==== ====== =========== + 0 4 i32 Volume in 0.01 dB (-60.00 to +6.00 dB) + 5 4 ? Unknown + 8 1 bool Muted (0) / Umuted (1) + 9 1 u8 Last soloed channel (just the main part) + 10 22 ? Unknown + + """ + + def __init__(self, raw): + self.raw = raw + self.volume, self.unmuted = struct.unpack('> i 4x ? 23x', raw) + + def __repr__(self): + return ''.format(self.volume, self.unmuted) + + +class FairlightSoloField(FieldBase): + """ + Data from the `FAMS`, soloing channels to phones + + ====== ==== ====== =========== + Offset Size Type Descriptions + ====== ==== ====== =========== + 0 1 bool Anything soloed? + 1 7 ? Unknown + 8 1 u8 Unknown: 0x00 for HDMI channels, 0x05 for 3.5mm jack + 9 1 u8 Soloed channel (main) + 10 12 ? Unknown + 22 1 u8 No subchannels (0x01), split into L/R (0xff) + 23 1 u8 Soloed channel (subchannel) + + """ + + def __init__(self, raw): + self.raw = raw + self.solo, self.channel, self.is_split_lr, self.subchannel = struct.unpack('> ? 8x B 12x BB', raw) + + def __repr__(self): + return ''.format( + self.solo, + self.channel if self.is_split_lr == 0x01 else '{}.{}'.format(self.channel, self.subchannel), + ) + + class AtemEqBandPropertiesField(FieldBase): """ Data from the `AEBP` field. This encodes the EQ settings in the fairlight mixer. For every channel there will diff --git a/pyatem/protocol.py b/pyatem/protocol.py index 2ee2b86..bf1be27 100644 --- a/pyatem/protocol.py +++ b/pyatem/protocol.py @@ -124,6 +124,8 @@ class AtemProtocol: 'AMTl': 'audio-mixer-tally', 'FASP': 'fairlight-strip-properties', 'FAMP': 'fairlight-master-properties', + 'FMHP': 'fairlight-headphones', + 'FAMS': 'fairlight-solo', '_TlC': 'tally-config', 'TlIn': 'tally-index', 'TlSr': 'tally-source', -- 2.33.0