package output import ( "context" "errors" "time" ) var ErrBackendClosed = errors.New("backend already closed") // IQSample is a normalized interleaved I/Q sample pair. type IQSample struct { I float32 Q float32 } // CompositeFrame carries a block of MPX/IQ samples along with timing metadata. type CompositeFrame struct { Samples []IQSample SampleRateHz float64 Timestamp time.Time GeneratedAt time.Time EnqueuedAt time.Time DequeuedAt time.Time WriteStartedAt time.Time Sequence uint64 } // BackendConfig describes the properties for a backend instance. type BackendConfig struct { SampleRateHz float64 Channels int IQLevel float32 Metadata map[string]string } // BackendCapabilities advertise what a backend can do. type BackendCapabilities struct { SupportsComposite bool FixedRate bool MaxSamplesPerWrite int } // BackendInfo exposes runtime metadata about a backend. type BackendInfo struct { Name string Description string Capabilities BackendCapabilities } // Backend defines the contract that all output backends must satisfy. type Backend interface { Configure(ctx context.Context, cfg BackendConfig) error Write(ctx context.Context, frame *CompositeFrame) (int, error) Flush(ctx context.Context) error Close(ctx context.Context) error Info() BackendInfo }