diff options
author | XANTRONIX Development | 2022-03-10 10:47:58 -0500 |
---|---|---|
committer | XANTRONIX Development | 2022-03-10 10:47:58 -0500 |
commit | 18bd94f7e42d9410967b15c2db4f62b4c6153575 (patch) | |
tree | 49f678b5754c9f77442a8fbfa8bc10e78c6c2594 | |
parent | c1d4b998ae16a8dd4738e6da2b9f98b61b7e707c (diff) | |
download | xas-18bd94f7e42d9410967b15c2db4f62b4c6153575.tar.gz xas-18bd94f7e42d9410967b15c2db4f62b4c6153575.tar.bz2 xas-18bd94f7e42d9410967b15c2db4f62b4c6153575.zip |
Implement xas_chamber_drone_chorus_seq()
Implement xas_chamber_drone_chorus_seq() to add a chorus of all drones
speaking their selected speech parts
-rw-r--r-- | src/drone.c | 52 |
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; +} |