private void playQueueContents(OrderedDictionary queueToPlay, Boolean isImmediateMessages)
{
long milliseconds = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
List<String> keysToPlay = new List<String>();
List<String> soundsProcessed = new List<String>();
Boolean oneOrMoreEventsEnabled = false;
lock (queueToPlay)
{
int willBePlayedCount = queueToPlay.Count;
foreach (String key in queueToPlay.Keys)
{
QueuedMessage queuedMessage = (QueuedMessage)queueToPlay[key];
if (isImmediateMessages || queuedMessage.dueTime <= milliseconds)
{
Boolean messageHasExpired = queuedMessage.expiryTime != 0 && queuedMessage.expiryTime < milliseconds;
Boolean messageIsStillValid = queuedMessage.isMessageStillValid(key, crewChief.currentGameState);
Boolean queueTooLongForMessage = queuedMessage.maxPermittedQueueLengthForMessage != 0 && willBePlayedCount > queuedMessage.maxPermittedQueueLengthForMessage;
if ((isImmediateMessages || !keepQuiet || queuedMessage.playEvenWhenSilenced) && queuedMessage.canBePlayed &&
messageIsStillValid && !keysToPlay.Contains(key) && !queueTooLongForMessage && !messageHasExpired)
{
keysToPlay.Add(key);
}
else
{
if (!messageIsStillValid)
{
Console.WriteLine("Clip " + key + " is not valid");
}
else if (messageHasExpired)
{
Console.WriteLine("Clip " + key + " has expired");
}
else if (queueTooLongForMessage)
{
List<String> keysToDisplay = new List<string>();
foreach (String keyToDisplay in queueToPlay.Keys)
{
keysToDisplay.Add(keyToDisplay);
}
Console.WriteLine("Queue is too long to play clip " + key + " max permitted items for this message = "
+ queuedMessage.maxPermittedQueueLengthForMessage + " queue: " + String.Join(", ", keysToDisplay));
}
else if (!queuedMessage.canBePlayed)
{
Console.WriteLine("Clip " + key + " has some missing sound files");
}
soundsProcessed.Add(key);
willBePlayedCount--;
}
}
}
if (keysToPlay.Count > 0)
{
if (keysToPlay.Count == 1 && clipIsPearlOfWisdom(keysToPlay[0]))
{
if (hasPearlJustBeenPlayed())
{
Console.WriteLine("Rejecting pearl of wisdom " + keysToPlay[0] +
" because one has been played in the last " + minTimeBetweenPearlsOfWisdom + " seconds");
soundsProcessed.Add(keysToPlay[0]);
}
else if (disablePearlsOfWisdom)
{
Console.WriteLine("Rejecting pearl of wisdom " + keysToPlay[0] +
" because pearls have been disabled for the last phase of the race");
soundsProcessed.Add(keysToPlay[0]);
}
}
else
{
oneOrMoreEventsEnabled = true;
}
}
}
Boolean wasInterrupted = false;
if (oneOrMoreEventsEnabled)
{
// block for immediate messages...
if (isImmediateMessages)
{
lock (queueToPlay)
{
openRadioChannelInternal();
soundsProcessed.AddRange(playSounds(keysToPlay, isImmediateMessages, out wasInterrupted));
}
}
else
{
// for queued messages, allow other messages to be inserted into the queue while these are being read
openRadioChannelInternal();
soundsProcessed.AddRange(playSounds(keysToPlay, isImmediateMessages, out wasInterrupted));
}
}
else
{
soundsProcessed.AddRange(keysToPlay);
}
if (soundsProcessed.Count > 0)
{
lock (queueToPlay)
{
foreach (String key in soundsProcessed)
{
if (queueToPlay.Contains(key))
{
queueToPlay.Remove(key);
}
}
}
}
if (queueHasDueMessages(queueToPlay, isImmediateMessages) && !wasInterrupted && !isImmediateMessages)
{
Console.WriteLine("There are " + queueToPlay.Count + " more events in the queue, playing them...");
playQueueContents(queueToPlay, isImmediateMessages);
}
}