diff options
| author | Kyle Simpson <[email protected]> | 2018-01-31 19:12:56 +0000 |
|---|---|---|
| committer | Zeyla Hellyer <[email protected]> | 2018-01-31 11:12:56 -0800 |
| commit | 324a288fbb0dd7d135aa9aab876cf39dabb6a02e (patch) | |
| tree | 24f13043f4ddcb5bc656b7a547170223d826aedb /src/voice/threading.rs | |
| parent | Fix case insensitivity for aliases (#262) (diff) | |
| download | serenity-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.rs | 13 |
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, |