more
This commit is contained in:
@@ -101,7 +101,6 @@ class LiveInformation {
|
||||
AudioWrapper audioPlayer = AudioWrapper();
|
||||
AnnouncementCache announcementCache = AnnouncementCache();
|
||||
List<AnnouncementQueueEntry> announcementQueue = [];
|
||||
AnnouncementQueueEntry? lastAnnouncement;
|
||||
DateTime lastAnnouncementTimeStamp = DateTime.now().toUtc();
|
||||
EventDelegate<AnnouncementQueueEntry> announcementDelegate = EventDelegate();
|
||||
String _currentAnnouncement = "*** NO MESSAGE ***";
|
||||
@@ -133,6 +132,7 @@ class LiveInformation {
|
||||
// print("Q Difference: ${milisecondDifference}");
|
||||
if (milisecondDifference <= timerInterval) {
|
||||
// Account for the time lost by the periodic timer
|
||||
announcementQueue.remove(announcement);
|
||||
await Future.delayed(Duration(milliseconds: timerInterval - milisecondDifference));
|
||||
} else {
|
||||
print("Due in: ${milisecondDifference}ms");
|
||||
@@ -140,8 +140,7 @@ class LiveInformation {
|
||||
}
|
||||
}
|
||||
}
|
||||
announcementQueue.removeAt(0);
|
||||
lastAnnouncement = announcement;
|
||||
|
||||
isPlayingAnnouncement = true;
|
||||
|
||||
if (kIsWeb) {
|
||||
@@ -161,10 +160,12 @@ class LiveInformation {
|
||||
|
||||
Duration? duration = await audioPlayer.play(source);
|
||||
await Future.delayed(duration!);
|
||||
await Future.delayed(Duration(milliseconds: 150));
|
||||
if (announcement.audioSources.last != source) {
|
||||
await Future.delayed(Duration(milliseconds: 500));
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
audioPlayer.stop();
|
||||
} catch (e) {
|
||||
|
||||
}
|
||||
} else {
|
||||
@@ -173,8 +174,13 @@ class LiveInformation {
|
||||
}
|
||||
}
|
||||
|
||||
if (announcementQueue.contains(announcement)) {
|
||||
announcementQueue.remove(announcement);
|
||||
}
|
||||
|
||||
isPlayingAnnouncement = false;
|
||||
print("Popped announcement queue");
|
||||
print("Queue length after: ${announcementQueue.length}");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -283,6 +289,26 @@ class LiveInformation {
|
||||
print("Audios: ${announcement.audioSources.length}");
|
||||
return;
|
||||
|
||||
} else if (announcement is ManualAnnouncementEntry) {
|
||||
|
||||
List<AudioWrapperSource> audioSources = [];
|
||||
|
||||
for (String filename in announcement.audioFileNames) {
|
||||
audioSources.add(AudioWrapperByteSource(announcementCache[filename]));
|
||||
}
|
||||
|
||||
announcementQueue.add(
|
||||
ManualAnnouncementEntry(
|
||||
shortName: announcement.shortName,
|
||||
informationText: announcement.displayText,
|
||||
audioFileNames: announcement.audioFileNames,
|
||||
audioSources: audioSources,
|
||||
sendToServer: false,
|
||||
)
|
||||
);
|
||||
|
||||
print("Queued manual announcement: ${announcement.displayText} (no server)");
|
||||
return;
|
||||
}
|
||||
|
||||
announcementQueue.add(announcement);
|
||||
@@ -323,35 +349,13 @@ class LiveInformation {
|
||||
// 5 sedonds in the future
|
||||
DateTime scheduledTime = (await getNow()).add(Duration(seconds: 1));
|
||||
|
||||
print("debug2");
|
||||
|
||||
List<String> audioFileNames = [];
|
||||
|
||||
for (AudioWrapperSource source in announcement.audioSources) {
|
||||
|
||||
if (source is AudioWrapperByteSource) {
|
||||
Uint8List? bytes = await source.bytes;
|
||||
|
||||
String? filename = null;
|
||||
|
||||
for (String key in announcementCache.keys) {
|
||||
if (announcementCache[key] == bytes) {
|
||||
filename = key;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
final document = databases.createDocument(
|
||||
documentId: appwrite.ID.unique(),
|
||||
databaseId: ApiConstants.INFO_Q_DATABASE_ID,
|
||||
collectionId: ApiConstants.MANUAL_Q_COLLECTION_ID,
|
||||
data: {
|
||||
"DisplayText": announcement.displayText,
|
||||
"AudioFileNames": audioFileNames,
|
||||
"AudioFileNames": announcement.audioFileNames,
|
||||
|
||||
"ScheduledTime": scheduledTime.toIso8601String(),
|
||||
"SessionID": sessionID,
|
||||
@@ -603,47 +607,6 @@ class LiveInformation {
|
||||
}
|
||||
}
|
||||
|
||||
// Pull the manual queue
|
||||
{
|
||||
final manual_q = await databases.listDocuments(
|
||||
databaseId: ApiConstants.INFO_Q_DATABASE_ID,
|
||||
collectionId: ApiConstants.MANUAL_Q_COLLECTION_ID,
|
||||
queries: [
|
||||
appwrite.Query.search("SessionID", sessionID),
|
||||
appwrite.Query.limit(25),
|
||||
appwrite.Query.offset(0),
|
||||
appwrite.Query.orderDesc('\$createdAt')
|
||||
]
|
||||
);
|
||||
|
||||
for (models.Document doc in manual_q.documents) {
|
||||
|
||||
List<AudioWrapperSource> audioSources = [];
|
||||
|
||||
for (String filename in doc.data["AudioFileNames"]) {
|
||||
audioSources.add(AudioWrapperByteSource(announcementCache[filename]));
|
||||
}
|
||||
|
||||
ManualAnnouncementEntry announcement_clone =
|
||||
ManualAnnouncementEntry(
|
||||
sendToServer: false,
|
||||
|
||||
shortName: "",
|
||||
informationText: doc.data["DisplayText"],
|
||||
|
||||
audioSources: [...audioSources],
|
||||
scheduledTime: doc.data["ScheduledTime"] != null
|
||||
? DateTime.parse(doc.data["ScheduledTime"])
|
||||
: null,
|
||||
|
||||
);
|
||||
|
||||
// sort the queue by timestamp, so the oldest announcements are at the front
|
||||
|
||||
queue.add(announcement_clone);
|
||||
}
|
||||
}
|
||||
|
||||
// pull the destination queue
|
||||
{
|
||||
final dest_q = await databases.listDocuments(
|
||||
@@ -681,6 +644,45 @@ class LiveInformation {
|
||||
}
|
||||
}
|
||||
|
||||
// Pull the manual queue
|
||||
{
|
||||
final manual_q = await databases.listDocuments(
|
||||
databaseId: ApiConstants.INFO_Q_DATABASE_ID,
|
||||
collectionId: ApiConstants.MANUAL_Q_COLLECTION_ID,
|
||||
queries: [
|
||||
appwrite.Query.search("SessionID", sessionID),
|
||||
appwrite.Query.limit(25),
|
||||
appwrite.Query.offset(0),
|
||||
appwrite.Query.orderDesc('\$createdAt')
|
||||
]
|
||||
);
|
||||
|
||||
for (models.Document doc in manual_q.documents) {
|
||||
|
||||
|
||||
|
||||
List<String> audioFileNames = doc.data["AudioFileNames"].cast<String>();
|
||||
|
||||
ManualAnnouncementEntry announcement_clone =
|
||||
ManualAnnouncementEntry(
|
||||
sendToServer: false,
|
||||
|
||||
shortName: "",
|
||||
informationText: doc.data["DisplayText"],
|
||||
audioFileNames: audioFileNames,
|
||||
|
||||
scheduledTime: doc.data["ScheduledTime"] != null
|
||||
? DateTime.parse(doc.data["ScheduledTime"])
|
||||
: null,
|
||||
|
||||
);
|
||||
|
||||
// sort the queue by timestamp, so the oldest announcements are at the front
|
||||
|
||||
queue.add(announcement_clone);
|
||||
}
|
||||
}
|
||||
|
||||
for (AnnouncementQueueEntry entry in queue) {
|
||||
|
||||
// Dont queue announcements that are older than now
|
||||
@@ -749,6 +751,7 @@ class LiveInformation {
|
||||
manual_q_subscription = null;
|
||||
destination_q_subscription?.close();
|
||||
destination_q_subscription = null;
|
||||
print("Restarting realtime");
|
||||
setupRealtime();
|
||||
|
||||
}
|
||||
@@ -788,11 +791,13 @@ class NamedAnnouncementQueueEntry extends AnnouncementQueueEntry {
|
||||
|
||||
class ManualAnnouncementEntry extends NamedAnnouncementQueueEntry {
|
||||
|
||||
final List<String> audioFileNames;
|
||||
|
||||
ManualAnnouncementEntry({
|
||||
required String shortName,
|
||||
required String informationText,
|
||||
required List<AudioWrapperSource> audioSources,
|
||||
required this.audioFileNames,
|
||||
List<AudioWrapperSource> audioSources = const [],
|
||||
DateTime? scheduledTime,
|
||||
DateTime? timestamp,
|
||||
bool sendToServer = true,
|
||||
|
||||
Reference in New Issue
Block a user