public void Tick() { // Schedule all channels Channel1.Tick(); Channel2.Tick(); Channel3.Tick(); Channel4.Tick(); // At a given sample rate read samples from enabled channels if (ticks++ == 4057200 / SampleRate) { if (Enabled) { float sample = (Channel1.Enabled ? Channel1.Next(SampleRate) : 0) + (Channel2.Enabled ? Channel2.Next(SampleRate) : 0) + (Channel3.Enabled ? Channel3.Next(SampleRate) : 0) + (Channel4.Enabled ? Channel4.Next(SampleRate) : 0); samplebuffer.Add(sample); if (samples++ == BufferSize) { AudioAvailable?.Invoke(this, new AudioAvailableEventArgs(samplebuffer.ToArray(), SampleRate)); samplebuffer.Clear(); samples = 0; } } ticks = 0; } }
void SourceDataAvailable(object sender, DataAvailableEventArgs eventArgs) { try { AudioAvailable?.Invoke(this, eventArgs); } catch (Exception ex) { ErrorHandler?.Invoke(ex.Message); } }
/// <summary> /// Sends the specified text to be spoken to the TTS service and saves the response audio to a file. /// </summary> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>A Task</returns> public Task Speak(CancellationToken cancellationToken) { var cookieContainer = new CookieContainer(); var handler = new HttpClientHandler() { CookieContainer = cookieContainer }; var client = new HttpClient(handler); foreach (var header in this.inputOptions.Headers) { client.DefaultRequestHeaders.TryAddWithoutValidation(header.Key, header.Value); } var genderValue = ""; switch (this.inputOptions.VoiceType) { case Gender.Male: genderValue = "Male"; break; case Gender.Female: default: genderValue = "Female"; break; } var request = new HttpRequestMessage(HttpMethod.Post, this.inputOptions.RequestUri) { Content = new StringContent(GenerateSsml(this.inputOptions.Locale, genderValue, this.inputOptions.VoiceName, this.inputOptions.Text)) }; var httpTask = client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken); var saveTask = httpTask.ContinueWith( async(responseMessage, token) => { try { if (responseMessage.IsCompleted && responseMessage.Result != null && responseMessage.Result.IsSuccessStatusCode) { var httpStream = await responseMessage.Result.Content.ReadAsByteArrayAsync(); AudioAvailable?.Invoke(this, new GenericEventArgs <byte[]>(httpStream)); } else { string errorContent = responseMessage.Result.ReasonPhrase; var stringContent = await responseMessage.Result.Content.ReadAsStringAsync(); Error?.Invoke(this, new GenericEventArgs <Exception>(new Exception(String.Format("Service returned {0}", errorContent)))); Error?.Invoke(this, new GenericEventArgs <Exception>(new Exception(String.Format("Service returned {0}", stringContent)))); } } catch (Exception e) { this.Error?.Invoke(this, new GenericEventArgs <Exception>(e.GetBaseException())); } finally { request.Dispose(); client.Dispose(); handler.Dispose(); } }, TaskContinuationOptions.AttachedToParent, cancellationToken); return(saveTask); }