import Foundation import CoreVideo /// Signal Desktop adapter. Signal shows avatars/initials with a coloured ring /// around the active speaker; names may also be available via the Electron /// Accessibility tree (preferred over OCR when we enable it). Geometry/threshold /// here are first-pass and will be calibrated against real Signal screenshots. struct SignalAdapter: AppAdapter { static let bundleIDs = ["org.whispersystems.signal-desktop"] let adapterVersion = "signal-0.1.0" let preferredFPS = 3 private let analyzer: GridCallAnalyzer init() { var config = GridCallAnalyzer.Config() // Signal tiles are squarish with initials centred; tune with fixtures. config.tileExpandX = 1.6 config.tileExpandY = 1.8 self.analyzer = GridCallAnalyzer(config: config) } func analyze(frame: CVPixelBuffer, at t: TimeInterval) -> [SpeakerObservation] { analyzer.analyze(pixelBuffer: frame, at: t) } // Exposed for fixture/synthetic tests. func analyze(cgImage: CGImage, at t: TimeInterval) -> [SpeakerObservation] { analyzer.analyze(cgImage: cgImage, at: t) } }