2
0
mirror of https://github.com/9ParsonsB/Pulsar.git synced 2025-12-16 04:44:56 +01:00

Export version fixes (#83)

* Add file association for .eop, prompt for install dir

* Handle .eop or .aip file passed as arg.

* VS2022 version bump

* Filter neutron stars and black holes from fast spinning criteria.

* Adjustments for new "high value" check

* Refactor herald cache

* Fix element order and namespaces for voice moods.

* Add explicit .Stop() between audio player calls.

* Use nullsafe member access instead of skipping

* Don't queue up a title that's already queued.

* Improve body ordinal handling for explorer speech titles.

* Escape strings being inserted into xml

* Handle flip-flopping JSON type

* Converter for flip-flopping property type

* Use the converter

* Escape characters *before* we wrap it in xml.

* Give Eahlstan his clear button. :D

* Exclude all stars from fast rotation check.

* Close outstanding popup notifications on exit.

* TO DONE

* [Herald] Suppress duplicate notification titles for spoken notifications

If you have notifications from multiple plugins producing notifications with the same title in quick succession (ie. "Body A 1 e" from both Explorer and BioInsights), the title on successive notifications will not be spoken again to save the breath of our friendly Azure speakers.

* Doc update

* Remove unintended member hiding

* Fix export errors when exporting BioInsights data, cleanup

Discovered a couple issues with exporting BioInsights data resulting from using two different types of objects in the data grid; improved error handling as well.

Also cleaned up some old-style read all code.

* Add read-all on launch setting

* Updated framework xml

* Improve high-value body description text

Co-authored-by: Fred Kuipers <mr.fredk@gmail.com>
This commit is contained in:
Jonathan Miller
2022-05-21 13:00:47 -02:30
committed by GitHub
parent 921f3867fa
commit 8de34a141c
31 changed files with 495 additions and 216 deletions

View File

@@ -43,6 +43,15 @@ namespace Observatory.Herald
// to make perceived volume more in line with value set.
this.volume = ((byte)System.Math.Floor(System.Math.Pow(volume / 100.0, 2.0) * 100));
Debug.WriteLine("Attempting to de-dupe notification titles against '{0}': '{1}'",
notification.Title.Trim().ToLower(),
String.Join(',', notifications.Select(n => n.Title.Trim().ToLower())));
if (notifications.Where(n => n.Title.Trim().ToLower() == notification.Title.Trim().ToLower()).Any())
{
// Suppress title.
notification.Suppression |= NotificationSuppression.Title;
}
notifications.Enqueue(notification);
if (!processing)
@@ -59,7 +68,7 @@ namespace Observatory.Herald
private void ProcessQueue()
{
Thread.Sleep(200); // Allow time for other notifications to arrive.
NotificationArgs notification = null;
try
{
@@ -69,24 +78,20 @@ namespace Observatory.Herald
notification = notifications.Dequeue();
Debug.WriteLine("Processing notification: {0} - {1}", notification.Title, notification.Detail);
Task<string>[] audioRequestTasks = new Task<string>[2];
List<Task<string>> audioRequestTasks = new();
if (string.IsNullOrWhiteSpace(notification.TitleSsml))
if (!notification.Suppression.HasFlag(NotificationSuppression.Title))
{
audioRequestTasks[0] = RetrieveAudioToFile(notification.Title);
}
else
{
audioRequestTasks[0] = RetrieveAudioSsmlToFile(notification.TitleSsml);
audioRequestTasks.Add(string.IsNullOrWhiteSpace(notification.TitleSsml)
? RetrieveAudioToFile(notification.Title)
: RetrieveAudioSsmlToFile(notification.TitleSsml));
}
if (string.IsNullOrWhiteSpace(notification.DetailSsml))
if (!notification.Suppression.HasFlag(NotificationSuppression.Detail))
{
audioRequestTasks[1] = RetrieveAudioToFile(notification.Detail);
}
else
{
audioRequestTasks[1] = RetrieveAudioSsmlToFile(notification.DetailSsml);
audioRequestTasks.Add(string.IsNullOrWhiteSpace(notification.DetailSsml)
? RetrieveAudioToFile(notification.Detail)
: RetrieveAudioSsmlToFile(notification.DetailSsml));
}
PlayAudioRequestsSequentially(audioRequestTasks);
@@ -105,7 +110,7 @@ namespace Observatory.Herald
private async Task<string> RetrieveAudioToFile(string text)
{
return await RetrieveAudioSsmlToFile($"<speak version=\"1.0\" xmlns=\"http://www.w3.org/2001/10/synthesis\" xml:lang=\"en-US\"><voice name=\"\">{text}</voice></speak>");
return await RetrieveAudioSsmlToFile($"<speak version=\"1.0\" xmlns=\"http://www.w3.org/2001/10/synthesis\" xml:lang=\"en-US\"><voice name=\"\">{System.Security.SecurityElement.Escape(text)}</voice></speak>");
}
private async Task<string> RetrieveAudioSsmlToFile(string ssml)
@@ -113,7 +118,7 @@ namespace Observatory.Herald
return await speechManager.GetAudioFileFromSsml(ssml, voice, style, rate);
}
private void PlayAudioRequestsSequentially(Task<string>[] requestTasks)
private void PlayAudioRequestsSequentially(List<Task<string>> requestTasks)
{
foreach (var request in requestTasks)
{
@@ -131,7 +136,12 @@ namespace Observatory.Herald
while (audioPlayer.Playing)
Thread.Sleep(50);
// Explicit stop to ensure device is ready for next file.
// ...hopefully.
audioPlayer.Stop(true).Wait();
}
speechManager.CommitCache();
}
}
}