summaryrefslogtreecommitdiffstats
path: root/src/drone.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/drone.c')
-rw-r--r--src/drone.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/drone.c b/src/drone.c
index e3748f1..47508f9 100644
--- a/src/drone.c
+++ b/src/drone.c
@@ -260,3 +260,55 @@ int xas_drone_chamber_event_seq(xas_drone_chamber *chamber,
error_seq_add:
return -1;
}
+
+static void max_speech_duration(xas_drone_chamber *chamber,
+ struct timeval *max) {
+ size_t i;
+
+ for (i=0; i<chamber->drone_count; i++) {
+ xas_drone *drone = chamber->drones[i];
+ xas_bank_player *player = (xas_bank_player *)drone->obj->ctx;
+
+ struct timeval duration;
+
+ xas_bank_entry_duration(drone->bank,
+ player->entry,
+ &duration);
+
+ if (timercmp(&duration, max, >)) {
+ duration.tv_sec = max->tv_sec;
+ duration.tv_usec = max->tv_usec;
+ }
+ }
+}
+
+int xas_drone_chamber_chorus_seq(xas_drone_chamber *chamber,
+ xas_seq *seq,
+ int advance,
+ struct timeval *now) {
+ struct timeval duration,
+ tmp,
+ delay = { 0, 500000 };
+
+ size_t i;
+
+ max_speech_duration(chamber, &duration);
+
+ for (i=0; i<chamber->drone_count; i++) {
+ xas_drone *drone = chamber->drones[i];
+
+ if (xas_seq_add_event_on(seq, drone->obj, *now) < 0) {
+ goto error_seq_add;
+ }
+ }
+
+ if (advance) {
+ timeradd(now, &duration, &tmp);
+ timeradd(&tmp, &delay, now);
+ }
+
+ return 0;
+
+error_seq_add:
+ return -1;
+}