public void Enqueue(TTSMessage message) { if (null == _parentTTS) { throw new InvalidOperationException("No associated Text-To-Speech subsystem for injection"); } else if (message.AlreadySpoken()) { throw new InvalidOperationException($"{GetType().Name}: message has already been spoken"); } _parentTTS.TTSInitialize(); uint messageKey; message.Voice = _parentTTS.CurrentVoice; vx_tts_status status = VivoxCoreInstance.vx_tts_speak(_parentTTS.TTSManagerId, message.Voice.Key, message.Text, (vx_tts_destination)message.Destination, out messageKey); if (TextToSpeech.IsNotTTSError(status)) { message.Key = messageKey; message.TTS = _parentTTS; message.State = TTSMessageState.Enqueued; message.PropertyChanged += OnMessage_PropertyChanged; _messages.Add(message); AfterMessageAdded?.Invoke(this, new ITTSMessageQueueEventArgs(message)); } else { throw new VivoxApiException((int)status); } }