aboutsummaryrefslogtreecommitdiff
path: root/src/voice/threading.rs
diff options
context:
space:
mode:
authorKyle Simpson <[email protected]>2018-01-31 19:12:56 +0000
committerZeyla Hellyer <[email protected]>2018-01-31 11:12:56 -0800
commit324a288fbb0dd7d135aa9aab876cf39dabb6a02e (patch)
tree24f13043f4ddcb5bc656b7a547170223d826aedb /src/voice/threading.rs
parentFix case insensitivity for aliases (#262) (diff)
downloadserenity-324a288fbb0dd7d135aa9aab876cf39dabb6a02e.tar.xz
serenity-324a288fbb0dd7d135aa9aab876cf39dabb6a02e.zip
Multiple audio stream playback, volume control, pausing
* Fix Speaking state, use latest voice API version * Speaking state would remain stuck on after playing particularly long stretches of audio. So far as I can tell, playing 5 frames of silence BEFORE changing the state seems to do the trick. * Added new constant to make sure the library uses v3 of the voice api, which it is written for. * Heartbeat interval adjusted by * .75 as recommended by Discord. * Initial version of new Audio wrapper. * Single audio file case, as before.. * Loop over all available audio samples. * Combine audio streams, account for volume. * Cheaper explicit Opus silence frames. As per Discord's recommendation, use a well-known 3-byte silence frame when needed. * A bit of cleanup Cleanup some of the code, rename some short-form fields to longer forms (e.g. `s/src/source`), and remove a breaking change. `Handler::play` was changed to return `LockedAudio` instead of `()`. If someone were to rely on `Handler::play` returning `()`, the return type change would break their code. Instead, this functionality has been added to a new `Handler::play_returning` function.
Diffstat (limited to 'src/voice/threading.rs')
-rw-r--r--src/voice/threading.rs13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/voice/threading.rs b/src/voice/threading.rs
index 39b72ed..5731e86 100644
--- a/src/voice/threading.rs
+++ b/src/voice/threading.rs
@@ -15,7 +15,7 @@ pub(crate) fn start(guild_id: GuildId, rx: MpscReceiver<Status>) {
}
fn runner(rx: &MpscReceiver<Status>) {
- let mut sender = None;
+ let mut senders = Vec::new();
let mut receiver = None;
let mut connection = None;
let mut timer = Timer::new(20);
@@ -40,7 +40,14 @@ fn runner(rx: &MpscReceiver<Status>) {
receiver = r;
},
Ok(Status::SetSender(s)) => {
- sender = s;
+ senders.clear();
+
+ if let Some(aud) = s {
+ senders.push(aud);
+ }
+ },
+ Ok(Status::AddSender(s)) => {
+ senders.push(s);
},
Err(TryRecvError::Empty) => {
// If we receieved nothing, then we can perform an update.
@@ -62,7 +69,7 @@ fn runner(rx: &MpscReceiver<Status>) {
// another event.
let error = match connection.as_mut() {
Some(connection) => {
- let cycle = connection.cycle(&mut sender, &mut receiver, &mut timer);
+ let cycle = connection.cycle(&mut senders, &mut receiver, &mut timer);
match cycle {
Ok(()) => false,