// Copyright (c) Microsoft. All rights reserved. global using AudioChunkEvent = PipelineEvent; global using AudioEvent = PipelineEvent; global using ChatEvent = PipelineEvent; global using SpeechEvent = PipelineEvent; global using TranscriptionEvent = PipelineEvent; public readonly struct PipelineEvent(int turnId, CancellationToken cancellationToken, T payload) : IEquatable> { public int TurnId { get; } = turnId; public CancellationToken CancellationToken { get; } = cancellationToken; public T Payload { get; } = payload; public static bool IsValid(PipelineEvent evt, int currentTurnId, Func? payloadPredicate = null) => evt.Payload != null && evt.TurnId == currentTurnId && !evt.CancellationToken.IsCancellationRequested && (payloadPredicate?.Invoke(evt.Payload) ?? true); public override bool Equals(object obj) { throw new NotImplementedException(); } public override int GetHashCode() { throw new NotImplementedException(); } public static bool operator ==(PipelineEvent left, PipelineEvent right) { return left.Equals(right); } public static bool operator !=(PipelineEvent left, PipelineEvent right) { return !(left == right); } public bool Equals(PipelineEvent other) { throw new NotImplementedException(); } } public record AudioData(byte[] Data, int SampleRate, int Channels, int BitsPerSample) { public TimeSpan Duration => TimeSpan.FromSeconds((double)this.Data.Length / (this.SampleRate * this.Channels * this.BitsPerSample / 8)); }