From 4bb3790d27133212ad2a09c93adc9b332731b40c Mon Sep 17 00:00:00 2001 From: servius Date: Wed, 20 Aug 2025 19:59:58 +0000 Subject: [PATCH] deploy: e8c134664ba4063db5a5f06d5417182d2c7514f6 --- .nojekyll | 0 next/crates.js | 2 + next/help.html | 1 + next/index.html | 1 + next/search.index/002c3b58ffb8.js | 1 + next/search.index/0067cbd25dc0.js | 1 + next/search.index/018d3ae80e11.js | 1 + next/search.index/01d15e54e445.js | 1 + next/search.index/022c021a3fe7.js | 1 + next/search.index/026254c8c376.js | 1 + next/search.index/029250aabafd.js | 1 + next/search.index/043e71c93d2e.js | 1 + next/search.index/0482ea5eb759.js | 1 + next/search.index/04b671b519e8.js | 1 + next/search.index/04ce6098b0c3.js | 1 + next/search.index/062cee4b1ca2.js | 1 + next/search.index/067cce3ed747.js | 1 + next/search.index/07e08d4cd0ec.js | 1 + next/search.index/0834bff69a54.js | 1 + next/search.index/0850c9fe7d55.js | 1 + next/search.index/08792f50bf4a.js | 1 + next/search.index/087b1dc56864.js | 1 + next/search.index/096cd6cac292.js | 1 + next/search.index/0aa5f3464354.js | 1 + next/search.index/0b08a89d64b2.js | 1 + next/search.index/0b8c2a02fb0e.js | 1 + next/search.index/0ba045a4b391.js | 1 + next/search.index/0d514af60f20.js | 1 + next/search.index/0da0bedc9654.js | 1 + next/search.index/0dff1b44ff35.js | 1 + next/search.index/0e87582c35fd.js | 1 + next/search.index/0f7f0f9af438.js | 1 + next/search.index/110957c68ffc.js | 1 + next/search.index/11af7eb33055.js | 1 + next/search.index/11bcf18881b0.js | 1 + next/search.index/12338b319c22.js | 1 + next/search.index/13dae58cad89.js | 1 + next/search.index/1522cc1250ba.js | 1 + next/search.index/165145174e7d.js | 1 + next/search.index/16555cc5d940.js | 1 + next/search.index/1752367c249d.js | 1 + next/search.index/17569c26c8e4.js | 1 + next/search.index/176c7851f54a.js | 1 + next/search.index/183ce403bfbf.js | 1 + next/search.index/184d9fce7601.js | 1 + next/search.index/18a7b3e6afe1.js | 1 + next/search.index/1a530b0ee65d.js | 1 + next/search.index/1a71384e82cd.js | 1 + next/search.index/1a7cd887f7b2.js | 1 + next/search.index/1b2386648c6a.js | 1 + next/search.index/1c58faa3938b.js | 1 + next/search.index/1ce2008379ea.js | 1 + next/search.index/1dc63b2fa2a1.js | 1 + next/search.index/1e58411550b3.js | 1 + next/search.index/1fafcc6c4467.js | 1 + next/search.index/20dc681c2899.js | 1 + next/search.index/21183a56c7ce.js | 1 + next/search.index/211d88fb3cc2.js | 1 + next/search.index/213c30d2be3d.js | 1 + next/search.index/23beb180d79b.js | 1 + next/search.index/24dfb17fe4e4.js | 1 + next/search.index/255bbf87faf5.js | 1 + next/search.index/258ee3fd87f1.js | 1 + next/search.index/271f393c711a.js | 1 + next/search.index/27954687e911.js | 1 + next/search.index/2817ae419a69.js | 1 + next/search.index/2968d3c644cf.js | 1 + next/search.index/2987bee4aac4.js | 1 + next/search.index/2a36fc40e01b.js | 1 + next/search.index/2ad19a3b35db.js | 1 + next/search.index/2b51b18b5742.js | 1 + next/search.index/2b66273bc113.js | 1 + next/search.index/2cab37783715.js | 1 + next/search.index/2cff377c39e8.js | 1 + next/search.index/2dc25503fff4.js | 1 + next/search.index/2e481fc27810.js | 1 + next/search.index/2e5da51df9f6.js | 1 + next/search.index/2e860ea8a4f2.js | 1 + next/search.index/2e996cb856e4.js | 1 + next/search.index/2e9a232f12b0.js | 1 + next/search.index/2f45a433d713.js | 1 + next/search.index/2f4665b80234.js | 1 + next/search.index/2f6dc4ca248a.js | 1 + next/search.index/2f7d77e246ab.js | 1 + next/search.index/3031ee7b8d94.js | 1 + next/search.index/30483236173d.js | 1 + next/search.index/30550bdb3944.js | 1 + next/search.index/30f44cbd03cf.js | 1 + next/search.index/310241be6c37.js | 1 + next/search.index/3163613c5864.js | 1 + next/search.index/32c3b12425b3.js | 1 + next/search.index/3361d2c9b325.js | 1 + next/search.index/347541ae8406.js | 1 + next/search.index/354eb1ec5580.js | 1 + next/search.index/35cd1ddc2f76.js | 1 + next/search.index/363bdc9d045c.js | 1 + next/search.index/36aadc662f59.js | 1 + next/search.index/36ebbf1030ff.js | 1 + next/search.index/377b1bb762ce.js | 1 + next/search.index/37bfd11b7cdf.js | 1 + next/search.index/37c41032c04a.js | 1 + next/search.index/37f1835113a5.js | 1 + next/search.index/380331c00171.js | 1 + next/search.index/3855009ffa81.js | 1 + next/search.index/393aefc0981d.js | 1 + next/search.index/3a4498eba322.js | 1 + next/search.index/3c48de9a8fcc.js | 1 + next/search.index/3ca9a436fe4a.js | 1 + next/search.index/3cc4cf89765d.js | 1 + next/search.index/3d76c5dfd56f.js | 1 + next/search.index/3d7b622cf5f0.js | 1 + next/search.index/3dbf9986d957.js | 1 + next/search.index/410df31576b1.js | 1 + next/search.index/41b7b4b5a9f8.js | 1 + next/search.index/429673ecff10.js | 1 + next/search.index/43642f0554fb.js | 1 + next/search.index/43e0a9e30fbc.js | 1 + next/search.index/4532e4b8cde3.js | 1 + next/search.index/456179eab39b.js | 1 + next/search.index/45b1d1b8c35a.js | 1 + next/search.index/46b8a53139d4.js | 1 + next/search.index/4743bf93c488.js | 1 + next/search.index/48a5468ce67d.js | 1 + next/search.index/4941b6642e97.js | 1 + next/search.index/4a4f3b215889.js | 1 + next/search.index/4b914460b29e.js | 1 + next/search.index/4d4559dd6fa9.js | 1 + next/search.index/4df0130a6271.js | 1 + next/search.index/4e7b9f439b00.js | 1 + next/search.index/4eae15df1e2d.js | 1 + next/search.index/4ecb426b2562.js | 1 + next/search.index/4f5f1e881236.js | 1 + next/search.index/50d716716da5.js | 1 + next/search.index/51b881267f6b.js | 1 + next/search.index/51cc9520107d.js | 1 + next/search.index/52f9eb7d91b4.js | 1 + next/search.index/5457d948c356.js | 1 + next/search.index/566c1a5d2f97.js | 1 + next/search.index/56e6e83300b1.js | 1 + next/search.index/571a106db7ce.js | 1 + next/search.index/574423096545.js | 1 + next/search.index/579a6500b67f.js | 1 + next/search.index/57e0dc82949f.js | 1 + next/search.index/57e2e3b3c6a2.js | 1 + next/search.index/592ef3c1a7b1.js | 1 + next/search.index/5a971f1594db.js | 1 + next/search.index/5acfcab0ff67.js | 1 + next/search.index/5b82a1cbd32a.js | 1 + next/search.index/5bedf403fe7b.js | 1 + next/search.index/5bfaeff63ad7.js | 1 + next/search.index/5c2ce4493c46.js | 1 + next/search.index/5ca7f7a0ef0c.js | 1 + next/search.index/5ce5860c5a78.js | 1 + next/search.index/5d6e7636da6f.js | 1 + next/search.index/5d77ab1b094f.js | 1 + next/search.index/5e422f6cce0e.js | 1 + next/search.index/5ec91ca9ae6e.js | 1 + next/search.index/5fd5c46fb900.js | 1 + next/search.index/605707ff6e5f.js | 1 + next/search.index/62aaa95fd7bf.js | 1 + next/search.index/62aca6fe9467.js | 1 + next/search.index/62d8e47e568b.js | 1 + next/search.index/633e67d8242a.js | 1 + next/search.index/636c6c7710f3.js | 1 + next/search.index/63de701acfa2.js | 1 + next/search.index/65122f357f1e.js | 1 + next/search.index/651817a5a3e1.js | 1 + next/search.index/6538b5f1d2c3.js | 1 + next/search.index/6552e7bfa6ba.js | 1 + next/search.index/65de76d0d022.js | 1 + next/search.index/66867bfa8306.js | 1 + next/search.index/67acc2b929b0.js | 1 + next/search.index/68133e83b795.js | 1 + next/search.index/687aee40b564.js | 1 + next/search.index/6956faad3fef.js | 1 + next/search.index/69c133a67046.js | 1 + next/search.index/6a8085681108.js | 1 + next/search.index/6b1a7415a18b.js | 1 + next/search.index/6b9a8d84c48d.js | 1 + next/search.index/6cf638a43782.js | 1 + next/search.index/6dc48749d06b.js | 1 + next/search.index/6dd8980fe87a.js | 1 + next/search.index/6de836c624ad.js | 1 + next/search.index/6e9a03548e4c.js | 1 + next/search.index/6ebf42077351.js | 1 + next/search.index/6ee7c60d5694.js | 1 + next/search.index/6fdf54bb3dfb.js | 1 + next/search.index/710290bc6833.js | 1 + next/search.index/713cd62b6b7f.js | 1 + next/search.index/7190f2a95af0.js | 1 + next/search.index/71ee74b3d46a.js | 1 + next/search.index/720e25dd6cfe.js | 1 + next/search.index/73ae90f8461e.js | 1 + next/search.index/73d431e93292.js | 1 + next/search.index/7458d5dd0cdb.js | 1 + next/search.index/74728043195a.js | 1 + next/search.index/751b30b4ce58.js | 1 + next/search.index/7578054eaa24.js | 1 + next/search.index/75a6e289042e.js | 1 + next/search.index/75f619e98e16.js | 1 + next/search.index/769bb8037d22.js | 1 + next/search.index/770d204f7fb9.js | 1 + next/search.index/778f68240ab0.js | 1 + next/search.index/77e2f3d7e3cd.js | 1 + next/search.index/7814189ffefa.js | 1 + next/search.index/785e189ddfc5.js | 1 + next/search.index/79019f6dc6f9.js | 1 + next/search.index/7921a71eafc2.js | 1 + next/search.index/7a1578200658.js | 1 + next/search.index/7a3b8590a6e8.js | 1 + next/search.index/7a54d85ed91a.js | 1 + next/search.index/7a61a5c277c5.js | 1 + next/search.index/7b442897524b.js | 1 + next/search.index/7b50db887c8e.js | 1 + next/search.index/7bc75868461e.js | 1 + next/search.index/7c7d582a16fb.js | 1 + next/search.index/7cb498816342.js | 1 + next/search.index/7d7b74927675.js | 1 + next/search.index/7e714c3342ed.js | 1 + next/search.index/7ec59624e8f4.js | 1 + next/search.index/7f52a58441b8.js | 1 + next/search.index/7f5a0d986575.js | 1 + next/search.index/7f779ec227ec.js | 1 + next/search.index/7fc769eceb8f.js | 1 + next/search.index/alias/a762150c532c.js | 1 + next/search.index/crateNames/8f46c39274d9.js | 1 + next/search.index/desc/c103d4fb29fa.js | 1 + next/search.index/entry/afe1a566fad7.js | 1 + next/search.index/function/449b35841f93.js | 1 + .../generic_inverted_index/9637ece26d64.js | 1 + next/search.index/name/40615c89e588.js | 1 + .../normalizedName/2e19990ccf39.js | 1 + next/search.index/path/634537828d5e.js | 1 + next/search.index/root.js | 1 + next/search.index/type/1e26334c4bc1.js | 1 + next/settings.html | 1 + next/songbird/all.html | 1 + next/songbird/config/struct.Config.html | 11 + .../constants/constant.AUDIO_FRAME_RATE.html | 2 + .../constants/constant.CHILD_BUFFER_LEN.html | 2 + .../constants/constant.DEFAULT_BITRATE.html | 2 + .../constants/constant.FRAME_LEN_MS.html | 2 + .../constant.MONO_FRAME_BYTE_SIZE.html | 2 + .../constants/constant.MONO_FRAME_SIZE.html | 3 + .../constants/constant.RTP_PROFILE_TYPE.html | 2 + .../constants/constant.RTP_VERSION.html | 2 + .../constants/constant.SAMPLE_RATE.html | 2 + .../constants/constant.SAMPLE_RATE_RAW.html | 2 + .../constants/constant.SILENT_FRAME.html | 2 + .../constant.STEREO_FRAME_BYTE_SIZE.html | 2 + .../constants/constant.STEREO_FRAME_SIZE.html | 2 + .../constants/constant.TIMESTEP_LENGTH.html | 2 + .../constants/constant.UDP_KEEPALIVE_GAP.html | 4 + .../constant.UDP_KEEPALIVE_GAP_MS.html | 4 + .../constant.VOICE_GATEWAY_VERSION.html | 2 + .../constants/constant.VOICE_PACKET_MAX.html | 3 + next/songbird/constants/index.html | 2 + next/songbird/constants/sidebar-items.js | 1 + .../driver/connection/error/enum.Error.html | 11 + .../driver/connection/error/type.Result.html | 11 + .../driver/crypto/enum.CryptoMode.html | 11 + .../driver/decode_mode/enum.Channels.html | 11 + .../driver/decode_mode/enum.DecodeMode.html | 11 + .../driver/decode_mode/enum.SampleRate.html | 11 + .../decode_mode/struct.DecodeConfig.html | 11 + next/songbird/driver/enum.Bitrate.html | 56 ++ next/songbird/driver/enum.Channels.html | 56 ++ next/songbird/driver/enum.CryptoMode.html | 83 ++ next/songbird/driver/enum.DecodeMode.html | 61 ++ next/songbird/driver/enum.MixMode.html | 54 ++ next/songbird/driver/enum.SampleRate.html | 60 ++ next/songbird/driver/enum.SchedulerError.html | 41 + next/songbird/driver/enum.SchedulerMode.html | 43 + .../driver/fn.get_default_scheduler.html | 4 + next/songbird/driver/index.html | 12 + .../driver/mix_mode/enum.MixMode.html | 11 + next/songbird/driver/retry/enum.Strategy.html | 46 + next/songbird/driver/retry/index.html | 2 + next/songbird/driver/retry/sidebar-items.js | 1 + .../driver/retry/strategy/enum.Strategy.html | 11 + .../strategy/struct.ExponentialBackoff.html | 11 + .../retry/struct.ExponentialBackoff.html | 55 ++ next/songbird/driver/retry/struct.Retry.html | 50 + .../driver/scheduler/config/enum.Mode.html | 11 + .../scheduler/config/struct.Config.html | 11 + .../songbird/driver/scheduler/enum.Error.html | 11 + .../scheduler/fn.get_default_scheduler.html | 11 + .../scheduler/stats/struct.LiveStatBlock.html | 11 + .../driver/scheduler/struct.Scheduler.html | 11 + next/songbird/driver/sidebar-items.js | 1 + next/songbird/driver/struct.Connect.html | 145 +++ next/songbird/driver/struct.DecodeConfig.html | 56 ++ .../driver/struct.DisposalThread.html | 38 + next/songbird/driver/struct.Driver.html | 106 +++ .../songbird/driver/struct.LiveStatBlock.html | 41 + next/songbird/driver/struct.Scheduler.html | 51 + .../driver/struct.SchedulerConfig.html | 47 + .../tasks/disposal/struct.DisposalThread.html | 11 + next/songbird/error/enum.ConnectionError.html | 66 ++ next/songbird/error/enum.JoinError.html | 72 ++ next/songbird/error/index.html | 4 + next/songbird/error/sidebar-items.js | 1 + next/songbird/error/struct.JsonError.html | 113 +++ .../songbird/error/type.ConnectionResult.html | 7 + next/songbird/error/type.JoinResult.html | 7 + .../data/connect/struct.ConnectData.html | 11 + .../data/disconnect/enum.DisconnectKind.html | 11 + .../disconnect/enum.DisconnectReason.html | 11 + .../disconnect/struct.DisconnectData.html | 11 + next/songbird/events/context/data/index.html | 11 + .../context/data/rtcp/struct.RtcpData.html | 11 + .../context/data/rtp/struct.RtpData.html | 11 + .../context/data/voice/struct.VoiceData.html | 11 + .../context/data/voice/struct.VoiceTick.html | 11 + .../events/context/enum.EventContext.html | 11 + .../context_data/enum.DisconnectKind.html | 64 ++ .../context_data/enum.DisconnectReason.html | 67 ++ next/songbird/events/context_data/index.html | 2 + .../events/context_data/sidebar-items.js | 1 + .../context_data/struct.ConnectData.html | 69 ++ .../context_data/struct.DisconnectData.html | 52 ++ .../events/context_data/struct.RtcpData.html | 58 ++ .../events/context_data/struct.RtpData.html | 59 ++ .../events/context_data/struct.VoiceData.html | 58 ++ .../events/context_data/struct.VoiceTick.html | 54 ++ next/songbird/events/core/enum.CoreEvent.html | 11 + .../events/data/struct.EventData.html | 11 + next/songbird/events/enum.CoreEvent.html | 92 ++ next/songbird/events/enum.Event.html | 79 ++ next/songbird/events/enum.EventContext.html | 61 ++ next/songbird/events/enum.TrackEvent.html | 72 ++ next/songbird/events/enum.UntimedEvent.html | 56 ++ next/songbird/events/index.html | 35 + next/songbird/events/sidebar-items.js | 1 + .../events/store/struct.EventStore.html | 11 + next/songbird/events/struct.EventData.html | 58 ++ next/songbird/events/struct.EventStore.html | 43 + .../events/track/enum.TrackEvent.html | 11 + next/songbird/events/trait.EventHandler.html | 21 + .../events/untimed/enum.UntimedEvent.html | 11 + next/songbird/handler/struct.Call.html | 11 + next/songbird/id/index.html | 2 + next/songbird/id/sidebar-items.js | 1 + next/songbird/id/struct.ChannelId.html | 51 + next/songbird/id/struct.GuildId.html | 51 + next/songbird/id/struct.UserId.html | 51 + next/songbird/index.html | 40 + next/songbird/info/struct.ConnectionInfo.html | 11 + .../struct.AsyncAdapterStream.html | 11 + .../async_adapter/trait.AsyncMediaSource.html | 11 + .../cached/compressed/struct.Compressed.html | 11 + .../cached/compressed/struct.Config.html | 11 + .../compressed/struct.OpusCompressor.html | 11 + .../decompressed/struct.Decompressed.html | 11 + .../cached/error/enum.CodecCacheError.html | 11 + .../adapters/cached/error/enum.Error.html | 11 + .../cached/fn.compressed_cost_per_sec.html | 11 + .../adapters/cached/fn.default_config.html | 11 + .../adapters/cached/fn.raw_cost_per_sec.html | 11 + .../adapters/cached/hint/enum.LengthHint.html | 11 + .../cached/hint/fn.apply_length_hint.html | 11 + .../songbird/input/adapters/cached/index.html | 11 + .../adapters/cached/memory/struct.Memory.html | 11 + .../adapters/child/struct.ChildContainer.html | 11 + .../raw_adapter/struct.RawAdapter.html | 11 + .../input/audiostream/struct.AudioStream.html | 11 + .../input/cached/enum.CodecCacheError.html | 58 ++ next/songbird/input/cached/enum.Error.html | 48 + .../input/cached/enum.LengthHint.html | 45 + .../input/cached/fn.apply_length_hint.html | 4 + .../cached/fn.compressed_cost_per_sec.html | 2 + .../input/cached/fn.default_config.html | 4 + .../input/cached/fn.raw_cost_per_sec.html | 2 + next/songbird/input/cached/index.html | 9 + next/songbird/input/cached/sidebar-items.js | 1 + .../input/cached/struct.Compressed.html | 114 +++ next/songbird/input/cached/struct.Config.html | 48 + .../input/cached/struct.Decompressed.html | 112 +++ next/songbird/input/cached/struct.Memory.html | 105 +++ .../input/cached/struct.OpusCompressor.html | 41 + .../input/codecs/dca/struct.DcaReader.html | 11 + .../input/codecs/fn.get_codec_registry.html | 2 + next/songbird/input/codecs/fn.get_probe.html | 2 + next/songbird/input/codecs/index.html | 2 + .../input/codecs/opus/struct.OpusDecoder.html | 11 + .../input/codecs/raw/struct.RawReader.html | 11 + next/songbird/input/codecs/sidebar-items.js | 1 + .../input/codecs/struct.DcaReader.html | 43 + .../input/codecs/struct.OpusDecoder.html | 45 + .../input/codecs/struct.RawReader.html | 50 + .../songbird/input/compose/trait.Compose.html | 11 + .../songbird/input/enum.AudioStreamError.html | 48 + .../songbird/input/enum.AuxMetadataError.html | 45 + next/songbird/input/enum.Input.html | 169 ++++ next/songbird/input/enum.LiveInput.html | 62 ++ .../input/enum.MakePlayableError.html | 45 + next/songbird/input/enum.MetadataError.html | 44 + .../input/error/enum.AudioStreamError.html | 11 + .../input/error/enum.AuxMetadataError.html | 11 + .../input/error/enum.MakePlayableError.html | 11 + .../input/error/enum.MetadataError.html | 11 + next/songbird/input/index.html | 48 + .../input/live_input/enum.LiveInput.html | 11 + .../input/metadata/struct.AuxMetadata.html | 11 + .../input/metadata/struct.Metadata.html | 11 + next/songbird/input/parsed/struct.Parsed.html | 11 + next/songbird/input/sidebar-items.js | 1 + .../input/sources/file/struct.File.html | 11 + .../input/sources/hls/struct.HlsRequest.html | 11 + .../sources/http/struct.HttpRequest.html | 11 + .../sources/struct.AsyncReadOnlySource.html | 11 + .../input/sources/ytdl/struct.YoutubeDl.html | 11 + .../input/struct.AsyncAdapterStream.html | 94 ++ .../input/struct.AsyncReadOnlySource.html | 121 +++ next/songbird/input/struct.AudioStream.html | 46 + next/songbird/input/struct.AuxMetadata.html | 76 ++ .../songbird/input/struct.ChildContainer.html | 92 ++ next/songbird/input/struct.File.html | 57 ++ next/songbird/input/struct.HlsRequest.html | 54 ++ next/songbird/input/struct.HttpRequest.html | 67 ++ next/songbird/input/struct.Metadata.html | 49 + next/songbird/input/struct.Parsed.html | 53 ++ next/songbird/input/struct.RawAdapter.html | 96 ++ next/songbird/input/struct.YoutubeDl.html | 75 ++ .../input/trait.AsyncMediaSource.html | 37 + next/songbird/input/trait.Compose.html | 41 + .../utils/fn.byte_count_to_timestamp.html | 3 + next/songbird/input/utils/fn.decoder.html | 2 + .../utils/fn.sample_count_to_timestamp.html | 2 + .../utils/fn.timestamp_to_byte_count.html | 3 + .../utils/fn.timestamp_to_sample_count.html | 2 + next/songbird/input/utils/index.html | 2 + next/songbird/input/utils/sidebar-items.js | 1 + next/songbird/join/index.html | 2 + next/songbird/join/sidebar-items.js | 1 + next/songbird/join/struct.Join.html | 149 +++ next/songbird/join/struct.JoinGateway.html | 148 +++ next/songbird/manager/struct.Iter.html | 11 + next/songbird/manager/struct.Songbird.html | 11 + next/songbird/serenity/fn.get.html | 3 + next/songbird/serenity/fn.register.html | 3 + .../serenity/fn.register_from_config.html | 6 + next/songbird/serenity/fn.register_with.html | 6 + next/songbird/serenity/index.html | 6 + next/songbird/serenity/sidebar-items.js | 1 + .../songbird/serenity/struct.SongbirdKey.html | 35 + .../songbird/serenity/trait.SerenityInit.html | 14 + next/songbird/shards/enum.Shard.html | 54 ++ next/songbird/shards/enum.Sharder.html | 43 + next/songbird/shards/index.html | 3 + next/songbird/shards/sidebar-items.js | 1 + .../shards/struct.SerenityShardHandle.html | 36 + .../shards/struct.SerenitySharder.html | 37 + next/songbird/shards/struct.TwilightMap.html | 39 + .../songbird/shards/trait.GenericSharder.html | 11 + next/songbird/shards/trait.VoiceUpdate.html | 27 + next/songbird/sidebar-items.js | 1 + next/songbird/struct.Call.html | 191 ++++ next/songbird/struct.Config.html | 141 +++ next/songbird/struct.ConnectionInfo.html | 65 ++ next/songbird/struct.Iter.html | 242 +++++ next/songbird/struct.Songbird.html | 158 ++++ .../songbird/tracks/action/struct.Action.html | 11 + next/songbird/tracks/enum.ControlError.html | 56 ++ next/songbird/tracks/enum.LoopState.html | 53 ++ next/songbird/tracks/enum.PlayError.html | 51 + next/songbird/tracks/enum.PlayMode.html | 58 ++ next/songbird/tracks/enum.ReadyState.html | 54 ++ .../tracks/error/enum.ControlError.html | 11 + .../songbird/tracks/error/enum.PlayError.html | 11 + .../tracks/error/type.TrackResult.html | 11 + .../tracks/handle/struct.TrackCallback.html | 11 + .../tracks/handle/struct.TrackHandle.html | 11 + next/songbird/tracks/index.html | 18 + .../tracks/looping/enum.LoopState.html | 11 + next/songbird/tracks/mode/enum.PlayMode.html | 11 + next/songbird/tracks/queue/struct.Queued.html | 11 + .../tracks/queue/struct.TrackQueue.html | 11 + .../tracks/ready/enum.ReadyState.html | 11 + next/songbird/tracks/sidebar-items.js | 1 + .../tracks/state/struct.TrackState.html | 11 + next/songbird/tracks/struct.Action.html | 40 + next/songbird/tracks/struct.Queued.html | 87 ++ next/songbird/tracks/struct.Track.html | 92 ++ .../songbird/tracks/struct.TrackCallback.html | 43 + next/songbird/tracks/struct.TrackHandle.html | 92 ++ next/songbird/tracks/struct.TrackQueue.html | 107 +++ next/songbird/tracks/struct.TrackState.html | 57 ++ next/songbird/tracks/struct.View.html | 50 + next/songbird/tracks/type.TrackResult.html | 7 + next/songbird/tracks/view/struct.View.html | 11 + next/src-files.js | 2 + next/src/songbird/config.rs.html | 443 +++++++++ next/src/songbird/constants.rs.html | 131 +++ .../songbird/driver/connection/error.rs.html | 138 +++ .../songbird/driver/connection/mod.rs.html | 372 ++++++++ next/src/songbird/driver/crypto.rs.html | 587 ++++++++++++ next/src/songbird/driver/decode_mode.rs.html | 125 +++ next/src/songbird/driver/mix_mode.rs.html | 59 ++ next/src/songbird/driver/mod.rs.html | 357 +++++++ next/src/songbird/driver/retry/mod.rs.html | 49 + .../songbird/driver/retry/strategy.rs.html | 76 ++ .../songbird/driver/scheduler/config.rs.html | 64 ++ .../songbird/driver/scheduler/idle.rs.html | 335 +++++++ .../songbird/driver/scheduler/live.rs.html | 824 ++++++++++++++++ .../src/songbird/driver/scheduler/mod.rs.html | 180 ++++ .../songbird/driver/scheduler/stats.rs.html | 134 +++ .../songbird/driver/scheduler/task.rs.html | 214 +++++ .../songbird/driver/tasks/disposal.rs.html | 40 + next/src/songbird/driver/tasks/error.rs.html | 102 ++ next/src/songbird/driver/tasks/events.rs.html | 139 +++ .../driver/tasks/message/core.rs.html | 33 + .../driver/tasks/message/disposal.rs.html | 9 + .../driver/tasks/message/events.rs.html | 34 + .../driver/tasks/message/mixer.rs.html | 60 ++ .../songbird/driver/tasks/message/mod.rs.html | 55 ++ .../driver/tasks/message/udp_rx.rs.html | 17 + .../songbird/driver/tasks/message/ws.rs.html | 12 + .../driver/tasks/mixer/mix_logic.rs.html | 444 +++++++++ .../songbird/driver/tasks/mixer/mod.rs.html | 877 ++++++++++++++++++ .../songbird/driver/tasks/mixer/pool.rs.html | 141 +++ .../driver/tasks/mixer/result.rs.html | 55 ++ .../songbird/driver/tasks/mixer/state.rs.html | 105 +++ .../songbird/driver/tasks/mixer/track.rs.html | 401 ++++++++ .../songbird/driver/tasks/mixer/util.rs.html | 20 + next/src/songbird/driver/tasks/mod.rs.html | 352 +++++++ .../driver/tasks/udp_rx/decode_sizes.rs.html | 42 + .../songbird/driver/tasks/udp_rx/mod.rs.html | 277 ++++++ .../tasks/udp_rx/playout_buffer.rs.html | 203 ++++ .../driver/tasks/udp_rx/ssrc_state.rs.html | 202 ++++ next/src/songbird/driver/tasks/ws.rs.html | 278 ++++++ next/src/songbird/error.rs.html | 148 +++ .../events/context/data/connect.rs.html | 32 + .../events/context/data/disconnect.rs.html | 125 +++ .../songbird/events/context/data/mod.rs.html | 18 + .../songbird/events/context/data/rtcp.rs.html | 29 + .../songbird/events/context/data/rtp.rs.html | 31 + .../events/context/data/voice.rs.html | 43 + .../events/context/internal_data.rs.html | 82 ++ next/src/songbird/events/context/mod.rs.html | 114 +++ next/src/songbird/events/core.rs.html | 77 ++ next/src/songbird/events/data.rs.html | 88 ++ next/src/songbird/events/mod.rs.html | 147 +++ next/src/songbird/events/store.rs.html | 262 ++++++ next/src/songbird/events/track.rs.html | 35 + next/src/songbird/events/untimed.rs.html | 29 + next/src/songbird/handler.rs.html | 490 ++++++++++ next/src/songbird/id.rs.html | 123 +++ next/src/songbird/info.rs.html | 203 ++++ .../input/adapters/async_adapter.rs.html | 385 ++++++++ .../input/adapters/cached/compressed.rs.html | 534 +++++++++++ .../adapters/cached/decompressed.rs.html | 140 +++ .../input/adapters/cached/error.rs.html | 144 +++ .../input/adapters/cached/hint.rs.html | 40 + .../input/adapters/cached/memory.rs.html | 111 +++ .../input/adapters/cached/mod.rs.html | 49 + .../input/adapters/cached/util.rs.html | 458 +++++++++ .../src/songbird/input/adapters/child.rs.html | 91 ++ next/src/songbird/input/adapters/mod.rs.html | 6 + .../input/adapters/raw_adapter.rs.html | 114 +++ next/src/songbird/input/audiostream.rs.html | 12 + .../input/codecs/dca/metadata.rs.html | 53 ++ .../src/songbird/input/codecs/dca/mod.rs.html | 342 +++++++ next/src/songbird/input/codecs/mod.rs.html | 36 + next/src/songbird/input/codecs/opus.rs.html | 167 ++++ next/src/songbird/input/codecs/raw.rs.html | 181 ++++ next/src/songbird/input/compose.rs.html | 40 + next/src/songbird/input/error.rs.html | 168 ++++ next/src/songbird/input/live_input.rs.html | 167 ++++ .../songbird/input/metadata/ffprobe.rs.html | 175 ++++ next/src/songbird/input/metadata/mod.rs.html | 110 +++ next/src/songbird/input/metadata/ytdl.rs.html | 56 ++ next/src/songbird/input/mod.rs.html | 382 ++++++++ next/src/songbird/input/parsed.rs.html | 31 + next/src/songbird/input/sources/file.rs.html | 86 ++ next/src/songbird/input/sources/hls.rs.html | 102 ++ next/src/songbird/input/sources/http.rs.html | 295 ++++++ next/src/songbird/input/sources/mod.rs.html | 90 ++ next/src/songbird/input/sources/ytdl.rs.html | 317 +++++++ next/src/songbird/input/utils.rs.html | 45 + next/src/songbird/join.rs.html | 171 ++++ next/src/songbird/lib.rs.html | 133 +++ next/src/songbird/manager.rs.html | 505 ++++++++++ next/src/songbird/serenity.rs.html | 89 ++ next/src/songbird/shards.rs.html | 296 ++++++ next/src/songbird/tracks/action.rs.html | 43 + next/src/songbird/tracks/command.rs.html | 62 ++ next/src/songbird/tracks/error.rs.html | 110 +++ next/src/songbird/tracks/handle.rs.html | 301 ++++++ next/src/songbird/tracks/looping.rs.html | 128 +++ next/src/songbird/tracks/mod.rs.html | 220 +++++ next/src/songbird/tracks/mode.rs.html | 78 ++ next/src/songbird/tracks/queue.rs.html | 499 ++++++++++ next/src/songbird/tracks/ready.rs.html | 21 + next/src/songbird/tracks/state.rs.html | 64 ++ next/src/songbird/tracks/view.rs.html | 30 + next/src/songbird/ws.rs.html | 162 ++++ next/static.files/COPYRIGHT-7fb11f4e.txt | 71 ++ .../FiraMono-Medium-86f75c8c.woff2 | Bin 0 -> 64572 bytes .../FiraMono-Regular-87c26294.woff2 | Bin 0 -> 64868 bytes .../FiraSans-Italic-81dc35de.woff2 | Bin 0 -> 136300 bytes .../FiraSans-LICENSE-05ab6dbd.txt | 98 ++ .../FiraSans-Medium-e1aa3f0a.woff2 | Bin 0 -> 132780 bytes .../FiraSans-MediumItalic-ccf7e434.woff2 | Bin 0 -> 140588 bytes .../FiraSans-Regular-0fe48ade.woff2 | Bin 0 -> 129188 bytes next/static.files/LICENSE-APACHE-a60eea81.txt | 201 ++++ next/static.files/LICENSE-MIT-23f18e03.txt | 23 + .../NanumBarunGothic-13b3dcba.ttf.woff2 | Bin 0 -> 399468 bytes .../NanumBarunGothic-LICENSE-a37d393b.txt | 103 ++ .../SourceCodePro-It-fc8b9304.ttf.woff2 | Bin 0 -> 44896 bytes .../SourceCodePro-LICENSE-67f54ca7.txt | 97 ++ .../SourceCodePro-Regular-8badfe75.ttf.woff2 | Bin 0 -> 52228 bytes .../SourceCodePro-Semibold-aa29a496.ttf.woff2 | Bin 0 -> 52348 bytes .../SourceSerif4-Bold-6d4fd4c0.ttf.woff2 | Bin 0 -> 81540 bytes .../SourceSerif4-It-ca3b17ed.ttf.woff2 | Bin 0 -> 59716 bytes .../SourceSerif4-LICENSE-a2cfd9d5.md | 98 ++ .../SourceSerif4-Regular-6b053e98.ttf.woff2 | Bin 0 -> 76260 bytes .../SourceSerif4-Semibold-457a13ac.ttf.woff2 | Bin 0 -> 80732 bytes next/static.files/favicon-044be391.svg | 24 + next/static.files/favicon-32x32-6580c154.png | Bin 0 -> 1125 bytes next/static.files/main-b6a35c53.js | 24 + next/static.files/normalize-9960930a.css | 2 + next/static.files/noscript-32bb7600.css | 1 + next/static.files/rust-logo-9a9549ea.svg | 61 ++ next/static.files/rustdoc-528d32ef.css | 76 ++ next/static.files/scrape-examples-5e967b76.js | 1 + next/static.files/search-5f24b69e.js | 5 + next/static.files/settings-c38705f0.js | 17 + next/static.files/src-script-813739b1.js | 1 + next/static.files/storage-1b37d467.js | 27 + next/static.files/stringdex-0e748618.js | 2 + next/trait.impl/core/clone/trait.Clone.js | 9 + next/trait.impl/core/cmp/trait.Eq.js | 9 + next/trait.impl/core/cmp/trait.Ord.js | 9 + next/trait.impl/core/cmp/trait.PartialEq.js | 9 + next/trait.impl/core/cmp/trait.PartialOrd.js | 9 + next/trait.impl/core/convert/trait.From.js | 9 + next/trait.impl/core/default/trait.Default.js | 9 + next/trait.impl/core/error/trait.Error.js | 9 + next/trait.impl/core/fmt/trait.Debug.js | 9 + next/trait.impl/core/fmt/trait.Display.js | 9 + .../core/future/future/trait.Future.js | 9 + next/trait.impl/core/hash/trait.Hash.js | 9 + .../iter/traits/collect/trait.IntoIterator.js | 9 + .../iter/traits/iterator/trait.Iterator.js | 9 + next/trait.impl/core/marker/trait.Copy.js | 9 + next/trait.impl/core/marker/trait.Freeze.js | 9 + next/trait.impl/core/marker/trait.Send.js | 9 + .../core/marker/trait.StructuralPartialEq.js | 9 + next/trait.impl/core/marker/trait.Sync.js | 9 + next/trait.impl/core/marker/trait.Unpin.js | 9 + .../core/marker/trait.UnsafeUnpin.js | 9 + next/trait.impl/core/ops/deref/trait.Deref.js | 9 + .../core/ops/deref/trait.DerefMut.js | 9 + next/trait.impl/core/ops/drop/trait.Drop.js | 9 + .../panic/unwind_safe/trait.RefUnwindSafe.js | 9 + .../panic/unwind_safe/trait.UnwindSafe.js | 9 + .../core/str/traits/trait.FromStr.js | 9 + .../bridge/voice/trait.VoiceGatewayManager.js | 9 + .../async_adapter/trait.AsyncMediaSource.js | 9 + .../songbird/input/compose/trait.Compose.js | 9 + .../songbird/serenity/trait.SerenityInit.js | 9 + .../songbird/shards/trait.VoiceUpdate.js | 9 + next/trait.impl/std/io/trait.Read.js | 9 + next/trait.impl/std/io/trait.Seek.js | 9 + .../standard/trait.NeedsBytes.js | 9 + .../streamcatcher/standard/trait.Transform.js | 9 + .../streamcatcher/state/trait.Stateful.js | 9 + .../symphonia_core/codecs/trait.Decoder.js | 9 + .../formats/trait.FormatReader.js | 9 + .../symphonia_core/io/trait.MediaSource.js | 9 + .../probe/trait.QueryDescriptor.js | 9 + .../tokio/io/async_read/trait.AsyncRead.js | 9 + .../tokio/io/async_seek/trait.AsyncSeek.js | 9 + .../typemap_rev/trait.TypeMapKey.js | 9 + next/type.impl/core/result/enum.Result.js | 9 + 676 files changed, 27496 insertions(+) create mode 100644 .nojekyll create mode 100644 next/crates.js create mode 100644 next/help.html create mode 100644 next/index.html create mode 100644 next/search.index/002c3b58ffb8.js create mode 100644 next/search.index/0067cbd25dc0.js create mode 100644 next/search.index/018d3ae80e11.js create mode 100644 next/search.index/01d15e54e445.js create mode 100644 next/search.index/022c021a3fe7.js create mode 100644 next/search.index/026254c8c376.js create mode 100644 next/search.index/029250aabafd.js create mode 100644 next/search.index/043e71c93d2e.js create mode 100644 next/search.index/0482ea5eb759.js create mode 100644 next/search.index/04b671b519e8.js create mode 100644 next/search.index/04ce6098b0c3.js create mode 100644 next/search.index/062cee4b1ca2.js create mode 100644 next/search.index/067cce3ed747.js create mode 100644 next/search.index/07e08d4cd0ec.js create mode 100644 next/search.index/0834bff69a54.js create mode 100644 next/search.index/0850c9fe7d55.js create mode 100644 next/search.index/08792f50bf4a.js create mode 100644 next/search.index/087b1dc56864.js create mode 100644 next/search.index/096cd6cac292.js create mode 100644 next/search.index/0aa5f3464354.js create mode 100644 next/search.index/0b08a89d64b2.js create mode 100644 next/search.index/0b8c2a02fb0e.js create mode 100644 next/search.index/0ba045a4b391.js create mode 100644 next/search.index/0d514af60f20.js create mode 100644 next/search.index/0da0bedc9654.js create mode 100644 next/search.index/0dff1b44ff35.js create mode 100644 next/search.index/0e87582c35fd.js create mode 100644 next/search.index/0f7f0f9af438.js create mode 100644 next/search.index/110957c68ffc.js create mode 100644 next/search.index/11af7eb33055.js create mode 100644 next/search.index/11bcf18881b0.js create mode 100644 next/search.index/12338b319c22.js create mode 100644 next/search.index/13dae58cad89.js create mode 100644 next/search.index/1522cc1250ba.js create mode 100644 next/search.index/165145174e7d.js create mode 100644 next/search.index/16555cc5d940.js create mode 100644 next/search.index/1752367c249d.js create mode 100644 next/search.index/17569c26c8e4.js create mode 100644 next/search.index/176c7851f54a.js create mode 100644 next/search.index/183ce403bfbf.js create mode 100644 next/search.index/184d9fce7601.js create mode 100644 next/search.index/18a7b3e6afe1.js create mode 100644 next/search.index/1a530b0ee65d.js create mode 100644 next/search.index/1a71384e82cd.js create mode 100644 next/search.index/1a7cd887f7b2.js create mode 100644 next/search.index/1b2386648c6a.js create mode 100644 next/search.index/1c58faa3938b.js create mode 100644 next/search.index/1ce2008379ea.js create mode 100644 next/search.index/1dc63b2fa2a1.js create mode 100644 next/search.index/1e58411550b3.js create mode 100644 next/search.index/1fafcc6c4467.js create mode 100644 next/search.index/20dc681c2899.js create mode 100644 next/search.index/21183a56c7ce.js create mode 100644 next/search.index/211d88fb3cc2.js create mode 100644 next/search.index/213c30d2be3d.js create mode 100644 next/search.index/23beb180d79b.js create mode 100644 next/search.index/24dfb17fe4e4.js create mode 100644 next/search.index/255bbf87faf5.js create mode 100644 next/search.index/258ee3fd87f1.js create mode 100644 next/search.index/271f393c711a.js create mode 100644 next/search.index/27954687e911.js create mode 100644 next/search.index/2817ae419a69.js create mode 100644 next/search.index/2968d3c644cf.js create mode 100644 next/search.index/2987bee4aac4.js create mode 100644 next/search.index/2a36fc40e01b.js create mode 100644 next/search.index/2ad19a3b35db.js create mode 100644 next/search.index/2b51b18b5742.js create mode 100644 next/search.index/2b66273bc113.js create mode 100644 next/search.index/2cab37783715.js create mode 100644 next/search.index/2cff377c39e8.js create mode 100644 next/search.index/2dc25503fff4.js create mode 100644 next/search.index/2e481fc27810.js create mode 100644 next/search.index/2e5da51df9f6.js create mode 100644 next/search.index/2e860ea8a4f2.js create mode 100644 next/search.index/2e996cb856e4.js create mode 100644 next/search.index/2e9a232f12b0.js create mode 100644 next/search.index/2f45a433d713.js create mode 100644 next/search.index/2f4665b80234.js create mode 100644 next/search.index/2f6dc4ca248a.js create mode 100644 next/search.index/2f7d77e246ab.js create mode 100644 next/search.index/3031ee7b8d94.js create mode 100644 next/search.index/30483236173d.js create mode 100644 next/search.index/30550bdb3944.js create mode 100644 next/search.index/30f44cbd03cf.js create mode 100644 next/search.index/310241be6c37.js create mode 100644 next/search.index/3163613c5864.js create mode 100644 next/search.index/32c3b12425b3.js create mode 100644 next/search.index/3361d2c9b325.js create mode 100644 next/search.index/347541ae8406.js create mode 100644 next/search.index/354eb1ec5580.js create mode 100644 next/search.index/35cd1ddc2f76.js create mode 100644 next/search.index/363bdc9d045c.js create mode 100644 next/search.index/36aadc662f59.js create mode 100644 next/search.index/36ebbf1030ff.js create mode 100644 next/search.index/377b1bb762ce.js create mode 100644 next/search.index/37bfd11b7cdf.js create mode 100644 next/search.index/37c41032c04a.js create mode 100644 next/search.index/37f1835113a5.js create mode 100644 next/search.index/380331c00171.js create mode 100644 next/search.index/3855009ffa81.js create mode 100644 next/search.index/393aefc0981d.js create mode 100644 next/search.index/3a4498eba322.js create mode 100644 next/search.index/3c48de9a8fcc.js create mode 100644 next/search.index/3ca9a436fe4a.js create mode 100644 next/search.index/3cc4cf89765d.js create mode 100644 next/search.index/3d76c5dfd56f.js create mode 100644 next/search.index/3d7b622cf5f0.js create mode 100644 next/search.index/3dbf9986d957.js create mode 100644 next/search.index/410df31576b1.js create mode 100644 next/search.index/41b7b4b5a9f8.js create mode 100644 next/search.index/429673ecff10.js create mode 100644 next/search.index/43642f0554fb.js create mode 100644 next/search.index/43e0a9e30fbc.js create mode 100644 next/search.index/4532e4b8cde3.js create mode 100644 next/search.index/456179eab39b.js create mode 100644 next/search.index/45b1d1b8c35a.js create mode 100644 next/search.index/46b8a53139d4.js create mode 100644 next/search.index/4743bf93c488.js create mode 100644 next/search.index/48a5468ce67d.js create mode 100644 next/search.index/4941b6642e97.js create mode 100644 next/search.index/4a4f3b215889.js create mode 100644 next/search.index/4b914460b29e.js create mode 100644 next/search.index/4d4559dd6fa9.js create mode 100644 next/search.index/4df0130a6271.js create mode 100644 next/search.index/4e7b9f439b00.js create mode 100644 next/search.index/4eae15df1e2d.js create mode 100644 next/search.index/4ecb426b2562.js create mode 100644 next/search.index/4f5f1e881236.js create mode 100644 next/search.index/50d716716da5.js create mode 100644 next/search.index/51b881267f6b.js create mode 100644 next/search.index/51cc9520107d.js create mode 100644 next/search.index/52f9eb7d91b4.js create mode 100644 next/search.index/5457d948c356.js create mode 100644 next/search.index/566c1a5d2f97.js create mode 100644 next/search.index/56e6e83300b1.js create mode 100644 next/search.index/571a106db7ce.js create mode 100644 next/search.index/574423096545.js create mode 100644 next/search.index/579a6500b67f.js create mode 100644 next/search.index/57e0dc82949f.js create mode 100644 next/search.index/57e2e3b3c6a2.js create mode 100644 next/search.index/592ef3c1a7b1.js create mode 100644 next/search.index/5a971f1594db.js create mode 100644 next/search.index/5acfcab0ff67.js create mode 100644 next/search.index/5b82a1cbd32a.js create mode 100644 next/search.index/5bedf403fe7b.js create mode 100644 next/search.index/5bfaeff63ad7.js create mode 100644 next/search.index/5c2ce4493c46.js create mode 100644 next/search.index/5ca7f7a0ef0c.js create mode 100644 next/search.index/5ce5860c5a78.js create mode 100644 next/search.index/5d6e7636da6f.js create mode 100644 next/search.index/5d77ab1b094f.js create mode 100644 next/search.index/5e422f6cce0e.js create mode 100644 next/search.index/5ec91ca9ae6e.js create mode 100644 next/search.index/5fd5c46fb900.js create mode 100644 next/search.index/605707ff6e5f.js create mode 100644 next/search.index/62aaa95fd7bf.js create mode 100644 next/search.index/62aca6fe9467.js create mode 100644 next/search.index/62d8e47e568b.js create mode 100644 next/search.index/633e67d8242a.js create mode 100644 next/search.index/636c6c7710f3.js create mode 100644 next/search.index/63de701acfa2.js create mode 100644 next/search.index/65122f357f1e.js create mode 100644 next/search.index/651817a5a3e1.js create mode 100644 next/search.index/6538b5f1d2c3.js create mode 100644 next/search.index/6552e7bfa6ba.js create mode 100644 next/search.index/65de76d0d022.js create mode 100644 next/search.index/66867bfa8306.js create mode 100644 next/search.index/67acc2b929b0.js create mode 100644 next/search.index/68133e83b795.js create mode 100644 next/search.index/687aee40b564.js create mode 100644 next/search.index/6956faad3fef.js create mode 100644 next/search.index/69c133a67046.js create mode 100644 next/search.index/6a8085681108.js create mode 100644 next/search.index/6b1a7415a18b.js create mode 100644 next/search.index/6b9a8d84c48d.js create mode 100644 next/search.index/6cf638a43782.js create mode 100644 next/search.index/6dc48749d06b.js create mode 100644 next/search.index/6dd8980fe87a.js create mode 100644 next/search.index/6de836c624ad.js create mode 100644 next/search.index/6e9a03548e4c.js create mode 100644 next/search.index/6ebf42077351.js create mode 100644 next/search.index/6ee7c60d5694.js create mode 100644 next/search.index/6fdf54bb3dfb.js create mode 100644 next/search.index/710290bc6833.js create mode 100644 next/search.index/713cd62b6b7f.js create mode 100644 next/search.index/7190f2a95af0.js create mode 100644 next/search.index/71ee74b3d46a.js create mode 100644 next/search.index/720e25dd6cfe.js create mode 100644 next/search.index/73ae90f8461e.js create mode 100644 next/search.index/73d431e93292.js create mode 100644 next/search.index/7458d5dd0cdb.js create mode 100644 next/search.index/74728043195a.js create mode 100644 next/search.index/751b30b4ce58.js create mode 100644 next/search.index/7578054eaa24.js create mode 100644 next/search.index/75a6e289042e.js create mode 100644 next/search.index/75f619e98e16.js create mode 100644 next/search.index/769bb8037d22.js create mode 100644 next/search.index/770d204f7fb9.js create mode 100644 next/search.index/778f68240ab0.js create mode 100644 next/search.index/77e2f3d7e3cd.js create mode 100644 next/search.index/7814189ffefa.js create mode 100644 next/search.index/785e189ddfc5.js create mode 100644 next/search.index/79019f6dc6f9.js create mode 100644 next/search.index/7921a71eafc2.js create mode 100644 next/search.index/7a1578200658.js create mode 100644 next/search.index/7a3b8590a6e8.js create mode 100644 next/search.index/7a54d85ed91a.js create mode 100644 next/search.index/7a61a5c277c5.js create mode 100644 next/search.index/7b442897524b.js create mode 100644 next/search.index/7b50db887c8e.js create mode 100644 next/search.index/7bc75868461e.js create mode 100644 next/search.index/7c7d582a16fb.js create mode 100644 next/search.index/7cb498816342.js create mode 100644 next/search.index/7d7b74927675.js create mode 100644 next/search.index/7e714c3342ed.js create mode 100644 next/search.index/7ec59624e8f4.js create mode 100644 next/search.index/7f52a58441b8.js create mode 100644 next/search.index/7f5a0d986575.js create mode 100644 next/search.index/7f779ec227ec.js create mode 100644 next/search.index/7fc769eceb8f.js create mode 100644 next/search.index/alias/a762150c532c.js create mode 100644 next/search.index/crateNames/8f46c39274d9.js create mode 100644 next/search.index/desc/c103d4fb29fa.js create mode 100644 next/search.index/entry/afe1a566fad7.js create mode 100644 next/search.index/function/449b35841f93.js create mode 100644 next/search.index/generic_inverted_index/9637ece26d64.js create mode 100644 next/search.index/name/40615c89e588.js create mode 100644 next/search.index/normalizedName/2e19990ccf39.js create mode 100644 next/search.index/path/634537828d5e.js create mode 100644 next/search.index/root.js create mode 100644 next/search.index/type/1e26334c4bc1.js create mode 100644 next/settings.html create mode 100644 next/songbird/all.html create mode 100644 next/songbird/config/struct.Config.html create mode 100644 next/songbird/constants/constant.AUDIO_FRAME_RATE.html create mode 100644 next/songbird/constants/constant.CHILD_BUFFER_LEN.html create mode 100644 next/songbird/constants/constant.DEFAULT_BITRATE.html create mode 100644 next/songbird/constants/constant.FRAME_LEN_MS.html create mode 100644 next/songbird/constants/constant.MONO_FRAME_BYTE_SIZE.html create mode 100644 next/songbird/constants/constant.MONO_FRAME_SIZE.html create mode 100644 next/songbird/constants/constant.RTP_PROFILE_TYPE.html create mode 100644 next/songbird/constants/constant.RTP_VERSION.html create mode 100644 next/songbird/constants/constant.SAMPLE_RATE.html create mode 100644 next/songbird/constants/constant.SAMPLE_RATE_RAW.html create mode 100644 next/songbird/constants/constant.SILENT_FRAME.html create mode 100644 next/songbird/constants/constant.STEREO_FRAME_BYTE_SIZE.html create mode 100644 next/songbird/constants/constant.STEREO_FRAME_SIZE.html create mode 100644 next/songbird/constants/constant.TIMESTEP_LENGTH.html create mode 100644 next/songbird/constants/constant.UDP_KEEPALIVE_GAP.html create mode 100644 next/songbird/constants/constant.UDP_KEEPALIVE_GAP_MS.html create mode 100644 next/songbird/constants/constant.VOICE_GATEWAY_VERSION.html create mode 100644 next/songbird/constants/constant.VOICE_PACKET_MAX.html create mode 100644 next/songbird/constants/index.html create mode 100644 next/songbird/constants/sidebar-items.js create mode 100644 next/songbird/driver/connection/error/enum.Error.html create mode 100644 next/songbird/driver/connection/error/type.Result.html create mode 100644 next/songbird/driver/crypto/enum.CryptoMode.html create mode 100644 next/songbird/driver/decode_mode/enum.Channels.html create mode 100644 next/songbird/driver/decode_mode/enum.DecodeMode.html create mode 100644 next/songbird/driver/decode_mode/enum.SampleRate.html create mode 100644 next/songbird/driver/decode_mode/struct.DecodeConfig.html create mode 100644 next/songbird/driver/enum.Bitrate.html create mode 100644 next/songbird/driver/enum.Channels.html create mode 100644 next/songbird/driver/enum.CryptoMode.html create mode 100644 next/songbird/driver/enum.DecodeMode.html create mode 100644 next/songbird/driver/enum.MixMode.html create mode 100644 next/songbird/driver/enum.SampleRate.html create mode 100644 next/songbird/driver/enum.SchedulerError.html create mode 100644 next/songbird/driver/enum.SchedulerMode.html create mode 100644 next/songbird/driver/fn.get_default_scheduler.html create mode 100644 next/songbird/driver/index.html create mode 100644 next/songbird/driver/mix_mode/enum.MixMode.html create mode 100644 next/songbird/driver/retry/enum.Strategy.html create mode 100644 next/songbird/driver/retry/index.html create mode 100644 next/songbird/driver/retry/sidebar-items.js create mode 100644 next/songbird/driver/retry/strategy/enum.Strategy.html create mode 100644 next/songbird/driver/retry/strategy/struct.ExponentialBackoff.html create mode 100644 next/songbird/driver/retry/struct.ExponentialBackoff.html create mode 100644 next/songbird/driver/retry/struct.Retry.html create mode 100644 next/songbird/driver/scheduler/config/enum.Mode.html create mode 100644 next/songbird/driver/scheduler/config/struct.Config.html create mode 100644 next/songbird/driver/scheduler/enum.Error.html create mode 100644 next/songbird/driver/scheduler/fn.get_default_scheduler.html create mode 100644 next/songbird/driver/scheduler/stats/struct.LiveStatBlock.html create mode 100644 next/songbird/driver/scheduler/struct.Scheduler.html create mode 100644 next/songbird/driver/sidebar-items.js create mode 100644 next/songbird/driver/struct.Connect.html create mode 100644 next/songbird/driver/struct.DecodeConfig.html create mode 100644 next/songbird/driver/struct.DisposalThread.html create mode 100644 next/songbird/driver/struct.Driver.html create mode 100644 next/songbird/driver/struct.LiveStatBlock.html create mode 100644 next/songbird/driver/struct.Scheduler.html create mode 100644 next/songbird/driver/struct.SchedulerConfig.html create mode 100644 next/songbird/driver/tasks/disposal/struct.DisposalThread.html create mode 100644 next/songbird/error/enum.ConnectionError.html create mode 100644 next/songbird/error/enum.JoinError.html create mode 100644 next/songbird/error/index.html create mode 100644 next/songbird/error/sidebar-items.js create mode 100644 next/songbird/error/struct.JsonError.html create mode 100644 next/songbird/error/type.ConnectionResult.html create mode 100644 next/songbird/error/type.JoinResult.html create mode 100644 next/songbird/events/context/data/connect/struct.ConnectData.html create mode 100644 next/songbird/events/context/data/disconnect/enum.DisconnectKind.html create mode 100644 next/songbird/events/context/data/disconnect/enum.DisconnectReason.html create mode 100644 next/songbird/events/context/data/disconnect/struct.DisconnectData.html create mode 100644 next/songbird/events/context/data/index.html create mode 100644 next/songbird/events/context/data/rtcp/struct.RtcpData.html create mode 100644 next/songbird/events/context/data/rtp/struct.RtpData.html create mode 100644 next/songbird/events/context/data/voice/struct.VoiceData.html create mode 100644 next/songbird/events/context/data/voice/struct.VoiceTick.html create mode 100644 next/songbird/events/context/enum.EventContext.html create mode 100644 next/songbird/events/context_data/enum.DisconnectKind.html create mode 100644 next/songbird/events/context_data/enum.DisconnectReason.html create mode 100644 next/songbird/events/context_data/index.html create mode 100644 next/songbird/events/context_data/sidebar-items.js create mode 100644 next/songbird/events/context_data/struct.ConnectData.html create mode 100644 next/songbird/events/context_data/struct.DisconnectData.html create mode 100644 next/songbird/events/context_data/struct.RtcpData.html create mode 100644 next/songbird/events/context_data/struct.RtpData.html create mode 100644 next/songbird/events/context_data/struct.VoiceData.html create mode 100644 next/songbird/events/context_data/struct.VoiceTick.html create mode 100644 next/songbird/events/core/enum.CoreEvent.html create mode 100644 next/songbird/events/data/struct.EventData.html create mode 100644 next/songbird/events/enum.CoreEvent.html create mode 100644 next/songbird/events/enum.Event.html create mode 100644 next/songbird/events/enum.EventContext.html create mode 100644 next/songbird/events/enum.TrackEvent.html create mode 100644 next/songbird/events/enum.UntimedEvent.html create mode 100644 next/songbird/events/index.html create mode 100644 next/songbird/events/sidebar-items.js create mode 100644 next/songbird/events/store/struct.EventStore.html create mode 100644 next/songbird/events/struct.EventData.html create mode 100644 next/songbird/events/struct.EventStore.html create mode 100644 next/songbird/events/track/enum.TrackEvent.html create mode 100644 next/songbird/events/trait.EventHandler.html create mode 100644 next/songbird/events/untimed/enum.UntimedEvent.html create mode 100644 next/songbird/handler/struct.Call.html create mode 100644 next/songbird/id/index.html create mode 100644 next/songbird/id/sidebar-items.js create mode 100644 next/songbird/id/struct.ChannelId.html create mode 100644 next/songbird/id/struct.GuildId.html create mode 100644 next/songbird/id/struct.UserId.html create mode 100644 next/songbird/index.html create mode 100644 next/songbird/info/struct.ConnectionInfo.html create mode 100644 next/songbird/input/adapters/async_adapter/struct.AsyncAdapterStream.html create mode 100644 next/songbird/input/adapters/async_adapter/trait.AsyncMediaSource.html create mode 100644 next/songbird/input/adapters/cached/compressed/struct.Compressed.html create mode 100644 next/songbird/input/adapters/cached/compressed/struct.Config.html create mode 100644 next/songbird/input/adapters/cached/compressed/struct.OpusCompressor.html create mode 100644 next/songbird/input/adapters/cached/decompressed/struct.Decompressed.html create mode 100644 next/songbird/input/adapters/cached/error/enum.CodecCacheError.html create mode 100644 next/songbird/input/adapters/cached/error/enum.Error.html create mode 100644 next/songbird/input/adapters/cached/fn.compressed_cost_per_sec.html create mode 100644 next/songbird/input/adapters/cached/fn.default_config.html create mode 100644 next/songbird/input/adapters/cached/fn.raw_cost_per_sec.html create mode 100644 next/songbird/input/adapters/cached/hint/enum.LengthHint.html create mode 100644 next/songbird/input/adapters/cached/hint/fn.apply_length_hint.html create mode 100644 next/songbird/input/adapters/cached/index.html create mode 100644 next/songbird/input/adapters/cached/memory/struct.Memory.html create mode 100644 next/songbird/input/adapters/child/struct.ChildContainer.html create mode 100644 next/songbird/input/adapters/raw_adapter/struct.RawAdapter.html create mode 100644 next/songbird/input/audiostream/struct.AudioStream.html create mode 100644 next/songbird/input/cached/enum.CodecCacheError.html create mode 100644 next/songbird/input/cached/enum.Error.html create mode 100644 next/songbird/input/cached/enum.LengthHint.html create mode 100644 next/songbird/input/cached/fn.apply_length_hint.html create mode 100644 next/songbird/input/cached/fn.compressed_cost_per_sec.html create mode 100644 next/songbird/input/cached/fn.default_config.html create mode 100644 next/songbird/input/cached/fn.raw_cost_per_sec.html create mode 100644 next/songbird/input/cached/index.html create mode 100644 next/songbird/input/cached/sidebar-items.js create mode 100644 next/songbird/input/cached/struct.Compressed.html create mode 100644 next/songbird/input/cached/struct.Config.html create mode 100644 next/songbird/input/cached/struct.Decompressed.html create mode 100644 next/songbird/input/cached/struct.Memory.html create mode 100644 next/songbird/input/cached/struct.OpusCompressor.html create mode 100644 next/songbird/input/codecs/dca/struct.DcaReader.html create mode 100644 next/songbird/input/codecs/fn.get_codec_registry.html create mode 100644 next/songbird/input/codecs/fn.get_probe.html create mode 100644 next/songbird/input/codecs/index.html create mode 100644 next/songbird/input/codecs/opus/struct.OpusDecoder.html create mode 100644 next/songbird/input/codecs/raw/struct.RawReader.html create mode 100644 next/songbird/input/codecs/sidebar-items.js create mode 100644 next/songbird/input/codecs/struct.DcaReader.html create mode 100644 next/songbird/input/codecs/struct.OpusDecoder.html create mode 100644 next/songbird/input/codecs/struct.RawReader.html create mode 100644 next/songbird/input/compose/trait.Compose.html create mode 100644 next/songbird/input/enum.AudioStreamError.html create mode 100644 next/songbird/input/enum.AuxMetadataError.html create mode 100644 next/songbird/input/enum.Input.html create mode 100644 next/songbird/input/enum.LiveInput.html create mode 100644 next/songbird/input/enum.MakePlayableError.html create mode 100644 next/songbird/input/enum.MetadataError.html create mode 100644 next/songbird/input/error/enum.AudioStreamError.html create mode 100644 next/songbird/input/error/enum.AuxMetadataError.html create mode 100644 next/songbird/input/error/enum.MakePlayableError.html create mode 100644 next/songbird/input/error/enum.MetadataError.html create mode 100644 next/songbird/input/index.html create mode 100644 next/songbird/input/live_input/enum.LiveInput.html create mode 100644 next/songbird/input/metadata/struct.AuxMetadata.html create mode 100644 next/songbird/input/metadata/struct.Metadata.html create mode 100644 next/songbird/input/parsed/struct.Parsed.html create mode 100644 next/songbird/input/sidebar-items.js create mode 100644 next/songbird/input/sources/file/struct.File.html create mode 100644 next/songbird/input/sources/hls/struct.HlsRequest.html create mode 100644 next/songbird/input/sources/http/struct.HttpRequest.html create mode 100644 next/songbird/input/sources/struct.AsyncReadOnlySource.html create mode 100644 next/songbird/input/sources/ytdl/struct.YoutubeDl.html create mode 100644 next/songbird/input/struct.AsyncAdapterStream.html create mode 100644 next/songbird/input/struct.AsyncReadOnlySource.html create mode 100644 next/songbird/input/struct.AudioStream.html create mode 100644 next/songbird/input/struct.AuxMetadata.html create mode 100644 next/songbird/input/struct.ChildContainer.html create mode 100644 next/songbird/input/struct.File.html create mode 100644 next/songbird/input/struct.HlsRequest.html create mode 100644 next/songbird/input/struct.HttpRequest.html create mode 100644 next/songbird/input/struct.Metadata.html create mode 100644 next/songbird/input/struct.Parsed.html create mode 100644 next/songbird/input/struct.RawAdapter.html create mode 100644 next/songbird/input/struct.YoutubeDl.html create mode 100644 next/songbird/input/trait.AsyncMediaSource.html create mode 100644 next/songbird/input/trait.Compose.html create mode 100644 next/songbird/input/utils/fn.byte_count_to_timestamp.html create mode 100644 next/songbird/input/utils/fn.decoder.html create mode 100644 next/songbird/input/utils/fn.sample_count_to_timestamp.html create mode 100644 next/songbird/input/utils/fn.timestamp_to_byte_count.html create mode 100644 next/songbird/input/utils/fn.timestamp_to_sample_count.html create mode 100644 next/songbird/input/utils/index.html create mode 100644 next/songbird/input/utils/sidebar-items.js create mode 100644 next/songbird/join/index.html create mode 100644 next/songbird/join/sidebar-items.js create mode 100644 next/songbird/join/struct.Join.html create mode 100644 next/songbird/join/struct.JoinGateway.html create mode 100644 next/songbird/manager/struct.Iter.html create mode 100644 next/songbird/manager/struct.Songbird.html create mode 100644 next/songbird/serenity/fn.get.html create mode 100644 next/songbird/serenity/fn.register.html create mode 100644 next/songbird/serenity/fn.register_from_config.html create mode 100644 next/songbird/serenity/fn.register_with.html create mode 100644 next/songbird/serenity/index.html create mode 100644 next/songbird/serenity/sidebar-items.js create mode 100644 next/songbird/serenity/struct.SongbirdKey.html create mode 100644 next/songbird/serenity/trait.SerenityInit.html create mode 100644 next/songbird/shards/enum.Shard.html create mode 100644 next/songbird/shards/enum.Sharder.html create mode 100644 next/songbird/shards/index.html create mode 100644 next/songbird/shards/sidebar-items.js create mode 100644 next/songbird/shards/struct.SerenityShardHandle.html create mode 100644 next/songbird/shards/struct.SerenitySharder.html create mode 100644 next/songbird/shards/struct.TwilightMap.html create mode 100644 next/songbird/shards/trait.GenericSharder.html create mode 100644 next/songbird/shards/trait.VoiceUpdate.html create mode 100644 next/songbird/sidebar-items.js create mode 100644 next/songbird/struct.Call.html create mode 100644 next/songbird/struct.Config.html create mode 100644 next/songbird/struct.ConnectionInfo.html create mode 100644 next/songbird/struct.Iter.html create mode 100644 next/songbird/struct.Songbird.html create mode 100644 next/songbird/tracks/action/struct.Action.html create mode 100644 next/songbird/tracks/enum.ControlError.html create mode 100644 next/songbird/tracks/enum.LoopState.html create mode 100644 next/songbird/tracks/enum.PlayError.html create mode 100644 next/songbird/tracks/enum.PlayMode.html create mode 100644 next/songbird/tracks/enum.ReadyState.html create mode 100644 next/songbird/tracks/error/enum.ControlError.html create mode 100644 next/songbird/tracks/error/enum.PlayError.html create mode 100644 next/songbird/tracks/error/type.TrackResult.html create mode 100644 next/songbird/tracks/handle/struct.TrackCallback.html create mode 100644 next/songbird/tracks/handle/struct.TrackHandle.html create mode 100644 next/songbird/tracks/index.html create mode 100644 next/songbird/tracks/looping/enum.LoopState.html create mode 100644 next/songbird/tracks/mode/enum.PlayMode.html create mode 100644 next/songbird/tracks/queue/struct.Queued.html create mode 100644 next/songbird/tracks/queue/struct.TrackQueue.html create mode 100644 next/songbird/tracks/ready/enum.ReadyState.html create mode 100644 next/songbird/tracks/sidebar-items.js create mode 100644 next/songbird/tracks/state/struct.TrackState.html create mode 100644 next/songbird/tracks/struct.Action.html create mode 100644 next/songbird/tracks/struct.Queued.html create mode 100644 next/songbird/tracks/struct.Track.html create mode 100644 next/songbird/tracks/struct.TrackCallback.html create mode 100644 next/songbird/tracks/struct.TrackHandle.html create mode 100644 next/songbird/tracks/struct.TrackQueue.html create mode 100644 next/songbird/tracks/struct.TrackState.html create mode 100644 next/songbird/tracks/struct.View.html create mode 100644 next/songbird/tracks/type.TrackResult.html create mode 100644 next/songbird/tracks/view/struct.View.html create mode 100644 next/src-files.js create mode 100644 next/src/songbird/config.rs.html create mode 100644 next/src/songbird/constants.rs.html create mode 100644 next/src/songbird/driver/connection/error.rs.html create mode 100644 next/src/songbird/driver/connection/mod.rs.html create mode 100644 next/src/songbird/driver/crypto.rs.html create mode 100644 next/src/songbird/driver/decode_mode.rs.html create mode 100644 next/src/songbird/driver/mix_mode.rs.html create mode 100644 next/src/songbird/driver/mod.rs.html create mode 100644 next/src/songbird/driver/retry/mod.rs.html create mode 100644 next/src/songbird/driver/retry/strategy.rs.html create mode 100644 next/src/songbird/driver/scheduler/config.rs.html create mode 100644 next/src/songbird/driver/scheduler/idle.rs.html create mode 100644 next/src/songbird/driver/scheduler/live.rs.html create mode 100644 next/src/songbird/driver/scheduler/mod.rs.html create mode 100644 next/src/songbird/driver/scheduler/stats.rs.html create mode 100644 next/src/songbird/driver/scheduler/task.rs.html create mode 100644 next/src/songbird/driver/tasks/disposal.rs.html create mode 100644 next/src/songbird/driver/tasks/error.rs.html create mode 100644 next/src/songbird/driver/tasks/events.rs.html create mode 100644 next/src/songbird/driver/tasks/message/core.rs.html create mode 100644 next/src/songbird/driver/tasks/message/disposal.rs.html create mode 100644 next/src/songbird/driver/tasks/message/events.rs.html create mode 100644 next/src/songbird/driver/tasks/message/mixer.rs.html create mode 100644 next/src/songbird/driver/tasks/message/mod.rs.html create mode 100644 next/src/songbird/driver/tasks/message/udp_rx.rs.html create mode 100644 next/src/songbird/driver/tasks/message/ws.rs.html create mode 100644 next/src/songbird/driver/tasks/mixer/mix_logic.rs.html create mode 100644 next/src/songbird/driver/tasks/mixer/mod.rs.html create mode 100644 next/src/songbird/driver/tasks/mixer/pool.rs.html create mode 100644 next/src/songbird/driver/tasks/mixer/result.rs.html create mode 100644 next/src/songbird/driver/tasks/mixer/state.rs.html create mode 100644 next/src/songbird/driver/tasks/mixer/track.rs.html create mode 100644 next/src/songbird/driver/tasks/mixer/util.rs.html create mode 100644 next/src/songbird/driver/tasks/mod.rs.html create mode 100644 next/src/songbird/driver/tasks/udp_rx/decode_sizes.rs.html create mode 100644 next/src/songbird/driver/tasks/udp_rx/mod.rs.html create mode 100644 next/src/songbird/driver/tasks/udp_rx/playout_buffer.rs.html create mode 100644 next/src/songbird/driver/tasks/udp_rx/ssrc_state.rs.html create mode 100644 next/src/songbird/driver/tasks/ws.rs.html create mode 100644 next/src/songbird/error.rs.html create mode 100644 next/src/songbird/events/context/data/connect.rs.html create mode 100644 next/src/songbird/events/context/data/disconnect.rs.html create mode 100644 next/src/songbird/events/context/data/mod.rs.html create mode 100644 next/src/songbird/events/context/data/rtcp.rs.html create mode 100644 next/src/songbird/events/context/data/rtp.rs.html create mode 100644 next/src/songbird/events/context/data/voice.rs.html create mode 100644 next/src/songbird/events/context/internal_data.rs.html create mode 100644 next/src/songbird/events/context/mod.rs.html create mode 100644 next/src/songbird/events/core.rs.html create mode 100644 next/src/songbird/events/data.rs.html create mode 100644 next/src/songbird/events/mod.rs.html create mode 100644 next/src/songbird/events/store.rs.html create mode 100644 next/src/songbird/events/track.rs.html create mode 100644 next/src/songbird/events/untimed.rs.html create mode 100644 next/src/songbird/handler.rs.html create mode 100644 next/src/songbird/id.rs.html create mode 100644 next/src/songbird/info.rs.html create mode 100644 next/src/songbird/input/adapters/async_adapter.rs.html create mode 100644 next/src/songbird/input/adapters/cached/compressed.rs.html create mode 100644 next/src/songbird/input/adapters/cached/decompressed.rs.html create mode 100644 next/src/songbird/input/adapters/cached/error.rs.html create mode 100644 next/src/songbird/input/adapters/cached/hint.rs.html create mode 100644 next/src/songbird/input/adapters/cached/memory.rs.html create mode 100644 next/src/songbird/input/adapters/cached/mod.rs.html create mode 100644 next/src/songbird/input/adapters/cached/util.rs.html create mode 100644 next/src/songbird/input/adapters/child.rs.html create mode 100644 next/src/songbird/input/adapters/mod.rs.html create mode 100644 next/src/songbird/input/adapters/raw_adapter.rs.html create mode 100644 next/src/songbird/input/audiostream.rs.html create mode 100644 next/src/songbird/input/codecs/dca/metadata.rs.html create mode 100644 next/src/songbird/input/codecs/dca/mod.rs.html create mode 100644 next/src/songbird/input/codecs/mod.rs.html create mode 100644 next/src/songbird/input/codecs/opus.rs.html create mode 100644 next/src/songbird/input/codecs/raw.rs.html create mode 100644 next/src/songbird/input/compose.rs.html create mode 100644 next/src/songbird/input/error.rs.html create mode 100644 next/src/songbird/input/live_input.rs.html create mode 100644 next/src/songbird/input/metadata/ffprobe.rs.html create mode 100644 next/src/songbird/input/metadata/mod.rs.html create mode 100644 next/src/songbird/input/metadata/ytdl.rs.html create mode 100644 next/src/songbird/input/mod.rs.html create mode 100644 next/src/songbird/input/parsed.rs.html create mode 100644 next/src/songbird/input/sources/file.rs.html create mode 100644 next/src/songbird/input/sources/hls.rs.html create mode 100644 next/src/songbird/input/sources/http.rs.html create mode 100644 next/src/songbird/input/sources/mod.rs.html create mode 100644 next/src/songbird/input/sources/ytdl.rs.html create mode 100644 next/src/songbird/input/utils.rs.html create mode 100644 next/src/songbird/join.rs.html create mode 100644 next/src/songbird/lib.rs.html create mode 100644 next/src/songbird/manager.rs.html create mode 100644 next/src/songbird/serenity.rs.html create mode 100644 next/src/songbird/shards.rs.html create mode 100644 next/src/songbird/tracks/action.rs.html create mode 100644 next/src/songbird/tracks/command.rs.html create mode 100644 next/src/songbird/tracks/error.rs.html create mode 100644 next/src/songbird/tracks/handle.rs.html create mode 100644 next/src/songbird/tracks/looping.rs.html create mode 100644 next/src/songbird/tracks/mod.rs.html create mode 100644 next/src/songbird/tracks/mode.rs.html create mode 100644 next/src/songbird/tracks/queue.rs.html create mode 100644 next/src/songbird/tracks/ready.rs.html create mode 100644 next/src/songbird/tracks/state.rs.html create mode 100644 next/src/songbird/tracks/view.rs.html create mode 100644 next/src/songbird/ws.rs.html create mode 100644 next/static.files/COPYRIGHT-7fb11f4e.txt create mode 100644 next/static.files/FiraMono-Medium-86f75c8c.woff2 create mode 100644 next/static.files/FiraMono-Regular-87c26294.woff2 create mode 100644 next/static.files/FiraSans-Italic-81dc35de.woff2 create mode 100644 next/static.files/FiraSans-LICENSE-05ab6dbd.txt create mode 100644 next/static.files/FiraSans-Medium-e1aa3f0a.woff2 create mode 100644 next/static.files/FiraSans-MediumItalic-ccf7e434.woff2 create mode 100644 next/static.files/FiraSans-Regular-0fe48ade.woff2 create mode 100644 next/static.files/LICENSE-APACHE-a60eea81.txt create mode 100644 next/static.files/LICENSE-MIT-23f18e03.txt create mode 100644 next/static.files/NanumBarunGothic-13b3dcba.ttf.woff2 create mode 100644 next/static.files/NanumBarunGothic-LICENSE-a37d393b.txt create mode 100644 next/static.files/SourceCodePro-It-fc8b9304.ttf.woff2 create mode 100644 next/static.files/SourceCodePro-LICENSE-67f54ca7.txt create mode 100644 next/static.files/SourceCodePro-Regular-8badfe75.ttf.woff2 create mode 100644 next/static.files/SourceCodePro-Semibold-aa29a496.ttf.woff2 create mode 100644 next/static.files/SourceSerif4-Bold-6d4fd4c0.ttf.woff2 create mode 100644 next/static.files/SourceSerif4-It-ca3b17ed.ttf.woff2 create mode 100644 next/static.files/SourceSerif4-LICENSE-a2cfd9d5.md create mode 100644 next/static.files/SourceSerif4-Regular-6b053e98.ttf.woff2 create mode 100644 next/static.files/SourceSerif4-Semibold-457a13ac.ttf.woff2 create mode 100644 next/static.files/favicon-044be391.svg create mode 100644 next/static.files/favicon-32x32-6580c154.png create mode 100644 next/static.files/main-b6a35c53.js create mode 100644 next/static.files/normalize-9960930a.css create mode 100644 next/static.files/noscript-32bb7600.css create mode 100644 next/static.files/rust-logo-9a9549ea.svg create mode 100644 next/static.files/rustdoc-528d32ef.css create mode 100644 next/static.files/scrape-examples-5e967b76.js create mode 100644 next/static.files/search-5f24b69e.js create mode 100644 next/static.files/settings-c38705f0.js create mode 100644 next/static.files/src-script-813739b1.js create mode 100644 next/static.files/storage-1b37d467.js create mode 100644 next/static.files/stringdex-0e748618.js create mode 100644 next/trait.impl/core/clone/trait.Clone.js create mode 100644 next/trait.impl/core/cmp/trait.Eq.js create mode 100644 next/trait.impl/core/cmp/trait.Ord.js create mode 100644 next/trait.impl/core/cmp/trait.PartialEq.js create mode 100644 next/trait.impl/core/cmp/trait.PartialOrd.js create mode 100644 next/trait.impl/core/convert/trait.From.js create mode 100644 next/trait.impl/core/default/trait.Default.js create mode 100644 next/trait.impl/core/error/trait.Error.js create mode 100644 next/trait.impl/core/fmt/trait.Debug.js create mode 100644 next/trait.impl/core/fmt/trait.Display.js create mode 100644 next/trait.impl/core/future/future/trait.Future.js create mode 100644 next/trait.impl/core/hash/trait.Hash.js create mode 100644 next/trait.impl/core/iter/traits/collect/trait.IntoIterator.js create mode 100644 next/trait.impl/core/iter/traits/iterator/trait.Iterator.js create mode 100644 next/trait.impl/core/marker/trait.Copy.js create mode 100644 next/trait.impl/core/marker/trait.Freeze.js create mode 100644 next/trait.impl/core/marker/trait.Send.js create mode 100644 next/trait.impl/core/marker/trait.StructuralPartialEq.js create mode 100644 next/trait.impl/core/marker/trait.Sync.js create mode 100644 next/trait.impl/core/marker/trait.Unpin.js create mode 100644 next/trait.impl/core/marker/trait.UnsafeUnpin.js create mode 100644 next/trait.impl/core/ops/deref/trait.Deref.js create mode 100644 next/trait.impl/core/ops/deref/trait.DerefMut.js create mode 100644 next/trait.impl/core/ops/drop/trait.Drop.js create mode 100644 next/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js create mode 100644 next/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js create mode 100644 next/trait.impl/core/str/traits/trait.FromStr.js create mode 100644 next/trait.impl/serenity/gateway/bridge/voice/trait.VoiceGatewayManager.js create mode 100644 next/trait.impl/songbird/input/adapters/async_adapter/trait.AsyncMediaSource.js create mode 100644 next/trait.impl/songbird/input/compose/trait.Compose.js create mode 100644 next/trait.impl/songbird/serenity/trait.SerenityInit.js create mode 100644 next/trait.impl/songbird/shards/trait.VoiceUpdate.js create mode 100644 next/trait.impl/std/io/trait.Read.js create mode 100644 next/trait.impl/std/io/trait.Seek.js create mode 100644 next/trait.impl/streamcatcher/standard/trait.NeedsBytes.js create mode 100644 next/trait.impl/streamcatcher/standard/trait.Transform.js create mode 100644 next/trait.impl/streamcatcher/state/trait.Stateful.js create mode 100644 next/trait.impl/symphonia_core/codecs/trait.Decoder.js create mode 100644 next/trait.impl/symphonia_core/formats/trait.FormatReader.js create mode 100644 next/trait.impl/symphonia_core/io/trait.MediaSource.js create mode 100644 next/trait.impl/symphonia_core/probe/trait.QueryDescriptor.js create mode 100644 next/trait.impl/tokio/io/async_read/trait.AsyncRead.js create mode 100644 next/trait.impl/tokio/io/async_seek/trait.AsyncSeek.js create mode 100644 next/trait.impl/typemap_rev/trait.TypeMapKey.js create mode 100644 next/type.impl/core/result/enum.Result.js diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/next/crates.js b/next/crates.js new file mode 100644 index 0000000..145e7bf --- /dev/null +++ b/next/crates.js @@ -0,0 +1,2 @@ +window.ALL_CRATES = ["songbird"]; +//{"start":21,"fragment_lengths":[10]} \ No newline at end of file diff --git a/next/help.html b/next/help.html new file mode 100644 index 0000000..e8980f6 --- /dev/null +++ b/next/help.html @@ -0,0 +1 @@ +Help

All

Rustdoc help

Back
\ No newline at end of file diff --git a/next/index.html b/next/index.html new file mode 100644 index 0000000..358a4a3 --- /dev/null +++ b/next/index.html @@ -0,0 +1 @@ + diff --git a/next/search.index/002c3b58ffb8.js b/next/search.index/002c3b58ffb8.js new file mode 100644 index 0000000..00156dc --- /dev/null +++ b/next/search.index/002c3b58ffb8.js @@ -0,0 +1 @@ +rn_("AQJwZQABSQoAAAEFb2x1bWUAAU8IAAABA2FyZADy8gYAAAEAAQdoZWR1bGVyAAGhCQAA8wACY2gAAQRyb2JlAAHxBgAAAQVuaW5pdAA7MAAAAQAAMQABAPgJMQABBmluc2VydAABoAkAAPMAAnJ1AAECYXgAAUwKAAABAmZvAAGpBQAAAQRlb3V0APKHCgAAAQABAWsA9OYGAAABAAEAAQDzAANjbW4AAQABpzAAAAnpcgGqCQAAAQ9lZmF1bHRzY2hlZHVsZXIAAZQKAAABA2ZpZwDyTQgAAAEAAQplY3JlZ2lzdHJ5AAFrCgAA8wFvAmRuAAEGaXRyYXRlAAHuCAAAAQJrcwDyQAgAAEsCIwACLplsuFbkZHPytwIAAAEA998BAM1/x2ns64/AR7RJOzAAAAEAABMACQBSAQIAxQMAAPcDAACLBAMAxAQAAN0GAgAoBwIA5wgBAN4JAQA=") \ No newline at end of file diff --git a/next/search.index/0067cbd25dc0.js b/next/search.index/0067cbd25dc0.js new file mode 100644 index 0000000..0e15e3d --- /dev/null +++ b/next/search.index/0067cbd25dc0.js @@ -0,0 +1 @@ +rn_("AQRyYWNrAPKdCQAAAQABCGNoZWR1bGVyAAGUCgAAAQdyb21jb3N0AAFgCgAAAQVvbmZpZwAB2wkAAAEGaXRyYXRlAAHsCQAAAQRzeW5jAAEiCQAA8wCGJwAGOzAAAAEAACUABwD+AwQAlAQAAN8EFwAfBwEAbAgCAM4JAABBCgEAAQNvZGUA8jMJAAABAAEEcnJvcgDz1AkAAAEAAQAJBADy8QkAAAEA8wFyA2NlbffgBgAAAQAdAAEAAQChAvMAAQ5lY29ubmVjdGRyaXZlcgABnwoAAAEKZWF2ZXNlcnZlcgABggoAAAEDeXB0AAHhCQAAAQJkZQABrQkAAPMCZWMCb3IAAQpyZWF0ZWFzeW5jAPV9CgAAAQABAAEAAQDzAIQMCAEA8wADZGV0AA==") \ No newline at end of file diff --git a/next/search.index/018d3ae80e11.js b/next/search.index/018d3ae80e11.js new file mode 100644 index 0000000..5607161 --- /dev/null +++ b/next/search.index/018d3ae80e11.js @@ -0,0 +1 @@ +rn_("AQV0cmVhbQABWQoAAPMFb3VyY2UBc/NjCAAA0gEBAAEJbGllbnRkYXRhAAGZCgAAEwJzZQKAAAAACTljZAE6CAAAAQJtcAAB6QgAAAEGYWNrb2ZmAPJmCgAAAQDzAANiY2kA8wACbHMA") \ No newline at end of file diff --git a/next/search.index/01d15e54e445.js b/next/search.index/01d15e54e445.js new file mode 100644 index 0000000..b96ba90 --- /dev/null +++ b/next/search.index/01d15e54e445.js @@ -0,0 +1 @@ +rn_("AQJuZwABpQoAAPMAAWnyLgkAAAEAAQhlZHRyYWNrcwDyewoAAAEAIwACgAAAAAb4bHQA8wACYWsA") \ No newline at end of file diff --git a/next/search.index/022c021a3fe7.js b/next/search.index/022c021a3fe7.js new file mode 100644 index 0000000..87a6d9a --- /dev/null +++ b/next/search.index/022c021a3fe7.js @@ -0,0 +1 @@ +rn_("AQpuYXZhaWxhYmxlAAGSCgAAAQZudmFsaWQAAVUKAADzA29kZQJpdfQWBwAAAQBeAQEAAQxudmFsaWRsZW5ndGgAAXIKAADzAAJpbfLlAwAAlQDzAAFv8rcEAAAqBQECbGwA87MGAAABAAEAAQFkADswAAABAABeAAIABwQAAA0FXQDzAAFp89AEAABNBCwB8wADZW90AA==") \ No newline at end of file diff --git a/next/search.index/026254c8c376.js b/next/search.index/026254c8c376.js new file mode 100644 index 0000000..a4efd56 --- /dev/null +++ b/next/search.index/026254c8c376.js @@ -0,0 +1 @@ +rn_("AQh1ZmZpeGxlbgABbQoAAAEGZXJoZWFkAAFSCgAAAQRmc2V0APLeCQAAAQDzAAJmdgABBW5kcGFkAPIxCgAAAQDzAmFkA2VvcwABA21pdAAB6wgAAAEIbmd0aGhpbnQAAV8KAADzAANlaW8A") \ No newline at end of file diff --git a/next/search.index/029250aabafd.js b/next/search.index/029250aabafd.js new file mode 100644 index 0000000..a066884 --- /dev/null +++ b/next/search.index/029250aabafd.js @@ -0,0 +1 @@ +rn_("AQRzeW5jAAEiCQAA8wF0AWE7MAAAAQAADQAGAP4DBACUBAAAHwcBAGwIAgDOCQAAQQoBAA==") \ No newline at end of file diff --git a/next/search.index/043e71c93d2e.js b/next/search.index/043e71c93d2e.js new file mode 100644 index 0000000..70ab0ac --- /dev/null +++ b/next/search.index/043e71c93d2e.js @@ -0,0 +1 @@ +rn_("AQAA9G4FAAABADAAAQABBWFya2VyAAEoCQAAAQFkADswAAABAAAFAAIAugYCAJcHAgABBHJyb3IAAfUIAAABBG91bnQAAXgKAADzAIUUEQLy1QQAAFUF") \ No newline at end of file diff --git a/next/search.index/0482ea5eb759.js b/next/search.index/0482ea5eb759.js new file mode 100644 index 0000000..d878c28 --- /dev/null +++ b/next/search.index/0482ea5eb759.js @@ -0,0 +1 @@ +rn_("AQdwbGVuZ3RoAAH1CQAAAQphbXBsZWNvdW50AAGkCgAAAQh5dGVjb3VudAABoAoAAPMBbwJicwDzAm1wAXTynQoAAAYA8wACYWUA") \ No newline at end of file diff --git a/next/search.index/04b671b519e8.js b/next/search.index/04b671b519e8.js new file mode 100644 index 0000000..0e50b59 --- /dev/null +++ b/next/search.index/04b671b519e8.js @@ -0,0 +1 @@ +rn_("AQFkADswAAABAAAxAAEAwwUxAAELaGFubmVsY291bnQAAXgKAADzAAJjZQABAnV0ADswAAABAABdAAEAOQddAPMAAm1uOzAAAAEAAF4AAgCPAAAADgRdAA==") \ No newline at end of file diff --git a/next/search.index/04ce6098b0c3.js b/next/search.index/04ce6098b0c3.js new file mode 100644 index 0000000..14a7175 --- /dev/null +++ b/next/search.index/04ce6098b0c3.js @@ -0,0 +1 @@ +rn_("AQVhcnNlZAAB0gYAAAEMY29sdmlvbGF0aW9uAAFaCgAAAQNpdmUAAcsEAAABB21lc3RhbXAA8p0KAAAGAAEFc3RhcnQA8koKAAABAAEFdGFza3MAAfAIAADzAAJsdADXAwAAhoAAAAAFBxHJAAA=") \ No newline at end of file diff --git a/next/search.index/062cee4b1ca2.js b/next/search.index/062cee4b1ca2.js new file mode 100644 index 0000000..3ee4df4 --- /dev/null +++ b/next/search.index/062cee4b1ca2.js @@ -0,0 +1 @@ +rn_("AQF0APbcCQAAAQBRAAEAWAABAAEDaXplAAFbCgAAAQd5dGVzaXplAAGYCgAA8wNhbWUCYnMA8wABcgGIBAAA8wACZnXyBAQAAAEA") \ No newline at end of file diff --git a/next/search.index/067cce3ed747.js b/next/search.index/067cce3ed747.js new file mode 100644 index 0000000..3541620 --- /dev/null +++ b/next/search.index/067cce3ed747.js @@ -0,0 +1 @@ +rn_("AQAA9G4FAAABADAAAQABBWFya2VyAAEoCQAAAQFkADswAAABAAAFAAIAugYCAJcHAgABBHJyb3IAAfUIAAABBG91bnQAAXgKAADzAmVshRQRAvLVBAAAVQU=") \ No newline at end of file diff --git a/next/search.index/07e08d4cd0ec.js b/next/search.index/07e08d4cd0ec.js new file mode 100644 index 0000000..fe17796 --- /dev/null +++ b/next/search.index/07e08d4cd0ec.js @@ -0,0 +1 @@ +rn_("AQNvcmUA8hsHAAABAPMAAXT0gQQAAAEAAQAfBgEGYW5kbGVyAPMBCQAAAQABAAEDYXRhAPLDBgAAAQABBm9udGV4dADz/ggAAAEAAQDzAXSEjAACOzAAAAEAABAACABWAwMAvQYCAOwGAQAuBwIACwkBAK8JAABNCgAAVgoAAA==") \ No newline at end of file diff --git a/next/search.index/0834bff69a54.js b/next/search.index/0834bff69a54.js new file mode 100644 index 0000000..ee8a876 --- /dev/null +++ b/next/search.index/0834bff69a54.js @@ -0,0 +1 @@ +rn_("AQNpa2UA8qkJAADjAAEAAPT6BAAABwQBAAEAAQNndGgAAXIKAAABCHZlc2VydmVyAAGCCgAA8wADYW5yOjAAAAEAAAAAAAkAEAAAAO8DhgSHBEEIQghDCGoIawh0CnUK8wACZWzzRgMAAKQDAQA=") \ No newline at end of file diff --git a/next/search.index/0850c9fe7d55.js b/next/search.index/0850c9fe7d55.js new file mode 100644 index 0000000..3e9f963 --- /dev/null +++ b/next/search.index/0850c9fe7d55.js @@ -0,0 +1 @@ +rn_("AQJlcgDy9AYAAAEAAQphbGlkbGVuZ3RoAAFyCgAACQEA8zsIAAABAAEA8wACbnYA8wACbnQA") \ No newline at end of file diff --git a/next/search.index/08792f50bf4a.js b/next/search.index/08792f50bf4a.js new file mode 100644 index 0000000..52db21c --- /dev/null +++ b/next/search.index/08792f50bf4a.js @@ -0,0 +1 @@ +rn_("AQRkYXRlAPJyCAAAAQATAAKmwAAACFBwcgABA2ljawD05gYAAAEAAQABAAEDZWFtAAFZCgAAAQJ0ZQDzNwcAADcDAQDzAAJhcgABAnplAPJFCAAAQQJTAAOAAAAABQZpc3QBCQUAAAEIYWNrZXRtYXgAAUwKAAABDWF0ZXdheXZlcnNpb24AAZMKAAABA2F0YQDy5AYAAAEAtwcAAIeAAAAAA9pIiA46MAAAAQAAAAAAEgAQAAAAygPXA+0DmwScBJ0EngSfBKAEoQSiBP0GOAdjCJwJNQo2CnAKcQo=") \ No newline at end of file diff --git a/next/search.index/087b1dc56864.js b/next/search.index/087b1dc56864.js new file mode 100644 index 0000000..7a2eae5 --- /dev/null +++ b/next/search.index/087b1dc56864.js @@ -0,0 +1 @@ +rn_("AQNhcnQA8koKAAABAAEHbG9ja2luZwABpQoAAPMAAmJ08s0DAAC2BgEGb2xhcmdlAAFICgAAAQVwZGF0ZQDzIwkAAFMBAQABBmltZW91dADyhwoAAAEA8wACdHU6MAAAAQAAAAAACwAQAAAAywPMA88G0AYmBycHMwc0BzcHJAluCm8KAQRsb2NrAPIuCQAAAQDzAIQSQAIA") \ No newline at end of file diff --git a/next/search.index/096cd6cac292.js b/next/search.index/096cd6cac292.js new file mode 100644 index 0000000..665abab --- /dev/null +++ b/next/search.index/096cd6cac292.js @@ -0,0 +1 @@ +rn_("AQAA9YwFAAABADMAAQABAAECcnkAAW0FAAABC2V3YXl2ZXJzaW9uAAGTCgAAAQABpzAAAAqFbQFdCgAAARBpc2NvdmVyeXJlc3BvbnNlAAGhCgAAEwACpwAAAAbHZGkA8wADbHB0ANMAhFfg3IKUnwFBQAA=") \ No newline at end of file diff --git a/next/search.index/0aa5f3464354.js b/next/search.index/0aa5f3464354.js new file mode 100644 index 0000000..54e7d0d --- /dev/null +++ b/next/search.index/0aa5f3464354.js @@ -0,0 +1 @@ +rn_("AQVlcnJvcgAB2wYAAAEFZWFzb24A8kMKAAABAAEDaW5kAPLKCQAAAQABBWVzdWx0APJBCgAAAQABA25mbwDywwkAAAEAAQRycm9yAPLqCQAAAQDzAm9uA2VpcgFqCgAAAQZhaWx1cmUAAXMKAAABAWQA83EFAADEAcgBAQRpdmVyAAGfCgAAAQJ0YQD0WwgAAAEAbAEBAPMAAmFyAPMAhjgFATowAAABAAAAAAAOABAAAACxBLIEswTYBNkE2gbNBysJLAntCe4JPgo/CkUKRgoBAADzcAQAAAEA4wUBAnB0APK3BAAAKgUBBmdpc3RyeQD1KgkAAK0AAQABAJIA8wACZXkAAQR0ZXJzAAHpCQAAEwRhcmFtAoAAAAAJEWVzAAEKb3RpbWVzdGFtcADynQoAAAYA8wJudAF08qAKAAAEAAEDdG5zAAGKCgAAAQVyaXZlcgABnwoAAPMDZWN0AWTz2gYAABMDAQABAmlnAPL5CAAAAQBjAAOAAAAACSdkZm4AAQdwcmVzc2VkAPP7CAAAAQAdAAELdGF0ZXRpbWVvdXQA8ocKAAABAAEGcHRpb25zAAHHCQAA8wABb/W2BAAAJwABAIYDAQABA29kZQD1GAcAAAEAXgEBAAEAAQRvaWNlAAGcCQAA8wABdgEgCQAAAQVvbmZpZwDy+QgAAAEA8wFlhQwQA/TmAwAAAQCXAC8F8wCFCDAKAAEIaWVudGRhdGEAAZkKAAABB2NyaXB0b3IAAegJAAABAnVlAAGUBQAA+wMCcXMAAQlhY2hlZXJyb3IA8uYJAAABAPMAyQADsgvzmQAAALoJSwA=") \ No newline at end of file diff --git a/next/search.index/0b08a89d64b2.js b/next/search.index/0b08a89d64b2.js new file mode 100644 index 0000000..f440bac --- /dev/null +++ b/next/search.index/0b08a89d64b2.js @@ -0,0 +1 @@ +rn_("AQN1bHQAAc4JAAABA3JvcgD09AgAAOAAAQABAAEDaXplAAFbCgAAAQd5dGVzaXplAAGYCgAA8wRyYW1lAmJzAPMAAWbyBAQAAAEAAQVhbmRsZQDydAoAAAEAIwRoYXJkArcgCfMAAWVoAAEDbml0APIICQAAAQABCXJvbWNvbmZpZwABkAoAAPMCdHkDZmlzOzAAAAEAAAUAAgCHBQIAuwUCACMAAqZQAAAG/WNpAAEKaXN0ZXJzaGFyZAABTwoAAAECdXQAAfAGAADzAAFt8qYDAAABAPMAhmBgAwA=") \ No newline at end of file diff --git a/next/search.index/0b8c2a02fb0e.js b/next/search.index/0b8c2a02fb0e.js new file mode 100644 index 0000000..301db2d --- /dev/null +++ b/next/search.index/0b8c2a02fb0e.js @@ -0,0 +1 @@ +rn_("AQlvZmlsZXR5cGUAAUkKAAABCGJhY2tzZWVrAAFjCgAAAQVvZGVjcwABVAoAAPMBZAFjAXEIAADzAnJ0AmVzAAELeWxlbmd0aGhpbnQAAV8KAAAJAgDzugQAAAEAGQABBGNrZXQAOzAAAAEAAAUAAgDdBgIAKAcCAPMAhRFIAQA=") \ No newline at end of file diff --git a/next/search.index/0ba045a4b391.js b/next/search.index/0ba045a4b391.js new file mode 100644 index 0000000..f86f678 --- /dev/null +++ b/next/search.index/0ba045a4b391.js @@ -0,0 +1 @@ +rn_("AQNzb24AAWEKAAABB2V0YWRhdGEAAdMJAAAjAAKQAAbqAAFsbQDzAAJkavNkAwAAWQA0Aw==") \ No newline at end of file diff --git a/next/search.index/0d514af60f20.js b/next/search.index/0d514af60f20.js new file mode 100644 index 0000000..538a7a7 --- /dev/null +++ b/next/search.index/0d514af60f20.js @@ -0,0 +1 @@ +rn_("AQh1ZmZpeGxlbgABbQoAAAEGZXJoZWFkAAFSCgAAAQRmc2V0APLeCQAAAQDzAAJmdgABBW5kcGFkAPIxCgAAAQDzAWQDZW9z8k4KAAA7AA==") \ No newline at end of file diff --git a/next/search.index/0da0bedc9654.js b/next/search.index/0da0bedc9654.js new file mode 100644 index 0000000..3f2026e --- /dev/null +++ b/next/search.index/0da0bedc9654.js @@ -0,0 +1 @@ +rn_("AQJ1dADyRggAAAEAAQlvc3RwZXJzZWMAAZ4KAADzAAJjbTowAAABAAAAAAAPABAAAAD4A/kD+gOPBJAEkQS8BJUF0gYUBxUHzAf7CPwIGQk5CQ==") \ No newline at end of file diff --git a/next/search.index/0dff1b44ff35.js b/next/search.index/0dff1b44ff35.js new file mode 100644 index 0000000..8f69add --- /dev/null +++ b/next/search.index/0dff1b44ff35.js @@ -0,0 +1 @@ +rn_("AQ5lY29ubmVjdGRyaXZlcgABnwoAAAEFYXJrZXIAAV4IAAABCmVhdmVzZXJ2ZXIAAYIKAAABDmNvdmVyeXJlc3BvbnNlAAGhCgAAAQAAOzAAAAEAAAUAAgDABAIAqgUCAPMAAmRzAAEDeXB0AAHhCQAAAQJkZQABrQkAAPMCZWMCb3IAAQllYXRlYXN5bmMA9X0KAAABAAEAAQABAAEHbnRhaW5lcgDywQkAAAEA8wACb3IAAQh1ZmZlcmxlbgABPQoAAHcPAACIpyAAAAkpHhkB86gBAACiASgA") \ No newline at end of file diff --git a/next/search.index/0e87582c35fd.js b/next/search.index/0e87582c35fd.js new file mode 100644 index 0000000..1017596 --- /dev/null +++ b/next/search.index/0e87582c35fd.js @@ -0,0 +1 @@ +rn_("AQh1ZmZpeGxlbgAB4gkAAAEFZW5kZXIAATAJAAAjAAKAAAAABQJyczswAAABAABiAAQAOwlfAEAKAABoCgAAlwoAAPMAAmVzAA==") \ No newline at end of file diff --git a/next/search.index/0f7f0f9af438.js b/next/search.index/0f7f0f9af438.js new file mode 100644 index 0000000..0fa2dd4 --- /dev/null +++ b/next/search.index/0f7f0f9af438.js @@ -0,0 +1 @@ +rn_("AQdvdW5pbml0ADswAAABAAAxAAEA+AkxAAEGdG9yYWdlADswAAABAABfAAEAOwlfAAEDbnRvADswAAABAAAxAAEAmgcxAAEJcm9tY29uZmlnAAGcCgAAARBlYnVnZ2FibGVzdG9yYWdlAAGXCgAAAQpibGVzdG9yYWdlAAFACgAA8wFlhikBBjswAAABAAAzAAMASwMAAHMDMQBRCAAA") \ No newline at end of file diff --git a/next/search.index/110957c68ffc.js b/next/search.index/110957c68ffc.js new file mode 100644 index 0000000..f125986 --- /dev/null +++ b/next/search.index/110957c68ffc.js @@ -0,0 +1 @@ +rn_("AQRycm9yAPI5CgAAAQDzBXRyZWFtAWXzVwgAAAEAHAABAnVzAAGXBQAAAQhyYW1lcmF0ZQABNAoAAAEIdWZmZXJyZWYAAcAJAADzAIQigAIA") \ No newline at end of file diff --git a/next/search.index/11af7eb33055.js b/next/search.index/11af7eb33055.js new file mode 100644 index 0000000..9307766 --- /dev/null +++ b/next/search.index/11af7eb33055.js @@ -0,0 +1 @@ +rn_("AQJuZwABpQoAAPMCY2sBafIuCQAAAQABBnRvcmFnZQDyQAoAAFcAAQNvb3AA8noIAACgAAEEcnJvcgDyVwoAAAEAAQRzeW5jAPJ5CgAAAQDzAIQRCAI7MAAAAQAADgAEAH8FAQDdCAgApAkCAJIKAADzAAJlbwA=") \ No newline at end of file diff --git a/next/search.index/11bcf18881b0.js b/next/search.index/11bcf18881b0.js new file mode 100644 index 0000000..afbd1e8 --- /dev/null +++ b/next/search.index/11bcf18881b0.js @@ -0,0 +1 @@ +rn_("AQJybAABXQgAAPMDaW50AXUBpgUAAAELZWVwYWxpdmVnYXABpzAAAAqFbQFdCgAAYwADtkAKMQABYWtvAA==") \ No newline at end of file diff --git a/next/search.index/12338b319c22.js b/next/search.index/12338b319c22.js new file mode 100644 index 0000000..9a0f362 --- /dev/null +++ b/next/search.index/12338b319c22.js @@ -0,0 +1 @@ +rn_("AQJuZQAB/gQAAAEEb2RlcgDyZAgAAAEAIwACpmAAAAT9YWMAAQJ0YQAB/AQAAPMAA2FlbwA=") \ No newline at end of file diff --git a/next/search.index/13dae58cad89.js b/next/search.index/13dae58cad89.js new file mode 100644 index 0000000..ccdf6eb --- /dev/null +++ b/next/search.index/13dae58cad89.js @@ -0,0 +1 @@ +rn_("AQJvcgD09QgAAAEAAQABAAEDb2RlAPIzCQAAAQABBHJyb3IA89QJAAABAAEAAQVvbmZpZwDy8QkAAAEAAQJhdwAB8AkAAPMCdGUBcvYrBwAAAQABADoBhQABAPMAhRUQATowAAABAAAAAAAKABAAAAD6BOAG4Qb+Bv8GAAcBCQIJAwmhCZQK") \ No newline at end of file diff --git a/next/search.index/1522cc1250ba.js b/next/search.index/1522cc1250ba.js new file mode 100644 index 0000000..544bf73 --- /dev/null +++ b/next/search.index/1522cc1250ba.js @@ -0,0 +1 @@ +rn_("AQNmaWcA9nsIAAAUAgEAAQALAAoAEwACp0AAAApgbnMAAQV0Y2hlcgDzNQkAAAEAeADzAAJhbwA=") \ No newline at end of file diff --git a/next/search.index/165145174e7d.js b/next/search.index/165145174e7d.js new file mode 100644 index 0000000..fe3f198 --- /dev/null +++ b/next/search.index/165145174e7d.js @@ -0,0 +1 @@ +rn_("AQJhcADybwgAAAEAAQlyb21jb25maWcAAZEKAADzAXQCZm30kQUAAAEAAQAjAfMAAWg7MAAAAQAAFgALANwDBABzBAEATQgBAHsIAADxCAIA+QgBANsJAADxCQEAjwoCAJwKAACmCgAA") \ No newline at end of file diff --git a/next/search.index/16555cc5d940.js b/next/search.index/16555cc5d940.js new file mode 100644 index 0000000..04628ed --- /dev/null +++ b/next/search.index/16555cc5d940.js @@ -0,0 +1 @@ +rn_("AQNhdGEA8hIJAAABAPMAAWT2tAQAAAEAJQAkBAEAAQDzAAF0AV4DAAABBmVyc2lvbgABkwoAAAEGaW1lb3V0APIuCgAAAQDzAmF5AnR29GEIAAABALwAAQABCW9pY2VzdGF0ZQDybgoAAAEAAQVwZGF0ZQDzIwkAAFMBAQAJAwDyhwoAAAEAAQNhdGUAASQJAAABB2VxdWlyZWQAAWwKAAABAnplAPKECgAAFAABBHJ2ZXIAAb8JAADzAIQQAQXySAMAAAEAAQNpdGgAAasJAAABBHJlYW0A8mQKAAABAAkBAAGbCgAAAQlyb21jb25maWcAAaYKAADzBm5nYmlyZAJmdwFiCgAAAQNhcmQA8uAJAABvAPMAA2hvdPKWBQAAUwQBAmFsAAF0BQAACQMAAY8KAAABA2l6ZQABWwoAAAEHeXRlc2l6ZQABmAoAAPMEcmFtZQJicwDzAW8BZvIEBAAAAQABDW9ubmVjdGZhaWx1cmUAAXMKAAABAm9yAAF1BQAAEwACgAAAAAnwdHcA8wCHNSASOjAAAAEAAAAAAAsAEAAAAIMBhAGvAokEugXFBvQG9QYkByUH6gg6CQEFZW5ndGgAAfUJAAABBm5pY2tlZADyxQkAAAEA8wACYWwAAQd0bGVuZ3RoAAHaCQAAAQp0ZGlzY2FyZGVkAPI3CgAAAQDzAAFwAYIBAAABAmVuADswAAABAAAGAAEAmAUGAAEAAPWMBQAAAQAzAAEAAQABAnJ5AAFtBQAA8wACb3kAAQVyYWNrcwDyewoAAAEAAQVvZGVjcwABVAoAAPMAAmN09XEFAABrAVkAPAGMAAEKb3RpbWVzdGFtcAABnQoAAPMCbnQBdAGgCgAAAQN0bnMAAYoKAAD7DQJzdQABA3luYwA7MAAAAQAACQACABQJBAB9CgQAAQh0aXZhdGlvbgABaQoAAPMAAmNzAPMAz0ATrj86MAAAAQAAAAAALgAQAAAApAG6ArsCywPMA+ED4gPjA+QD7AN1BHYEdwR4BHkErAStBP8EAAUHBXMFzwbQBiYHJwcrBywHLQczBzQHNwdnCHIIcwjsCO0I7ggjCSQJqgmsCewJNApuCm8Kdgp3Cg==") \ No newline at end of file diff --git a/next/search.index/1752367c249d.js b/next/search.index/1752367c249d.js new file mode 100644 index 0000000..7cba20a --- /dev/null +++ b/next/search.index/1752367c249d.js @@ -0,0 +1 @@ +rn_("AQZoYXJkZXIA8s8JAAABAAEBZADzewUAAEoEAQDzAAFl9OYGAAABAAEAAQABBXBkYXRlAPJyCAAAAQABA2ljawD05gYAAAEAAQABAAEEdGF0ZQDzNwcAADcDAQABCGFja2V0bWF4AAFMCgAAAQ1hdGV3YXl2ZXJzaW9uAAGTCgAAAQNhdGEA8uQGAAABAPMAhkiADvPKAwAADQDFBXMAhIAAAAAD+xAEQvO+BAAAAQC9AA==") \ No newline at end of file diff --git a/next/search.index/17569c26c8e4.js b/next/search.index/17569c26c8e4.js new file mode 100644 index 0000000..14b5748 --- /dev/null +++ b/next/search.index/17569c26c8e4.js @@ -0,0 +1 @@ +rn_("AQAAOzAAAAEAABYACwDcAwQAcwQBAE0IAQB7CAAA8QgCAPkIAQDbCQAA8QkBAI8KAgCcCgAApgoAAA==") \ No newline at end of file diff --git a/next/search.index/176c7851f54a.js b/next/search.index/176c7851f54a.js new file mode 100644 index 0000000..0d00a7b --- /dev/null +++ b/next/search.index/176c7851f54a.js @@ -0,0 +1 @@ +rn_("AQAA9PoEAAAHBAEAAQDzAWUBcjowAAABAAAAAAAJABAAAADvA4YEhwRBCEIIQwhqCGsIdAp1Cg==") \ No newline at end of file diff --git a/next/search.index/183ce403bfbf.js b/next/search.index/183ce403bfbf.js new file mode 100644 index 0000000..b43e980 --- /dev/null +++ b/next/search.index/183ce403bfbf.js @@ -0,0 +1 @@ +rn_("AQpvdGltZXN0YW1wAPKdCgAABgDzAAF09aUDAABKBYkBKAAEAAEDbml0ADswAAABAAAxAAEA+AkxAAEIZWRzZW5kZXIAAfcJAADzAANkaXQA") \ No newline at end of file diff --git a/next/search.index/184d9fce7601.js b/next/search.index/184d9fce7601.js new file mode 100644 index 0000000..9dbf5a5 --- /dev/null +++ b/next/search.index/184d9fce7601.js @@ -0,0 +1 @@ +rn_("AQJhcADybwgAAAEAAQlyb21jb25maWcAAZEKAADzBGlnaHQCZm30kQUAAAEAAQAjAQ==") \ No newline at end of file diff --git a/next/search.index/18a7b3e6afe1.js b/next/search.index/18a7b3e6afe1.js new file mode 100644 index 0000000..4f23aa9 --- /dev/null +++ b/next/search.index/18a7b3e6afe1.js @@ -0,0 +1 @@ +rn_("AQRuZ3RoAAH1CQAAAQRycm9yAPJXCgAAAQABBHN5bmMA8nkKAAABAPMFeWFibGUCYWXzpAkAAAEAAQDzAAJhZQABA2luZwDy1gYAAAEAAQVpY2tlZADyxQkAAAEAAQZpdmVnYXABpzAAAAqFbQFdCgAAAQZrZXRtYXgAAUwKAADzAIQEKAEA8wACYWwA") \ No newline at end of file diff --git a/next/search.index/1a530b0ee65d.js b/next/search.index/1a530b0ee65d.js new file mode 100644 index 0000000..6759b4f --- /dev/null +++ b/next/search.index/1a530b0ee65d.js @@ -0,0 +1 @@ +rn_("AQdsb2NraW5nAAGlCgAA8wNhdHMBYgGDCgAA8wABdAHlCQAA8wNlYWQBc/MFCQAAxwABAA==") \ No newline at end of file diff --git a/next/search.index/1a71384e82cd.js b/next/search.index/1a71384e82cd.js new file mode 100644 index 0000000..e4de777 --- /dev/null +++ b/next/search.index/1a71384e82cd.js @@ -0,0 +1 @@ +rn_("AQVlYWRlcgDy2AYAAAEAAQlvc3RwZXJzZWMAAVMKAAABBmRhcHRlcgDzJAcAAAEAxQHzAANhY3L2mAAAANcAAQABAAEAfgg=") \ No newline at end of file diff --git a/next/search.index/1a7cd887f7b2.js b/next/search.index/1a7cd887f7b2.js new file mode 100644 index 0000000..1142c85 --- /dev/null +++ b/next/search.index/1a7cd887f7b2.js @@ -0,0 +1 @@ +rn_("AQR1ZXVlAAGbCQAAAQhubmVjdGlvbgABagoAAAEFYW5uZWwAASoKAADzAAJobwDzAAJjcQHcBAAAAQVhbmRsZQDydAoAAAEAIwRoYXJkArcgCfMAAWVoAAEDbml0APIICQAAAQABCXJvbWNvbmZpZwABkAoAAPMCdHkDZmlzOzAAAAEAAAUAAgCHBQIAuwUCAGMAA6ZQAAAG/WNpdAA=") \ No newline at end of file diff --git a/next/search.index/1b2386648c6a.js b/next/search.index/1b2386648c6a.js new file mode 100644 index 0000000..fdcd669 --- /dev/null +++ b/next/search.index/1b2386648c6a.js @@ -0,0 +1 @@ +rn_("AQx1bm5lcm1lc3NhZ2UAAWgKAAABBWFuZGxlAPJ0CgAAAQABAXIA9tIEAAABAPwEAQAjAAEAAQRvdW50AAHvCAAA9wAAAWSFkAAEmAABlAAD9mcDAAABAIoDAQDtAm8A") \ No newline at end of file diff --git a/next/search.index/1c58faa3938b.js b/next/search.index/1c58faa3938b.js new file mode 100644 index 0000000..70d65bb --- /dev/null +++ b/next/search.index/1c58faa3938b.js @@ -0,0 +1 @@ +rn_("AQJuZwA7MAAAAQAAHQACAAMHDgCwCQ4AAQRycm9yAPI5CgAAAQDzAmFtAWXzVwgAAAEAHADzAAJlaQABBWVyc2VjAPJTCgAASwBjAAOnMAAACopucHIBYAoAAAEEdGlvbgDzuAUAAAEAowQBA2RlcgABeQUAACMAA4AAAAAFlZAABaMAAWRucvSvBAAAAQAnAPoBAQRvdW50AAGkCgAA8wNwbGUBYzswAAABAABdAAEAfwhdAAEFaHJlYWQA8swJAAABAPMAAXQBogUAAPMAAmxtAPMAhBEBBAA=") \ No newline at end of file diff --git a/next/search.index/1ce2008379ea.js b/next/search.index/1ce2008379ea.js new file mode 100644 index 0000000..4abcc74 --- /dev/null +++ b/next/search.index/1ce2008379ea.js @@ -0,0 +1 @@ +rn_("AQdhaWxhYmxlAAGSCgAAAQVlc3VsdAABzgkAAPMCemUBcgGnBQAA8wABaQF0BQAAAQJlcgABAgUAAAEGbGVsb29wAAF6CAAAtwEAAMWmwAAABwKAUAIIAA==") \ No newline at end of file diff --git a/next/search.index/1dc63b2fa2a1.js b/next/search.index/1dc63b2fa2a1.js new file mode 100644 index 0000000..b55cbb4 --- /dev/null +++ b/next/search.index/1dc63b2fa2a1.js @@ -0,0 +1 @@ +rn_("AQJybAABUAgAAAEEcmVhbQABWQoAAPMAAXQBCQUAAPMCY2UCc3U7MAAAAQAADQAFAJsEBwA4BwAAYwgAADUKAQBwCgEA") \ No newline at end of file diff --git a/next/search.index/1e58411550b3.js b/next/search.index/1e58411550b3.js new file mode 100644 index 0000000..96e7680 --- /dev/null +++ b/next/search.index/1e58411550b3.js @@ -0,0 +1 @@ +rn_("AQVlYXNvbgDyQwoAAAEAAQNpbmQA8soJAAABAAEDYXRhAPLICQAAAQDTBG5lY3SEpkAAAAj9GAQB9c0HAABxAgEABgABAA==") \ No newline at end of file diff --git a/next/search.index/1fafcc6c4467.js b/next/search.index/1fafcc6c4467.js new file mode 100644 index 0000000..ae7a900 --- /dev/null +++ b/next/search.index/1fafcc6c4467.js @@ -0,0 +1 @@ +rn_("AQRvaWNlAAGcCQAAAQNvZGUA8jMJAAABAAEEcnJvcgDz1AkAAAEAAQABBW9uZmlnAPLxCQAAAQDzA2xlcgNjZW334AYAAAEAHQABAAEAoQLzAAEEYWNrcwDyewoAAAEAIwACgAAAAAWGb3IAAQVlbmRlcgAB9wkAAAECdXQA844FAAABAAEAAQZ0YWRhdGEAAdMJAAATAAK3QAhGAAFldQABBXRyZWFtAAFZCgAA8wdhc291cmNlAXPzYwgAANIBAQABA2VudADyCwkAAAEAAQ51Z2dhYmxlc3RvcmFnZQABlwoAAPMAAmJ2AAEHdHBlcnNlYwABngoAAAEDZWNzAAFUCgAA8wFvAmRzAAECdGEA8uQGAAABAPd+AADLkAAG6gABQEUWDzswAAABAABZABkA+AMCAPwDAQBsBAIAjwQCALgEAAC6BAMA1AQAAGsFAABxBQEAewUAAJUFAADDBTEA0gYAANwGAAAUBwEANQcAAMwHAABxCAAA+wgCABkJAAAgCQAAOQkAAMUJAQA3CgEAbAoAAA==") \ No newline at end of file diff --git a/next/search.index/20dc681c2899.js b/next/search.index/20dc681c2899.js new file mode 100644 index 0000000..0ac5bdb --- /dev/null +++ b/next/search.index/20dc681c2899.js @@ -0,0 +1 @@ +rn_("AQNhY2sA8p0JAAABAAEGZXF1ZXN0APJfCAAAAQDzAAFy8k8CAABqBAEJdGltZXN0YW1wAPKdCgAABgABAm1lAAFTCAAAAQtwdGRpc2NhcmRlZADyNwoAAAEAEwACkAAEiQI8bXIA8wCFEMEBAA==") \ No newline at end of file diff --git a/next/search.index/21183a56c7ce.js b/next/search.index/21183a56c7ce.js new file mode 100644 index 0000000..e5e24ea --- /dev/null +++ b/next/search.index/21183a56c7ce.js @@ -0,0 +1 @@ +rn_("AQdmZml4bGVuAAFtCgAAAQdsb2NraW5nAAGlCgAA8wNhdHMBYgGDCgAAAQR1cmNlAAE4BwAAAQRuZGVyAAH3CQAA8wCEEEAM85gEAAABAEwF") \ No newline at end of file diff --git a/next/search.index/211d88fb3cc2.js b/next/search.index/211d88fb3cc2.js new file mode 100644 index 0000000..b6297af --- /dev/null +++ b/next/search.index/211d88fb3cc2.js @@ -0,0 +1 @@ +rn_("AQhvbWNvbmZpZwABnAoAAAECdXQAAfAGAAABBXJlbmNlAAH9BgAAAQRyYWNrAPKdCQAAAQABCGNoZWR1bGVyAAGUCgAAAQdyb21jb3N0AAFgCgAAAQVvbmZpZwAB2wkAAAEGaXRyYXRlAAHsCQAA8wN1bHSFJgAGOzAAAAEAABcAAQDfBBcA8wCEERAB9UcDAABfAAEAUgHHBA==") \ No newline at end of file diff --git a/next/search.index/213c30d2be3d.js b/next/search.index/213c30d2be3d.js new file mode 100644 index 0000000..bc8828b --- /dev/null +++ b/next/search.index/213c30d2be3d.js @@ -0,0 +1 @@ +rn_("AQ5lY29ubmVjdGRyaXZlcgABnwoAAAEKZWF2ZXNlcnZlcgABggoAAAEDeXB0AAHhCQAAAQJkZQABrQkAAPMCZWMCb3IAAQpyZWF0ZWFzeW5jAPV9CgAAAQABAAEAAQDzAWSEDAgBAA==") \ No newline at end of file diff --git a/next/search.index/23beb180d79b.js b/next/search.index/23beb180d79b.js new file mode 100644 index 0000000..26e96aa --- /dev/null +++ b/next/search.index/23beb180d79b.js @@ -0,0 +1 @@ +rn_("AQRyYWNrAPKdCQAAAQABCGNoZWR1bGVyAAGUCgAAAQdyb21jb3N0AAFgCgAAAQVvbmZpZwAB2wkAAAEGaXRyYXRlAAHsCQAA8wJsdIUmAAY7MAAAAQAAFwABAN8EFwA=") \ No newline at end of file diff --git a/next/search.index/24dfb17fe4e4.js b/next/search.index/24dfb17fe4e4.js new file mode 100644 index 0000000..625bfb0 --- /dev/null +++ b/next/search.index/24dfb17fe4e4.js @@ -0,0 +1 @@ +rn_("AQZ5cXVldWUAASEJAAAjAAOAAAAABXymcAAACkdjZm4AAQpuYXZhaWxhYmxlAAGSCgAAAQt0YXRldGltZW91dADyhwoAAAEAAQZwdGlvbnMAAccJAADzAAFv9bYEAAAnAAEAhgMBAAEDb2RlAPUYBwAAAQBeAQEAAQABBm52YWxpZAABVQoAAAEEb2ljZQABnAkAAPMAAXYBIAkAAAEAAPNwBAAAAQDjBQEHZWdpc3RyeQD1KgkAAK0AAQABAJIAAQR0ZXJzAAHpCQAAEwRhcmFtAoAAAAAJEWVzAAEEbmZpZwDy+QgAAAEAAQllc2NyaXB0b3IAAegJAAABCWFjaGVlcnJvcgDy5gkAAAEA8wCGDMADAHcPAACIgAAAAAO5DBkLOzAAAAEAABcACwC5AgAA5gMBAH4EAADJBAEAfQUBAIUFAAC1BQIAFgcDAHUIBAAzCQEArQkAAPMAAmVpAA==") \ No newline at end of file diff --git a/next/search.index/255bbf87faf5.js b/next/search.index/255bbf87faf5.js new file mode 100644 index 0000000..56996dc --- /dev/null +++ b/next/search.index/255bbf87faf5.js @@ -0,0 +1 @@ +rn_("AQNpdGgAAZsKAAABAmV5APJoCAAAAQABCXJvbWNvbmZpZwABpgoAAPMDaXJkA2Zrd/SKBQAAAQAzAKQE") \ No newline at end of file diff --git a/next/search.index/258ee3fd87f1.js b/next/search.index/258ee3fd87f1.js new file mode 100644 index 0000000..25d5919 --- /dev/null +++ b/next/search.index/258ee3fd87f1.js @@ -0,0 +1 @@ +rn_("AQJhdwAB8AkAAPMAAXL3KwcAAAEAAQA6AYUAAQBHARMAAqcgAAAFdWVvAAECZ3MAARIHAAAzAAOAAAAACfBydHcA") \ No newline at end of file diff --git a/next/search.index/271f393c711a.js b/next/search.index/271f393c711a.js new file mode 100644 index 0000000..1c322a8 --- /dev/null +++ b/next/search.index/271f393c711a.js @@ -0,0 +1 @@ +rn_("AQNhdGUA8jMHAAABAAECZWsAAWMKAADzAAJldDswAAABAAAFAAIAowQDAHsKAQABBWVzdWx0APNsCAAAAQABAAEEdWV1ZQDyMQcAAAEAAQJmZgDzqwQAALsFAQABBWFuZGxlAPJqCAAAAQABA2VudAD0LgcAAAEAAQAmAwECYXgAAUwKAADzAAFtOzAAAAEAAAwABQD3AwAAiwQDAN0GAgAoBwIA5wgBAPMAAnR2AAEHYWxsYmFjawDyNwkAAAEAdw8AAMimQAAABfUAZdABOzAAAAEAAAsABABpAwUA0QMBADcJAQCdCQEA") \ No newline at end of file diff --git a/next/search.index/27954687e911.js b/next/search.index/27954687e911.js new file mode 100644 index 0000000..76bd597 --- /dev/null +++ b/next/search.index/27954687e911.js @@ -0,0 +1 @@ +rn_("AQdvbHkxMzA1AAFeCgAAAQAA9fEDAADUAAEAAQABAPMAATD18QMAANQAAQABAAEAUwADgAAAAApeMDVw9fEDAADUAAEAAQABAA==") \ No newline at end of file diff --git a/next/search.index/2817ae419a69.js b/next/search.index/2817ae419a69.js new file mode 100644 index 0000000..76bf085 --- /dev/null +++ b/next/search.index/2817ae419a69.js @@ -0,0 +1 @@ +rn_("AQFlAPSVBAAAvwMBAAEAIwACApJQqrr9bG0AAQJ0cgAB4wkAAAEDZWFtAAFZCgAAAQRyYWdlADswAAABAABhAAMAOwlfAEAKAACXCgAAAQZsZW5ndGgAAfUJAAAjAAKAAAAABtxkcAABAAJQ1xZxbaV/d57CJ+xtdADzAIURQAP1CAUAABUCAQBBAQEAAQRvbmlkAPNKCAAAAQABAAEJb3N0cGVyc2VjAAGeCgAA8wFkAWP2FAcAAAEAtwAvAQEAHQABBWVuZGVyAAEwCQAA8wJnZQFzAWgKAABzAIS3IAnRAAERQQABBgUAAAEHZXF1aXJlZAABbAoAAAEEb25zZQABoQoAAAEGZnRjbGlwAPIlCQAAAQABAnplAPZFCAAAqgFsACkAAgASAAEEcnJvcgAB9gkAABMCdmUCkAAJvwDDZXIAAQNkZXIAATAJAAAzAAOAAAAAA8VucnQAAQZyaXB0b3IA8hoHAADOAgEFNTZnY20AAbcGAADzAMoCRbAH9aABAAABAKcBAQDAAQ==") \ No newline at end of file diff --git a/next/search.index/2968d3c644cf.js b/next/search.index/2968d3c644cf.js new file mode 100644 index 0000000..97b3424 --- /dev/null +++ b/next/search.index/2968d3c644cf.js @@ -0,0 +1 @@ +rn_("AQZlcnNpb24AAWYIAAABA3lwZQAB0AQAAAECYmUAAfEGAAABBXF1ZXN0APJfCAAAAQDzAAJlbwABCW9maWxldHlwZQABSQoAAAEEY2tldADz3QYAAAEAAQDzAAJhcgABBHJzZWMA8lMKAABLAAEDYXRhAPLOBAAAAQABA3NlZAAB0gYAAAEDa2V0APLnCAAAAQDzAAJjcgD3CwAAyKdAAAAD9kAGoA70cwEAAAEA2wBqBA==") \ No newline at end of file diff --git a/next/search.index/2987bee4aac4.js b/next/search.index/2987bee4aac4.js new file mode 100644 index 0000000..a0c70be --- /dev/null +++ b/next/search.index/2987bee4aac4.js @@ -0,0 +1 @@ +rn_("AQVocmVhZADyzAkAAAEA8wFsAXQBogUAABMAArcgBaMAAWFlAAECc2UAAaEKAADzAAJucwA=") \ No newline at end of file diff --git a/next/search.index/2a36fc40e01b.js b/next/search.index/2a36fc40e01b.js new file mode 100644 index 0000000..890a6a3 --- /dev/null +++ b/next/search.index/2a36fc40e01b.js @@ -0,0 +1 @@ +rn_("AQZpbWVvdXQA8twJAAABAAECcnkA8hsJAAABAAEGb25uZWN0APLtCQAAAQDzAWUCY3QAAQlpc2Nvbm5lY3QA8kUKAAABAAkCAPIrCQAAAQDzAmVyhAwABTswAAABAAAGAAMA6AMDAH8EAQCfCgAAAQtobW5vbmNlc2l6ZQABhgoAAAEDdG9yAPIaBwAAzgIBA2RpYwABfAUAAAEDZXJ0AAGgCQAAAQAAOzAAAAEAACEABQAGBAAAegUAANYGAQADBw4AsAkOAPMAAmdzAAECdmUAAYEFAAABAAD0CAQAAAEAAQBiAQEGaGFyZGVyAPLPCQAAAQDzAAFz8r4EAAABAPMAyAAHOAoA") \ No newline at end of file diff --git a/next/search.index/2ad19a3b35db.js b/next/search.index/2ad19a3b35db.js new file mode 100644 index 0000000..0dd36fb --- /dev/null +++ b/next/search.index/2ad19a3b35db.js @@ -0,0 +1 @@ +rn_("AQRhc2tzAPJACAAASwIBCHRhdGJsb2NrAPIuCQAAAQABBmltZW91dADy3AkAAAEAAQJyeQDyGwkAAAEAAQZvbm5lY3QA8u0JAAABAPMBZQJjdAABCWlzY29ubmVjdADyRQoAAAEACQIA8isJAAABAPMAhAwABTswAAABAAAGAAMA6AMDAH8EAQCfCgAAAQR4ZXJzAAHmCAAAEwACp0AAAAWuaXUAAQRucHV0APPNBgAAAQBxAQECYXABpzAAAAqFbQFdCgAAAQRzeW5jAAEwCgAA8wCHQREH9IkBAAAtARUCLAIBA2lvbgABaQoAAAEDZW50ADswAAABAABrAAEAzgdrAPMAAmx0APMAAmFlAA==") \ No newline at end of file diff --git a/next/search.index/2b51b18b5742.js b/next/search.index/2b51b18b5742.js new file mode 100644 index 0000000..cbd8e95 --- /dev/null +++ b/next/search.index/2b51b18b5742.js @@ -0,0 +1 @@ +rn_("AQNvZGUAAYUFAAABA3JvbQABhAUAAAEDZHRvAAGGBQAAAQN5bmMAAUkIAAABAmxlADswAAABAAAGAAEA3wgGAPMAAmJzAPcAAACFpvAAAAQDMRAEOzAAAAEAAAsABACVAQAAzQIIAFIIAABjCgAA") \ No newline at end of file diff --git a/next/search.index/2b66273bc113.js b/next/search.index/2b66273bc113.js new file mode 100644 index 0000000..f3a9d7f --- /dev/null +++ b/next/search.index/2b66273bc113.js @@ -0,0 +1 @@ +rn_("AQNpdGgAAZsKAAABCXJvbWNvbmZpZwABpgoAAPMGbmdiaXJkAmZ3AWIKAAABA2FyZADy4AkAAG8A8wACaG8A") \ No newline at end of file diff --git a/next/search.index/2cab37783715.js b/next/search.index/2cab37783715.js new file mode 100644 index 0000000..48538ba --- /dev/null +++ b/next/search.index/2cab37783715.js @@ -0,0 +1 @@ +rn_("AQRsZGVyAAEpCQAAAQlmZXJsZW5ndGgA8pUKAAABAPMAAmZpAAEDb2NrAPIuCQAAAQABBXRyYXRlAPLuCAAA/gDzAANpbHUA") \ No newline at end of file diff --git a/next/search.index/2cff377c39e8.js b/next/search.index/2cff377c39e8.js new file mode 100644 index 0000000..2b062ec --- /dev/null +++ b/next/search.index/2cff377c39e8.js @@ -0,0 +1 @@ +rn_("AQVlc3VsdADyQQoAAAEAAQJmbwDywwkAAAEAAQAA80oIAAABAAEA8wACZG4AAQRycm9yAPLqCQAAAQBzAISQAAktAJoQAQM6MAAAAQAAAAAADgAQAAAA2APZA/UDCwQMBHAFpQW4BbkFZghaClwKaQpqCpMK") \ No newline at end of file diff --git a/next/search.index/2dc25503fff4.js b/next/search.index/2dc25503fff4.js new file mode 100644 index 0000000..e77b9ef --- /dev/null +++ b/next/search.index/2dc25503fff4.js @@ -0,0 +1 @@ +rn_("AQp0YXRldXBkYXRlAPJ2CgAAAQABBXRld2F5APRhCAAAAQC8AAEA8wACYXM7MAAAAQAAKAAKAAYEAAABBQAAAwUCAHoFAAC/BQAA1gYBAAMHDgCwCQ4ARwoAAKUKAAA=") \ No newline at end of file diff --git a/next/search.index/2e481fc27810.js b/next/search.index/2e481fc27810.js new file mode 100644 index 0000000..6414591 --- /dev/null +++ b/next/search.index/2e481fc27810.js @@ -0,0 +1 @@ +rn_("AQR0dXJlAPN8CAAAAQABAAEEY2xpcADyJQkAAAEAAQNpemUA8u8JAABsAAEDYXRlAAE0CgAAAQd5dGVzaXplAPKECgAAFADzA2FtZQNicnMAAQZsZXR5cGUAAUkKAAABAmV0APLeCQAAAQDzAAFz86sEAAC7BQEA8wCFIAENAYgEAAA=") \ No newline at end of file diff --git a/next/search.index/2e5da51df9f6.js b/next/search.index/2e5da51df9f6.js new file mode 100644 index 0000000..ce63bcd --- /dev/null +++ b/next/search.index/2e5da51df9f6.js @@ -0,0 +1 @@ +rn_("AQNpb24AAWkKAAABBGFsdWUAAaIJAAABAnBlAAEdCQAAAQhhY2tldmVudAABVgoAAPMAAnJ5AAEFZW5ndGgAAXIKAADzAWQDbHR2AVUKAAABAm50ADswAAABAABrAAEAzgdrADMAA6ZQAAAJomVpdQABBWxhYmxlAAGSCgAA8wADaWx0AA==") \ No newline at end of file diff --git a/next/search.index/2e860ea8a4f2.js b/next/search.index/2e860ea8a4f2.js new file mode 100644 index 0000000..8843890 --- /dev/null +++ b/next/search.index/2e860ea8a4f2.js @@ -0,0 +1 @@ +rn_("AQlvc3RwZXJzZWMAAZ4KAADzAWQBY/YUBwAAAQC3AC8BAQAdABMAArcgCdEAAWVvAA==") \ No newline at end of file diff --git a/next/search.index/2e996cb856e4.js b/next/search.index/2e996cb856e4.js new file mode 100644 index 0000000..8f7a1b0 --- /dev/null +++ b/next/search.index/2e996cb856e4.js @@ -0,0 +1 @@ +rn_("AQdvb2xhcmdlAAFICgAAAQNyb3IA9DEJAAABAAkBAQABBmNvZGluZwABRwoAAPMAAm5yAPMDYXRhAmV0OzAAAAEAAA4ABQB2BQIAsAUEAFkIAQANCQMA0wkAAA==") \ No newline at end of file diff --git a/next/search.index/2e9a232f12b0.js b/next/search.index/2e9a232f12b0.js new file mode 100644 index 0000000..044abe6 --- /dev/null +++ b/next/search.index/2e9a232f12b0.js @@ -0,0 +1 @@ +rn_("AQdwbGVuZ3RoAAH1CQAAAQphbXBsZWNvdW50AAGkCgAAAQh5dGVjb3VudAABoAoAAPMBbwJicwDzAm1wAXTynQoAAAYA8wF0AmFlAAECdXQA9twJAAABAFEAAQBYAAEACQAA844FAAABAAEAAQR2ZW50APILCQAAAQDzAAJlbwFrBQAA8wADZG9z9ZkBAAA4AykCAQBYARMAAqdAAAAI62VpAA==") \ No newline at end of file diff --git a/next/search.index/2f45a433d713.js b/next/search.index/2f45a433d713.js new file mode 100644 index 0000000..fb19ad7 --- /dev/null +++ b/next/search.index/2f45a433d713.js @@ -0,0 +1 @@ +rn_("AQNvcmUA8hsHAAABAPMAAXT0gQQAAAEAAQAfBgEEdWV1ZQABmwkAAAEFZW5ndGgAAdoJAAABCWFsYmFja29mZgDyZgoAAAEAAQZhbmRsZXIA8wEJAAABAAEAAQRyYW1lAAEHCQAAAQhzY29ubmVjdADyPgoAAAEAAQJ0YQDzwwYAAAEA1QPzAAJhaQABA2V4dADz/ggAAAEAAQABBmVjdGlvbgABagoAAPMBbgJudAABBWFubmVsAAEqCgAA8wACaG8AAQZ1aWxkZXIAASkJAADzAMmAa0IBOzAAAAEAAIAADQBWAwMA2wMAAG8EAACaBAAA3AQAAL0GAgDsBgEALgcCAM4HawALCQEArwkAAE0KAABWCgAA") \ No newline at end of file diff --git a/next/search.index/2f4665b80234.js b/next/search.index/2f4665b80234.js new file mode 100644 index 0000000..7cd7a55 --- /dev/null +++ b/next/search.index/2f4665b80234.js @@ -0,0 +1 @@ +rn_("AQJkZQD1yQQAAAEA6wABAAEAAQRycm9yAPI7CgAAAQDzBnRhZGF0YQFlOzAAAAEAAAUAAgBZCAEADQkDAPMAAmVvAA==") \ No newline at end of file diff --git a/next/search.index/2f6dc4ca248a.js b/next/search.index/2f6dc4ca248a.js new file mode 100644 index 0000000..4de0011 --- /dev/null +++ b/next/search.index/2f6dc4ca248a.js @@ -0,0 +1 @@ +rn_("AQdmZml4bGVuAAFtCgAAAQdsb2NraW5nAAGlCgAA8wNhdHMBYgGDCgAA8wACdHUB5QkAAA==") \ No newline at end of file diff --git a/next/search.index/2f7d77e246ab.js b/next/search.index/2f7d77e246ab.js new file mode 100644 index 0000000..90d10cb --- /dev/null +++ b/next/search.index/2f7d77e246ab.js @@ -0,0 +1 @@ +rn_("AQR1ZXVlAAGbCQAAAQhubmVjdGlvbgABagoAAAEFYW5uZWwAASoKAADzAAJobwDzA2VudAJjcQHcBAAAAQAA9e4DAACOBAEAAQD1AQECcmwAAVAIAAABBHJlYW0AAVkKAADzAAF0AQkFAADzAWUCc3U7MAAAAQAADQAFAJsEBwA4BwAAYwgAADUKAQBwCgEAAQR0aW9uAPJwBQAANQB3AQAAhZAACFAADRUIAQA=") \ No newline at end of file diff --git a/next/search.index/3031ee7b8d94.js b/next/search.index/3031ee7b8d94.js new file mode 100644 index 0000000..5c0411f --- /dev/null +++ b/next/search.index/3031ee7b8d94.js @@ -0,0 +1 @@ +rn_("AQRpdmVyAAGfCgAAAQNpa2UA8qkJAADjAPMAAWwBRgMAAAEFbm5lY3QA8j4KAAABAAEEcmRlZADyNwoAAAEA8wJzYwJhbwABDWF1bHRzY2hlZHVsZXIAAZQKAAABBG9kZWQAASAJAADzAAJjZgABAnRhADowAAABAAAAAAAIABAAAADDBsQGWwhcCBIJEwnICckJmQrzAIURCQEA") \ No newline at end of file diff --git a/next/search.index/30483236173d.js b/next/search.index/30483236173d.js new file mode 100644 index 0000000..d92de0f --- /dev/null +++ b/next/search.index/30483236173d.js @@ -0,0 +1 @@ +rn_("AQJyZQDyGwcAAAEAAQJydADySgoAAAEAMwADgAAAAAnjYW9yAAEIa2VsZW5ndGgA8o0KAAABAAEHcnNlY29uZAABJwkAAPMAAmVpAAEDYXJkAPLyBgAAAQABAmVrAAFSCAAAAQdoZWR1bGVyAPKhCQAA8wABBm9ja2luZwABpQoAAAEGY2tzZWVrAAFjCgAA8wACYWwA8wCGloAEOjAAAAEAAAAAAAcAEAAAAM0DgQSCBIME7gbvBoMKogo=") \ No newline at end of file diff --git a/next/search.index/30550bdb3944.js b/next/search.index/30550bdb3944.js new file mode 100644 index 0000000..c81459e --- /dev/null +++ b/next/search.index/30550bdb3944.js @@ -0,0 +1 @@ +rn_("AQNpemUAAQYJAAAjBGVyb3UCo0AAAAcjNnMAAQNlcnQAAdsEAAABB29sZXJyb3IA8/YIAAABAAEAAQNhdGEA8hIJAAABAPMBdAFk9rQEAAABACUAJAQBAAEAAQd0bGVuZ3RoAAHaCQAA8wACbngAAQRpbmVyAPLBCQAAAQDzAANhZXIAAQRhbnRzAPLuBgAAAQAjAAKAAAAACqFldPItCQAAmgABBWVzdWx0APJBCgAAAQAJCQAB7wkAAAEHeXRlc2l6ZQABhAoAAPMEcmFtZQJicwDzAAFm8osBAAABAAEFZWFzb24A8kMKAAABAAEDaW5kAPLKCQAAAQABA25mbwDywwkAAAEAAQRycm9yAPLqCQAAAQDxAm9uAwABCGVpcgFqCgAAAQZhaWx1cmUAAXMKAAABBGl2ZXIAAZ8KAAABAnRhAPRbCAAAAQBsAQEA8wACYXIA1wMAA2VjdIamQAAACP04BQE6MAAAAQAAAAAADgAQAAAAsQSyBLME2ATZBNoGzQcrCSwJ7QnuCT4KPwpFCkYKAQVvdXJjZQDycAoAAAEAAQRucHV0AAEzCgAA8wF5AmlzAfkGAAABAmZvAPLDCQAAAQABAADzSggAAAEAAQDzAAJkbgABA2l0aAABmwoAAAECZXkA8mgIAAABAAEJcm9tY29uZmlnAAGmCgAA8wRiaXJkA2Zrd/SKBQAAAQAzAKQEAQJpZwA7MAAAAQAAFgALANwDBABzBAEATQgBAHsIAADxCAIA+QgBANsJAADxCQEAjwoCAJwKAACmCgAAAQdvdW5pbml0ADswAAABAAAxAAEA+AkxAAEGdG9yYWdlADswAAABAABfAAEAOwlfAAEDcm9yAPTLBgAAAQAeAwEAAQt0aWFsYmFja29mZgDyZgoAAAEAAQNudG8AOzAAAAEAADEAAQCaBzEACQcAAZwKAAABEGVidWdnYWJsZXN0b3JhZ2UAAZcKAAABCmJsZXN0b3JhZ2UAAUAKAADzAIgpIQc7MAAAAQAANAAEAEsDAABzAzEA/gQAAFEIAAAJHADyRQgAAEEC8wFlAXMB7QMAANX/AwDOAIAAAAAJJwILDBATFiAkJScuLwBfmos6MAAAAQAAAAAAEwAQAAAAhwHYA9kD9QMLBAwEkgRwBaUFuAW5BWYIQwpECloKXAphCmkKagqTCg==") \ No newline at end of file diff --git a/next/search.index/30f44cbd03cf.js b/next/search.index/30f44cbd03cf.js new file mode 100644 index 0000000..87cadc4 --- /dev/null +++ b/next/search.index/30f44cbd03cf.js @@ -0,0 +1 @@ +rn_("AQVvc3RucwABigoAAAEJY3RpdmF0aW9uAAFpCgAA8wACYWMA8wABZTowAAABAAAAAAAMABAAAABcA10DrQOuA68DsAP2A80GzgY/CEgInwkzCgEGZWNvZGVyAPJkCAAAAQABCW9tcHJlc3NvcgDy0QkAAAEA8wACY2T0jQEAADABAQDZAvMAAnN0AA==") \ No newline at end of file diff --git a/next/search.index/310241be6c37.js b/next/search.index/310241be6c37.js new file mode 100644 index 0000000..81a376f --- /dev/null +++ b/next/search.index/310241be6c37.js @@ -0,0 +1 @@ +rn_("AQVrYWJsZQA7MAAAAQAABgABAN8IBgABCW9zdHBlcnNlYwABngoAAPMAAWP2FAcAAAEAtwAvAQEAHQDzAAJkZQA=") \ No newline at end of file diff --git a/next/search.index/3163613c5864.js b/next/search.index/3163613c5864.js new file mode 100644 index 0000000..b992459 --- /dev/null +++ b/next/search.index/3163613c5864.js @@ -0,0 +1 @@ +rn_("AQJvcgA7MAAAAQAABgACAMgGBADqCQEAAQZlc3NhZ2UAAWgKAAABBmhhcmRlcgDyzwkAAAEA8wFjAXPyvgQAAAEA8wADaW1y9TsIAAABAAEAhAEBAA==") \ No newline at end of file diff --git a/next/search.index/32c3b12425b3.js b/next/search.index/32c3b12425b3.js new file mode 100644 index 0000000..c7c3879 --- /dev/null +++ b/next/search.index/32c3b12425b3.js @@ -0,0 +1 @@ +rn_("AQNpdGgAAZsKAAABAmV5APJoCAAAAQABCXJvbWNvbmZpZwABpgoAAPMBZANma3f0igUAAAEAMwCkBA==") \ No newline at end of file diff --git a/next/search.index/3361d2c9b325.js b/next/search.index/3361d2c9b325.js new file mode 100644 index 0000000..e6998bc --- /dev/null +++ b/next/search.index/3361d2c9b325.js @@ -0,0 +1 @@ +rn_("AQZlcnNpb24AAZMKAAABAnV0APIuCgAAAQDzA2ltZQFv8voGAAABAAEKcGlrZWxlbmd0aADyjQoAAAEAAQt1ZmZlcmxlbmd0aADylQoAAAEA8wF0AmJzAAEEbnB1dAABMwoAAPMCbHkBaQH5BgAA8wACbnUAAQNvZGUA8n0FAAABAAEIdWZmaXhsZW4AAW0KAAABBmVyaGVhZAABUgoAAAEEZnNldADy3gkAAAEA8wACZnYAAQVuZHBhZADyMQoAAAEA8wNvYWQDZW9zAAkMAAFICAAAAQAA8wMFAAABAAEA8wFuAmdwAAEDcm9yAPPTBgAAAQABACMAAoAAAAAEuGRyAOcPAADIPb+ZhtlXQEQWCjowAAABAAAAAAALABAAAACQAZEBkgG/AsACwQJxA7kEYQhiCB4JHwk=") \ No newline at end of file diff --git a/next/search.index/347541ae8406.js b/next/search.index/347541ae8406.js new file mode 100644 index 0000000..be39619 --- /dev/null +++ b/next/search.index/347541ae8406.js @@ -0,0 +1 @@ +rn_("AQJlZgABwAkAAAECdGgA8pUKAAABAPMCZW4BZwE9CgAAAQNuY2UAAf0GAADzAANlbHIAIwACgAAAAAR9bnIA") \ No newline at end of file diff --git a/next/search.index/354eb1ec5580.js b/next/search.index/354eb1ec5580.js new file mode 100644 index 0000000..7e4563b --- /dev/null +++ b/next/search.index/354eb1ec5580.js @@ -0,0 +1 @@ +rn_("AQRkYXRlAPVyCAAAAQCwAFMBAQABCWF2YWlsYWJsZQABkgoAAAEKaXRocHJlbG9hZAABiQoAAAEEbnB1dAABnwkAAGMAA5AAA/wAAWRpdzowAAABAAAAAAAHABAAAADAA8ED9wT4BDEHMgchCZsJcwCEpsAAAAhQEKABAA==") \ No newline at end of file diff --git a/next/search.index/35cd1ddc2f76.js b/next/search.index/35cd1ddc2f76.js new file mode 100644 index 0000000..7ea9c6b --- /dev/null +++ b/next/search.index/35cd1ddc2f76.js @@ -0,0 +1 @@ +rn_("AQNyb3IAAfUIAAABAnRoAPKNCgAAAQATAAKnMAAACQRnbTswAAABAAAGAAEAmAUGAPMAAm5yAA==") \ No newline at end of file diff --git a/next/search.index/363bdc9d045c.js b/next/search.index/363bdc9d045c.js new file mode 100644 index 0000000..494dc72 --- /dev/null +++ b/next/search.index/363bdc9d045c.js @@ -0,0 +1 @@ +rn_("AQVhY2tldADzKAcAAAEAAQABA2F0YQDyggUAAAEA8wACZHDyywIAAAEAAQNleHQA8/4IAAABAAEAAQZlY3Rpb24AAWoKAAABAmlnAPNNCAAAAQCNAfMAA2ZudAABCnB1dGVjb3N0bnMAAYoKAAABCmVjcmVnaXN0cnkAAWsKAADzAANkbW4AAQJpcADyJQkAAAEAAQRycm9yAAH0CAAA8wFyAWX1rgQAADUCUgIBAHgAAQRubmVsAAEqCgAA8wACYWUA8wCEgMgAAA==") \ No newline at end of file diff --git a/next/search.index/36aadc662f59.js b/next/search.index/36aadc662f59.js new file mode 100644 index 0000000..eeda9b8 --- /dev/null +++ b/next/search.index/36aadc662f59.js @@ -0,0 +1 @@ +rn_("AQlvdGF0c3RhcnQA8koKAAABAAEEcnJvcgDyOQoAAAEAAQZhdGNoZXIA8zUJAAABAHgA8wADY2Vu9lcIAAABABwA5QELAAEA") \ No newline at end of file diff --git a/next/search.index/36ebbf1030ff.js b/next/search.index/36ebbf1030ff.js new file mode 100644 index 0000000..3688e7f --- /dev/null +++ b/next/search.index/36ebbf1030ff.js @@ -0,0 +1 @@ +rn_("AQJuZADywgYAAOECAQdsb2NraW5nAAGlCgAA8wNhdHMBYgGDCgAA8whydGhyZWFkcwF0AeUJAADzAAJlaQA=") \ No newline at end of file diff --git a/next/search.index/377b1bb762ce.js b/next/search.index/377b1bb762ce.js new file mode 100644 index 0000000..f10ce34 --- /dev/null +++ b/next/search.index/377b1bb762ce.js @@ -0,0 +1 @@ +rn_("AQdvb2xhcmdlAAFICgAAAQNyb3IA9DEJAAABAAkBAQABBmNvZGluZwABRwoAAPMAAm5yAPMAAmV0OzAAAAEAACMAEACiAQEAzgQBAPwEAAB2BQIAggUBALAFBADDBgEA5AYBABMHAABZCAMADQkDABIJAQCnCQAAyAkBANMJAACZCgEA") \ No newline at end of file diff --git a/next/search.index/37bfd11b7cdf.js b/next/search.index/37bfd11b7cdf.js new file mode 100644 index 0000000..5f988c1 --- /dev/null +++ b/next/search.index/37bfd11b7cdf.js @@ -0,0 +1 @@ +rn_("AQABplAAAATQcAGtBQAAAQphbXBsZWNvdW50AAGkCgAAAQpuYXZhaWxhYmxlAAGSCgAAAQZudmFsaWQAAVUKAADzA29kZQJpdfQWBwAAAQBeAQEAAQxudmFsaWRsZW5ndGgAAXIKAAABCHl0ZWNvdW50AAGgCgAAdwEAAIWQAAcaAs4CEQPy5QMAAJUAAQJvbgGQAAktAJpzAfUDAAABBHJlYW0A8mQKAAABAPMAAXQBlgUAAPMBcgFz9CQHAAABAMUBUAABCGlzY2FyZGVkAPI3CgAAAQDzAIUYQUDytwQAACoF") \ No newline at end of file diff --git a/next/search.index/37c41032c04a.js b/next/search.index/37c41032c04a.js new file mode 100644 index 0000000..8ebe448 --- /dev/null +++ b/next/search.index/37c41032c04a.js @@ -0,0 +1 @@ +rn_("AQNlYWQAAeQJAAABB29zaXRpb24AAVwKAAABAmVyAAHFBgAAAQdlZ2lzdHJ5APMrCgAAAQABAAEGcHRpb25zAAEtCQAA8wF0A29ydPKEBAAAAQDzAANhcHIA") \ No newline at end of file diff --git a/next/search.index/37f1835113a5.js b/next/search.index/37f1835113a5.js new file mode 100644 index 0000000..65bb829 --- /dev/null +++ b/next/search.index/37f1835113a5.js @@ -0,0 +1 @@ +rn_("AQAA9FACAABZAxoEAQABA2l0ZQABcwUAAAEAADswAAABAAAWAAsA3AMEAHMEAQBNCAEAewgAAPEIAgD5CAEA2wkAAPEJAQCPCgIAnAoAAKYKAADzAAJnbgDzAAJpbwA=") \ No newline at end of file diff --git a/next/search.index/380331c00171.js b/next/search.index/380331c00171.js new file mode 100644 index 0000000..27b4bbc --- /dev/null +++ b/next/search.index/380331c00171.js @@ -0,0 +1 @@ +rn_("AQRzeW5jAAEwCgAA8wFlAWEB9wYAAAEAADswAAABAAAFAAIAugYCAJcHAgDzAAJkdgA=") \ No newline at end of file diff --git a/next/search.index/3855009ffa81.js b/next/search.index/3855009ffa81.js new file mode 100644 index 0000000..85c0b59 --- /dev/null +++ b/next/search.index/3855009ffa81.js @@ -0,0 +1 @@ +rn_("AQJheAAB9gYAAAEBdwDzCgUAAAEAAQABCW5seXNvdXJjZQDycAoAAAEA8wNlYWQBbwG4BgAAAQplZGlhc291cmNlAPI1CgAAAQABBXRyZWFtAPJkCgAAAQDzBmRhcHRlcgFzAToJAADzAANhbXI7MAAAAQAADwAHAJgBAABJCAAAFAkEACIJAAAwCgAAeQoBAH0KBADzAANjZXQA") \ No newline at end of file diff --git a/next/search.index/393aefc0981d.js b/next/search.index/393aefc0981d.js new file mode 100644 index 0000000..74a8913 --- /dev/null +++ b/next/search.index/393aefc0981d.js @@ -0,0 +1 @@ +rn_("AQZuZGRhdGEAAZoKAADzAmlkAWEBqAkAAAEDZ3VwAAE+CAAAAQVibmFpbAABAgcAAPMAA21udQA=") \ No newline at end of file diff --git a/next/search.index/3a4498eba322.js b/next/search.index/3a4498eba322.js new file mode 100644 index 0000000..72d050f --- /dev/null +++ b/next/search.index/3a4498eba322.js @@ -0,0 +1 @@ +rn_("AQVlc3VsdAABzgkAAPMBZQFyAacFAAABBGVnYXABpzAAAAqFbQFdCgAAAQlsaWVudGRhdGEAAZkKAAAbAgKAAAAACTljZAE6CAAAAQRhbHVlAAGiCQAAAQJwZQABHQkAAAEIYWNrZXZlbnQAAVYKAADzAAJyeQABBWVuZ3RoAAFyCgAA8wADbHR2AVUKAADXAQAAxYAAAAAGxwACIIkA") \ No newline at end of file diff --git a/next/search.index/3c48de9a8fcc.js b/next/search.index/3c48de9a8fcc.js new file mode 100644 index 0000000..acc8150 --- /dev/null +++ b/next/search.index/3c48de9a8fcc.js @@ -0,0 +1 @@ +rn_("AQNhdGUA8jMHAAABAPMAAXQ7MAAAAQAABQACAKMEAwB7CgEAAQVlc3VsdADzbAgAAAEAAQABBHVldWUA8jEHAAABAAEFYW5kbGUA8moIAAABAAEEdmVudAD0LgcAAAEAAQAmAwEHYWxsYmFjawDyNwkAAAEAdwcAAWvHpkAAAAX1AGXAATswAAABAAAJAAMAaQMFANEDAQCdCQEA") \ No newline at end of file diff --git a/next/search.index/3ca9a436fe4a.js b/next/search.index/3ca9a436fe4a.js new file mode 100644 index 0000000..cc375e8 --- /dev/null +++ b/next/search.index/3ca9a436fe4a.js @@ -0,0 +1 @@ +rn_("AQVhbmRsZQDydAoAAAEAIwRoYXJkArcgCfMAAWVoAAEDbml0APIICQAAAQABCXJvbWNvbmZpZwABkAoAAPMCdHkDZmlzOzAAAAEAAAUAAgCHBQIAuwUCAA==") \ No newline at end of file diff --git a/next/search.index/3cc4cf89765d.js b/next/search.index/3cc4cf89765d.js new file mode 100644 index 0000000..5a0c759 --- /dev/null +++ b/next/search.index/3cc4cf89765d.js @@ -0,0 +1 @@ +rn_("AQZlcmhlYWQAAVIKAAABAXQA844FAAABAAEAAQd5c291cmNlAPJwCgAAAQAjAAKAAAAABP5lbAABBGZzZXQA8t4JAAABAPMABGZudXYA") \ No newline at end of file diff --git a/next/search.index/3d76c5dfd56f.js b/next/search.index/3d76c5dfd56f.js new file mode 100644 index 0000000..ad13756 --- /dev/null +++ b/next/search.index/3d76c5dfd56f.js @@ -0,0 +1 @@ +rn_("AQZhaWx1cmUAAXMKAADzA2VjdAFm8isJAAABAAECaWcA8vEJAAABAPMBbgJmbgABB3RkbGxpa2UAAYwKAADzAAF58pYEAACuAwECcmwAAVAIAAABBHJlYW0AAVkKAADzAAF0AQkFAADzAAJzdTswAAABAAANAAUAmwQHADgHAABjCAAANQoBAHAKAQDzAANlaG/yjQAAAFAC") \ No newline at end of file diff --git a/next/search.index/3d7b622cf5f0.js b/next/search.index/3d7b622cf5f0.js new file mode 100644 index 0000000..8ec727d --- /dev/null +++ b/next/search.index/3d7b622cf5f0.js @@ -0,0 +1 @@ +rn_("AQNuZWQAOzAAAAEAADEAAQDDBTEAAQNhdGUA8s8GAAABAPMAAXT0tQMAAAEAAQABAAECbmcAAQEFAAABAm9yAAGvBQAA8wADZmlz84oBAADwBqAAAQNyZ2UAAUgKAADzAAFhAZ0BAADzAANscHcA") \ No newline at end of file diff --git a/next/search.index/3dbf9986d957.js b/next/search.index/3dbf9986d957.js new file mode 100644 index 0000000..e04b2b7 --- /dev/null +++ b/next/search.index/3dbf9986d957.js @@ -0,0 +1 @@ +rn_("AQRycm9yAPJXCgAAAQABBHN5bmMA8nkKAAABAPMDYmxlAmFlOzAAAAEAAAYAAwB/BQEA3QgBAKQJAgA=") \ No newline at end of file diff --git a/next/search.index/410df31576b1.js b/next/search.index/410df31576b1.js new file mode 100644 index 0000000..2340a67 --- /dev/null +++ b/next/search.index/410df31576b1.js @@ -0,0 +1 @@ +rn_("AQRyZWFtAPJkCgAAAQABA2l0aAABmwoAAAEJcm9tY29uZmlnAAGmCgAA8wZuZ2JpcmQCZncBYgoAAAECb24A8mYIAAAtAgEDYXJkAPLgCQAAbwABAm5kAAEnCQAA8wFjAW/yUwoAAEsA8wCFkEEE9vsEAACbAFADAwFnAAEA") \ No newline at end of file diff --git a/next/search.index/41b7b4b5a9f8.js b/next/search.index/41b7b4b5a9f8.js new file mode 100644 index 0000000..4a918bb --- /dev/null +++ b/next/search.index/41b7b4b5a9f8.js @@ -0,0 +1 @@ +rn_("AQVhcmtlcgABXggAAAEBZAA7MAAAAQAABQACAMAEAgCqBQIAAQhvbnRhaW5lcgDywQkAAAEAAQh1ZmZlcmxlbgABPQoAALcBAACFpyAAAAkpFhEA8koDAAAoAA==") \ No newline at end of file diff --git a/next/search.index/429673ecff10.js b/next/search.index/429673ecff10.js new file mode 100644 index 0000000..ca1b470 --- /dev/null +++ b/next/search.index/429673ecff10.js @@ -0,0 +1 @@ +rn_("AQVvc3RucwABigoAAAEJY3RpdmF0aW9uAAFpCgAAMwADgAAAAANeYWN49LoCAAABAEQCAQA=") \ No newline at end of file diff --git a/next/search.index/43642f0554fb.js b/next/search.index/43642f0554fb.js new file mode 100644 index 0000000..be8bce6 --- /dev/null +++ b/next/search.index/43642f0554fb.js @@ -0,0 +1 @@ +rn_("AQF5ADowAAABAAAAAAAHABAAAAAqCdcJ2AnZCSsKLAotCmsKAQNpdGgAAasJAAABCXJvbWNvbmZpZwABjwoAAFMBcgMrZic7wRNmc3cBugUAAPMAAmVyAQ0EAAA=") \ No newline at end of file diff --git a/next/search.index/43e0a9e30fbc.js b/next/search.index/43e0a9e30fbc.js new file mode 100644 index 0000000..9954c9a --- /dev/null +++ b/next/search.index/43e0a9e30fbc.js @@ -0,0 +1 @@ +rn_("AQtjYXRlZHRyYWNrcwDyewoAAAEAAQtsb2JhbGV2ZW50cwABogoAAAEDYWNrAPI3CQAAAQDzAANiZ2/zegEAAAEAeQI=") \ No newline at end of file diff --git a/next/search.index/4532e4b8cde3.js b/next/search.index/4532e4b8cde3.js new file mode 100644 index 0000000..9830e67 --- /dev/null +++ b/next/search.index/4532e4b8cde3.js @@ -0,0 +1 @@ +rn_("AQJ1dADyRggAAAEA8wABbTswAAABAAAGAAMA+AMCAI8EAgDSBgAA8wFlAWTzXwMAAAEAAQA=") \ No newline at end of file diff --git a/next/search.index/456179eab39b.js b/next/search.index/456179eab39b.js new file mode 100644 index 0000000..9fb9e48 --- /dev/null +++ b/next/search.index/456179eab39b.js @@ -0,0 +1 @@ +rn_("AQlvc3RwZXJzZWMAAZ4KAADzAWQBY/YUBwAAAQC3AC8BAQAdABMBcwK3IAnRAAFlbwA=") \ No newline at end of file diff --git a/next/search.index/45b1d1b8c35a.js b/next/search.index/45b1d1b8c35a.js new file mode 100644 index 0000000..850f627 --- /dev/null +++ b/next/search.index/45b1d1b8c35a.js @@ -0,0 +1 @@ +rn_("AQJ1dAA7MAAAAQAAXQABADkHXQDzAAFtOzAAAAEAAF0AAQAOBF0AAQNpbmQA8sIGAADhAiMAAqZAAAAEvWVrOzAAAAEAAC0ADwBNAwgAqAMEAMgGBADTBgIA2wYAAOIGAAD0CAQACgkAADEJAQDUCQIA5gkBAOoJAQD2CQAAOQoDAFcKAQDzAAJydwABAnJ5APIbCQAAAQABBHVldWUAAZsJAAABCG5uZWN0aW9uAAFqCgAAAQVhbm5lbAABKgoAAPMAAmhvAPMBdAJjcQHcBAAAAQZvbm5lY3QA8u0JAAABANMAhIAAAAAJwCQgBABjAAOnkAAAA3FhZW/zkwAAAAEAAQA=") \ No newline at end of file diff --git a/next/search.index/46b8a53139d4.js b/next/search.index/46b8a53139d4.js new file mode 100644 index 0000000..f78d350 --- /dev/null +++ b/next/search.index/46b8a53139d4.js @@ -0,0 +1 @@ +rn_("AQNlYWQAAeQJAAABB29zaXRpb24AAVwKAAABAmRlAPIzCQAAAQABBXNzYWdlAAFoCgAAAQJlcgABxQYAAAEHZWdpc3RyeQDzKwoAAAEAAQABBnB0aW9ucwABLQkAAPMAA29ydPKEBAAAAQABA2tlcgABNgcAAGMAA4AAAAAGxnBydADzAIURwAEA") \ No newline at end of file diff --git a/next/search.index/4743bf93c488.js b/next/search.index/4743bf93c488.js new file mode 100644 index 0000000..5c8ffaa --- /dev/null +++ b/next/search.index/4743bf93c488.js @@ -0,0 +1 @@ +rn_("AQZlcnNpb24AAZMKAAABBmltZW91dADyLgoAAAEA8wACdHb0YQgAAAEAvAABAAEFYXB0ZXIA8yQHAAABAMUB8wACZHkA") \ No newline at end of file diff --git a/next/search.index/48a5468ce67d.js b/next/search.index/48a5468ce67d.js new file mode 100644 index 0000000..2b50d7b --- /dev/null +++ b/next/search.index/48a5468ce67d.js @@ -0,0 +1 @@ +rn_("AQF0ADowAAABAAAAAAALABAAAABcA10DrQOuA68DsAPNBs4GPwhICJ8JMwojAAKm4AAAA29pdQA=") \ No newline at end of file diff --git a/next/search.index/4941b6642e97.js b/next/search.index/4941b6642e97.js new file mode 100644 index 0000000..ffdaebd --- /dev/null +++ b/next/search.index/4941b6642e97.js @@ -0,0 +1 @@ +rn_("AQNhdGUA8jMHAAABAAECZWsAAWMKAADzAAJldDswAAABAAAFAAIAowQDAHsKAQABBWVzdWx0APNsCAAAAQABAAEEdWV1ZQDyMQcAAAEAAQJmZgDzqwQAALsFAQABAAKAAAAABfWmcAAACqVkbgABBWFuZGxlAPJqCAAAAQABA2VudAD0LgcAAAEAAQAmAwECYXgAAUwKAADzAAFtOzAAAAEAAAwABQD3AwAAiwQDAN0GAgAoBwIA5wgBAAEAAPN7BQAASgQBAPMAA2R0dgABB2FsbGJhY2sA8jcJAAABAPMAyABl0AE7MAAAAQAAEQAGAGkDBQDRAwEA5gYDAC4JAQA3CQEAnQkBAA==") \ No newline at end of file diff --git a/next/search.index/4a4f3b215889.js b/next/search.index/4a4f3b215889.js new file mode 100644 index 0000000..d64cd32 --- /dev/null +++ b/next/search.index/4a4f3b215889.js @@ -0,0 +1 @@ +rn_("AQJybAABXQgAAAEKb3RpbWVzdGFtcADynQoAAAYAAQNvcmUA8hsHAAABAPMAAXT2gQQAAAEAAQBrAgEAswMBB29sZXJyb3IA8/YIAAABAAEAAQR1ZXVlAAGbCQAAAQVhbXBsZQA7MAAAAQAAXQABAH8IXQABAmVyAPL0BgAAAQABA25lcgDzOwgAAAEAAQDzAAJudAABBXV0dXJlAPN8CAAAAQABAPMAA2ZpczswAAABAADuAAQAgQEAAFECXQBVBl0AmgcxAAEFZW5ndGgAAdoJAAABBHZlbnQA8gsJAAABAPMAAWUBawUAAPMBZQFkAdEEAAABCGxiYWNrb2ZmAPJmCgAAAQDzAAJhbQABBmFuZGxlcgDzAQkAAAEAAQABBHJhbWUAAQcJAAABA2F0YQDyEgkAAAEA8wF0AWT2tAQAAAEAJQAkBAEAAQABAmFsAAF0BQAAAQ1vbm5lY3RmYWlsdXJlAAFzCgAA8wACY24AAQd0bGVuZ3RoAAHaCQAA8wADbnJ4AAEIc2Nvbm5lY3QA8j4KAAABAAECdGEA88MGAAABANUD8wACYWkAAQNleHQA8/4IAAABAAEAAQZlY3Rpb24AAWoKAADzAW4CbnQAAQVhbm5lbAABKgoAAPMAAmhvAAEGdWlsZGVyAAEpCQAACRMA8sEJAAABABMAAoAAAAAG9ml4APMAz8Bv0gc7MAAAAQAAjAAXAE0CAQBWAwMApQMAANsDAABvBAAAmgQAANwEAACmBQAAvQYCAOwGAQABBwAAIQcBAC4HAgDOB2sA7wgAAAsJAQCvCQAATQoAAFYKAABfCgAAeAoAAKAKAACkCgAA") \ No newline at end of file diff --git a/next/search.index/4b914460b29e.js b/next/search.index/4b914460b29e.js new file mode 100644 index 0000000..ce4b4eb --- /dev/null +++ b/next/search.index/4b914460b29e.js @@ -0,0 +1 @@ +rn_("AQdwcG9ydGVkAAFxCAAAAQRhbnRzAPLuBgAAAQABB3ZldGFza3MAAYsKAAABA2VhZAAB5AkAAAEHb3NpdGlvbgABXAoAAPMDb3JtAnByAAEAAadAAAAJoHIBoQoAAPMAhTABDPMtCQAAmgDDAA==") \ No newline at end of file diff --git a/next/search.index/4d4559dd6fa9.js b/next/search.index/4d4559dd6fa9.js new file mode 100644 index 0000000..2631761 --- /dev/null +++ b/next/search.index/4d4559dd6fa9.js @@ -0,0 +1 @@ +rn_("AQVhY2tldADzKAcAAAEAAQABA2F0YQDyggUAAAEAAQR0ZXJzAAHpCQAAEwNyYW0CgAAAAAkRZXMA8wADYWRw8ssCAAABAA==") \ No newline at end of file diff --git a/next/search.index/4df0130a6271.js b/next/search.index/4df0130a6271.js new file mode 100644 index 0000000..8b3036c --- /dev/null +++ b/next/search.index/4df0130a6271.js @@ -0,0 +1 @@ +rn_("AQhzY29ubmVjdADyPgoAAAEAAQJ0YQABmQoAAPMAAmFpAAEGdWlsZGVyAAEpCQAA8wJudAJiZPLbAwAAlAA=") \ No newline at end of file diff --git a/next/search.index/4e7b9f439b00.js b/next/search.index/4e7b9f439b00.js new file mode 100644 index 0000000..e7fc6d1 --- /dev/null +++ b/next/search.index/4e7b9f439b00.js @@ -0,0 +1 @@ +rn_("AQJuZADywgYAAOECAQdsb2NraW5nAAGlCgAA8wNhdHMBYgGDCgAA8wZocmVhZHMBdAHlCQAA8wFyAXTzNgcAACgBygDzAAJlaQA=") \ No newline at end of file diff --git a/next/search.index/4eae15df1e2d.js b/next/search.index/4eae15df1e2d.js new file mode 100644 index 0000000..f74ba11 --- /dev/null +++ b/next/search.index/4eae15df1e2d.js @@ -0,0 +1 @@ +rn_("AQAAOzAAAAEAAAgABACVBAAApwQDAE8IAABUCAIAAQRuYWlsAAECBwAAMwADgAAAAARyYmVuAXADAAA=") \ No newline at end of file diff --git a/next/search.index/4ecb426b2562.js b/next/search.index/4ecb426b2562.js new file mode 100644 index 0000000..51dd16c --- /dev/null +++ b/next/search.index/4ecb426b2562.js @@ -0,0 +1 @@ +rn_("AQNkaWMAAXwFAAABAAD0CAQAAAEAAQBiAQEGaGFyZGVyAPLPCQAAAQDzAAFz8r4EAAABALMAhKZwAAAFegxgAAA=") \ No newline at end of file diff --git a/next/search.index/4f5f1e881236.js b/next/search.index/4f5f1e881236.js new file mode 100644 index 0000000..a78e027 --- /dev/null +++ b/next/search.index/4f5f1e881236.js @@ -0,0 +1 @@ +rn_("AQZlZXZlbnQAAa8JAAABBHBvc2UAAdEGAAABCXZpb2xhdGlvbgABWgoAAPMAA2xtcgABAm5nAAGlCgAA8wABafIuCQAAAQABAnNzAAEGBQAAAQhlZHRyYWNrcwDyewoAAAEAAQABgAAAAAP0bAH4BgAA8wACbHQA8wCEEUQAAA==") \ No newline at end of file diff --git a/next/search.index/50d716716da5.js b/next/search.index/50d716716da5.js new file mode 100644 index 0000000..42bfce4 --- /dev/null +++ b/next/search.index/50d716716da5.js @@ -0,0 +1 @@ +rn_("AQphbXBsZWNvdW50AAGkCgAAAQh5dGVjb3VudAABoAoAAPMBbwJicwDzAXABdPKdCgAABgA=") \ No newline at end of file diff --git a/next/search.index/51b881267f6b.js b/next/search.index/51b881267f6b.js new file mode 100644 index 0000000..3ab8d28 --- /dev/null +++ b/next/search.index/51b881267f6b.js @@ -0,0 +1 @@ +rn_("AQJydAAB2wQAAAEEYWx1ZQABogkAAAECcGUAAR0JAAABCGFja2V2ZW50AAFWCgAA8wACcnkAAQVlbmd0aAABcgoAAPMDbGlkA2x0dgFVCgAA8wACYWUA") \ No newline at end of file diff --git a/next/search.index/51cc9520107d.js b/next/search.index/51cc9520107d.js new file mode 100644 index 0000000..1676b7f --- /dev/null +++ b/next/search.index/51cc9520107d.js @@ -0,0 +1 @@ +rn_("AQNpdGgAAZsKAAABDHVubmVybWVzc2FnZQABaAoAAAECZXkA8mgIAAABAAEIc2Nvbm5lY3QA8kUKAAABAAEFYW5kbGUA8nQKAAABAAEJcm9tY29uZmlnAAGmCgAAAQJuZwABegUAAPMAAWn20gQAAAEA/AQBACMAAQAjAAKQAAo3AAFkcgABBG91bnQAAe8IAAABAnRhAAETBwAA9y8AAIqQAASYAAG1BRM6MAAAAQAAAAAACQAQAAAAZwNoA4oFiwW+BfIG8wbgCU8KYgo=") \ No newline at end of file diff --git a/next/search.index/52f9eb7d91b4.js b/next/search.index/52f9eb7d91b4.js new file mode 100644 index 0000000..18f2ea1 --- /dev/null +++ b/next/search.index/52f9eb7d91b4.js @@ -0,0 +1 @@ +rn_("AQZuZGRhdGEAAZoKAADzA3VpZAFhAagJAAABBmVhZGVycwDyUAoAAAEAAQNhdGEAAacJAADzA2l0aANkaHUA") \ No newline at end of file diff --git a/next/search.index/5457d948c356.js b/next/search.index/5457d948c356.js new file mode 100644 index 0000000..e24c332 --- /dev/null +++ b/next/search.index/5457d948c356.js @@ -0,0 +1 @@ +rn_("AQNhdGUA8iYHAAABAAEEdXJjZQDycAoAAAEAAQVhbmRsZQDydAoAAAEAIwNhcmQCtyAJ8wABZWgAAQduZGVycm9yAAEKCQAA8wCEkEAEAA==") \ No newline at end of file diff --git a/next/search.index/566c1a5d2f97.js b/next/search.index/566c1a5d2f97.js new file mode 100644 index 0000000..d3eb2cb --- /dev/null +++ b/next/search.index/566c1a5d2f97.js @@ -0,0 +1 @@ +rn_("AQNlbnQA9C4HAAABAAEAJgMBAmF4AAFMCgAA8wABbTswAAABAAAMAAUA9wMAAIsEAwDdBgIAKAcCAOcIAQABB2xvY2tpbmcAAaUKAADzA2F0cwFiAYMKAADzBmhyZWFkcwF0AeUJAADzAAF08zYHAAAoAcoAAQRycm9yAPJXCgAAAQABBHN5bmMA8nkKAAABAPMHbGF5YWJsZQJhZfOkCQAAAQABAAkBAAEwCgAA8wJ2ZQFhAfcGAAABBG5ndGgA8o0KAAABAPMAAmVpAAEJcGFsaXZlZ2FwAacwAAAKhW0BXQoAAAEAAabwAAAFhnTzewUAAEoEAQB3DwAAyYAAAAAD0JAACGgAAQAGqkrz4gIAAMcG4wA=") \ No newline at end of file diff --git a/next/search.index/56e6e83300b1.js b/next/search.index/56e6e83300b1.js new file mode 100644 index 0000000..6264cce --- /dev/null +++ b/next/search.index/56e6e83300b1.js @@ -0,0 +1 @@ +rn_("AQJ0cgABqAUAAAEFb3N0bnMAAYoKAAABCWN0aXZhdGlvbgABaQoAAPMCdGUCYWMAAQlvc3RwZXJzZWMAAZ4KAADzAWQBY/YUBwAAAQC3AC8BAQAdABMDZXNzArcgCdEAAWVvAAECc2UA9K8EAAABACcA+gEBA2V0ZQABqgkAAAECcmUAAdYEAADzAIUBSAkAAQpuYXZhaWxhYmxlAAGSCgAAAQZudmFsaWQAAVUKAADzAWUCaXX0FgcAAAEAXgEBABMAAqZQAAAFB2R0AAEKZnByb2JlanNvbgABYQoAAAEDZmlnAPZ7CAAAFAIBAAEACwAKABMBbwKnQAAACmBucwDzAIUkwAI7MAAAAQAA9QAEAKkBkwB7BAEAhAUAAPYFXgA=") \ No newline at end of file diff --git a/next/search.index/571a106db7ce.js b/next/search.index/571a106db7ce.js new file mode 100644 index 0000000..35aa4d0 --- /dev/null +++ b/next/search.index/571a106db7ce.js @@ -0,0 +1 @@ +rn_("AQp0YXRldXBkYXRlAPJ2CgAAAQDzAm5nAXMBvwUAAAEEcnJvcgDyVwoAAAEAAQRzeW5jAPJ5CgAAAQDzB2xheWFibGUCYWXzpAkAAAEAAQAJAQABMAoAAPMDaXZlAWEB9wYAAPMAAmxwAeICAADzAAJlaQA=") \ No newline at end of file diff --git a/next/search.index/574423096545.js b/next/search.index/574423096545.js new file mode 100644 index 0000000..962de2a --- /dev/null +++ b/next/search.index/574423096545.js @@ -0,0 +1 @@ +rn_("AQlvaWNlc3RhdGUA8m4KAAABAAEDYXRlAAEkCQAAAQRydmVyAAG/CQAA8wACZXQA8wACc3b2cggAAAEAsACJAMoAAQABAAD0zgQAAAEAswABAPMCYXQCYWUA") \ No newline at end of file diff --git a/next/search.index/579a6500b67f.js b/next/search.index/579a6500b67f.js new file mode 100644 index 0000000..4574d3e --- /dev/null +++ b/next/search.index/579a6500b67f.js @@ -0,0 +1 @@ +rn_("AQNvZGUA8jMJAAABAAEEcnJvcgDz1AkAAAEAAQABBW9uZmlnAPLxCQAAAQDzA2xlcgNjZW334AYAAAEAHQABAAEAoQLzAPMAAXX0bAQAAAEAAQAEAQ==") \ No newline at end of file diff --git a/next/search.index/57e0dc82949f.js b/next/search.index/57e0dc82949f.js new file mode 100644 index 0000000..d760376 --- /dev/null +++ b/next/search.index/57e0dc82949f.js @@ -0,0 +1 @@ +rn_("AQF5ADowAAABAAAAAAAHABAAAAAqCdcJ2AnZCSsKLAotCmsKAQNpdGgAAasJAAABCXJvbWNvbmZpZwABjwoAAFMBcgMrZic7wRNmc3cBugUAAPMCc3QCZXIA") \ No newline at end of file diff --git a/next/search.index/57e2e3b3c6a2.js b/next/search.index/57e2e3b3c6a2.js new file mode 100644 index 0000000..967d699 --- /dev/null +++ b/next/search.index/57e2e3b3c6a2.js @@ -0,0 +1 @@ +rn_("AQAA8/sEAABVBQEAAQJhcAABxgYAAPMAAm1z9MAGAAABABcAAQABBGRwYWQA8jEKAAABAPMAAm5yAA==") \ No newline at end of file diff --git a/next/search.index/592ef3c1a7b1.js b/next/search.index/592ef3c1a7b1.js new file mode 100644 index 0000000..82f052c --- /dev/null +++ b/next/search.index/592ef3c1a7b1.js @@ -0,0 +1 @@ +rn_("AQVlcnZlcgABggoAAPMBZQFz87IDAAABAAEAAQJuYwA7MAAAAQAADAAEABQJBAAwCgAAeQoBAH0KBAABAW4A85IEAACxBQEA8wACb3kAAQd0ZGxsaWtlAAGMCgAA8wJjaAF58pYEAACuAwELY2F0ZWR0cmFja3MA8nsKAAABAAELbG9iYWxldmVudHMAAaIKAADzAWwCZ28AAQp0YXRldXBkYXRlAPJ2CgAAAQDzA2luZwFzAb8FAAABAAGm4AAABH1lAf0EAAABBHRhdGUA8iYHAAABAPMAAXPzwgMAAAEAAQABB2xvY2tpbmcAAaUKAADzA2F0cwFiAYMKAADzAAF0AeUJAAABCW5seXNvdXJjZQDycAoAAAEAAQAA8/sEAABVBQEAAQJhcAABxgYAAPMBcgJtc/TABgAAAQAXAAEAAQJ1ZgABzAQAAPMAhRJAQjowAAABAAAAAAANABAAAACUAcUCxgLHAsgCyQLKArgG/AYFCcwJzQnkCVIKAQh0aXZhdGlvbgABaQoAAAEJbGVzdG9yYWdlAAFACgAA91sAAMs2qtxmL1lyDiXdbP6AC4cLAA==") \ No newline at end of file diff --git a/next/search.index/5a971f1594db.js b/next/search.index/5a971f1594db.js new file mode 100644 index 0000000..1c3f614 --- /dev/null +++ b/next/search.index/5a971f1594db.js @@ -0,0 +1 @@ +rn_("AQNyZWQAAWwKAAABAnN0APIdBwAAAQDzAXUCZWkAIwACgAAAAANHZnEAIwACgAAAAALdY2UA") \ No newline at end of file diff --git a/next/search.index/5acfcab0ff67.js b/next/search.index/5acfcab0ff67.js new file mode 100644 index 0000000..9bb221a --- /dev/null +++ b/next/search.index/5acfcab0ff67.js @@ -0,0 +1 @@ +rn_("AQhpc2NhcmRlZADyNwoAAAEAEwF0AoAAAAAFrWR5AAEObGxnbG9iYWxldmVudHMAAaIKAADzAWUBYQGTBAAAAQF5APPyAwAAAQCXAAkBAPUYBwAAAQBeAQEAAQDzAANkcnYAAQR4ZXJzAAHmCAAAcwCEp0AAAAWuAMEIAYIBAAA=") \ No newline at end of file diff --git a/next/search.index/5b82a1cbd32a.js b/next/search.index/5b82a1cbd32a.js new file mode 100644 index 0000000..29571d9 --- /dev/null +++ b/next/search.index/5b82a1cbd32a.js @@ -0,0 +1 @@ +rn_("AQJhdwAB8AkAAPMDYXRlAXL2KwcAAAEAAQA6AYUAAQABA2d0aAAB9QkAAAEKb3RpbWVzdGFtcAABowoAAPMEb3VudAF0AaQKAABzAISmUAAACaoEIAU7MAAAAQAAXgACANMDAAB/CF0A") \ No newline at end of file diff --git a/next/search.index/5bedf403fe7b.js b/next/search.index/5bedf403fe7b.js new file mode 100644 index 0000000..cdcba26 --- /dev/null +++ b/next/search.index/5bedf403fe7b.js @@ -0,0 +1 @@ +rn_("AQZ0ZXNpemUA8oQKAAAUAAELYWJsZXN0b3JhZ2UAAZcKAADzAWcBZwFMAwAA8wACdXkA") \ No newline at end of file diff --git a/next/search.index/5bfaeff63ad7.js b/next/search.index/5bfaeff63ad7.js new file mode 100644 index 0000000..eb67b75 --- /dev/null +++ b/next/search.index/5bfaeff63ad7.js @@ -0,0 +1 @@ +rn_("AQVlc3VsdADyQQoAAAEAAQNuZm8A8sMJAAABAAEEcnJvcgDy6gkAAAEAcwFuhJAACS0AmhABAzowAAABAAAAAAAMABAAAADYA9kD9QMLBAwEcAWlBbgFuQVaClwKaQpqCg==") \ No newline at end of file diff --git a/next/search.index/5c2ce4493c46.js b/next/search.index/5c2ce4493c46.js new file mode 100644 index 0000000..28744e2 --- /dev/null +++ b/next/search.index/5c2ce4493c46.js @@ -0,0 +1 @@ +rn_("AQJudAAB7wgAAAEHdHBlcnNlYwABngoAAAEGdGFpbmVyAPLBCQAAAQABA2VjcwABVAoAAPMAhAggCgA=") \ No newline at end of file diff --git a/next/search.index/5ca7f7a0ef0c.js b/next/search.index/5ca7f7a0ef0c.js new file mode 100644 index 0000000..72b765d --- /dev/null +++ b/next/search.index/5ca7f7a0ef0c.js @@ -0,0 +1 @@ +rn_("AQN0dHAAAbkGAAABBHJyb3IA8uYJAAABAAEAAPNsBAAAAQABAPMAA2RlaAABCjIwcG9seTEzMDUAAV4KAADzAAJhZQA=") \ No newline at end of file diff --git a/next/search.index/5ce5860c5a78.js b/next/search.index/5ce5860c5a78.js new file mode 100644 index 0000000..fd95088 --- /dev/null +++ b/next/search.index/5ce5860c5a78.js @@ -0,0 +1 @@ +rn_("AQFvADswAAABAABdAAEAVQZdAAECdXQA8kgIAADrAQEAAPMDBQAAAQABANMBboS3QAkIAAFAgQQBzQQAAA==") \ No newline at end of file diff --git a/next/search.index/5d6e7636da6f.js b/next/search.index/5d6e7636da6f.js new file mode 100644 index 0000000..cd90371 --- /dev/null +++ b/next/search.index/5d6e7636da6f.js @@ -0,0 +1 @@ +rn_("AQdvb2xhcmdlAAFICgAAAQNyb3IA9DEJAAABAAkBAQABBmNvZGluZwABRwoAAPMAAm5yAPMBYQJldDswAAABAAAOAAUAdgUCALAFBABZCAEADQkDANMJAAA=") \ No newline at end of file diff --git a/next/search.index/5d77ab1b094f.js b/next/search.index/5d77ab1b094f.js new file mode 100644 index 0000000..0b8653d --- /dev/null +++ b/next/search.index/5d77ab1b094f.js @@ -0,0 +1 @@ +rn_("AQAA85sBAAABAEsBAQhzY29ubmVjdADyPgoAAAEAAQJ0YQABmQoAAPMAAmFpAAEGdWlsZGVyAAEpCQAA8wF0AmJk8tsDAACUAFMAA6ZQAAAFgW52dwA=") \ No newline at end of file diff --git a/next/search.index/5e422f6cce0e.js b/next/search.index/5e422f6cce0e.js new file mode 100644 index 0000000..7803245 --- /dev/null +++ b/next/search.index/5e422f6cce0e.js @@ -0,0 +1 @@ +rn_("AQRyYWNrAPKdCQAAAQABCGNoZWR1bGVyAAGUCgAAAQdyb21jb3N0AAFgCgAAAQVvbmZpZwAB2wkAAAEGaXRyYXRlAAHsCQAA8wF0hSYABjswAAABAAAXAAEA3wQXAA==") \ No newline at end of file diff --git a/next/search.index/5ec91ca9ae6e.js b/next/search.index/5ec91ca9ae6e.js new file mode 100644 index 0000000..1fc553f --- /dev/null +++ b/next/search.index/5ec91ca9ae6e.js @@ -0,0 +1 @@ +rn_("AQ5uZW50aWFsYmFja29mZgDyZgoAAAEAAQZ0aHJlYWQAAQUJAAABCXNpdmV0YXNrcwABiwoAAAEDdGVkAPJxBQAAxAHzAANjbnIA8wACZW8A") \ No newline at end of file diff --git a/next/search.index/5fd5c46fb900.js b/next/search.index/5fd5c46fb900.js new file mode 100644 index 0000000..9161c63 --- /dev/null +++ b/next/search.index/5fd5c46fb900.js @@ -0,0 +1 @@ +rn_("AQppdGhwcmVsb2FkAAFOCgAAAQVvdXJjZQABOAcAAAEKbG9iYWxldmVudAABTQoAAAEDZW50APLsBgAAAQABA3lwdAAB4QkAAAECZGUAAa0JAADzAAJvcgDzAAJjdgABAnRhAAGaCgAA8wCFUQASAZsAAAA=") \ No newline at end of file diff --git a/next/search.index/605707ff6e5f.js b/next/search.index/605707ff6e5f.js new file mode 100644 index 0000000..b64d083 --- /dev/null +++ b/next/search.index/605707ff6e5f.js @@ -0,0 +1 @@ +rn_("AQJybAABXQgAAPMDaW50AXUBpgUAACMAArZACjEAAWFvAAEAAPT6BAAABwQBAAEA8wFlAXI6MAAAAQAAAAAACQAQAAAA7wOGBIcEQQhCCEMIaghrCHQKdQoBAm9yAPLiBgAAKALzAAFy83kFAAC3A8cAAQZzZW5kZXIAAfcJAADzAAJkcgABA2F0YQABmgoAAAEJcm9tY29uZmlnAAGcCgAA8wRsb25lAWYBUQgAAPMAhRmIADswAAABAABnAAkAiwAAAJEAAQCcAF0AlgEAALQCAADCBgAAJwkAAKMJAADKCQEA") \ No newline at end of file diff --git a/next/search.index/62aaa95fd7bf.js b/next/search.index/62aaa95fd7bf.js new file mode 100644 index 0000000..56cce0a --- /dev/null +++ b/next/search.index/62aaa95fd7bf.js @@ -0,0 +1 @@ +rn_("AQJwZQABHQkAAAEEdmVudAABVgoAABMDYWNrApAACnsAAWVzAGMAA4AAAAAFhm9yeQA=") \ No newline at end of file diff --git a/next/search.index/62aca6fe9467.js b/next/search.index/62aca6fe9467.js new file mode 100644 index 0000000..af8dd94 --- /dev/null +++ b/next/search.index/62aca6fe9467.js @@ -0,0 +1 @@ +rn_("AQdlc3BvbnNlAAGhCgAA8wABcgFaAwAAAQVwZGF0ZQABrAkAAAEFbWVvdXQA8twJAAABAPMAAWkB2wQAAAEDaW9uAPJmCAAALQIBAnJ5APIbCQAAAQABBm9ubmVjdADy7QkAAAEA8wACY3QAEwACpyAAAAbbZW8AAQNlYWQAAVIKAAABCWlzY29ubmVjdADyRQoAAAEACQIA8isJAAABAPMAiIwATzowAAABAAAAAAAJABAAAADoA+kD6gPrA38EgASXBL8JggqfCg==") \ No newline at end of file diff --git a/next/search.index/62d8e47e568b.js b/next/search.index/62d8e47e568b.js new file mode 100644 index 0000000..3aae901 --- /dev/null +++ b/next/search.index/62d8e47e568b.js @@ -0,0 +1 @@ +rn_("AQVlc3VsdAABzgkAAAEDaW50AAEBBwAA8wFlAmhyOjAAAAEAAAAAAAgAEAAAANQDpwVFCAYJ7wlbCoQKhgqYCg==") \ No newline at end of file diff --git a/next/search.index/633e67d8242a.js b/next/search.index/633e67d8242a.js new file mode 100644 index 0000000..87890b4 --- /dev/null +++ b/next/search.index/633e67d8242a.js @@ -0,0 +1 @@ +rn_("AQZlcmhlYWQAAVIKAAABCGx5c291cmNlAPJwCgAAAQABBGZzZXQA8t4JAAABAPMAA2ZudgA=") \ No newline at end of file diff --git a/next/search.index/636c6c7710f3.js b/next/search.index/636c6c7710f3.js new file mode 100644 index 0000000..6dea9a3 --- /dev/null +++ b/next/search.index/636c6c7710f3.js @@ -0,0 +1 @@ +rn_("AQtlcnlyZXNwb25zZQABoQoAACMAAh5YQRVQs252AAEEcmRlZADyNwoAAAEA8wACYW8A") \ No newline at end of file diff --git a/next/search.index/63de701acfa2.js b/next/search.index/63de701acfa2.js new file mode 100644 index 0000000..645ca3d --- /dev/null +++ b/next/search.index/63de701acfa2.js @@ -0,0 +1 @@ +rn_("AQFuAPO4BQAAAQCjBAEJbGllbnRkYXRhAAGZCgAAEwRsaXNlAoAAAAAJOWNkAToIAADzAAJhbwA=") \ No newline at end of file diff --git a/next/search.index/65122f357f1e.js b/next/search.index/65122f357f1e.js new file mode 100644 index 0000000..d1f6301 --- /dev/null +++ b/next/search.index/65122f357f1e.js @@ -0,0 +1 @@ +rn_("AQZ0b3JhZ2UA8kAKAABXAAEDb29wAPJ6CAAAoAABBHJyb3IA8lcKAAABAAEEc3luYwDyeQoAAAEA8wJsZYQRCAI7MAAAAQAADgAEAH8FAQDdCAgApAkCAJIKAAA=") \ No newline at end of file diff --git a/next/search.index/651817a5a3e1.js b/next/search.index/651817a5a3e1.js new file mode 100644 index 0000000..1800048 --- /dev/null +++ b/next/search.index/651817a5a3e1.js @@ -0,0 +1 @@ +rn_("AQVvdXJjZQDycAoAAAEAAQllbmd0aGhpbnQAAV8KAAABBG5wdXQAATMKAAABAzMwNQABXgoAAPMABDFpbHMB+QYAAA==") \ No newline at end of file diff --git a/next/search.index/6538b5f1d2c3.js b/next/search.index/6538b5f1d2c3.js new file mode 100644 index 0000000..aff2bdd --- /dev/null +++ b/next/search.index/6538b5f1d2c3.js @@ -0,0 +1 @@ +rn_("AQJlcgABxQYAAAEHZWdpc3RyeQDzKwoAAAEAAQABBnB0aW9ucwABLQkAAPMAA29ydPKEBAAAAQA=") \ No newline at end of file diff --git a/next/search.index/6552e7bfa6ba.js b/next/search.index/6552e7bfa6ba.js new file mode 100644 index 0000000..8af6a10 --- /dev/null +++ b/next/search.index/6552e7bfa6ba.js @@ -0,0 +1 @@ +rn_("AQJkZQDyMwkAAAEAAQVzc2FnZQABaAoAAAEDa2VyAAE2BwAAIwACgAAAAAbGcHIA8wADYWVvAA==") \ No newline at end of file diff --git a/next/search.index/65de76d0d022.js b/next/search.index/65de76d0d022.js new file mode 100644 index 0000000..9b633ce --- /dev/null +++ b/next/search.index/65de76d0d022.js @@ -0,0 +1 @@ +rn_("AQppdGhwcmVsb2FkAAGJCgAAAQRucHV0AAGfCQAAYwFlA5AAA/wAAWRpdzowAAABAAAAAAAHABAAAADAA8ED9wT4BDEHMgchCZsJAQJ0cgAB4wkAACMAAqZAAAAG3GVz9QgFAAAVAgEAQQEBAPMAAXTyoAEAAAEApQMAAIaQAAP8AAEEt5ADvgABAAMFCAEbOjAAAAEAAAAAAAoAEAAAAJAAwAPBA/cE+ASUBTEHMgchCZsJogk=") \ No newline at end of file diff --git a/next/search.index/66867bfa8306.js b/next/search.index/66867bfa8306.js new file mode 100644 index 0000000..8eaf1bf --- /dev/null +++ b/next/search.index/66867bfa8306.js @@ -0,0 +1 @@ +rn_("AQRyYWNrAPKdCQAAAQABCGNoZWR1bGVyAAGUCgAAAQRyZWFkAPLMCQAAAQABB3JvbWNvc3QAAWAKAAABBW9uZmlnAAHbCQAAAQZpdHJhdGUAAewJAAABAm5jAAEiCQAAIwFzAqcwAAAI8Gt5APMAh6cABjswAAABAAAlAAcA/gMEAJQEAADfBBcAHwcBAGwIAgDOCQAAQQoBAA==") \ No newline at end of file diff --git a/next/search.index/67acc2b929b0.js b/next/search.index/67acc2b929b0.js new file mode 100644 index 0000000..dad1b5f --- /dev/null +++ b/next/search.index/67acc2b929b0.js @@ -0,0 +1 @@ +rn_("AQVlYXNvbgDyQwoAAAEAAQNpbmQA8soJAAABAAEFYXRpb24AAWkKAAABBWVzdWx0APJBCgAAAQABA25mbwDywwkAAAEAAQRycm9yAPLqCQAAAQDzAW4DZWly9dgDAAABADIAAQBeBvMAAm92AAEGYWlsdXJlAAFzCgAAAQFkAPNxBQAAxAHIAQEEaXZlcgABnwoAAAECdGEA9FsIAAABAGwBAQDzAAJhcgDzAIY4BQE6MAAAAQAAAAAADwAQAAAAmgCxBLIEswTYBNkE2gbNBysJLAntCe4JPgo/CkUKRgo=") \ No newline at end of file diff --git a/next/search.index/68133e83b795.js b/next/search.index/68133e83b795.js new file mode 100644 index 0000000..e2eccb9 --- /dev/null +++ b/next/search.index/68133e83b795.js @@ -0,0 +1 @@ +rn_("AQQxMzA1AAFeCgAAAQhpb2xhdGlvbgABWgoAAAEAAPWnBAAAAQABAAEApQMTAW0CgAAAAARyZW4AAQNlYWQAAfwGAAABB29tcGxldGUAAaoJAADzAAJjcjswAAABAAAGAAMAkwEAAMICAgCzBgIAAQJjeQAB+wMAAAEEcnJvcgDz9ggAAAEAAQABA2lvbgABWgoAAAECZ2UAAUgKAADzAAJydADXDwAAyIAAAAABqEBGAkwBnQEAAA==") \ No newline at end of file diff --git a/next/search.index/687aee40b564.js b/next/search.index/687aee40b564.js new file mode 100644 index 0000000..1ff56bd --- /dev/null +++ b/next/search.index/687aee40b564.js @@ -0,0 +1 @@ +rn_("AQVhbmRsZQDydAoAAAEAIwRoYXJkArcgCfMAAWVoAAEDbml0APIICQAAAQABCXJvbWNvbmZpZwABkAoAAPMAA2ZpczswAAABAAAFAAIAhwUCALsFAgA=") \ No newline at end of file diff --git a/next/search.index/6956faad3fef.js b/next/search.index/6956faad3fef.js new file mode 100644 index 0000000..4fba22f --- /dev/null +++ b/next/search.index/6956faad3fef.js @@ -0,0 +1 @@ +rn_("AQJlcgDy9AYAAAEAAQphbGlkbGVuZ3RoAAFyCgAAAQJybAABXQgAAPMAAXUBpgUAAAEFZXN1bHQA8h8HAAABAAkDAPM7CAAAAQABAAEGYXRld2F5APRhCAAAAQC8AAEAAQRycm9yAPPIBgAAAQABAPMAxgAUiAo7MAAAAQAABQACAIUBAQCwAgMAAQVwZGF0ZQDycggAAAEAAQNpY2sA9OYGAAABAAEAAQABBHRhdGUA8zcHAAA3AwEAAQhhY2tldG1heAABTAoAAAENYXRld2F5dmVyc2lvbgABkwoAAAEDYXRhAPLkBgAAAQDzAWWGSIAO8tcDAADFBfMAA2NudAA=") \ No newline at end of file diff --git a/next/search.index/69c133a67046.js b/next/search.index/69c133a67046.js new file mode 100644 index 0000000..2cda8c9 --- /dev/null +++ b/next/search.index/69c133a67046.js @@ -0,0 +1 @@ +rn_("AQRycm9yAAH0CAAA8wABZfWuBAAANQJSAgEAeAABA3R0cAABuQYAAAkBAPLmCQAAAQABA29kZQDyMwkAAAEACQEA89QJAAABAAEAAQVvbmZpZwDy8QkAAAEA8wNsZXIDY2Vt9+AGAAABAB0AAQABAKEC8wDzAAF182wEAAABAAEA8wCEmAABAA==") \ No newline at end of file diff --git a/next/search.index/6a8085681108.js b/next/search.index/6a8085681108.js new file mode 100644 index 0000000..f7424ec --- /dev/null +++ b/next/search.index/6a8085681108.js @@ -0,0 +1 @@ +rn_("AQVpc3RyeQDzKwoAAAEAAQABAm9uAPJDCgAAAQABCW90YXRzdGFydADySgoAAAEAAQRycm9yAPI5CgAAAQABBmF0Y2hlcgDzNQkAAAEAeADzAANjZW72VwgAAAEAHADlAQsAAQDzAAJtcwBTAAOAAAAABPlhZmcA") \ No newline at end of file diff --git a/next/search.index/6b1a7415a18b.js b/next/search.index/6b1a7415a18b.js new file mode 100644 index 0000000..002f2e6 --- /dev/null +++ b/next/search.index/6b1a7415a18b.js @@ -0,0 +1 @@ +rn_("AQRycm9yAPI5CgAAAQDzBXRyZWFtAWXzVwgAAAEAHAABAnVzAAGXBQAAAQhyYW1lcmF0ZQABNAoAAAEIdWZmZXJyZWYAAcAJAADzAW+EIoACAA==") \ No newline at end of file diff --git a/next/search.index/6b9a8d84c48d.js b/next/search.index/6b9a8d84c48d.js new file mode 100644 index 0000000..917611c --- /dev/null +++ b/next/search.index/6b9a8d84c48d.js @@ -0,0 +1 @@ +rn_("AQd0ZGxsaWtlAAGpCQAACQAAAYwKAADzBWVhcmNoAXkBRAgAAAEEb2NhbAAB+AYAAAEJdGhwcmVsb2FkAAGJCgAAAQVhbmRsZQDzQQgAAAEAAQABBmVyc2lvbgABkwoAAAEGaW1lb3V0APIuCgAAAQDzAXkCdHb0YQgAAAEAvAABAPcFAACHUvnrfZG0gQlSOzAAAAEAABkABABbARMAmwEBAOcCAAAKBQIA") \ No newline at end of file diff --git a/next/search.index/6cf638a43782.js b/next/search.index/6cf638a43782.js new file mode 100644 index 0000000..40881a1 --- /dev/null +++ b/next/search.index/6cf638a43782.js @@ -0,0 +1 @@ +rn_("AQNpdGgAAZsKAAABAmV5APJoCAAAAQABCXJvbWNvbmZpZwABpgoAAPMAA2Zrd/SKBQAAAQAzAKQEEwACpkAAAApsZGUA") \ No newline at end of file diff --git a/next/search.index/6dc48749d06b.js b/next/search.index/6dc48749d06b.js new file mode 100644 index 0000000..f0ee47e --- /dev/null +++ b/next/search.index/6dc48749d06b.js @@ -0,0 +1 @@ +rn_("AQlubHlzb3VyY2UA8nAKAAABAPMDZWFkAW8BuAYAAAEEZGluZwABRwoAAAEKZWRpYXNvdXJjZQDyNQoAAAEAAQphbm5lbGNvdW50AAF4CgAAAQNpemUA8kUIAABBAiMAAoAAAAAD2mxz8u0DAAAQAwEFdHJlYW0A8mQKAAABAPMGZGFwdGVyAXMBOgkAAPMAhpFQATswAAABAAAPAAcAmAEAAEkIAAAUCQQAIgkAADAKAAB5CgEAfQoEAA==") \ No newline at end of file diff --git a/next/search.index/6dd8980fe87a.js b/next/search.index/6dd8980fe87a.js new file mode 100644 index 0000000..2911c16 --- /dev/null +++ b/next/search.index/6dd8980fe87a.js @@ -0,0 +1 @@ +rn_("AQFwADswAAABAABdAAEA6AJdAAEDaXplAAEGCQAAIwF1AqNAAAAHIzZzAAEEc3VsdAABzgkAAPMAAmVvAAEDaW50AAEBBwAA8wACaHI6MAAAAQAAAAAACAAQAAAA1AOnBUUIBgnvCVsKhAqGCpgKAQMwMDAAAfEDAAABBDgwMDAAAcgEAAABBDQwMDAAAccEAAAJAgABxgQAAAkAAAHFBAAA8wACMjYA9wMAAAeAAAAAAYgxMjQ4ZWl5AA==") \ No newline at end of file diff --git a/next/search.index/6de836c624ad.js b/next/search.index/6de836c624ad.js new file mode 100644 index 0000000..205540a --- /dev/null +++ b/next/search.index/6de836c624ad.js @@ -0,0 +1 @@ +rn_("AQd1ZXN0c3RyAAHjCQAAAQR2ZW50APS9BgAAAQABAPACYwADgAAAAAS9ZGVxOjAAAAEAAAAAAAgAEAAAAHwBfQGeAZ8ByAPJA84DGwccBw==") \ No newline at end of file diff --git a/next/search.index/6e9a03548e4c.js b/next/search.index/6e9a03548e4c.js new file mode 100644 index 0000000..f61a73f --- /dev/null +++ b/next/search.index/6e9a03548e4c.js @@ -0,0 +1 @@ +rn_("AQhyZXNwb25zZQABoQoAAAEDZWFkAAFSCgAA8wACaHkAAQ14cGVuc2l2ZXRhc2tzAAGLCgAAAQ5sbGdsb2JhbGV2ZW50cwABogoAAPMBZQNhZXIBkwQAAA==") \ No newline at end of file diff --git a/next/search.index/6ebf42077351.js b/next/search.index/6ebf42077351.js new file mode 100644 index 0000000..8bf87fb --- /dev/null +++ b/next/search.index/6ebf42077351.js @@ -0,0 +1 @@ +rn_("AQNvZGUA8jMJAAABAAEEcnJvcgDz1AkAAAEAAQABBW9uZmlnAPLxCQAAAQDzAmVyA2NlbffgBgAAAQAdAAEAAQChAvMA") \ No newline at end of file diff --git a/next/search.index/6ee7c60d5694.js b/next/search.index/6ee7c60d5694.js new file mode 100644 index 0000000..a87331b --- /dev/null +++ b/next/search.index/6ee7c60d5694.js @@ -0,0 +1 @@ +rn_("AQVvc3RucwABigoAAAEJY3RpdmF0aW9uAAFpCgAA8wJ0ZQJhYwABCmFtcGxlY291bnQAAaQKAAABCHl0ZWNvdW50AAGgCgAA8wACYnMAAQhpc2NhcmRlZADyNwoAAAEAMwADgAAAAAWtZG95AAEJb3N0cGVyc2VjAAGeCgAA8wFkAWP2FAcAAAEAtwAvAQEAHQATA2VzcwK3IAnRAAFlbwABBHRpb24AAVwKAAABAAD0rwQAAAEAJwD6AfMBcwJlaQABAmF3AAHwCQAA8wNhdGUBcvYrBwAAAQABADoBhQABAAEKb3RpbWVzdGFtcAABowoAAPMEb3VudAF0AaQKAAAzAWUDplAAAAmqY3J0OzAAAAEAAF0AAQB/CF0AAQJyZQAB1gQAAPMAhgFIDfT6AAAA7we0AQYA") \ No newline at end of file diff --git a/next/search.index/6fdf54bb3dfb.js b/next/search.index/6fdf54bb3dfb.js new file mode 100644 index 0000000..9fae658 --- /dev/null +++ b/next/search.index/6fdf54bb3dfb.js @@ -0,0 +1 @@ +rn_("AQx1bm5lcm1lc3NhZ2UAAWgKAAABBWFuZGxlAPJ0CgAAAQABAAD20gQAAAEA/AQBACMAAQAjAAKQAAo3AAFkcgABBG91bnQAAe8IAAD3AAAAhZAABJgAAZQAA/ZnAwAAAQCKAwEA7QJvAA==") \ No newline at end of file diff --git a/next/search.index/710290bc6833.js b/next/search.index/710290bc6833.js new file mode 100644 index 0000000..9d7713a --- /dev/null +++ b/next/search.index/710290bc6833.js @@ -0,0 +1 @@ +rn_("AQNpbnQA8yEHAAABAD0D8wFoAWj32gkAABsAfQAbAAEABwABAAEKdGF0ZXVwZGF0ZQDydgoAAAEAAQNpdGgAAZsKAAABAmV5APJoCAAAAQABCXJvbWNvbmZpZwABpgoAAPMDaXJkA2Zrd/SKBQAAAQAzAKQEAQV0ZXdheQD0YQgAAAEAvAABAPcAAACFpwAAAAg+AwAOOzAAAAEAACgACgAGBAAAAQUAAAMFAgB6BQAAvwUAANYGAQADBw4AsAkOAEcKAAClCgAA") \ No newline at end of file diff --git a/next/search.index/713cd62b6b7f.js b/next/search.index/713cd62b6b7f.js new file mode 100644 index 0000000..8cf8530 --- /dev/null +++ b/next/search.index/713cd62b6b7f.js @@ -0,0 +1 @@ +rn_("AQRsZGVyAAEpCQAAAQthYmxlc3RvcmFnZQABlwoAAPMAAWcBTAMAAAECZWYAAcAJAAABAnRoAPKVCgAAAQDzAmVuAWcBPQoAAPMCZXICbHIA8wABZgHMBAAAcwCEgAAAAANwYBEAAA==") \ No newline at end of file diff --git a/next/search.index/7190f2a95af0.js b/next/search.index/7190f2a95af0.js new file mode 100644 index 0000000..fd6cac5 --- /dev/null +++ b/next/search.index/7190f2a95af0.js @@ -0,0 +1 @@ +rn_("AQdlcXVpcmVkAAFsCgAAAQJ6ZQDyhAoAABQA8wACaXLySAMAAAEAAQJlbgA7MAAAAQAABgABAJgFBgABCm90aW1lc3RhbXAAAZ0KAADzBG91bnQBdAGgCgAA8wADY2xzAA==") \ No newline at end of file diff --git a/next/search.index/71ee74b3d46a.js b/next/search.index/71ee74b3d46a.js new file mode 100644 index 0000000..c113a67 --- /dev/null +++ b/next/search.index/71ee74b3d46a.js @@ -0,0 +1 @@ +rn_("AQJlcgDywQkAAAEAAQJyZQABcwoAAAEDYmxlAAGSCgAA8wACYXXyfgEAAIQF8wACbG4A") \ No newline at end of file diff --git a/next/search.index/720e25dd6cfe.js b/next/search.index/720e25dd6cfe.js new file mode 100644 index 0000000..0ca5f8e --- /dev/null +++ b/next/search.index/720e25dd6cfe.js @@ -0,0 +1 @@ +rn_("AQdhbmlja2VkAPLFCQAAAQABBHN5bmMAOzAAAAEAAAkAAgAUCQQAfQoEAPMBZQJhcDswAAABAAAIAAIA4QMDAHUEBAA=") \ No newline at end of file diff --git a/next/search.index/73ae90f8461e.js b/next/search.index/73ae90f8461e.js new file mode 100644 index 0000000..55fedfa --- /dev/null +++ b/next/search.index/73ae90f8461e.js @@ -0,0 +1 @@ +rn_("AQZuZGRhdGEAAZoKAADzA3VpZAFhAagJAAABBnJlbG9hZADyTgoAADsAAQlub25jZXNpemUAAYYKAAABBmVhZGVycwDyUAoAAAEAAQNhdGEAAacJAAABBW9uZmlnAPPxCAAAAQABAPMAhoyQCPKrCQAA8AA=") \ No newline at end of file diff --git a/next/search.index/73d431e93292.js b/next/search.index/73d431e93292.js new file mode 100644 index 0000000..541fe3c --- /dev/null +++ b/next/search.index/73d431e93292.js @@ -0,0 +1 @@ +rn_("AQdvc3RyaW5nADswAAABAAAOAAEAsAkOAAEIZW5kZXJyb3IAAQoJAAABCm5hdmFpbGFibGUAAZIKAAABBm52YWxpZAABVQoAAPMDb2RlAml19BYHAAABAF4BAQABDG52YWxpZGxlbmd0aAABcgoAAPMAAmlt8uUDAACVAPMAAW/ytwQAACoFAQJsbADzswYAAAEAAQDzAAJvdAABAmV3APMKBQAAAQABAAEEaW1pdAAB6wgAAAEBbwA7MAAAAQAAXQABAFUGXQDzAW4BdAHNBAAAAQNyb20AOzAAAAEAAF4AAQD2BV4A9w0AAIh6VNhe2RogqQc6MAAAAQAAAAAAFAAQAAAAWgNlA2YDvgO/A8YDxwPyA/MDigRtBRsJHAkqCdcJ2AnZCSsKLAotCmsK") \ No newline at end of file diff --git a/next/search.index/7458d5dd0cdb.js b/next/search.index/7458d5dd0cdb.js new file mode 100644 index 0000000..bc941b4 --- /dev/null +++ b/next/search.index/7458d5dd0cdb.js @@ -0,0 +1 @@ +rn_("AQNmaWcAAZEKAAATA21jbwKnQAAACmBucwABAm1lAAEHCQAA8wACYW8AAQVpbHVyZQABcwoAAPMAAmFyAA==") \ No newline at end of file diff --git a/next/search.index/74728043195a.js b/next/search.index/74728043195a.js new file mode 100644 index 0000000..731a8b3 --- /dev/null +++ b/next/search.index/74728043195a.js @@ -0,0 +1 @@ +rn_("AQlsaWVudGRhdGEAAZkKAAATAnNlAoAAAAAJOWNkAToIAAABAm1wAAHpCAAAAQZhY2tvZmYA8mYKAAABAPMBbANiY2kA") \ No newline at end of file diff --git a/next/search.index/751b30b4ce58.js b/next/search.index/751b30b4ce58.js new file mode 100644 index 0000000..076e45f --- /dev/null +++ b/next/search.index/751b30b4ce58.js @@ -0,0 +1 @@ +rn_("AQJldADy3gkAAAEAAQhyb2JlanNvbgABYQoAAAEEeGxlbgDy4gkAAIsAAQJlZgABwAkAAAECdGgA8pUKAAABAPMCZW4BZwE9CgAA8wFyAmxyAPMAhBCBAvOrBAAAuwUBAA==") \ No newline at end of file diff --git a/next/search.index/7578054eaa24.js b/next/search.index/7578054eaa24.js new file mode 100644 index 0000000..3438857 --- /dev/null +++ b/next/search.index/7578054eaa24.js @@ -0,0 +1 @@ +rn_("AQpuYXZhaWxhYmxlAAGSCgAAAQZudmFsaWQAAVUKAADzAmRlAml19BYHAAABAF4BAQDzAAFv8nsEAAABAA==") \ No newline at end of file diff --git a/next/search.index/75a6e289042e.js b/next/search.index/75a6e289042e.js new file mode 100644 index 0000000..a6ea678 --- /dev/null +++ b/next/search.index/75a6e289042e.js @@ -0,0 +1 @@ +rn_("AQRhbHVlAAGiCQAAAQJwZQABHQkAAAEIYWNrZXZlbnQAAVYKAADzAAJyeQABBWVuZ3RoAAFyCgAA8wADbHR2OzAAAAEAAAYAAwC6BgIAlwcCAFUKAAA=") \ No newline at end of file diff --git a/next/search.index/75f619e98e16.js b/next/search.index/75f619e98e16.js new file mode 100644 index 0000000..bee4d34 --- /dev/null +++ b/next/search.index/75f619e98e16.js @@ -0,0 +1 @@ +rn_("AQphbXBsZWNvdW50AAGkCgAAAQh5dGVjb3VudAABoAoAAPMBbwJicwABAmF3AAHwCQAA8wNhdGUBcvYrBwAAAQABADoBhQABAAEKb3RpbWVzdGFtcAABowoAAPMEb3VudAF0AaQKAADzAWUCY3I7MAAAAQAAXQABAH8IXQDzAAJsdPKdCgAABgABCW90YXRzdGFydADySgoAAAEAAQNlcnMAAekJAAABA2l6ZQDy7wkAAGwAAQJvcgDyOQoAAAEAAQJ0ZQABNAoAAPMAAmFyAAEEZW5tcwABBAkAAAEHeXRlc2l6ZQDyhAoAABQA8wCFAggHAQcJAAABBmF0Y2hlcgDzNQkAAAEAeAD3AAAAhYAAAAAJERSgAvZXCAAAAQAcAOUBCwABAA==") \ No newline at end of file diff --git a/next/search.index/769bb8037d22.js b/next/search.index/769bb8037d22.js new file mode 100644 index 0000000..e54e769 --- /dev/null +++ b/next/search.index/769bb8037d22.js @@ -0,0 +1 @@ +rn_("AQ5lY29ubmVjdGRyaXZlcgABnwoAAAEKZWF2ZXNlcnZlcgABggoAAAEDeXB0AAHhCQAAAQJkZQABrQkAAPMCZWMCb3IAAQpyZWF0ZWFzeW5jAPV9CgAAAQABAAEAAQDzA3VsZIQMCAEA") \ No newline at end of file diff --git a/next/search.index/770d204f7fb9.js b/next/search.index/770d204f7fb9.js new file mode 100644 index 0000000..d91885a --- /dev/null +++ b/next/search.index/770d204f7fb9.js @@ -0,0 +1 @@ +rn_("AQdsb2NraW5nAAGlCgAA8wNhdHMBYgGDCgAA8wABdAHlCQAA8wRyZWFkAXMBBQkAAA==") \ No newline at end of file diff --git a/next/search.index/778f68240ab0.js b/next/search.index/778f68240ab0.js new file mode 100644 index 0000000..b0dd6bb --- /dev/null +++ b/next/search.index/778f68240ab0.js @@ -0,0 +1 @@ +rn_("AQJvbgDycAUAADUAAQJhdwAB8AkAAAEBeQD1jAUAAAEAMwABAAEA8wACZ3I6MAAAAQAAAAAACgAQAAAArAStBCsHLActB2cI7AjtCO4I7Ak0CjMAA6cgAAAFdWVpbwA=") \ No newline at end of file diff --git a/next/search.index/77e2f3d7e3cd.js b/next/search.index/77e2f3d7e3cd.js new file mode 100644 index 0000000..9279846 --- /dev/null +++ b/next/search.index/77e2f3d7e3cd.js @@ -0,0 +1 @@ +rn_("AQxwZW5zaXZldGFza3MAAYsKAAABA2VudAD0vQYAAAEAAQDwAgEDcm9yAPXmCQAAAQAPAGEAAQABCGFsaXZlZ2FwAacwAAAKhW0BXQoAAOcBAADFK1Gxi1dCAAChKAA=") \ No newline at end of file diff --git a/next/search.index/7814189ffefa.js b/next/search.index/7814189ffefa.js new file mode 100644 index 0000000..9a1ac8f --- /dev/null +++ b/next/search.index/7814189ffefa.js @@ -0,0 +1 @@ +rn_("AQd0ZWNvdW50AAGgCgAAAQdmZmVycmVmAAHACQAAAQNzb24AAWEKAAABCG1ldGFkYXRhAAHTCQAA8wACZGrzZAMAAFkANAMBBmxldmVudAGAAAAACqJzAU0KAADzAIQRAEgA") \ No newline at end of file diff --git a/next/search.index/785e189ddfc5.js b/next/search.index/785e189ddfc5.js new file mode 100644 index 0000000..db8f607 --- /dev/null +++ b/next/search.index/785e189ddfc5.js @@ -0,0 +1 @@ +rn_("AQNlcnMAAekJAAABA2l6ZQDy7wkAAGwAAQNhdGUAATQKAAABBGVubXMAAQQJAAABB3l0ZXNpemUA8oQKAAAUAPMAhQIIBwEHCQAAEwACgAAAAAkRZXMA") \ No newline at end of file diff --git a/next/search.index/79019f6dc6f9.js b/next/search.index/79019f6dc6f9.js new file mode 100644 index 0000000..1c21d6f --- /dev/null +++ b/next/search.index/79019f6dc6f9.js @@ -0,0 +1 @@ +rn_("AQZlcnNpb24AAZMKAAABBmltZW91dADyLgoAAAEA8wJheQJ0dvRhCAAAAQC8AAEAAQlvaWNlc3RhdGUA8m4KAAABAAEFcGRhdGUA8yMJAABTAQEACQMA8ocKAAABAAEDYXRlAAEkCQAAAQRydmVyAAG/CQAA8wACZXQAAQJhdwAB8AkAAAEHYW5pY2tlZADyxQkAAAEAAQAA9YwFAAABADMAAQABAAECcnkAAW0FAADzAAJveQABBnRyYWNrcwDyewoAAAEAAQRzeW5jADswAAABAAAJAAIAFAkEAH0KBADzAMpAEqAfOzAAAAEAACYAEwCkAQAAywMBAOEDAwB1BAQArAQBAM8GAQAmBwEAKwcCADMHAQA3BwAAZwgAAHIIAQDsCAIAIwkBAKwJAADsCQAANAoAAG4KAQB2CgEA") \ No newline at end of file diff --git a/next/search.index/7921a71eafc2.js b/next/search.index/7921a71eafc2.js new file mode 100644 index 0000000..1299c64 --- /dev/null +++ b/next/search.index/7921a71eafc2.js @@ -0,0 +1 @@ +rn_("AQQ2Z2NtAAG3BgAAAQMwMDAAAccEAAABB29seTEzMDUAAV4KAAAjAAKjAAAABMUwcADzAAMwNDXz/AAAAFoAIQA=") \ No newline at end of file diff --git a/next/search.index/7a1578200658.js b/next/search.index/7a1578200658.js new file mode 100644 index 0000000..c525da5 --- /dev/null +++ b/next/search.index/7a1578200658.js @@ -0,0 +1 @@ +rn_("AQJ1dAA7MAAAAQAAXQABADkHXQDzAAFtOzAAAAEAAF0AAQAOBF0AAQNpemUAAQYJAAAjAAKjQAAAByM2cwABDW9jb2x2aW9sYXRpb24AAVoKAAABA2luZADywgYAAOECIwACpkAAAAS9ZWs7MAAAAQAALQAPAE0DCACoAwQAyAYEANMGAgDbBgAA4gYAAPQIBAAKCQAAMQkBANQJAgDmCQEA6gkBAPYJAAA5CgMAVwoBAAEEaW9ucwABxwkAAAECZWQA8roEAAABAPMAAnB08qUBAAABAAECdHIAAagFAAABAnRlAAEHBQAAAQpmcHJvYmVqc29uAAFhCgAAAQNmaWcA9nsIAAAUAgEAAQALAAoAEwFvAqdAAAAKYG5zAPMAhCRAAjswAAABAADzAAMAqQGTAIQFAAD2BV4AAQVlcnJvcgDz9ggAAAEAAQABB2lsZXR5cGUAAUkKAAABA2VzcwABBgUAAAEDc29uAAFhCgAAAQhtZXRhZGF0YQAB0wkAAPMBZQJkavNkAwAAWQA0A/MAiiaYHQA=") \ No newline at end of file diff --git a/next/search.index/7a3b8590a6e8.js b/next/search.index/7a3b8590a6e8.js new file mode 100644 index 0000000..2606edd --- /dev/null +++ b/next/search.index/7a3b8590a6e8.js @@ -0,0 +1 @@ +rn_("AQNpbWUA8voGAAABAAEKcGlrZWxlbmd0aADyjQoAAAEAAQt1ZmZlcmxlbmd0aADylQoAAAEA8wF0AmJzAAEEbnB1dAABMwoAAPMCbHkBaQH5BgAA8wACbnUAAQNvZGUA8n0FAAABAAECdXQAAUgIAAABAADzAwUAAAEAAQDzAW4CZ3AAAQNyb3IA89MGAAABAAEAIwACgAAAAAS4ZHIA5wMAAIY9v5mG2VcRUQQ7MAAAAQAABgADAJABAgC/AgIAuQQAAA==") \ No newline at end of file diff --git a/next/search.index/7a54d85ed91a.js b/next/search.index/7a54d85ed91a.js new file mode 100644 index 0000000..2d5fa77 --- /dev/null +++ b/next/search.index/7a54d85ed91a.js @@ -0,0 +1 @@ +rn_("AQJtZQDzVAgAAAEAAQABBG9uc2UAAaEKAAABCHJ2ZWVycm9yAAH2CQAA8wJlcwNlcHUA") \ No newline at end of file diff --git a/next/search.index/7a61a5c277c5.js b/next/search.index/7a61a5c277c5.js new file mode 100644 index 0000000..72dcbe9 --- /dev/null +++ b/next/search.index/7a61a5c277c5.js @@ -0,0 +1 @@ +rn_("AQVhbGVudAA7MAAAAQAAawABAM4HawABAmVkAAFsCgAAAQVhcmtlcgABXggAAAEBZAA7MAAAAQAABQACAMAEAgCqBQIAawADpyAAAAkpZWltAAEGbmRkYXRhAAGaCgAA8wABYfWaAQAASgEBAAEAwgbzAARkbHJ2AA==") \ No newline at end of file diff --git a/next/search.index/7b442897524b.js b/next/search.index/7b442897524b.js new file mode 100644 index 0000000..b2dfb82 --- /dev/null +++ b/next/search.index/7b442897524b.js @@ -0,0 +1 @@ +rn_("AQNlYWQAAfwGAAABC2NhdGVkdHJhY2tzAPJ7CgAAAQABAmtlAPKpCQAA4wABC2xvYmFsZXZlbnRzAAGiCgAAARBpc2NvdmVyeXJlc3BvbnNlAAGhCgAAEwNnYWwCpwAAAAbHZGkAAQdvbXBsZXRlAAGqCQAAAQNhY2sA8jcJAAABAPMAh1ZBATowAAABAAAAAAAJABAAAAB6AXsBkwHCAsMCxAL0A7MGtAa1Bg==") \ No newline at end of file diff --git a/next/search.index/7b50db887c8e.js b/next/search.index/7b50db887c8e.js new file mode 100644 index 0000000..d32e738 --- /dev/null +++ b/next/search.index/7b50db887c8e.js @@ -0,0 +1 @@ +rn_("AQJ0cgAB4wkAACMBdAKmQAAABtxlc/UIBQAAFQIBAEEBAQATAAKmUAAABPdzdQGUBQAA") \ No newline at end of file diff --git a/next/search.index/7bc75868461e.js b/next/search.index/7bc75868461e.js new file mode 100644 index 0000000..e450e54 --- /dev/null +++ b/next/search.index/7bc75868461e.js @@ -0,0 +1 @@ +rn_("AQZlc3NhZ2UAAWgKAADzAAFt8zsIAAABAAEAAQAA9G4FAAABADAAAQABBWFya2VyAAEoCQAAAQFkADswAAABAAAFAAIAugYCAJcHAgABBHJyb3IAAfUIAAABBG91bnQAAXgKAADzAIUUEQLy1QQAAFUFYwFlA39SpYRBuGNscgA=") \ No newline at end of file diff --git a/next/search.index/7c7d582a16fb.js b/next/search.index/7c7d582a16fb.js new file mode 100644 index 0000000..26fcde2 --- /dev/null +++ b/next/search.index/7c7d582a16fb.js @@ -0,0 +1 @@ +rn_("AQR4bGVuAPLiCQAAiwABAmVmAAHACQAAAQJ0aADylQoAAAEA8wJlbgFnAT0KAADzAXICbHIA8wACZWkA8wABZgHMBAAA") \ No newline at end of file diff --git a/next/search.index/7cb498816342.js b/next/search.index/7cb498816342.js new file mode 100644 index 0000000..78c2179 --- /dev/null +++ b/next/search.index/7cb498816342.js @@ -0,0 +1 @@ +rn_("AQNhdGUA8jMHAAABAAECZWsAAWMKAADzAAJldDowAAABAAAAAAAIABAAAACjBKQEpQSmBEAI8Ah7CnwKiwo=") \ No newline at end of file diff --git a/next/search.index/7d7b74927675.js b/next/search.index/7d7b74927675.js new file mode 100644 index 0000000..5ffb4a1 --- /dev/null +++ b/next/search.index/7d7b74927675.js @@ -0,0 +1 @@ +rn_("AQRyZWFtAPJkCgAAAQABA2l0aAABmwoAAAEJcm9tY29uZmlnAAGmCgAA8wZuZ2JpcmQCZncBYgoAAAECb24A8mYIAAAtAgEDYXJkAPLgCQAAbwABAnV0APJGCAAAAQDzAAFtOzAAAAEAAAYAAwD4AwIAjwQCANIGAAABAm5kAAEnCQAA8wABb/JTCgAASwDzAAJjZPNfAwAAAQABAPMAhZBBBPb7BAAAmwBQAwMBZwABAA==") \ No newline at end of file diff --git a/next/search.index/7e714c3342ed.js b/next/search.index/7e714c3342ed.js new file mode 100644 index 0000000..11ec285 --- /dev/null +++ b/next/search.index/7e714c3342ed.js @@ -0,0 +1 @@ +rn_("AQVhbmRsZQDydAoAAAEAIwRoYXJkArcgCfMAAWVoAAEDbml0APIICQAAAQABCXJvbWNvbmZpZwABkAoAAPMAA2ZpczswAAABAAAFAAIAhwUCALsFAgABCWxpZW50ZGF0YQABmQoAABMFYWxpc2UCgAAAAAk5Y2QBOggAAGMAA5AAA+wBh2VpeTswAAABAAA0AAMA4wIAAAgJAQD4CTEAAQNoZWQAAXIFAAABBmFsaXNlZAABOQkAAPMBdAFpOzAAAAEAADEAAQD4CTEAIwACtvAJwwABZmkAAQAA80oIAAABAAEAAQNrZWQA83sFAABKBAEA8wCFDCAGAA==") \ No newline at end of file diff --git a/next/search.index/7ec59624e8f4.js b/next/search.index/7ec59624e8f4.js new file mode 100644 index 0000000..8622593 --- /dev/null +++ b/next/search.index/7ec59624e8f4.js @@ -0,0 +1 @@ +rn_("AQRhbGlkAAFVCgAAAQFvADswAAABAAAxAAEAmgcxAAECdXQA9M0GAAABAHEBYAHzAANwdHYAAQAAOzAAAAEAAF4AAgAHBAAADQVdAPMAAmRuAA==") \ No newline at end of file diff --git a/next/search.index/7f52a58441b8.js b/next/search.index/7f52a58441b8.js new file mode 100644 index 0000000..988986d --- /dev/null +++ b/next/search.index/7f52a58441b8.js @@ -0,0 +1 @@ +rn_("AQVlYXNvbgDyQwoAAAEAAQNpbmQA8soJAAABAAEFZXN1bHQA8kEKAAABAAEDbmZvAPLDCQAAAQABBHJyb3IA8uoJAAABAPMCb24DZWlyAWoKAAABBmFpbHVyZQABcwoAAAEEaXZlcgABnwoAAAECdGEA9FsIAAABAGwBAQDzAAJhcgDXAwABdIamQAAACP04BQE6MAAAAQAAAAAADgAQAAAAsQSyBLME2ATZBNoGzQcrCSwJ7QnuCT4KPwpFCkYK") \ No newline at end of file diff --git a/next/search.index/7f5a0d986575.js b/next/search.index/7f5a0d986575.js new file mode 100644 index 0000000..161b08c --- /dev/null +++ b/next/search.index/7f5a0d986575.js @@ -0,0 +1 @@ +rn_("AQVhY2tldADy5wgAAAEAAQNhdGEA8hIJAAABAPMAAmRw97wCAAD4AQEAJQAkBAEAAQA=") \ No newline at end of file diff --git a/next/search.index/7f779ec227ec.js b/next/search.index/7f779ec227ec.js new file mode 100644 index 0000000..45ef940 --- /dev/null +++ b/next/search.index/7f779ec227ec.js @@ -0,0 +1 @@ +rn_("AQZpbWVvdXQA8ocKAAABAPMAAXT0NwcAAO0BSgEBAAEEbG9jawDyLgkAAAEA8wACYmUA") \ No newline at end of file diff --git a/next/search.index/7fc769eceb8f.js b/next/search.index/7fc769eceb8f.js new file mode 100644 index 0000000..efdb7ce --- /dev/null +++ b/next/search.index/7fc769eceb8f.js @@ -0,0 +1 @@ +rn_("AQRpbWl0AAHrCAAAIwACpuAAAATNaWz2ZQMAAAEAYAABAFQFAQABA2V2ZQABgQUAAGMAA6ZgAAAE+WVpeQA=") \ No newline at end of file diff --git a/next/search.index/alias/a762150c532c.js b/next/search.index/alias/a762150c532c.js new file mode 100644 index 0000000..f829e46 --- /dev/null +++ b/next/search.index/alias/a762150c532c.js @@ -0,0 +1 @@ +rd_("") \ No newline at end of file diff --git a/next/search.index/crateNames/8f46c39274d9.js b/next/search.index/crateNames/8f46c39274d9.js new file mode 100644 index 0000000..4721cde --- /dev/null +++ b/next/search.index/crateNames/8f46c39274d9.js @@ -0,0 +1 @@ +rd_("hsongbird") \ No newline at end of file diff --git a/next/search.index/desc/c103d4fb29fa.js b/next/search.index/desc/c103d4fb29fa.js new file mode 100644 index 0000000..bd1b9f2 --- /dev/null +++ b/next/search.index/desc/c103d4fb29fa.js @@ -0,0 +1 @@ +rd_("AhMiscellaneous I/O error.CnA host-specific I/O error caused the fault; this is likely \xe2\x80\xa6AjContains the success value00CgError communicating with gateway server over WebSocket.BkNewtypes around Discord IDs for library \xe2\x80\xa6AmThe attached track has ended.CgThe track has naturally ended, and cannot be restarted.AhContains the error value00CnMaximum bitrate allowed (up to maximum number of bytes for \xe2\x80\xa6AkAn unread, raw file stream.AnRespond to one received event.DfAdds a Track object to the queue, to be played in the \xe2\x80\xa6DeRetrieves a Call for the given guild, if one already \xe2\x80\xa6CmRetrieve the Songbird voice client from a serenity context\xe2\x80\xa6CaGet the message sender for shard_id.CdReturns the number of tracks currently in the queue.BoMaximum amount of time to wait between retries.BoMinimum amount of time to wait between retries.CnCreates a new Call, which will send out WebSocket messages \xe2\x80\xa6DkCreates a new DecodeConfig with the specified channels and \xe2\x80\xa6CmCreate a new mixer scheduler from the allocation strategy \xe2\x80\xa6AkCreates a new voice driver.CjCreate a representation of an event and its associated \xe2\x80\xa6BnCreates a new event store to be used globally.CdWrap and pull from an async file stream, with an \xe2\x80\xa6CjWrap an input PCM byte source to be readable by symphonia.CmCreate a new ChildContainer from a child processCjCreates a lazy file object, which will open the target \xe2\x80\xa6AjCreate a lazy HLS request.AkCreate a lazy HTTP request.DkCreates a lazy request to select an audio stream from url, \xe2\x80\xa6DkInstantiates a new AsyncReadOnlySource by taking ownership \xe2\x80\xa6DkWrap an existing Input with an in-memory store, compressed \xe2\x80\xa6D`Wrap an existing Input with an in-memory store, \xe2\x80\xa6DhWrap an existing Input with an in-memory store with the \xe2\x80\xa6CjConstruct a map of shards and command senders to those \xe2\x80\xa6EhCreate a new track directly from an Input and a random Uuid\xe2\x80\xa6BaCreate a new, empty, track queue.AgInner shared bytestore.00C`Create a zero-copy view of the inner RTP packet.CiDefault bitrate decided by the encoder (not recommended).CfThe Call handler is responsible for a single voice \xe2\x80\xa6CkUntimed events belonging to the global context, such as \xe2\x80\xa6kCore eventsC`The operation failed, and should not be retried.BaA lazily instantiated local file.DkAn iterator over all Calls currently stored in the manager \xe2\x80\xa6BmFuture for a call to Call::join.AmJSON (de)serialization error.BkA byte source which is not yet initialised.AkAn initialised byte source.AnThe attached track has looped.CdDecode received audio packets into a single channel.CcAudio sources will be downmixed into a mono buffer.BfThe Opus encoder could not be created.CkPackets received from Discord are handed over to events \xe2\x80\xa6BgThe attached track has resumed playing.CkA command to seek or ready the target track failed when \xe2\x80\xa6AoThe track is currently playing.BiFailed to seek to the requested location.CfThe track has been manually stopped, and cannot be \xe2\x80\xa6BhEstimate of a source\xe2\x80\x99s length in time.BmLive track and input state exposed during \xe2\x80\xa6BnAllows access to this track\xe2\x80\x99s attached Data.BdThe date of creation of this stream.ClLeaves the current connected voice channel, if connected \xe2\x80\xa6AoReturns the argument unchanged.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ClExtension and MIME type information which may help guide \xe2\x80\xa6BaCalls U::from(self).000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DaCreates an iterator for all Calls currently managed.BfFuture types for gateway interactions.CgConnect or switch to the given voice channel by its Id.DiConnects to a target by retrieving its relevant Call and \xe2\x80\xa6CdThe location that a voice connection was terminated.CfOne-based line number at which the error was detected.CiReturns a reference to the live input, if it has been \xe2\x80\xa6CnMetadata extracted by symphonia while detecting a file\xe2\x80\x99s \xe2\x80\xa6CjIn-stream metadata for this track, if it is fully readied.CcSets whether the current connection is to be muted.0AnOpus encoder bitrate settings.BmPlays audio from a Track object.BhSets a track to playing if it is paused.AhUnpauses an audio track.CaCreate a zero-copy view of the inner RTCP packet.CaRequests a seek to the given time for this track.C`Seeks along the track to the specified position.CbSkip to the next track in the queue, if it exists.DdThe RTP SSRC (\xe2\x80\x9cSynchronisation source\xe2\x80\x9d) assigned by \xe2\x80\xa6CeStops playing audio from all sources, if any are set.AgManually stops a track.AeStops an audio track.CgStop the currently playing track, and clears the queue.DgMove all fields from an AuxMetadata object into a new one.BiReturns this track\xe2\x80\x99s unique identifier.CjReturns this handle\xe2\x80\x99s (and track\xe2\x80\x99s) unique identifier.BaUnique identifier for this track.BiEstimate of a source\xe2\x80\x99s length in bytes.CcThe attached track has encountered a runtime or \xe2\x80\xa6CmErrors encountered using a Memory cached source.CmClasses of event which may occur, triggering a handler at \xe2\x80\xa6ClThe driver will wait for the same amount of time between \xe2\x80\xa6CiAn audio source, which can be live or lazily initialised.ClFailed to read headers, codecs, or a valid stream from a \xe2\x80\xa6CiSymphonia failed to parse the container or decode the \xe2\x80\xa6CmFailed to read headers, codecs, or a valid stream from an \xe2\x80\xa6BcThe attached track has been paused.CbThe track is currently paused, and may be resumed.CkConfiguration to be used for retrying driver connection \xe2\x80\xa6CbA reference to an individual websocket connection.CeTrack event context, passed to events created via \xe2\x80\xa6CfUntimed events belonging to a track, such as state \xe2\x80\xa6ClTrack events correspond to certain actions or changes of \xe2\x80\xa6BaInitial state for audio playback.AnThe album name of this stream.BbDriver and gateway error handling.BiRaw audio input data streams and sources.AhThe wrapped file stream.CiThe live or lazily-initialised audio stream to be played.CnReturns true if this error was caused by a failure to read \xe2\x80\xa6ChLeaves the current voice channel, disconnecting from it.CmRetrieves the handler for the given target and leaves the \xe2\x80\xa61CaSet an audio track to loop a set number of times.BkThe number of remaning loops on this track.AiCount of remaining loops.AnRemaining loops on this track.CjPre-emptively pauses a track, preventing it from being \xe2\x80\xa6AfPauses an audio track.BiPause the track at the head of the queue.DhMetadata found while probing for the format of an Input \xe2\x80\xa6CfReturns a reference to this driver\xe2\x80\x99s built-in queue.CnWhether this track has been made live, is being processed, \xe2\x80\xa60BeConfiguration for connection retries.BaThe YouTube title of this stream.CdEphemeral secret used to validate the above session.AnThe track name of this stream.BhUtility methods for seeking or decoding.CnActions for the mixer to take after inspecting track state \xe2\x80\xa6CaCancels the event, if it was intended to persist.BdConfiguration for drivers and calls.BbConfiguration for a cached source.DmFailed to create a LiveInput from the lazy Compose.BfThe audio stream could not be created.0DfFailed to create a live bytestream from the lazy Compose.CjAn error occurred during [en/de]cryption of voice packets.ChDecrypts and decodes each received packet, correctly \xe2\x80\xa6CmFailed to decode a frame received from an Input.CfThe control object for a Discord voice connection, \xe2\x80\xa6CbThe driver failed to establish a voice connection.BjTrack will loop n more times.B`Decode to a sample rate of 8kHz.DiA wrapper around an existing Input which caches its data \xe2\x80\xa6CgTried to leave a Call which was not found.CnAn audio file which has had its headers parsed and decoder \xe2\x80\xa60CjReference to a track which is known to be part of a queue.CfDecode received audio packets into two interleaved \xe2\x80\xa6CjAudio sources will be mixed into into a stereo buffer, \xe2\x80\xa6AeID of a Discord user.DgPerform an arbitrary synchronous action on a raw Track \xe2\x80\xa6AoThe main artist of this stream.ClIn-memory, shared input sources for reuse between calls, \xe2\x80\xa6CgA reqwest client instance used to send the HTTP GET \xe2\x80\xa6CfCodec registries extending Symphonia\xe2\x80\x99s probe and \xe2\x80\xa6ChOne-based column number at which the error was detected.C`Returns a view of this driver\xe2\x80\x99s configuration.AnCreate a source synchronously.CfSets whether the current connection is to be deafened.AnRunner for a voice connection.CeEvents relating to tracks, timing, and other callers.BlList of events attached to this audio track.CjMetadata found inside the format/container of an audio \xe2\x80\xa6CmAudio packet, seeking, and state access for all tracks in \xe2\x80\xa6AgClones the inner handleChReturns true if this error was caused by prematurely \xe2\x80\xa6CnAmount of uniform random jitter to apply to generated wait \xe2\x80\xa6AeRaw RTCP packet data.AdRaw RTP packet data.BeRTP packet clocked out for this tick.CjReturns a reference to the data parsed from this input \xe2\x80\xa60BdThe cause of any connection failure.DgRetrieves the Call for the given target and leaves the \xe2\x80\xa6CjConsumes this handle to await a reply from the driver, \xe2\x80\xa6BjResume the track at the head of the queue.CmRuns a search for the given query, returning a list of up \xe2\x80\xa6CaThe domain name of Discord\xe2\x80\x99s voice/TURN server.CfHandlers for sending packets over sharded connections.CmSet of all SSRCs currently known in the call who aren\xe2\x80\x99t \xe2\x80\xa6BcLive, controllable audio instances.DaSets volume in a manner that allows method chaining.BhThe current mixing volume of this track.AhThe volume for playback.AmCurrent volume of this track.ClExponential backoff waiting strategy, where the duration \xe2\x80\xa6AnOpus encoder bitrate settings.CkData and behaviour required to instantiate a lazy audio \xe2\x80\xa6CbFuture for a call to Driver::connect.CaThe voice driver failed to connect to the server.BjDecrypts the body of each received packet.DeDelayed events rely upon a delay parameter, and fire one \xe2\x80\xa6CdRequest to join was dropped, cancelled, or replaced.EfAnother seek/make_playable request was made, and so this \xe2\x80\xa6CiThe track has encountered a runtime or initialisation \xe2\x80\xa6AnA generic shard handle source.BcHandle to a generic shard instance.CcID of a Discord guild (colloquially, \xe2\x80\x9cserver\xe2\x80\x9d).BaDecode to a sample rate of 12kHz.BaDecode to a sample rate of 16kHz.BaDecode to a sample rate of 24kHz.BaDecode to a sample rate of 48kHz.ClMixing behaviour for sent audio sources processed within \xe2\x80\xa6CkThis input is currently lazily initialised, and must be \xe2\x80\xa6CmThe operation failed, and should be retried after a given \xe2\x80\xa6BoOpus audio packet, received from another streamCmThe voice connection was terminated mid-session by either \xe2\x80\xa6BnSource of individual shard connection handles.CfAn unread file which has been wrapped with a large \xe2\x80\xa6BcThe YouTube channel of this stream.CgConnects to a voice channel using the specified server.C`Returns a handle to the currently playing track.BcDecoder state for the chosen track.CiCreate an Opus decoder outputting at a sample rate of \xe2\x80\xa6CdAttempts to remove a track from the specified index.DfAdds an existing Track to this driver\xe2\x80\x99s built-in queue.BjGets a reference to the underlying reader.CbHTTP header fields to add to any created requests.ClReturns true if this error was caused by input data that \xe2\x80\xa6CnReturns whether the current connection is self-deafened in \xe2\x80\xa6CcReturns whether the track has irreversibly stopped.CkReturns whether the current connection is self-muted in \xe2\x80\xa6CnReturns whether the driver is muted (i.e., processes audio \xe2\x80\xa6BfThe current play status of this track.BoWhether or not this sound is currently playing.CjPlay status (e.g., active, paused, stopped) of this track.BfHandle events received on the cluster.DjConverts this audio source into a Parsed object using the \xe2\x80\xa6BhThe target URL of the required resource.AcUserID of this bot.CaThe channel layout of output audio when using \xe2\x80\xa6CnThe operation failed because the track has ended, has been \xe2\x80\xa6ClTrack will loop endlessly until loop state is changed or \xe2\x80\xa6AoSongbird had an internal error.DiIn-stream information about an Input acquired by parsing \xe2\x80\xa6CnNo available gateway connection was provided to send voice \xe2\x80\xa6CkA blocking thread panicked or failed to return a parsed \xe2\x80\xa6DfPeriodic events rely upon two parameters: a period and an \xe2\x80\xa6AkPlayback status of a track.BgThe attached track has become playable.BkThis track is fully initialised and usable.CfThere was an error when trying to access auxiliary \xe2\x80\xa6CiTelemetry/statistics packet, received from another streamBgSerenity-specific WebSocket send error.CnSerenity-specific wrapper for sharder state initialised by \xe2\x80\xa6BlHandle to one of serenity\xe2\x80\x99s shard runners.DaA shard-aware struct responsible for managing Calls.CjLogic used to determine how long to wait between retry \xe2\x80\xa6AmConnection attempt timed out.ClConnection details were not received from Discord in the \xe2\x80\xa6CkA voice connection was not established in the specified \xe2\x80\xa6CiTwilight-specific WebSocket send error when a message \xe2\x80\xa6CgTwilight-specific wrapper for a map of command senders.BlHandle to a map of twilight command senders.BoThe Websocket connection was closed by Discord.CmReturns the length in bytes, if available. This may be an \xe2\x80\xa6BoConfigures the channel layout for output audio.BlThe number of audio channels in this stream.BdCategorizes the cause of this error.DhSets this Config\xe2\x80\x99s channel for sending disposal messages.ClThe Sender for a channel that will run the destructor of \xe2\x80\xa6BeThe reported duration of this stream.CnURL of the voice websocket gateway server assigned to this \xe2\x80\xa6CiRequest playback information and state from the audio \xe2\x80\xa6C`ID of the target voice channel\xe2\x80\x99s parent guild.00CkReturns whether there are no tracks currently in the queue.CmReturns a mutable reference to the live input, if it been \xe2\x80\xa6CaSet an audio track to loop a set number of times.ChTries to get any information about this audio stream \xe2\x80\xa60CmSets this Config\xe2\x80\x99s audio mixing channel count.ClConfigures whether the driver will mix and output stereo \xe2\x80\xa6BgThe current position within this track.BhCurrent playback position in the source.CjInstalls a new songbird instance into the serenity client.CjCompatibility and convenience methods for working with \xe2\x80\xa6BlCreate a new Songbird instance for serenity.lproject logoChDecoded voice data and source packets sent by each user.CjHow Live mixer tasks will be mapped to individual threads.CmStrategy used to determine how long to wait between retry \xe2\x80\xa6AhThe chosen track\xe2\x80\x99s ID.BlCreate a new Songbird instance for twilight.CkDiscord\xe2\x80\x99s currently preferred non-E2EE encryption scheme.BcID of a Discord voice/text channel.CkVoice core events occur on receipt of voice packets and \xe2\x80\xa6BeDCA[0/1] Format reader for Symphonia.CjInternal representation of an event, as handled by the \xe2\x80\xa6BkCould not parse Discord\xe2\x80\x99s view of our IP.CnError returned when a manager or call handler is unable to \xe2\x80\xa6CkThis type represents all possible errors that can occur \xe2\x80\xa6AlAn initialised audio source.BkLooping behaviour for a Track.DeThis input has no lazy Compose initialiser, which is \xe2\x80\xa6ChThis input is ready, but has not had its headers parsed.CmErrors reported by the mixer while attempting to play (or \xe2\x80\xa6CaThe attached track is being readied or recreated.CnThe mixer is currently creating and parsing this track\xe2\x80\x99s \xe2\x80\xa6ClSymphonia support for a simple container for raw f32-PCM \xe2\x80\xa6CcThe voice driver failed to reconnect to the server.CnThe call was manually disconnected by a user command, e.g. \xe2\x80\xa6C`Opus audio packet, received from another stream.CmFires on receipt of a voice packet from another stream in \xe2\x80\xa6CmA reference to a shared group of threads used for running \xe2\x80\xa6CiVoice packet and audio data for a single user, from a \xe2\x80\xa6CiReordered and decoded audio packets, received every 20ms.CkFires every 20ms, containing the scheduled voice packet \xe2\x80\xa6CmAudio data from all users in a voice channel, fired every \xe2\x80\xa6CnA lazily instantiated call to download a file, finding its \xe2\x80\xa6AkAdd an event to this store.CiAttach an event handler to an audio track. These will \xe2\x80\xa6CeConstants affecting driver function and API handling.CfDefault Symphonia Probe, including DCA format support.AiGet access to a new shardCaReturns a new handle to the required inner shard.CkReturns true if this error was caused by input that was notDhInitialises (but does not parse) an Input::Lazy into an \xe2\x80\xa6DaCreates a new event store to be used within a Track.CiExclusively plays audio from a Track object.BkThe total time a track has been played for.BnTotal playback time, increasing monotonically.CbSets this Config\xe2\x80\x99s mixer scheduler.ClThe scheduler is responsible for mapping idle and active \xe2\x80\xa6BaThe thumbnail url of this stream.CfSets additional arguments for the \xe2\x80\x9cyt-dlp\xe2\x80\x9d processBiAny data to be associated with the track.DhA wrapper around an existing Input which compresses the \xe2\x80\xa6BgEncryption schemes supportd by Discord.ChDecode behaviour for received RTP packets within the \xe2\x80\xa6DjStorage for EventData, designed to be used for both local \xe2\x80\xa6oLazy HLS streamCdConvenience type for Discord gateway error handling.CbExpected amount of time that an input should last.DdAdapter around a raw, interleaved, f32 PCM byte stream.CnWhether this track has been made live, is being processed, \xe2\x80\xa6CjTelemetry/statistics packet, received from another stream.CjFires on receipt of an RTCP packet, containing various \xe2\x80\xa6BnThe sample rate of output audio when using \xe2\x80\xa6ClTrack events correspond to certain actions or changes of \xe2\x80\xa6CnA simple queue for several audio sources, designed to play \xe2\x80\xa6DiState of an Track object, designed to be passed to event \xe2\x80\xa6CjAdds an audio source to the queue, to be played in the \xe2\x80\xa6CeID of the voice channel being joined, if it is known.00DkUnwraps this AsyncReadOnlySource, returning the underlying \xe2\x80\xa6DjReturns true if the operation instantly failed due to the \xe2\x80\xa6DcReturns the total number of active calls scheduled and \xe2\x80\xa6ClAcquire a new handle to this object, creating a new view \xe2\x80\xa600CiCreates a request to search youtube for an optionally \xe2\x80\xa6CnReturns the number of bytes each nonce is stored as within \xe2\x80\xa6ClReturns a mutable reference to the data parsed from this \xe2\x80\xa60CmPlays audio from an input, returning a handle for further \xe2\x80\xa6C`Seeks along the track to the specified position.BmUnique string describing this session for \xe2\x80\xa600ClSets a shared configuration for all drivers created from \xe2\x80\xa6DiSets the configuration for this driver (and parent Call, \xe2\x80\xa6BbSets the volume of an audio track.AnThe source url of this stream.CmCreates a new, standalone Call which is not connected via \xe2\x80\xa6CgThe time at which the first true sample is played back.CgTries to recreate this stream in event of an error, \xe2\x80\xa60BhAn unread byte stream for an audio file.DkExtra information about an Input which is acquired without \xe2\x80\xa6CkVoice connection details gathered at setup/reinstantiation.BnAn indicator that an endpoint URL was invalid.BcA lazily instantiated HTTP request.CeFuture for a call to Call::join_gateway.CjOpus decoder for symphonia, based on libopus v1.3 (via \xe2\x80\xa6AoThe one (and only) RTP version.BkSample rate of audio to be sent to Discord.DhZero-size type used to retrieve the registered Songbird \xe2\x80\xa6DgHandle for safe control of a Track from other threads, \xe2\x80\xa6CcAlias for most calls to a TrackHandle.ChMap containing MessageSenders for Twilight.ChThe operation was not supported, and will never succeed.ChTrait for a generic shard handle to send voice state \xe2\x80\xa6DfSets this Config\xe2\x80\x99s chosen cryptographic tagging scheme.CbSelected tagging mode for voice packet encryption.DiSets this Config\xe2\x80\x99s received packet decryption/decoding \xe2\x80\xa6ClConfigures whether decoding and decryption occur for all \xe2\x80\xa6BhSet an audio track to loop indefinitely.ChCreates a new Call, configuring the driver as specified.CkReturns whether this stream\xe2\x80\x99s headers have been fully \xe2\x80\xa6CjReturns whether this audio stream is full initialised, \xe2\x80\xa6CeReturns if the source is seekable. This may be an \xe2\x80\xa6CnReturns the number of mixer tasks scheduled on this worker \xe2\x80\xa6BiThe maximum number of retries to attempt.BlConfigures the sample rate for output audio.AoThe sample rate of this stream.CmSets the bitrate for encoding Opus packets sent along the \xe2\x80\xa6BjGet the total number of shards in the map.CgReturns the total number of calls (idle and active) \xe2\x80\xa6DkWrap an existing Input with an in-memory store, compressed \xe2\x80\xa6D`Wrap an existing Input with an in-memory store, \xe2\x80\xa6DhWrap an existing Input with an in-memory store with the \xe2\x80\xa6CjErrors associated with control and manipulation of tracks.CaConfiguration for DecodeMode::DecodeDdA wrapper around an existing Input which caches the \xe2\x80\xa6CjThe scheduler exited or crashed while awating the request.CfInformation about which tracks or data fired an event.CmTrait to handle an event which can be fired per-track, or \xe2\x80\xa6BlLength (in milliseconds) of any audio frame.CfAllows at most n tasks to run per thread.CjOpus silent frame, used to signal speech start and end \xe2\x80\xa6ChHelper trait to add installation/creation methods to \xe2\x80\xa6AlTrack and voice core events.CmRequests auxiliary metadata which can be accessed without \xe2\x80\xa600CoTypes containing the main body of an EventContext.AoCreate a source asynchronously.BeSet an audio track to no longer loop.DgSets this Config\xe2\x80\x99s voice connection retry configuration.CcConnection retry logic for the Driver.DfJoin the selected voice channel, without running/starting \xe2\x80\xa6CmPartially connects to a target by retrieving its relevant \xe2\x80\xa6CkAllows modification of the inner queue (i.e., deletion, \xe2\x80\xa6CiConsumes this handle to await a reply from the driver \xe2\x80\xa6CeUpdates the internal voice state of the current user.CnSets this Config\xe2\x80\x99s number to enable/disable \xe2\x80\xa6ChConfigures whether or not each mixed audio packet is \xe2\x80\xa6BiExplicit bitrate choice (in bits/second).CkFires when this driver successfully connects to a voice \xe2\x80\xa60BlRuntime statistics for an individual worker.DkErrors encountered when trying to access in-stream Metadata\xe2\x80\xa6CiStrategies for mapping live mixer tasks to individual \xe2\x80\xa6CnStreamcatcher\xe2\x80\x99s configuration was illegal, and the cache \xe2\x80\xa60CdAsynchronous reply for an operation applied to a \xe2\x80\xa6DhThis track is still a lazy Compose object, and hasn\xe2\x80\x99t \xe2\x80\xa6BjReturns a list of currently queued tracks.AoPCM audio obtained from a user.DcAdds an audio Input to this driver\xe2\x80\x99s built-in queue.DhRetrieves a Call for the given guild, creating a new one ifCjReturns a lightweight reference to the audio scheduler \xe2\x80\xa6ClThe kind reported by the underlying standard library I/O \xe2\x80\xa6EhInitialises and parses an Input::Lazy into an Input::Live, \xe2\x80\xa6ClReadies the track to be playable, if this is not already \xe2\x80\xa6CfReady a track for playing if it is lazily initialised.DkCreate a new track directly from an Input, user data to be \xe2\x80\xa6DhCreate a new track directly from an Input with a custom \xe2\x80\xa6DjCreates a lazy request to select an audio stream from url \xe2\x80\xa6ChInstalls a given songbird instance into the serenity \xe2\x80\xa6CnReturns whether this mode will decrypt and decode received \xe2\x80\xa6CcConfiguration for the inner streamcatcher instance.CkRetreive the event class for an event (i.e., when matching)CkToString::to_string, but without panic on OOM.00000000000000AnUpdates the voice server data.CeHandle for a child process which ensures that any \xe2\x80\xa6ClParameters and information needed to start communicating \xe2\x80\xa6CkThe audio stream failed to be created due to a panic in \xe2\x80\xa60CgVoice connection details gathered at termination or \xe2\x80\xa6CdThe location that a voice connection was terminated.CiTrait for a generic shard cluster or other handle source.DbTransform applied inside Compressed, converting a \xe2\x80\xa6ClErrors encountered when communicating with the internals \xe2\x80\xa6CkSets this Config\xe2\x80\x99s symphonia codec registry.CiRegistry of the inner codecs supported by the driver, \xe2\x80\xa6CaRegistry of audio codecs supported by the driver.ClContent length, used as an upper bound in range requests \xe2\x80\xa6CdProvides the default config used by a cached source.DfSets this Config\xe2\x80\x99s timeout for establishing a voice \xe2\x80\xa6ChConfigures the maximum amount of time to wait for an \xe2\x80\xa6CmByte index into the packet body (after headers) for where \xe2\x80\xa60ChReturns whether this mode will decrypt received packets.CiReturns the number of bytes occupied by an encryption \xe2\x80\xa6CgReturns the name of a mode as it will appear during \xe2\x80\xa6CjReturns the total number of threads spawned to process \xe2\x80\xa6EcErrors encountered using a Compressed or Decompressed \xe2\x80\xa6CjErrors encountered while connecting to a Discord voice \xe2\x80\xa6AjDefault bitrate for audio.CjFires when this driver successfully reconnects after a \xe2\x80\xa60ChNumber of samples in one complete frame of audio per \xe2\x80\xa6BkSample rate of audio to be sent to Discord.CmConfiguration for how a Scheduler handles tasks.CnSerenity-specific wrapper for sharder state initialised by \xe2\x80\xa6BlLength of time between any two audio frames.DiReturns id of the channel, if connected or connecting to \xe2\x80\xa6DfSets this Config\xe2\x80\x99s symphonia format registry/probe set.CmRegistry of the muxers and container formats supported by \xe2\x80\xa60DfSets this Config\xe2\x80\x99s timeout for joining a voice channel.CnConfigures the amount of time to wait for Discord to reply \xe2\x80\xa6DhInitialises (but does not parse) an Input::Lazy into an \xe2\x80\xa6CdNumber of bytes at the end of the packet to discard.0CmPlays audio from an input, returning a handle for further \xe2\x80\xa6CeNumber of audio frames/packets to be sent per second.ChAn async port of symphonia\xe2\x80\x99s MediaSource.CkThe driver hung up an internal signaller, either due to \xe2\x80\xa6CjThis (re)connection attempt was dropped due to another \xe2\x80\xa6DcErrors encountered when creating an AudioStream or \xe2\x80\xa6ChErrors encountered when trying to access out-of-band \xe2\x80\xa6CiMaximum number of audio frames/packets to be sent per \xe2\x80\xa6BdFired whenever a client disconnects.CmFires whenever a user disconnects from the same stream as \xe2\x80\xa6CnConvenience type for Discord voice/driver connection error \xe2\x80\xa6BjThe reason that a voice connection failed.CnFires when this driver fails to connect to, or drops from, \xe2\x80\xa60CeThe file\xe2\x80\x99s metadata could not be converted to JSON.ClThe input\xe2\x80\x99s metadata was too large after conversion to \xe2\x80\xa6CdProfile type used by Discord\xe2\x80\x99s Opus audio traffic.DjThe input stream had already been read (i.e., Parsed) and \xe2\x80\xa60BgMaximum packet size for a voice packet.CmAttach a global event handler to an audio context. Global \xe2\x80\xa6DjAdd an existing Track to the queue, using a known time to \xe2\x80\xa6AkCreate a lazy HTTP request.0CkCalculates the number of additional bytes required comparedClCalculates the cost, in B/s, of raw floating-point audio \xe2\x80\xa6CiServer did not return the expected crypto mode during \xe2\x80\xa6CnThe supplied event listener can never be fired by a track, \xe2\x80\xa6DkErrors encountered when readying or pre-processing an Input\xe2\x80\xa6CjSongbird and Discord disagreed on the protocol used to \xe2\x80\xa6CiNumber of individual samples in one complete frame of \xe2\x80\xa6CkType-converted delay between sends of UDP keepalive frames.BfA fallback non-E2EE encryption scheme.CnModify the given cache configuration to initially allocate \xe2\x80\xa6CgGenerate a storage configuration given an estimated \xe2\x80\xa6CcExtract metadata and details from the output of \xe2\x80\xa6ChRegisters a new Songbird voice system with serenity, \xe2\x80\xa6ChWhether the contained format supports arbitrary seeking.CjAn adapter for converting an async media source into a \xe2\x80\xa6BeExponential backoff waiting strategy.C`Computes the next firing time for a timer event.CkReturns the current voice connection details for this Call,CoDefault Symphonia CodecRegistry, including the \xe2\x80\xa6CjReturns the number of bytes occupied by the encryption \xe2\x80\xa6CfSend a voice update message to the inner shard handle.DbAsyncReadOnlySource wraps any source implementing \xe2\x80\xa6CiThe symmetric key supplied by Discord had the wrong size.CmFailed to message other background tasks after connection \xe2\x80\xa6CkHandle to an individual shard designed to buffer unsent \xe2\x80\xa6CkSpeaking state update, typically describing how another \xe2\x80\xa6ChSpeaking state update from the WS gateway, typically \xe2\x80\xa6CkThe audio stream\xe2\x80\x99s channel count could not be determined.EhInitialises and parses an Input::Lazy into an Input::Live, \xe2\x80\xa6CfReady a track for playing if it is lazily initialised.DbSets this Config\xe2\x80\x99s number of tracks to preallocate.CkNumber of concurrently active tracks to allocate memory \xe2\x80\xa6CmDetermines whether this source will be instantiated using \xe2\x80\xa6CiIndicates whether this failure may have left (or been \xe2\x80\xa6CnRequest a list of handles to statistics for currently live \xe2\x80\xa6DiNumber of bytes in one complete frame of raw f32-encoded \xe2\x80\xa6BlDelay between sends of UDP keepalive frames.ChReturns the nonce length in bytes required by algorithm.DhSets this Config\xe2\x80\x99s received packet decoder cleanup timer.CfConfigures the amount of time after a user/SSRC is \xe2\x80\xa6DjAdd an existing Track to the queue, using a known time to \xe2\x80\xa6CmReturns the number of nanoseconds required to process all \xe2\x80\xa6ChMove costly mixers to another thread if their parent \xe2\x80\xa6CiCreates a request to search youtube for an optionally \xe2\x80\xa6DgSets this Config\xe2\x80\x99s additional pre-allocated space to \xe2\x80\xa6CmConfigures the initial amount of extra space allocated to \xe2\x80\xa6ChInstalls a given songbird instance into the serenity \xe2\x80\xa6CjCreate a new Songbird instance for serenity, using the \xe2\x80\xa6BlCreate a new Songbird instance for twilight.BoSelected crypto mode was not offered by server.BnThe voice gateway version used by the library.BfThe default shared scheduler instance.DdSets this Config\xe2\x80\x99s playout buffer length, in packets.CmConfigures the number of audio packets to buffer for each \xe2\x80\xa6DiNumber of bytes in one complete frame of raw f32-encoded \xe2\x80\xa6CfSet the bot\xe2\x80\x99s user, and the number of shards in use.DkCreate a new track directly from an Input, user data to be \xe2\x80\xa6CmRegisters a given Songbird voice system with serenity, as \xe2\x80\xa6CnCreates a new standalone Call from the given configuration \xe2\x80\xa6DiCalculates the time position in a FloatPCM stream from a \xe2\x80\xa6CkEstimates the cost, in B/s, of audio data compressed at \xe2\x80\xa6CiIndicates whether this failure can be reattempted via \xe2\x80\xa6DiCalculates the byte position in a FloatPCM stream from a \xe2\x80\xa6CdDiscord failed to correctly respond to IP discovery.ChRemoves all global event handlers from an audio context.5DkCalculates the sample position in a FloatPCM stream from a \xe2\x80\xa6CnRequest a list of handles to statistics for currently live \xe2\x80\xa6ClRegisters a Songbird voice system serenity, based on the \xe2\x80\xa6") \ No newline at end of file diff --git a/next/search.index/entry/afe1a566fad7.js b/next/search.index/entry/afe1a566fad7.js new file mode 100644 index 0000000..f11b157 --- /dev/null +++ b/next/search.index/entry/afe1a566fad7.js @@ -0,0 +1 @@ +rd_("Af[1470,15,937,0,2539,0]Aj[1470,15,2323,1998,2628,0]Af[1470,15,937,0,2626,0]Ah[1470,15,937,937,1824,0]Ai[1470,15,1188,940,2157,0]4Ai[1470,13,1471,593,2500,0]Ag[1470,13,1152,0,1197,0]Aj[1470,13,1152,1147,1815,0]Aj[1470,13,1152,2168,1817,0]Aj[1470,13,1152,2168,2298,0]Aj[1470,13,1152,2168,1391,0]Aj[1470,13,1152,2168,1836,0]Aj[1470,13,1152,1462,1226,0]Ai[1470,13,967,1473,1421,0]Ai[1470,13,967,1473,2663,0]Ag[1470,13,967,967,870,0]Ai[1470,13,1154,419,1732,0]Ai[1470,13,1154,415,1726,0]Ai[1470,13,1154,978,1839,0]Aj[1470,13,1154,1388,2316,0]Ai[1470,13,1154,1154,855,0]Aj[1470,13,2323,1241,2140,0]Aj[1470,13,2323,1998,2507,0]Aj[1470,13,2323,1998,2628,0]Ai[1470,13,2323,716,1411,0]Ai[1470,13,2323,372,1231,0]Ai[1470,13,2323,984,1767,0]Ai[1470,13,2323,984,1765,0]Af[1470,13,43,43,1724,0]Af[1470,13,43,43,1218,0]Af[1470,13,43,43,1034,0]Ai[1470,13,942,1457,2138,0]Aj[1470,13,1188,1282,1744,0]Ai[1470,13,1188,698,1406,0]Ai[1470,13,1188,963,1831,0]Ai[1470,13,1188,972,1844,0]Ac[1470,2,1471,0,0,0]Ai[1470,13,1471,1283,388,0]Ai[1470,13,1471,1140,989,0]Ai[1470,13,1471,1275,379,0]Ai[1470,13,1471,593,2500,0]Aj[1470,13,1471,1283,1419,0]Ag[1470,13,1152,0,1197,0]Aj[1470,13,1152,1152,1202,0]Aj[1470,13,1152,1147,1815,0]Aj[1470,13,1152,2168,1817,0]Aj[1470,13,1152,2168,2298,0]Aj[1470,13,1152,2168,1391,0]Aj[1470,13,1152,2168,1836,0]Aj[1470,13,1152,1462,1226,0]Ag[1470,13,1152,0,2546,0]Ag[1470,13,1152,0,2356,0]Ai[1470,13,1152,974,2351,0]Aj[1470,13,1152,1791,1761,0]Ag[1470,13,1152,0,2517,0]Aj[1470,13,1152,1443,2509,0]Aj[1470,13,1152,1152,1001,0]Ai[1470,13,967,1473,1421,0]Ai[1470,13,967,1473,2663,0]Ag[1470,13,967,967,870,0]Aj[1470,13,1468,1468,2153,0]Af[1470,13,937,0,1740,0]Af[1470,13,937,0,2539,0]Ah[1470,13,937,937,1737,0]Ai[1470,13,1154,419,1732,0]Aj[1470,13,1154,1243,2303,0]Ai[1470,13,1154,415,1726,0]Ai[1470,13,1154,975,1820,0]Ai[1470,13,1154,978,1839,0]Aj[1470,13,1154,1388,2316,0]Ai[1470,13,1154,1154,855,0]Aj[1470,13,2323,1241,2140,0]Aj[1470,13,2323,1998,2505,0]Aj[1470,13,2323,1998,2507,0]Aj[1470,13,2323,1998,2628,0]Ai[1470,13,2323,716,1411,0]Ai[1470,13,2323,372,1231,0]Ai[1470,13,2323,984,1767,0]Ai[1470,13,2323,984,1765,0]Af[1470,13,43,43,1724,0]Af[1470,13,43,43,1218,0]Af[1470,13,43,43,1034,0]Ai[1470,13,942,2363,2661,0]Ai[1470,13,942,2283,1829,0]Ai[1470,13,942,2165,2136,0]Ai[1470,13,942,2112,1742,0]Ai[1470,13,942,1457,1399,0]Ai[1470,13,942,1168,1017,0]Ag[1470,13,942,942,861,0]Ah[1470,13,942,883,2498,0]Ah[1470,13,942,938,2618,0]Ah[1470,13,942,938,2648,0]Ah[1470,13,942,938,2354,0]Ah[1470,13,942,938,2620,0]Ai[1470,13,942,1457,2138,0]Ag[1470,13,942,424,384,0]Ah[1470,13,942,342,1822,0]Ah[1470,13,942,592,2144,0]Ah[1470,13,942,839,1771,0]Ai[1470,13,942,1290,2673,0]Ai[1470,13,1137,252,1729,0]Ai[1470,13,1137,702,2149,0]Ai[1470,13,1137,368,1753,0]Ai[1470,13,1133,1997,990,0]Aj[1470,13,1133,1997,1813,0]Aj[1470,13,1133,1997,2514,0]Aj[1470,13,1133,2330,2300,0]Ah[1470,13,1133,939,849,0]Ai[1470,13,1133,939,2535,0]Ai[1470,13,1133,590,1826,0]Aj[1470,13,1133,1163,1011,0]Ag[1470,13,689,689,390,0]Ah[1470,13,689,689,2146,0]Aj[1470,13,1177,1177,2160,0]Aj[1470,13,1177,1177,1235,0]Aj[1470,13,1177,1177,2548,0]Ai[1470,13,1177,1177,872,0]Aj[1470,13,1177,1177,2677,0]Aj[1470,13,1188,1159,2360,0]Ah[1470,13,1188,744,412,0]Ai[1470,13,1188,1188,874,0]Ai[1470,13,1188,1036,985,0]Ai[1470,13,1188,940,2295,0]Ai[1470,13,1188,940,1748,0]Aj[1470,13,1188,1159,2155,0]Aj[1470,13,1188,1282,1744,0]Ai[1470,13,1188,698,1406,0]Ai[1470,13,1188,961,1842,0]Ai[1470,13,1188,961,1021,0]Ai[1470,13,1188,963,1831,0]Ai[1470,13,1188,972,1844,0]Ai[1470,15,1154,978,1839,0]Ai[1470,15,1188,698,1406,0]Af[1470,15,937,0,2626,0]Ah[1470,15,937,937,1824,0]Ai[1470,15,1188,940,2157,0]Ag[1470,15,1152,0,1197,0]Ai[1470,15,942,2112,1742,0]Aj[1470,12,1154,1154,2306,0];Ai[1470,13,1471,1283,388,0]Ai[1470,13,1471,1140,989,0]Ai[1470,13,1471,1275,379,0]Ai[1470,13,1471,593,2500,0]Aj[1470,13,1471,1283,1419,0]Ag[1470,13,1152,0,1197,0]Aj[1470,13,1152,1152,1202,0]Aj[1470,13,1152,1147,1815,0]Aj[1470,13,1152,2168,1817,0]Aj[1470,13,1152,2168,2298,0]Aj[1470,13,1152,2168,1391,0]Aj[1470,13,1152,2168,1836,0]Aj[1470,13,1152,1462,1226,0]Ag[1470,13,1152,0,2546,0]Ag[1470,13,1152,0,2356,0]Ai[1470,13,1152,974,2351,0]Aj[1470,13,1152,1791,1761,0]Ag[1470,13,1152,0,2517,0]Aj[1470,13,1152,1443,2509,0]Aj[1470,13,1152,1152,1001,0]Ai[1470,13,967,1473,1421,0]Ai[1470,13,967,1473,2663,0]Ag[1470,13,967,967,870,0]Aj[1470,13,1468,1468,2153,0]Af[1470,13,937,0,1740,0]Af[1470,13,937,0,2539,0]Ah[1470,13,937,937,1737,0]Ai[1470,13,1154,419,1732,0]Aj[1470,13,1154,1243,2303,0]Ai[1470,13,1154,415,1726,0]Ai[1470,13,1154,975,1820,0]Ai[1470,13,1154,978,1839,0]Aj[1470,13,1154,1388,2316,0]Ai[1470,13,1154,1154,855,0]Aj[1470,13,2323,1241,2140,0]Aj[1470,13,2323,1998,2505,0]Aj[1470,13,2323,1998,2507,0]Aj[1470,13,2323,1998,2628,0]Ai[1470,13,2323,716,1411,0]Ai[1470,13,2323,372,1231,0]Ai[1470,13,2323,984,1767,0]Ai[1470,13,2323,984,1765,0]Af[1470,13,43,43,1724,0]Af[1470,13,43,43,1218,0]Af[1470,13,43,43,1034,0]Ai[1470,13,942,2363,2661,0]Ai[1470,13,942,2283,1829,0]Ai[1470,13,942,2165,2136,0]Ai[1470,13,942,2112,1742,0]Ai[1470,13,942,1457,1399,0]Ai[1470,13,942,1168,1017,0]Ag[1470,13,942,942,861,0]Ah[1470,13,942,883,2498,0]Ah[1470,13,942,938,2618,0]Ah[1470,13,942,938,2648,0]Ah[1470,13,942,938,2354,0]Ah[1470,13,942,938,2620,0]Ai[1470,13,942,1457,2138,0]Ag[1470,13,942,424,384,0]Ah[1470,13,942,342,1822,0]Ah[1470,13,942,592,2144,0]Ah[1470,13,942,839,1771,0]Ai[1470,13,942,1290,2673,0]Ai[1470,13,1137,252,1729,0]Ai[1470,13,1137,702,2149,0]Ai[1470,13,1137,368,1753,0]Ai[1470,13,1133,1997,990,0]Aj[1470,13,1133,1997,1813,0]Aj[1470,13,1133,1997,2514,0]Aj[1470,13,1133,2330,2300,0]Ah[1470,13,1133,939,849,0]Ai[1470,13,1133,939,2535,0]Ai[1470,13,1133,590,1826,0]Aj[1470,13,1133,1163,1011,0]Ag[1470,13,689,689,390,0]Ah[1470,13,689,689,2146,0]Aj[1470,13,1177,1177,2160,0]Aj[1470,13,1177,1177,1235,0]Aj[1470,13,1177,1177,2548,0]Ai[1470,13,1177,1177,872,0]Aj[1470,13,1177,1177,2677,0]Aj[1470,13,1188,1159,2360,0]Ah[1470,13,1188,744,412,0]Ai[1470,13,1188,1188,874,0]Ai[1470,13,1188,1036,985,0]Ai[1470,13,1188,940,2295,0]Ai[1470,13,1188,940,1748,0]Aj[1470,13,1188,1159,2155,0]Aj[1470,13,1188,1282,1744,0]Ai[1470,13,1188,698,1406,0]Ai[1470,13,1188,961,1842,0]Ai[1470,13,1188,961,1021,0]Ai[1470,13,1188,963,1831,0]Ai[1470,13,1188,972,1844,0]Ai[1470,13,1154,419,1732,0]Ai[1470,13,1471,1140,989,0]Ai[1470,13,1471,1275,379,0]Ai[1470,13,1471,593,2500,0]Aj[1470,13,1471,1283,1419,0]Ag[1470,13,1152,0,1197,0]Aj[1470,13,1152,1147,1815,0]Aj[1470,13,1152,2168,1817,0]Aj[1470,13,1152,2168,2298,0]Aj[1470,13,1152,2168,1391,0]Aj[1470,13,1152,2168,1836,0]Aj[1470,13,1152,1462,1226,0]Ag[1470,13,1152,0,2546,0]Ag[1470,13,1152,0,2356,0]Ai[1470,13,1152,974,2351,0]Aj[1470,13,1152,1791,1761,0]C`[1470,13,1152,0,2517,0,\"impl-Display-for-Error\"]Bn[1470,13,1152,0,2517,0,\"impl-Debug-for-Error\"]Aj[1470,13,1152,1443,2509,0]Aj[1470,13,1152,1152,1001,0]Ai[1470,13,967,1473,1421,0]Ai[1470,13,967,1473,2663,0]Ag[1470,13,967,967,870,0]Bo[1470,13,937,0,1740,0,\"impl-Display-for-Error\"]Bm[1470,13,937,0,1740,0,\"impl-Debug-for-Error\"]Bo[1470,13,937,0,2539,0,\"impl-Display-for-Error\"]Bm[1470,13,937,0,2539,0,\"impl-Debug-for-Error\"]Ce[1470,13,937,937,1737,0,\"impl-Display-for-JoinError\"]Cc[1470,13,937,937,1737,0,\"impl-Debug-for-JoinError\"]Ai[1470,13,1154,419,1732,0]Aj[1470,13,1154,1243,2303,0]Ai[1470,13,1154,415,1726,0]Ai[1470,13,1154,975,1820,0]Ai[1470,13,1154,978,1839,0]Aj[1470,13,1154,1388,2316,0]Ai[1470,13,1154,1154,855,0]Aj[1470,13,2323,1241,2140,0]Aj[1470,13,2323,1998,2505,0]Aj[1470,13,2323,1998,2507,0]Aj[1470,13,2323,1998,2628,0]Ai[1470,13,2323,716,1411,0]Ai[1470,13,2323,372,1231,0]Ai[1470,13,2323,984,1767,0]Ai[1470,13,2323,984,1765,0]Cc[1470,13,43,43,1724,0,\"impl-Display-for-ChannelId\"]Ca[1470,13,43,43,1724,0,\"impl-Debug-for-ChannelId\"]Ca[1470,13,43,43,1218,0,\"impl-Display-for-GuildId\"]Bo[1470,13,43,43,1218,0,\"impl-Debug-for-GuildId\"]C`[1470,13,43,43,1034,0,\"impl-Display-for-UserId\"]Bn[1470,13,43,43,1034,0,\"impl-Debug-for-UserId\"]Ah[1470,13,942,883,2498,0]Cj[1470,13,942,938,2618,0,\"impl-Debug-for-AudioStreamError\"]Cl[1470,13,942,938,2618,0,\"impl-Display-for-AudioStreamError\"]Cm[1470,13,942,938,2648,0,\"impl-Display-for-MakePlayableError\"]Ck[1470,13,942,938,2648,0,\"impl-Debug-for-MakePlayableError\"]Ci[1470,13,942,938,2354,0,\"impl-Display-for-MetadataError\"]Cg[1470,13,942,938,2354,0,\"impl-Debug-for-MetadataError\"]Cj[1470,13,942,938,2620,0,\"impl-Debug-for-AuxMetadataError\"]Cl[1470,13,942,938,2620,0,\"impl-Display-for-AuxMetadataError\"]Ai[1470,13,942,1457,2138,0]Ag[1470,13,942,424,384,0]Ah[1470,13,942,342,1822,0]Ah[1470,13,942,592,2144,0]Ah[1470,13,942,839,1771,0]Aj[1470,13,1133,1997,2514,0]Bo[1470,13,1133,939,849,0,\"impl-Debug-for-Error\"]Ca[1470,13,1133,939,849,0,\"impl-Display-for-Error\"]Cl[1470,13,1133,939,2535,0,\"impl-Display-for-CodecCacheError\"]Cj[1470,13,1133,939,2535,0,\"impl-Debug-for-CodecCacheError\"]Ai[1470,13,1133,590,1826,0]Aj[1470,13,1177,1177,2160,0]Aj[1470,13,1177,1177,1235,0]Aj[1470,13,1177,1177,2548,0]Ai[1470,13,1177,1177,872,0]Aj[1470,13,1177,1177,2677,0]Cg[1470,13,1188,940,2295,0,\"impl-Debug-for-ControlError\"]Ci[1470,13,1188,940,2295,0,\"impl-Display-for-ControlError\"]Cd[1470,13,1188,940,1748,0,\"impl-Debug-for-PlayError\"]Cf[1470,13,1188,940,1748,0,\"impl-Display-for-PlayError\"]Aj[1470,13,1188,1159,2155,0]Aj[1470,13,1188,1282,1744,0]Ai[1470,13,1188,698,1406,0]Ai[1470,13,1188,961,1842,0]Ai[1470,13,1188,961,1021,0]Ai[1470,13,1188,963,1831,0]Ai[1470,13,1188,972,1844,0]Aj[1470,13,1471,1283,1419,0]Ac[1470,7,1468,0,0,0]Aj[1470,13,1177,1177,2160,0]6Ai[1470,14,967,1473,2663,0]0Ai[1470,13,1471,1275,379,0]Aj[1470,13,1152,2168,2298,0]Aj[1470,13,1152,1791,1761,0]Aj[1470,13,1152,1152,1001,0]Ai[1470,13,1154,419,1732,0]Ai[1470,13,1154,975,1820,0]Ai[1470,13,942,2363,2661,0]Ai[1470,13,942,2283,1829,0]Ah[1470,13,942,883,2498,0]Ag[1470,13,942,424,384,0]Ah[1470,13,942,342,1822,0]Ah[1470,13,942,592,2144,0]Ah[1470,13,942,839,1771,0]Ai[1470,13,942,1290,2673,0]Aj[1470,13,1133,1997,1813,0]Aj[1470,13,1133,2330,2300,0]Aj[1470,13,1133,1163,1011,0]Aj[1470,13,1177,1177,2160,0]Ai[1470,13,1188,1188,874,0]Ai[1470,13,1188,961,1842,0]Aj[1470,14,1133,1997,1813,0]Aj[1470,14,1133,2330,2300,0]Aj[1470,14,1133,1163,1011,0]Ai[1470,13,2323,372,1231,0]Aj[1470,13,1152,1443,2509,0]Ag[1470,15,1152,0,1197,0]Af[1470,5,1471,1275,0,0]Aj[1470,15,1154,1388,2316,0]Ai[1470,15,1154,1154,855,0]Ah[1470,15,942,938,2618,0]Ad[1470,5,942,424,0,0]Af[1470,5,1471,1283,0,0]Ab[1470,5,689,0,0,0]Af[1470,15,937,0,2539,0]Ag[1470,15,942,942,861,0]0Ai[1470,15,1154,978,1839,0]Aj[1470,15,1152,2168,1391,0]Aj[1470,15,1152,1462,1226,0]Ai[1470,15,1133,939,2535,0]Aj[1470,15,1152,2168,1817,0]4Ai[1470,15,1188,940,2295,0]Ai[1470,15,1188,698,1406,0]Ai[1470,15,1188,940,1748,0]1Ai[1470,15,1133,590,1826,0]Ae[1470,5,1188,744,0,0]Ab[1470,4,942,0,0,0]Ai[1470,13,1137,252,1729,0]Ai[1470,13,1137,368,1753,0]Aj[1470,13,1188,1159,2155,0]Ai[1470,14,942,1457,2138,0]Aj[1470,13,1152,1152,1001,0]Ah[1470,13,942,883,2498,0]Ai[1470,13,1471,1283,388,0]0Ai[1470,13,1471,1140,989,0]Ai[1470,13,1471,1275,379,0]Ai[1470,13,1471,593,2500,0]Aj[1470,13,1471,1283,1419,0]Ag[1470,13,1152,0,1197,0]Aj[1470,13,1152,1152,1202,0]Aj[1470,13,1152,1147,1815,0]Aj[1470,13,1152,2168,1817,0]Aj[1470,13,1152,2168,2298,0]Aj[1470,13,1152,2168,1391,0]Aj[1470,13,1152,2168,1836,0]Aj[1470,13,1152,1462,1226,0]Ag[1470,13,1152,0,2546,0]Ag[1470,13,1152,0,2356,0]Ai[1470,13,1152,974,2351,0]Aj[1470,13,1152,1791,1761,0]Ag[1470,13,1152,0,2517,0]0Aj[1470,13,1152,1443,2509,0]Aj[1470,13,1152,1152,1001,0]Ai[1470,13,967,1473,1421,0]Ai[1470,13,967,1473,2663,0]Ag[1470,13,967,967,870,0]Aj[1470,13,1468,1468,2153,0]Af[1470,13,937,0,1740,0]Af[1470,13,937,0,2539,0]Ci[1470,13,937,0,2539,0,\"impl-From%3CElapsed%3E-for-Error\"]Dm[1470,13,937,0,2539,0,\"impl-From%3CSendError%3CMixerMessage%3E%3E-for-Error\"]Dm[1470,13,937,0,2539,0,\"impl-From%3CSendError%3CEventMessage%3E%3E-for-Error\"]Dj[1470,13,937,0,2539,0,\"impl-From%3CSendError%3CWsMessage%3E%3E-for-Error\"]Cg[1470,13,937,0,2539,0,\"impl-From%3CError%3E-for-Error\"]00Dd[1470,13,937,937,1737,0,\"impl-From%3CChannelError%3E-for-JoinError\"]Fe[1470,13,937,937,1737,0,\"impl-From%3CBox%3CTrySendError%3CShardRunnerMessage%3E%3E%3E-for-JoinError\"]Cm[1470,13,937,937,1737,0,\"impl-From%3CError%3E-for-JoinError\"]Ah[1470,13,937,937,1737,0]Ai[1470,13,1154,419,1732,0]Aj[1470,13,1154,1243,2303,0]Ai[1470,13,1154,415,1726,0]Ai[1470,13,1154,975,1820,0]Ai[1470,13,1154,978,1839,0]Dg[1470,13,1154,1388,2316,0,\"impl-From%3CTrackEvent%3E-for-UntimedEvent\"]Df[1470,13,1154,1388,2316,0,\"impl-From%3CCoreEvent%3E-for-UntimedEvent\"]Aj[1470,13,1154,1388,2316,0]Co[1470,13,1154,1154,855,0,\"impl-From%3CTrackEvent%3E-for-Event\"]Cn[1470,13,1154,1154,855,0,\"impl-From%3CCoreEvent%3E-for-Event\"]Ai[1470,13,1154,1154,855,0]Aj[1470,13,2323,1241,2140,0]Aj[1470,13,2323,1998,2505,0]Aj[1470,13,2323,1998,2507,0]Aj[1470,13,2323,1998,2628,0]0Ai[1470,13,2323,716,1411,0]Ai[1470,13,2323,372,1231,0]Ai[1470,13,2323,984,1767,0]Ai[1470,13,2323,984,1765,0]Af[1470,13,43,43,1724,0]Dk[1470,13,43,43,1724,0,\"impl-From%3CId%3CChannelMarker%3E%3E-for-ChannelId\"]Co[1470,13,43,43,1724,0,\"impl-From%3CChannelId%3E-for-ChannelId\"]Df[1470,13,43,43,1724,0,\"impl-From%3CNonZero%3Cu64%3E%3E-for-ChannelId\"]Dd[1470,13,43,43,1218,0,\"impl-From%3CNonZero%3Cu64%3E%3E-for-GuildId\"]Ck[1470,13,43,43,1218,0,\"impl-From%3CGuildId%3E-for-GuildId\"]Af[1470,13,43,43,1218,0]Dg[1470,13,43,43,1218,0,\"impl-From%3CId%3CGuildMarker%3E%3E-for-GuildId\"]De[1470,13,43,43,1034,0,\"impl-From%3CId%3CUserMarker%3E%3E-for-UserId\"]Ci[1470,13,43,43,1034,0,\"impl-From%3CUserId%3E-for-UserId\"]Dc[1470,13,43,43,1034,0,\"impl-From%3CNonZero%3Cu64%3E%3E-for-UserId\"]Af[1470,13,43,43,1034,0]Ai[1470,13,942,2363,2661,0]Ai[1470,13,942,2283,1829,0]Ai[1470,13,942,2165,2136,0]Ai[1470,13,942,2112,1742,0]Ai[1470,13,942,1457,1399,0]0Ai[1470,13,942,1168,1017,0]Da[1470,13,942,942,861,0,\"impl-From%3CChildContainer%3E-for-Input\"]Co[1470,13,942,942,861,0,\"impl-From%3CDecompressed%3E-for-Input\"]Cd[1470,13,942,942,861,0,\"impl-From%3CT%3E-for-Input\"]Cm[1470,13,942,942,861,0,\"impl-From%3CCompressed%3E-for-Input\"]Ag[1470,13,942,942,861,0]Cn[1470,13,942,942,861,0,\"impl-From%3CHttpRequest%3E-for-Input\"]Cn[1470,13,942,942,861,0,\"impl-From%3CFile%3CP%3E%3E-for-Input\"]Dd[1470,13,942,942,861,0,\"impl-From%3CRawAdapter%3CA%3E%3E-for-Input\"]Cm[1470,13,942,942,861,0,\"impl-From%3CHlsRequest%3E-for-Input\"]Di[1470,13,942,942,861,0,\"impl-From%3CYoutubeDl%3C\'static%3E%3E-for-Input\"]Ci[1470,13,942,942,861,0,\"impl-From%3CMemory%3E-for-Input\"]Db[1470,13,942,883,2498,0,\"impl-From%3CChild%3E-for-ChildContainer\"]Ah[1470,13,942,883,2498,0]Dk[1470,13,942,883,2498,0,\"impl-From%3CVec%3CChild%3E%3E-for-ChildContainer\"]Ah[1470,13,942,938,2618,0]E`[1470,13,942,938,2648,0,\"impl-From%3CAudioStreamError%3E-for-MakePlayableError\"]Ah[1470,13,942,938,2648,0]De[1470,13,942,938,2648,0,\"impl-From%3CError%3E-for-MakePlayableError\"]Ah[1470,13,942,938,2354,0]Ah[1470,13,942,938,2620,0]0Ai[1470,13,942,1457,2138,0]Ag[1470,13,942,424,384,0]Ah[1470,13,942,342,1822,0]Ah[1470,13,942,592,2144,0]Ah[1470,13,942,839,1771,0]Ai[1470,13,942,1290,2673,0]Ai[1470,13,1137,252,1729,0]Ai[1470,13,1137,702,2149,0]Ai[1470,13,1137,368,1753,0]Ai[1470,13,1133,1997,990,0]Aj[1470,13,1133,1997,1813,0]Aj[1470,13,1133,1997,2514,0]Aj[1470,13,1133,2330,2300,0]Cm[1470,13,1133,939,849,0,\"impl-From%3CJoinError%3E-for-Error\"]Ah[1470,13,1133,939,849,0]Dd[1470,13,1133,939,849,0,\"impl-From%3CAudioStreamError%3E-for-Error\"]D`[1470,13,1133,939,849,0,\"impl-From%3CCatcherError%3E-for-Error\"]Dk[1470,13,1133,939,2535,0,\"impl-From%3CCatcherError%3E-for-CodecCacheError\"]Dh[1470,13,1133,939,2535,0,\"impl-From%3CJoinError%3E-for-CodecCacheError\"]Dd[1470,13,1133,939,2535,0,\"impl-From%3CError%3E-for-CodecCacheError\"]0Ai[1470,13,1133,939,2535,0]1Do[1470,13,1133,939,2535,0,\"impl-From%3CAudioStreamError%3E-for-CodecCacheError\"]Co[1470,13,1133,590,1826,0,\"impl-From%3Cusize%3E-for-LengthHint\"]Ai[1470,13,1133,590,1826,0]Db[1470,13,1133,590,1826,0,\"impl-From%3CDuration%3E-for-LengthHint\"]Aj[1470,13,1133,1163,1011,0]Ag[1470,13,689,689,390,0]Ah[1470,13,689,689,2146,0]Aj[1470,13,1177,1177,2160,0]Aj[1470,13,1177,1177,1235,0]Aj[1470,13,1177,1177,2548,0]Ai[1470,13,1177,1177,872,0]Aj[1470,13,1177,1177,2677,0]Aj[1470,13,1188,1159,2360,0]Ah[1470,13,1188,744,412,0]Ai[1470,13,1188,1188,874,0]0Ai[1470,13,1188,1036,985,0]Ai[1470,13,1188,940,2295,0]0Ai[1470,13,1188,940,1748,0]Aj[1470,13,1188,1159,2155,0]Aj[1470,13,1188,1282,1744,0]Ai[1470,13,1188,698,1406,0]Ai[1470,13,1188,961,1842,0]Ai[1470,13,1188,961,1021,0]Ai[1470,13,1188,963,1831,0]Ai[1470,13,1188,972,1844,0]Ai[1470,13,1471,593,2500,0]Ag[1470,13,1152,0,1197,0]Aj[1470,13,1152,1147,1815,0]Aj[1470,13,1152,2168,1817,0]Aj[1470,13,1152,2168,2298,0]Aj[1470,13,1152,2168,1391,0]Aj[1470,13,1152,2168,1836,0]Ai[1470,13,1154,415,1726,0]Ai[1470,13,1154,978,1839,0]Aj[1470,13,1154,1388,2316,0]Ai[1470,13,1154,1154,855,0]Aj[1470,13,2323,1241,2140,0]Aj[1470,13,2323,1998,2507,0]Af[1470,13,43,43,1724,0]Af[1470,13,43,43,1218,0]Af[1470,13,43,43,1034,0]Ai[1470,14,942,2165,2136,0]Ai[1470,13,1471,1283,388,0]Ai[1470,13,1471,1140,989,0]Ai[1470,13,1471,1275,379,0]Ai[1470,13,1471,593,2500,0]Aj[1470,13,1471,1283,1419,0]Ag[1470,13,1152,0,1197,0]Aj[1470,13,1152,1152,1202,0]Aj[1470,13,1152,1147,1815,0]Aj[1470,13,1152,2168,1817,0]Aj[1470,13,1152,2168,2298,0]Aj[1470,13,1152,2168,1391,0]Aj[1470,13,1152,2168,1836,0]Aj[1470,13,1152,1462,1226,0]Ag[1470,13,1152,0,2546,0]Ag[1470,13,1152,0,2356,0]Ai[1470,13,1152,974,2351,0]Aj[1470,13,1152,1791,1761,0]Ag[1470,13,1152,0,2517,0]Aj[1470,13,1152,1443,2509,0]Aj[1470,13,1152,1152,1001,0]Ai[1470,13,967,1473,1421,0]Ai[1470,13,967,1473,2663,0]Ag[1470,13,967,967,870,0]Aj[1470,13,1468,1468,2153,0]Af[1470,13,937,0,1740,0]Af[1470,13,937,0,2539,0]Ah[1470,13,937,937,1737,0]Ai[1470,13,1154,419,1732,0]Aj[1470,13,1154,1243,2303,0]Ai[1470,13,1154,415,1726,0]Ai[1470,13,1154,975,1820,0]Ai[1470,13,1154,978,1839,0]Aj[1470,13,1154,1388,2316,0]Ai[1470,13,1154,1154,855,0]Aj[1470,13,2323,1241,2140,0]Aj[1470,13,2323,1998,2505,0]Aj[1470,13,2323,1998,2507,0]Aj[1470,13,2323,1998,2628,0]Ai[1470,13,2323,716,1411,0]Ai[1470,13,2323,372,1231,0]Ai[1470,13,2323,984,1767,0]Ai[1470,13,2323,984,1765,0]Af[1470,13,43,43,1724,0]Af[1470,13,43,43,1218,0]Af[1470,13,43,43,1034,0]Ai[1470,13,942,2363,2661,0]Ai[1470,13,942,2283,1829,0]Ai[1470,13,942,2165,2136,0]Ai[1470,13,942,2112,1742,0]Ai[1470,13,942,1457,1399,0]Ai[1470,13,942,1168,1017,0]Ag[1470,13,942,942,861,0]Ah[1470,13,942,883,2498,0]Ah[1470,13,942,938,2618,0]Ah[1470,13,942,938,2648,0]Ah[1470,13,942,938,2354,0]Ah[1470,13,942,938,2620,0]Ai[1470,13,942,1457,2138,0]Ag[1470,13,942,424,384,0]Ah[1470,13,942,342,1822,0]Ah[1470,13,942,592,2144,0]Ah[1470,13,942,839,1771,0]Ai[1470,13,942,1290,2673,0]Ai[1470,13,1137,252,1729,0]Ai[1470,13,1137,702,2149,0]Ai[1470,13,1137,368,1753,0]Ai[1470,13,1133,1997,990,0]Aj[1470,13,1133,1997,1813,0]Aj[1470,13,1133,1997,2514,0]Aj[1470,13,1133,2330,2300,0]Ah[1470,13,1133,939,849,0]Ai[1470,13,1133,939,2535,0]Ai[1470,13,1133,590,1826,0]Aj[1470,13,1133,1163,1011,0]Ag[1470,13,689,689,390,0]Ah[1470,13,689,689,2146,0]Aj[1470,13,1177,1177,2160,0]Aj[1470,13,1177,1177,1235,0]Aj[1470,13,1177,1177,2548,0]Ai[1470,13,1177,1177,872,0]Aj[1470,13,1177,1177,2677,0]Aj[1470,13,1188,1159,2360,0]Ah[1470,13,1188,744,412,0]Ai[1470,13,1188,1188,874,0]Ai[1470,13,1188,1036,985,0]Ai[1470,13,1188,940,2295,0]Ai[1470,13,1188,940,1748,0]Aj[1470,13,1188,1159,2155,0]Aj[1470,13,1188,1282,1744,0]Ai[1470,13,1188,698,1406,0]Ai[1470,13,1188,961,1842,0]Ai[1470,13,1188,961,1021,0]Ai[1470,13,1188,963,1831,0]Ai[1470,13,1188,972,1844,0]Aj[1470,13,1471,1283,1419,0]Ac[1470,2,1471,0,0,0]Ai[1470,13,1471,1275,379,0]2Aj[1470,14,2323,1998,2505,0]Af[1470,13,937,0,1740,0]Ag[1470,13,942,942,861,0]Ai[1470,14,942,1168,1017,0]Ah[1470,14,1188,744,412,0]5Aj[1470,13,1152,1152,1001,0]Ai[1470,13,1471,1283,388,0]Ac[1470,4,1152,0,0,0]2Ai[1470,13,1188,1188,874,0]Aj[1470,13,1188,1159,2155,0]Aj[1470,13,1152,1152,1202,0]Ag[1470,13,689,689,390,0]Ah[1470,13,689,689,2146,0]Ai[1470,13,942,2363,2661,0]Ai[1470,13,942,2283,1829,0]Ah[1470,13,942,883,2498,0]Aj[1470,13,1133,1997,1813,0]Aj[1470,13,1133,2330,2300,0]Aj[1470,13,1133,1163,1011,0]Ai[1470,13,2323,716,1411,0]65Ai[1470,13,1137,252,1729,0]Ai[1470,13,1137,368,1753,0]543Ai[1470,13,1188,1036,985,0]=987654Ai[1470,13,1188,961,1842,0]Aj[1470,14,2323,1241,2140,0]Aj[1470,13,1152,1152,1001,0]Ai[1470,13,1188,1188,874,0]Aj[1470,13,1188,1159,2155,0]4Ai[1470,13,942,1457,2138,0]21Ai[1470,14,1188,1188,874,0]Ai[1470,13,1471,1283,388,0]Ai[1470,13,1471,1140,989,0]Ai[1470,13,1471,1275,379,0]Ai[1470,13,1471,593,2500,0]Aj[1470,13,1471,1283,1419,0]Ag[1470,13,1152,0,1197,0]Aj[1470,13,1152,1152,1202,0]Aj[1470,13,1152,1147,1815,0]Aj[1470,13,1152,2168,1817,0]Aj[1470,13,1152,2168,2298,0]Aj[1470,13,1152,2168,1391,0]Aj[1470,13,1152,2168,1836,0]Aj[1470,13,1152,1462,1226,0]Ag[1470,13,1152,0,2546,0]Ag[1470,13,1152,0,2356,0]Ai[1470,13,1152,974,2351,0]Aj[1470,13,1152,1791,1761,0]Ag[1470,13,1152,0,2517,0]Aj[1470,13,1152,1443,2509,0]Aj[1470,13,1152,1152,1001,0]Ai[1470,13,967,1473,1421,0]Ai[1470,13,967,1473,2663,0]Ag[1470,13,967,967,870,0]Aj[1470,13,1468,1468,2153,0]Af[1470,13,937,0,1740,0]Af[1470,13,937,0,2539,0]Ah[1470,13,937,937,1737,0]Ai[1470,13,1154,419,1732,0]Aj[1470,13,1154,1243,2303,0]Ai[1470,13,1154,415,1726,0]Ai[1470,13,1154,975,1820,0]Ai[1470,13,1154,978,1839,0]Aj[1470,13,1154,1388,2316,0]Ai[1470,13,1154,1154,855,0]Aj[1470,13,2323,1241,2140,0]Aj[1470,13,2323,1998,2505,0]Aj[1470,13,2323,1998,2507,0]Aj[1470,13,2323,1998,2628,0]Ai[1470,13,2323,716,1411,0]Ai[1470,13,2323,372,1231,0]Ai[1470,13,2323,984,1767,0]Ai[1470,13,2323,984,1765,0]Af[1470,13,43,43,1724,0]Af[1470,13,43,43,1218,0]Af[1470,13,43,43,1034,0]Ai[1470,13,942,2363,2661,0]Ai[1470,13,942,2283,1829,0]Ai[1470,13,942,2165,2136,0]Ai[1470,13,942,2112,1742,0]Ai[1470,13,942,1457,1399,0]Ai[1470,13,942,1168,1017,0]Ag[1470,13,942,942,861,0]Ah[1470,13,942,883,2498,0]Ah[1470,13,942,938,2618,0]Ah[1470,13,942,938,2648,0]Ah[1470,13,942,938,2354,0]Ah[1470,13,942,938,2620,0]Ai[1470,13,942,1457,2138,0]Ag[1470,13,942,424,384,0]Ah[1470,13,942,342,1822,0]Ah[1470,13,942,592,2144,0]Ah[1470,13,942,839,1771,0]Ai[1470,13,942,1290,2673,0]Ai[1470,13,1137,252,1729,0]Ai[1470,13,1137,702,2149,0]Ai[1470,13,1137,368,1753,0]Ai[1470,13,1133,1997,990,0]Aj[1470,13,1133,1997,1813,0]Aj[1470,13,1133,1997,2514,0]Aj[1470,13,1133,2330,2300,0]Ah[1470,13,1133,939,849,0]Ai[1470,13,1133,939,2535,0]Ai[1470,13,1133,590,1826,0]Aj[1470,13,1133,1163,1011,0]Ag[1470,13,689,689,390,0]Ah[1470,13,689,689,2146,0]Aj[1470,13,1177,1177,2160,0]Aj[1470,13,1177,1177,1235,0]Aj[1470,13,1177,1177,2548,0]Ai[1470,13,1177,1177,872,0]Aj[1470,13,1177,1177,2677,0]Aj[1470,13,1188,1159,2360,0]Ah[1470,13,1188,744,412,0]Ai[1470,13,1188,1188,874,0]Ai[1470,13,1188,1036,985,0]Ai[1470,13,1188,940,2295,0]Ai[1470,13,1188,940,1748,0]Aj[1470,13,1188,1159,2155,0]Aj[1470,13,1188,1282,1744,0]Ai[1470,13,1188,698,1406,0]Ai[1470,13,1188,961,1842,0]Ai[1470,13,1188,961,1021,0]Ai[1470,13,1188,963,1831,0]Ai[1470,13,1188,972,1844,0]Ai[1470,15,1133,590,1826,0]Ai[1470,15,1154,978,1839,0]Ae[1470,6,1133,939,0,0]Af[1470,4,1471,1154,0,0]Ac[1470,6,1154,0,0,0]Ai[1470,15,967,1473,1421,0]Ab[1470,6,942,0,0,0]Ah[1470,15,942,938,2648,0]Ai[1470,15,1133,939,2535,0]Ai[1470,15,1188,940,1748,0]8Ai[1470,15,1188,698,1406,0]Ab[1470,5,967,0,0,0]Ac[1470,6,1177,0,0,0]Aj[1470,15,1154,1243,2303,0]Aj[1470,15,1154,1388,2316,0]Ai[1470,15,1154,1154,855,0]Ac[1470,5,1188,0,0,0]Ai[1470,14,942,1457,2138,0]Ai[1470,13,1471,1140,989,0]Ai[1470,13,1471,1275,379,0]Ai[1470,13,1471,593,2500,0]Ag[1470,13,1152,0,1197,0]Aj[1470,13,1152,1147,1815,0]Aj[1470,13,1152,2168,1817,0]Aj[1470,13,1152,2168,2298,0]Aj[1470,13,1152,2168,1391,0]Aj[1470,13,1152,2168,1836,0]Aj[1470,13,1152,1462,1226,0]Ag[1470,13,1152,0,2546,0]Ag[1470,13,1152,0,2356,0]Aj[1470,13,1152,1791,1761,0]Aj[1470,13,1152,1443,2509,0]Aj[1470,13,1152,1152,1001,0]Ai[1470,13,967,1473,1421,0]Ai[1470,13,967,1473,2663,0]Ag[1470,13,967,967,870,0]Ai[1470,13,1154,415,1726,0]Ai[1470,13,1154,978,1839,0]Aj[1470,13,1154,1388,2316,0]Ai[1470,13,1154,1154,855,0]Aj[1470,13,2323,1241,2140,0]Aj[1470,13,2323,1998,2507,0]Aj[1470,13,2323,1998,2628,0]Ai[1470,13,2323,716,1411,0]Ai[1470,13,2323,372,1231,0]Ai[1470,13,2323,984,1767,0]Ai[1470,13,2323,984,1765,0]Af[1470,13,43,43,1724,0]Af[1470,13,43,43,1218,0]Af[1470,13,43,43,1034,0]Ai[1470,13,942,1457,2138,0]Ag[1470,13,942,424,384,0]Ah[1470,13,942,592,2144,0]Ah[1470,13,942,839,1771,0]Aj[1470,13,1133,1997,1813,0]Aj[1470,13,1133,2330,2300,0]Ai[1470,13,1133,590,1826,0]Aj[1470,13,1133,1163,1011,0]Ai[1470,13,1177,1177,872,0]Ai[1470,13,1188,1036,985,0]Ai[1470,13,1188,940,2295,0]Ai[1470,13,1188,940,1748,0]Aj[1470,13,1188,1159,2155,0]Aj[1470,13,1188,1282,1744,0]Ai[1470,13,1188,698,1406,0]Ai[1470,13,1188,961,1842,0]Ai[1470,13,1188,963,1831,0]Ai[1470,13,1188,972,1844,0]Ai[1470,13,1471,1283,388,0]Ai[1470,13,1471,1275,379,0]Ai[1470,13,1188,961,1021,0]Ac[1470,2,1471,0,0,0]0Ai[1470,14,942,2165,2136,0]Ai[1470,14,1188,1188,874,0]Af[1470,13,937,0,1740,0]5Aj[1470,13,1471,1283,1419,0]Aj[1470,13,1152,1152,1001,0]Ai[1470,13,1188,1188,874,0]Ah[1470,14,1188,744,412,0]5Ai[1470,14,1188,972,1844,0]Ac[1470,4,1471,0,0,0]3Aj[1470,13,1188,1159,2155,0]Ai[1470,13,1188,961,1842,0]Ai[1470,14,942,1457,1399,0]Ai[1470,13,1137,252,1729,0]Ai[1470,13,1137,368,1753,0]976Ai[1470,13,1137,702,2149,0]Ac[1470,2,1152,0,0,0]32Aj[1470,13,1133,1997,2514,0]Ai[1470,14,942,1457,2138,0]Ai[1470,14,1471,593,2500,0]1Ab[1470,2,942,0,0,0]Af[1470,5,1188,1036,0,0]Ai[1470,15,1154,1154,855,0]Af[1470,5,1471,1140,0,0]Af[1470,5,1133,1997,0,0]Ah[1470,15,942,938,2648,0]Ah[1470,15,1133,939,849,0]Ai[1470,15,1133,939,2535,0]Ai[1470,15,1188,940,1748,0]Af[1470,15,937,0,2539,0]Aj[1470,15,1152,2168,1817,0]2Af[1470,4,1471,1152,0,0]Ac[1470,5,1152,0,0,0]Ah[1470,15,937,937,1737,0]Aj[1470,15,1188,1282,1744,0]Aj[1470,15,1152,2168,1836,0]Af[1470,5,1133,1163,0,0]3Ae[1470,5,942,1168,0,0]Ai[1470,15,942,2112,1742,0]Ae[1470,5,1188,961,0,0]Aj[1470,15,1152,2168,1391,0]Aj[1470,15,1152,1462,1226,0]Aa[1470,5,43,0,0,0]Aj[1470,13,1188,1159,2155,0]Ai[1470,14,942,1457,2138,0]Ai[1470,13,1471,1283,388,0]Ai[1470,13,1471,1140,989,0]Ai[1470,13,1471,1275,379,0]Ai[1470,13,1471,593,2500,0]Aj[1470,13,1471,1283,1419,0]Ag[1470,13,1152,0,1197,0]Aj[1470,13,1152,1152,1202,0]Aj[1470,13,1152,1147,1815,0]Aj[1470,13,1152,2168,1817,0]Aj[1470,13,1152,2168,2298,0]Aj[1470,13,1152,2168,1391,0]Aj[1470,13,1152,2168,1836,0]Aj[1470,13,1152,1462,1226,0]Ag[1470,13,1152,0,2546,0]Ag[1470,13,1152,0,2356,0]Ai[1470,13,1152,974,2351,0]Aj[1470,13,1152,1791,1761,0]Ag[1470,13,1152,0,2517,0]Aj[1470,13,1152,1443,2509,0]Aj[1470,13,1152,1152,1001,0]Ai[1470,13,967,1473,1421,0]Ai[1470,13,967,1473,2663,0]Ag[1470,13,967,967,870,0]Aj[1470,13,1468,1468,2153,0]Af[1470,13,937,0,1740,0]Af[1470,13,937,0,2539,0]Ah[1470,13,937,937,1737,0]Ai[1470,13,1154,419,1732,0]Aj[1470,13,1154,1243,2303,0]Ai[1470,13,1154,415,1726,0]Ai[1470,13,1154,975,1820,0]Ai[1470,13,1154,978,1839,0]Aj[1470,13,1154,1388,2316,0]Ai[1470,13,1154,1154,855,0]Aj[1470,13,2323,1241,2140,0]Aj[1470,13,2323,1998,2505,0]Aj[1470,13,2323,1998,2507,0]Aj[1470,13,2323,1998,2628,0]Ai[1470,13,2323,716,1411,0]Ai[1470,13,2323,372,1231,0]Ai[1470,13,2323,984,1767,0]Ai[1470,13,2323,984,1765,0]Af[1470,13,43,43,1724,0]Af[1470,13,43,43,1218,0]Af[1470,13,43,43,1034,0]Ai[1470,13,942,2363,2661,0]Ai[1470,13,942,2283,1829,0]Ai[1470,13,942,2165,2136,0]Ai[1470,13,942,2112,1742,0]Ai[1470,13,942,1457,1399,0]Ai[1470,13,942,1168,1017,0]Ag[1470,13,942,942,861,0]Ah[1470,13,942,883,2498,0]Ah[1470,13,942,938,2618,0]Ah[1470,13,942,938,2648,0]Ah[1470,13,942,938,2354,0]Ah[1470,13,942,938,2620,0]Ai[1470,13,942,1457,2138,0]Ag[1470,13,942,424,384,0]Ah[1470,13,942,342,1822,0]Ah[1470,13,942,592,2144,0]Ah[1470,13,942,839,1771,0]Ai[1470,13,942,1290,2673,0]Ai[1470,13,1137,252,1729,0]Ai[1470,13,1137,702,2149,0]Ai[1470,13,1137,368,1753,0]Ai[1470,13,1133,1997,990,0]Aj[1470,13,1133,1997,1813,0]Aj[1470,13,1133,1997,2514,0]Aj[1470,13,1133,2330,2300,0]Ah[1470,13,1133,939,849,0]Ai[1470,13,1133,939,2535,0]Ai[1470,13,1133,590,1826,0]Aj[1470,13,1133,1163,1011,0]Ag[1470,13,689,689,390,0]Ah[1470,13,689,689,2146,0]Aj[1470,13,1177,1177,2160,0]Aj[1470,13,1177,1177,1235,0]Aj[1470,13,1177,1177,2548,0]Ai[1470,13,1177,1177,872,0]Aj[1470,13,1177,1177,2677,0]Aj[1470,13,1188,1159,2360,0]Ah[1470,13,1188,744,412,0]Ai[1470,13,1188,1188,874,0]Ai[1470,13,1188,1036,985,0]Ai[1470,13,1188,940,2295,0]Ai[1470,13,1188,940,1748,0]Aj[1470,13,1188,1159,2155,0]Aj[1470,13,1188,1282,1744,0]Ai[1470,13,1188,698,1406,0]Ai[1470,13,1188,961,1842,0]Ai[1470,13,1188,961,1021,0]Ai[1470,13,1188,963,1831,0]Ai[1470,13,1188,972,1844,0]Ae[1470,2,942,1431,0,0]Ah[1470,14,942,592,2144,0]Ab[1470,2,942,0,0,0]Af[1470,13,937,0,1740,0]Aj[1470,13,1152,1152,1001,0]Ai[1470,12,942,1240,1200,0]Ag[1470,13,942,424,384,0]Ah[1470,13,942,342,1822,0]Ah[1470,13,942,592,2144,0]Ah[1470,13,942,839,1771,0]Bm[1470,13,937,0,1740,0,\"impl-Error-for-Error\"]0Ai[1470,13,1471,1275,379,0]Ai[1470,13,1137,702,2149,0]Ac[1470,2,1471,0,0,0]0Ai[1470,14,1188,1188,874,0]Ai[1470,14,942,1457,1399,0]Ai[1470,14,942,1168,1017,0]Ai[1470,13,1188,961,1021,0]>Ai[1470,14,967,1473,2663,0]Ac[1470,4,1471,0,0,0]Ai[1470,14,2323,716,1411,0]Ai[1470,14,2323,372,1231,0]Ai[1470,14,2323,984,1765,0]Ai[1470,13,942,2112,1742,0]Ag[1470,13,942,942,861,0]Aj[1470,14,2323,1998,2505,0]Aj[1470,13,1471,1283,1419,0]Aj[1470,13,1188,1159,2360,0]Ai[1470,13,1188,961,1842,0]Ah[1470,13,942,839,1771,0]Aj[1470,14,2323,1241,2140,0]Ac[1470,2,1471,0,0,0]Ai[1470,14,2323,984,1767,0]Ag[1470,13,1152,0,2517,0]Af[1470,13,937,0,1740,0]Af[1470,13,937,0,2539,0]Ah[1470,13,937,937,1737,0]Ah[1470,13,942,938,2618,0]Ah[1470,13,942,938,2648,0]Ah[1470,13,942,938,2354,0]Ah[1470,13,942,938,2620,0]9Ai[1470,13,1137,252,1729,0]Ai[1470,13,1137,368,1753,0]Ai[1470,13,1188,1188,874,0]Ah[1470,14,1188,744,412,0]Ai[1470,14,1188,1188,874,0]Ai[1470,14,1188,972,1844,0]Ai[1470,15,967,1473,1421,0]Af[1470,6,1152,1432,0,0]Af[1470,10,942,1240,0,0]Ac[1470,5,1152,0,0,0]Aj[1470,15,2323,1998,2507,0]Aj[1470,15,1152,2168,1817,0]Ai[1470,15,1154,1154,855,0]Ah[1470,15,937,937,1737,0]Ai[1470,15,1188,940,2295,0]Ai[1470,15,1188,698,1406,0]Aj[1470,15,1177,1177,1235,0]Ai[1470,15,1177,1177,872,0]Aa[1470,5,43,0,0,0]Aj[1470,15,1152,2168,1836,0]000Af[1470,6,1152,1462,0,0]Ah[1470,15,942,938,2354,0]Ah[1470,15,942,938,2618,0]Ae[1470,5,2323,372,0,0]=Ac[1470,6,1177,0,0,0]Ai[1470,15,942,2112,1742,0]Ai[1470,14,942,1457,2138,0]Ai[1470,13,1154,419,1732,0]Aj[1470,13,1152,1152,1001,0]Aj[1470,13,1152,1147,1815,0]Ai[1470,13,1188,961,1842,0]Ai[1470,14,942,1168,1017,0]Ab[1470,7,982,0,0,0]Ai[1470,13,1471,1140,989,0]4Aj[1470,13,1152,2168,2298,0]Aj[1470,13,1152,2168,1391,0]Aj[1470,13,1152,2168,1836,0]Ag[1470,13,1152,0,2546,0]Ag[1470,13,1152,0,2356,0]Ai[1470,13,1152,974,2351,0]Aj[1470,13,1152,1791,1761,0]Aj[1470,13,1152,1443,2509,0]=Ai[1470,13,967,1473,2663,0]Ag[1470,13,967,967,870,0]Ai[1470,13,1154,975,1820,0]Ai[1470,13,942,1457,2138,0]Ai[1470,13,1133,1997,990,0]Aj[1470,13,1177,1177,2548,0]Aj[1470,13,1177,1177,2677,0]Ai[1470,13,1188,1036,985,0]Aj[1470,13,1188,1282,1744,0]Ai[1470,13,1188,698,1406,0]Ai[1470,13,1188,961,1842,0]Ai[1470,13,1188,963,1831,0]Ai[1470,13,1188,972,1844,0]2Aj[1470,13,1152,1152,1001,0]Ai[1470,13,942,1290,2673,0]Ah[1470,14,942,592,2144,0]Af[1470,13,937,0,1740,0]Ai[1470,13,1471,1275,379,0]804Ah[1470,14,1188,744,412,0]Ai[1470,14,1188,1188,874,0]Ai[1470,14,1188,972,1844,0]Aj[1470,13,1471,1283,1419,0]Ai[1470,13,942,2112,1742,0]7Ai[1470,13,1137,252,1729,0]Ai[1470,13,1137,702,2149,0]Ai[1470,13,1137,368,1753,0]Ai[1470,13,1471,1283,388,0]Ai[1470,13,1471,1140,989,0]:Ai[1470,13,1471,593,2500,0]7Ag[1470,13,1152,0,1197,0]Aj[1470,13,1152,1152,1202,0]Aj[1470,13,1152,1147,1815,0]Aj[1470,13,1152,2168,1817,0]Aj[1470,13,1152,2168,2298,0]Aj[1470,13,1152,2168,1391,0]Aj[1470,13,1152,2168,1836,0]Aj[1470,13,1152,1462,1226,0]Ag[1470,13,1152,0,2546,0]Ag[1470,13,1152,0,2356,0]Ai[1470,13,1152,974,2351,0]Aj[1470,13,1152,1791,1761,0]Ag[1470,13,1152,0,2517,0]Aj[1470,13,1152,1443,2509,0]Aj[1470,13,1152,1152,1001,0]Ai[1470,13,967,1473,1421,0]Ai[1470,13,967,1473,2663,0]Ag[1470,13,967,967,870,0]Aj[1470,13,1468,1468,2153,0]Af[1470,13,937,0,1740,0]Af[1470,13,937,0,2539,0]Ah[1470,13,937,937,1737,0]Ai[1470,13,1154,419,1732,0]Aj[1470,13,1154,1243,2303,0]Ai[1470,13,1154,415,1726,0]Ai[1470,13,1154,975,1820,0]Ai[1470,13,1154,978,1839,0]Aj[1470,13,1154,1388,2316,0]Ai[1470,13,1154,1154,855,0]Aj[1470,13,2323,1241,2140,0]Aj[1470,13,2323,1998,2505,0]Aj[1470,13,2323,1998,2507,0]Aj[1470,13,2323,1998,2628,0]Ai[1470,13,2323,716,1411,0]Ai[1470,13,2323,372,1231,0]Ai[1470,13,2323,984,1767,0]Ai[1470,13,2323,984,1765,0]Af[1470,13,43,43,1724,0]Af[1470,13,43,43,1218,0]Af[1470,13,43,43,1034,0]Ai[1470,13,942,2363,2661,0]Ai[1470,13,942,2283,1829,0]Ai[1470,13,942,2165,2136,0]Ai[1470,13,942,2112,1742,0]Ai[1470,13,942,1457,1399,0]Ai[1470,13,942,1168,1017,0]Ag[1470,13,942,942,861,0]Ah[1470,13,942,883,2498,0]Ah[1470,13,942,938,2618,0]Ah[1470,13,942,938,2648,0]Ah[1470,13,942,938,2354,0]Ah[1470,13,942,938,2620,0]Ai[1470,13,942,1457,2138,0]Ag[1470,13,942,424,384,0]Ah[1470,13,942,342,1822,0]Ah[1470,13,942,592,2144,0]Ah[1470,13,942,839,1771,0]Ai[1470,13,942,1290,2673,0]Ai[1470,13,1137,252,1729,0]Ai[1470,13,1137,702,2149,0]Ai[1470,13,1137,368,1753,0]Ai[1470,13,1133,1997,990,0]Aj[1470,13,1133,1997,1813,0]Aj[1470,13,1133,1997,2514,0]Aj[1470,13,1133,2330,2300,0]Ah[1470,13,1133,939,849,0]Ai[1470,13,1133,939,2535,0]Ai[1470,13,1133,590,1826,0]Aj[1470,13,1133,1163,1011,0]Ag[1470,13,689,689,390,0]Ah[1470,13,689,689,2146,0]Aj[1470,13,1177,1177,2160,0]Aj[1470,13,1177,1177,1235,0]Aj[1470,13,1177,1177,2548,0]Ai[1470,13,1177,1177,872,0]Aj[1470,13,1177,1177,2677,0]Aj[1470,13,1188,1159,2360,0]Ah[1470,13,1188,744,412,0]Ai[1470,13,1188,1188,874,0]Ai[1470,13,1188,1036,985,0]Ai[1470,13,1188,940,2295,0]Ai[1470,13,1188,940,1748,0]Aj[1470,13,1188,1159,2155,0]Aj[1470,13,1188,1282,1744,0]Ai[1470,13,1188,698,1406,0]Ai[1470,13,1188,961,1842,0]Ai[1470,13,1188,961,1021,0]Ai[1470,13,1188,963,1831,0]Ai[1470,13,1188,972,1844,0]Ai[1470,14,1471,593,2500,0]Af[1470,6,1152,2168,0,0]Ai[1470,15,1188,940,2295,0]Aj[1470,15,1188,1282,1744,0]Aj[1470,15,2323,1998,2628,0]Ae[1470,5,942,1457,0,0]Ah[1470,15,937,937,1737,0]Ah[1470,15,942,938,2648,0]Ai[1470,15,1154,1154,855,0]Ae[1470,6,1188,698,0,0]Ai[1470,15,1154,978,1839,0]Ai[1470,15,1188,963,1831,0]Ah[1470,15,942,938,2620,0]Ae[1470,5,2323,716,0,0]7Aj[1470,15,1177,1177,1235,0]Ai[1470,15,1177,1177,872,0]Af[1470,5,1471,1283,0,0]Ae[1470,6,967,1473,0,0]Af[1470,15,937,0,2539,0]<><43>Ai[1470,12,942,2363,2614,0]Ai[1470,13,942,2363,2661,0]Ai[1470,13,942,2283,1829,0]Ai[1470,13,942,1290,2673,0]Aj[1470,13,1133,1997,1813,0]Aj[1470,13,1133,2330,2300,0]Aj[1470,13,1133,1163,1011,0]Aj[1470,14,1152,2168,2298,0]Ai[1470,14,942,1457,2138,0]Af[1470,13,937,0,1740,0]Ai[1470,13,1471,1140,989,0]Ai[1470,14,1471,1140,989,0]3Ai[1470,14,1471,593,2500,0]Ai[1470,13,1137,702,2149,0]Aj[1470,13,1152,1147,1815,0]Aj[1470,13,1188,1159,2155,0]3Aj[1470,14,2323,1241,2140,0]Aj[1470,14,2323,1998,2505,0]Ai[1470,13,1188,961,1842,0]Ag[1470,13,942,942,861,0]4Ai[1470,13,942,2112,1742,0]1Ai[1470,13,1137,252,1729,0]Ai[1470,13,1137,368,1753,0]<;Ah[1470,14,1188,744,412,0]Ai[1470,14,1188,972,1844,0]Ac[1470,7,1468,0,0,0]Ac[1470,2,1471,0,0,0]Aj[1470,13,1471,1283,1419,0]A`[1470,3,0,0,0,0]Ai[1470,14,2323,984,1767,0]Ag[1470,14,1152,0,2546,0]Ag[1470,14,967,967,870,0]Ai[1470,13,1471,1140,989,0]Ai[1470,13,1471,1275,379,0]Ai[1470,13,1471,593,2500,0]Ag[1470,13,1152,0,1197,0]Aj[1470,13,1152,1147,1815,0]Aj[1470,13,1152,2168,1817,0]Aj[1470,13,1152,2168,2298,0]Aj[1470,13,1152,2168,1391,0]Aj[1470,13,1152,2168,1836,0]Aj[1470,13,1152,1462,1226,0]Ag[1470,13,1152,0,2546,0]Ag[1470,13,1152,0,2356,0]Aj[1470,13,1152,1791,1761,0]Aj[1470,13,1152,1443,2509,0]Aj[1470,13,1152,1152,1001,0]Ai[1470,13,967,1473,1421,0]Ai[1470,13,967,1473,2663,0]Ag[1470,13,967,967,870,0]Ai[1470,13,1154,415,1726,0]Ai[1470,13,1154,978,1839,0]Aj[1470,13,1154,1388,2316,0]Ai[1470,13,1154,1154,855,0]Aj[1470,13,2323,1241,2140,0]Aj[1470,13,2323,1998,2507,0]Aj[1470,13,2323,1998,2628,0]Ai[1470,13,2323,716,1411,0]Ai[1470,13,2323,372,1231,0]Ai[1470,13,2323,984,1767,0]Ai[1470,13,2323,984,1765,0]Af[1470,13,43,43,1724,0]Af[1470,13,43,43,1218,0]Af[1470,13,43,43,1034,0]Ai[1470,13,942,1457,2138,0]Ag[1470,13,942,424,384,0]Ah[1470,13,942,592,2144,0]Ah[1470,13,942,839,1771,0]Aj[1470,13,1133,1997,1813,0]Aj[1470,13,1133,2330,2300,0]Ai[1470,13,1133,590,1826,0]Aj[1470,13,1133,1163,1011,0]Ai[1470,13,1177,1177,872,0]Ai[1470,13,1188,1036,985,0]Ai[1470,13,1188,940,2295,0]Ai[1470,13,1188,940,1748,0]Aj[1470,13,1188,1159,2155,0]Aj[1470,13,1188,1282,1744,0]Ai[1470,13,1188,698,1406,0]Ai[1470,13,1188,961,1842,0]Ai[1470,13,1188,963,1831,0]Ai[1470,13,1188,972,1844,0]Ai[1470,14,942,1168,1017,0]Ai[1470,13,1471,1283,388,0]Ai[1470,13,1471,1140,989,0]Ai[1470,13,1471,1275,379,0]Ai[1470,13,1471,593,2500,0]Aj[1470,13,1471,1283,1419,0]Ag[1470,13,1152,0,1197,0]0Aj[1470,13,1152,1152,1202,0]Aj[1470,13,1152,1147,1815,0]Aj[1470,13,1152,2168,1817,0]Aj[1470,13,1152,2168,2298,0]Aj[1470,13,1152,2168,1391,0]Aj[1470,13,1152,2168,1836,0]Aj[1470,13,1152,1462,1226,0]Ag[1470,13,1152,0,2546,0]Ag[1470,13,1152,0,2356,0]Ai[1470,13,1152,974,2351,0]Aj[1470,13,1152,1791,1761,0]Ag[1470,13,1152,0,2517,0]Aj[1470,13,1152,1443,2509,0]Aj[1470,13,1152,1152,1001,0]Ai[1470,13,967,1473,1421,0]Ai[1470,13,967,1473,2663,0]Ag[1470,13,967,967,870,0]Aj[1470,13,1468,1468,2153,0]Af[1470,13,937,0,1740,0]Af[1470,13,937,0,2539,0]Ah[1470,13,937,937,1737,0]Ai[1470,13,1154,419,1732,0]Aj[1470,13,1154,1243,2303,0]Ai[1470,13,1154,415,1726,0]Ai[1470,13,1154,975,1820,0]Ai[1470,13,1154,978,1839,0]Aj[1470,13,1154,1388,2316,0]Ai[1470,13,1154,1154,855,0]Aj[1470,13,2323,1241,2140,0]Aj[1470,13,2323,1998,2505,0]Aj[1470,13,2323,1998,2507,0]Aj[1470,13,2323,1998,2628,0]Ai[1470,13,2323,716,1411,0]Ai[1470,13,2323,372,1231,0]Ai[1470,13,2323,984,1767,0]Ai[1470,13,2323,984,1765,0]Af[1470,13,43,43,1724,0]Af[1470,13,43,43,1218,0]Af[1470,13,43,43,1034,0]Ai[1470,13,942,2363,2661,0]Ai[1470,13,942,2283,1829,0]Ai[1470,13,942,2165,2136,0]Ai[1470,13,942,2112,1742,0]Ai[1470,13,942,1457,1399,0]Ai[1470,13,942,1168,1017,0]Ag[1470,13,942,942,861,0]Ah[1470,13,942,883,2498,0]Ah[1470,13,942,938,2618,0]Ah[1470,13,942,938,2648,0]Ah[1470,13,942,938,2354,0]Ah[1470,13,942,938,2620,0]Ai[1470,13,942,1457,2138,0]Ag[1470,13,942,424,384,0]Ah[1470,13,942,342,1822,0]Ah[1470,13,942,592,2144,0]Ah[1470,13,942,839,1771,0]Ai[1470,13,942,1290,2673,0]Ai[1470,13,1137,252,1729,0]Ai[1470,13,1137,702,2149,0]Ai[1470,13,1137,368,1753,0]Ai[1470,13,1133,1997,990,0]Aj[1470,13,1133,1997,1813,0]Aj[1470,13,1133,1997,2514,0]Aj[1470,13,1133,2330,2300,0]Ah[1470,13,1133,939,849,0]Ai[1470,13,1133,939,2535,0]Ai[1470,13,1133,590,1826,0]Aj[1470,13,1133,1163,1011,0]Ag[1470,13,689,689,390,0]Ah[1470,13,689,689,2146,0]Aj[1470,13,1177,1177,2160,0]Aj[1470,13,1177,1177,1235,0]Aj[1470,13,1177,1177,2548,0]Ai[1470,13,1177,1177,872,0]Aj[1470,13,1177,1177,2677,0]Aj[1470,13,1188,1159,2360,0]Ah[1470,13,1188,744,412,0]Ai[1470,13,1188,1188,874,0]Ai[1470,13,1188,1036,985,0]Ai[1470,13,1188,940,2295,0]Ai[1470,13,1188,940,1748,0]Aj[1470,13,1188,1159,2155,0]Aj[1470,13,1188,1282,1744,0]Ai[1470,13,1188,698,1406,0]Ai[1470,13,1188,961,1842,0]Ai[1470,13,1188,961,1021,0]Ai[1470,13,1188,963,1831,0]Ai[1470,13,1188,972,1844,0]Ai[1470,13,1471,1283,388,0]Ai[1470,13,1471,1140,989,0]Ai[1470,13,1471,1275,379,0]Ai[1470,13,1471,593,2500,0]Aj[1470,13,1471,1283,1419,0]Ag[1470,13,1152,0,1197,0]Aj[1470,13,1152,1152,1202,0]Aj[1470,13,1152,1147,1815,0]Aj[1470,13,1152,2168,1817,0]Aj[1470,13,1152,2168,2298,0]Aj[1470,13,1152,2168,1391,0]Aj[1470,13,1152,2168,1836,0]Aj[1470,13,1152,1462,1226,0]Ag[1470,13,1152,0,2546,0]Ag[1470,13,1152,0,2356,0]Ai[1470,13,1152,974,2351,0]Aj[1470,13,1152,1791,1761,0]Ag[1470,13,1152,0,2517,0]Aj[1470,13,1152,1443,2509,0]Aj[1470,13,1152,1152,1001,0]Ai[1470,13,967,1473,1421,0]Ai[1470,13,967,1473,2663,0]Ag[1470,13,967,967,870,0]Aj[1470,13,1468,1468,2153,0]Af[1470,13,937,0,1740,0]Af[1470,13,937,0,2539,0]Ah[1470,13,937,937,1737,0]Ai[1470,13,1154,419,1732,0]Aj[1470,13,1154,1243,2303,0]Ai[1470,13,1154,415,1726,0]Ai[1470,13,1154,975,1820,0]Ai[1470,13,1154,978,1839,0]Aj[1470,13,1154,1388,2316,0]Ai[1470,13,1154,1154,855,0]Aj[1470,13,2323,1241,2140,0]Aj[1470,13,2323,1998,2505,0]Aj[1470,13,2323,1998,2507,0]Aj[1470,13,2323,1998,2628,0]Ai[1470,13,2323,716,1411,0]Ai[1470,13,2323,372,1231,0]Ai[1470,13,2323,984,1767,0]Ai[1470,13,2323,984,1765,0]Af[1470,13,43,43,1724,0]Af[1470,13,43,43,1218,0]Af[1470,13,43,43,1034,0]Ai[1470,13,942,2363,2661,0]Ai[1470,13,942,2283,1829,0]Ai[1470,13,942,2165,2136,0]Ai[1470,13,942,2112,1742,0]Ai[1470,13,942,1457,1399,0]Ai[1470,13,942,1168,1017,0]Ag[1470,13,942,942,861,0]Ah[1470,13,942,883,2498,0]Ah[1470,13,942,938,2618,0]Ah[1470,13,942,938,2648,0]Ah[1470,13,942,938,2354,0]Ah[1470,13,942,938,2620,0]Ai[1470,13,942,1457,2138,0]Ag[1470,13,942,424,384,0]Ah[1470,13,942,342,1822,0]Ah[1470,13,942,592,2144,0]Ah[1470,13,942,839,1771,0]Ai[1470,13,942,1290,2673,0]Ai[1470,13,1137,252,1729,0]Ai[1470,13,1137,702,2149,0]Ai[1470,13,1137,368,1753,0]Ai[1470,13,1133,1997,990,0]Aj[1470,13,1133,1997,1813,0]Aj[1470,13,1133,1997,2514,0]Aj[1470,13,1133,2330,2300,0]Ah[1470,13,1133,939,849,0]Ai[1470,13,1133,939,2535,0]Ai[1470,13,1133,590,1826,0]Aj[1470,13,1133,1163,1011,0]Ag[1470,13,689,689,390,0]Ah[1470,13,689,689,2146,0]Aj[1470,13,1177,1177,2160,0]Aj[1470,13,1177,1177,1235,0]Aj[1470,13,1177,1177,2548,0]Ai[1470,13,1177,1177,872,0]Aj[1470,13,1177,1177,2677,0]Aj[1470,13,1188,1159,2360,0]Ah[1470,13,1188,744,412,0]Ai[1470,13,1188,1188,874,0]Ai[1470,13,1188,1036,985,0]Ai[1470,13,1188,940,2295,0]Ai[1470,13,1188,940,1748,0]Aj[1470,13,1188,1159,2155,0]Aj[1470,13,1188,1282,1744,0]Ai[1470,13,1188,698,1406,0]Ai[1470,13,1188,961,1842,0]Ai[1470,13,1188,961,1021,0]Ai[1470,13,1188,963,1831,0]Ai[1470,13,1188,972,1844,0]Aj[1470,13,1152,1152,1202,0]Ag[1470,13,689,689,390,0]Ah[1470,13,689,689,2146,0]Aj[1470,13,1471,1283,1419,0]Aj[1470,15,1152,1147,1815,0]Aa[1470,5,43,0,0,0]Ae[1470,4,1471,415,0,0]Ae[1470,6,1154,415,0,0]Ae[1470,5,1137,252,0,0]Ae[1470,5,1154,419,0,0]Af[1470,15,937,0,2539,0]Ab[1470,6,937,0,0,0]Ab[1470,5,937,0,0,0]Ae[1470,6,942,2112,0,0]Af[1470,6,1188,1282,0,0]Ah[1470,15,942,938,2620,0]Ah[1470,15,942,938,2354,0]Ad[1470,4,937,940,0,0]Ae[1470,6,1188,940,0,0]Ai[1470,15,1154,978,1839,0]Ai[1470,15,1188,963,1831,0]Ae[1470,5,1137,368,0,0]Aj[1470,15,2323,1998,2507,0]Aj[1470,15,2323,1998,2628,0]Aj[1470,15,1154,1243,2303,0]Ai[1470,15,1154,415,1726,0]Af[1470,5,1152,1791,0,0]Ae[1470,5,2323,984,0,0]320Ad[1470,5,942,839,0,0]Ai[1470,13,1154,975,1820,0]Aj[1470,13,1188,1159,2155,0]Ac[1470,2,1471,0,0,0]Ai[1470,13,1471,1275,379,0]Ac[1470,7,1137,0,0,0]Aj[1470,12,1177,1177,2512,0]Aj[1470,13,1177,1177,1235,0]Ai[1470,13,1471,1283,388,0]Aj[1470,13,1471,1283,1419,0]Af[1470,13,937,0,1740,0]Ag[1470,13,942,942,861,0]:Aj[1470,13,1152,1152,1001,0]Ah[1470,14,1188,744,412,0]Ai[1470,14,1188,972,1844,0]Ai[1470,13,942,1290,2673,0]Ai[1470,13,1471,1140,989,0]Ai[1470,14,1471,1140,989,0]9Ai[1470,14,942,1457,2138,0]Ag[1470,13,1152,0,2517,0]9Af[1470,13,937,0,2539,0]Ah[1470,13,937,937,1737,0]Af[1470,13,43,43,1724,0]Af[1470,13,43,43,1218,0]Af[1470,13,43,43,1034,0]Ah[1470,13,942,938,2618,0]Ah[1470,13,942,938,2648,0]Ah[1470,13,942,938,2354,0]Ah[1470,13,942,938,2620,0]Ah[1470,13,1133,939,849,0]Ai[1470,13,1133,939,2535,0]Ai[1470,13,1188,940,2295,0]Ai[1470,13,1188,940,1748,0]Ah[1470,13,942,839,1771,0]Ai[1470,14,1188,1188,874,0]Af[1470,5,1133,1997,0,0]Af[1470,6,1152,1147,0,0]Af[1470,6,1152,2168,0,0]Ae[1470,5,1154,975,0,0]Ad[1470,5,942,342,0,0]Ab[1470,8,937,0,0,0]Ae[1470,6,1133,590,0,0]Ae[1470,5,942,2283,0,0]Ae[1470,6,1188,963,0,0]Aj[1470,15,1154,1243,2303,0]Ai[1470,15,1154,415,1726,0]8Ae[1470,4,1471,978,0,0]Ae[1470,6,1154,978,0,0]Ae[1470,5,1188,961,0,0]Ae[1470,5,1188,972,0,0]Ai[1470,13,1188,961,1842,0]Ai[1470,13,1471,1283,388,0]Ai[1470,13,1471,1140,989,0]Ai[1470,13,1471,1275,379,0]Ai[1470,13,1471,593,2500,0]Aj[1470,13,1471,1283,1419,0]Ag[1470,13,1152,0,1197,0]Aj[1470,13,1152,1152,1202,0]Aj[1470,13,1152,1147,1815,0]Aj[1470,13,1152,2168,1817,0]Aj[1470,13,1152,2168,2298,0]Aj[1470,13,1152,2168,1391,0]Aj[1470,13,1152,2168,1836,0]Aj[1470,13,1152,1462,1226,0]Ag[1470,13,1152,0,2546,0]Ag[1470,13,1152,0,2356,0]Ai[1470,13,1152,974,2351,0]Aj[1470,13,1152,1791,1761,0]Ag[1470,13,1152,0,2517,0]Aj[1470,13,1152,1443,2509,0]Aj[1470,13,1152,1152,1001,0]Ai[1470,13,967,1473,1421,0]Ai[1470,13,967,1473,2663,0]Ag[1470,13,967,967,870,0]Aj[1470,13,1468,1468,2153,0]Af[1470,13,937,0,1740,0]Af[1470,13,937,0,2539,0]Ah[1470,13,937,937,1737,0]Ai[1470,13,1154,419,1732,0]Aj[1470,13,1154,1243,2303,0]Ai[1470,13,1154,415,1726,0]Ai[1470,13,1154,975,1820,0]Ai[1470,13,1154,978,1839,0]Aj[1470,13,1154,1388,2316,0]Ai[1470,13,1154,1154,855,0]Aj[1470,13,2323,1241,2140,0]Aj[1470,13,2323,1998,2505,0]Aj[1470,13,2323,1998,2507,0]Aj[1470,13,2323,1998,2628,0]Ai[1470,13,2323,716,1411,0]Ai[1470,13,2323,372,1231,0]Ai[1470,13,2323,984,1767,0]Ai[1470,13,2323,984,1765,0]Af[1470,13,43,43,1724,0]Af[1470,13,43,43,1218,0]Af[1470,13,43,43,1034,0]Ai[1470,13,942,2363,2661,0]Ai[1470,13,942,2283,1829,0]Ai[1470,13,942,2165,2136,0]Ai[1470,13,942,2112,1742,0]Ai[1470,13,942,1457,1399,0]Ai[1470,13,942,1168,1017,0]Ag[1470,13,942,942,861,0]Ah[1470,13,942,883,2498,0]Ah[1470,13,942,938,2618,0]Ah[1470,13,942,938,2648,0]Ah[1470,13,942,938,2354,0]Ah[1470,13,942,938,2620,0]Ai[1470,13,942,1457,2138,0]Ag[1470,13,942,424,384,0]Ah[1470,13,942,342,1822,0]Ah[1470,13,942,592,2144,0]Ah[1470,13,942,839,1771,0]Ai[1470,13,942,1290,2673,0]Ai[1470,13,1137,252,1729,0]Ai[1470,13,1137,702,2149,0]Ai[1470,13,1137,368,1753,0]Ai[1470,13,1133,1997,990,0]Aj[1470,13,1133,1997,1813,0]Aj[1470,13,1133,1997,2514,0]Aj[1470,13,1133,2330,2300,0]Ah[1470,13,1133,939,849,0]Ai[1470,13,1133,939,2535,0]Ai[1470,13,1133,590,1826,0]Aj[1470,13,1133,1163,1011,0]Ag[1470,13,689,689,390,0]Ah[1470,13,689,689,2146,0]Aj[1470,13,1177,1177,2160,0]Aj[1470,13,1177,1177,1235,0]Aj[1470,13,1177,1177,2548,0]Ai[1470,13,1177,1177,872,0]Aj[1470,13,1177,1177,2677,0]Aj[1470,13,1188,1159,2360,0]Ah[1470,13,1188,744,412,0]Ai[1470,13,1188,1188,874,0]Ai[1470,13,1188,1036,985,0]Ai[1470,13,1188,940,2295,0]Ai[1470,13,1188,940,1748,0]Aj[1470,13,1188,1159,2155,0]Aj[1470,13,1188,1282,1744,0]Ai[1470,13,1188,698,1406,0]Ai[1470,13,1188,961,1842,0]Ai[1470,13,1188,961,1021,0]Ai[1470,13,1188,963,1831,0]Ai[1470,13,1188,972,1844,0]Ai[1470,14,1471,593,2500,0]Aj[1470,14,2323,1241,2140,0]Aj[1470,14,2323,1998,2505,0]Ai[1470,13,1471,1140,989,0]Ai[1470,13,1471,1275,379,0]Ai[1470,13,1471,593,2500,0]Ag[1470,13,1152,0,1197,0]Aj[1470,13,1152,1147,1815,0]Aj[1470,13,1152,2168,1817,0]Aj[1470,13,1152,2168,2298,0]Aj[1470,13,1152,2168,1391,0]Aj[1470,13,1152,2168,1836,0]Aj[1470,13,1152,1462,1226,0]Ag[1470,13,1152,0,2546,0]Ag[1470,13,1152,0,2356,0]Aj[1470,13,1152,1791,1761,0]Aj[1470,13,1152,1443,2509,0]Aj[1470,13,1152,1152,1001,0]Ai[1470,13,967,1473,1421,0]Ai[1470,13,967,1473,2663,0]Ag[1470,13,967,967,870,0]Ai[1470,13,1154,415,1726,0]Ai[1470,13,1154,978,1839,0]Aj[1470,13,1154,1388,2316,0]Ai[1470,13,1154,1154,855,0]Aj[1470,13,2323,1241,2140,0]Aj[1470,13,2323,1998,2507,0]Aj[1470,13,2323,1998,2628,0]Ai[1470,13,2323,716,1411,0]Ai[1470,13,2323,372,1231,0]Ai[1470,13,2323,984,1767,0]Ai[1470,13,2323,984,1765,0]Af[1470,13,43,43,1724,0]Af[1470,13,43,43,1218,0]Af[1470,13,43,43,1034,0]Ai[1470,13,942,1457,2138,0]Ag[1470,13,942,424,384,0]Ah[1470,13,942,592,2144,0]Ah[1470,13,942,839,1771,0]Aj[1470,13,1133,1997,1813,0]Aj[1470,13,1133,2330,2300,0]Ai[1470,13,1133,590,1826,0]Aj[1470,13,1133,1163,1011,0]Ai[1470,13,1177,1177,872,0]Ai[1470,13,1188,1036,985,0]Ai[1470,13,1188,940,2295,0]Ai[1470,13,1188,940,1748,0]Aj[1470,13,1188,1159,2155,0]Aj[1470,13,1188,1282,1744,0]Ai[1470,13,1188,698,1406,0]Ai[1470,13,1188,961,1842,0]Ai[1470,13,1188,963,1831,0]Ai[1470,13,1188,972,1844,0]Ai[1470,13,1471,593,2500,0]000Ag[1470,13,1152,0,1197,0]000Aj[1470,13,1152,1147,1815,0]000Aj[1470,13,1152,2168,1817,0]000Aj[1470,13,1152,2168,2298,0]000Aj[1470,13,1152,2168,1391,0]000Aj[1470,13,1152,2168,1836,0]000Aj[1470,13,1152,1462,1226,0]000Ai[1470,13,1154,419,1732,0]000Ai[1470,13,1154,415,1726,0]000Ai[1470,13,1154,978,1839,0]000Aj[1470,13,1154,1388,2316,0]000Ai[1470,13,1154,1154,855,0]000Aj[1470,13,2323,1241,2140,0]000Aj[1470,13,2323,1998,2507,0]000Aj[1470,13,2323,1998,2628,0]000Ai[1470,13,2323,716,1411,0]000Ai[1470,13,2323,372,1231,0]000Ai[1470,13,2323,984,1767,0]000Ai[1470,13,2323,984,1765,0]000Af[1470,13,43,43,1724,0]000Af[1470,13,43,43,1218,0]000Af[1470,13,43,43,1034,0]000Ai[1470,13,942,1457,2138,0]000Aj[1470,13,1188,1282,1744,0]000Ai[1470,13,1188,698,1406,0]000Ai[1470,13,1188,963,1831,0]000Aj[1470,13,1471,1283,1419,0]Ai[1470,13,942,1290,2673,0]Ai[1470,13,1137,252,1729,0]Ai[1470,13,1137,368,1753,0]Aj[1470,13,1188,1159,2360,0]Aj[1470,13,1152,1791,1761,0]Aj[1470,13,1133,1997,1813,0]Aj[1470,13,1133,2330,2300,0]Aj[1470,13,1133,1163,1011,0]Ah[1470,13,942,839,1771,0]Aj[1470,13,1152,1147,1815,0]Ai[1470,13,942,2112,1742,0]Ag[1470,13,942,942,861,0]Aj[1470,13,1152,1152,1001,0]Aj[1470,13,1188,1159,2155,0]Ai[1470,14,1471,593,2500,0]Aj[1470,14,2323,1241,2140,0]Aj[1470,14,2323,1998,2505,0]Aj[1470,13,1471,1283,1419,0]54Ai[1470,14,942,1457,2138,0]Ai[1470,13,1471,1275,379,0]Ai[1470,13,942,1290,2673,0]2Ai[1470,13,942,2363,2614,0]01Ae[1470,5,942,2165,0,0]Ae[1470,5,942,1457,0,0]Af[1470,5,2323,1241,0,0]Af[1470,15,937,0,2539,0]Ad[1470,5,942,592,0,0]Ab[1470,5,689,0,0,0]Ae[1470,5,1137,702,0,0]Ad[1470,18,1775,0,0,0]0Ac[1470,5,1468,0,0,0]Af[1470,5,1188,1159,0,0]Ad[1470,4,937,940,0,0]Ae[1470,8,1188,940,0,0]Ac[1470,5,1177,0,0,0]Ah[1470,15,942,938,2618,0]Ad[1470,10,1177,0,0,0]Ai[1470,13,1471,1140,989,0]Ai[1470,14,1471,1140,989,0]10Aj[1470,13,1188,1159,2155,0]Ai[1470,13,1471,1275,379,0]Aj[1470,13,1152,1152,1202,0]Ag[1470,13,689,689,390,0]Ah[1470,13,689,689,2146,0]Ai[1470,13,1471,1283,388,0]74Ai[1470,13,1471,593,2500,0]Aj[1470,13,1471,1283,1419,0]Ag[1470,13,1152,0,1197,0]6Aj[1470,13,1152,1147,1815,0]Aj[1470,13,1152,2168,1817,0]Aj[1470,13,1152,2168,2298,0]Aj[1470,13,1152,2168,1391,0]Aj[1470,13,1152,2168,1836,0]Aj[1470,13,1152,1462,1226,0]Ag[1470,13,1152,0,2546,0]Ag[1470,13,1152,0,2356,0]Ai[1470,13,1152,974,2351,0]Aj[1470,13,1152,1791,1761,0]Ag[1470,13,1152,0,2517,0]Aj[1470,13,1152,1443,2509,0]Aj[1470,13,1152,1152,1001,0]Ai[1470,13,967,1473,1421,0]Ai[1470,13,967,1473,2663,0]Ag[1470,13,967,967,870,0]Aj[1470,13,1468,1468,2153,0]Af[1470,13,937,0,1740,0]Af[1470,13,937,0,2539,0]Ah[1470,13,937,937,1737,0]Ai[1470,13,1154,419,1732,0]Aj[1470,13,1154,1243,2303,0]Ai[1470,13,1154,415,1726,0]Ai[1470,13,1154,975,1820,0]Ai[1470,13,1154,978,1839,0]Aj[1470,13,1154,1388,2316,0]Ai[1470,13,1154,1154,855,0]Aj[1470,13,2323,1241,2140,0]Aj[1470,13,2323,1998,2505,0]Aj[1470,13,2323,1998,2507,0]Aj[1470,13,2323,1998,2628,0]Ai[1470,13,2323,716,1411,0]Ai[1470,13,2323,372,1231,0]Ai[1470,13,2323,984,1767,0]Ai[1470,13,2323,984,1765,0]Af[1470,13,43,43,1724,0]Af[1470,13,43,43,1218,0]Af[1470,13,43,43,1034,0]Ai[1470,13,942,2363,2661,0]Ai[1470,13,942,2283,1829,0]Ai[1470,13,942,2165,2136,0]Ai[1470,13,942,2112,1742,0]Ai[1470,13,942,1457,1399,0]Ai[1470,13,942,1168,1017,0]Ag[1470,13,942,942,861,0]Ah[1470,13,942,883,2498,0]Ah[1470,13,942,938,2618,0]Ah[1470,13,942,938,2648,0]Ah[1470,13,942,938,2354,0]Ah[1470,13,942,938,2620,0]Ai[1470,13,942,1457,2138,0]Ag[1470,13,942,424,384,0]Ah[1470,13,942,342,1822,0]Ah[1470,13,942,592,2144,0]Ah[1470,13,942,839,1771,0]Ai[1470,13,942,1290,2673,0]Ai[1470,13,1137,252,1729,0]Ai[1470,13,1137,702,2149,0]Ai[1470,13,1137,368,1753,0]Ai[1470,13,1133,1997,990,0]Aj[1470,13,1133,1997,1813,0]Aj[1470,13,1133,1997,2514,0]Aj[1470,13,1133,2330,2300,0]Ah[1470,13,1133,939,849,0]Ai[1470,13,1133,939,2535,0]Ai[1470,13,1133,590,1826,0]Aj[1470,13,1133,1163,1011,0]Ag[1470,13,689,689,390,0]Ah[1470,13,689,689,2146,0]Aj[1470,13,1177,1177,2160,0]Aj[1470,13,1177,1177,1235,0]Aj[1470,13,1177,1177,2548,0]Ai[1470,13,1177,1177,872,0]Aj[1470,13,1177,1177,2677,0]Aj[1470,13,1188,1159,2360,0]Ah[1470,13,1188,744,412,0]Ai[1470,13,1188,1188,874,0]Ai[1470,13,1188,1036,985,0]Ai[1470,13,1188,940,2295,0]Ai[1470,13,1188,940,1748,0]Aj[1470,13,1188,1159,2155,0]Aj[1470,13,1188,1282,1744,0]Ai[1470,13,1188,698,1406,0]Ai[1470,13,1188,961,1842,0]Ai[1470,13,1188,961,1021,0]Ai[1470,13,1188,963,1831,0]Ai[1470,13,1188,972,1844,0]Ai[1470,13,942,2112,1742,0]Ag[1470,13,942,942,861,0]Ai[1470,12,942,2363,2614,0]Ai[1470,13,942,2363,2661,0]Ai[1470,13,942,2283,1829,0]Ai[1470,13,942,1290,2673,0]Aj[1470,13,1133,1997,1813,0]Aj[1470,13,1133,2330,2300,0]Aj[1470,13,1133,1163,1011,0]Ai[1470,13,1152,974,2351,0]Ai[1470,13,1137,252,1729,0]Ai[1470,13,1137,368,1753,0]Ai[1470,13,1154,419,1732,0]Ag[1470,14,967,967,870,0]Aj[1470,14,1152,2168,2298,0]Ai[1470,14,942,1457,2138,0]Aj[1470,13,1152,1152,1001,0]Aj[1470,13,1177,1177,2160,0]Aj[1470,13,1152,1791,1761,0]<;:Ad[1470,4,937,940,0,0]Ae[1470,6,1188,940,0,0]Af[1470,5,1152,2168,0,0]Af[1470,5,1133,2330,0,0]Ag[1470,15,1152,0,2517,0]Af[1470,4,1471,1243,0,0]Af[1470,6,1154,1243,0,0]Af[1470,4,1471,1154,0,0]Ad[1470,10,1154,0,0,0]Ad[1470,18,1775,0,0,0]Ag[1470,15,1152,0,2356,0]1Ad[1470,10,1468,0,0,0]Af[1470,6,1154,1388,0,0]Ag[1470,13,942,942,861,0]Ai[1470,13,942,1240,1200,0]0Ah[1470,13,942,839,1771,0]Ai[1470,13,1137,702,2149,0]Ac[1470,2,1154,0,0,0]Ai[1470,12,942,1240,1200,0]Ag[1470,13,942,424,384,0]Ah[1470,13,942,342,1822,0]Ah[1470,13,942,592,2144,0]6Aj[1470,13,1188,1159,2155,0]Ai[1470,13,1471,1140,989,0]Ai[1470,14,1471,1140,989,0]Af[1470,13,937,0,1740,0]Ai[1470,13,1471,1275,379,0]Aj[1470,13,1471,1283,1419,0];Ai[1470,13,1188,961,1842,0]Aj[1470,13,1188,1159,2360,0]2365Ag[1470,15,1152,0,1197,0]Aj[1470,15,1154,1243,2303,0]Ai[1470,15,1154,415,1726,0]Ae[1470,5,1152,974,0,0]Ad[1470,6,942,938,0,0]Ac[1470,6,1152,0,0,0]Ah[1470,15,1133,939,849,0]Ai[1470,15,1133,939,2535,0]Af[1470,5,1188,1159,0,0]Ai[1470,15,1188,963,1831,0]Ai[1470,13,1471,1140,989,0]0>>Ai[1470,13,1471,593,2500,0]0Ag[1470,13,1152,0,1197,0]0Aj[1470,13,1152,1147,1815,0]0Aj[1470,13,1152,2168,1817,0]0Aj[1470,13,1152,2168,2298,0]0Aj[1470,13,1152,2168,1391,0]0Aj[1470,13,1152,2168,1836,0]0Aj[1470,13,1152,1462,1226,0]0Ag[1470,13,1152,0,2546,0]0Ag[1470,13,1152,0,2356,0]0Aj[1470,13,1152,1791,1761,0]0Aj[1470,13,1152,1443,2509,0]0Aj[1470,13,1152,1152,1001,0]0Ai[1470,13,967,1473,1421,0]0Ai[1470,13,967,1473,2663,0]0Ag[1470,13,967,967,870,0]0Ai[1470,13,1154,415,1726,0]0Ai[1470,13,1154,978,1839,0]0Aj[1470,13,1154,1388,2316,0]0Ai[1470,13,1154,1154,855,0]0Aj[1470,13,2323,1241,2140,0]0Aj[1470,13,2323,1998,2507,0]0Aj[1470,13,2323,1998,2628,0]0Ai[1470,13,2323,716,1411,0]0Ai[1470,13,2323,372,1231,0]0Ai[1470,13,2323,984,1767,0]0Ai[1470,13,2323,984,1765,0]0Af[1470,13,43,43,1724,0]0Af[1470,13,43,43,1218,0]0Af[1470,13,43,43,1034,0]0Ai[1470,13,942,1457,2138,0]0Ag[1470,13,942,424,384,0]0Ah[1470,13,942,592,2144,0]0Ah[1470,13,942,839,1771,0]0Aj[1470,13,1133,1997,1813,0]Aj[1470,13,1133,2330,2300,0]Ai[1470,13,1133,590,1826,0]0Aj[1470,13,1133,1163,1011,0]Ai[1470,13,1177,1177,872,0]0Ai[1470,13,1188,1036,985,0]Ai[1470,13,1188,940,2295,0]0Ai[1470,13,1188,940,1748,0]0Aj[1470,13,1188,1159,2155,0]0Aj[1470,13,1188,1282,1744,0]0Ai[1470,13,1188,698,1406,0]0Ai[1470,13,1188,961,1842,0]0Ai[1470,13,1188,963,1831,0]0Ai[1470,13,1188,972,1844,0]02Ai[1470,14,2323,984,1765,0]Ai[1470,13,1137,252,1729,0]Ai[1470,13,1137,368,1753,0]Aj[1470,13,1152,1152,1001,0]Aj[1470,13,1471,1283,1419,0]Ai[1470,13,1471,1140,989,0]Af[1470,13,937,0,1740,0]0Ag[1470,13,942,942,861,0]Ai[1470,13,1188,1036,985,0]>Ai[1470,13,1188,1188,874,0]0Ah[1470,13,942,839,1771,0]Ai[1470,13,942,1290,2673,0]Ac[1470,7,1468,0,0,0]8Aj[1470,13,1152,2168,1817,0]Ai[1470,14,1133,1997,990,0]Aj[1470,13,1154,1243,2303,0]Ag[1470,13,1152,0,2517,0]:Af[1470,13,937,0,2539,0]Ah[1470,13,937,937,1737,0]Af[1470,13,43,43,1724,0]Af[1470,13,43,43,1218,0]Af[1470,13,43,43,1034,0]Ah[1470,13,942,938,2618,0]Ah[1470,13,942,938,2648,0]Ah[1470,13,942,938,2354,0]Ah[1470,13,942,938,2620,0]Ah[1470,13,1133,939,849,0]Ai[1470,13,1133,939,2535,0]Ai[1470,13,1188,940,2295,0]Ai[1470,13,1188,940,1748,0]Ai[1470,13,1471,1275,379,0]Ad[1470,5,942,883,0,0]Ae[1470,5,1471,593,0,0]Ah[1470,15,1133,939,849,0]Ai[1470,15,1133,939,2535,0]Af[1470,5,2323,1998,0,0]Af[1470,6,2323,1998,0,0]Af[1470,5,1152,1443,0,0]Ad[1470,10,1177,0,0,0]Af[1470,5,1133,1997,0,0]Ac[1470,6,1152,0,0,0]Ab[1470,4,937,0,0,0]Ai[1470,13,1471,1140,989,0]Ai[1470,14,1471,1140,989,0]Ai[1470,14,1133,1997,990,0]Ah[1470,14,942,592,2144,0]Af[1470,7,1133,1134,0,0]43Ai[1470,14,2323,716,1411,0]Ai[1470,14,2323,372,1231,0]Aj[1470,13,1471,1283,1419,0]Aj[1470,13,1152,2168,1817,0]Aj[1470,13,1152,1147,1815,0]0Aj[1470,13,1133,1997,2514,0]Aj[1470,13,1152,1791,1761,0]Ae[1470,6,1133,939,0,0]Ab[1470,6,937,0,0,0]Ad[1470,18,1775,0,0,0]Aj[1470,15,1154,1243,2303,0]Ai[1470,15,1154,415,1726,0]22Ac[1470,5,1152,0,0,0]Ac[1470,5,1177,0,0,0]4Ai[1470,13,1471,1140,989,0]Ai[1470,13,1471,1275,379,0]Ai[1470,13,1471,593,2500,0]Ag[1470,13,1152,0,1197,0]=>Aj[1470,13,1152,2168,2298,0]Aj[1470,13,1152,2168,1391,0]Aj[1470,13,1152,2168,1836,0]Aj[1470,13,1152,1462,1226,0]Ag[1470,13,1152,0,2546,0]Ag[1470,13,1152,0,2356,0]Aj[1470,13,1152,1791,1761,0]Aj[1470,13,1152,1443,2509,0]Aj[1470,13,1152,1152,1001,0]Ai[1470,13,967,1473,1421,0]Ai[1470,13,967,1473,2663,0]Ag[1470,13,967,967,870,0]Ai[1470,13,1154,415,1726,0]Ai[1470,13,1154,978,1839,0]Aj[1470,13,1154,1388,2316,0]Ai[1470,13,1154,1154,855,0]Aj[1470,13,2323,1241,2140,0]Aj[1470,13,2323,1998,2507,0]Aj[1470,13,2323,1998,2628,0]Ai[1470,13,2323,716,1411,0]Ai[1470,13,2323,372,1231,0]Ai[1470,13,2323,984,1767,0]Ai[1470,13,2323,984,1765,0]Af[1470,13,43,43,1724,0]Af[1470,13,43,43,1218,0]Af[1470,13,43,43,1034,0]Ai[1470,13,942,1457,2138,0]Ag[1470,13,942,424,384,0]Ah[1470,13,942,592,2144,0]Ah[1470,13,942,839,1771,0]Aj[1470,13,1133,1997,1813,0]Aj[1470,13,1133,2330,2300,0]Ai[1470,13,1133,590,1826,0]Aj[1470,13,1133,1163,1011,0]Ai[1470,13,1177,1177,872,0]Ai[1470,13,1188,1036,985,0]Ai[1470,13,1188,940,2295,0]Ai[1470,13,1188,940,1748,0]Aj[1470,13,1188,1159,2155,0]Aj[1470,13,1188,1282,1744,0]Ai[1470,13,1188,698,1406,0]Ai[1470,13,1188,961,1842,0]Ai[1470,13,1188,963,1831,0]Ai[1470,13,1188,972,1844,0]Ai[1470,13,1471,1275,379,0]Ai[1470,13,1471,1140,989,0]Ai[1470,14,1471,1140,989,0]Ai[1470,14,1133,1997,990,0]21Ag[1470,13,942,942,861,0]Ai[1470,14,2323,716,1411,0]Ai[1470,14,2323,372,1231,0]Aj[1470,13,1152,1152,1001,0]Ad[1470,18,1775,0,0,0]Af[1470,10,942,2363,0,0]Af[1470,15,937,0,2539,0]Aj[1470,15,2323,1998,2628,0]Ad[1470,6,942,938,0,0]04Aj[1470,15,1154,1243,2303,0]Ai[1470,15,1154,415,1726,0]Ab[1470,8,937,0,0,0]Af[1470,6,2323,1998,0,0]32Ai[1470,15,1133,939,2535,0]09Ah[1470,15,1133,939,849,0]1:;Ai[1470,13,1188,961,1842,0]Aj[1470,13,1471,1283,1419,0]Ah[1470,13,942,342,1822,0]Ah[1470,13,942,592,2144,0]Aj[1470,13,1152,1147,1815,0]Af[1470,7,1133,1134,0,0]Ai[1470,13,1137,702,2149,0]?Ai[1470,15,1188,940,2295,0]>?Ad[1470,18,1775,0,0,0]0Aj[1470,15,1152,1147,1815,0]Ae[1470,7,1133,590,0,0]Ai[1470,13,1133,1997,990,0]Ai[1470,13,942,1457,2138,0]Aj[1470,12,1468,1468,2313,0]Ai[1470,14,942,1168,1017,0]Ae[1470,5,942,2363,0,0]Ae[1470,5,967,1473,0,0]Ai[1470,13,1154,419,1732,0]Ai[1470,13,1471,1275,379,0]Ac[1470,7,1137,0,0,0]Aj[1470,13,1133,1997,2514,0]Aj[1470,13,1152,1147,1815,0]Aj[1470,12,1177,1177,2163,0]Ai[1470,13,1177,1177,872,0]Ae[1470,5,942,1290,0,0]Af[1470,15,937,0,2539,0]0Ac[1470,5,1177,0,0,0]Aj[1470,15,1154,1243,2303,0]Ai[1470,15,1154,415,1726,0]Ai[1470,15,1133,939,2535,0]Ag[1470,13,942,942,861,0]Aj[1470,13,1188,1159,2155,0]Ai[1470,13,1471,1140,989,0]Ai[1470,14,1471,1140,989,0]Ai[1470,12,942,1240,1200,0]Ag[1470,13,942,424,384,0]Ah[1470,13,942,342,1822,0]Ah[1470,13,942,592,2144,0]Ah[1470,13,942,839,1771,0]Ah[1470,13,937,937,1737,0]Aj[1470,13,1152,1791,1761,0]Ad[1470,18,1775,0,0,0]0Aj[1470,13,1152,1147,1815,0]:9Aj[1470,13,1152,1152,1001,0]Ai[1470,13,1152,974,2351,0]Ag[1470,14,1152,0,2546,0]7=22Aj[1470,13,1152,1791,1761,0]5") \ No newline at end of file diff --git a/next/search.index/function/449b35841f93.js b/next/search.index/function/449b35841f93.js new file mode 100644 index 0000000..edd9190 --- /dev/null +++ b/next/search.index/function/449b35841f93.js @@ -0,0 +1 @@ +rd_("Bd[\"{{{MOl{ACHh}}{MOl{ACHh}}}CCl}\",[]]Bb[\"{{{MOl{IEj}}{MOl{IEj}}}CCl}\",[]]Bb[\"{{{MOl{NBn}}{MOl{NBn}}}CCl}\",[]]Bb[\"{{{MOl{NCb}}{MOl{NCb}}}CCl}\",[]]Bd[\"{{{MOl{AAOd}}{MOl{AAOd}}}CCl}\",[]]Bb[\"{{{MOl{JMn}}{MOl{JMn}}}CCl}\",[]]Bb[\"{{{MOl{NEh}}{MOl{NEh}}}CCl}\",[]]Bb[\"{{{MOl{IId}}{MOl{IId}}}CCl}\",[]]Bb[\"{{{MOl{KAj}}{MOl{KAj}}}CCl}\",[]]Bd[\"{{{MOl{ADLn}}{MOl{ADLn}}}CCl}\",[]]Bb[\"{{{MOl{FLl}}{MOl{FLl}}}CCl}\",[]]Bb[\"{{{MOl{MHh}}{MOl{MHh}}}CCl}\",[]]Bb[\"{{{MOl{MGl}}{MOl{MGl}}}CCl}\",[]]Bb[\"{{{MOl{NEn}}{MOl{NEn}}}CCl}\",[]]Bd[\"{{{MOl{ABAh}}{MOl{ABAh}}}CCl}\",[]]Bb[\"{{{MOl{FJn}}{MOl{FJn}}}CCl}\",[]]Bd[\"{{{MOl{A@Kh}}{MOl{A@Kh}}}CCl}\",[]]Bd[\"{{{MOl{ACIf}}{MOl{ACIf}}}CCl}\",[]]Bd[\"{{{MOl{ADHh}}{MOl{ADHh}}}CCl}\",[]]Bb[\"{{{MOl{K@f}}{MOl{K@f}}}CCl}\",[]]Bb[\"{{{MOl{IIn}}{MOl{IIn}}}CCl}\",[]]Bb[\"{{{MOl{MLn}}{MOl{MLn}}}CCl}\",[]]Bb[\"{{{MOl{MLj}}{MOl{MLj}}}CCl}\",[]]Bb[\"{{{MOl{MGh}}{MOl{MGh}}}CCl}\",[]]Bb[\"{{{MOl{IHd}}{MOl{IHd}}}CCl}\",[]]Bb[\"{{{MOl{HAd}}{MOl{HAd}}}CCl}\",[]]Bd[\"{{{MOl{A@Kd}}{MOl{A@Kd}}}CCl}\",[]]Bb[\"{{{MOl{MJ`}}{MOl{MJ`}}}CCl}\",[]]Bb[\"{{{MOl{JOl}}{MOl{JOl}}}CCl}\",[]]Bb[\"{{{MOl{NDn}}{MOl{NDn}}}CCl}\",[]]Bb[\"{{{MOl{NFh}}{MOl{NFh}}}CCl}\",[]]Cm[\"{g{{Ab{ig}}}{}{}{{GOh{ce}}}{{GOh{ce}}}}\",[\"B\",\"E\",\"P\",\"T\"]]000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Cd[\"{{{MOl{AB@d}}{MOl{AAOn}}}{{AC`{{AAn{GMn}}}}}}\",[]]Bi[\"{{{MOl{NFd}}FMd{MOl{BKfGMb}}}A@Mf}\",[]]Cn[\"{g{{AAh{ig}}}{}{}{{GOh{ce}}}{{GOh{ce}}}}\",[\"B\",\"E\",\"P\",\"T\"]]000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Bb[\"{{{MOl{MHh}}{MOl{MHh}}}JOf}\",[]]Be[\"{{{MOl{GKj}}{MOl{BKfMHl}}}GOn}\",[]]Be[\"{{{MOl{BOf}}{MOl{BKfMHl}}}GOn}\",[]]Bf[\"{{{MOl{ACHh}}{MOl{BKfMHl}}}GOn}\",[]]Be[\"{{{MOl{KAf}}{MOl{BKfMHl}}}GOn}\",[]]Ca[\"{{{MOl{IEj}}{MOl{BKfMHl}}}{{H@`{ELhFIl}}}}\",[]]Be[\"{{{MOl{NBn}}{MOl{BKfMHl}}}GOn}\",[]]Be[\"{{{MOl{NCb}}{MOl{BKfMHl}}}GOn}\",[]]Bf[\"{{{MOl{AAOd}}{MOl{BKfMHl}}}GOn}\",[]]Be[\"{{{MOl{JMn}}{MOl{BKfMHl}}}GOn}\",[]]Be[\"{{{MOl{NEh}}{MOl{BKfMHl}}}GOn}\",[]]Be[\"{{{MOl{IId}}{MOl{BKfMHl}}}GOn}\",[]]Bf[\"{{{MOl{ACNd}}{MOl{BKfMHl}}}GOn}\",[]]Bf[\"{{{MOl{ABFh}}{MOl{BKfMHl}}}GOn}\",[]]Bf[\"{{{MOl{ABEn}}{MOl{BKfMHl}}}GOn}\",[]]Be[\"{{{MOl{MLb}}{MOl{BKfMHl}}}GOn}\",[]]Bf[\"{{{MOl{ACJj}}{MOl{BKfMHl}}}GOn}\",[]]0Bf[\"{{{MOl{ACIj}}{MOl{BKfMHl}}}GOn}\",[]]Be[\"{{{MOl{GMb}}{MOl{BKfMHl}}}GOn}\",[]]Be[\"{{{MOl{KAj}}{MOl{BKfMHl}}}GOn}\",[]]Bf[\"{{{MOl{ADLn}}{MOl{BKfMHl}}}GOn}\",[]]Be[\"{{{MOl{FLl}}{MOl{BKfMHl}}}GOn}\",[]]Ca[\"{{{MOl{MIh}}{MOl{BKfMHl}}}{{H@`{ELhFIl}}}}\",[]]0Bf[\"{{{MOl{ACMf}}{MOl{BKfMHl}}}GOn}\",[]]0Be[\"{{{MOl{MIb}}{MOl{BKfMHl}}}GOn}\",[]]0Ca[\"{{{MOl{MHh}}{MOl{BKfMHl}}}{{H@`{ELhFIl}}}}\",[]]Bf[\"{{{MOl{AAOn}}{MOl{BKfMHl}}}GOn}\",[]]Be[\"{{{MOl{MGl}}{MOl{BKfMHl}}}GOn}\",[]]Be[\"{{{MOl{NCh}}{MOl{BKfMHl}}}GOn}\",[]]Be[\"{{{MOl{NEn}}{MOl{BKfMHl}}}GOn}\",[]]Bf[\"{{{MOl{ABAh}}{MOl{BKfMHl}}}GOn}\",[]]Be[\"{{{MOl{FJn}}{MOl{BKfMHl}}}GOn}\",[]]Bf[\"{{{MOl{A@Kh}}{MOl{BKfMHl}}}GOn}\",[]]Bf[\"{{{MOl{ACIb}}{MOl{BKfMHl}}}GOn}\",[]]Bf[\"{{{MOl{ACIf}}{MOl{BKfMHl}}}GOn}\",[]]Bf[\"{{{MOl{ADHh}}{MOl{BKfMHl}}}GOn}\",[]]Be[\"{{{MOl{K@f}}{MOl{BKfMHl}}}GOn}\",[]]Be[\"{{{MOl{IIn}}{MOl{BKfMHl}}}GOn}\",[]]Be[\"{{{MOl{MLn}}{MOl{BKfMHl}}}GOn}\",[]]Be[\"{{{MOl{MLj}}{MOl{BKfMHl}}}GOn}\",[]]Be[\"{{{MOl{MGh}}{MOl{BKfMHl}}}GOn}\",[]]0Be[\"{{{MOl{IHd}}{MOl{BKfMHl}}}GOn}\",[]]0Be[\"{{{MOl{HAd}}{MOl{BKfMHl}}}GOn}\",[]]0Bf[\"{{{MOl{ACHd}}{MOl{BKfMHl}}}GOn}\",[]]Bf[\"{{{MOl{ADGd}}{MOl{BKfMHl}}}GOn}\",[]]0Bf[\"{{{MOl{ADK`}}{MOl{BKfMHl}}}GOn}\",[]]0Bf[\"{{{MOl{ABFd}}{MOl{BKfMHl}}}GOn}\",[]]0Bf[\"{{{MOl{ADGh}}{MOl{BKfMHl}}}GOn}\",[]]0Bf[\"{{{MOl{A@Kd}}{MOl{BKfMHl}}}GOn}\",[]]Cl[\"{{{MOl{{C@`{c}}}}{MOl{BKfMHl}}}GOn{FIj{FI`{CB`}}}}\",[\"P\"]]Be[\"{{{MOl{NCl}}{MOl{BKfMHl}}}GOn}\",[]]Bf[\"{{{MOl{A@L`}}{MOl{BKfMHl}}}GOn}\",[]]Be[\"{{{MOl{MMf}}{MOl{BKfMHl}}}GOn}\",[]]Bf[\"{{{MOl{ACJd}}{MOl{BKfMHl}}}GOn}\",[]]Be[\"{{{MOl{FJb}}{MOl{BKfMHl}}}GOn}\",[]]0Bf[\"{{{MOl{ACLn}}{MOl{BKfMHl}}}GOn}\",[]]0Be[\"{{{MOl{NDd}}{MOl{BKfMHl}}}GOn}\",[]]Bf[\"{{{MOl{A@N`}}{MOl{BKfMHl}}}GOn}\",[]]Be[\"{{{MOl{IJf}}{MOl{BKfMHl}}}GOn}\",[]]Bf[\"{{{MOl{ACNh}}{MOl{BKfMHl}}}GOn}\",[]]Be[\"{{{MOl{FM`}}{MOl{BKfMHl}}}GOn}\",[]]Bf[\"{{{MOl{ADNj}}{MOl{BKfMHl}}}GOn}\",[]]Bf[\"{{{MOl{AANn}}{MOl{BKfMHl}}}GOn}\",[]]0Be[\"{{{MOl{MJh}}{MOl{BKfMHl}}}GOn}\",[]]0Bf[\"{{{MOl{A@Mf}}{MOl{BKfMHl}}}GOn}\",[]]Be[\"{{{MOl{MJ`}}{MOl{BKfMHl}}}GOn}\",[]]Be[\"{{{MOl{JOl}}{MOl{BKfMHl}}}GOn}\",[]]Be[\"{{{MOl{NFd}}{MOl{BKfMHl}}}GOn}\",[]]Be[\"{{{MOl{GOj}}{MOl{BKfMHl}}}GOn}\",[]]Be[\"{{{MOl{NDn}}{MOl{BKfMHl}}}GOn}\",[]]Be[\"{{{MOl{NFh}}{MOl{BKfMHl}}}GOn}\",[]]Co[\"{{{MOl{KAf}}c}{{GNl{{AAl{{FKn{BOf}}}}}}}{{C@d{IHd}}}}\",[\"G\"]]Bh[\"{{{MOl{IFl}}}{{GNl{{AAl{KAf}}}}}}\",[]]Bm[\"{{{MOl{A@N`}}BO`}{{GNl{{MOl{ABFb}}}}}}\",[]]Ah[\"{{{MOl{NFd}}}GJj}\",[]]A`[\"{ADLnJNb}\",[]]0Ch[\"{{cFM`e}BOf{{C@d{IHd}}FIj}{{C@d{HAd}}FIj}}\",[\"G\",\"U\"]]Ae[\"{{JMnNEh}AAOd}\",[]]A`[\"{ACNdMLb}\",[]]o[\"{GKjGMb}\",[]]Ai[\"{{FJnc}MHhAB@d}\",[\"F\"]]n[\"{{}NCh}\",[]]Am[\"{{{AAn{ADFl}}GJj}ADLj}\",[]]Bc[\"{{cBO`BO`}{{NDj{c}}}A@Lh}\",[\"A\"]]Ai[\"{{{ACd{FIf}}}ACHd}\",[]]Bc[\"{c{{C@`{c}}}{{FI`{CB`}}}}\",[\"P\"]]Ad[\"{{GKhH@n}NCl}\",[]]Ae[\"{{GKhH@n}A@L`}\",[]]Bg[\"{{GKhc}MMf{{C@d{{AB`{BNn}}}}}}\",[\"\"]]Ao[\"{cADNb{MGbCBnCCbFN`}}\",[\"R\"]]Ba[\"{{FKjIEj}{{H@`{NBjACLn}}}}\",[]]Am[\"{FKj{{H@`{AAOhACLn}}}}\",[]]Ak[\"{FKj{{H@`{GNfFJb}}}}\",[]]Am[\"{{{IHh{BO`ABFb}}}A@N`}\",[]]o[\"{FKjFMd}\",[]]n[\"{{}NFd}\",[]]o[\"{NBjMLh}\",[]]A`[\"{AAOhIEn}\",[]]o[\"{GNfIEn}\",[]]Ah[\"{{{MOl{IIn}}}MKl}\",[]]o[\"{{}ACIj}\",[]]Bh[\"{{{MOl{MHb}}}{{MOl{{GIf{ABb}}}}}}\",[]]Bh[\"{{{MOl{MKb}}}{{MOl{{GIf{ABb}}}}}}\",[]]Bn[\"{{{MOl{A@Mf}}}{{AAl{c}}}{CBnCCb}}\",[\"Data\"]]A`[\"{A@KdGNl}\",[]]Ak[\"{{{MOl{BKfGMb}}}ELh}\",[]]Al[\"{{{MOl{BKfACHd}}}ELh}\",[]]Db[\"{{C@hcg}c{}{}{{FKh{ce}{{GNn{c}}}}}}\",[\"B\",\"Iterator::Item\",\"F\"]]A`[\"{cc{}}\",[\"T\"]]00000000000000000A`[\"{MKhACJj}\",[]]11111111A`[\"{IGjACMf}\",[]]Ag[\"{{{MLf{`}}}ACMf}\",[]]00A`[\"{MIhACMf}\",[]]A`[\"{FJ`ACMf}\",[]]A`[\"{FJdACMf}\",[]]A`[\"{AANlMIb}\",[]]Ba[\"{{{AAn{{ABAf{ADMb}}}}}MIb}\",[]]A`[\"{ACMfMIb}\",[]]999999A`[\"{NEnABAh}\",[]]A`[\"{MGlABAh}\",[]];o[\"{NEnFJn}\",[]]o[\"{MGlFJn}\",[]]=====Aj[\"{{{MOl{ACMf}}}ADHh}\",[]]>>>>>Ag[\"{{{f{ABEb}}}MGh}\",[]]o[\"{MGfMGh}\",[]]o[\"{NDhMGh}\",[]]o[\"{NDhIHd}\",[]]o[\"{IHbIHd}\",[]]A`[\"{cc{}}\",[\"T\"]]Ag[\"{{{f{A@Kn}}}IHd}\",[]]Af[\"{{{f{NFn}}}HAd}\",[]]o[\"{HAbHAd}\",[]]o[\"{NDhHAd}\",[]]444444Ak[\"{{{MOl{BKfGOb}}}JNn}\",[]]5A`[\"{ACHdFKj}\",[]]A`[\"{AAOhFKj}\",[]]Bi[\"{cFKj{{FI`{{GIf{AAf}}}}CBnCCb}}\",[\"T\"]]o[\"{NBjFKj}\",[]]9A`[\"{A@L`FKj}\",[]]Bk[\"{{{C@`{c}}}FKj{{FI`{CB`}}CBnCCb}}\",[\"P\"]]Be[\"{{{NDj{c}}}FKj{A@LhCBnCCb}}\",[\"A\"]]o[\"{NClFKj}\",[]]o[\"{MMfFKj}\",[]]o[\"{GNfFKj}\",[]]A`[\"{FIfACHd}\",[]]A`[\"{cc{}}\",[\"T\"]]Ai[\"{{{ACd{FIf}}}ACHd}\",[]]1Aa[\"{ADGdADK`}\",[]]2A`[\"{FJhADK`}\",[]]33Aa[\"{ADGdADGh}\",[]]4444444444444o[\"{MIdFJb}\",[]]5A`[\"{ADGdFJb}\",[]]A`[\"{AANjFJb}\",[]]Aa[\"{AANjACLn}\",[]]A`[\"{MIdACLn}\",[]]A`[\"{MIhACLn}\",[]]A`[\"{FJfACLn}\",[]];A`[\"{FJhACLn}\",[]]Aa[\"{ADGdACLn}\",[]]o[\"{GJjNDd}\",[]]>o[\"{JNbNDd}\",[]]???????????Al[\"{cFMd{{C@d{FKj}}}}\",[\"T\"]]A`[\"{cc{}}\",[\"T\"]]0A`[\"{MKhAANn}\",[]]11111111Bl[\"{{{MOl{ACHh}}{MOl{BKfc}}}ELhGNb}\",[\"__H\"]]Bk[\"{{{MOl{IEj}}{MOl{BKfc}}}ELhGNb}\",[\"__H\"]]Bk[\"{{{MOl{NBn}}{MOl{BKfc}}}ELhGNb}\",[\"__H\"]]Bk[\"{{{MOl{NCb}}{MOl{BKfc}}}ELhGNb}\",[\"__H\"]]Bl[\"{{{MOl{AAOd}}{MOl{BKfc}}}ELhGNb}\",[\"__H\"]]Bk[\"{{{MOl{JMn}}{MOl{BKfc}}}ELhGNb}\",[\"__H\"]]Bk[\"{{{MOl{NEh}}{MOl{BKfc}}}ELhGNb}\",[\"__H\"]]Bk[\"{{{MOl{MGl}}{MOl{BKfc}}}ELhGNb}\",[\"__H\"]]Bk[\"{{{MOl{NEn}}{MOl{BKfc}}}ELhGNb}\",[\"__H\"]]Bl[\"{{{MOl{ABAh}}{MOl{BKfc}}}ELhGNb}\",[\"__H\"]]Bk[\"{{{MOl{FJn}}{MOl{BKfc}}}ELhGNb}\",[\"__H\"]]Bl[\"{{{MOl{A@Kh}}{MOl{BKfc}}}ELhGNb}\",[\"__H\"]]Bl[\"{{{MOl{ACIf}}{MOl{BKfc}}}ELhGNb}\",[\"__H\"]]Bk[\"{{{MOl{MGh}}{MOl{BKfc}}}ELhGNb}\",[\"__H\"]]Bk[\"{{{MOl{IHd}}{MOl{BKfc}}}ELhGNb}\",[\"__H\"]]Bk[\"{{{MOl{HAd}}{MOl{BKfc}}}ELhGNb}\",[\"__H\"]]A`[\"{A@K`GNl}\",[]]Aa[\"{{}c{}}\",[\"U\"]]000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Ah[\"{{{MOl{KAf}}}C@h}\",[]]Cg[\"{{{MOl{BKfBOf}}c}{{ND`{C@l}}}{{C@d{MGh}}FIj}}\",[\"C\"]]E`[\"{{{MOl{KAf}}ce}{{ND`{{AAl{{FKn{BOf}}}}}}}{{C@d{IHd}}}{{C@d{MGh}}}}\",[\"G\",\"C\"]]Aa[\"{ACIbACIf}\",[]]Ah[\"{{{MOl{MIh}}}GJj}\",[]]Bh[\"{{{MOl{FKj}}}{{GNl{{MOl{MIl}}}}}}\",[]]A`[\"{GObACJh}\",[]]o[\"{CChGNl}\",[]]Bg[\"{{{MOl{BKfBOf}}CCl}{{ND`{ELh}}}}\",[]]An[\"{{{MOl{BKfGMb}}CCl}ELh}\",[]]Cd[\"{{{MOl{BKfC@h}}}{{GNl{c}}}{}}\",[\"Iterator::Item\"]]Ao[\"{{{MOl{BKfGMb}}FMd}A@Mf}\",[]]o[\"{FMdFMd}\",[]]Bc[\"{{{MOl{A@Mf}}}{{A@Mj{ELh}}}}\",[]]Dh[\"{{{AC`{{MOl{BKfIFd}}}}{MOl{BKfIFj}}}{{CBh{c}}}{}}\",[\"Future::Output\"]]Dh[\"{{{AC`{{MOl{BKfC@l}}}}{MOl{BKfIFj}}}{{CBh{c}}}{}}\",[\"Future::Output\"]]Di[\"{{{AC`{{MOl{BKfA@Ld}}}}{MOl{BKfIFj}}}{{CBh{c}}}{}}\",[\"Future::Output\"]]Ci[\"{{{MOl{BKfADLj}}{MOl{BKf{GIf{AAf}}}}}{{H@b{GJj}}}}\",[]]Dd[\"{{{MOl{BKf{NDj{c}}}}{MOl{BKf{GIf{AAf}}}}}{{H@b{GJj}}}A@Lh}\",[\"A\"]]Ci[\"{{{MOl{BKfACHd}}{MOl{BKf{GIf{AAf}}}}}{{H@b{GJj}}}}\",[]]Ch[\"{{{MOl{BKfNBj}}{MOl{BKf{GIf{AAf}}}}}{{H@b{GJj}}}}\",[]]Ci[\"{{{MOl{BKfAAOh}}{MOl{BKf{GIf{AAf}}}}}{{H@b{GJj}}}}\",[]]Ch[\"{{{MOl{BKfGNf}}{MOl{BKf{GIf{AAf}}}}}{{H@b{GJj}}}}\",[]]Ah[\"{{{MOl{K@f}}}NEb}\",[]]Bh[\"{{{MOl{BKfADLj}}K@j}{{H@b{BOb}}}}\",[]]Cc[\"{{{MOl{BKf{NDj{c}}}}K@j}{{H@b{BOb}}}A@Lh}\",[\"A\"]]Bj[\"{{{MOl{BKfMHb}}K@lH@h}{{H@f{K@n}}}}\",[]]Bj[\"{{{MOl{BKfMKb}}K@lH@h}{{H@f{K@n}}}}\",[]]Bg[\"{{{MOl{BKfNBj}}K@j}{{H@b{BOb}}}}\",[]]Bh[\"{{{MOl{BKfAAOh}}K@j}{{H@b{BOb}}}}\",[]]Bg[\"{{{MOl{BKfGNf}}K@j}{{H@b{BOb}}}}\",[]]Ad[\"{{GKbJNb}GKb}\",[]]Bf[\"{{{MOl{A@Mf}}JNb}{{ABG`{JNb}}}}\",[]]Ak[\"{{{MOl{BKf}}GJj}GJj}\",[]]00000Bb[\"{{{MOl{NFd}}}{{A@Mj{ELh}}}}\",[]]A`[\"{A@KhBO`}\",[]]Ak[\"{{{MOl{BKfGMb}}}ELh}\",[]]o[\"{FMdFMd}\",[]]Bc[\"{{{MOl{A@Mf}}}{{A@Mj{ELh}}}}\",[]]Ah[\"{{{MOl{NFd}}}ELh}\",[]]Am[\"{{{MOl{BKfA@Kd}}}A@Kd}\",[]]Ad[\"{{FMdCCf}FMd}\",[]]Ai[\"{{{MOl{A@Mf}}}CCf}\",[]]o[\"{FMdCCf}\",[]]Aa[\"{{}c{}}\",[\"V\"]]000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A`[\"{A@KdGNl}\",[]]Ah[\"{{{MOl{GKj}}}GKj}\",[]]Ah[\"{{{MOl{BOf}}}BOf}\",[]]Aj[\"{{{MOl{ACHh}}}ACHh}\",[]]Ah[\"{{{MOl{IEj}}}IEj}\",[]]Ah[\"{{{MOl{NBn}}}NBn}\",[]]Ah[\"{{{MOl{NCb}}}NCb}\",[]]Aj[\"{{{MOl{AAOd}}}AAOd}\",[]]Ah[\"{{{MOl{JMn}}}JMn}\",[]]Ah[\"{{{MOl{NEh}}}NEh}\",[]]Ah[\"{{{MOl{IId}}}IId}\",[]]Aj[\"{{{MOl{ACNd}}}ACNd}\",[]]Aj[\"{{{MOl{ABFh}}}ABFh}\",[]]Ah[\"{{{MOl{MLb}}}MLb}\",[]]Aj[\"{{{MOl{ACIj}}}ACIj}\",[]]Ah[\"{{{MOl{GMb}}}GMb}\",[]]Ah[\"{{{MOl{KAj}}}KAj}\",[]]Aj[\"{{{MOl{ADLn}}}ADLn}\",[]]Ah[\"{{{MOl{FLl}}}FLl}\",[]]Ah[\"{{{MOl{MGl}}}MGl}\",[]]Ah[\"{{{MOl{NEn}}}NEn}\",[]]Aj[\"{{{MOl{ABAh}}}ABAh}\",[]]Ah[\"{{{MOl{FJn}}}FJn}\",[]]Aj[\"{{{MOl{A@Kh}}}A@Kh}\",[]]Aj[\"{{{MOl{ACIf}}}ACIf}\",[]]Aj[\"{{{MOl{ADHh}}}ADHh}\",[]]Ah[\"{{{MOl{K@f}}}K@f}\",[]]Ah[\"{{{MOl{IIn}}}IIn}\",[]]Ah[\"{{{MOl{MLn}}}MLn}\",[]]Ah[\"{{{MOl{MLj}}}MLj}\",[]]Ah[\"{{{MOl{MGh}}}MGh}\",[]]Ah[\"{{{MOl{IHd}}}IHd}\",[]]Ah[\"{{{MOl{HAd}}}HAd}\",[]]Aj[\"{{{MOl{A@Kd}}}A@Kd}\",[]]Cf[\"{{{MOl{{C@`{c}}}}}{{C@`{c}}}{FIh{FI`{CB`}}}}\",[\"P\"]]Aj[\"{{{MOl{A@L`}}}A@L`}\",[]]Ah[\"{{{MOl{MMf}}}MMf}\",[]]Ah[\"{{{MOl{NBj}}}NBj}\",[]]Aj[\"{{{MOl{AAOh}}}AAOh}\",[]]Ah[\"{{{MOl{NDd}}}NDd}\",[]]Ah[\"{{{MOl{GNf}}}GNf}\",[]]Ah[\"{{{MOl{FM`}}}FM`}\",[]]Ah[\"{{{MOl{GKb}}}GKb}\",[]]Aj[\"{{{MOl{AANn}}}AANn}\",[]]Ah[\"{{{MOl{MJh}}}MJh}\",[]]Aj[\"{{{MOl{A@Mf}}}A@Mf}\",[]]Ah[\"{{{MOl{MJ`}}}MJ`}\",[]]Ah[\"{{{MOl{JOl}}}JOl}\",[]]Ah[\"{{{MOl{NFd}}}NFd}\",[]]Ah[\"{{{MOl{NDn}}}NDn}\",[]]Ah[\"{{{MOl{NFh}}}NFh}\",[]]o[\"{C@hGJj}\",[]]C`[\"{{{MOl{BOf}}}{{MOl{c}}}{}}\",[\"Deref::Target\"]]C`[\"{{{MOl{GOj}}}{{MOl{c}}}{}}\",[\"Deref::Target\"]]m[\"{A@K`}\",[]]o[\"{FMdFKj}\",[]]Ah[\"{{{MOl{MIh}}}CCl}\",[]]Bd[\"{{{MOl{BKfBOf}}}{{ND`{ELh}}}}\",[]]Ca[\"{{{MOl{KAf}}c}{{ND`{ELh}}}{{C@d{IHd}}}}\",[\"G\"]]Ak[\"{{{MOl{BKfGMb}}}ELh}\",[]]Ad[\"{{FMdMJ`}FMd}\",[]]o[\"{CChMOl}\",[]]o[\"{FMdMJ`}\",[]]o[\"{NFhMJ`}\",[]]o[\"{FMdFMd}\",[]]Bc[\"{{{MOl{A@Mf}}}{{A@Mj{ELh}}}}\",[]]Bb[\"{{{MOl{NFd}}}{{A@Mj{ELh}}}}\",[]]o[\"{JNnMOl}\",[]]An[\"{{}{{MOl{{GIf{NCf}}}}}}\",[]]0Ba[\"{{{MOl{GMb}}}{{MOl{NFd}}}}\",[]]o[\"{CChNDn}\",[]]o[\"{NFhNDn}\",[]]Al[\"{{{MOl{BKfA@Lj}}}ELh}\",[]]Ao[\"{{{MOl{{GIf{AAf}}}}}AAf}\",[]]0Bj[\"{{{MOl{ACJd}}}c{}}\",[\"Stateful::State\"]]A`[\"{A@KdGNl}\",[]]A`[\"{ACHhH@n}\",[]]1Dl[\"{{{MOl{A@Mf}}c}{{A@Mj{ELh}}}{{GMl{CCh}{{GNn{{GNl{GKb}}}}}}CBnCCb}}\",[\"F\"]]2Ak[\"{MOl{{MOl{c}}}{}}\",[\"T\"]]000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A`[\"{A@L`GKh}\",[]]Ah[\"{{{MOl{MIh}}}GJj}\",[]]Ba[\"{{{MOl{GMb}}}{{MOl{GKj}}}}\",[]]Ch[\"{{{MOl{BKfIF`}}}{{H@`{{A@K`{{AAn{A@Lh}}}}ADGd}}}}\",[]]Eb[\"{{{MOl{BKf{C@`{c}}}}}{{H@`{{A@K`{{AAn{A@Lh}}}}ADGd}}}{{FI`{CB`}}CBnCCb}}\",[\"P\"]]Ch[\"{{{MOl{BKfNCl}}}{{H@`{{A@K`{{AAn{A@Lh}}}}ADGd}}}}\",[]]Ci[\"{{{MOl{BKfA@L`}}}{{H@`{{A@K`{{AAn{A@Lh}}}}ADGd}}}}\",[]]Ch[\"{{{MOl{BKfMMf}}}{{H@`{{A@K`{{AAn{A@Lh}}}}ADGd}}}}\",[]]Ac[\"{cMIhIGd}\",[\"T\"]]0Bg[\"{{{MOl{BKfBOf}}CCl}{{ND`{ELh}}}}\",[]]C`[\"{{{MOl{BKfA@Lj}}{MOl{GO`}}}{{H@f{ACHb}}}}\",[]]o[\"{FMdNCh}\",[]]o[\"{JNnJO`}\",[]]o[\"{GObAAn}\",[]]Ai[\"{{{MOl{GOj}}}A@Mf}\",[]]Ah[\"{{{MOl{MIh}}}CCl}\",[]]A`[\"{ADLnAOj}\",[]]o[\"{K@fFIb}\",[]]o[\"{IInFIb}\",[]]o[\"{MLjGNl}\",[]]Bh[\"{{{MOl{MIl}}}{{GNl{{MOl{GOb}}}}}}\",[]]Bh[\"{{{MOl{FKj}}}{{GNl{{MOl{GOb}}}}}}\",[]]A`[\"{ACIbGNl}\",[]]Ca[\"{{{MOl{KAf}}c}{{ND`{ELh}}}{{C@d{IHd}}}}\",[\"G\"]]Bd[\"{{{ABG`{c}}}{{A@Mj{c}}}{}}\",[\"T\"]]Bb[\"{{{MOl{NFd}}}{{A@Mj{ELh}}}}\",[]]Dh[\"{{{MOl{BKfMMf}}{GNl{GJj}}}{{H@`{{`{{JNl{}{{C@f{A@Kd}}}}}}ADGd}}}}\",[]]A`[\"{A@KhMOl}\",[]]o[\"{MLnIHj}\",[]]Bi[\"{{{MOl{ACJj}}}{{GNl{{MOl{FIn}}}}}}\",[]]Bh[\"{{{MOl{MIh}}}{{GNl{{MOl{FIn}}}}}}\",[]]Bi[\"{{{MOl{ACMf}}}{{GNl{{MOl{FIn}}}}}}\",[]]Bh[\"{{{MOl{MIb}}}{{GNl{{MOl{FIn}}}}}}\",[]]Bi[\"{{{MOl{ADGd}}}{{GNl{{MOl{FIn}}}}}}\",[]]Bi[\"{{{MOl{ADK`}}}{{GNl{{MOl{FIn}}}}}}\",[]]Bi[\"{{{MOl{ABFd}}}{{GNl{{MOl{FIn}}}}}}\",[]]Bi[\"{{{MOl{ADGh}}}{{GNl{{MOl{FIn}}}}}}\",[]]Bh[\"{{{MOl{MHb}}}{{MOl{{GIf{FMf}}}}}}\",[]]Bh[\"{{{MOl{MKb}}}{{MOl{{GIf{FMf}}}}}}\",[]]Ad[\"{{FMdAOj}FMd}\",[]]o[\"{CChMOl}\",[]]o[\"{FMdAOj}\",[]]o[\"{NFhAOj}\",[]]A`[\"{A@KdGNl}\",[]]An[\"{{MOl{MOl{c}}}JOf{}}\",[\"K\"]]Ao[\"{{{MOl{BKfGMb}}ACHh}IFd}\",[]]Db[\"{{c{GNl{IHb}}{GNl{MGf}}{MOl{BNn}}}{{AC`{{AAn{GMn}}}}}MGd}\",[\"\"]]Bb[\"{{{MOl{NFd}}}{{GNl{A@Mf}}}}\",[]]o[\"{GObAAn}\",[]]Ah[\"{CCl{{H@d{IFn}}}}\",[]]n[\"{{}GKj}\",[]]n[\"{{}NBn}\",[]]o[\"{{}AAOd}\",[]]n[\"{{}JMn}\",[]]n[\"{{}NEh}\",[]]o[\"{{}ACNd}\",[]]o[\"{{}ABFh}\",[]]o[\"{{}ABEn}\",[]]n[\"{{}MLb}\",[]]o[\"{{}ACIj}\",[]]n[\"{{}GMb}\",[]]o[\"{{}ADLn}\",[]]n[\"{{}FLl}\",[]]n[\"{{}NCh}\",[]]o[\"{{}A@Kd}\",[]]n[\"{{}GKl}\",[]]o[\"{{}ACNh}\",[]]o[\"{{}ADNj}\",[]]n[\"{{}GKb}\",[]]n[\"{{}MJ`}\",[]]n[\"{{}JOl}\",[]]n[\"{{}NFd}\",[]]n[\"{{}NDn}\",[]]n[\"{{}NFh}\",[]]Bd[\"{{{MOl{NFd}}GJj}{{GNl{GOj}}}}\",[]]Ao[\"{{{MOl{BKfGMb}}FMd}A@Mf}\",[]]Bi[\"{{{MOl{ADNb}}}{{MOl{{AAn{MGb}}}}}}\",[]]A`[\"{A@L`MHn}\",[]]Ah[\"{{{MOl{MIh}}}CCl}\",[]]Ah[\"{{{MOl{BOf}}}CCl}\",[]]Ah[\"{{{MOl{JOl}}}CCl}\",[]]1Ah[\"{{{MOl{GMb}}}CCl}\",[]]o[\"{CChMOl}\",[]]o[\"{FMdJOl}\",[]]o[\"{NFhJOl}\",[]]Bb[\"{{{MOl{KAf}}{MOl{FK`}}}ELh}\",[]]Cb[\"{{MIl{MOl{ABEf}}{MOl{FLj}}}{{H@`{MIlFJh}}}}\",[]]A`[\"{A@L`H@n}\",[]]Bf[\"{{ADKd{MOl{ABEl}}}{{H@f{MHb}}}}\",[]]Bn[\"{{{MOl{ACMd}}{MOl{ACI`}}}{{H@f{A@Lj}}}}\",[]]Bf[\"{{ADKd{MOl{ABEl}}}{{H@f{MKb}}}}\",[]]o[\"{MOlHA`}\",[]]000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A`[\"{ACHhHAd}\",[]]Bi[\"{{{MOl{ADFl}}}{{AC`{{AAn{GMn}}}}}}\",[]]Bb[\"{{{MOl{ADLj}}}{{GNl{BOb}}}}\",[]]Bm[\"{{{MOl{{NDj{c}}}}}{{GNl{BOb}}}A@Lh}\",[\"A\"]]Bi[\"{{{MOl{ADNb}}}{{AC`{{AAn{GMn}}}}}}\",[]]Ba[\"{{{MOl{NBj}}}{{GNl{BOb}}}}\",[]]Bb[\"{{{MOl{AAOh}}}{{GNl{BOb}}}}\",[]]Ba[\"{{{MOl{GNf}}}{{GNl{BOb}}}}\",[]]A`[\"{AAOdJMn}\",[]]A`[\"{A@KdGNl}\",[]]Ah[\"{{{MOl{MIh}}}JMl}\",[]]Ae[\"{{GKjACIj}GKj}\",[]]o[\"{GKjGNl}\",[]]3A`[\"{ACHhH@n}\",[]]Am[\"{{{MOl{BKfA@Lj}}}ACIn}\",[]]Cb[\"{{{MOl{BNn}}}{{H@`{NBnc}}}{}}\",[\"FromStr::Err\"]]Bc[\"{{{MOl{A@Mf}}}{{A@Mj{NFh}}}}\",[]]A`[\"{ACHhIHd}\",[]]A`[\"{A@KhIHd}\",[]]A`[\"{ACIbIHd}\",[]]Ah[\"{{{MOl{NFd}}}CCl}\",[]]Bn[\"{{{MOl{BKfFKj}}}{{GNl{{MOl{BKfMIl}}}}}}\",[]]Bf[\"{{{MOl{A@Mf}}GJj}{{A@Mj{ELh}}}}\",[]]Bh[\"{{{MOl{BKfMIl}}}{{H@`{JNnABFd}}}}\",[]]Bh[\"{{{MOl{BKfFKj}}}{{H@`{JNnABFd}}}}\",[]]Ak[\"{{{MOl{BKfMHb}}}JO`}\",[]]Ak[\"{{{MOl{BKfMKb}}}JO`}\",[]]Ad[\"{{GKjIId}GKj}\",[]]o[\"{GKjIId}\",[]]o[\"{CChMOl}\",[]]o[\"{NFhJNb}\",[]]Aa[\"{ABEdABEd}\",[]]Ag[\"{{}{{AAl{KAf}}}}\",[]]o[\"{MLnIHh}\",[]]Aa[\"{ACNdABFh}\",[]]o[\"{FLlKAj}\",[]]Ab[\"{MOlc{}}\",[\"T\"]]0000000000000000000000000000000000000000000000000o[\"{GObBO`}\",[]]Ao[\"{c{{H@`{e}}}{}{}}\",[\"U\",\"T\"]]0000Ak[\"{BJn{{H@`{IEjFJf}}}}\",[]]11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111Aj[\"{{}{{H@`{c}}}{}}\",[\"U\"]]000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Cb[\"{{{AC`{{MOl{BKfc}}}}{MOl{BKfIFj}}}CBh{}}\",[\"F\"]]00Bi[\"{{{AAl{A@N`}}c}KAf{{C@d{HAd}}}}\",[\"U\"]]Ba[\"{{{MOl{BKfNCh}}MHhJNb}ELh}\",[]]Bn[\"{{{MOl{A@Mf}}FJnc}{{A@Mj{ELh}}}AB@d}\",[\"F\"]]Cf[\"{{{MOl{BKfBOf}}}{{MOl{BKfc}}}{}}\",[\"Deref::Target\"]]Ag[\"{{}{{MOl{FLj}}}}\",[]]Bm[\"{{{MOl{ACJ`}}BOb}{{GNl{{AAl{A@Nf}}}}}}\",[]]Bd[\"{{{MOl{IJf}}BOb}{{GNl{FM`}}}}\",[]]Aa[\"{{}c{}}\",[\"I\"]]C`[\"{{{MOl{KAf}}}c{}}\",[\"IntoIterator::IntoIter\"]]Ah[\"{{{MOl{MIh}}}CCl}\",[]]Bh[\"{{FKj{MOl{GN`}}}{{H@`{FKjADGd}}}}\",[]]n[\"{{}NCh}\",[]]Ao[\"{{{MOl{BKfGMb}}FMd}A@Mf}\",[]]o[\"{CChMOl}\",[]]o[\"{NFhJNb}\",[]]Dm[\"{{{AC`{{MOl{BKfADNb}}}}{MOl{BKfIFj}}{MOl{BKfIIj}}}{{CBh{{H@b{ELh}}}}}}\",[]]Ad[\"{{GKjMLb}GKj}\",[]]o[\"{GKjGNl}\",[]]Bk[\"{{{MOl{C@h}}}{{GJh{GJj{GNl{GJj}}}}}}\",[]]A`[\"{A@KdGNl}\",[]]o[\"{MOlH@n}\",[]]00000000000000Ak[\"{{MMf{ACd{H@n}}}MMf}\",[]]o[\"{FMdAAl}\",[]]Bi[\"{{{MOl{NFd}}FKj{MOl{BKfGMb}}}A@Mf}\",[]]Bg[\"{{{MOl{BKf}}}{{MOl{BKfc}}}{}}\",[\"T\"]]000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A`[\"{ACHhGNl}\",[]]A`[\"{A@KhGNl}\",[]]A`[\"{ACIbGNl}\",[]]Ba[\"{{MOl{MOl{BKfc}}}ELh{}}\",[\"T\"]]0000000000000000000000000000000000000000000000000An[\"{{MOl{MOl{c}}}CCl{}}\",[\"K\"]]00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Bn[\"{{{MOl{KAf}}BO`HAb}{{AC`{{AAn{GMn}}}}}}\",[]]Ai[\"{ADNb{{AAn{MGb}}}}\",[]]Ai[\"{{{AAn{MHb}}}ADKd}\",[]]Ai[\"{{{AAn{MKb}}}ADKd}\",[]]Bc[\"{{{MOl{{ABG`{c}}}}}CCl{}}\",[\"T\"]]Ah[\"{{{MOl{MLb}}}BOb}\",[]]Ah[\"{{{MOl{NBj}}}NBj}\",[]]Aj[\"{{{MOl{AAOh}}}AAOh}\",[]]Ah[\"{{{MOl{GNf}}}GNf}\",[]]Bg[\"{{GKhc}MMf{{C@d{{AB`{BNn}}}}}}\",[\"\"]]o[\"{NBnGJj}\",[]]Bn[\"{{{MOl{BKfMIl}}}{{GNl{{MOl{BKfGOb}}}}}}\",[]]Bn[\"{{{MOl{BKfFKj}}}{{GNl{{MOl{BKfGOb}}}}}}\",[]]Ao[\"{{{MOl{BKfGMb}}FKj}A@Mf}\",[]]Bf[\"{{{MOl{A@Mf}}JNb}{{A@Mj{JNb}}}}\",[]]A`[\"{ACHhH@n}\",[]]A`[\"{A@KhMOl}\",[]]A`[\"{ACIbMOl}\",[]]Ak[\"{{{MOl{KAf}}GKj}ELh}\",[]]An[\"{{{MOl{BKfGMb}}GKj}ELh}\",[]]Bf[\"{{{MOl{A@Mf}}AOj}{{A@Mj{ELh}}}}\",[]]A`[\"{A@KdGNl}\",[]]Ce[\"{{ce}BOf{{C@d{IHd}}FIj}{{C@d{HAd}}FIj}}\",[\"G\",\"U\"]]Bo[\"{{{AC`{{MOl{BKfADNb}}}}K@j}{{H@b{ELh}}}}\",[]]2Bo[\"{{{MOl{BKfADFl}}BOb}{{AC`{{AAn{GMn}}}}}}\",[]]0Bo[\"{{{MOl{BKfADNb}}BOb}{{AC`{{AAn{GMn}}}}}}\",[]]n[\"{{}AAf}\",[]]n[\"{{}NEj}\",[]]Ad[\"{{GKjNBn}GKj}\",[]]o[\"{GKjNBn}\",[]]Ad[\"{{GKjNCb}GKj}\",[]]o[\"{GKjNCb}\",[]]Bc[\"{{{MOl{A@Mf}}}{{A@Mj{ELh}}}}\",[]]Ck[\"{{cFM`eGKj}BOf{{C@d{IHd}}FIj}{{C@d{HAd}}FIj}}\",[\"G\",\"U\"]]k[\"{{}}\",[]]00Aa[\"{{}c{}}\",[\"T\"]]000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Ah[\"{{{MOl{MIl}}}CCl}\",[]]Ah[\"{{{MOl{FKj}}}CCl}\",[]]Ai[\"{{{MOl{ADFl}}}CCl}\",[]]Ai[\"{{{MOl{ADLj}}}CCl}\",[]]Bd[\"{{{MOl{{NDj{c}}}}}CClA@Lh}\",[\"A\"]]Ai[\"{{{MOl{ADNb}}}CCl}\",[]]Ah[\"{{{MOl{NBj}}}CCl}\",[]]Ai[\"{{{MOl{AAOh}}}CCl}\",[]]Ah[\"{{{MOl{GNf}}}CCl}\",[]]Ai[\"{{{MOl{ABEn}}}BOb}\",[]]Bd[\"{{{MOl{BKfMHb}}}{{H@f{GO`}}}}\",[]]Bd[\"{{{MOl{BKfMKb}}}{{H@f{GO`}}}}\",[]]Bk[\"{{{MOl{MHh}}{MOl{MHh}}}{{GNl{JOf}}}}\",[]]o[\"{FLlGNl}\",[]]A`[\"{AAOdNEh}\",[]]A`[\"{A@KdGNl}\",[]]An[\"{{{MOl{BKfGMb}}IEj}ELh}\",[]]Ai[\"{{{MOl{A@N`}}}BOb}\",[]]Ah[\"{{{MOl{MLb}}}BOb}\",[]]Bk[\"{{FKjIEj{GNl{GKl}}}{{H@`{NBjACLn}}}}\",[]]Bi[\"{{FKj{GNl{GKl}}}{{H@`{AAOhACLn}}}}\",[]]Bg[\"{{FKj{GNl{GKn}}}{{H@`{GNfFJb}}}}\",[]]n[\"{{}GJj}\",[]]n[\"{{}FNd}\",[]]Bi[\"{{{MOl{BKfFKj}}}{{H@`{A@KdADGh}}}}\",[]]Bk[\"{{{MOl{BKfIF`}}}{{AC`{{AAn{GMn}}}}}}\",[]]0Bk[\"{{{MOl{BKfMMf}}}{{AC`{{AAn{GMn}}}}}}\",[]]Bc[\"{{{MOl{A@Lj}}}{{MOl{ACMd}}}}\",[]]2De[\"{{{MOl{BKf{C@`{c}}}}}{{AC`{{AAn{GMn}}}}}{{FI`{CB`}}CBnCCb}}\",[\"P\"]]Bk[\"{{{MOl{BKfNCl}}}{{AC`{{AAn{GMn}}}}}}\",[]]Bl[\"{{{MOl{BKfA@L`}}}{{AC`{{AAn{GMn}}}}}}\",[]]4Bc[\"{{{MOl{A@Mf}}}{{A@Mj{ELh}}}}\",[]]Ad[\"{{GKjFLl}GKj}\",[]]o[\"{GKjFLl}\",[]]Ak[\"{{NFl{MOl{JNd}}}MIh}\",[]]Ch[\"{{{MOl{BKfBOf}}c}{{ND`{A@Ld}}}{{C@d{MGh}}FIj}}\",[\"C\"]]Ek[\"{{{MOl{KAf}}ce}{{ND`{{GJh{ACHh{AAl{{FKn{BOf}}}}}}}}}{{C@d{IHd}}}{{C@d{MGh}}}}\",[\"G\",\"C\"]]Aj[\"{{{MOl{A@Lj}}}ACHb}\",[]]Dg[\"{{{MOl{NFd}}e}c{}{{GMl{{MOl{BKf{KBj{GOj}}}}}{{GNn{c}}}}}}\",[\"O\",\"F\"]]Bd[\"{{{ABG`{c}}}{{A@Mj{c}}}{}}\",[\"T\"]]Ce[\"{{{MOl{KAf}}IHb{MOl{NG`}}}{{AC`{{AAn{GMn}}}}}}\",[]]Ch[\"{{{MOl{BKfBOf}}H@n{GNl{c}}}ELh{{C@d{MGh}}FIj}}\",[\"C\"]]Ad[\"{{GKjCCl}GKj}\",[]]o[\"{GKjCCl}\",[]]Ai[\"{MOl{{AAn{AEC`}}}}\",[]]Ai[\"{MOl{{AAn{ADHb}}}}\",[]]1001010101100101010110100110101001011001101001101001011001010101101001000100101001011001101010Bb[\"{{{MOl{NFd}}}{{ACd{A@Mf}}}}\",[]]o[\"{MLjGNl}\",[]]Bh[\"{{{MOl{MHb}}}{{GNl{{MOl{FMf}}}}}}\",[]]Bh[\"{{{MOl{MKb}}}{{GNl{{MOl{FMf}}}}}}\",[]]Ao[\"{{{MOl{BKfGMb}}FKj}A@Mf}\",[]]Ch[\"{{{MOl{KAf}}c}{{AAl{{FKn{BOf}}}}}{{C@d{IHd}}}}\",[\"G\"]]Ah[\"{{{MOl{GKj}}}MLb}\",[]]Ak[\"{{NFl{MOl{JNd}}}MIh}\",[]]Ba[\"{{{MOl{MIh}}}{{GNl{MHf}}}}\",[]]Cm[\"{{FKj{MOl{ABEf}}{MOl{FLj}}{MOl{GN`}}}{{H@`{FKjADK`}}}}\",[]]o[\"{GKbGKb}\",[]]Bc[\"{{{MOl{A@Mf}}}{{ABG`{ELh}}}}\",[]]Ak[\"{{FKj{AAl{AAj}}}FMd}\",[]]Ad[\"{{FKjCCf}FMd}\",[]]Ca[\"{{{MOl{BNn}}GKhc}MMf{{C@d{{AB`{BNn}}}}}}\",[\"\"]]D`[\"{{{AC`{{MOl{BKfADNb}}}}{MOl{BKfIFj}}}{{CBh{{H@b{BOb}}}}}}\",[]]Am[\"{{ABEd{AAl{KAf}}}ABEd}\",[]]Df[\"{{{MOl{KAf}}IHb{MOl{{GNl{H@n}}}}{MOl{BNn}}}{{AC`{{AAn{GMn}}}}}}\",[]]o[\"{NCbCCl}\",[]]o[\"{GKlGKn}\",[]]Bb[\"{{{MOl{AAOn}}}{{GNl{MGl}}}}\",[]]Al[\"{MOl{{H@`{H@nACNn}}}}\",[]]00000000000000Ba[\"{{{MOl{BKfBOf}}H@nH@n}ELh}\",[]]Al[\"{{GKj{MOl{ABEf}}}GKj}\",[]]o[\"{GKjMOl}\",[]]o[\"{GKlMOl}\",[]]A`[\"{A@L`GNl}\",[]]o[\"{GJjGKn}\",[]]Ak[\"{{GKj{GNl{JNb}}}GKj}\",[]]o[\"{GKjGNl}\",[]]o[\"{K@fGJj}\",[]]o[\"{IInGJj}\",[]]Cg[\"{{{MOl{KAf}}BO`{ACO`{ADMb}}}{{AC`{{AAn{GMn}}}}}}\",[]]>o[\"{NBnGJj}\",[]]Ah[\"{NBn{{MOl{BNn}}}}\",[]]Dk[\"{{{MOl{BKfACJd}}{MOl{BKfc}}{MOl{BKf{GIf{AAf}}}}}{{H@b{ADKj}}}CBj}\",[\"T\"]]Ah[\"{{{MOl{MLb}}}BOb}\",[]]n[\"{{}IEj}\",[]]n[\"{{}GJj}\",[]]0n[\"{{}JNb}\",[]]Ad[\"{{MOlAAf}ELh}\",[]]0000000000000000000000000000000000000000000000000Ba[\"{{{MOl{BOf}}}{{GNl{MGh}}}}\",[]]Ak[\"{{GKj{MOl{FLj}}}GKj}\",[]]o[\"{GKjMOl}\",[]]o[\"{GKlMOl}\",[]]Ak[\"{{GKj{GNl{JNb}}}GKj}\",[]]o[\"{GKjGNl}\",[]]Al[\"{FKj{{H@`{FKjADGd}}}}\",[]]o[\"{K@fGJj}\",[]]o[\"{IInGJj}\",[]]Ao[\"{{{MOl{BKfGMb}}FKj}A@Mf}\",[]]<bIdbIo0bOk00bOrbWsb[]beq000000000000000000000000000000bid0bor000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bu8cAndcAnycArccBoxcCowcCuecEnd0cErr00cMaxcPincRawcVeccactcaddcand000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ccmpcdcacf32cfmt000000000000000000000000000000000000000000000000000000000000000000000000000000000000cget00chlsci32clencmaxcmincmutcnew0000000000000000000craw000crtp0cruncstrcu32cu64dAutodCall0dCore0dFaildFile0dIntodItemdIter0dJoin0dJsondLazydLivedLoopdMono0dOpusdPassdPathdPlay00dPolldReaddSeekdSenddStopdSyncdTimedUuiddView0dbooldcore0dcues0ddata0ddateddrop0dfiledfolddfrom000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dhash000000000000000dhint0dhttpdinfodinto000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000diterdjoin000dkinddlinedlivedmeta0dmodedmute0dnextdopus0dplay00dpoll00dread00000drtcp0dseek00000000dskip000000dssrcdstop000dtakedunitduuid00dviewdvzip000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dytdleAsRefeBytes0eChildeCloneeDebugeError00000000eEvent000eEveryeFnMuteInput0eMutexeParse00ePause0eProbeeRetry0eShard0eTrack00000eUnpinealbumearrayechildeclone0000000000000000000000000000000000000000000000000ecountederef0eerror0000einput000eis_ioeleave00eloops000emodelepause00eprobeequery0equeue0eready00ereseteretry0escore0esliceestate0estatsestoreetitleetokenetrack0etupleeusizeeutils0evoicefAction0fCancelfClientfConfig0000fCreate000fCryptofDecode0fDriver000fFinitefFnOncefFuturefHandlefHasherfHz8000fMemory0fNoCallfOptionfOutputfPacketfParsed00fPolicyfQueued0fResult0000fSeekTofStereo0fStringfTypeIdfUserId00faction0fartistfborrow000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fcached00fclientfcodecs0fcolumnfconfig0fcreate0000fcryptofcustom0fdeafenfdecodefdriver0fevents00fformat0fhandle0fis_eoffjitterfmemoryfpacket000fparsed00freasonfremovefresultfresumefsearchfserverfshards0fsilentfsource0000000ftracks000fvolume000gBackoffgBitrate0gCatchergCompose0gConnect00gContext0gDecodergDecryptgDelayedgDisplaygDropped0gElapsedgErroredgGeneric0gGuildId00gHashMapgHashSetgHz12000gHz16000gHz24000gHz48000gMixMode0gNotLivegReadBufgRetryIngRtpData0gRtpTypegRuntimegSharder0gWrappedgchannelgcomparegcomposegconnect0gcontextgconvertgcurrentgdecoder0gdefault00000000000000000000000gdequeuegenqueuegget_refghandlergheadersgis_datagis_deafgis_donegis_mute0gloopinggmanagergplaying00gprocessgpromotegrequestgsourcesgtry_new00gtype_id000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000guntimedguser_idhCategoryhChannels0hDurationhExpectedhFinishedhInfinitehInternalhIteratorhMetadata00hNoSenderhOrderinghPanickedhPeriodichPlayMode0hPlayable0hRetrievehRtcpData0hSeekFromhSeekModehSeekedTohSerenity00hSongbird0hStrategy0hTimedOut00hTwilight00hVecDequehWsClosedhadaptershaudiopushbyte_len000000hchannels0hclassifyhdisposalhdisposer0hdurationhendpointhfinalizehfrom_strhget_infohguild_id00his_emptyhlive_muthloop_forhmetadata0000hmix_mode00hposition0hregisterhserenity00hsongbirdhspeakinghstrategy00hto_owned0000000000000000000000000000000000000000000000000htrack_idhtry_from0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000htry_into000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000htry_poll00htwilightiAes256GcmiAsyncReadiCacheHttpiChannelId00iCoreEvent00iDcaReader0iErrorKindiEventData0iFormatteriHeaderMapiIllegalIpiJoinError00iJsonError0iLiveInput0iLoopState0iNoComposeiNotParsediPlayError00iPreparing0iRawReader0iReconnectiRecvErroriRequestediRtpPacket00iScheduler0iSendErroriTxCatcheriVoiceData0iVoiceTick000iYoutubeDl0iadd_event0iconstants0ideref_mutiget_probeiget_shard0iinto_iter0iis_syntaximake_liveinew_localiplay_onlyiplay_time0ipoll_readireferenceischeduler00isize_hintithumbnailito_string00000000000000iuser_argsiuser_datajCompressed0jCryptoMode0jDecodeMode0jDescriptorjEventStore0jHlsRequest0jJoinResult0jLengthHint0jNonZeroU64jRawAdapter0jReadyState0jRtcpPacket00jSampleRate00jTrackEvent00jTrackQueue0jTrackState0jUnexpectedjUserMarkerjVoiceStatejadd_sourcejborrow_mut000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000jchannel_id00jclone_into0000000000000000000000000000000000000000000000000jcompressedjdisconnectjequivalent00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000jinitialisejinto_inner00jis_hung_upjlive_inputjlive_tasksjnew_handle00jnew_searchjnonce_sizejparsed_mut0jplay_inputjseek_asyncjsession_id00jset_config0jset_volumejsource_urljstandalonejstart_seekjstart_timejtry_resume00kAudioStream0kAuxMetadata0kConnectData0kEndpointUrlkGuildMarkerkHttpRequest0kJoinGateway0kMediaSourcekOpusDecoder0kRTP_VERSIONkSAMPLE_RATEkSongbirdKey0kTrackHandle0kTrackResult00kTwilightMap0kUnsupportedkVoiceUpdate0kaudiostreamkcrypto_mode0kdecode_mode00kenable_loopkfrom_configkinto_future00kinto_sample000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000kis_playable0kis_seekable000000klive_mixersknext_packet0kpartial_cmpkraw_adapterkretry_limitksample_rate0kset_bitratekshard_countktotal_taskskwith_config00lCatcherErrorlChannelErrorlControlError00lDecodeConfig0lDecompressed0lDisconnectedlEventContext00lEventHandler00lFRAME_LEN_MSlMaxPerThreadlNonZeroUsizelSILENT_FRAMElSerenityInit0lTrySendErrorlUntimedEvent0laux_metadata000lcodec_paramslcontext_data0lcreate_async0000ldecompressedldisable_loopldriver_retry0linvalid_typeljoin_gateway0llast_decodedlmodify_queuelresult_asynclstate_updatelupdate_stateluse_softclip0mBitsPerSecondmChannelMarkermClientBuildermCodecRegistrymDriverConnect0mFormatOptionsmLiveStatBlock0mMessageSendermMetadataError0mSchedulerMode0mStreamcatcher0mTrackCallback0mUninitialisedmasync_adaptermclone_storage00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000mcurrent_queuemdecoded_voicemdefault_track0menqueue_inputmget_or_insertmget_schedulerminvalid_valuemio_error_kindmmake_playable00mnew_with_datamnew_with_uuidmnew_ytdl_likempoll_completemregister_withmserver_updatemshould_decodemstreamcatchermto_core_eventmtry_to_string00000000000000mupdate_servernAudioBufferRefnChildContainer0nConnectionInfo0nCreatePanicked0nDecoderOptionsnDisconnectData0nDisconnectKind0nDisposalThread0nFinalizeResultnGenericSharder0nOpusCompressor0nProbedMetadatanSchedulerError00ncodec_registry00ncontent_lengthndefault_configndriver_timeout0npayload_offset0nregister_shardnshould_decryptntag_suffix_lennto_request_strntransform_readnworker_threadsoCodecCacheError0oCodecDescriptoroCodecParametersoConnectionError0oDEFAULT_BITRATEoDriverReconnect0oMONO_FRAME_SIZEoSAMPLE_RATE_RAWoSchedulerConfig0oSerenitySharder0oTIMESTEP_LENGTHoTryReserveErroroUnboundedSenderoclone_to_uninit0000000000000000000000000000000000000000000000000ocurrent_channeloformat_registry00ogateway_timeout0omake_live_asyncopayload_end_pad0oplay_only_inputA`AUDIO_FRAME_RATEA`AsyncMediaSource0A`AttemptDiscarded0A`AudioStreamError0A`AuxMetadataError0A`CHILD_BUFFER_LENA`ClientDisconnect0A`CloneableStorageA`ConnectionResult0A`DisconnectReason0A`DriverDisconnect0A`MetadataEncodingA`MetadataTooLargeA`RTP_PROFILE_TYPEA`StreamNotAtStart0A`VOICE_PACKET_MAXA`add_global_eventA`add_with_preloadA`deregister_shardA`new_with_headers0A`payload_overheadA`raw_cost_per_secA`supported_codecsAaCryptoModeInvalidAaInvalidTrackEventAaMakePlayableError0AaMediaSourceStreamAaProtocolViolationAaSTEREO_FRAME_SIZEAaTransformPositionAaUDP_KEEPALIVE_GAPAaXChaCha20Poly1305Aaapply_length_hintAadefault_from_costAafrom_ffprobe_jsonAaregister_songbirdAasupports_backseekAbAsyncAdapterStream0AbExponentialBackoff0AbShardRunnerMessageAbcompute_activationAbcurrent_connectionAbget_codec_registryAbmin_bytes_requiredAbpayload_suffix_lenAbupdate_voice_state0AcAsyncReadOnlySource0AcCryptoInvalidLengthAcInterconnectFailureAcSerenityShardHandle0AcSpeakingStateUpdate0AcUnknownChannelCountAcmake_playable_async0Acpreallocated_tracks0Acshould_create_async0000Acshould_leave_serverAcworker_thread_statsAdMONO_FRAME_BYTE_SIZEAdUDP_KEEPALIVE_GAP_MSAdalgorithm_nonce_sizeAddecode_state_timeout0Adenqueue_with_preloadAdlast_compute_cost_nsAdmove_expensive_tasksAdnew_search_ytdl_likeAdplayout_spike_length0Adregister_from_configAdserenity_from_configAdtwilight_from_configAeCryptoModeUnavailableAeVOICE_GATEWAY_VERSIONAeget_default_schedulerAeplayout_buffer_length0AfCloneDebuggableStorageAfSTEREO_FRAME_BYTE_SIZEAfinitialise_client_dataAfnew_with_uuid_and_dataAfregister_songbird_withAfstandalone_from_configAgbyte_count_to_timestampAgcompressed_cost_per_secAgshould_reconnect_driverAgtimestamp_to_byte_countAhIllegalDiscoveryResponseAhremove_all_global_eventsAisample_count_to_timestampAitimestamp_to_sample_countAlworker_thread_stats_blockingAmregister_songbird_from_config") \ No newline at end of file diff --git a/next/search.index/normalizedName/2e19990ccf39.js b/next/search.index/normalizedName/2e19990ccf39.js new file mode 100644 index 0000000..904f6a6 --- /dev/null +++ b/next/search.index/normalizedName/2e19990ccf39.js @@ -0,0 +1 @@ +rd_("b()b->bidbio0bok00borbwsb[]beq000000000000000000000000000000663333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333bu8candcanycarccboxccowccuecend0cerr00cmaxcpincrawcveccactcadd==============================================================================================ccmpcdcacf32cfmt000000000000000000000000000000000000000000000000000000000000000000000000000000000000cget00chlsci32clen=cmincmutcnew0000000000000000000>>>>crtp0cruncstrcu32cu64dautodcall0dcore0dfaildfile0dintoditemditer0djoin0djsondlazydlivedloopdmono0dopusdpassdpathdplay00dpolldreaddseekdsenddstopdsyncdtimeduuiddview0dbooldcore0dcues0ddata0ddateddrop0dfiledfolddfrom000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dhash000000000000000dhint0dhttpdinfodinto000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000diterdjoin000dkinddlinedlivedmeta0dmodedmute0dnextdopus0dplay00dpoll00dread00000drtcp0dseek00000000dskip000000dssrcdstop000dtakedunitduuid00dviewdvzip000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dytdleasrefebytes0echildecloneedebugeerror00000000eevent000eeveryefnmuteinput0emutexeparse00epause0eprobeeretry0eshard0etrack00000eunpinealbumearrayechildeclone0000000000000000000000000000000000000000000000000ecountederef0eerror0000????disioeleave00eloops000emodelepause00eprobeequery0equeue0eready00ereseteretry0escore0esliceestate0estatsestoreetitleetokenetrack0etupleeusizeeutils0evoicefaction0fcancelfclientfconfig0000fcreate000fcryptofdecode0fdriver000ffiniteffnonceffuturefhandlefhasherfhz8000fmemory0fnocallfoptionfoutputfpacketfparsed00fpolicyfqueued0fresult0000fseektofstereo0fstringftypeidfuserid00faction0fartistfborrow000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fcached00fclientfcodecs0fcolumnfconfig0fcreate0000fcryptofcustom0fdeafenfdecodefdriver0fevents00fformat0fhandle0eiseoffjitterfmemoryfpacket000fparsed00freasonfremovefresultfresumefsearchfserverfshards0fsilentfsource0000000ftracks000fvolume000gbackoffgbitrate0gcatchergcompose0gconnect00gcontext0gdecodergdecryptgdelayedgdisplaygdropped0gelapsedgerroredggeneric0gguildid00ghashmapghashsetghz12000ghz16000ghz24000ghz48000gmixmode0gnotlivegreadbufgretryingrtpdata0grtptypegruntimegsharder0gwrappedgchannelgcomparegcomposegconnect0gcontextgconvertgcurrentgdecoder0gdefault00000000000000000000000gdequeuegenqueuefgetrefghandlergheadersfisdatafisdeaffisdonefismute0gloopinggmanagergplaying00gprocessgpromotegrequestgsourcesftrynew00ftypeid000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000guntimedfuseridhcategoryhchannels0hdurationhexpectedhfinishedhinfinitehinternalhiteratorhmetadata00hnosenderhorderinghpanickedhperiodichplaymode0hplayable0hretrievehrtcpdata0hseekfromhseekmodehseekedtohserenity00hsongbird0hstrategy0htimedout00htwilight00hvecdequehwsclosedhadaptershaudiopusgbytelen000000hchannels0hclassifyhdisposalhdisposer0hdurationhendpointhfinalizegfromstrggetinfogguildid00gisemptyglivemutgloopforhmetadata0000gmixmode00hposition0hregisterhserenity00hsongbirdhspeakinghstrategy00gtoowned0000000000000000000000000000000000000000000000000gtrackidgtryfrom0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000gtryinto000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000gtrypoll00htwilightiaes256gcmiasyncreadicachehttpichannelid00icoreevent00idcareader0ierrorkindieventdata0iformatteriheadermapiillegalipijoinerror00ijsonerror0iliveinput0iloopstate0inocomposeinotparsediplayerror00ipreparing0irawreader0ireconnectirecverrorirequestedirtppacket00ischeduler0isenderroritxcatcherivoicedata0ivoicetick000iyoutubedl0haddevent0iconstants0hderefmuthgetprobehgetshard0hintoiter0hissyntaxhmakelivehnewlocalhplayonlyhplaytime0hpollreadireferenceischeduler00hsizehintithumbnailhtostring00000000000000huserargshuserdatajcompressed0jcryptomode0jdecodemode0jdescriptorjeventstore0jhlsrequest0jjoinresult0jlengthhint0jnonzerou64jrawadapter0jreadystate0jrtcppacket00jsamplerate00jtrackevent00jtrackqueue0jtrackstate0junexpectedjusermarkerjvoicestateiaddsourceiborrowmut000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ichannelid00icloneinto0000000000000000000000000000000000000000000000000jcompressedjdisconnectjequivalent00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000jinitialiseiintoinner00hishungupiliveinputilivetasksinewhandle00inewsearchinoncesizeiparsedmut0iplayinputiseekasyncisessionid00isetconfig0isetvolumeisourceurljstandaloneistartseekistarttimeitryresume00kaudiostream0kauxmetadata0kconnectdata0kendpointurlkguildmarkerkhttprequest0kjoingateway0kmediasourcekopusdecoder0jrtpversionjsamplerateksongbirdkey0ktrackhandle0ktrackresult00ktwilightmap0kunsupportedkvoiceupdate0kaudiostreamjcryptomode0jdecodemode00jenableloopjfromconfigjintofuture00jintosample000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000jisplayable0jisseekable000000jlivemixersjnextpacket0jpartialcmpjrawadapterjretrylimitjsamplerate0jsetbitratejshardcountjtotaltasksjwithconfig00lcatchererrorlchannelerrorlcontrolerror00ldecodeconfig0ldecompressed0ldisconnectedleventcontext00leventhandler00jframelenmslmaxperthreadlnonzerousizeksilentframelserenityinit0ltrysenderrorluntimedevent0kauxmetadata000kcodecparamskcontextdata0kcreateasync0000>kdisableloopkdriverretry0kinvalidtypekjoingateway0klastdecodedkmodifyqueuekresultasynckstateupdatekupdatestatekusesoftclip0mbitspersecondmchannelmarkermclientbuildermcodecregistrymdriverconnect0mformatoptionsmlivestatblock0mmessagesendermmetadataerror0mschedulermode0mstreamcatcher0mtrackcallback0muninitialisedlasyncadapterlclonestorage00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000lcurrentqueueldecodedvoiceldefaulttrack0lenqueueinputkgetorinsertlgetschedulerlinvalidvaluekioerrorkindlmakeplayable00knewwithdataknewwithuuidknewytdllikelpollcompletelregisterwithlserverupdatelshoulddecodemstreamcatcherktocoreeventktrytostring00000000000000lupdateservernaudiobufferrefnchildcontainer0nconnectioninfo0ncreatepanicked0ndecoderoptionsndisconnectdata0ndisconnectkind0ndisposalthread0nfinalizeresultngenericsharder0nopuscompressor0nprobedmetadatanschedulererror00mcodecregistry00mcontentlengthmdefaultconfigmdrivertimeout0mpayloadoffset0mregistershardmshoulddecryptltagsuffixlenltorequeststrmtransformreadmworkerthreadsocodeccacheerror0ocodecdescriptorocodecparametersoconnectionerror0ndefaultbitrateodriverreconnect0mmonoframesizemsampleraterawoschedulerconfig0oserenitysharder0ntimesteplengthotryreserveerrorounboundedsendermclonetouninit0000000000000000000000000000000000000000000000000ncurrentchannelnformatregistry00ngatewaytimeout0mmakeliveasyncmpayloadendpad0mplayonlyinputnaudioframerateA`asyncmediasource0A`attemptdiscarded0A`audiostreamerror0A`auxmetadataerror0nchildbufferlenA`clientdisconnect0A`cloneablestorageA`connectionresult0A`disconnectreason0A`driverdisconnect0A`metadataencodingA`metadatatoolargenrtpprofiletypeA`streamnotatstart0nvoicepacketmaxnaddglobaleventnaddwithpreloadoderegistershardnnewwithheaders0opayloadoverheadmrawcostpersecosupportedcodecsAacryptomodeinvalidAainvalidtrackeventAamakeplayableerror0AamediasourcestreamAaprotocolviolationostereoframesizeAatransformpositionoudpkeepalivegapAaxchacha20poly1305oapplylengthhintodefaultfromcostofromffprobejsonA`registersongbirdA`supportsbackseekAbasyncadapterstream0Abexponentialbackoff0AbshardrunnermessageAacomputeactivationAacurrentconnectionA`getcodecregistryA`minbytesrequiredA`payloadsuffixlenA`updatevoicestate0Acasyncreadonlysource0AccryptoinvalidlengthAcinterconnectfailureAcserenityshardhandle0Acspeakingstateupdate0AcunknownchannelcountAamakeplayableasync0Abpreallocatedtracks0Aashouldcreateasync0000AashouldleaveserverAaworkerthreadstatsAamonoframebytesizeAaudpkeepalivegapmsAbalgorithmnoncesizeAbdecodestatetimeout0AbenqueuewithpreloadAalastcomputecostnsAbmoveexpensivetasksAanewsearchytdllikeAbplayoutspikelength0AbregisterfromconfigAbserenityfromconfigAbtwilightfromconfigAecryptomodeunavailableAcvoicegatewayversionAcgetdefaultschedulerAcplayoutbufferlength0AfclonedebuggablestorageAcstereoframebytesizeAdinitialiseclientdataAbnewwithuuidanddataAdregistersongbirdwithAdstandalonefromconfigAdbytecounttotimestampAdcompressedcostpersecAeshouldreconnectdriverAdtimestamptobytecountAhillegaldiscoveryresponseAeremoveallglobaleventsAfsamplecounttotimestampAftimestamptosamplecountAiworkerthreadstatsblockingAjregistersongbirdfromconfig") \ No newline at end of file diff --git a/next/search.index/path/634537828d5e.js b/next/search.index/path/634537828d5e.js new file mode 100644 index 0000000..3417c24 --- /dev/null +++ b/next/search.index/path/634537828d5e.js @@ -0,0 +1 @@ +rd_("f[1,\"\"]0Bm[5,\"twilight_model::id\",\"twilight_model::id\"]Eg[5,\"tower_http::follow_redirect::policy::or\",\"tower_http::follow_redirect::policy::or\"]2n[2,\"songbird\"]3Ei[5,\"tower_http::follow_redirect::policy::and\",\"tower_http::follow_redirect::policy::and\"]Al[10,\"core::any\",\"core::any\"]Ao[5,\"alloc::sync\",\"alloc::sync\"]Ba[5,\"alloc::boxed\",\"alloc::boxed\"]Bc[6,\"alloc::borrow\",\"alloc::borrow\"]Cg[5,\"symphonia_core::formats\",\"symphonia_core::formats\"]Ak[5,\"core::pin\",\"core::pin\"]Am[5,\"alloc::vec\",\"alloc::vec\"]Am[2,\"songbird::input::codecs\"]Settings

All

Rustdoc settings

Back
\ No newline at end of file diff --git a/next/songbird/all.html b/next/songbird/all.html new file mode 100644 index 0000000..93df9ab --- /dev/null +++ b/next/songbird/all.html @@ -0,0 +1 @@ +List of all items in this crate

All

List of all items

Structs

Enums

Traits

Functions

Type Aliases

Constants

\ No newline at end of file diff --git a/next/songbird/config/struct.Config.html b/next/songbird/config/struct.Config.html new file mode 100644 index 0000000..d62264a --- /dev/null +++ b/next/songbird/config/struct.Config.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../songbird/struct.Config.html...

+ + + \ No newline at end of file diff --git a/next/songbird/constants/constant.AUDIO_FRAME_RATE.html b/next/songbird/constants/constant.AUDIO_FRAME_RATE.html new file mode 100644 index 0000000..1c47ace --- /dev/null +++ b/next/songbird/constants/constant.AUDIO_FRAME_RATE.html @@ -0,0 +1,2 @@ +AUDIO_FRAME_RATE in songbird::constants - Rust

AUDIO_FRAME_RATE

Constant AUDIO_FRAME_RATE 

Source
pub const AUDIO_FRAME_RATE: usize = 50;
Expand description

Number of audio frames/packets to be sent per second.

+
\ No newline at end of file diff --git a/next/songbird/constants/constant.CHILD_BUFFER_LEN.html b/next/songbird/constants/constant.CHILD_BUFFER_LEN.html new file mode 100644 index 0000000..ecbacb9 --- /dev/null +++ b/next/songbird/constants/constant.CHILD_BUFFER_LEN.html @@ -0,0 +1,2 @@ +CHILD_BUFFER_LEN in songbird::constants - Rust

CHILD_BUFFER_LEN

Constant CHILD_BUFFER_LEN 

Source
pub const CHILD_BUFFER_LEN: usize = _; // 25usize
Expand description

Maximum number of audio frames/packets to be sent per second to be buffered.

+
\ No newline at end of file diff --git a/next/songbird/constants/constant.DEFAULT_BITRATE.html b/next/songbird/constants/constant.DEFAULT_BITRATE.html new file mode 100644 index 0000000..d8c0891 --- /dev/null +++ b/next/songbird/constants/constant.DEFAULT_BITRATE.html @@ -0,0 +1,2 @@ +DEFAULT_BITRATE in songbird::constants - Rust

DEFAULT_BITRATE

Constant DEFAULT_BITRATE 

Source
pub const DEFAULT_BITRATE: Bitrate;
Expand description

Default bitrate for audio.

+
\ No newline at end of file diff --git a/next/songbird/constants/constant.FRAME_LEN_MS.html b/next/songbird/constants/constant.FRAME_LEN_MS.html new file mode 100644 index 0000000..e725b38 --- /dev/null +++ b/next/songbird/constants/constant.FRAME_LEN_MS.html @@ -0,0 +1,2 @@ +FRAME_LEN_MS in songbird::constants - Rust

FRAME_LEN_MS

Constant FRAME_LEN_MS 

Source
pub const FRAME_LEN_MS: usize = _; // 20usize
Expand description

Length (in milliseconds) of any audio frame.

+
\ No newline at end of file diff --git a/next/songbird/constants/constant.MONO_FRAME_BYTE_SIZE.html b/next/songbird/constants/constant.MONO_FRAME_BYTE_SIZE.html new file mode 100644 index 0000000..92f2666 --- /dev/null +++ b/next/songbird/constants/constant.MONO_FRAME_BYTE_SIZE.html @@ -0,0 +1,2 @@ +MONO_FRAME_BYTE_SIZE in songbird::constants - Rust

MONO_FRAME_BYTE_SIZE

Constant MONO_FRAME_BYTE_SIZE 

Source
pub const MONO_FRAME_BYTE_SIZE: usize = _; // 3_840usize
Expand description

Number of bytes in one complete frame of raw f32-encoded mono audio.

+
\ No newline at end of file diff --git a/next/songbird/constants/constant.MONO_FRAME_SIZE.html b/next/songbird/constants/constant.MONO_FRAME_SIZE.html new file mode 100644 index 0000000..f66b517 --- /dev/null +++ b/next/songbird/constants/constant.MONO_FRAME_SIZE.html @@ -0,0 +1,3 @@ +MONO_FRAME_SIZE in songbird::constants - Rust

MONO_FRAME_SIZE

Constant MONO_FRAME_SIZE 

Source
pub const MONO_FRAME_SIZE: usize = _; // 960usize
Expand description

Number of samples in one complete frame of audio per channel.

+

This is equally the number of stereo (joint) samples in an audio frame.

+
\ No newline at end of file diff --git a/next/songbird/constants/constant.RTP_PROFILE_TYPE.html b/next/songbird/constants/constant.RTP_PROFILE_TYPE.html new file mode 100644 index 0000000..124f6c4 --- /dev/null +++ b/next/songbird/constants/constant.RTP_PROFILE_TYPE.html @@ -0,0 +1,2 @@ +RTP_PROFILE_TYPE in songbird::constants - Rust

RTP_PROFILE_TYPE

Constant RTP_PROFILE_TYPE 

Source
pub const RTP_PROFILE_TYPE: RtpType;
Expand description

Profile type used by Discord’s Opus audio traffic.

+
\ No newline at end of file diff --git a/next/songbird/constants/constant.RTP_VERSION.html b/next/songbird/constants/constant.RTP_VERSION.html new file mode 100644 index 0000000..5f98cb1 --- /dev/null +++ b/next/songbird/constants/constant.RTP_VERSION.html @@ -0,0 +1,2 @@ +RTP_VERSION in songbird::constants - Rust

RTP_VERSION

Constant RTP_VERSION 

Source
pub const RTP_VERSION: u8 = 2;
Expand description

The one (and only) RTP version.

+
\ No newline at end of file diff --git a/next/songbird/constants/constant.SAMPLE_RATE.html b/next/songbird/constants/constant.SAMPLE_RATE.html new file mode 100644 index 0000000..2637716 --- /dev/null +++ b/next/songbird/constants/constant.SAMPLE_RATE.html @@ -0,0 +1,2 @@ +SAMPLE_RATE in songbird::constants - Rust

SAMPLE_RATE

Constant SAMPLE_RATE 

Source
pub const SAMPLE_RATE: SampleRate;
Expand description

Sample rate of audio to be sent to Discord.

+
\ No newline at end of file diff --git a/next/songbird/constants/constant.SAMPLE_RATE_RAW.html b/next/songbird/constants/constant.SAMPLE_RATE_RAW.html new file mode 100644 index 0000000..4f080ca --- /dev/null +++ b/next/songbird/constants/constant.SAMPLE_RATE_RAW.html @@ -0,0 +1,2 @@ +SAMPLE_RATE_RAW in songbird::constants - Rust

SAMPLE_RATE_RAW

Constant SAMPLE_RATE_RAW 

Source
pub const SAMPLE_RATE_RAW: usize = 48_000;
Expand description

Sample rate of audio to be sent to Discord.

+
\ No newline at end of file diff --git a/next/songbird/constants/constant.SILENT_FRAME.html b/next/songbird/constants/constant.SILENT_FRAME.html new file mode 100644 index 0000000..fdbde56 --- /dev/null +++ b/next/songbird/constants/constant.SILENT_FRAME.html @@ -0,0 +1,2 @@ +SILENT_FRAME in songbird::constants - Rust

SILENT_FRAME

Constant SILENT_FRAME 

Source
pub const SILENT_FRAME: [u8; 3];
Expand description

Opus silent frame, used to signal speech start and end (and prevent audio glitching).

+
\ No newline at end of file diff --git a/next/songbird/constants/constant.STEREO_FRAME_BYTE_SIZE.html b/next/songbird/constants/constant.STEREO_FRAME_BYTE_SIZE.html new file mode 100644 index 0000000..21c3884 --- /dev/null +++ b/next/songbird/constants/constant.STEREO_FRAME_BYTE_SIZE.html @@ -0,0 +1,2 @@ +STEREO_FRAME_BYTE_SIZE in songbird::constants - Rust

STEREO_FRAME_BYTE_SIZE

Constant STEREO_FRAME_BYTE_SIZE 

Source
pub const STEREO_FRAME_BYTE_SIZE: usize = _; // 7_680usize
Expand description

Number of bytes in one complete frame of raw f32-encoded stereo audio.

+
\ No newline at end of file diff --git a/next/songbird/constants/constant.STEREO_FRAME_SIZE.html b/next/songbird/constants/constant.STEREO_FRAME_SIZE.html new file mode 100644 index 0000000..8485df3 --- /dev/null +++ b/next/songbird/constants/constant.STEREO_FRAME_SIZE.html @@ -0,0 +1,2 @@ +STEREO_FRAME_SIZE in songbird::constants - Rust

STEREO_FRAME_SIZE

Constant STEREO_FRAME_SIZE 

Source
pub const STEREO_FRAME_SIZE: usize = _; // 1_920usize
Expand description

Number of individual samples in one complete frame of stereo audio.

+
\ No newline at end of file diff --git a/next/songbird/constants/constant.TIMESTEP_LENGTH.html b/next/songbird/constants/constant.TIMESTEP_LENGTH.html new file mode 100644 index 0000000..95a4e23 --- /dev/null +++ b/next/songbird/constants/constant.TIMESTEP_LENGTH.html @@ -0,0 +1,2 @@ +TIMESTEP_LENGTH in songbird::constants - Rust

TIMESTEP_LENGTH

Constant TIMESTEP_LENGTH 

Source
pub const TIMESTEP_LENGTH: Duration;
Expand description

Length of time between any two audio frames.

+
\ No newline at end of file diff --git a/next/songbird/constants/constant.UDP_KEEPALIVE_GAP.html b/next/songbird/constants/constant.UDP_KEEPALIVE_GAP.html new file mode 100644 index 0000000..fed7c36 --- /dev/null +++ b/next/songbird/constants/constant.UDP_KEEPALIVE_GAP.html @@ -0,0 +1,4 @@ +UDP_KEEPALIVE_GAP in songbird::constants - Rust

UDP_KEEPALIVE_GAP

Constant UDP_KEEPALIVE_GAP 

Source
pub const UDP_KEEPALIVE_GAP: Duration;
Expand description

Type-converted delay between sends of UDP keepalive frames.

+

Passive monitoring of Discord itself shows that these fire every 5 seconds +irrespective of outgoing UDP traffic.

+
\ No newline at end of file diff --git a/next/songbird/constants/constant.UDP_KEEPALIVE_GAP_MS.html b/next/songbird/constants/constant.UDP_KEEPALIVE_GAP_MS.html new file mode 100644 index 0000000..c11fd5d --- /dev/null +++ b/next/songbird/constants/constant.UDP_KEEPALIVE_GAP_MS.html @@ -0,0 +1,4 @@ +UDP_KEEPALIVE_GAP_MS in songbird::constants - Rust

UDP_KEEPALIVE_GAP_MS

Constant UDP_KEEPALIVE_GAP_MS 

Source
pub const UDP_KEEPALIVE_GAP_MS: u64 = 5_000;
Expand description

Delay between sends of UDP keepalive frames.

+

Passive monitoring of Discord itself shows that these fire every 5 seconds +irrespective of outgoing UDP traffic.

+
\ No newline at end of file diff --git a/next/songbird/constants/constant.VOICE_GATEWAY_VERSION.html b/next/songbird/constants/constant.VOICE_GATEWAY_VERSION.html new file mode 100644 index 0000000..c070f5b --- /dev/null +++ b/next/songbird/constants/constant.VOICE_GATEWAY_VERSION.html @@ -0,0 +1,2 @@ +VOICE_GATEWAY_VERSION in songbird::constants - Rust

VOICE_GATEWAY_VERSION

Constant VOICE_GATEWAY_VERSION 

Source
pub const VOICE_GATEWAY_VERSION: u8 = crate::model::constants::GATEWAY_VERSION; // 4u8
Expand description

The voice gateway version used by the library.

+
\ No newline at end of file diff --git a/next/songbird/constants/constant.VOICE_PACKET_MAX.html b/next/songbird/constants/constant.VOICE_PACKET_MAX.html new file mode 100644 index 0000000..b6a602f --- /dev/null +++ b/next/songbird/constants/constant.VOICE_PACKET_MAX.html @@ -0,0 +1,3 @@ +VOICE_PACKET_MAX in songbird::constants - Rust

VOICE_PACKET_MAX

Constant VOICE_PACKET_MAX 

Source
pub const VOICE_PACKET_MAX: usize = 1460;
Expand description

Maximum packet size for a voice packet.

+

Set a safe amount below the Ethernet MTU to avoid fragmentation/rejection.

+
\ No newline at end of file diff --git a/next/songbird/constants/index.html b/next/songbird/constants/index.html new file mode 100644 index 0000000..be31cd3 --- /dev/null +++ b/next/songbird/constants/index.html @@ -0,0 +1,2 @@ +songbird::constants - Rust

Module constants

Module constants 

Source
Expand description

Constants affecting driver function and API handling.

+

Constants§

AUDIO_FRAME_RATE
Number of audio frames/packets to be sent per second.
CHILD_BUFFER_LEN
Maximum number of audio frames/packets to be sent per second to be buffered.
DEFAULT_BITRATE
Default bitrate for audio.
FRAME_LEN_MS
Length (in milliseconds) of any audio frame.
MONO_FRAME_BYTE_SIZE
Number of bytes in one complete frame of raw f32-encoded mono audio.
MONO_FRAME_SIZE
Number of samples in one complete frame of audio per channel.
RTP_PROFILE_TYPE
Profile type used by Discord’s Opus audio traffic.
RTP_VERSION
The one (and only) RTP version.
SAMPLE_RATE
Sample rate of audio to be sent to Discord.
SAMPLE_RATE_RAW
Sample rate of audio to be sent to Discord.
SILENT_FRAME
Opus silent frame, used to signal speech start and end (and prevent audio glitching).
STEREO_FRAME_BYTE_SIZE
Number of bytes in one complete frame of raw f32-encoded stereo audio.
STEREO_FRAME_SIZE
Number of individual samples in one complete frame of stereo audio.
TIMESTEP_LENGTH
Length of time between any two audio frames.
UDP_KEEPALIVE_GAP
Type-converted delay between sends of UDP keepalive frames.
UDP_KEEPALIVE_GAP_MS
Delay between sends of UDP keepalive frames.
VOICE_GATEWAY_VERSION
The voice gateway version used by the library.
VOICE_PACKET_MAX
Maximum packet size for a voice packet.
\ No newline at end of file diff --git a/next/songbird/constants/sidebar-items.js b/next/songbird/constants/sidebar-items.js new file mode 100644 index 0000000..a6a6ccc --- /dev/null +++ b/next/songbird/constants/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"constant":["AUDIO_FRAME_RATE","CHILD_BUFFER_LEN","DEFAULT_BITRATE","FRAME_LEN_MS","MONO_FRAME_BYTE_SIZE","MONO_FRAME_SIZE","RTP_PROFILE_TYPE","RTP_VERSION","SAMPLE_RATE","SAMPLE_RATE_RAW","SILENT_FRAME","STEREO_FRAME_BYTE_SIZE","STEREO_FRAME_SIZE","TIMESTEP_LENGTH","UDP_KEEPALIVE_GAP","UDP_KEEPALIVE_GAP_MS","VOICE_GATEWAY_VERSION","VOICE_PACKET_MAX"]}; \ No newline at end of file diff --git a/next/songbird/driver/connection/error/enum.Error.html b/next/songbird/driver/connection/error/enum.Error.html new file mode 100644 index 0000000..9af66e8 --- /dev/null +++ b/next/songbird/driver/connection/error/enum.Error.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../songbird/error/enum.ConnectionError.html...

+ + + \ No newline at end of file diff --git a/next/songbird/driver/connection/error/type.Result.html b/next/songbird/driver/connection/error/type.Result.html new file mode 100644 index 0000000..27bbcd3 --- /dev/null +++ b/next/songbird/driver/connection/error/type.Result.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../songbird/error/type.ConnectionResult.html...

+ + + \ No newline at end of file diff --git a/next/songbird/driver/crypto/enum.CryptoMode.html b/next/songbird/driver/crypto/enum.CryptoMode.html new file mode 100644 index 0000000..5b8ede9 --- /dev/null +++ b/next/songbird/driver/crypto/enum.CryptoMode.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/driver/enum.CryptoMode.html...

+ + + \ No newline at end of file diff --git a/next/songbird/driver/decode_mode/enum.Channels.html b/next/songbird/driver/decode_mode/enum.Channels.html new file mode 100644 index 0000000..3b942f5 --- /dev/null +++ b/next/songbird/driver/decode_mode/enum.Channels.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/driver/enum.Channels.html...

+ + + \ No newline at end of file diff --git a/next/songbird/driver/decode_mode/enum.DecodeMode.html b/next/songbird/driver/decode_mode/enum.DecodeMode.html new file mode 100644 index 0000000..1a54e50 --- /dev/null +++ b/next/songbird/driver/decode_mode/enum.DecodeMode.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/driver/enum.DecodeMode.html...

+ + + \ No newline at end of file diff --git a/next/songbird/driver/decode_mode/enum.SampleRate.html b/next/songbird/driver/decode_mode/enum.SampleRate.html new file mode 100644 index 0000000..a84b5e9 --- /dev/null +++ b/next/songbird/driver/decode_mode/enum.SampleRate.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/driver/enum.SampleRate.html...

+ + + \ No newline at end of file diff --git a/next/songbird/driver/decode_mode/struct.DecodeConfig.html b/next/songbird/driver/decode_mode/struct.DecodeConfig.html new file mode 100644 index 0000000..f8dd22a --- /dev/null +++ b/next/songbird/driver/decode_mode/struct.DecodeConfig.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/driver/struct.DecodeConfig.html...

+ + + \ No newline at end of file diff --git a/next/songbird/driver/enum.Bitrate.html b/next/songbird/driver/enum.Bitrate.html new file mode 100644 index 0000000..abb1625 --- /dev/null +++ b/next/songbird/driver/enum.Bitrate.html @@ -0,0 +1,56 @@ +Bitrate in songbird::driver - Rust

Bitrate

Enum Bitrate 

pub enum Bitrate {
+    BitsPerSecond(i32),
+    Max,
+    Auto,
+}
Expand description

Opus encoder bitrate settings.

+

Variants§

§

BitsPerSecond(i32)

Explicit bitrate choice (in bits/second).

+
§

Max

Maximum bitrate allowed (up to maximum number of bytes for the packet).

+
§

Auto

Default bitrate decided by the encoder (not recommended).

+

Trait Implementations§

§

impl Clone for Bitrate

§

fn clone(&self) -> Bitrate

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl Debug for Bitrate

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl Hash for Bitrate

§

fn hash<__H>(&self, state: &mut __H)
where + __H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
§

impl PartialEq for Bitrate

§

fn eq(&self, other: &Bitrate) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl TryFrom<i32> for Bitrate

§

type Error = Error

The type returned in the event of a conversion error.
§

fn try_from(value: i32) -> Result<Bitrate, Error>

Performs the conversion.
§

impl Copy for Bitrate

§

impl Eq for Bitrate

§

impl StructuralPartialEq for Bitrate

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/driver/enum.Channels.html b/next/songbird/driver/enum.Channels.html new file mode 100644 index 0000000..3aaa4a0 --- /dev/null +++ b/next/songbird/driver/enum.Channels.html @@ -0,0 +1,56 @@ +Channels in songbird::driver - Rust

Channels

Enum Channels 

Source
#[non_exhaustive]
pub enum Channels { + Mono, + Stereo, +}
Expand description

The channel layout of output audio when using DecodeMode::Decode.

+

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

Mono

Decode received audio packets into a single channel.

+
§

Stereo

Decode received audio packets into two interleaved channels.

+

Received mono packets’ samples will automatically be duplicated across +both channels.

+

The default choice.

+

Trait Implementations§

Source§

impl Clone for Channels

Source§

fn clone(&self) -> Channels

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Channels

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for Channels

Source§

fn default() -> Channels

Returns the “default value” for a type. Read more
Source§

impl From<Channels> for Channels

Source§

fn from(value: Channels) -> Self

Converts to this type from the input type.
Source§

impl Hash for Channels

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Channels

Source§

fn eq(&self, other: &Channels) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for Channels

Source§

impl Eq for Channels

Source§

impl StructuralPartialEq for Channels

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/driver/enum.CryptoMode.html b/next/songbird/driver/enum.CryptoMode.html new file mode 100644 index 0000000..e006f46 --- /dev/null +++ b/next/songbird/driver/enum.CryptoMode.html @@ -0,0 +1,83 @@ +CryptoMode in songbird::driver - Rust

CryptoMode

Enum CryptoMode 

Source
#[non_exhaustive]
pub enum CryptoMode { + Aes256Gcm, + XChaCha20Poly1305, +}
Expand description

Encryption schemes supportd by Discord.

+

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

Aes256Gcm

Discord’s currently preferred non-E2EE encryption scheme.

+

Packets are encrypted and decrypted using the AES256GCM encryption scheme. +An additional random 4B suffix is used as the source of nonce bytes for the packet. +This nonce value increments by 1 with each packet.

+

Encrypted content begins after the RTP header and extensions, following the SRTP +specification.

+

Nonce width of 4B (32b), at an extra 4B per packet (~0.2 kB/s).

+
§

XChaCha20Poly1305

A fallback non-E2EE encryption scheme.

+

Packets are encrypted and decrypted using the XChaCha20Poly1305 encryption scheme. +An additional random 4B suffix is used as the source of nonce bytes for the packet. +This nonce value increments by 1 with each packet.

+

Encrypted content begins after the RTP header and extensions, following the SRTP +specification.

+

Nonce width of 4B (32b), at an extra 4B per packet (~0.2 kB/s).

+

Implementations§

Source§

impl CryptoMode

Source

pub const fn to_request_str(self) -> &'static str

Returns the name of a mode as it will appear during negotiation.

+
Source

pub const fn algorithm_nonce_size(self) -> usize

Returns the nonce length in bytes required by algorithm.

+
Source

pub const fn nonce_size(self) -> usize

Returns the number of bytes each nonce is stored as within +a packet.

+
Source

pub const fn payload_suffix_len(self) -> usize

Returns the number of bytes occupied by the encryption scheme +which fall after the payload.

+
Source

pub const fn tag_suffix_len(self) -> usize

Returns the number of bytes occupied by an encryption scheme’s tag which +fall after the payload.

+
Source

pub const fn payload_overhead(self) -> usize

Calculates the number of additional bytes required compared +to an unencrypted payload.

+

Trait Implementations§

Source§

impl Clone for CryptoMode

Source§

fn clone(&self) -> CryptoMode

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for CryptoMode

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for CryptoMode

Source§

fn default() -> CryptoMode

Returns the “default value” for a type. Read more
Source§

impl FromStr for CryptoMode

Source§

type Err = UnrecognisedCryptoMode

The associated error which can be returned from parsing.
Source§

fn from_str(s: &str) -> Result<Self, Self::Err>

Parses a string s to return a value of this type. Read more
Source§

impl Hash for CryptoMode

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for CryptoMode

Source§

fn eq(&self, other: &CryptoMode) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for CryptoMode

Source§

impl Eq for CryptoMode

Source§

impl StructuralPartialEq for CryptoMode

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> ArgumentConvert for T
where + T: FromStr,

Source§

type Err = <T as FromStr>::Err

The associated error which can be returned from parsing.
Source§

fn convert<'life0, 'async_trait>( + __arg0: impl CacheHttp + 'async_trait, + __arg1: Option<GuildId>, + __arg2: Option<ChannelId>, + s: &'life0 str, +) -> Pin<Box<dyn Future<Output = Result<T, <T as ArgumentConvert>::Err>> + Send + 'async_trait>>
where + 'life0: 'async_trait, + T: 'async_trait,

Parses a string s as a command parameter of this type.
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/driver/enum.DecodeMode.html b/next/songbird/driver/enum.DecodeMode.html new file mode 100644 index 0000000..8958067 --- /dev/null +++ b/next/songbird/driver/enum.DecodeMode.html @@ -0,0 +1,61 @@ +DecodeMode in songbird::driver - Rust

DecodeMode

Enum DecodeMode 

Source
#[non_exhaustive]
pub enum DecodeMode { + Pass, + Decrypt, + Decode(DecodeConfig), +}
Expand description

Decode behaviour for received RTP packets within the driver.

+

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

Pass

Packets received from Discord are handed over to events without any +changes applied.

+

No CPU work involved.

+
§

Decrypt

Decrypts the body of each received packet.

+

Small per-packet CPU use.

+
§

Decode(DecodeConfig)

Decrypts and decodes each received packet, correctly accounting for losses.

+

Larger per-packet CPU use.

+

Implementations§

Source§

impl DecodeMode

Source

pub fn should_decode(self) -> bool

Returns whether this mode will decrypt and decode received packets.

+
Source

pub fn should_decrypt(self) -> bool

Returns whether this mode will decrypt received packets.

+

Trait Implementations§

Source§

impl Clone for DecodeMode

Source§

fn clone(&self) -> DecodeMode

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for DecodeMode

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for DecodeMode

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for DecodeMode

Source§

fn eq(&self, other: &DecodeMode) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for DecodeMode

Source§

impl Eq for DecodeMode

Source§

impl StructuralPartialEq for DecodeMode

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/driver/enum.MixMode.html b/next/songbird/driver/enum.MixMode.html new file mode 100644 index 0000000..7df4c0e --- /dev/null +++ b/next/songbird/driver/enum.MixMode.html @@ -0,0 +1,54 @@ +MixMode in songbird::driver - Rust

MixMode

Enum MixMode 

Source
pub enum MixMode {
+    Mono,
+    Stereo,
+}
Expand description

Mixing behaviour for sent audio sources processed within the driver.

+

This has no impact on Opus packet passthrough, which will pass packets +irrespective of their channel count.

+

Variants§

§

Mono

Audio sources will be downmixed into a mono buffer.

+
§

Stereo

Audio sources will be mixed into into a stereo buffer, where mono sources +will be duplicated into both channels.

+

Trait Implementations§

Source§

impl Clone for MixMode

Source§

fn clone(&self) -> MixMode

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for MixMode

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl From<MixMode> for Channels

Source§

fn from(val: MixMode) -> Self

Converts to this type from the input type.
Source§

impl From<MixMode> for Layout

Source§

fn from(val: MixMode) -> Self

Converts to this type from the input type.
Source§

impl PartialEq for MixMode

Source§

fn eq(&self, other: &MixMode) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for MixMode

Source§

impl Eq for MixMode

Source§

impl StructuralPartialEq for MixMode

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/driver/enum.SampleRate.html b/next/songbird/driver/enum.SampleRate.html new file mode 100644 index 0000000..71f3202 --- /dev/null +++ b/next/songbird/driver/enum.SampleRate.html @@ -0,0 +1,60 @@ +SampleRate in songbird::driver - Rust

SampleRate

Enum SampleRate 

Source
#[non_exhaustive]
pub enum SampleRate { + Hz8000, + Hz12000, + Hz16000, + Hz24000, + Hz48000, +}
Expand description

The sample rate of output audio when using DecodeMode::Decode.

+

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

Hz8000

Decode to a sample rate of 8kHz.

+
§

Hz12000

Decode to a sample rate of 12kHz.

+
§

Hz16000

Decode to a sample rate of 16kHz.

+
§

Hz24000

Decode to a sample rate of 24kHz.

+
§

Hz48000

Decode to a sample rate of 48kHz.

+

The preferred option for encoding/decoding at or above CD quality.

+

Trait Implementations§

Source§

impl Clone for SampleRate

Source§

fn clone(&self) -> SampleRate

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for SampleRate

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for SampleRate

Source§

fn default() -> SampleRate

Returns the “default value” for a type. Read more
Source§

impl From<SampleRate> for SampleRate

Source§

fn from(value: SampleRate) -> Self

Converts to this type from the input type.
Source§

impl Hash for SampleRate

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for SampleRate

Source§

fn eq(&self, other: &SampleRate) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for SampleRate

Source§

impl Eq for SampleRate

Source§

impl StructuralPartialEq for SampleRate

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/driver/enum.SchedulerError.html b/next/songbird/driver/enum.SchedulerError.html new file mode 100644 index 0000000..acd4793 --- /dev/null +++ b/next/songbird/driver/enum.SchedulerError.html @@ -0,0 +1,41 @@ +SchedulerError in songbird::driver - Rust

SchedulerError

Enum SchedulerError 

Source
#[non_exhaustive]
pub enum SchedulerError { + Disconnected, +}
Expand description

Errors encountered when communicating with the internals of a Scheduler.

+

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

Disconnected

The scheduler exited or crashed while awating the request.

+

Trait Implementations§

Source§

impl Debug for Error

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for Error

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Error for Error

Source§

fn source(&self) -> Option<&(dyn StdError + 'static)>

Returns the lower-level source of this error, if any. Read more
1.0.0 · Source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · Source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
Source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type-based access to context intended for error reports. Read more
Source§

impl From<RecvError> for Error

Source§

fn from(_: RecvError) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

§

impl Freeze for Error

§

impl RefUnwindSafe for Error

§

impl Send for Error

§

impl Sync for Error

§

impl Unpin for Error

§

impl UnwindSafe for Error

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
§

impl<T> ToStringFallible for T
where + T: Display,

§

fn try_to_string(&self) -> Result<String, TryReserveError>

ToString::to_string, but without panic on OOM.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/driver/enum.SchedulerMode.html b/next/songbird/driver/enum.SchedulerMode.html new file mode 100644 index 0000000..98c3444 --- /dev/null +++ b/next/songbird/driver/enum.SchedulerMode.html @@ -0,0 +1,43 @@ +SchedulerMode in songbird::driver - Rust

SchedulerMode

Enum SchedulerMode 

Source
#[non_exhaustive]
pub enum SchedulerMode { + MaxPerThread(NonZeroUsize), +}
Expand description

Strategies for mapping live mixer tasks to individual threads.

+

Defaults to MaxPerThread(16).

+

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

MaxPerThread(NonZeroUsize)

Allows at most n tasks to run per thread.

+

Trait Implementations§

Source§

impl Clone for Mode

Source§

fn clone(&self) -> Mode

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Mode

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for Mode

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

§

impl Freeze for Mode

§

impl RefUnwindSafe for Mode

§

impl Send for Mode

§

impl Sync for Mode

§

impl Unpin for Mode

§

impl UnwindSafe for Mode

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/driver/fn.get_default_scheduler.html b/next/songbird/driver/fn.get_default_scheduler.html new file mode 100644 index 0000000..3f7fac9 --- /dev/null +++ b/next/songbird/driver/fn.get_default_scheduler.html @@ -0,0 +1,4 @@ +get_default_scheduler in songbird::driver - Rust

get_default_scheduler

Function get_default_scheduler 

Source
pub fn get_default_scheduler() -> &'static Scheduler
Expand description

The default shared scheduler instance.

+

This is built using the default value of ScheduleMode. Users desiring +a custom strategy should avoid calling Config::default.

+
\ No newline at end of file diff --git a/next/songbird/driver/index.html b/next/songbird/driver/index.html new file mode 100644 index 0000000..319e7ac --- /dev/null +++ b/next/songbird/driver/index.html @@ -0,0 +1,12 @@ +songbird::driver - Rust

Module driver

Module driver 

Source
Expand description

Runner for a voice connection.

+

Songbird’s driver is a mixed-sync system, using:

+
    +
  • Asynchronous connection management, event-handling, and gateway integration.
  • +
  • Synchronous audio mixing, packet generation, and encoding.
  • +
+

This splits up work according to its IO/compute bound nature, preventing packet +generation from being slowed down past its deadline, or from affecting other +asynchronous tasks your bot must handle.

+

Re-exports§

pub use audiopus as opus;

Modules§

retry
Configuration for connection retries.

Structs§

Connect
Future for a call to Driver::connect.
DecodeConfig
Configuration for DecodeMode::Decode
DisposalThread
Driver
The control object for a Discord voice connection, handling connection, +mixing, encoding, en/decryption, and event generation.
LiveStatBlock
Runtime statistics for an individual worker.
Scheduler
A reference to a shared group of threads used for running idle and active +audio threads.
SchedulerConfig
Configuration for how a Scheduler handles tasks.

Enums§

Bitrate
Opus encoder bitrate settings.
Channels
The channel layout of output audio when using DecodeMode::Decode.
CryptoMode
Encryption schemes supportd by Discord.
DecodeMode
Decode behaviour for received RTP packets within the driver.
MixMode
Mixing behaviour for sent audio sources processed within the driver.
SampleRate
The sample rate of output audio when using DecodeMode::Decode.
SchedulerError
Errors encountered when communicating with the internals of a Scheduler.
SchedulerMode
Strategies for mapping live mixer tasks to individual threads.

Functions§

get_default_scheduler
The default shared scheduler instance.
\ No newline at end of file diff --git a/next/songbird/driver/mix_mode/enum.MixMode.html b/next/songbird/driver/mix_mode/enum.MixMode.html new file mode 100644 index 0000000..df0be92 --- /dev/null +++ b/next/songbird/driver/mix_mode/enum.MixMode.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/driver/enum.MixMode.html...

+ + + \ No newline at end of file diff --git a/next/songbird/driver/retry/enum.Strategy.html b/next/songbird/driver/retry/enum.Strategy.html new file mode 100644 index 0000000..f157d66 --- /dev/null +++ b/next/songbird/driver/retry/enum.Strategy.html @@ -0,0 +1,46 @@ +Strategy in songbird::driver::retry - Rust

Strategy

Enum Strategy 

Source
#[non_exhaustive]
pub enum Strategy { + Every(Duration), + Backoff(ExponentialBackoff), +}
Expand description

Logic used to determine how long to wait between retry attempts.

+

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

Every(Duration)

The driver will wait for the same amount of time between each retry.

+
§

Backoff(ExponentialBackoff)

Exponential backoff waiting strategy, where the duration between +attempts (approximately) doubles each time.

+

Trait Implementations§

Source§

impl Clone for Strategy

Source§

fn clone(&self) -> Strategy

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Strategy

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for Strategy

Source§

fn eq(&self, other: &Strategy) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for Strategy

Source§

impl StructuralPartialEq for Strategy

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/driver/retry/index.html b/next/songbird/driver/retry/index.html new file mode 100644 index 0000000..861ef22 --- /dev/null +++ b/next/songbird/driver/retry/index.html @@ -0,0 +1,2 @@ +songbird::driver::retry - Rust

Module retry

Module retry 

Source
Expand description

Configuration for connection retries.

+

Structs§

ExponentialBackoff
Exponential backoff waiting strategy.
Retry
Configuration to be used for retrying driver connection attempts.

Enums§

Strategy
Logic used to determine how long to wait between retry attempts.
\ No newline at end of file diff --git a/next/songbird/driver/retry/sidebar-items.js b/next/songbird/driver/retry/sidebar-items.js new file mode 100644 index 0000000..eb4d977 --- /dev/null +++ b/next/songbird/driver/retry/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["Strategy"],"struct":["ExponentialBackoff","Retry"]}; \ No newline at end of file diff --git a/next/songbird/driver/retry/strategy/enum.Strategy.html b/next/songbird/driver/retry/strategy/enum.Strategy.html new file mode 100644 index 0000000..9ce6491 --- /dev/null +++ b/next/songbird/driver/retry/strategy/enum.Strategy.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../songbird/driver/retry/enum.Strategy.html...

+ + + \ No newline at end of file diff --git a/next/songbird/driver/retry/strategy/struct.ExponentialBackoff.html b/next/songbird/driver/retry/strategy/struct.ExponentialBackoff.html new file mode 100644 index 0000000..1c39978 --- /dev/null +++ b/next/songbird/driver/retry/strategy/struct.ExponentialBackoff.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../songbird/driver/retry/struct.ExponentialBackoff.html...

+ + + \ No newline at end of file diff --git a/next/songbird/driver/retry/struct.ExponentialBackoff.html b/next/songbird/driver/retry/struct.ExponentialBackoff.html new file mode 100644 index 0000000..f35e3c0 --- /dev/null +++ b/next/songbird/driver/retry/struct.ExponentialBackoff.html @@ -0,0 +1,55 @@ +ExponentialBackoff in songbird::driver::retry - Rust

ExponentialBackoff

Struct ExponentialBackoff 

Source
pub struct ExponentialBackoff {
+    pub min: Duration,
+    pub max: Duration,
+    pub jitter: f32,
+}
Expand description

Exponential backoff waiting strategy.

+

Each attempt waits for twice the last delay plus/minus a +random jitter, clamped to a min and max value.

+

Fields§

§min: Duration

Minimum amount of time to wait between retries.

+

Defaults to 0.25s.

+
§max: Duration

Maximum amount of time to wait between retries.

+

This will be clamped to >= min.

+

Defaults to 10s.

+
§jitter: f32

Amount of uniform random jitter to apply to generated wait times. +I.e., 0.1 will add +/-10% to generated intervals.

+

This is restricted to within +/-100%.

+

Defaults to 0.1.

+

Trait Implementations§

Source§

impl Clone for ExponentialBackoff

Source§

fn clone(&self) -> ExponentialBackoff

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ExponentialBackoff

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ExponentialBackoff

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl PartialEq for ExponentialBackoff

Source§

fn eq(&self, other: &ExponentialBackoff) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for ExponentialBackoff

Source§

impl StructuralPartialEq for ExponentialBackoff

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/driver/retry/struct.Retry.html b/next/songbird/driver/retry/struct.Retry.html new file mode 100644 index 0000000..51e88fc --- /dev/null +++ b/next/songbird/driver/retry/struct.Retry.html @@ -0,0 +1,50 @@ +Retry in songbird::driver::retry - Rust

Retry

Struct Retry 

Source
pub struct Retry {
+    pub strategy: Strategy,
+    pub retry_limit: Option<usize>,
+}
Expand description

Configuration to be used for retrying driver connection attempts.

+

Fields§

§strategy: Strategy

Strategy used to determine how long to wait between retry attempts.

+

Defaults to an ExponentialBackoff from 0.25s +to 10s, with a jitter of 0.1.

+
§retry_limit: Option<usize>

The maximum number of retries to attempt.

+

None will attempt an infinite number of retries, +while Some(0) will attempt to connect once (no retries).

+

Defaults to Some(5).

+

Trait Implementations§

Source§

impl Clone for Retry

Source§

fn clone(&self) -> Retry

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Retry

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for Retry

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl PartialEq for Retry

Source§

fn eq(&self, other: &Retry) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for Retry

Source§

impl StructuralPartialEq for Retry

Auto Trait Implementations§

§

impl Freeze for Retry

§

impl RefUnwindSafe for Retry

§

impl Send for Retry

§

impl Sync for Retry

§

impl Unpin for Retry

§

impl UnwindSafe for Retry

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/driver/scheduler/config/enum.Mode.html b/next/songbird/driver/scheduler/config/enum.Mode.html new file mode 100644 index 0000000..c478712 --- /dev/null +++ b/next/songbird/driver/scheduler/config/enum.Mode.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../songbird/driver/enum.SchedulerMode.html...

+ + + \ No newline at end of file diff --git a/next/songbird/driver/scheduler/config/struct.Config.html b/next/songbird/driver/scheduler/config/struct.Config.html new file mode 100644 index 0000000..0941ce4 --- /dev/null +++ b/next/songbird/driver/scheduler/config/struct.Config.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../songbird/driver/struct.SchedulerConfig.html...

+ + + \ No newline at end of file diff --git a/next/songbird/driver/scheduler/enum.Error.html b/next/songbird/driver/scheduler/enum.Error.html new file mode 100644 index 0000000..149835d --- /dev/null +++ b/next/songbird/driver/scheduler/enum.Error.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/driver/enum.SchedulerError.html...

+ + + \ No newline at end of file diff --git a/next/songbird/driver/scheduler/fn.get_default_scheduler.html b/next/songbird/driver/scheduler/fn.get_default_scheduler.html new file mode 100644 index 0000000..f9684b7 --- /dev/null +++ b/next/songbird/driver/scheduler/fn.get_default_scheduler.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/driver/fn.get_default_scheduler.html...

+ + + \ No newline at end of file diff --git a/next/songbird/driver/scheduler/stats/struct.LiveStatBlock.html b/next/songbird/driver/scheduler/stats/struct.LiveStatBlock.html new file mode 100644 index 0000000..300d4b4 --- /dev/null +++ b/next/songbird/driver/scheduler/stats/struct.LiveStatBlock.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../songbird/driver/struct.LiveStatBlock.html...

+ + + \ No newline at end of file diff --git a/next/songbird/driver/scheduler/struct.Scheduler.html b/next/songbird/driver/scheduler/struct.Scheduler.html new file mode 100644 index 0000000..cb9dfda --- /dev/null +++ b/next/songbird/driver/scheduler/struct.Scheduler.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/driver/struct.Scheduler.html...

+ + + \ No newline at end of file diff --git a/next/songbird/driver/sidebar-items.js b/next/songbird/driver/sidebar-items.js new file mode 100644 index 0000000..26ec900 --- /dev/null +++ b/next/songbird/driver/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["Bitrate","Channels","CryptoMode","DecodeMode","MixMode","SampleRate","SchedulerError","SchedulerMode"],"fn":["get_default_scheduler"],"mod":["retry"],"struct":["Connect","DecodeConfig","DisposalThread","Driver","LiveStatBlock","Scheduler","SchedulerConfig"]}; \ No newline at end of file diff --git a/next/songbird/driver/struct.Connect.html b/next/songbird/driver/struct.Connect.html new file mode 100644 index 0000000..98c2f93 --- /dev/null +++ b/next/songbird/driver/struct.Connect.html @@ -0,0 +1,145 @@ +Connect in songbird::driver - Rust

Connect

Struct Connect 

Source
pub struct Connect { /* private fields */ }
Expand description

Future for a call to Driver::connect.

+

This future awaits the result of a connection; the driver +is messaged at the time of the call.

+

Trait Implementations§

Source§

impl Future for Connect

Source§

type Output = Result<(), Error>

The type of value produced on completion.
Source§

fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output>

Attempts to resolve the future to a final value, registering +the current task for wakeup if the value is not yet available. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> FutureExt for T
where + T: Future + ?Sized,

§

fn map<U, F>(self, f: F) -> Map<Self, F>
where + F: FnOnce(Self::Output) -> U, + Self: Sized,

Map this future’s output to a different type, returning a new future of +the resulting type. Read more
§

fn map_into<U>(self) -> MapInto<Self, U>
where + Self::Output: Into<U>, + Self: Sized,

Map this future’s output to a different type, returning a new future of +the resulting type. Read more
§

fn then<Fut, F>(self, f: F) -> Then<Self, Fut, F>
where + F: FnOnce(Self::Output) -> Fut, + Fut: Future, + Self: Sized,

Chain on a computation for when a future finished, passing the result of +the future to the provided closure f. Read more
§

fn left_future<B>(self) -> Either<Self, B>
where + B: Future<Output = Self::Output>, + Self: Sized,

Wrap this future in an Either future, making it the left-hand variant +of that Either. Read more
§

fn right_future<A>(self) -> Either<A, Self>
where + A: Future<Output = Self::Output>, + Self: Sized,

Wrap this future in an Either future, making it the right-hand variant +of that Either. Read more
§

fn into_stream(self) -> IntoStream<Self>
where + Self: Sized,

Convert this future into a single element stream. Read more
§

fn flatten(self) -> Flatten<Self>
where + Self::Output: Future, + Self: Sized,

Flatten the execution of this future when the output of this +future is itself another future. Read more
§

fn flatten_stream(self) -> FlattenStream<Self>
where + Self::Output: Stream, + Self: Sized,

Flatten the execution of this future when the successful result of this +future is a stream. Read more
§

fn fuse(self) -> Fuse<Self>
where + Self: Sized,

Fuse a future such that poll will never again be called once it has +completed. This method can be used to turn any Future into a +FusedFuture. Read more
§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where + F: FnOnce(&Self::Output), + Self: Sized,

Do something with the output of a future before passing it on. Read more
§

fn catch_unwind(self) -> CatchUnwind<Self>
where + Self: Sized + UnwindSafe,

Catches unwinding panics while polling the future. Read more
§

fn shared(self) -> Shared<Self>
where + Self: Sized, + Self::Output: Clone,

Create a cloneable handle to this future where all handles will resolve +to the same result. Read more
§

fn remote_handle(self) -> (Remote<Self>, RemoteHandle<Self::Output>)
where + Self: Sized,

Turn this future into a future that yields () on completion and sends +its output to another future on a separate task. Read more
§

fn boxed<'a>(self) -> Pin<Box<dyn Future<Output = Self::Output> + Send + 'a>>
where + Self: Sized + Send + 'a,

Wrap the future in a Box, pinning it. Read more
§

fn boxed_local<'a>(self) -> Pin<Box<dyn Future<Output = Self::Output> + 'a>>
where + Self: Sized + 'a,

Wrap the future in a Box, pinning it. Read more
§

fn unit_error(self) -> UnitError<Self>
where + Self: Sized,

§

fn never_error(self) -> NeverError<Self>
where + Self: Sized,

§

fn poll_unpin(&mut self, cx: &mut Context<'_>) -> Poll<Self::Output>
where + Self: Unpin,

A convenience for calling Future::poll on Unpin future types.
§

fn now_or_never(self) -> Option<Self::Output>
where + Self: Sized,

Evaluates and consumes the future, returning the resulting output if +the future is ready after the first call to Future::poll. Read more
§

impl<T> FutureExt for T
where + T: Future + ?Sized,

§

fn with_cancellation_token( + self, + cancellation_token: &CancellationToken, +) -> WithCancellationTokenFuture<'_, Self>
where + Self: Sized,

Similar to [CancellationToken::run_until_cancelled], +but with the advantage that it is easier to write fluent call chains, +and biased towards waiting for [CancellationToken] to complete. Read more
§

fn with_cancellation_token_owned( + self, + cancellation_token: CancellationToken, +) -> WithCancellationTokenFutureOwned<Self>
where + Self: Sized,

Similar to [CancellationToken::run_until_cancelled_owned], +but with the advantage that it is easier to write fluent call chains, +and biased towards waiting for [CancellationToken] to complete. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

impl<F> IntoFuture for F
where + F: Future,

Source§

type Output = <F as Future>::Output

The output that the future will produce on completion.
Source§

type IntoFuture = F

Which kind of future are we turning this into?
Source§

fn into_future(self) -> <F as IntoFuture>::IntoFuture

Creates a future from a value. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
§

impl<F, T, E> TryFuture for F
where + F: Future<Output = Result<T, E>> + ?Sized,

§

type Ok = T

The type of successful values yielded by this future
§

type Error = E

The type of failures yielded by this future
§

fn try_poll( + self: Pin<&mut F>, + cx: &mut Context<'_>, +) -> Poll<<F as Future>::Output>

Poll this TryFuture as if it were a Future. Read more
§

impl<Fut> TryFutureExt for Fut
where + Fut: TryFuture + ?Sized,

§

fn flatten_sink<Item>(self) -> FlattenSink<Self, Self::Ok>
where + Self::Ok: Sink<Item, Error = Self::Error>, + Self: Sized,

Flattens the execution of this future when the successful result of this +future is a [Sink]. Read more
§

fn map_ok<T, F>(self, f: F) -> MapOk<Self, F>
where + F: FnOnce(Self::Ok) -> T, + Self: Sized,

Maps this future’s success value to a different value. Read more
§

fn map_ok_or_else<T, E, F>(self, e: E, f: F) -> MapOkOrElse<Self, F, E>
where + F: FnOnce(Self::Ok) -> T, + E: FnOnce(Self::Error) -> T, + Self: Sized,

Maps this future’s success value to a different value, and permits for error handling resulting in the same type. Read more
§

fn map_err<E, F>(self, f: F) -> MapErr<Self, F>
where + F: FnOnce(Self::Error) -> E, + Self: Sized,

Maps this future’s error value to a different value. Read more
§

fn err_into<E>(self) -> ErrInto<Self, E>
where + Self: Sized, + Self::Error: Into<E>,

Maps this future’s Error to a new error type +using the Into trait. Read more
§

fn ok_into<U>(self) -> OkInto<Self, U>
where + Self: Sized, + Self::Ok: Into<U>,

Maps this future’s Ok to a new type +using the Into trait.
§

fn and_then<Fut, F>(self, f: F) -> AndThen<Self, Fut, F>
where + F: FnOnce(Self::Ok) -> Fut, + Fut: TryFuture<Error = Self::Error>, + Self: Sized,

Executes another future after this one resolves successfully. The +success value is passed to a closure to create this subsequent future. Read more
§

fn or_else<Fut, F>(self, f: F) -> OrElse<Self, Fut, F>
where + F: FnOnce(Self::Error) -> Fut, + Fut: TryFuture<Ok = Self::Ok>, + Self: Sized,

Executes another future if this one resolves to an error. The +error value is passed to a closure to create this subsequent future. Read more
§

fn inspect_ok<F>(self, f: F) -> InspectOk<Self, F>
where + F: FnOnce(&Self::Ok), + Self: Sized,

Do something with the success value of a future before passing it on. Read more
§

fn inspect_err<F>(self, f: F) -> InspectErr<Self, F>
where + F: FnOnce(&Self::Error), + Self: Sized,

Do something with the error value of a future before passing it on. Read more
§

fn try_flatten(self) -> TryFlatten<Self, Self::Ok>
where + Self::Ok: TryFuture<Error = Self::Error>, + Self: Sized,

Flatten the execution of this future when the successful result of this +future is another future. Read more
§

fn try_flatten_stream(self) -> TryFlattenStream<Self>
where + Self::Ok: TryStream<Error = Self::Error>, + Self: Sized,

Flatten the execution of this future when the successful result of this +future is a stream. Read more
§

fn unwrap_or_else<F>(self, f: F) -> UnwrapOrElse<Self, F>
where + Self: Sized, + F: FnOnce(Self::Error) -> Self::Ok,

Unwraps this future’s output, producing a future with this future’s +Ok type as its +Output type. Read more
§

fn into_future(self) -> IntoFuture<Self>
where + Self: Sized,

Wraps a [TryFuture] into a type that implements +Future. Read more
§

fn try_poll_unpin( + &mut self, + cx: &mut Context<'_>, +) -> Poll<Result<Self::Ok, Self::Error>>
where + Self: Unpin,

A convenience method for calling [TryFuture::try_poll] on Unpin +future types.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/driver/struct.DecodeConfig.html b/next/songbird/driver/struct.DecodeConfig.html new file mode 100644 index 0000000..0c70220 --- /dev/null +++ b/next/songbird/driver/struct.DecodeConfig.html @@ -0,0 +1,56 @@ +DecodeConfig in songbird::driver - Rust

DecodeConfig

Struct DecodeConfig 

Source
#[non_exhaustive]
pub struct DecodeConfig { + pub channels: Channels, + pub sample_rate: SampleRate, +}
Expand description

Configuration for DecodeMode::Decode

+

Fields (Non-exhaustive)§

This struct is marked as non-exhaustive
Non-exhaustive structs could have additional fields added in future. Therefore, non-exhaustive structs cannot be constructed in external crates using the traditional Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.
§channels: Channels

Configures the channel layout for output audio.

+

Defaults to Channels::Stereo.

+
§sample_rate: SampleRate

Configures the sample rate for output audio.

+

Defaults to SampleRate::Hz48000.

+

Implementations§

Source§

impl DecodeConfig

Source

pub fn new(channels: Channels, sample_rate: SampleRate) -> Self

Creates a new DecodeConfig with the specified channels and sample rate.

+

Trait Implementations§

Source§

impl Clone for DecodeConfig

Source§

fn clone(&self) -> DecodeConfig

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for DecodeConfig

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for DecodeConfig

Source§

fn default() -> DecodeConfig

Returns the “default value” for a type. Read more
Source§

impl Hash for DecodeConfig

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for DecodeConfig

Source§

fn eq(&self, other: &DecodeConfig) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for DecodeConfig

Source§

impl Eq for DecodeConfig

Source§

impl StructuralPartialEq for DecodeConfig

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/driver/struct.DisposalThread.html b/next/songbird/driver/struct.DisposalThread.html new file mode 100644 index 0000000..54b4b31 --- /dev/null +++ b/next/songbird/driver/struct.DisposalThread.html @@ -0,0 +1,38 @@ +DisposalThread in songbird::driver - Rust

DisposalThread

Struct DisposalThread 

Source
pub struct DisposalThread(/* private fields */);

Implementations§

Source§

impl DisposalThread

Source

pub fn run() -> Self

Trait Implementations§

Source§

impl Clone for DisposalThread

Source§

fn clone(&self) -> DisposalThread

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for DisposalThread

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for DisposalThread

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/driver/struct.Driver.html b/next/songbird/driver/struct.Driver.html new file mode 100644 index 0000000..1d00b2e --- /dev/null +++ b/next/songbird/driver/struct.Driver.html @@ -0,0 +1,106 @@ +Driver in songbird::driver - Rust

Driver

Struct Driver 

Source
pub struct Driver { /* private fields */ }
Expand description

The control object for a Discord voice connection, handling connection, +mixing, encoding, en/decryption, and event generation.

+

When compiled with the "builtin-queue" feature, each driver includes a track queue +as a convenience to prevent the additional overhead of per-guild state management.

+

Implementations§

Source§

impl Driver

Source

pub fn new(config: Config) -> Self

Creates a new voice driver.

+

This will create the core voice tasks in the background.

+
Source

pub fn connect(&mut self, info: ConnectionInfo) -> Connect

Connects to a voice channel using the specified server.

+

This method instantly contacts the driver tasks, and its +does not need to be awaited to start the actual connection.

+
Source

pub fn leave(&mut self)

Leaves the current voice channel, disconnecting from it.

+

This does not forget settings, like whether to be self-deafened or +self-muted.

+
Source

pub fn mute(&mut self, mute: bool)

Sets whether the current connection is to be muted.

+

If there is no live voice connection, then this only acts as a settings +update for future connections.

+
Source

pub fn is_mute(&self) -> bool

Returns whether the driver is muted (i.e., processes audio internally +but submits none).

+
Source

pub fn play_input(&mut self, input: Input) -> TrackHandle

Plays audio from an input, returning a handle for further control.

+
Source

pub fn play_only_input(&mut self, input: Input) -> TrackHandle

Plays audio from an input, returning a handle for further control.

+

Unlike Self::play_input, this stops all other inputs attached +to the channel.

+
Source

pub fn play(&mut self, track: Track) -> TrackHandle

Plays audio from a Track object.

+

The main difference between this function and Self::play_input is +that this allows for direct manipulation of the Track object +before it is passed over to the voice and mixing contexts.

+
Source

pub fn play_only(&mut self, track: Track) -> TrackHandle

Exclusively plays audio from a Track object.

+

As in Self::play_only_input, this stops all other sources attached to the +channel. Like Self::play, however, this allows for direct manipulation of the +Track object before it is passed over to the voice and mixing contexts.

+
Source

pub fn set_bitrate(&mut self, bitrate: Bitrate)

Sets the bitrate for encoding Opus packets sent along +the channel being managed.

+

The default rate is 128 kbps. +Sensible values range between Bits(512) and Bits(512_000) +bits per second. +Alternatively, Auto and Max remain available.

+
Source

pub fn stop(&mut self)

Stops playing audio from all sources, if any are set.

+
Source

pub fn set_config(&mut self, config: Config)

Sets the configuration for this driver (and parent Call, if applicable).

+
Source

pub fn config(&self) -> &Config

Returns a view of this driver’s configuration.

+
Source

pub fn add_global_event<F: EventHandler + 'static>( + &mut self, + event: Event, + action: F, +)

Attach a global event handler to an audio context. Global events may receive +any EventContext.

+

Global timing events will tick regardless of whether audio is playing, +so long as the bot is connected to a voice channel, and have no tracks. +TrackEvents will respond to all relevant tracks, giving some audio elements.

+

Users must ensure that no costly work or blocking occurs +within the supplied function or closure. Taking excess time could prevent +timely sending of packets, causing audio glitches and delays.

+
Source

pub fn remove_all_global_events(&mut self)

Removes all global event handlers from an audio context.

+
Source§

impl Driver

Source

pub fn queue(&self) -> &TrackQueue

Returns a reference to this driver’s built-in queue.

+

Requires the "builtin-queue" feature. +Queue additions should be made via Driver::enqueue and +Driver::enqueue_input.

+
Source

pub async fn enqueue_input(&mut self, input: Input) -> TrackHandle

Adds an audio Input to this driver’s built-in queue.

+

Requires the "builtin-queue" feature.

+
Source

pub async fn enqueue(&mut self, track: Track) -> TrackHandle

Adds an existing Track to this driver’s built-in queue.

+

Requires the "builtin-queue" feature.

+
Source

pub fn enqueue_with_preload( + &mut self, + track: Track, + preload_time: Option<Duration>, +) -> TrackHandle

Add an existing Track to the queue, using a known time to preload the next track.

+

See TrackQueue::add_with_preload for how preload_time is used.

+

Requires the "builtin-queue" feature.

+

Trait Implementations§

Source§

impl Clone for Driver

Source§

fn clone(&self) -> Driver

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Driver

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for Driver

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl Drop for Driver

Source§

fn drop(&mut self)

Leaves the current connected voice channel, if connected to one, and +forgets all configurations relevant to this Handler.

+

Auto Trait Implementations§

§

impl Freeze for Driver

§

impl !RefUnwindSafe for Driver

§

impl Send for Driver

§

impl Sync for Driver

§

impl Unpin for Driver

§

impl !UnwindSafe for Driver

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/driver/struct.LiveStatBlock.html b/next/songbird/driver/struct.LiveStatBlock.html new file mode 100644 index 0000000..e92e2aa --- /dev/null +++ b/next/songbird/driver/struct.LiveStatBlock.html @@ -0,0 +1,41 @@ +LiveStatBlock in songbird::driver - Rust

LiveStatBlock

Struct LiveStatBlock 

Source
pub struct LiveStatBlock { /* private fields */ }
Expand description

Runtime statistics for an individual worker.

+

Individual statistics are measured atomically – the worker thread +may have been cleaned up, or its mixer count may not match the +count when Self::last_compute_cost_ns was set.

+

Implementations§

Source§

impl LiveStatBlock

Source

pub fn live_mixers(&self) -> u64

Returns the number of mixer tasks scheduled on this worker thread.

+
Source

pub fn last_compute_cost_ns(&self) -> u64

Returns the number of nanoseconds required to process all worker threads’ +packet transmission, mixing, encoding, and encryption in the last tick.

+

Trait Implementations§

Source§

impl Debug for LiveStatBlock

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for LiveStatBlock

Source§

fn default() -> LiveStatBlock

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/driver/struct.Scheduler.html b/next/songbird/driver/struct.Scheduler.html new file mode 100644 index 0000000..7f7444b --- /dev/null +++ b/next/songbird/driver/struct.Scheduler.html @@ -0,0 +1,51 @@ +Scheduler in songbird::driver - Rust

Scheduler

Struct Scheduler 

Source
pub struct Scheduler { /* private fields */ }
Expand description

A reference to a shared group of threads used for running idle and active +audio threads.

+

Implementations§

Source§

impl Scheduler

Source

pub fn new(config: Config) -> Self

Create a new mixer scheduler from the allocation strategy in config.

+
Source

pub fn total_tasks(&self) -> u64

Returns the total number of calls (idle and active) scheduled.

+
Source

pub fn live_tasks(&self) -> u64

Returns the total number of active calls scheduled and processing +audio.

+
Source

pub fn worker_threads(&self) -> u64

Returns the total number of threads spawned to process live audio sessions.

+
Source

pub async fn worker_thread_stats( + &self, +) -> Result<Vec<Arc<LiveStatBlock>>, Error>

Request a list of handles to statistics for currently live workers.

+
Source

pub fn worker_thread_stats_blocking( + &self, +) -> Result<Vec<Arc<LiveStatBlock>>, Error>

Request a list of handles to statistics for currently live workers with a blocking call.

+

Trait Implementations§

Source§

impl Clone for Scheduler

Source§

fn clone(&self) -> Scheduler

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Scheduler

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for Scheduler

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/driver/struct.SchedulerConfig.html b/next/songbird/driver/struct.SchedulerConfig.html new file mode 100644 index 0000000..de8aacb --- /dev/null +++ b/next/songbird/driver/struct.SchedulerConfig.html @@ -0,0 +1,47 @@ +SchedulerConfig in songbird::driver - Rust

SchedulerConfig

Struct SchedulerConfig 

Source
#[non_exhaustive]
pub struct SchedulerConfig { + pub strategy: Mode, + pub move_expensive_tasks: bool, +}
Expand description

Configuration for how a Scheduler handles tasks.

+

Fields (Non-exhaustive)§

This struct is marked as non-exhaustive
Non-exhaustive structs could have additional fields added in future. Therefore, non-exhaustive structs cannot be constructed in external crates using the traditional Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.
§strategy: Mode

How Live mixer tasks will be mapped to individual threads.

+

Defaults to Mode::MaxPerThread(16).

+
§move_expensive_tasks: bool

Move costly mixers to another thread if their parent worker is at +risk of missing its deadlines.

+

Defaults to true.

+

Trait Implementations§

Source§

impl Clone for Config

Source§

fn clone(&self) -> Config

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Config

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for Config

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

§

impl Freeze for Config

§

impl RefUnwindSafe for Config

§

impl Send for Config

§

impl Sync for Config

§

impl Unpin for Config

§

impl UnwindSafe for Config

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/driver/tasks/disposal/struct.DisposalThread.html b/next/songbird/driver/tasks/disposal/struct.DisposalThread.html new file mode 100644 index 0000000..2d376bf --- /dev/null +++ b/next/songbird/driver/tasks/disposal/struct.DisposalThread.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../songbird/driver/struct.DisposalThread.html...

+ + + \ No newline at end of file diff --git a/next/songbird/error/enum.ConnectionError.html b/next/songbird/error/enum.ConnectionError.html new file mode 100644 index 0000000..25ed16a --- /dev/null +++ b/next/songbird/error/enum.ConnectionError.html @@ -0,0 +1,66 @@ +ConnectionError in songbird::error - Rust

ConnectionError

Enum ConnectionError 

Source
#[non_exhaustive]
pub enum ConnectionError { +
Show 13 variants AttemptDiscarded, + Crypto(Error), + CryptoInvalidLength, + CryptoModeInvalid, + CryptoModeUnavailable, + EndpointUrl, + IllegalDiscoveryResponse, + IllegalIp, + Io(Error), + Json(Error), + InterconnectFailure(Recipient), + Ws(Error), + TimedOut, +
}
Expand description

Errors encountered while connecting to a Discord voice server over the driver.

+

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

AttemptDiscarded

The driver hung up an internal signaller, either due to another connection attempt +or a crash.

+
§

Crypto(Error)

An error occurred during [en/de]cryption of voice packets.

+
§

CryptoInvalidLength

The symmetric key supplied by Discord had the wrong size.

+
§

CryptoModeInvalid

Server did not return the expected crypto mode during negotiation.

+
§

CryptoModeUnavailable

Selected crypto mode was not offered by server.

+
§

EndpointUrl

An indicator that an endpoint URL was invalid.

+
§

IllegalDiscoveryResponse

Discord failed to correctly respond to IP discovery.

+
§

IllegalIp

Could not parse Discord’s view of our IP.

+
§

Io(Error)

Miscellaneous I/O error.

+
§

Json(Error)

JSON (de)serialization error.

+
§

InterconnectFailure(Recipient)

Failed to message other background tasks after connection establishment.

+
§

Ws(Error)

Error communicating with gateway server over WebSocket.

+
§

TimedOut

Connection attempt timed out.

+

Trait Implementations§

Source§

impl Debug for Error

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for Error

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Error for Error

Source§

fn source(&self) -> Option<&(dyn StdError + 'static)>

Returns the lower-level source of this error, if any. Read more
1.0.0 · Source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · Source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
Source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type-based access to context intended for error reports. Read more
Source§

impl From<&Error> for DisconnectReason

Source§

fn from(e: &ConnectionError) -> Self

Converts to this type from the input type.
Source§

impl From<Elapsed> for Error

Source§

fn from(_e: Elapsed) -> Error

Converts to this type from the input type.
Source§

impl From<Error> for Error

Source§

fn from(e: CryptoError) -> Self

Converts to this type from the input type.
Source§

impl From<Error> for Error

Source§

fn from(e: IoError) -> Error

Converts to this type from the input type.
Source§

impl From<Error> for Error

Source§

fn from(e: JsonError) -> Error

Converts to this type from the input type.
Source§

impl From<Error> for JoinError

Source§

fn from(e: ConnectionError) -> Self

Converts to this type from the input type.
Source§

impl From<SendError<EventMessage>> for Error

Source§

fn from(_e: SendError<EventMessage>) -> Error

Converts to this type from the input type.
Source§

impl From<SendError<MixerMessage>> for Error

Source§

fn from(_e: SendError<MixerMessage>) -> Error

Converts to this type from the input type.
Source§

impl From<SendError<WsMessage>> for Error

Source§

fn from(_e: SendError<WsMessage>) -> Error

Converts to this type from the input type.

Auto Trait Implementations§

§

impl !Freeze for Error

§

impl !RefUnwindSafe for Error

§

impl Send for Error

§

impl Sync for Error

§

impl Unpin for Error

§

impl !UnwindSafe for Error

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
§

impl<T> ToStringFallible for T
where + T: Display,

§

fn try_to_string(&self) -> Result<String, TryReserveError>

ToString::to_string, but without panic on OOM.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/error/enum.JoinError.html b/next/songbird/error/enum.JoinError.html new file mode 100644 index 0000000..4b7323e --- /dev/null +++ b/next/songbird/error/enum.JoinError.html @@ -0,0 +1,72 @@ +JoinError in songbird::error - Rust

JoinError

Enum JoinError 

Source
#[non_exhaustive]
pub enum JoinError { + Dropped, + NoSender, + NoCall, + TimedOut, + Driver(ConnectionError), + Serenity(Box<TrySendError<ShardRunnerMessage>>), + Twilight(ChannelError), +}
Expand description

Error returned when a manager or call handler is +unable to send messages over Discord’s gateway.

+

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

Dropped

Request to join was dropped, cancelled, or replaced.

+
§

NoSender

No available gateway connection was provided to send +voice state update messages.

+
§

NoCall

Tried to leave a Call which was not found.

+
§

TimedOut

Connection details were not received from Discord in the +time given in the Call’s configuration.

+

This can occur if a message is lost by the Discord client +between restarts, or if Discord’s gateway believes that +this bot is still in the channel it attempts to join.

+

Users should leave the server on the gateway before +re-attempting connection.

+
§

Driver(ConnectionError)

The driver failed to establish a voice connection.

+

Users should leave the server on the gateway before +re-attempting connection.

+
§

Serenity(Box<TrySendError<ShardRunnerMessage>>)

Serenity-specific WebSocket send error.

+
§

Twilight(ChannelError)

Twilight-specific WebSocket send error when a message fails to send over websocket.

+

Implementations§

Source§

impl JoinError

Source

pub fn should_leave_server(&self) -> bool

Indicates whether this failure may have left (or been +caused by) Discord’s gateway state being in an +inconsistent state.

+

Failure to leave before rejoining may cause further +timeouts.

+
Source

pub fn should_reconnect_driver(&self) -> bool

Indicates whether this failure can be reattempted via +Driver::connect with retreived connection info.

+

Failure to leave before rejoining may cause further +timeouts.

+

Trait Implementations§

Source§

impl Debug for JoinError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for JoinError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Error for JoinError

Source§

fn source(&self) -> Option<&(dyn Error + 'static)>

Returns the lower-level source of this error, if any. Read more
1.0.0 · Source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · Source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
Source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type-based access to context intended for error reports. Read more
Source§

impl From<Box<TrySendError<ShardRunnerMessage>>> for JoinError

Source§

fn from(e: Box<TrySendError<ShardRunnerMessage>>) -> Self

Converts to this type from the input type.
Source§

impl From<ChannelError> for JoinError

Source§

fn from(e: ChannelError) -> Self

Converts to this type from the input type.
Source§

impl From<Error> for JoinError

Source§

fn from(e: ConnectionError) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
§

impl<T> ToStringFallible for T
where + T: Display,

§

fn try_to_string(&self) -> Result<String, TryReserveError>

ToString::to_string, but without panic on OOM.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/error/index.html b/next/songbird/error/index.html new file mode 100644 index 0000000..1433e8e --- /dev/null +++ b/next/songbird/error/index.html @@ -0,0 +1,4 @@ +songbird::error - Rust

Module error

Module error 

Source
Expand description

Driver and gateway error handling.

+

Re-exports§

pub use crate::driver::SchedulerError;
pub use crate::tracks::ControlError;
pub use crate::tracks::PlayError;
pub use crate::tracks::TrackResult;

Structs§

JsonError
This type represents all possible errors that can occur when serializing or +deserializing JSON data.

Enums§

ConnectionError
Errors encountered while connecting to a Discord voice server over the driver.
JoinError
Error returned when a manager or call handler is +unable to send messages over Discord’s gateway.

Type Aliases§

ConnectionResult
Convenience type for Discord voice/driver connection error handling.
JoinResult
Convenience type for Discord gateway error handling.
\ No newline at end of file diff --git a/next/songbird/error/sidebar-items.js b/next/songbird/error/sidebar-items.js new file mode 100644 index 0000000..2e2b8e1 --- /dev/null +++ b/next/songbird/error/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["ConnectionError","JoinError"],"struct":["JsonError"],"type":["ConnectionResult","JoinResult"]}; \ No newline at end of file diff --git a/next/songbird/error/struct.JsonError.html b/next/songbird/error/struct.JsonError.html new file mode 100644 index 0000000..8ac15c1 --- /dev/null +++ b/next/songbird/error/struct.JsonError.html @@ -0,0 +1,113 @@ +JsonError in songbird::error - Rust

JsonError

Struct JsonError 

Source
pub struct JsonError { /* private fields */ }
Expand description

This type represents all possible errors that can occur when serializing or +deserializing JSON data.

+

Implementations§

Source§

impl Error

Source

pub fn line(&self) -> usize

One-based line number at which the error was detected.

+

Characters in the first line of the input (before the first newline +character) are in line 1.

+
Source

pub fn column(&self) -> usize

One-based column number at which the error was detected.

+

The first character in the input and any characters immediately +following a newline character are in column 1.

+

Note that errors may occur in column 0, for example if a read from an +I/O stream fails immediately following a previously read newline +character.

+
Source

pub fn classify(&self) -> Category

Categorizes the cause of this error.

+
    +
  • Category::Io - failure to read or write bytes on an I/O stream
  • +
  • Category::Syntax - input that is not syntactically valid JSON
  • +
  • Category::Data - input data that is semantically incorrect
  • +
  • Category::Eof - unexpected end of the input data
  • +
+
Source

pub fn is_io(&self) -> bool

Returns true if this error was caused by a failure to read or write +bytes on an I/O stream.

+
Source

pub fn is_syntax(&self) -> bool

Returns true if this error was caused by input that was not +syntactically valid JSON.

+
Source

pub fn is_data(&self) -> bool

Returns true if this error was caused by input data that was +semantically incorrect.

+

For example, JSON containing a number is semantically incorrect when the +type being deserialized into holds a String.

+
Source

pub fn is_eof(&self) -> bool

Returns true if this error was caused by prematurely reaching the end of +the input data.

+

Callers that process streaming input may be interested in retrying the +deserialization once more data is available.

+
Source

pub fn io_error_kind(&self) -> Option<ErrorKind>

The kind reported by the underlying standard library I/O error, if this +error was caused by a failure to read or write bytes on an I/O stream.

+
§Example
+
use serde_json::Value;
+use std::io::{self, ErrorKind, Read};
+use std::process;
+
+struct ReaderThatWillTimeOut<'a>(&'a [u8]);
+
+impl<'a> Read for ReaderThatWillTimeOut<'a> {
+    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+        if self.0.is_empty() {
+            Err(io::Error::new(ErrorKind::TimedOut, "timed out"))
+        } else {
+            self.0.read(buf)
+        }
+    }
+}
+
+fn main() {
+    let reader = ReaderThatWillTimeOut(br#" {"k": "#);
+
+    let _: Value = match serde_json::from_reader(reader) {
+        Ok(value) => value,
+        Err(error) => {
+            if error.io_error_kind() == Some(ErrorKind::TimedOut) {
+                // Maybe this application needs to retry certain kinds of errors.
+
+            } else {
+                eprintln!("error: {}", error);
+                process::exit(1);
+            }
+        }
+    };
+}
+

Trait Implementations§

Source§

impl Debug for Error

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl Display for Error

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl Error for Error

Source§

fn source(&self) -> Option<&(dyn Error + 'static)>

Returns the lower-level source of this error, if any. Read more
1.0.0 · Source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · Source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
Source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type-based access to context intended for error reports. Read more
Source§

impl Error for Error

Source§

fn custom<T>(msg: T) -> Error
where + T: Display,

Raised when there is general error when deserializing a type. Read more
Source§

fn invalid_type(unexp: Unexpected<'_>, exp: &dyn Expected) -> Error

Raised when a Deserialize receives a type different from what it was +expecting. Read more
Source§

fn invalid_value(unexp: Unexpected<'_>, exp: &dyn Expected) -> Error

Raised when a Deserialize receives a value of the right type but that +is wrong for some other reason. Read more
Source§

fn invalid_length(len: usize, exp: &dyn Expected) -> Self

Raised when deserializing a sequence or map and the input data contains +too many or too few elements. Read more
Source§

fn unknown_variant(variant: &str, expected: &'static [&'static str]) -> Self

Raised when a Deserialize enum type received a variant with an +unrecognized name.
Source§

fn unknown_field(field: &str, expected: &'static [&'static str]) -> Self

Raised when a Deserialize struct type received a field with an +unrecognized name.
Source§

fn missing_field(field: &'static str) -> Self

Raised when a Deserialize struct type expected to receive a required +field with a particular name but that field was not present in the +input.
Source§

fn duplicate_field(field: &'static str) -> Self

Raised when a Deserialize struct type received more than one of the +same field.
Source§

impl Error for Error

Source§

fn custom<T>(msg: T) -> Error
where + T: Display,

Used when a Serialize implementation encounters any error +while serializing a type. Read more
Source§

impl From<Error> for CodecCacheError

Source§

fn from(val: JsonError) -> Self

Converts to this type from the input type.
Source§

impl From<Error> for Error

Source§

fn from(e: JsonError) -> Error

Converts to this type from the input type.

Auto Trait Implementations§

§

impl Freeze for Error

§

impl !RefUnwindSafe for Error

§

impl Send for Error

§

impl Sync for Error

§

impl Unpin for Error

§

impl !UnwindSafe for Error

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
§

impl<T> ToStringFallible for T
where + T: Display,

§

fn try_to_string(&self) -> Result<String, TryReserveError>

ToString::to_string, but without panic on OOM.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/error/type.ConnectionResult.html b/next/songbird/error/type.ConnectionResult.html new file mode 100644 index 0000000..eb51c47 --- /dev/null +++ b/next/songbird/error/type.ConnectionResult.html @@ -0,0 +1,7 @@ +ConnectionResult in songbird::error - Rust

ConnectionResult

Type Alias ConnectionResult 

Source
pub type ConnectionResult<T> = Result<T, Error>;
Expand description

Convenience type for Discord voice/driver connection error handling.

+

Aliased Type§

pub enum ConnectionResult<T> {
+    Ok(T),
+    Err(Error),
+}

Variants§

§1.0.0

Ok(T)

Contains the success value

+
§1.0.0

Err(Error)

Contains the error value

+
\ No newline at end of file diff --git a/next/songbird/error/type.JoinResult.html b/next/songbird/error/type.JoinResult.html new file mode 100644 index 0000000..b523096 --- /dev/null +++ b/next/songbird/error/type.JoinResult.html @@ -0,0 +1,7 @@ +JoinResult in songbird::error - Rust

JoinResult

Type Alias JoinResult 

Source
pub type JoinResult<T> = Result<T, JoinError>;
Expand description

Convenience type for Discord gateway error handling.

+

Aliased Type§

pub enum JoinResult<T> {
+    Ok(T),
+    Err(JoinError),
+}

Variants§

§1.0.0

Ok(T)

Contains the success value

+
§1.0.0

Err(JoinError)

Contains the error value

+
\ No newline at end of file diff --git a/next/songbird/events/context/data/connect/struct.ConnectData.html b/next/songbird/events/context/data/connect/struct.ConnectData.html new file mode 100644 index 0000000..42c5a64 --- /dev/null +++ b/next/songbird/events/context/data/connect/struct.ConnectData.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../../songbird/events/context_data/struct.ConnectData.html...

+ + + \ No newline at end of file diff --git a/next/songbird/events/context/data/disconnect/enum.DisconnectKind.html b/next/songbird/events/context/data/disconnect/enum.DisconnectKind.html new file mode 100644 index 0000000..138c1c6 --- /dev/null +++ b/next/songbird/events/context/data/disconnect/enum.DisconnectKind.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../../songbird/events/context_data/enum.DisconnectKind.html...

+ + + \ No newline at end of file diff --git a/next/songbird/events/context/data/disconnect/enum.DisconnectReason.html b/next/songbird/events/context/data/disconnect/enum.DisconnectReason.html new file mode 100644 index 0000000..37d401e --- /dev/null +++ b/next/songbird/events/context/data/disconnect/enum.DisconnectReason.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../../songbird/events/context_data/enum.DisconnectReason.html...

+ + + \ No newline at end of file diff --git a/next/songbird/events/context/data/disconnect/struct.DisconnectData.html b/next/songbird/events/context/data/disconnect/struct.DisconnectData.html new file mode 100644 index 0000000..6c98e40 --- /dev/null +++ b/next/songbird/events/context/data/disconnect/struct.DisconnectData.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../../songbird/events/context_data/struct.DisconnectData.html...

+ + + \ No newline at end of file diff --git a/next/songbird/events/context/data/index.html b/next/songbird/events/context/data/index.html new file mode 100644 index 0000000..2f7e275 --- /dev/null +++ b/next/songbird/events/context/data/index.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../songbird/events/context_data/index.html...

+ + + \ No newline at end of file diff --git a/next/songbird/events/context/data/rtcp/struct.RtcpData.html b/next/songbird/events/context/data/rtcp/struct.RtcpData.html new file mode 100644 index 0000000..fe11223 --- /dev/null +++ b/next/songbird/events/context/data/rtcp/struct.RtcpData.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../../songbird/events/context_data/struct.RtcpData.html...

+ + + \ No newline at end of file diff --git a/next/songbird/events/context/data/rtp/struct.RtpData.html b/next/songbird/events/context/data/rtp/struct.RtpData.html new file mode 100644 index 0000000..79af4d3 --- /dev/null +++ b/next/songbird/events/context/data/rtp/struct.RtpData.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../../songbird/events/context_data/struct.RtpData.html...

+ + + \ No newline at end of file diff --git a/next/songbird/events/context/data/voice/struct.VoiceData.html b/next/songbird/events/context/data/voice/struct.VoiceData.html new file mode 100644 index 0000000..ad3c0dc --- /dev/null +++ b/next/songbird/events/context/data/voice/struct.VoiceData.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../../songbird/events/context_data/struct.VoiceData.html...

+ + + \ No newline at end of file diff --git a/next/songbird/events/context/data/voice/struct.VoiceTick.html b/next/songbird/events/context/data/voice/struct.VoiceTick.html new file mode 100644 index 0000000..b11634c --- /dev/null +++ b/next/songbird/events/context/data/voice/struct.VoiceTick.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../../songbird/events/context_data/struct.VoiceTick.html...

+ + + \ No newline at end of file diff --git a/next/songbird/events/context/enum.EventContext.html b/next/songbird/events/context/enum.EventContext.html new file mode 100644 index 0000000..4233896 --- /dev/null +++ b/next/songbird/events/context/enum.EventContext.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/events/enum.EventContext.html...

+ + + \ No newline at end of file diff --git a/next/songbird/events/context_data/enum.DisconnectKind.html b/next/songbird/events/context_data/enum.DisconnectKind.html new file mode 100644 index 0000000..ff8531f --- /dev/null +++ b/next/songbird/events/context_data/enum.DisconnectKind.html @@ -0,0 +1,64 @@ +DisconnectKind in songbird::events::context_data - Rust

DisconnectKind

Enum DisconnectKind 

Source
#[non_exhaustive]
pub enum DisconnectKind { + Connect, + Reconnect, + Runtime, +}
Expand description

The location that a voice connection was terminated.

+

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

Connect

The voice driver failed to connect to the server.

+

This requires explicit handling at the gateway level +to either reconnect or fully disconnect.

+
§

Reconnect

The voice driver failed to reconnect to the server.

+

This requires explicit handling at the gateway level +to either reconnect or fully disconnect.

+
§

Runtime

The voice connection was terminated mid-session by either +the user or Discord.

+

If reason == None, then this disconnection is either +a full disconnect or a user-requested channel change. +Otherwise, this is likely a session expiry (requiring user +handling to fully disconnect/reconnect).

+

Trait Implementations§

Source§

impl Clone for DisconnectKind

Source§

fn clone(&self) -> DisconnectKind

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for DisconnectKind

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for DisconnectKind

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for DisconnectKind

Source§

fn eq(&self, other: &DisconnectKind) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for DisconnectKind

Source§

impl Eq for DisconnectKind

Source§

impl StructuralPartialEq for DisconnectKind

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/events/context_data/enum.DisconnectReason.html b/next/songbird/events/context_data/enum.DisconnectReason.html new file mode 100644 index 0000000..cfa1a16 --- /dev/null +++ b/next/songbird/events/context_data/enum.DisconnectReason.html @@ -0,0 +1,67 @@ +DisconnectReason in songbird::events::context_data - Rust

DisconnectReason

Enum DisconnectReason 

Source
#[non_exhaustive]
pub enum DisconnectReason { + AttemptDiscarded, + Internal, + Io, + ProtocolViolation, + TimedOut, + Requested, + WsClosed(Option<CloseCode>), +}
Expand description

The reason that a voice connection failed.

+

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

AttemptDiscarded

This (re)connection attempt was dropped due to another request.

+
§

Internal

Songbird had an internal error.

+

This should never happen; if this is ever seen, raise an issue with logs.

+
§

Io

A host-specific I/O error caused the fault; this is likely transient, and +should be retried some time later.

+
§

ProtocolViolation

Songbird and Discord disagreed on the protocol used to establish a +voice connection.

+

This should never happen; if this is ever seen, raise an issue with logs.

+
§

TimedOut

A voice connection was not established in the specified time.

+
§

Requested

The call was manually disconnected by a user command, e.g. Driver::leave.

+
§

WsClosed(Option<CloseCode>)

The Websocket connection was closed by Discord.

+

This typically indicates that the voice session has expired, +and a new one needs to be requested via the gateway.

+

Trait Implementations§

Source§

impl Clone for DisconnectReason

Source§

fn clone(&self) -> DisconnectReason

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for DisconnectReason

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl From<&Error> for DisconnectReason

Source§

fn from(e: &ConnectionError) -> Self

Converts to this type from the input type.
Source§

impl PartialEq for DisconnectReason

Source§

fn eq(&self, other: &DisconnectReason) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for DisconnectReason

Source§

impl Eq for DisconnectReason

Source§

impl StructuralPartialEq for DisconnectReason

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/events/context_data/index.html b/next/songbird/events/context_data/index.html new file mode 100644 index 0000000..5d63f37 --- /dev/null +++ b/next/songbird/events/context_data/index.html @@ -0,0 +1,2 @@ +songbird::events::context_data - Rust

Module context_data

Module context_data 

Source
Expand description

Types containing the main body of an EventContext.

+

Structs§

ConnectData
Voice connection details gathered at setup/reinstantiation.
DisconnectData
Voice connection details gathered at termination or failure.
RtcpData
Telemetry/statistics packet, received from another stream
RtpData
Opus audio packet, received from another stream
VoiceData
Voice packet and audio data for a single user, from a single tick.
VoiceTick
Audio data from all users in a voice channel, fired every 20ms.

Enums§

DisconnectKind
The location that a voice connection was terminated.
DisconnectReason
The reason that a voice connection failed.
\ No newline at end of file diff --git a/next/songbird/events/context_data/sidebar-items.js b/next/songbird/events/context_data/sidebar-items.js new file mode 100644 index 0000000..9872115 --- /dev/null +++ b/next/songbird/events/context_data/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["DisconnectKind","DisconnectReason"],"struct":["ConnectData","DisconnectData","RtcpData","RtpData","VoiceData","VoiceTick"]}; \ No newline at end of file diff --git a/next/songbird/events/context_data/struct.ConnectData.html b/next/songbird/events/context_data/struct.ConnectData.html new file mode 100644 index 0000000..258734e --- /dev/null +++ b/next/songbird/events/context_data/struct.ConnectData.html @@ -0,0 +1,69 @@ +ConnectData in songbird::events::context_data - Rust

ConnectData

Struct ConnectData 

Source
#[non_exhaustive]
pub struct ConnectData<'a> { + pub channel_id: Option<ChannelId>, + pub guild_id: GuildId, + pub session_id: &'a str, + pub server: &'a str, + pub ssrc: u32, +}
Expand description

Voice connection details gathered at setup/reinstantiation.

+

Fields (Non-exhaustive)§

This struct is marked as non-exhaustive
Non-exhaustive structs could have additional fields added in future. Therefore, non-exhaustive structs cannot be constructed in external crates using the traditional Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.
§channel_id: Option<ChannelId>

ID of the voice channel being joined, if it is known.

+

If this is available, then this can be used to reconnect/renew +a voice session via thew gateway.

+
§guild_id: GuildId

ID of the target voice channel’s parent guild.

+
§session_id: &'a str

Unique string describing this session for validation/authentication purposes.

+
§server: &'a str

The domain name of Discord’s voice/TURN server.

+

With the introduction of Discord’s automatic voice server selection, +this is no longer guaranteed to match a server’s settings. This field +may be useful if you need/wish to move your voice connection to a node/shard +closer to Discord.

+
§ssrc: u32

The RTP SSRC (“Synchronisation source”) assigned by the voice server +for the duration of this call.

+

All packets sent will use this SSRC, which is not related to the sender’s User +ID. These are usually allocated sequentially by Discord, following on from +a random starting SSRC.

+

Trait Implementations§

Source§

impl<'a> Clone for ConnectData<'a>

Source§

fn clone(&self) -> ConnectData<'a>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<'a> Debug for ConnectData<'a>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'a> Hash for ConnectData<'a>

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl<'a> PartialEq for ConnectData<'a>

Source§

fn eq(&self, other: &ConnectData<'a>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl<'a> Eq for ConnectData<'a>

Source§

impl<'a> StructuralPartialEq for ConnectData<'a>

Auto Trait Implementations§

§

impl<'a> Freeze for ConnectData<'a>

§

impl<'a> RefUnwindSafe for ConnectData<'a>

§

impl<'a> Send for ConnectData<'a>

§

impl<'a> Sync for ConnectData<'a>

§

impl<'a> Unpin for ConnectData<'a>

§

impl<'a> UnwindSafe for ConnectData<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/events/context_data/struct.DisconnectData.html b/next/songbird/events/context_data/struct.DisconnectData.html new file mode 100644 index 0000000..122ea1b --- /dev/null +++ b/next/songbird/events/context_data/struct.DisconnectData.html @@ -0,0 +1,52 @@ +DisconnectData in songbird::events::context_data - Rust

DisconnectData

Struct DisconnectData 

Source
#[non_exhaustive]
pub struct DisconnectData<'a> { + pub kind: DisconnectKind, + pub reason: Option<DisconnectReason>, + pub channel_id: Option<ChannelId>, + pub guild_id: GuildId, + pub session_id: &'a str, +}
Expand description

Voice connection details gathered at termination or failure.

+

In the event of a failure, this event data is gathered after +a reconnection strategy has exhausted all of its attempts.

+

Fields (Non-exhaustive)§

This struct is marked as non-exhaustive
Non-exhaustive structs could have additional fields added in future. Therefore, non-exhaustive structs cannot be constructed in external crates using the traditional Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.
§kind: DisconnectKind

The location that a voice connection was terminated.

+
§reason: Option<DisconnectReason>

The cause of any connection failure.

+

If None, then this disconnect was requested by the user in some way +(i.e., leaving or changing voice channels).

+
§channel_id: Option<ChannelId>

ID of the voice channel being joined, if it is known.

+

If this is available, then this can be used to reconnect/renew +a voice session via thew gateway.

+
§guild_id: GuildId

ID of the target voice channel’s parent guild.

+
§session_id: &'a str

Unique string describing this session for validation/authentication purposes.

+

Trait Implementations§

Source§

impl<'a> Debug for DisconnectData<'a>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<'a> Freeze for DisconnectData<'a>

§

impl<'a> RefUnwindSafe for DisconnectData<'a>

§

impl<'a> Send for DisconnectData<'a>

§

impl<'a> Sync for DisconnectData<'a>

§

impl<'a> Unpin for DisconnectData<'a>

§

impl<'a> UnwindSafe for DisconnectData<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/events/context_data/struct.RtcpData.html b/next/songbird/events/context_data/struct.RtcpData.html new file mode 100644 index 0000000..82691d5 --- /dev/null +++ b/next/songbird/events/context_data/struct.RtcpData.html @@ -0,0 +1,58 @@ +RtcpData in songbird::events::context_data - Rust

RtcpData

Struct RtcpData 

Source
#[non_exhaustive]
pub struct RtcpData { + pub packet: Bytes, + pub payload_offset: usize, + pub payload_end_pad: usize, +}
Expand description

Telemetry/statistics packet, received from another stream

+

payload_offset contains the true payload location within the raw packet’s payload(), +to allow manual decoding of Rtcp packet bodies.

+

Fields (Non-exhaustive)§

This struct is marked as non-exhaustive
Non-exhaustive structs could have additional fields added in future. Therefore, non-exhaustive structs cannot be constructed in external crates using the traditional Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.
§packet: Bytes

Raw RTCP packet data.

+
§payload_offset: usize

Byte index into the packet body (after headers) for where the payload begins.

+
§payload_end_pad: usize

Number of bytes at the end of the packet to discard.

+

Implementations§

Source§

impl RtcpData

Source

pub fn rtcp(&self) -> RtcpPacket<'_>

Create a zero-copy view of the inner RTCP packet.

+

This allows easy access to packet header fields, taking them from the underlying +Bytes as needed while handling endianness etc.

+

Trait Implementations§

Source§

impl Clone for RtcpData

Source§

fn clone(&self) -> RtcpData

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for RtcpData

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for RtcpData

Source§

fn eq(&self, other: &RtcpData) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for RtcpData

Source§

impl StructuralPartialEq for RtcpData

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/events/context_data/struct.RtpData.html b/next/songbird/events/context_data/struct.RtpData.html new file mode 100644 index 0000000..b9e4420 --- /dev/null +++ b/next/songbird/events/context_data/struct.RtpData.html @@ -0,0 +1,59 @@ +RtpData in songbird::events::context_data - Rust

RtpData

Struct RtpData 

Source
#[non_exhaustive]
pub struct RtpData { + pub packet: Bytes, + pub payload_offset: usize, + pub payload_end_pad: usize, +}
Expand description

Opus audio packet, received from another stream

+

payload_offset contains the true payload location within the raw packet’s payload(), +if extensions or raw packet data are required.

+

Fields (Non-exhaustive)§

This struct is marked as non-exhaustive
Non-exhaustive structs could have additional fields added in future. Therefore, non-exhaustive structs cannot be constructed in external crates using the traditional Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.
§packet: Bytes

Raw RTP packet data.

+

Includes the SSRC (i.e., sender) of this packet.

+
§payload_offset: usize

Byte index into the packet body (after headers) for where the payload begins.

+
§payload_end_pad: usize

Number of bytes at the end of the packet to discard.

+

Implementations§

Source§

impl RtpData

Source

pub fn rtp(&self) -> RtpPacket<'_>

Create a zero-copy view of the inner RTP packet.

+

This allows easy access to packet header fields, taking them from the underlying +Bytes as needed while handling endianness etc.

+

Trait Implementations§

Source§

impl Clone for RtpData

Source§

fn clone(&self) -> RtpData

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for RtpData

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for RtpData

Source§

fn eq(&self, other: &RtpData) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for RtpData

Source§

impl StructuralPartialEq for RtpData

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/events/context_data/struct.VoiceData.html b/next/songbird/events/context_data/struct.VoiceData.html new file mode 100644 index 0000000..0c97fc7 --- /dev/null +++ b/next/songbird/events/context_data/struct.VoiceData.html @@ -0,0 +1,58 @@ +VoiceData in songbird::events::context_data - Rust

VoiceData

Struct VoiceData 

Source
#[non_exhaustive]
pub struct VoiceData { + pub packet: Option<RtpData>, + pub decoded_voice: Option<Vec<i16>>, +}
Expand description

Voice packet and audio data for a single user, from a single tick.

+

Fields (Non-exhaustive)§

This struct is marked as non-exhaustive
Non-exhaustive structs could have additional fields added in future. Therefore, non-exhaustive structs cannot be constructed in external crates using the traditional Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.
§packet: Option<RtpData>

RTP packet clocked out for this tick.

+

If None, then the packet was lost, and Self::decoded_voice may include +around one codec delay’s worth of audio.

+
§decoded_voice: Option<Vec<i16>>

PCM audio obtained from a user.

+

Valid audio data (Some(audio) where audio.len >= 0) typically contains 20ms of 16-bit PCM audio +using native endianness. This defaults to stereo audio at 48kHz, and can be configured via +DecodeConfig::sample_rate and DecodeConfig::sample_rate – channels are interleaved +(i.e., L, R, L, R, ...) if stereo.

+

This value will be None if Songbird is not configured to decode audio.

+

Trait Implementations§

Source§

impl Clone for VoiceData

Source§

fn clone(&self) -> VoiceData

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for VoiceData

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for VoiceData

Source§

fn eq(&self, other: &VoiceData) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for VoiceData

Source§

impl StructuralPartialEq for VoiceData

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/events/context_data/struct.VoiceTick.html b/next/songbird/events/context_data/struct.VoiceTick.html new file mode 100644 index 0000000..5ca54b1 --- /dev/null +++ b/next/songbird/events/context_data/struct.VoiceTick.html @@ -0,0 +1,54 @@ +VoiceTick in songbird::events::context_data - Rust

VoiceTick

Struct VoiceTick 

Source
#[non_exhaustive]
pub struct VoiceTick { + pub speaking: HashMap<u32, VoiceData>, + pub silent: HashSet<u32>, +}
Expand description

Audio data from all users in a voice channel, fired every 20ms.

+

Songbird implements a jitter buffer to sycnhronise user packets, smooth out network latency, and +handle packet reordering by the network. Packet playout via this event is delayed by approximately +Config::playout_buffer_length * 20ms from its original arrival.

+

Fields (Non-exhaustive)§

This struct is marked as non-exhaustive
Non-exhaustive structs could have additional fields added in future. Therefore, non-exhaustive structs cannot be constructed in external crates using the traditional Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.
§speaking: HashMap<u32, VoiceData>

Decoded voice data and source packets sent by each user.

+
§silent: HashSet<u32>

Set of all SSRCs currently known in the call who aren’t included in Self::speaking.

+

Trait Implementations§

Source§

impl Clone for VoiceTick

Source§

fn clone(&self) -> VoiceTick

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for VoiceTick

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for VoiceTick

Source§

fn eq(&self, other: &VoiceTick) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for VoiceTick

Source§

impl StructuralPartialEq for VoiceTick

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/events/core/enum.CoreEvent.html b/next/songbird/events/core/enum.CoreEvent.html new file mode 100644 index 0000000..931e3d7 --- /dev/null +++ b/next/songbird/events/core/enum.CoreEvent.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/events/enum.CoreEvent.html...

+ + + \ No newline at end of file diff --git a/next/songbird/events/data/struct.EventData.html b/next/songbird/events/data/struct.EventData.html new file mode 100644 index 0000000..ee0b7cb --- /dev/null +++ b/next/songbird/events/data/struct.EventData.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/events/struct.EventData.html...

+ + + \ No newline at end of file diff --git a/next/songbird/events/enum.CoreEvent.html b/next/songbird/events/enum.CoreEvent.html new file mode 100644 index 0000000..3cc190e --- /dev/null +++ b/next/songbird/events/enum.CoreEvent.html @@ -0,0 +1,92 @@ +CoreEvent in songbird::events - Rust

CoreEvent

Enum CoreEvent 

Source
#[non_exhaustive]
pub enum CoreEvent { + SpeakingStateUpdate, + VoiceTick, + RtpPacket, + RtcpPacket, + ClientDisconnect, + DriverConnect, + DriverReconnect, + DriverDisconnect, +}
Expand description

Voice core events occur on receipt of +voice packets and telemetry.

+

Core events persist while the action in EventData +returns None.

+

§Events from other users

+

Songbird can observe when a user speaks for the first time (SpeakingStateUpdate), +when a client leaves the session (ClientDisconnect).

+

When the "receive" feature is enabled, songbird can also handle voice packets +(RtpPacket), +decode and track speaking users +(VoiceTick), +and handle telemetry data +(RtcpPacket). +The format of voice packets is described by +VoiceData.

+

To detect when a user connects, you must correlate gateway (e.g., VoiceStateUpdate) events +from the main part of your bot.

+

To obtain a user’s SSRC, you must use SpeakingStateUpdate events.

+

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

SpeakingStateUpdate

Speaking state update from the WS gateway, typically describing how another voice +user is transmitting audio data. Clients must send at least one such +packet to allow SSRC/UserID matching.

+

Fired on receipt of a speaking state update from another host.

+

Note: this will fire when a user starts speaking for the first time, +or changes their capabilities.

+
§

VoiceTick

Fires every 20ms, containing the scheduled voice packet and decoded audio +data for each live user.

+
§

RtpPacket

Fires on receipt of a voice packet from another stream in the voice call.

+

As RTP packets do not map to Discord’s notion of users, SSRCs must be mapped +back using the user IDs seen through client connection, disconnection, +or speaking state update.

+
§

RtcpPacket

Fires on receipt of an RTCP packet, containing various call stats +such as latency reports.

+
§

ClientDisconnect

Fires whenever a user disconnects from the same stream as the bot.

+
§

DriverConnect

Fires when this driver successfully connects to a voice channel.

+
§

DriverReconnect

Fires when this driver successfully reconnects after a network error.

+
§

DriverDisconnect

Fires when this driver fails to connect to, or drops from, a voice channel.

+

Trait Implementations§

Source§

impl Clone for CoreEvent

Source§

fn clone(&self) -> CoreEvent

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for CoreEvent

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl From<CoreEvent> for Event

Source§

fn from(evt: CoreEvent) -> Self

Converts to this type from the input type.
Source§

impl From<CoreEvent> for UntimedEvent

Source§

fn from(evt: CoreEvent) -> Self

Converts to this type from the input type.
Source§

impl Hash for CoreEvent

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for CoreEvent

Source§

fn eq(&self, other: &CoreEvent) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for CoreEvent

Source§

impl Eq for CoreEvent

Source§

impl StructuralPartialEq for CoreEvent

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/events/enum.Event.html b/next/songbird/events/enum.Event.html new file mode 100644 index 0000000..b1e5112 --- /dev/null +++ b/next/songbird/events/enum.Event.html @@ -0,0 +1,79 @@ +Event in songbird::events - Rust

Event

Enum Event 

Source
#[non_exhaustive]
pub enum Event { + Periodic(Duration, Option<Duration>), + Delayed(Duration), + Track(TrackEvent), + Core(CoreEvent), + Cancel, +}
Expand description

Classes of event which may occur, triggering a handler +at the local (track-specific) or global level.

+

Local time-based events rely upon the current playback +time of a track, and so will not fire if a track becomes paused +or stops. In case this is required, global events are a better +fit.

+

Event handlers themselves are described in EventData::new.

+

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

Periodic(Duration, Option<Duration>)

Periodic events rely upon two parameters: a period +and an optional phase.

+

If the phase is None, then the event will first fire +in one period. Periodic events repeat automatically +so long as the action in EventData returns None.

+
§

Delayed(Duration)

Delayed events rely upon a delay parameter, and +fire one delay after the audio context processes them.

+

Delayed events are automatically removed once fired, +so long as the action in EventData returns None.

+
§

Track(TrackEvent)

Track events correspond to certain actions or changes +of state, such as a track finishing, looping, or being +manually stopped.

+

Track events persist while the action in EventData +returns None.

+
§

Core(CoreEvent)

Core events

+

Track events persist while the action in EventData +returns None. Core events must be applied globally, +as attaching them to a track is a no-op.

+
§

Cancel

Cancels the event, if it was intended to persist.

+

Trait Implementations§

Source§

impl Clone for Event

Source§

fn clone(&self) -> Event

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Event

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl From<CoreEvent> for Event

Source§

fn from(evt: CoreEvent) -> Self

Converts to this type from the input type.
Source§

impl From<TrackEvent> for Event

Source§

fn from(evt: TrackEvent) -> Self

Converts to this type from the input type.
Source§

impl Hash for Event

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Event

Source§

fn eq(&self, other: &Event) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for Event

Source§

impl Eq for Event

Source§

impl StructuralPartialEq for Event

Auto Trait Implementations§

§

impl Freeze for Event

§

impl RefUnwindSafe for Event

§

impl Send for Event

§

impl Sync for Event

§

impl Unpin for Event

§

impl UnwindSafe for Event

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/events/enum.EventContext.html b/next/songbird/events/enum.EventContext.html new file mode 100644 index 0000000..a53f25e --- /dev/null +++ b/next/songbird/events/enum.EventContext.html @@ -0,0 +1,61 @@ +EventContext in songbird::events - Rust

EventContext

Enum EventContext 

Source
#[non_exhaustive]
pub enum EventContext<'a> { + Track(&'a [(&'a TrackState, &'a TrackHandle)]), + SpeakingStateUpdate(Speaking), + VoiceTick(VoiceTick), + RtpPacket(RtpData), + RtcpPacket(RtcpData), + ClientDisconnect(ClientDisconnect), + DriverConnect(ConnectData<'a>), + DriverReconnect(ConnectData<'a>), + DriverDisconnect(DisconnectData<'a>), +}
Expand description

Information about which tracks or data fired an event.

+

Track events may be local or global, and have no tracks +if fired on the global context via Driver::add_global_event.

+

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

Track(&'a [(&'a TrackState, &'a TrackHandle)])

Track event context, passed to events created via TrackHandle::add_event, +EventStore::add_event, or relevant global events.

+
§

SpeakingStateUpdate(Speaking)

Speaking state update, typically describing how another voice +user is transmitting audio data. Clients must send at least one such +packet to allow SSRC/UserID matching.

+
§

VoiceTick(VoiceTick)

Reordered and decoded audio packets, received every 20ms.

+
§

RtpPacket(RtpData)

Opus audio packet, received from another stream.

+
§

RtcpPacket(RtcpData)

Telemetry/statistics packet, received from another stream.

+
§

ClientDisconnect(ClientDisconnect)

Fired whenever a client disconnects.

+
§

DriverConnect(ConnectData<'a>)

Fires when this driver successfully connects to a voice channel.

+
§

DriverReconnect(ConnectData<'a>)

Fires when this driver successfully reconnects after a network error.

+
§

DriverDisconnect(DisconnectData<'a>)

Fires when this driver fails to connect to, or drops from, a voice channel.

+

Implementations§

Source§

impl EventContext<'_>

Source

pub fn to_core_event(&self) -> Option<CoreEvent>

Retreive the event class for an event (i.e., when matching) +an event against the registered listeners.

+

Trait Implementations§

Source§

impl<'a> Debug for EventContext<'a>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<'a> !Freeze for EventContext<'a>

§

impl<'a> !RefUnwindSafe for EventContext<'a>

§

impl<'a> Send for EventContext<'a>

§

impl<'a> Sync for EventContext<'a>

§

impl<'a> Unpin for EventContext<'a>

§

impl<'a> !UnwindSafe for EventContext<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/events/enum.TrackEvent.html b/next/songbird/events/enum.TrackEvent.html new file mode 100644 index 0000000..d9dc598 --- /dev/null +++ b/next/songbird/events/enum.TrackEvent.html @@ -0,0 +1,72 @@ +TrackEvent in songbird::events - Rust

TrackEvent

Enum TrackEvent 

Source
#[non_exhaustive]
pub enum TrackEvent { + Play, + Pause, + End, + Loop, + Preparing, + Playable, + Error, +}
Expand description

Track events correspond to certain actions or changes +of state, such as a track finishing, looping, or being +manually stopped. Voice core events occur on receipt of +voice packets and telemetry.

+

Track events persist while the action in EventData +returns None.

+

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

Play

The attached track has resumed playing.

+

This event will not fire when a track first starts, +but will fire when a track changes from, e.g., paused to playing. +This is most relevant for queue users: queued tracks placed into a +non-empty queue are initlally paused, and are later moved to Play.

+
§

Pause

The attached track has been paused.

+
§

End

The attached track has ended.

+
§

Loop

The attached track has looped.

+
§

Preparing

The attached track is being readied or recreated.

+
§

Playable

The attached track has become playable.

+
§

Error

The attached track has encountered a runtime or initialisation error.

+

Trait Implementations§

Source§

impl Clone for TrackEvent

Source§

fn clone(&self) -> TrackEvent

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for TrackEvent

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl From<TrackEvent> for Event

Source§

fn from(evt: TrackEvent) -> Self

Converts to this type from the input type.
Source§

impl From<TrackEvent> for UntimedEvent

Source§

fn from(evt: TrackEvent) -> Self

Converts to this type from the input type.
Source§

impl Hash for TrackEvent

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for TrackEvent

Source§

fn eq(&self, other: &TrackEvent) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for TrackEvent

Source§

impl Eq for TrackEvent

Source§

impl StructuralPartialEq for TrackEvent

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/events/enum.UntimedEvent.html b/next/songbird/events/enum.UntimedEvent.html new file mode 100644 index 0000000..a391e9a --- /dev/null +++ b/next/songbird/events/enum.UntimedEvent.html @@ -0,0 +1,56 @@ +UntimedEvent in songbird::events - Rust

UntimedEvent

Enum UntimedEvent 

Source
#[non_exhaustive]
pub enum UntimedEvent { + Track(TrackEvent), + Core(CoreEvent), +}
Expand description

Track and voice core events.

+

Untimed events persist while the action in EventData +returns None.

+

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

Track(TrackEvent)

Untimed events belonging to a track, such as state changes, end, or loops.

+
§

Core(CoreEvent)

Untimed events belonging to the global context, such as finished tracks, +client speaking updates, or RT(C)P voice and telemetry data.

+

Trait Implementations§

Source§

impl Clone for UntimedEvent

Source§

fn clone(&self) -> UntimedEvent

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for UntimedEvent

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl From<CoreEvent> for UntimedEvent

Source§

fn from(evt: CoreEvent) -> Self

Converts to this type from the input type.
Source§

impl From<TrackEvent> for UntimedEvent

Source§

fn from(evt: TrackEvent) -> Self

Converts to this type from the input type.
Source§

impl Hash for UntimedEvent

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for UntimedEvent

Source§

fn eq(&self, other: &UntimedEvent) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for UntimedEvent

Source§

impl Eq for UntimedEvent

Source§

impl StructuralPartialEq for UntimedEvent

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/events/index.html b/next/songbird/events/index.html new file mode 100644 index 0000000..9a879e1 --- /dev/null +++ b/next/songbird/events/index.html @@ -0,0 +1,35 @@ +songbird::events - Rust

Module events

Module events 

Source
Expand description

Events relating to tracks, timing, and other callers.

+

§Listening for events

+

Driver events in Songbird are composed of two parts:

+
    +
  • An Event to listen out for. These may be discrete events, +or generated by timers.
  • +
  • An EventHandler to be called on receipt of an event. As event +handlers may be shared between several events, the handler is called +with an EventContext describing which event was fired.
  • +
+

Event handlers are registered using functions such as Driver::add_global_event, +or TrackHandle::add_event, or. Internally, these pairs are stored +as EventData.

+

§EventHandler lifecycle

+

An event handler is essentially just an async function which may return +another type of event to listen out for (an Option<Event>). For instance, +Some(Event::Cancel) will remove that event listener, while None won’t +change it at all.

+

The exception is one-off events like Event::Delayed, which remove themselves +after one call unless an Event override is returned.

+

§Global and local listeners

+

Global event listeners are those which are placed onto the Driver, +while local event listeners are those which are placed on a +Track/Handle.

+

Track or timed events, when local, return a reference to the parent track. +When registered globally, they fire on a per-tick basis, returning references to +all relevant tracks in that 20ms window. Global/local timed events use a global +timer or a track’s playback time, respectively.

+

CoreEvents may only be registered globally.

+

Modules§

context_data
Types containing the main body of an EventContext.

Structs§

EventData
Internal representation of an event, as handled by the audio context.
EventStore
Storage for EventData, designed to be used for both local and global contexts.

Enums§

CoreEvent
Voice core events occur on receipt of +voice packets and telemetry.
Event
Classes of event which may occur, triggering a handler +at the local (track-specific) or global level.
EventContext
Information about which tracks or data fired an event.
TrackEvent
Track events correspond to certain actions or changes +of state, such as a track finishing, looping, or being +manually stopped. Voice core events occur on receipt of +voice packets and telemetry.
UntimedEvent
Track and voice core events.

Traits§

EventHandler
Trait to handle an event which can be fired per-track, or globally.
\ No newline at end of file diff --git a/next/songbird/events/sidebar-items.js b/next/songbird/events/sidebar-items.js new file mode 100644 index 0000000..5518ffe --- /dev/null +++ b/next/songbird/events/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["CoreEvent","Event","EventContext","TrackEvent","UntimedEvent"],"mod":["context_data"],"struct":["EventData","EventStore"],"trait":["EventHandler"]}; \ No newline at end of file diff --git a/next/songbird/events/store/struct.EventStore.html b/next/songbird/events/store/struct.EventStore.html new file mode 100644 index 0000000..e90a854 --- /dev/null +++ b/next/songbird/events/store/struct.EventStore.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/events/struct.EventStore.html...

+ + + \ No newline at end of file diff --git a/next/songbird/events/struct.EventData.html b/next/songbird/events/struct.EventData.html new file mode 100644 index 0000000..3939128 --- /dev/null +++ b/next/songbird/events/struct.EventData.html @@ -0,0 +1,58 @@ +EventData in songbird::events - Rust

EventData

Struct EventData 

Source
pub struct EventData { /* private fields */ }
Expand description

Internal representation of an event, as handled by the audio context.

+

Implementations§

Source§

impl EventData

Source

pub fn new<F: EventHandler + 'static>(event: Event, action: F) -> Self

Create a representation of an event and its associated handler.

+

An event handler, action, receives an EventContext and optionally +produces a new Event type for itself. Returning None will +maintain the same event type, while removing any Delayed entries. +Event handlers will be re-added with their new trigger condition, +or removed if Cancelled

+
Source

pub fn compute_activation(&mut self, now: Duration)

Computes the next firing time for a timer event.

+

Trait Implementations§

Source§

impl Debug for EventData

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl Ord for EventData

Events are ordered/compared based on their firing time.

+
Source§

fn cmp(&self, other: &Self) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for EventData

Source§

fn eq(&self, other: &Self) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for EventData

Source§

fn partial_cmp(&self, other: &Self) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Eq for EventData

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/events/struct.EventStore.html b/next/songbird/events/struct.EventStore.html new file mode 100644 index 0000000..25f8dfc --- /dev/null +++ b/next/songbird/events/struct.EventStore.html @@ -0,0 +1,43 @@ +EventStore in songbird::events - Rust

EventStore

Struct EventStore 

Source
pub struct EventStore { /* private fields */ }
Expand description

Storage for EventData, designed to be used for both local and global contexts.

+

Timed events are stored in a binary heap for fast selection, and have custom Eq, +Ord, etc. implementations to support (only) this.

+

Implementations§

Source§

impl EventStore

Source

pub fn new() -> Self

Creates a new event store to be used globally.

+
Source

pub fn new_local() -> Self

Creates a new event store to be used within a Track.

+

This is usually automatically installed by the driver once +a track has been registered.

+
Source

pub fn add_event(&mut self, evt: EventData, now: Duration)

Add an event to this store.

+

Updates evt according to EventData::compute_activation.

+

Trait Implementations§

Source§

impl Debug for EventStore

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for EventStore

Source§

fn default() -> EventStore

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/events/track/enum.TrackEvent.html b/next/songbird/events/track/enum.TrackEvent.html new file mode 100644 index 0000000..4d78f20 --- /dev/null +++ b/next/songbird/events/track/enum.TrackEvent.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/events/enum.TrackEvent.html...

+ + + \ No newline at end of file diff --git a/next/songbird/events/trait.EventHandler.html b/next/songbird/events/trait.EventHandler.html new file mode 100644 index 0000000..dba069d --- /dev/null +++ b/next/songbird/events/trait.EventHandler.html @@ -0,0 +1,21 @@ +EventHandler in songbird::events - Rust

EventHandler

Trait EventHandler 

Source
pub trait EventHandler: Send + Sync {
+    // Required method
+    fn act<'life0, 'life1, 'life2, 'async_trait>(
+        &'life0 self,
+        ctx: &'life1 EventContext<'life2>,
+    ) -> Pin<Box<dyn Future<Output = Option<Event>> + Send + 'async_trait>>
+       where Self: 'async_trait,
+             'life0: 'async_trait,
+             'life1: 'async_trait,
+             'life2: 'async_trait;
+}
Expand description

Trait to handle an event which can be fired per-track, or globally.

+

These may be feasibly reused between several event sources.

+

Required Methods§

Source

fn act<'life0, 'life1, 'life2, 'async_trait>( + &'life0 self, + ctx: &'life1 EventContext<'life2>, +) -> Pin<Box<dyn Future<Output = Option<Event>> + Send + 'async_trait>>
where + Self: 'async_trait, + 'life0: 'async_trait, + 'life1: 'async_trait, + 'life2: 'async_trait,

Respond to one received event.

+

Implementors§

\ No newline at end of file diff --git a/next/songbird/events/untimed/enum.UntimedEvent.html b/next/songbird/events/untimed/enum.UntimedEvent.html new file mode 100644 index 0000000..61d7b4c --- /dev/null +++ b/next/songbird/events/untimed/enum.UntimedEvent.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/events/enum.UntimedEvent.html...

+ + + \ No newline at end of file diff --git a/next/songbird/handler/struct.Call.html b/next/songbird/handler/struct.Call.html new file mode 100644 index 0000000..158b9bf --- /dev/null +++ b/next/songbird/handler/struct.Call.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../songbird/struct.Call.html...

+ + + \ No newline at end of file diff --git a/next/songbird/id/index.html b/next/songbird/id/index.html new file mode 100644 index 0000000..3a42b9a --- /dev/null +++ b/next/songbird/id/index.html @@ -0,0 +1,2 @@ +songbird::id - Rust

Module id

Module id 

Source
Expand description

Newtypes around Discord IDs for library cross-compatibility.

+

Structs§

ChannelId
ID of a Discord voice/text channel.
GuildId
ID of a Discord guild (colloquially, “server”).
UserId
ID of a Discord user.
\ No newline at end of file diff --git a/next/songbird/id/sidebar-items.js b/next/songbird/id/sidebar-items.js new file mode 100644 index 0000000..6c25c03 --- /dev/null +++ b/next/songbird/id/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["ChannelId","GuildId","UserId"]}; \ No newline at end of file diff --git a/next/songbird/id/struct.ChannelId.html b/next/songbird/id/struct.ChannelId.html new file mode 100644 index 0000000..1b05cb5 --- /dev/null +++ b/next/songbird/id/struct.ChannelId.html @@ -0,0 +1,51 @@ +ChannelId in songbird::id - Rust

ChannelId

Struct ChannelId 

Source
pub struct ChannelId(pub NonZeroU64);
Expand description

ID of a Discord voice/text channel.

+

Tuple Fields§

§0: NonZeroU64

Trait Implementations§

Source§

impl Clone for ChannelId

Source§

fn clone(&self) -> ChannelId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ChannelId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for ChannelId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult

Formats the value using the given formatter. Read more
Source§

impl From<ChannelId> for ChannelId

Source§

fn from(id: SerenityChannel) -> Self

Converts to this type from the input type.
Source§

impl From<Id<ChannelMarker>> for ChannelId

Source§

fn from(id: TwilightId<ChannelMarker>) -> Self

Converts to this type from the input type.
Source§

impl From<NonZero<u64>> for ChannelId

Source§

fn from(id: NonZeroU64) -> Self

Converts to this type from the input type.
Source§

impl Hash for ChannelId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for ChannelId

Source§

fn eq(&self, other: &ChannelId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for ChannelId

Source§

impl Eq for ChannelId

Source§

impl StructuralPartialEq for ChannelId

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
§

impl<T> ToStringFallible for T
where + T: Display,

§

fn try_to_string(&self) -> Result<String, TryReserveError>

ToString::to_string, but without panic on OOM.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/id/struct.GuildId.html b/next/songbird/id/struct.GuildId.html new file mode 100644 index 0000000..fac9006 --- /dev/null +++ b/next/songbird/id/struct.GuildId.html @@ -0,0 +1,51 @@ +GuildId in songbird::id - Rust

GuildId

Struct GuildId 

Source
pub struct GuildId(pub NonZeroU64);
Expand description

ID of a Discord guild (colloquially, “server”).

+

Tuple Fields§

§0: NonZeroU64

Trait Implementations§

Source§

impl Clone for GuildId

Source§

fn clone(&self) -> GuildId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for GuildId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for GuildId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult

Formats the value using the given formatter. Read more
Source§

impl From<GuildId> for GuildId

Source§

fn from(id: SerenityGuild) -> Self

Converts to this type from the input type.
Source§

impl From<GuildId> for GuildId

Source§

fn from(id: GuildId) -> Self

Converts to this type from the input type.
Source§

impl From<Id<GuildMarker>> for GuildId

Source§

fn from(id: TwilightId<GuildMarker>) -> Self

Converts to this type from the input type.
Source§

impl From<NonZero<u64>> for GuildId

Source§

fn from(id: NonZeroU64) -> Self

Converts to this type from the input type.
Source§

impl Hash for GuildId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for GuildId

Source§

fn eq(&self, other: &GuildId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for GuildId

Source§

impl Eq for GuildId

Source§

impl StructuralPartialEq for GuildId

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
§

impl<T> ToStringFallible for T
where + T: Display,

§

fn try_to_string(&self) -> Result<String, TryReserveError>

ToString::to_string, but without panic on OOM.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/id/struct.UserId.html b/next/songbird/id/struct.UserId.html new file mode 100644 index 0000000..5cdb22f --- /dev/null +++ b/next/songbird/id/struct.UserId.html @@ -0,0 +1,51 @@ +UserId in songbird::id - Rust

UserId

Struct UserId 

Source
pub struct UserId(pub NonZeroU64);
Expand description

ID of a Discord user.

+

Tuple Fields§

§0: NonZeroU64

Trait Implementations§

Source§

impl Clone for UserId

Source§

fn clone(&self) -> UserId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for UserId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for UserId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult

Formats the value using the given formatter. Read more
Source§

impl From<Id<UserMarker>> for UserId

Source§

fn from(id: TwilightId<UserMarker>) -> Self

Converts to this type from the input type.
Source§

impl From<NonZero<u64>> for UserId

Source§

fn from(id: NonZeroU64) -> Self

Converts to this type from the input type.
Source§

impl From<UserId> for UserId

Source§

fn from(id: SerenityUser) -> Self

Converts to this type from the input type.
Source§

impl From<UserId> for UserId

Source§

fn from(id: UserId) -> Self

Converts to this type from the input type.
Source§

impl Hash for UserId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for UserId

Source§

fn eq(&self, other: &UserId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for UserId

Source§

impl Eq for UserId

Source§

impl StructuralPartialEq for UserId

Auto Trait Implementations§

§

impl Freeze for UserId

§

impl RefUnwindSafe for UserId

§

impl Send for UserId

§

impl Sync for UserId

§

impl Unpin for UserId

§

impl UnwindSafe for UserId

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
§

impl<T> ToStringFallible for T
where + T: Display,

§

fn try_to_string(&self) -> Result<String, TryReserveError>

ToString::to_string, but without panic on OOM.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/index.html b/next/songbird/index.html new file mode 100644 index 0000000..42159ba --- /dev/null +++ b/next/songbird/index.html @@ -0,0 +1,40 @@ +songbird - Rust

Crate songbird

Crate songbird 

Source
Expand description

project logo

+

Songbird is an async, cross-library compatible voice system for Discord, written in Rust. +The library offers:

+
    +
  • A standalone gateway frontend compatible with serenity and twilight using the +"gateway" and "[serenity/twilight]" plus "[rustls/native]" features. You can even run +driverless, to help manage your lavalink sessions.
  • +
  • A standalone driver for voice calls, via the "driver" feature. If you can create +a ConnectionInfo using any other gateway, or language for your bot, then you +can run the songbird voice driver.
  • +
  • Voice receive and RT(C)P packet handling via the "receive" feature.
  • +
  • And, by default, a fully featured voice system featuring events, queues, +seeking on compatible streams, shared multithreaded audio stream caches, +and direct Opus data passthrough from DCA files.
  • +
+

§Intents

+

Songbird’s gateway functionality requires you to specify the GUILD_VOICE_STATES intent.

+

§Examples

+

Full examples showing various types of functionality and integrations can be found +in this crate’s examples directory.

+

§Codec support

+

Songbird supports all codecs and formats provided by Symphonia (pure-Rust), with Opus support +provided by audiopus (an FFI wrapper for libopus).

+

By default, Songbird will not request any codecs from Symphonia. To change this, in your own +project you will need to depend on Symphonia as well.

+
# Including songbird alone gives you support for Opus via the DCA file format.
+[dependencies.songbird]
+version = "0.5"
+features = ["builtin-queue"]
+
+# To get additional codecs, you *must* add Symphonia yourself.
+# This includes the default formats (MKV/WebM, Ogg, Wave) and codecs (FLAC, PCM, Vorbis)...
+[dependencies.symphonia]
+version = "0.5"
+features = ["aac", "mp3", "isomp4", "alac"] # ...as well as any extras you need!

§Attribution

+

Songbird’s logo is based upon the copyright-free image “Black-Capped Chickadee” by George Gorgas White.

+

Re-exports§

pub use crate::driver::Driver;
pub use crate::events::CoreEvent;
pub use crate::events::Event;
pub use crate::events::EventContext;
pub use crate::events::EventHandler;
pub use crate::events::TrackEvent;
pub use discortp as packet;
pub use serenity_voice_model as model;
pub use crate::serenity::*;

Modules§

constants
Constants affecting driver function and API handling.
driver
Runner for a voice connection.
error
Driver and gateway error handling.
events
Events relating to tracks, timing, and other callers.
id
Newtypes around Discord IDs for library cross-compatibility.
input
Raw audio input data streams and sources.
join
Future types for gateway interactions.
serenity
Compatibility and convenience methods for working with serenity. +Requires the "serenity" feature.
shards
Handlers for sending packets over sharded connections.
tracks
Live, controllable audio instances.

Structs§

Call
The Call handler is responsible for a single voice connection, acting +as a clean API above the inner state and gateway message management.
Config
Configuration for drivers and calls.
ConnectionInfo
Parameters and information needed to start communicating with Discord’s voice servers, either +with the Songbird driver, lavalink, or other system.
Iter
An iterator over all Calls currently stored in the manager instance.
Songbird
A shard-aware struct responsible for managing Calls.
\ No newline at end of file diff --git a/next/songbird/info/struct.ConnectionInfo.html b/next/songbird/info/struct.ConnectionInfo.html new file mode 100644 index 0000000..06f62dc --- /dev/null +++ b/next/songbird/info/struct.ConnectionInfo.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../songbird/struct.ConnectionInfo.html...

+ + + \ No newline at end of file diff --git a/next/songbird/input/adapters/async_adapter/struct.AsyncAdapterStream.html b/next/songbird/input/adapters/async_adapter/struct.AsyncAdapterStream.html new file mode 100644 index 0000000..009dcc9 --- /dev/null +++ b/next/songbird/input/adapters/async_adapter/struct.AsyncAdapterStream.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../songbird/input/struct.AsyncAdapterStream.html...

+ + + \ No newline at end of file diff --git a/next/songbird/input/adapters/async_adapter/trait.AsyncMediaSource.html b/next/songbird/input/adapters/async_adapter/trait.AsyncMediaSource.html new file mode 100644 index 0000000..68221e6 --- /dev/null +++ b/next/songbird/input/adapters/async_adapter/trait.AsyncMediaSource.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../songbird/input/trait.AsyncMediaSource.html...

+ + + \ No newline at end of file diff --git a/next/songbird/input/adapters/cached/compressed/struct.Compressed.html b/next/songbird/input/adapters/cached/compressed/struct.Compressed.html new file mode 100644 index 0000000..980cb8a --- /dev/null +++ b/next/songbird/input/adapters/cached/compressed/struct.Compressed.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../../songbird/input/cached/struct.Compressed.html...

+ + + \ No newline at end of file diff --git a/next/songbird/input/adapters/cached/compressed/struct.Config.html b/next/songbird/input/adapters/cached/compressed/struct.Config.html new file mode 100644 index 0000000..0f36cc9 --- /dev/null +++ b/next/songbird/input/adapters/cached/compressed/struct.Config.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../../songbird/input/cached/struct.Config.html...

+ + + \ No newline at end of file diff --git a/next/songbird/input/adapters/cached/compressed/struct.OpusCompressor.html b/next/songbird/input/adapters/cached/compressed/struct.OpusCompressor.html new file mode 100644 index 0000000..d51de26 --- /dev/null +++ b/next/songbird/input/adapters/cached/compressed/struct.OpusCompressor.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../../songbird/input/cached/struct.OpusCompressor.html...

+ + + \ No newline at end of file diff --git a/next/songbird/input/adapters/cached/decompressed/struct.Decompressed.html b/next/songbird/input/adapters/cached/decompressed/struct.Decompressed.html new file mode 100644 index 0000000..92ae899 --- /dev/null +++ b/next/songbird/input/adapters/cached/decompressed/struct.Decompressed.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../../songbird/input/cached/struct.Decompressed.html...

+ + + \ No newline at end of file diff --git a/next/songbird/input/adapters/cached/error/enum.CodecCacheError.html b/next/songbird/input/adapters/cached/error/enum.CodecCacheError.html new file mode 100644 index 0000000..b138c63 --- /dev/null +++ b/next/songbird/input/adapters/cached/error/enum.CodecCacheError.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../../songbird/input/cached/enum.CodecCacheError.html...

+ + + \ No newline at end of file diff --git a/next/songbird/input/adapters/cached/error/enum.Error.html b/next/songbird/input/adapters/cached/error/enum.Error.html new file mode 100644 index 0000000..3d62447 --- /dev/null +++ b/next/songbird/input/adapters/cached/error/enum.Error.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../../songbird/input/cached/enum.Error.html...

+ + + \ No newline at end of file diff --git a/next/songbird/input/adapters/cached/fn.compressed_cost_per_sec.html b/next/songbird/input/adapters/cached/fn.compressed_cost_per_sec.html new file mode 100644 index 0000000..c901b0b --- /dev/null +++ b/next/songbird/input/adapters/cached/fn.compressed_cost_per_sec.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../songbird/input/cached/fn.compressed_cost_per_sec.html...

+ + + \ No newline at end of file diff --git a/next/songbird/input/adapters/cached/fn.default_config.html b/next/songbird/input/adapters/cached/fn.default_config.html new file mode 100644 index 0000000..5299d00 --- /dev/null +++ b/next/songbird/input/adapters/cached/fn.default_config.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../songbird/input/cached/fn.default_config.html...

+ + + \ No newline at end of file diff --git a/next/songbird/input/adapters/cached/fn.raw_cost_per_sec.html b/next/songbird/input/adapters/cached/fn.raw_cost_per_sec.html new file mode 100644 index 0000000..2c865b6 --- /dev/null +++ b/next/songbird/input/adapters/cached/fn.raw_cost_per_sec.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../songbird/input/cached/fn.raw_cost_per_sec.html...

+ + + \ No newline at end of file diff --git a/next/songbird/input/adapters/cached/hint/enum.LengthHint.html b/next/songbird/input/adapters/cached/hint/enum.LengthHint.html new file mode 100644 index 0000000..65e8e87 --- /dev/null +++ b/next/songbird/input/adapters/cached/hint/enum.LengthHint.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../../songbird/input/cached/enum.LengthHint.html...

+ + + \ No newline at end of file diff --git a/next/songbird/input/adapters/cached/hint/fn.apply_length_hint.html b/next/songbird/input/adapters/cached/hint/fn.apply_length_hint.html new file mode 100644 index 0000000..9b0b7f1 --- /dev/null +++ b/next/songbird/input/adapters/cached/hint/fn.apply_length_hint.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../../songbird/input/cached/fn.apply_length_hint.html...

+ + + \ No newline at end of file diff --git a/next/songbird/input/adapters/cached/index.html b/next/songbird/input/adapters/cached/index.html new file mode 100644 index 0000000..a6b3363 --- /dev/null +++ b/next/songbird/input/adapters/cached/index.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../songbird/input/cached/index.html...

+ + + \ No newline at end of file diff --git a/next/songbird/input/adapters/cached/memory/struct.Memory.html b/next/songbird/input/adapters/cached/memory/struct.Memory.html new file mode 100644 index 0000000..e50b4b8 --- /dev/null +++ b/next/songbird/input/adapters/cached/memory/struct.Memory.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../../songbird/input/cached/struct.Memory.html...

+ + + \ No newline at end of file diff --git a/next/songbird/input/adapters/child/struct.ChildContainer.html b/next/songbird/input/adapters/child/struct.ChildContainer.html new file mode 100644 index 0000000..fd988b0 --- /dev/null +++ b/next/songbird/input/adapters/child/struct.ChildContainer.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../songbird/input/struct.ChildContainer.html...

+ + + \ No newline at end of file diff --git a/next/songbird/input/adapters/raw_adapter/struct.RawAdapter.html b/next/songbird/input/adapters/raw_adapter/struct.RawAdapter.html new file mode 100644 index 0000000..0729ae8 --- /dev/null +++ b/next/songbird/input/adapters/raw_adapter/struct.RawAdapter.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../songbird/input/struct.RawAdapter.html...

+ + + \ No newline at end of file diff --git a/next/songbird/input/audiostream/struct.AudioStream.html b/next/songbird/input/audiostream/struct.AudioStream.html new file mode 100644 index 0000000..b1f3b8e --- /dev/null +++ b/next/songbird/input/audiostream/struct.AudioStream.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/input/struct.AudioStream.html...

+ + + \ No newline at end of file diff --git a/next/songbird/input/cached/enum.CodecCacheError.html b/next/songbird/input/cached/enum.CodecCacheError.html new file mode 100644 index 0000000..e11efca --- /dev/null +++ b/next/songbird/input/cached/enum.CodecCacheError.html @@ -0,0 +1,58 @@ +CodecCacheError in songbird::input::cached - Rust

CodecCacheError

Enum CodecCacheError 

Source
pub enum CodecCacheError {
+    Create(AudioStreamError),
+    Parse(Error),
+    Opus(Error),
+    MetadataEncoding(JsonError),
+    MetadataTooLarge,
+    CreatePanicked,
+    UnknownChannelCount,
+    Streamcatcher(CatcherError),
+    StreamNotAtStart,
+}
Expand description

Errors encountered using a Compressed or Decompressed cached source.

+

Variants§

§

Create(AudioStreamError)

The audio stream could not be created.

+
§

Parse(Error)

Symphonia failed to parse the container or decode the default stream.

+
§

Opus(Error)

The Opus encoder could not be created.

+
§

MetadataEncoding(JsonError)

The file’s metadata could not be converted to JSON.

+
§

MetadataTooLarge

The input’s metadata was too large after conversion to JSON to fit in a DCA file.

+
§

CreatePanicked

The audio stream failed to be created due to a panic in spawn_blocking.

+
§

UnknownChannelCount

The audio stream’s channel count could not be determined.

+
§

Streamcatcher(CatcherError)

Streamcatcher’s configuration was illegal, and the cache could not be created.

+
§

StreamNotAtStart

The input stream had already been read (i.e., Parsed) and so the whole stream +could not be used.

+

Trait Implementations§

Source§

impl Debug for CodecCacheError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for CodecCacheError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult

Formats the value using the given formatter. Read more
Source§

impl Error for CodecCacheError

1.30.0 · Source§

fn source(&self) -> Option<&(dyn Error + 'static)>

Returns the lower-level source of this error, if any. Read more
1.0.0 · Source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · Source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
Source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type-based access to context intended for error reports. Read more
Source§

impl From<AudioStreamError> for CodecCacheError

Source§

fn from(val: AudioStreamError) -> Self

Converts to this type from the input type.
Source§

impl From<CatcherError> for CodecCacheError

Source§

fn from(val: CatcherError) -> Self

Converts to this type from the input type.
Source§

impl From<Error> for CodecCacheError

Source§

fn from(val: JsonError) -> Self

Converts to this type from the input type.
Source§

impl From<Error> for CodecCacheError

Source§

fn from(val: OpusError) -> Self

Converts to this type from the input type.
Source§

impl From<Error> for CodecCacheError

Source§

fn from(val: SymphError) -> Self

Converts to this type from the input type.
Source§

impl From<JoinError> for CodecCacheError

Source§

fn from(_val: JoinError) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
§

impl<T> ToStringFallible for T
where + T: Display,

§

fn try_to_string(&self) -> Result<String, TryReserveError>

ToString::to_string, but without panic on OOM.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/input/cached/enum.Error.html b/next/songbird/input/cached/enum.Error.html new file mode 100644 index 0000000..28ee030 --- /dev/null +++ b/next/songbird/input/cached/enum.Error.html @@ -0,0 +1,48 @@ +Error in songbird::input::cached - Rust

Error

Enum Error 

Source
pub enum Error {
+    Create(AudioStreamError),
+    CreatePanicked,
+    Streamcatcher(CatcherError),
+    StreamNotAtStart,
+}
Expand description

Errors encountered using a Memory cached source.

+

Variants§

§

Create(AudioStreamError)

The audio stream could not be created.

+
§

CreatePanicked

The audio stream failed to be created due to a panic in spawn_blocking.

+
§

Streamcatcher(CatcherError)

Streamcatcher’s configuration was illegal, and the cache could not be created.

+
§

StreamNotAtStart

The input stream had already been read (i.e., Parsed) and so the whole stream +could not be used.

+

Trait Implementations§

Source§

impl Debug for Error

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for Error

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult

Formats the value using the given formatter. Read more
Source§

impl Error for Error

1.30.0 · Source§

fn source(&self) -> Option<&(dyn Error + 'static)>

Returns the lower-level source of this error, if any. Read more
1.0.0 · Source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · Source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
Source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type-based access to context intended for error reports. Read more
Source§

impl From<AudioStreamError> for Error

Source§

fn from(val: AudioStreamError) -> Self

Converts to this type from the input type.
Source§

impl From<CatcherError> for Error

Source§

fn from(val: CatcherError) -> Self

Converts to this type from the input type.
Source§

impl From<JoinError> for Error

Source§

fn from(_val: JoinError) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

§

impl Freeze for Error

§

impl !RefUnwindSafe for Error

§

impl Send for Error

§

impl Sync for Error

§

impl Unpin for Error

§

impl !UnwindSafe for Error

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
§

impl<T> ToStringFallible for T
where + T: Display,

§

fn try_to_string(&self) -> Result<String, TryReserveError>

ToString::to_string, but without panic on OOM.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/input/cached/enum.LengthHint.html b/next/songbird/input/cached/enum.LengthHint.html new file mode 100644 index 0000000..b43688c --- /dev/null +++ b/next/songbird/input/cached/enum.LengthHint.html @@ -0,0 +1,45 @@ +LengthHint in songbird::input::cached - Rust

LengthHint

Enum LengthHint 

Source
pub enum LengthHint {
+    Bytes(usize),
+    Time(Duration),
+}
Expand description

Expected amount of time that an input should last.

+

Variants§

§

Bytes(usize)

Estimate of a source’s length in bytes.

+
§

Time(Duration)

Estimate of a source’s length in time.

+

This will be converted to a bytecount at setup.

+

Trait Implementations§

Source§

impl Clone for LengthHint

Source§

fn clone(&self) -> LengthHint

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for LengthHint

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl From<Duration> for LengthHint

Source§

fn from(size: Duration) -> Self

Converts to this type from the input type.
Source§

impl From<usize> for LengthHint

Source§

fn from(size: usize) -> Self

Converts to this type from the input type.
Source§

impl Copy for LengthHint

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/input/cached/fn.apply_length_hint.html b/next/songbird/input/cached/fn.apply_length_hint.html new file mode 100644 index 0000000..9c5736c --- /dev/null +++ b/next/songbird/input/cached/fn.apply_length_hint.html @@ -0,0 +1,4 @@ +apply_length_hint in songbird::input::cached - Rust

apply_length_hint

Function apply_length_hint 

Source
pub fn apply_length_hint<H>(config: &mut Config, hint: H, cost_per_sec: usize)
where + H: Into<LengthHint>,
Expand description

Modify the given cache configuration to initially allocate +enough bytes to store a length of audio at the given bitrate.

+
\ No newline at end of file diff --git a/next/songbird/input/cached/fn.compressed_cost_per_sec.html b/next/songbird/input/cached/fn.compressed_cost_per_sec.html new file mode 100644 index 0000000..9b5af74 --- /dev/null +++ b/next/songbird/input/cached/fn.compressed_cost_per_sec.html @@ -0,0 +1,2 @@ +compressed_cost_per_sec in songbird::input::cached - Rust

compressed_cost_per_sec

Function compressed_cost_per_sec 

Source
pub fn compressed_cost_per_sec(bitrate: Bitrate) -> usize
Expand description

Estimates the cost, in B/s, of audio data compressed at the given bitrate.

+
\ No newline at end of file diff --git a/next/songbird/input/cached/fn.default_config.html b/next/songbird/input/cached/fn.default_config.html new file mode 100644 index 0000000..410cbfd --- /dev/null +++ b/next/songbird/input/cached/fn.default_config.html @@ -0,0 +1,4 @@ +default_config in songbird::input::cached - Rust

default_config

Function default_config 

Source
pub fn default_config(cost_per_sec: usize) -> Config
Expand description

Provides the default config used by a cached source.

+

This maps to the default configuration in streamcatcher, using +a constant chunk size of 5s worth of audio at the given bitrate estimate.

+
\ No newline at end of file diff --git a/next/songbird/input/cached/fn.raw_cost_per_sec.html b/next/songbird/input/cached/fn.raw_cost_per_sec.html new file mode 100644 index 0000000..fe5027e --- /dev/null +++ b/next/songbird/input/cached/fn.raw_cost_per_sec.html @@ -0,0 +1,2 @@ +raw_cost_per_sec in songbird::input::cached - Rust

raw_cost_per_sec

Function raw_cost_per_sec 

Source
pub fn raw_cost_per_sec(stereo: bool) -> usize
Expand description

Calculates the cost, in B/s, of raw floating-point audio data.

+
\ No newline at end of file diff --git a/next/songbird/input/cached/index.html b/next/songbird/input/cached/index.html new file mode 100644 index 0000000..7eea6d3 --- /dev/null +++ b/next/songbird/input/cached/index.html @@ -0,0 +1,9 @@ +songbird::input::cached - Rust

Module cached

Module cached 

Source
Expand description

In-memory, shared input sources for reuse between calls, fast seeking, and +direct Opus frame passthrough.

+

Structs§

Compressed
A wrapper around an existing Input which compresses +the input using the Opus codec before storing it in memory.
Config
Configuration for a cached source.
Decompressed
A wrapper around an existing Input which caches +the decoded and converted audio data locally in memory +as f32-format PCM data.
Memory
A wrapper around an existing Input which caches its data +in memory.
OpusCompressor
Transform applied inside Compressed, converting a floating-point PCM +input stream into a DCA-framed Opus stream.

Enums§

CodecCacheError
Errors encountered using a Compressed or Decompressed cached source.
Error
Errors encountered using a Memory cached source.
LengthHint
Expected amount of time that an input should last.

Functions§

apply_length_hint
Modify the given cache configuration to initially allocate +enough bytes to store a length of audio at the given bitrate.
compressed_cost_per_sec
Estimates the cost, in B/s, of audio data compressed at the given bitrate.
default_config
Provides the default config used by a cached source.
raw_cost_per_sec
Calculates the cost, in B/s, of raw floating-point audio data.
\ No newline at end of file diff --git a/next/songbird/input/cached/sidebar-items.js b/next/songbird/input/cached/sidebar-items.js new file mode 100644 index 0000000..0229344 --- /dev/null +++ b/next/songbird/input/cached/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["CodecCacheError","Error","LengthHint"],"fn":["apply_length_hint","compressed_cost_per_sec","default_config","raw_cost_per_sec"],"struct":["Compressed","Config","Decompressed","Memory","OpusCompressor"]}; \ No newline at end of file diff --git a/next/songbird/input/cached/struct.Compressed.html b/next/songbird/input/cached/struct.Compressed.html new file mode 100644 index 0000000..9230b72 --- /dev/null +++ b/next/songbird/input/cached/struct.Compressed.html @@ -0,0 +1,114 @@ +Compressed in songbird::input::cached - Rust

Compressed

Struct Compressed 

Source
pub struct Compressed {
+    pub raw: TxCatcher<ToAudioBytes, OpusCompressor>,
+}
Expand description

A wrapper around an existing Input which compresses +the input using the Opus codec before storing it in memory.

+

The main purpose of this wrapper is to enable seeking on +incompatible sources and to ease resource consumption for +commonly reused/shared tracks. If only one Opus-compressed track +is playing at a time, then this removes the runtime decode cost +from the driver.

+

This is intended for use with larger, repeatedly used audio +tracks shared between sources, and stores the sound data +retrieved as compressed Opus audio.

+

Internally, this stores the stream and its metadata as a DCA1 file, +which can be written out to disk for later use.

+

Fields§

§raw: TxCatcher<ToAudioBytes, OpusCompressor>

Inner shared bytestore.

+

Implementations§

Source§

impl Compressed

Source

pub async fn new( + source: Input, + bitrate: Bitrate, +) -> Result<Self, CodecCacheError>

Wrap an existing Input with an in-memory store, compressed using Opus.

+
Source

pub async fn with_config( + source: Input, + bitrate: Bitrate, + config: Option<Config>, +) -> Result<Self, CodecCacheError>

Wrap an existing Input with an in-memory store, compressed using Opus, with +custom configuration for both Symphonia and the backing store.

+
Source

pub fn new_handle(&self) -> Self

Acquire a new handle to this object, creating a new +view of the existing cached data from the beginning.

+

Trait Implementations§

Source§

impl Clone for Compressed

Source§

fn clone(&self) -> Compressed

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl From<Compressed> for Input

Source§

fn from(val: Compressed) -> Input

Converts to this type from the input type.
Source§

impl MediaSource for Compressed

Source§

fn is_seekable(&self) -> bool

Returns if the source is seekable. This may be an expensive operation.
Source§

fn byte_len(&self) -> Option<u64>

Returns the length in bytes, if available. This may be an expensive operation.
Source§

impl Read for Compressed

Source§

fn read(&mut self, buf: &mut [u8]) -> IoResult<usize>

Pull some bytes from this source into the specified buffer, returning +how many bytes were read. Read more
1.36.0 · Source§

fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>

Like read, except that it reads into a slice of buffers. Read more
Source§

fn is_read_vectored(&self) -> bool

🔬This is a nightly-only experimental API. (can_vector)
Determines if this Reader has an efficient read_vectored +implementation. Read more
1.0.0 · Source§

fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize, Error>

Reads all bytes until EOF in this source, placing them into buf. Read more
1.0.0 · Source§

fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>

Reads all bytes until EOF in this source, appending them to buf. Read more
1.6.0 · Source§

fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>

Reads the exact number of bytes required to fill buf. Read more
Source§

fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>

🔬This is a nightly-only experimental API. (read_buf)
Pull some bytes from this source into the specified buffer. Read more
Source§

fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>

🔬This is a nightly-only experimental API. (read_buf)
Reads the exact number of bytes required to fill cursor. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where + Self: Sized,

Creates a “by reference” adaptor for this instance of Read. Read more
1.0.0 · Source§

fn bytes(self) -> Bytes<Self>
where + Self: Sized,

Transforms this Read instance to an Iterator over its bytes. Read more
1.0.0 · Source§

fn chain<R>(self, next: R) -> Chain<Self, R>
where + R: Read, + Self: Sized,

Creates an adapter which will chain this stream with another. Read more
1.0.0 · Source§

fn take(self, limit: u64) -> Take<Self>
where + Self: Sized,

Creates an adapter which will read at most limit bytes from it. Read more
Source§

impl Seek for Compressed

Source§

fn seek(&mut self, pos: SeekFrom) -> IoResult<u64>

Seek to an offset, in bytes, in a stream. Read more
1.55.0 · Source§

fn rewind(&mut self) -> Result<(), Error>

Rewind to the beginning of a stream. Read more
Source§

fn stream_len(&mut self) -> Result<u64, Error>

🔬This is a nightly-only experimental API. (seek_stream_len)
Returns the length of this stream (in bytes). Read more
1.51.0 · Source§

fn stream_position(&mut self) -> Result<u64, Error>

Returns the current seek position from the start of the stream. Read more
1.80.0 · Source§

fn seek_relative(&mut self, offset: i64) -> Result<(), Error>

Seeks relative to the current position. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
§

impl<R> ReadBytesExt for R
where + R: Read + ?Sized,

§

fn read_u8(&mut self) -> Result<u8, Error>

Reads an unsigned 8 bit integer from the underlying reader. Read more
§

fn read_i8(&mut self) -> Result<i8, Error>

Reads a signed 8 bit integer from the underlying reader. Read more
§

fn read_u16<T>(&mut self) -> Result<u16, Error>
where + T: ByteOrder,

Reads an unsigned 16 bit integer from the underlying reader. Read more
§

fn read_i16<T>(&mut self) -> Result<i16, Error>
where + T: ByteOrder,

Reads a signed 16 bit integer from the underlying reader. Read more
§

fn read_u24<T>(&mut self) -> Result<u32, Error>
where + T: ByteOrder,

Reads an unsigned 24 bit integer from the underlying reader. Read more
§

fn read_i24<T>(&mut self) -> Result<i32, Error>
where + T: ByteOrder,

Reads a signed 24 bit integer from the underlying reader. Read more
§

fn read_u32<T>(&mut self) -> Result<u32, Error>
where + T: ByteOrder,

Reads an unsigned 32 bit integer from the underlying reader. Read more
§

fn read_i32<T>(&mut self) -> Result<i32, Error>
where + T: ByteOrder,

Reads a signed 32 bit integer from the underlying reader. Read more
§

fn read_u48<T>(&mut self) -> Result<u64, Error>
where + T: ByteOrder,

Reads an unsigned 48 bit integer from the underlying reader. Read more
§

fn read_i48<T>(&mut self) -> Result<i64, Error>
where + T: ByteOrder,

Reads a signed 48 bit integer from the underlying reader. Read more
§

fn read_u64<T>(&mut self) -> Result<u64, Error>
where + T: ByteOrder,

Reads an unsigned 64 bit integer from the underlying reader. Read more
§

fn read_i64<T>(&mut self) -> Result<i64, Error>
where + T: ByteOrder,

Reads a signed 64 bit integer from the underlying reader. Read more
§

fn read_u128<T>(&mut self) -> Result<u128, Error>
where + T: ByteOrder,

Reads an unsigned 128 bit integer from the underlying reader. Read more
§

fn read_i128<T>(&mut self) -> Result<i128, Error>
where + T: ByteOrder,

Reads a signed 128 bit integer from the underlying reader. Read more
§

fn read_uint<T>(&mut self, nbytes: usize) -> Result<u64, Error>
where + T: ByteOrder,

Reads an unsigned n-bytes integer from the underlying reader. Read more
§

fn read_int<T>(&mut self, nbytes: usize) -> Result<i64, Error>
where + T: ByteOrder,

Reads a signed n-bytes integer from the underlying reader. Read more
§

fn read_uint128<T>(&mut self, nbytes: usize) -> Result<u128, Error>
where + T: ByteOrder,

Reads an unsigned n-bytes integer from the underlying reader.
§

fn read_int128<T>(&mut self, nbytes: usize) -> Result<i128, Error>
where + T: ByteOrder,

Reads a signed n-bytes integer from the underlying reader.
§

fn read_f32<T>(&mut self) -> Result<f32, Error>
where + T: ByteOrder,

Reads a IEEE754 single-precision (4 bytes) floating point number from +the underlying reader. Read more
§

fn read_f64<T>(&mut self) -> Result<f64, Error>
where + T: ByteOrder,

Reads a IEEE754 double-precision (8 bytes) floating point number from +the underlying reader. Read more
§

fn read_u16_into<T>(&mut self, dst: &mut [u16]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of unsigned 16 bit integers from the underlying +reader. Read more
§

fn read_u32_into<T>(&mut self, dst: &mut [u32]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of unsigned 32 bit integers from the underlying +reader. Read more
§

fn read_u64_into<T>(&mut self, dst: &mut [u64]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of unsigned 64 bit integers from the underlying +reader. Read more
§

fn read_u128_into<T>(&mut self, dst: &mut [u128]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of unsigned 128 bit integers from the underlying +reader. Read more
§

fn read_i8_into(&mut self, dst: &mut [i8]) -> Result<(), Error>

Reads a sequence of signed 8 bit integers from the underlying reader. Read more
§

fn read_i16_into<T>(&mut self, dst: &mut [i16]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of signed 16 bit integers from the underlying +reader. Read more
§

fn read_i32_into<T>(&mut self, dst: &mut [i32]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of signed 32 bit integers from the underlying +reader. Read more
§

fn read_i64_into<T>(&mut self, dst: &mut [i64]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of signed 64 bit integers from the underlying +reader. Read more
§

fn read_i128_into<T>(&mut self, dst: &mut [i128]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of signed 128 bit integers from the underlying +reader. Read more
§

fn read_f32_into<T>(&mut self, dst: &mut [f32]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of IEEE754 single-precision (4 bytes) floating +point numbers from the underlying reader. Read more
§

fn read_f32_into_unchecked<T>(&mut self, dst: &mut [f32]) -> Result<(), Error>
where + T: ByteOrder,

👎Deprecated since 1.2.0: please use read_f32_into instead
DEPRECATED. Read more
§

fn read_f64_into<T>(&mut self, dst: &mut [f64]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of IEEE754 double-precision (8 bytes) floating +point numbers from the underlying reader. Read more
§

fn read_f64_into_unchecked<T>(&mut self, dst: &mut [f64]) -> Result<(), Error>
where + T: ByteOrder,

👎Deprecated since 1.2.0: please use read_f64_into instead
DEPRECATED. Read more
§

impl<R> ReadSkipExt for R
where + R: Read,

§

fn skip(&mut self, amt: usize) -> usize

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/input/cached/struct.Config.html b/next/songbird/input/cached/struct.Config.html new file mode 100644 index 0000000..3dbb301 --- /dev/null +++ b/next/songbird/input/cached/struct.Config.html @@ -0,0 +1,48 @@ +Config in songbird::input::cached - Rust

Config

Struct Config 

Source
pub struct Config {
+    pub codec_registry: &'static CodecRegistry,
+    pub format_registry: &'static Probe,
+    pub streamcatcher: Config,
+}
Expand description

Configuration for a cached source.

+

Fields§

§codec_registry: &'static CodecRegistry

Registry of audio codecs supported by the driver.

+

Defaults to get_codec_registry, which adds audiopus-based Opus codec support +to all of Symphonia’s default codecs.

+
§format_registry: &'static Probe

Registry of the muxers and container formats supported by the driver.

+

Defaults to get_probe, which includes all of Symphonia’s default format handlers +and DCA format support.

+
§streamcatcher: Config

Configuration for the inner streamcatcher instance.

+

Notably, this governs size hints and resize logic.

+

Implementations§

Source§

impl Config

Source

pub fn default_from_cost(cost_per_sec: usize) -> Self

Generate a storage configuration given an estimated storage bitrate +cost_per_sec in bytes/s.

+

Trait Implementations§

Source§

impl Default for Config

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

§

impl Freeze for Config

§

impl RefUnwindSafe for Config

§

impl Send for Config

§

impl Sync for Config

§

impl Unpin for Config

§

impl UnwindSafe for Config

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/input/cached/struct.Decompressed.html b/next/songbird/input/cached/struct.Decompressed.html new file mode 100644 index 0000000..17e83d3 --- /dev/null +++ b/next/songbird/input/cached/struct.Decompressed.html @@ -0,0 +1,112 @@ +Decompressed in songbird::input::cached - Rust

Decompressed

Struct Decompressed 

Source
pub struct Decompressed {
+    pub raw: Catcher<RawAdapter<ToAudioBytes>>,
+}
Expand description

A wrapper around an existing Input which caches +the decoded and converted audio data locally in memory +as f32-format PCM data.

+

The main purpose of this wrapper is to enable seeking on +incompatible sources (i.e., ffmpeg output) and to ease resource +consumption for commonly reused/shared tracks. Compressed +offers similar functionality with different +tradeoffs.

+

This is intended for use with small, repeatedly used audio +tracks shared between sources, and stores the sound data +retrieved in uncompressed floating point form to minimise the +cost of audio processing when mixing several tracks together. +This must be used sparingly: these cost a significant +3 Mbps (375 kiB/s), or 131 MiB of RAM for a 6 minute song.

+

Fields§

§raw: Catcher<RawAdapter<ToAudioBytes>>

Inner shared bytestore.

+

Implementations§

Source§

impl Decompressed

Source

pub async fn new(source: Input) -> Result<Self, CodecCacheError>

Wrap an existing Input with an in-memory store, decompressed into f32 PCM audio.

+
Source

pub async fn with_config( + source: Input, + config: Option<Config>, +) -> Result<Self, CodecCacheError>

Wrap an existing Input with an in-memory store, decompressed into f32 PCM audio, +with custom configuration for both Symphonia and the backing store.

+
Source

pub fn new_handle(&self) -> Self

Acquire a new handle to this object, creating a new +view of the existing cached data from the beginning.

+

Trait Implementations§

Source§

impl Clone for Decompressed

Source§

fn clone(&self) -> Decompressed

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl From<Decompressed> for Input

Source§

fn from(val: Decompressed) -> Input

Converts to this type from the input type.
Source§

impl MediaSource for Decompressed

Source§

fn is_seekable(&self) -> bool

Returns if the source is seekable. This may be an expensive operation.
Source§

fn byte_len(&self) -> Option<u64>

Returns the length in bytes, if available. This may be an expensive operation.
Source§

impl Read for Decompressed

Source§

fn read(&mut self, buf: &mut [u8]) -> IoResult<usize>

Pull some bytes from this source into the specified buffer, returning +how many bytes were read. Read more
1.36.0 · Source§

fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>

Like read, except that it reads into a slice of buffers. Read more
Source§

fn is_read_vectored(&self) -> bool

🔬This is a nightly-only experimental API. (can_vector)
Determines if this Reader has an efficient read_vectored +implementation. Read more
1.0.0 · Source§

fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize, Error>

Reads all bytes until EOF in this source, placing them into buf. Read more
1.0.0 · Source§

fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>

Reads all bytes until EOF in this source, appending them to buf. Read more
1.6.0 · Source§

fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>

Reads the exact number of bytes required to fill buf. Read more
Source§

fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>

🔬This is a nightly-only experimental API. (read_buf)
Pull some bytes from this source into the specified buffer. Read more
Source§

fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>

🔬This is a nightly-only experimental API. (read_buf)
Reads the exact number of bytes required to fill cursor. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where + Self: Sized,

Creates a “by reference” adaptor for this instance of Read. Read more
1.0.0 · Source§

fn bytes(self) -> Bytes<Self>
where + Self: Sized,

Transforms this Read instance to an Iterator over its bytes. Read more
1.0.0 · Source§

fn chain<R>(self, next: R) -> Chain<Self, R>
where + R: Read, + Self: Sized,

Creates an adapter which will chain this stream with another. Read more
1.0.0 · Source§

fn take(self, limit: u64) -> Take<Self>
where + Self: Sized,

Creates an adapter which will read at most limit bytes from it. Read more
Source§

impl Seek for Decompressed

Source§

fn seek(&mut self, pos: SeekFrom) -> IoResult<u64>

Seek to an offset, in bytes, in a stream. Read more
1.55.0 · Source§

fn rewind(&mut self) -> Result<(), Error>

Rewind to the beginning of a stream. Read more
Source§

fn stream_len(&mut self) -> Result<u64, Error>

🔬This is a nightly-only experimental API. (seek_stream_len)
Returns the length of this stream (in bytes). Read more
1.51.0 · Source§

fn stream_position(&mut self) -> Result<u64, Error>

Returns the current seek position from the start of the stream. Read more
1.80.0 · Source§

fn seek_relative(&mut self, offset: i64) -> Result<(), Error>

Seeks relative to the current position. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
§

impl<R> ReadBytesExt for R
where + R: Read + ?Sized,

§

fn read_u8(&mut self) -> Result<u8, Error>

Reads an unsigned 8 bit integer from the underlying reader. Read more
§

fn read_i8(&mut self) -> Result<i8, Error>

Reads a signed 8 bit integer from the underlying reader. Read more
§

fn read_u16<T>(&mut self) -> Result<u16, Error>
where + T: ByteOrder,

Reads an unsigned 16 bit integer from the underlying reader. Read more
§

fn read_i16<T>(&mut self) -> Result<i16, Error>
where + T: ByteOrder,

Reads a signed 16 bit integer from the underlying reader. Read more
§

fn read_u24<T>(&mut self) -> Result<u32, Error>
where + T: ByteOrder,

Reads an unsigned 24 bit integer from the underlying reader. Read more
§

fn read_i24<T>(&mut self) -> Result<i32, Error>
where + T: ByteOrder,

Reads a signed 24 bit integer from the underlying reader. Read more
§

fn read_u32<T>(&mut self) -> Result<u32, Error>
where + T: ByteOrder,

Reads an unsigned 32 bit integer from the underlying reader. Read more
§

fn read_i32<T>(&mut self) -> Result<i32, Error>
where + T: ByteOrder,

Reads a signed 32 bit integer from the underlying reader. Read more
§

fn read_u48<T>(&mut self) -> Result<u64, Error>
where + T: ByteOrder,

Reads an unsigned 48 bit integer from the underlying reader. Read more
§

fn read_i48<T>(&mut self) -> Result<i64, Error>
where + T: ByteOrder,

Reads a signed 48 bit integer from the underlying reader. Read more
§

fn read_u64<T>(&mut self) -> Result<u64, Error>
where + T: ByteOrder,

Reads an unsigned 64 bit integer from the underlying reader. Read more
§

fn read_i64<T>(&mut self) -> Result<i64, Error>
where + T: ByteOrder,

Reads a signed 64 bit integer from the underlying reader. Read more
§

fn read_u128<T>(&mut self) -> Result<u128, Error>
where + T: ByteOrder,

Reads an unsigned 128 bit integer from the underlying reader. Read more
§

fn read_i128<T>(&mut self) -> Result<i128, Error>
where + T: ByteOrder,

Reads a signed 128 bit integer from the underlying reader. Read more
§

fn read_uint<T>(&mut self, nbytes: usize) -> Result<u64, Error>
where + T: ByteOrder,

Reads an unsigned n-bytes integer from the underlying reader. Read more
§

fn read_int<T>(&mut self, nbytes: usize) -> Result<i64, Error>
where + T: ByteOrder,

Reads a signed n-bytes integer from the underlying reader. Read more
§

fn read_uint128<T>(&mut self, nbytes: usize) -> Result<u128, Error>
where + T: ByteOrder,

Reads an unsigned n-bytes integer from the underlying reader.
§

fn read_int128<T>(&mut self, nbytes: usize) -> Result<i128, Error>
where + T: ByteOrder,

Reads a signed n-bytes integer from the underlying reader.
§

fn read_f32<T>(&mut self) -> Result<f32, Error>
where + T: ByteOrder,

Reads a IEEE754 single-precision (4 bytes) floating point number from +the underlying reader. Read more
§

fn read_f64<T>(&mut self) -> Result<f64, Error>
where + T: ByteOrder,

Reads a IEEE754 double-precision (8 bytes) floating point number from +the underlying reader. Read more
§

fn read_u16_into<T>(&mut self, dst: &mut [u16]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of unsigned 16 bit integers from the underlying +reader. Read more
§

fn read_u32_into<T>(&mut self, dst: &mut [u32]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of unsigned 32 bit integers from the underlying +reader. Read more
§

fn read_u64_into<T>(&mut self, dst: &mut [u64]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of unsigned 64 bit integers from the underlying +reader. Read more
§

fn read_u128_into<T>(&mut self, dst: &mut [u128]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of unsigned 128 bit integers from the underlying +reader. Read more
§

fn read_i8_into(&mut self, dst: &mut [i8]) -> Result<(), Error>

Reads a sequence of signed 8 bit integers from the underlying reader. Read more
§

fn read_i16_into<T>(&mut self, dst: &mut [i16]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of signed 16 bit integers from the underlying +reader. Read more
§

fn read_i32_into<T>(&mut self, dst: &mut [i32]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of signed 32 bit integers from the underlying +reader. Read more
§

fn read_i64_into<T>(&mut self, dst: &mut [i64]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of signed 64 bit integers from the underlying +reader. Read more
§

fn read_i128_into<T>(&mut self, dst: &mut [i128]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of signed 128 bit integers from the underlying +reader. Read more
§

fn read_f32_into<T>(&mut self, dst: &mut [f32]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of IEEE754 single-precision (4 bytes) floating +point numbers from the underlying reader. Read more
§

fn read_f32_into_unchecked<T>(&mut self, dst: &mut [f32]) -> Result<(), Error>
where + T: ByteOrder,

👎Deprecated since 1.2.0: please use read_f32_into instead
DEPRECATED. Read more
§

fn read_f64_into<T>(&mut self, dst: &mut [f64]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of IEEE754 double-precision (8 bytes) floating +point numbers from the underlying reader. Read more
§

fn read_f64_into_unchecked<T>(&mut self, dst: &mut [f64]) -> Result<(), Error>
where + T: ByteOrder,

👎Deprecated since 1.2.0: please use read_f64_into instead
DEPRECATED. Read more
§

impl<R> ReadSkipExt for R
where + R: Read,

§

fn skip(&mut self, amt: usize) -> usize

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/input/cached/struct.Memory.html b/next/songbird/input/cached/struct.Memory.html new file mode 100644 index 0000000..d9b1384 --- /dev/null +++ b/next/songbird/input/cached/struct.Memory.html @@ -0,0 +1,105 @@ +Memory in songbird::input::cached - Rust

Memory

Struct Memory 

Source
pub struct Memory {
+    pub raw: Catcher<Box<dyn MediaSource>>,
+}
Expand description

A wrapper around an existing Input which caches its data +in memory.

+

The main purpose of this wrapper is to enable fast seeking on +incompatible sources (i.e., HTTP streams) and to ease resource +consumption for commonly reused/shared tracks.

+

This consumes exactly as many bytes of memory as the input stream contains.

+

Fields§

§raw: Catcher<Box<dyn MediaSource>>

Inner shared bytestore.

+

Implementations§

Source§

impl Memory

Source

pub async fn new(source: Input) -> Result<Self, Error>

Wrap an existing Input with an in-memory store with the same codec and framing.

+
Source

pub async fn with_config( + source: Input, + config: Option<Config>, +) -> Result<Self, Error>

Wrap an existing Input with an in-memory store with the same codec and framing.

+

length_hint may be used to control the size of the initial chunk, preventing +needless allocations and copies.

+
Source

pub fn new_handle(&self) -> Self

Acquire a new handle to this object, creating a new +view of the existing cached data from the beginning.

+

Trait Implementations§

Source§

impl Clone for Memory

Source§

fn clone(&self) -> Memory

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl From<Memory> for Input

Source§

fn from(val: Memory) -> Input

Converts to this type from the input type.
Source§

impl MediaSource for Memory

Source§

fn is_seekable(&self) -> bool

Returns if the source is seekable. This may be an expensive operation.
Source§

fn byte_len(&self) -> Option<u64>

Returns the length in bytes, if available. This may be an expensive operation.
Source§

impl Read for Memory

Source§

fn read(&mut self, buf: &mut [u8]) -> IoResult<usize>

Pull some bytes from this source into the specified buffer, returning +how many bytes were read. Read more
1.36.0 · Source§

fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>

Like read, except that it reads into a slice of buffers. Read more
Source§

fn is_read_vectored(&self) -> bool

🔬This is a nightly-only experimental API. (can_vector)
Determines if this Reader has an efficient read_vectored +implementation. Read more
1.0.0 · Source§

fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize, Error>

Reads all bytes until EOF in this source, placing them into buf. Read more
1.0.0 · Source§

fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>

Reads all bytes until EOF in this source, appending them to buf. Read more
1.6.0 · Source§

fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>

Reads the exact number of bytes required to fill buf. Read more
Source§

fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>

🔬This is a nightly-only experimental API. (read_buf)
Pull some bytes from this source into the specified buffer. Read more
Source§

fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>

🔬This is a nightly-only experimental API. (read_buf)
Reads the exact number of bytes required to fill cursor. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where + Self: Sized,

Creates a “by reference” adaptor for this instance of Read. Read more
1.0.0 · Source§

fn bytes(self) -> Bytes<Self>
where + Self: Sized,

Transforms this Read instance to an Iterator over its bytes. Read more
1.0.0 · Source§

fn chain<R>(self, next: R) -> Chain<Self, R>
where + R: Read, + Self: Sized,

Creates an adapter which will chain this stream with another. Read more
1.0.0 · Source§

fn take(self, limit: u64) -> Take<Self>
where + Self: Sized,

Creates an adapter which will read at most limit bytes from it. Read more
Source§

impl Seek for Memory

Source§

fn seek(&mut self, pos: SeekFrom) -> IoResult<u64>

Seek to an offset, in bytes, in a stream. Read more
1.55.0 · Source§

fn rewind(&mut self) -> Result<(), Error>

Rewind to the beginning of a stream. Read more
Source§

fn stream_len(&mut self) -> Result<u64, Error>

🔬This is a nightly-only experimental API. (seek_stream_len)
Returns the length of this stream (in bytes). Read more
1.51.0 · Source§

fn stream_position(&mut self) -> Result<u64, Error>

Returns the current seek position from the start of the stream. Read more
1.80.0 · Source§

fn seek_relative(&mut self, offset: i64) -> Result<(), Error>

Seeks relative to the current position. Read more

Auto Trait Implementations§

§

impl Freeze for Memory

§

impl !RefUnwindSafe for Memory

§

impl Send for Memory

§

impl Sync for Memory

§

impl Unpin for Memory

§

impl !UnwindSafe for Memory

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
§

impl<R> ReadBytesExt for R
where + R: Read + ?Sized,

§

fn read_u8(&mut self) -> Result<u8, Error>

Reads an unsigned 8 bit integer from the underlying reader. Read more
§

fn read_i8(&mut self) -> Result<i8, Error>

Reads a signed 8 bit integer from the underlying reader. Read more
§

fn read_u16<T>(&mut self) -> Result<u16, Error>
where + T: ByteOrder,

Reads an unsigned 16 bit integer from the underlying reader. Read more
§

fn read_i16<T>(&mut self) -> Result<i16, Error>
where + T: ByteOrder,

Reads a signed 16 bit integer from the underlying reader. Read more
§

fn read_u24<T>(&mut self) -> Result<u32, Error>
where + T: ByteOrder,

Reads an unsigned 24 bit integer from the underlying reader. Read more
§

fn read_i24<T>(&mut self) -> Result<i32, Error>
where + T: ByteOrder,

Reads a signed 24 bit integer from the underlying reader. Read more
§

fn read_u32<T>(&mut self) -> Result<u32, Error>
where + T: ByteOrder,

Reads an unsigned 32 bit integer from the underlying reader. Read more
§

fn read_i32<T>(&mut self) -> Result<i32, Error>
where + T: ByteOrder,

Reads a signed 32 bit integer from the underlying reader. Read more
§

fn read_u48<T>(&mut self) -> Result<u64, Error>
where + T: ByteOrder,

Reads an unsigned 48 bit integer from the underlying reader. Read more
§

fn read_i48<T>(&mut self) -> Result<i64, Error>
where + T: ByteOrder,

Reads a signed 48 bit integer from the underlying reader. Read more
§

fn read_u64<T>(&mut self) -> Result<u64, Error>
where + T: ByteOrder,

Reads an unsigned 64 bit integer from the underlying reader. Read more
§

fn read_i64<T>(&mut self) -> Result<i64, Error>
where + T: ByteOrder,

Reads a signed 64 bit integer from the underlying reader. Read more
§

fn read_u128<T>(&mut self) -> Result<u128, Error>
where + T: ByteOrder,

Reads an unsigned 128 bit integer from the underlying reader. Read more
§

fn read_i128<T>(&mut self) -> Result<i128, Error>
where + T: ByteOrder,

Reads a signed 128 bit integer from the underlying reader. Read more
§

fn read_uint<T>(&mut self, nbytes: usize) -> Result<u64, Error>
where + T: ByteOrder,

Reads an unsigned n-bytes integer from the underlying reader. Read more
§

fn read_int<T>(&mut self, nbytes: usize) -> Result<i64, Error>
where + T: ByteOrder,

Reads a signed n-bytes integer from the underlying reader. Read more
§

fn read_uint128<T>(&mut self, nbytes: usize) -> Result<u128, Error>
where + T: ByteOrder,

Reads an unsigned n-bytes integer from the underlying reader.
§

fn read_int128<T>(&mut self, nbytes: usize) -> Result<i128, Error>
where + T: ByteOrder,

Reads a signed n-bytes integer from the underlying reader.
§

fn read_f32<T>(&mut self) -> Result<f32, Error>
where + T: ByteOrder,

Reads a IEEE754 single-precision (4 bytes) floating point number from +the underlying reader. Read more
§

fn read_f64<T>(&mut self) -> Result<f64, Error>
where + T: ByteOrder,

Reads a IEEE754 double-precision (8 bytes) floating point number from +the underlying reader. Read more
§

fn read_u16_into<T>(&mut self, dst: &mut [u16]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of unsigned 16 bit integers from the underlying +reader. Read more
§

fn read_u32_into<T>(&mut self, dst: &mut [u32]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of unsigned 32 bit integers from the underlying +reader. Read more
§

fn read_u64_into<T>(&mut self, dst: &mut [u64]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of unsigned 64 bit integers from the underlying +reader. Read more
§

fn read_u128_into<T>(&mut self, dst: &mut [u128]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of unsigned 128 bit integers from the underlying +reader. Read more
§

fn read_i8_into(&mut self, dst: &mut [i8]) -> Result<(), Error>

Reads a sequence of signed 8 bit integers from the underlying reader. Read more
§

fn read_i16_into<T>(&mut self, dst: &mut [i16]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of signed 16 bit integers from the underlying +reader. Read more
§

fn read_i32_into<T>(&mut self, dst: &mut [i32]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of signed 32 bit integers from the underlying +reader. Read more
§

fn read_i64_into<T>(&mut self, dst: &mut [i64]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of signed 64 bit integers from the underlying +reader. Read more
§

fn read_i128_into<T>(&mut self, dst: &mut [i128]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of signed 128 bit integers from the underlying +reader. Read more
§

fn read_f32_into<T>(&mut self, dst: &mut [f32]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of IEEE754 single-precision (4 bytes) floating +point numbers from the underlying reader. Read more
§

fn read_f32_into_unchecked<T>(&mut self, dst: &mut [f32]) -> Result<(), Error>
where + T: ByteOrder,

👎Deprecated since 1.2.0: please use read_f32_into instead
DEPRECATED. Read more
§

fn read_f64_into<T>(&mut self, dst: &mut [f64]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of IEEE754 double-precision (8 bytes) floating +point numbers from the underlying reader. Read more
§

fn read_f64_into_unchecked<T>(&mut self, dst: &mut [f64]) -> Result<(), Error>
where + T: ByteOrder,

👎Deprecated since 1.2.0: please use read_f64_into instead
DEPRECATED. Read more
§

impl<R> ReadSkipExt for R
where + R: Read,

§

fn skip(&mut self, amt: usize) -> usize

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/input/cached/struct.OpusCompressor.html b/next/songbird/input/cached/struct.OpusCompressor.html new file mode 100644 index 0000000..cfac7ae --- /dev/null +++ b/next/songbird/input/cached/struct.OpusCompressor.html @@ -0,0 +1,41 @@ +OpusCompressor in songbird::input::cached - Rust

OpusCompressor

Struct OpusCompressor 

Source
pub struct OpusCompressor { /* private fields */ }
Expand description

Transform applied inside Compressed, converting a floating-point PCM +input stream into a DCA-framed Opus stream.

+

Created and managed by Compressed.

+

Trait Implementations§

Source§

impl Debug for OpusCompressor

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl NeedsBytes for OpusCompressor

Source§

fn min_bytes_required(&self) -> usize

The minimum amount of contiguous bytes required in any rope segment. Read more
Source§

impl Stateful for OpusCompressor

Source§

type State = usize

Transform state.
Source§

fn state(&self) -> Self::State

Source§

impl<T> Transform<T> for OpusCompressor
where + T: Read,

Source§

fn transform_read( + &mut self, + src: &mut T, + buf: &mut [u8], +) -> IoResult<TransformPosition>

Data transform, given access to the underlying Read object and the destination buffer. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/input/codecs/dca/struct.DcaReader.html b/next/songbird/input/codecs/dca/struct.DcaReader.html new file mode 100644 index 0000000..363fb8c --- /dev/null +++ b/next/songbird/input/codecs/dca/struct.DcaReader.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../songbird/input/codecs/struct.DcaReader.html...

+ + + \ No newline at end of file diff --git a/next/songbird/input/codecs/fn.get_codec_registry.html b/next/songbird/input/codecs/fn.get_codec_registry.html new file mode 100644 index 0000000..41b8752 --- /dev/null +++ b/next/songbird/input/codecs/fn.get_codec_registry.html @@ -0,0 +1,2 @@ +get_codec_registry in songbird::input::codecs - Rust

get_codec_registry

Function get_codec_registry 

Source
pub fn get_codec_registry() -> &'static CodecRegistry
Expand description

Default Symphonia [CodecRegistry], including the (audiopus-backed) Opus codec.

+
\ No newline at end of file diff --git a/next/songbird/input/codecs/fn.get_probe.html b/next/songbird/input/codecs/fn.get_probe.html new file mode 100644 index 0000000..215f1a6 --- /dev/null +++ b/next/songbird/input/codecs/fn.get_probe.html @@ -0,0 +1,2 @@ +get_probe in songbird::input::codecs - Rust

get_probe

Function get_probe 

Source
pub fn get_probe() -> &'static Probe
Expand description

Default Symphonia Probe, including DCA format support.

+
\ No newline at end of file diff --git a/next/songbird/input/codecs/index.html b/next/songbird/input/codecs/index.html new file mode 100644 index 0000000..c205ce8 --- /dev/null +++ b/next/songbird/input/codecs/index.html @@ -0,0 +1,2 @@ +songbird::input::codecs - Rust

Module codecs

Module codecs 

Source
Expand description

Codec registries extending Symphonia’s probe and registry formats with Opus and DCA support.

+

Structs§

DcaReader
DCA[0/1] Format reader for Symphonia.
OpusDecoder
Opus decoder for symphonia, based on libopus v1.3 (via [audiopus]).
RawReader
Symphonia support for a simple container for raw f32-PCM data of unknown duration.

Functions§

get_codec_registry
Default Symphonia [CodecRegistry], including the (audiopus-backed) Opus codec.
get_probe
Default Symphonia Probe, including DCA format support.
\ No newline at end of file diff --git a/next/songbird/input/codecs/opus/struct.OpusDecoder.html b/next/songbird/input/codecs/opus/struct.OpusDecoder.html new file mode 100644 index 0000000..f6706f2 --- /dev/null +++ b/next/songbird/input/codecs/opus/struct.OpusDecoder.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../songbird/input/codecs/struct.OpusDecoder.html...

+ + + \ No newline at end of file diff --git a/next/songbird/input/codecs/raw/struct.RawReader.html b/next/songbird/input/codecs/raw/struct.RawReader.html new file mode 100644 index 0000000..db7c03f --- /dev/null +++ b/next/songbird/input/codecs/raw/struct.RawReader.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../songbird/input/codecs/struct.RawReader.html...

+ + + \ No newline at end of file diff --git a/next/songbird/input/codecs/sidebar-items.js b/next/songbird/input/codecs/sidebar-items.js new file mode 100644 index 0000000..575627e --- /dev/null +++ b/next/songbird/input/codecs/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["get_codec_registry","get_probe"],"struct":["DcaReader","OpusDecoder","RawReader"]}; \ No newline at end of file diff --git a/next/songbird/input/codecs/struct.DcaReader.html b/next/songbird/input/codecs/struct.DcaReader.html new file mode 100644 index 0000000..9a01613 --- /dev/null +++ b/next/songbird/input/codecs/struct.DcaReader.html @@ -0,0 +1,43 @@ +DcaReader in songbird::input::codecs - Rust

DcaReader

Struct DcaReader 

Source
pub struct DcaReader { /* private fields */ }
Expand description

DCA[0/1] Format reader for Symphonia.

+

Trait Implementations§

Source§

impl FormatReader for DcaReader

Source§

fn try_new( + source: MediaSourceStream, + options: &FormatOptions, +) -> SymphResult<Self>

Attempt to instantiate a FormatReader using the provided FormatOptions and +MediaSourceStream. The reader will probe the container to verify format support, determine +the number of tracks, and read any initial metadata.
Source§

fn cues(&self) -> &[Cue]

Gets a list of all Cues.
Source§

fn metadata(&mut self) -> SymphMetadata<'_>

Gets the metadata revision log.
Source§

fn seek(&mut self, _mode: SeekMode, to: SeekTo) -> SymphResult<SeekedTo>

Seek, as precisely as possible depending on the mode, to the Time or track TimeStamp +requested. Returns the requested and actual TimeStamps seeked to, as well as the Track. Read more
Source§

fn tracks(&self) -> &[Track]

Gets a list of tracks in the container.
Source§

fn default_track(&self) -> Option<&Track>

Gets the default track. If the FormatReader has a method of determining the default track, +this function should return it. Otherwise, the first track is returned. If no tracks are +present then None is returned.
Source§

fn next_packet(&mut self) -> SymphResult<Packet>

Get the next packet from the container. Read more
Source§

fn into_inner(self: Box<Self>) -> MediaSourceStream

Destroys the FormatReader and returns the underlying media source stream
Source§

impl QueryDescriptor for DcaReader

Source§

fn query() -> &'static [Descriptor]

Returns a list of descriptors.
Source§

fn score(_context: &[u8]) -> u8

Using the provided context buffer, score calculate and returns a value between 0 and 255 +indicating the confidence of the reader in decoding or parsing the source stream.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/input/codecs/struct.OpusDecoder.html b/next/songbird/input/codecs/struct.OpusDecoder.html new file mode 100644 index 0000000..fa3ac3c --- /dev/null +++ b/next/songbird/input/codecs/struct.OpusDecoder.html @@ -0,0 +1,45 @@ +OpusDecoder in songbird::input::codecs - Rust

OpusDecoder

Struct OpusDecoder 

Source
pub struct OpusDecoder { /* private fields */ }
Expand description

Opus decoder for symphonia, based on libopus v1.3 (via [audiopus]).

+

Trait Implementations§

Source§

impl Decoder for OpusDecoder

Source§

fn try_new( + params: &CodecParameters, + _options: &DecoderOptions, +) -> SymphResult<Self>

Attempts to instantiates a Decoder using the provided CodecParameters.
Source§

fn supported_codecs() -> &'static [CodecDescriptor]

Gets a list of codec descriptors for the codecs supported by this Decoder.
Source§

fn codec_params(&self) -> &CodecParameters

Gets a reference to an updated set of CodecParameters based on the parameters the +Decoder was instantiated with.
Source§

fn decode(&mut self, packet: &Packet) -> SymphResult<AudioBufferRef<'_>>

Decodes a Packet of audio data and returns a copy-on-write generic (untyped) audio buffer +of the decoded audio. Read more
Source§

fn reset(&mut self)

Reset the Decoder. Read more
Source§

fn finalize(&mut self) -> FinalizeResult

Optionally, obtain post-decode information such as the verification status.
Source§

fn last_decoded(&self) -> AudioBufferRef<'_>

Allows read access to the internal audio buffer. Read more
Source§

impl Sync for OpusDecoder

§SAFETY

+

The underlying Opus decoder (currently) requires only a &self parameter +to decode given packets, which is likely a mistaken decision.

+

This struct makes stronger assumptions and only touches FFI decoder state with a +&mut self, preventing data races via &OpusDecoder as required by impl Sync. +No access to other internal state relies on unsafety or crosses FFI.

+

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/input/codecs/struct.RawReader.html b/next/songbird/input/codecs/struct.RawReader.html new file mode 100644 index 0000000..3719497 --- /dev/null +++ b/next/songbird/input/codecs/struct.RawReader.html @@ -0,0 +1,50 @@ +RawReader in songbird::input::codecs - Rust

RawReader

Struct RawReader 

Source
pub struct RawReader { /* private fields */ }
Expand description

Symphonia support for a simple container for raw f32-PCM data of unknown duration.

+

Contained files have a simple header:

+
    +
  • the 8-byte signature b"SbirdRaw",
  • +
  • the sample rate, as a little-endian u32,
  • +
  • the channel count, as a little-endian u32.
  • +
+

The remainder of the file is interleaved little-endian f32 samples.

+

Trait Implementations§

Source§

impl FormatReader for RawReader

Source§

fn try_new( + source: MediaSourceStream, + _options: &FormatOptions, +) -> SymphResult<Self>

Attempt to instantiate a FormatReader using the provided FormatOptions and +MediaSourceStream. The reader will probe the container to verify format support, determine +the number of tracks, and read any initial metadata.
Source§

fn cues(&self) -> &[Cue]

Gets a list of all Cues.
Source§

fn metadata(&mut self) -> SymphMetadata<'_>

Gets the metadata revision log.
Source§

fn seek(&mut self, _mode: SeekMode, to: SeekTo) -> SymphResult<SeekedTo>

Seek, as precisely as possible depending on the mode, to the Time or track TimeStamp +requested. Returns the requested and actual TimeStamps seeked to, as well as the Track. Read more
Source§

fn tracks(&self) -> &[Track]

Gets a list of tracks in the container.
Source§

fn default_track(&self) -> Option<&Track>

Gets the default track. If the FormatReader has a method of determining the default track, +this function should return it. Otherwise, the first track is returned. If no tracks are +present then None is returned.
Source§

fn next_packet(&mut self) -> SymphResult<Packet>

Get the next packet from the container. Read more
Source§

fn into_inner(self: Box<Self>) -> MediaSourceStream

Destroys the FormatReader and returns the underlying media source stream
Source§

impl QueryDescriptor for RawReader

Source§

fn query() -> &'static [Descriptor]

Returns a list of descriptors.
Source§

fn score(_context: &[u8]) -> u8

Using the provided context buffer, score calculate and returns a value between 0 and 255 +indicating the confidence of the reader in decoding or parsing the source stream.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/input/compose/trait.Compose.html b/next/songbird/input/compose/trait.Compose.html new file mode 100644 index 0000000..3e9ab42 --- /dev/null +++ b/next/songbird/input/compose/trait.Compose.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/input/trait.Compose.html...

+ + + \ No newline at end of file diff --git a/next/songbird/input/enum.AudioStreamError.html b/next/songbird/input/enum.AudioStreamError.html new file mode 100644 index 0000000..0a6423e --- /dev/null +++ b/next/songbird/input/enum.AudioStreamError.html @@ -0,0 +1,48 @@ +AudioStreamError in songbird::input - Rust

AudioStreamError

Enum AudioStreamError 

Source
#[non_exhaustive]
pub enum AudioStreamError { + RetryIn(Duration), + Fail(Box<dyn Error + Send + Sync>), + Unsupported, +}
Expand description

Errors encountered when creating an AudioStream or requesting metadata +from a Compose.

+

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

RetryIn(Duration)

The operation failed, and should be retried after a given time.

+

Create operations invoked by the driver will retry on the first tick +after this time has passed.

+
§

Fail(Box<dyn Error + Send + Sync>)

The operation failed, and should not be retried.

+
§

Unsupported

The operation was not supported, and will never succeed.

+

Trait Implementations§

Source§

impl Debug for AudioStreamError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for AudioStreamError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Error for AudioStreamError

Source§

fn source(&self) -> Option<&(dyn Error + 'static)>

Returns the lower-level source of this error, if any. Read more
1.0.0 · Source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · Source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
Source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type-based access to context intended for error reports. Read more
Source§

impl From<AudioStreamError> for AuxMetadataError

Source§

fn from(val: AudioStreamError) -> Self

Converts to this type from the input type.
Source§

impl From<AudioStreamError> for CodecCacheError

Source§

fn from(val: AudioStreamError) -> Self

Converts to this type from the input type.
Source§

impl From<AudioStreamError> for Error

Source§

fn from(val: AudioStreamError) -> Self

Converts to this type from the input type.
Source§

impl From<AudioStreamError> for MakePlayableError

Source§

fn from(val: AudioStreamError) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
§

impl<T> ToStringFallible for T
where + T: Display,

§

fn try_to_string(&self) -> Result<String, TryReserveError>

ToString::to_string, but without panic on OOM.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/input/enum.AuxMetadataError.html b/next/songbird/input/enum.AuxMetadataError.html new file mode 100644 index 0000000..89175d6 --- /dev/null +++ b/next/songbird/input/enum.AuxMetadataError.html @@ -0,0 +1,45 @@ +AuxMetadataError in songbird::input - Rust

AuxMetadataError

Enum AuxMetadataError 

Source
#[non_exhaustive]
pub enum AuxMetadataError { + NoCompose, + Retrieve(AudioStreamError), +}
Expand description

Errors encountered when trying to access out-of-band AuxMetadata for an Input +or Compose.

+

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

NoCompose

This input has no lazy Compose initialiser, which is needed to +retrieve AuxMetadata.

+
§

Retrieve(AudioStreamError)

There was an error when trying to access auxiliary metadata.

+

Trait Implementations§

Source§

impl Debug for AuxMetadataError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for AuxMetadataError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Error for AuxMetadataError

Source§

fn source(&self) -> Option<&(dyn Error + 'static)>

Returns the lower-level source of this error, if any. Read more
1.0.0 · Source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · Source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
Source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type-based access to context intended for error reports. Read more
Source§

impl From<AudioStreamError> for AuxMetadataError

Source§

fn from(val: AudioStreamError) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
§

impl<T> ToStringFallible for T
where + T: Display,

§

fn try_to_string(&self) -> Result<String, TryReserveError>

ToString::to_string, but without panic on OOM.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/input/enum.Input.html b/next/songbird/input/enum.Input.html new file mode 100644 index 0000000..a1045c8 --- /dev/null +++ b/next/songbird/input/enum.Input.html @@ -0,0 +1,169 @@ +Input in songbird::input - Rust

Input

Enum Input 

Source
pub enum Input {
+    Lazy(Box<dyn Compose>),
+    Live(LiveInput, Option<Box<dyn Compose>>),
+}
Expand description

An audio source, which can be live or lazily initialised.

+

This can be created from a wide variety of sources:

+
    +
  • Any owned byte slice: &'static [u8], Bytes, or Vec<u8>,
  • +
  • File offers a lazy way to open local audio files,
  • +
  • HttpRequest streams a given file from a URL using the reqwest HTTP library,
  • +
  • YoutubeDl uses yt-dlp (or any other youtube-dl-like program) to scrape +a target URL for a usable audio stream, before opening an HttpRequest.
  • +
+

Any Input (or struct with impl Into<Input>) can also be made into a Track via +From/Into.

+

§Example

+
use songbird::{
+    driver::Driver,
+    input::{codecs::*, Compose, Input, MetadataError, YoutubeDl},
+    tracks::Track,
+};
+// Inputs are played using a `Driver`, or `Call`.
+let mut driver = Driver::new(Default::default());
+
+// Lazy inputs take very little resources, and don't occupy any resources until we
+// need to play them (by default).
+let mut lazy = YoutubeDl::new(
+    reqwest::Client::new(),
+    // Referenced under CC BY-NC-SA 3.0 -- https://creativecommons.org/licenses/by-nc-sa/3.0/
+    "https://cloudkicker.bandcamp.com/track/94-days",
+);
+let lazy_c = lazy.clone();
+
+// With sources like `YoutubeDl`, we can get metadata from, e.g., a track's page.
+let aux_metadata = lazy.aux_metadata().await.unwrap();
+assert_eq!(aux_metadata.track, Some("94 Days".to_string()));
+
+// Once we pass an `Input` to the `Driver`, we can only remotely control it via
+// a `TrackHandle`.
+let handle = driver.play_input(lazy.into());
+
+// We can also modify some of its initial state via `Track`s.
+let handle = driver.play(Track::from(lazy_c).volume(0.5).pause());
+
+// In-memory sources like `Vec<u8>`, or `&'static [u8]` are easy to use, and only take a
+// little time for the mixer to parse their headers.
+// You can also use the adapters in `songbird::input::cached::*`to keep a source
+// from the Internet, HTTP, or a File in-memory *and* share it among calls.
+let in_memory = include_bytes!("../../resources/ting.mp3");
+let mut in_memory_input = in_memory.into();
+
+// This source is live...
+assert!(matches!(in_memory_input, Input::Live(..)));
+// ...but not yet playable, and we can't access its `Metadata`.
+assert!(!in_memory_input.is_playable());
+assert!(matches!(in_memory_input.metadata(), Err(MetadataError::NotParsed)));
+
+// If we want to inspect metadata (and we can't use AuxMetadata for any reason), we have
+// to parse the track ourselves.
+//
+// We can access it on a live track using `TrackHandle::action()`.
+in_memory_input = in_memory_input
+    .make_playable_async(get_codec_registry(), get_probe())
+    .await
+    .expect("WAV support is included, and this file is good!");
+
+// Symphonia's metadata can be difficult to use: prefer `AuxMetadata` when you can!
+use symphonia_core::meta::{StandardTagKey, Value};
+let mut metadata = in_memory_input.metadata();
+let meta = metadata.as_mut().unwrap();
+let mut probed = meta.probe.get().unwrap();
+
+let track_name = probed
+    .current().unwrap()
+    .tags().iter().filter(|v| v.std_key == Some(StandardTagKey::TrackTitle))
+    .next().unwrap();
+if let Value::String(s) = &track_name.value {
+    assert_eq!(s, "Ting!");
+} else { panic!() };
+
+// ...and these are played like any other input.
+let handle = driver.play_input(in_memory_input);
+

Variants§

§

Lazy(Box<dyn Compose>)

A byte source which is not yet initialised.

+

When a parent track is either played or explicitly readied, the inner Compose +is used to create an Input::Live.

+

Tuple Fields

§0: Box<dyn Compose>

A trait object which can be used to (re)create a usable byte stream.

+
§

Live(LiveInput, Option<Box<dyn Compose>>)

An initialised byte source.

+

This contains a raw byte stream, the lazy initialiser that was used, +as well as any symphonia-specific format data and/or hints.

+

Tuple Fields

§0: LiveInput

The byte source, plus symphonia-specific data.

+
§1: Option<Box<dyn Compose>>

The struct used to initialise this source, if available.

+

This is used to recreate the stream when a source does not support +backward seeking, if present.

+

Implementations§

Source§

impl Input

Source

pub async fn aux_metadata(&mut self) -> Result<AuxMetadata, AuxMetadataError>

Requests auxiliary metadata which can be accessed without parsing the file.

+

This method will never be called by songbird but allows, for instance, access to metadata +which might only be visible to a web crawler, e.g., uploader or source URL.

+

This requires that the Input has a Compose available to use, otherwise it +will always fail with AudioStreamError::Unsupported.

+
Source

pub fn metadata(&mut self) -> Result<Metadata<'_>, MetadataError>

Tries to get any information about this audio stream acquired during parsing.

+

Only exists when this input is both Self::Live and has been fully parsed. +In general, you probably want to use Self::aux_metadata.

+
Source

pub fn make_live(self, handle: &TokioHandle) -> Result<Self, AudioStreamError>

Initialises (but does not parse) an Input::Lazy into an Input::Live, +placing blocking I/O on the current thread.

+

This requires a [TokioHandle] to a tokio runtime to spawn any async sources.

+

This is a blocking operation. If you wish to use this from an async task, you +must do so via Self::make_live_async.

+

This is a no-op for an Input::Live.

+
Source

pub async fn make_live_async(self) -> Result<Self, AudioStreamError>

Initialises (but does not parse) an Input::Lazy into an Input::Live, +placing blocking I/O on the a spawn_blocking executor.

+

This is a no-op for an Input::Live.

+
Source

pub fn make_playable( + self, + codecs: &CodecRegistry, + probe: &Probe, + handle: &TokioHandle, +) -> Result<Self, MakePlayableError>

Initialises and parses an Input::Lazy into an Input::Live, +placing blocking I/O on the current thread.

+

This requires a [TokioHandle] to a tokio runtime to spawn any async sources. +If you can’t access one, then consider manually using LiveInput::promote.

+

This is a blocking operation. Symphonia uses standard library I/O (e.g., Read, Seek). +If you wish to use this from an async task, you must do so within spawn_blocking.

+
Source

pub async fn make_playable_async( + self, + codecs: &'static CodecRegistry, + probe: &'static Probe, +) -> Result<Self, MakePlayableError>

Initialises and parses an Input::Lazy into an Input::Live, +placing blocking I/O on a tokio blocking thread.

+
Source

pub fn is_playable(&self) -> bool

Returns whether this audio stream is full initialised, parsed, and +ready to play (e.g., Self::Live(LiveInput::Parsed(p), _)).

+
Source

pub fn live(&self) -> Option<&LiveInput>

Returns a reference to the live input, if it has been created via +Self::make_live or Self::make_live_async.

+
Source

pub fn live_mut(&mut self) -> Option<&mut LiveInput>

Returns a mutable reference to the live input, if it been created via +Self::make_live or Self::make_live_async.

+
Source

pub fn parsed(&self) -> Option<&Parsed>

Returns a reference to the data parsed from this input stream, if it has +been made available via Self::make_playable or LiveInput::promote.

+
Source

pub fn parsed_mut(&mut self) -> Option<&mut Parsed>

Returns a mutable reference to the data parsed from this input stream, if it +has been made available via Self::make_playable or LiveInput::promote.

+

Trait Implementations§

Source§

impl From<ChildContainer> for Input

Source§

fn from(val: ChildContainer) -> Self

Converts to this type from the input type.
Source§

impl From<Compressed> for Input

Source§

fn from(val: Compressed) -> Input

Converts to this type from the input type.
Source§

impl From<Decompressed> for Input

Source§

fn from(val: Decompressed) -> Input

Converts to this type from the input type.
Source§

impl<P: AsRef<Path> + Send + Sync + 'static> From<File<P>> for Input

Source§

fn from(val: File<P>) -> Self

Converts to this type from the input type.
Source§

impl From<HlsRequest> for Input

Source§

fn from(val: HlsRequest) -> Self

Converts to this type from the input type.
Source§

impl From<HttpRequest> for Input

Source§

fn from(val: HttpRequest) -> Self

Converts to this type from the input type.
Source§

impl From<Memory> for Input

Source§

fn from(val: Memory) -> Input

Converts to this type from the input type.
Source§

impl<A: MediaSource + Send + Sync + 'static> From<RawAdapter<A>> for Input

Source§

fn from(val: RawAdapter<A>) -> Self

Converts to this type from the input type.
Source§

impl<T: AsRef<[u8]> + Send + Sync + 'static> From<T> for Input

Source§

fn from(val: T) -> Self

Converts to this type from the input type.
Source§

impl From<YoutubeDl<'static>> for Input

Source§

fn from(val: YoutubeDl<'static>) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

§

impl Freeze for Input

§

impl !RefUnwindSafe for Input

§

impl Send for Input

§

impl !Sync for Input

§

impl Unpin for Input

§

impl !UnwindSafe for Input

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/input/enum.LiveInput.html b/next/songbird/input/enum.LiveInput.html new file mode 100644 index 0000000..cca7f0d --- /dev/null +++ b/next/songbird/input/enum.LiveInput.html @@ -0,0 +1,62 @@ +LiveInput in songbird::input - Rust

LiveInput

Enum LiveInput 

Source
pub enum LiveInput {
+    Raw(AudioStream<Box<dyn MediaSource>>),
+    Wrapped(AudioStream<MediaSourceStream>),
+    Parsed(Parsed),
+}
Expand description

An initialised audio source.

+

This type’s variants reflect files at different stages of readiness for use by +symphonia. Parsed file streams are ready for playback.

+

Variants§

§

Raw(AudioStream<Box<dyn MediaSource>>)

An unread, raw file stream.

+
§

Wrapped(AudioStream<MediaSourceStream>)

An unread file which has been wrapped with a large read-ahead buffer.

+
§

Parsed(Parsed)

An audio file which has had its headers parsed and decoder state built.

+

Implementations§

Source§

impl LiveInput

Source

pub fn promote( + self, + codecs: &CodecRegistry, + probe: &Probe, +) -> Result<Self, SymphError>

Converts this audio source into a Parsed object using the supplied format and codec +registries.

+

Where applicable, this will convert Raw -> Wrapped -> Parsed, and will +play the default track (or the first encountered track if this is not available) if a +container holds multiple audio streams.

+

This is a blocking operation. Symphonia uses standard library I/O (e.g., Read, Seek). +If you wish to use this from an async task, you must do so within spawn_blocking.

+
Source

pub fn parsed(&self) -> Option<&Parsed>

Returns a reference to the data parsed from this input stream, if it has +been made available via Self::promote.

+
Source

pub fn parsed_mut(&mut self) -> Option<&mut Parsed>

Returns a mutable reference to the data parsed from this input stream, if it +has been made available via Self::promote.

+
Source

pub fn is_playable(&self) -> bool

Returns whether this stream’s headers have been fully parsed, and so whether +the track can be played or have its metadata read.

+
Source

pub fn metadata(&mut self) -> Result<Metadata<'_>, MetadataError>

Tries to get any information about this audio stream acquired during parsing.

+

Only exists when this input is LiveInput::Parsed.

+

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/input/enum.MakePlayableError.html b/next/songbird/input/enum.MakePlayableError.html new file mode 100644 index 0000000..a9839c5 --- /dev/null +++ b/next/songbird/input/enum.MakePlayableError.html @@ -0,0 +1,45 @@ +MakePlayableError in songbird::input - Rust

MakePlayableError

Enum MakePlayableError 

Source
#[non_exhaustive]
pub enum MakePlayableError { + Create(AudioStreamError), + Parse(Error), + Panicked, +}
Expand description

Errors encountered when readying or pre-processing an Input.

+

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

Create(AudioStreamError)

Failed to create a LiveInput from the lazy Compose.

+
§

Parse(Error)

Failed to read headers, codecs, or a valid stream from a LiveInput.

+
§

Panicked

A blocking thread panicked or failed to return a parsed input.

+

Trait Implementations§

Source§

impl Debug for MakePlayableError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for MakePlayableError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Error for MakePlayableError

Source§

fn source(&self) -> Option<&(dyn Error + 'static)>

Returns the lower-level source of this error, if any. Read more
1.0.0 · Source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · Source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
Source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type-based access to context intended for error reports. Read more
Source§

impl From<AudioStreamError> for MakePlayableError

Source§

fn from(val: AudioStreamError) -> Self

Converts to this type from the input type.
Source§

impl From<Error> for MakePlayableError

Source§

fn from(val: SymphError) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
§

impl<T> ToStringFallible for T
where + T: Display,

§

fn try_to_string(&self) -> Result<String, TryReserveError>

ToString::to_string, but without panic on OOM.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/input/enum.MetadataError.html b/next/songbird/input/enum.MetadataError.html new file mode 100644 index 0000000..27ef41d --- /dev/null +++ b/next/songbird/input/enum.MetadataError.html @@ -0,0 +1,44 @@ +MetadataError in songbird::input - Rust

MetadataError

Enum MetadataError 

Source
#[non_exhaustive]
pub enum MetadataError { + NotLive, + NotParsed, +}
Expand description

Errors encountered when trying to access in-stream Metadata for an Input.

+

Both cases can be solved by using Input::make_playable or LiveInput::promote.

+

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

NotLive

This input is currently lazily initialised, and must be made live.

+
§

NotParsed

This input is ready, but has not had its headers parsed.

+

Trait Implementations§

Source§

impl Debug for MetadataError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for MetadataError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Error for MetadataError

Source§

fn source(&self) -> Option<&(dyn Error + 'static)>

Returns the lower-level source of this error, if any. Read more
1.0.0 · Source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · Source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
Source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type-based access to context intended for error reports. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
§

impl<T> ToStringFallible for T
where + T: Display,

§

fn try_to_string(&self) -> Result<String, TryReserveError>

ToString::to_string, but without panic on OOM.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/input/error/enum.AudioStreamError.html b/next/songbird/input/error/enum.AudioStreamError.html new file mode 100644 index 0000000..aec7ac5 --- /dev/null +++ b/next/songbird/input/error/enum.AudioStreamError.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/input/enum.AudioStreamError.html...

+ + + \ No newline at end of file diff --git a/next/songbird/input/error/enum.AuxMetadataError.html b/next/songbird/input/error/enum.AuxMetadataError.html new file mode 100644 index 0000000..6edf6f7 --- /dev/null +++ b/next/songbird/input/error/enum.AuxMetadataError.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/input/enum.AuxMetadataError.html...

+ + + \ No newline at end of file diff --git a/next/songbird/input/error/enum.MakePlayableError.html b/next/songbird/input/error/enum.MakePlayableError.html new file mode 100644 index 0000000..2bd7324 --- /dev/null +++ b/next/songbird/input/error/enum.MakePlayableError.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/input/enum.MakePlayableError.html...

+ + + \ No newline at end of file diff --git a/next/songbird/input/error/enum.MetadataError.html b/next/songbird/input/error/enum.MetadataError.html new file mode 100644 index 0000000..5a44737 --- /dev/null +++ b/next/songbird/input/error/enum.MetadataError.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/input/enum.MetadataError.html...

+ + + \ No newline at end of file diff --git a/next/songbird/input/index.html b/next/songbird/input/index.html new file mode 100644 index 0000000..e5a0e8e --- /dev/null +++ b/next/songbird/input/index.html @@ -0,0 +1,48 @@ +songbird::input - Rust

Module input

Module input 

Source
Expand description

Raw audio input data streams and sources.

+

Inputs in Songbird are based on symphonia, which provides demuxing, +decoding and management of synchronous byte sources (i.e., any items which +impl Read).

+

Songbird adds support for the Opus codec to symphonia via OpusDecoder, +the DCA1 file format via DcaReader, and a simple PCM adapter via RawReader; +the format and codec registries in codecs install these on top of those +enabled in your Cargo.toml when you include symphonia.

+

§Common sources

+
    +
  • Any owned byte slice: &'static [u8], Bytes, or Vec<u8>,
  • +
  • File offers a lazy way to open local audio files,
  • +
  • HttpRequest streams a given file from a URL using the reqwest HTTP library,
  • +
  • YoutubeDl uses yt-dlp (or any other youtube-dl-like program) to scrape +a target URL for a usable audio stream, before opening an HttpRequest.
  • +
+

§Adapters

+

Songbird includes several adapters to make developing your own inputs easier:

+
    +
  • cached::*, which allow seeking and shared caching of an input stream (storing +it in memory in a variety of formats),
  • +
  • ChildContainer for managing audio given by a process chain,
  • +
  • RawAdapter, for feeding in a synchronous f32-PCM stream, and
  • +
  • AsyncAdapterStream, for passing bytes from an AsyncRead (+ AsyncSeek) stream +into the mixer.
  • +
+

§Opus frame passthrough.

+

Some sources, such as Compressed or any WebM/Opus/DCA file, support +direct frame passthrough to the driver. This lets you directly send the +audio data you have without decoding, re-encoding, or mixing. In many +cases, this can greatly reduce the CPU cost required by the driver.

+

This functionality requires that:

+
    +
  • only one track is active (including paused tracks),
  • +
  • that track’s input supports direct Opus frame reads,
  • +
  • this input’s frames are all sized to 20ms.
  • +
  • and that track’s volume is set to 1.0.
  • +
+

Inputs which are almost suitable but which have any illegal frames will be +blocked from passthrough to prevent glitches such as repeated encoder frame gaps.

+

Re-exports§

pub use symphonia_core as core;

Modules§

cached
In-memory, shared input sources for reuse between calls, fast seeking, and +direct Opus frame passthrough.
codecs
Codec registries extending Symphonia’s probe and registry formats with Opus and DCA support.
utils
Utility methods for seeking or decoding.

Structs§

AsyncAdapterStream
An adapter for converting an async media source into a synchronous one +usable by symphonia.
AsyncReadOnlySource
AsyncReadOnlySource wraps any source implementing [tokio::io::AsyncRead] in an unseekable +[symphonia_core::io::MediaSource], similar to [symphonia_core::io::ReadOnlySource]
AudioStream
An unread byte stream for an audio file.
AuxMetadata
Extra information about an Input which is acquired without +parsing the file itself (e.g., from a webpage).
ChildContainer
Handle for a child process which ensures that any subprocesses are properly closed +on drop.
File
A lazily instantiated local file.
HlsRequest
Lazy HLS stream
HttpRequest
A lazily instantiated HTTP request.
Metadata
In-stream information about an Input acquired by parsing an audio file.
Parsed
An audio file which has had its headers parsed and decoder state built.
RawAdapter
Adapter around a raw, interleaved, f32 PCM byte stream.
YoutubeDl
A lazily instantiated call to download a file, finding its URL via youtube-dl.

Enums§

AudioStreamError
Errors encountered when creating an AudioStream or requesting metadata +from a Compose.
AuxMetadataError
Errors encountered when trying to access out-of-band AuxMetadata for an Input +or Compose.
Input
An audio source, which can be live or lazily initialised.
LiveInput
An initialised audio source.
MakePlayableError
Errors encountered when readying or pre-processing an Input.
MetadataError
Errors encountered when trying to access in-stream Metadata for an Input.

Traits§

AsyncMediaSource
An async port of symphonia’s MediaSource.
Compose
Data and behaviour required to instantiate a lazy audio source.
\ No newline at end of file diff --git a/next/songbird/input/live_input/enum.LiveInput.html b/next/songbird/input/live_input/enum.LiveInput.html new file mode 100644 index 0000000..1c86939 --- /dev/null +++ b/next/songbird/input/live_input/enum.LiveInput.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/input/enum.LiveInput.html...

+ + + \ No newline at end of file diff --git a/next/songbird/input/metadata/struct.AuxMetadata.html b/next/songbird/input/metadata/struct.AuxMetadata.html new file mode 100644 index 0000000..788749b --- /dev/null +++ b/next/songbird/input/metadata/struct.AuxMetadata.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/input/struct.AuxMetadata.html...

+ + + \ No newline at end of file diff --git a/next/songbird/input/metadata/struct.Metadata.html b/next/songbird/input/metadata/struct.Metadata.html new file mode 100644 index 0000000..7bb78a6 --- /dev/null +++ b/next/songbird/input/metadata/struct.Metadata.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/input/struct.Metadata.html...

+ + + \ No newline at end of file diff --git a/next/songbird/input/parsed/struct.Parsed.html b/next/songbird/input/parsed/struct.Parsed.html new file mode 100644 index 0000000..fef5b17 --- /dev/null +++ b/next/songbird/input/parsed/struct.Parsed.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/input/struct.Parsed.html...

+ + + \ No newline at end of file diff --git a/next/songbird/input/sidebar-items.js b/next/songbird/input/sidebar-items.js new file mode 100644 index 0000000..244528b --- /dev/null +++ b/next/songbird/input/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["AudioStreamError","AuxMetadataError","Input","LiveInput","MakePlayableError","MetadataError"],"mod":["cached","codecs","utils"],"struct":["AsyncAdapterStream","AsyncReadOnlySource","AudioStream","AuxMetadata","ChildContainer","File","HlsRequest","HttpRequest","Metadata","Parsed","RawAdapter","YoutubeDl"],"trait":["AsyncMediaSource","Compose"]}; \ No newline at end of file diff --git a/next/songbird/input/sources/file/struct.File.html b/next/songbird/input/sources/file/struct.File.html new file mode 100644 index 0000000..3bf8e13 --- /dev/null +++ b/next/songbird/input/sources/file/struct.File.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../songbird/input/struct.File.html...

+ + + \ No newline at end of file diff --git a/next/songbird/input/sources/hls/struct.HlsRequest.html b/next/songbird/input/sources/hls/struct.HlsRequest.html new file mode 100644 index 0000000..d5cbe78 --- /dev/null +++ b/next/songbird/input/sources/hls/struct.HlsRequest.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../songbird/input/struct.HlsRequest.html...

+ + + \ No newline at end of file diff --git a/next/songbird/input/sources/http/struct.HttpRequest.html b/next/songbird/input/sources/http/struct.HttpRequest.html new file mode 100644 index 0000000..da242a3 --- /dev/null +++ b/next/songbird/input/sources/http/struct.HttpRequest.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../songbird/input/struct.HttpRequest.html...

+ + + \ No newline at end of file diff --git a/next/songbird/input/sources/struct.AsyncReadOnlySource.html b/next/songbird/input/sources/struct.AsyncReadOnlySource.html new file mode 100644 index 0000000..72a0335 --- /dev/null +++ b/next/songbird/input/sources/struct.AsyncReadOnlySource.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/input/struct.AsyncReadOnlySource.html...

+ + + \ No newline at end of file diff --git a/next/songbird/input/sources/ytdl/struct.YoutubeDl.html b/next/songbird/input/sources/ytdl/struct.YoutubeDl.html new file mode 100644 index 0000000..3799a3b --- /dev/null +++ b/next/songbird/input/sources/ytdl/struct.YoutubeDl.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../songbird/input/struct.YoutubeDl.html...

+ + + \ No newline at end of file diff --git a/next/songbird/input/struct.AsyncAdapterStream.html b/next/songbird/input/struct.AsyncAdapterStream.html new file mode 100644 index 0000000..06c047e --- /dev/null +++ b/next/songbird/input/struct.AsyncAdapterStream.html @@ -0,0 +1,94 @@ +AsyncAdapterStream in songbird::input - Rust

AsyncAdapterStream

Struct AsyncAdapterStream 

Source
pub struct AsyncAdapterStream { /* private fields */ }
Expand description

An adapter for converting an async media source into a synchronous one +usable by symphonia.

+

This adapter takes a source implementing AsyncRead, and allows the receive side to +pass along seek requests needed. This allows for passing bytes from exclusively AsyncRead +streams (e.g., hyper HTTP sessions) to Songbird.

+

Implementations§

Source§

impl AsyncAdapterStream

Source

pub fn new( + stream: Box<dyn AsyncMediaSource>, + buf_len: usize, +) -> AsyncAdapterStream

Wrap and pull from an async file stream, with an intermediate ring-buffer of size buf_len +between the async and sync halves.

+

Trait Implementations§

Source§

impl MediaSource for AsyncAdapterStream

Source§

fn is_seekable(&self) -> bool

Returns if the source is seekable. This may be an expensive operation.
Source§

fn byte_len(&self) -> Option<u64>

Returns the length in bytes, if available. This may be an expensive operation.
Source§

impl Read for AsyncAdapterStream

Source§

fn read(&mut self, buf: &mut [u8]) -> IoResult<usize>

Pull some bytes from this source into the specified buffer, returning +how many bytes were read. Read more
1.36.0 · Source§

fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>

Like read, except that it reads into a slice of buffers. Read more
Source§

fn is_read_vectored(&self) -> bool

🔬This is a nightly-only experimental API. (can_vector)
Determines if this Reader has an efficient read_vectored +implementation. Read more
1.0.0 · Source§

fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize, Error>

Reads all bytes until EOF in this source, placing them into buf. Read more
1.0.0 · Source§

fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>

Reads all bytes until EOF in this source, appending them to buf. Read more
1.6.0 · Source§

fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>

Reads the exact number of bytes required to fill buf. Read more
Source§

fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>

🔬This is a nightly-only experimental API. (read_buf)
Pull some bytes from this source into the specified buffer. Read more
Source§

fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>

🔬This is a nightly-only experimental API. (read_buf)
Reads the exact number of bytes required to fill cursor. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where + Self: Sized,

Creates a “by reference” adaptor for this instance of Read. Read more
1.0.0 · Source§

fn bytes(self) -> Bytes<Self>
where + Self: Sized,

Transforms this Read instance to an Iterator over its bytes. Read more
1.0.0 · Source§

fn chain<R>(self, next: R) -> Chain<Self, R>
where + R: Read, + Self: Sized,

Creates an adapter which will chain this stream with another. Read more
1.0.0 · Source§

fn take(self, limit: u64) -> Take<Self>
where + Self: Sized,

Creates an adapter which will read at most limit bytes from it. Read more
Source§

impl Seek for AsyncAdapterStream

Source§

fn seek(&mut self, pos: SeekFrom) -> IoResult<u64>

Seek to an offset, in bytes, in a stream. Read more
1.55.0 · Source§

fn rewind(&mut self) -> Result<(), Error>

Rewind to the beginning of a stream. Read more
Source§

fn stream_len(&mut self) -> Result<u64, Error>

🔬This is a nightly-only experimental API. (seek_stream_len)
Returns the length of this stream (in bytes). Read more
1.51.0 · Source§

fn stream_position(&mut self) -> Result<u64, Error>

Returns the current seek position from the start of the stream. Read more
1.80.0 · Source§

fn seek_relative(&mut self, offset: i64) -> Result<(), Error>

Seeks relative to the current position. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
§

impl<R> ReadBytesExt for R
where + R: Read + ?Sized,

§

fn read_u8(&mut self) -> Result<u8, Error>

Reads an unsigned 8 bit integer from the underlying reader. Read more
§

fn read_i8(&mut self) -> Result<i8, Error>

Reads a signed 8 bit integer from the underlying reader. Read more
§

fn read_u16<T>(&mut self) -> Result<u16, Error>
where + T: ByteOrder,

Reads an unsigned 16 bit integer from the underlying reader. Read more
§

fn read_i16<T>(&mut self) -> Result<i16, Error>
where + T: ByteOrder,

Reads a signed 16 bit integer from the underlying reader. Read more
§

fn read_u24<T>(&mut self) -> Result<u32, Error>
where + T: ByteOrder,

Reads an unsigned 24 bit integer from the underlying reader. Read more
§

fn read_i24<T>(&mut self) -> Result<i32, Error>
where + T: ByteOrder,

Reads a signed 24 bit integer from the underlying reader. Read more
§

fn read_u32<T>(&mut self) -> Result<u32, Error>
where + T: ByteOrder,

Reads an unsigned 32 bit integer from the underlying reader. Read more
§

fn read_i32<T>(&mut self) -> Result<i32, Error>
where + T: ByteOrder,

Reads a signed 32 bit integer from the underlying reader. Read more
§

fn read_u48<T>(&mut self) -> Result<u64, Error>
where + T: ByteOrder,

Reads an unsigned 48 bit integer from the underlying reader. Read more
§

fn read_i48<T>(&mut self) -> Result<i64, Error>
where + T: ByteOrder,

Reads a signed 48 bit integer from the underlying reader. Read more
§

fn read_u64<T>(&mut self) -> Result<u64, Error>
where + T: ByteOrder,

Reads an unsigned 64 bit integer from the underlying reader. Read more
§

fn read_i64<T>(&mut self) -> Result<i64, Error>
where + T: ByteOrder,

Reads a signed 64 bit integer from the underlying reader. Read more
§

fn read_u128<T>(&mut self) -> Result<u128, Error>
where + T: ByteOrder,

Reads an unsigned 128 bit integer from the underlying reader. Read more
§

fn read_i128<T>(&mut self) -> Result<i128, Error>
where + T: ByteOrder,

Reads a signed 128 bit integer from the underlying reader. Read more
§

fn read_uint<T>(&mut self, nbytes: usize) -> Result<u64, Error>
where + T: ByteOrder,

Reads an unsigned n-bytes integer from the underlying reader. Read more
§

fn read_int<T>(&mut self, nbytes: usize) -> Result<i64, Error>
where + T: ByteOrder,

Reads a signed n-bytes integer from the underlying reader. Read more
§

fn read_uint128<T>(&mut self, nbytes: usize) -> Result<u128, Error>
where + T: ByteOrder,

Reads an unsigned n-bytes integer from the underlying reader.
§

fn read_int128<T>(&mut self, nbytes: usize) -> Result<i128, Error>
where + T: ByteOrder,

Reads a signed n-bytes integer from the underlying reader.
§

fn read_f32<T>(&mut self) -> Result<f32, Error>
where + T: ByteOrder,

Reads a IEEE754 single-precision (4 bytes) floating point number from +the underlying reader. Read more
§

fn read_f64<T>(&mut self) -> Result<f64, Error>
where + T: ByteOrder,

Reads a IEEE754 double-precision (8 bytes) floating point number from +the underlying reader. Read more
§

fn read_u16_into<T>(&mut self, dst: &mut [u16]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of unsigned 16 bit integers from the underlying +reader. Read more
§

fn read_u32_into<T>(&mut self, dst: &mut [u32]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of unsigned 32 bit integers from the underlying +reader. Read more
§

fn read_u64_into<T>(&mut self, dst: &mut [u64]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of unsigned 64 bit integers from the underlying +reader. Read more
§

fn read_u128_into<T>(&mut self, dst: &mut [u128]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of unsigned 128 bit integers from the underlying +reader. Read more
§

fn read_i8_into(&mut self, dst: &mut [i8]) -> Result<(), Error>

Reads a sequence of signed 8 bit integers from the underlying reader. Read more
§

fn read_i16_into<T>(&mut self, dst: &mut [i16]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of signed 16 bit integers from the underlying +reader. Read more
§

fn read_i32_into<T>(&mut self, dst: &mut [i32]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of signed 32 bit integers from the underlying +reader. Read more
§

fn read_i64_into<T>(&mut self, dst: &mut [i64]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of signed 64 bit integers from the underlying +reader. Read more
§

fn read_i128_into<T>(&mut self, dst: &mut [i128]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of signed 128 bit integers from the underlying +reader. Read more
§

fn read_f32_into<T>(&mut self, dst: &mut [f32]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of IEEE754 single-precision (4 bytes) floating +point numbers from the underlying reader. Read more
§

fn read_f32_into_unchecked<T>(&mut self, dst: &mut [f32]) -> Result<(), Error>
where + T: ByteOrder,

👎Deprecated since 1.2.0: please use read_f32_into instead
DEPRECATED. Read more
§

fn read_f64_into<T>(&mut self, dst: &mut [f64]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of IEEE754 double-precision (8 bytes) floating +point numbers from the underlying reader. Read more
§

fn read_f64_into_unchecked<T>(&mut self, dst: &mut [f64]) -> Result<(), Error>
where + T: ByteOrder,

👎Deprecated since 1.2.0: please use read_f64_into instead
DEPRECATED. Read more
§

impl<R> ReadSkipExt for R
where + R: Read,

§

fn skip(&mut self, amt: usize) -> usize

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/input/struct.AsyncReadOnlySource.html b/next/songbird/input/struct.AsyncReadOnlySource.html new file mode 100644 index 0000000..8fd7dc7 --- /dev/null +++ b/next/songbird/input/struct.AsyncReadOnlySource.html @@ -0,0 +1,121 @@ +AsyncReadOnlySource in songbird::input - Rust

AsyncReadOnlySource

Struct AsyncReadOnlySource 

Source
pub struct AsyncReadOnlySource { /* private fields */ }
Expand description

AsyncReadOnlySource wraps any source implementing [tokio::io::AsyncRead] in an unseekable +[symphonia_core::io::MediaSource], similar to [symphonia_core::io::ReadOnlySource]

+

Implementations§

Source§

impl AsyncReadOnlySource

Source

pub fn new<R>(inner: R) -> Self
where + R: AsyncRead + Send + Sync + Unpin + 'static,

Instantiates a new AsyncReadOnlySource by taking ownership and wrapping the provided +Reader.

+
Source

pub fn get_ref(&self) -> &Box<dyn AsyncRead + Send + Sync + Unpin>

Gets a reference to the underlying reader.

+
Source

pub fn into_inner<R>(self) -> Box<dyn AsyncRead + Send + Sync + Unpin>

Unwraps this AsyncReadOnlySource, returning the underlying reader.

+

Trait Implementations§

Source§

impl AsyncMediaSource for AsyncReadOnlySource

Source§

fn is_seekable(&self) -> bool

Returns if the source is seekable. This may be an expensive operation.
Source§

fn byte_len<'life0, 'async_trait>( + &'life0 self, +) -> Pin<Box<dyn Future<Output = Option<u64>> + Send + 'async_trait>>
where + Self: 'async_trait, + 'life0: 'async_trait,

Returns the length in bytes, if available. This may be an expensive operation.
Source§

fn try_resume<'life0, 'async_trait>( + &'life0 mut self, + _offset: u64, +) -> Pin<Box<dyn Future<Output = Result<Box<dyn AsyncMediaSource>, AudioStreamError>> + Send + 'async_trait>>
where + Self: 'async_trait, + 'life0: 'async_trait,

Tries to recreate this stream in event of an error, resuming from the given offset.
Source§

impl AsyncRead for AsyncReadOnlySource

Source§

fn poll_read( + self: Pin<&mut Self>, + cx: &mut Context<'_>, + buf: &mut ReadBuf<'_>, +) -> Poll<IoResult<()>>

Attempts to read from the AsyncRead into buf. Read more
Source§

impl AsyncSeek for AsyncReadOnlySource

Source§

fn start_seek(self: Pin<&mut Self>, _position: SeekFrom) -> IoResult<()>

Attempts to seek to an offset, in bytes, in a stream. Read more
Source§

fn poll_complete( + self: Pin<&mut Self>, + _cx: &mut Context<'_>, +) -> Poll<IoResult<u64>>

Waits for a seek operation to complete. Read more
Source§

impl<'pin> Unpin for AsyncReadOnlySource
where + PinnedFieldsOf<__AsyncReadOnlySource<'pin>>: Unpin,

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<R> AsyncReadExt for R
where + R: AsyncRead + ?Sized,

§

fn chain<R>(self, next: R) -> Chain<Self, R>
where + Self: Sized, + R: AsyncRead,

Creates a new AsyncRead instance that chains this stream with +next. Read more
§

fn read<'a>(&'a mut self, buf: &'a mut [u8]) -> Read<'a, Self>
where + Self: Unpin,

Pulls some bytes from this source into the specified buffer, +returning how many bytes were read. Read more
§

fn read_buf<'a, B>(&'a mut self, buf: &'a mut B) -> ReadBuf<'a, Self, B>
where + Self: Unpin, + B: BufMut + ?Sized,

Pulls some bytes from this source into the specified buffer, +advancing the buffer’s internal cursor. Read more
§

fn read_exact<'a>(&'a mut self, buf: &'a mut [u8]) -> ReadExact<'a, Self>
where + Self: Unpin,

Reads the exact number of bytes required to fill buf. Read more
§

fn read_u8(&mut self) -> ReadU8<&mut Self>
where + Self: Unpin,

Reads an unsigned 8 bit integer from the underlying reader. Read more
§

fn read_i8(&mut self) -> ReadI8<&mut Self>
where + Self: Unpin,

Reads a signed 8 bit integer from the underlying reader. Read more
§

fn read_u16(&mut self) -> ReadU16<&mut Self>
where + Self: Unpin,

Reads an unsigned 16-bit integer in big-endian order from the +underlying reader. Read more
§

fn read_i16(&mut self) -> ReadI16<&mut Self>
where + Self: Unpin,

Reads a signed 16-bit integer in big-endian order from the +underlying reader. Read more
§

fn read_u32(&mut self) -> ReadU32<&mut Self>
where + Self: Unpin,

Reads an unsigned 32-bit integer in big-endian order from the +underlying reader. Read more
§

fn read_i32(&mut self) -> ReadI32<&mut Self>
where + Self: Unpin,

Reads a signed 32-bit integer in big-endian order from the +underlying reader. Read more
§

fn read_u64(&mut self) -> ReadU64<&mut Self>
where + Self: Unpin,

Reads an unsigned 64-bit integer in big-endian order from the +underlying reader. Read more
§

fn read_i64(&mut self) -> ReadI64<&mut Self>
where + Self: Unpin,

Reads an signed 64-bit integer in big-endian order from the +underlying reader. Read more
§

fn read_u128(&mut self) -> ReadU128<&mut Self>
where + Self: Unpin,

Reads an unsigned 128-bit integer in big-endian order from the +underlying reader. Read more
§

fn read_i128(&mut self) -> ReadI128<&mut Self>
where + Self: Unpin,

Reads an signed 128-bit integer in big-endian order from the +underlying reader. Read more
§

fn read_f32(&mut self) -> ReadF32<&mut Self>
where + Self: Unpin,

Reads an 32-bit floating point type in big-endian order from the +underlying reader. Read more
§

fn read_f64(&mut self) -> ReadF64<&mut Self>
where + Self: Unpin,

Reads an 64-bit floating point type in big-endian order from the +underlying reader. Read more
§

fn read_u16_le(&mut self) -> ReadU16Le<&mut Self>
where + Self: Unpin,

Reads an unsigned 16-bit integer in little-endian order from the +underlying reader. Read more
§

fn read_i16_le(&mut self) -> ReadI16Le<&mut Self>
where + Self: Unpin,

Reads a signed 16-bit integer in little-endian order from the +underlying reader. Read more
§

fn read_u32_le(&mut self) -> ReadU32Le<&mut Self>
where + Self: Unpin,

Reads an unsigned 32-bit integer in little-endian order from the +underlying reader. Read more
§

fn read_i32_le(&mut self) -> ReadI32Le<&mut Self>
where + Self: Unpin,

Reads a signed 32-bit integer in little-endian order from the +underlying reader. Read more
§

fn read_u64_le(&mut self) -> ReadU64Le<&mut Self>
where + Self: Unpin,

Reads an unsigned 64-bit integer in little-endian order from the +underlying reader. Read more
§

fn read_i64_le(&mut self) -> ReadI64Le<&mut Self>
where + Self: Unpin,

Reads an signed 64-bit integer in little-endian order from the +underlying reader. Read more
§

fn read_u128_le(&mut self) -> ReadU128Le<&mut Self>
where + Self: Unpin,

Reads an unsigned 128-bit integer in little-endian order from the +underlying reader. Read more
§

fn read_i128_le(&mut self) -> ReadI128Le<&mut Self>
where + Self: Unpin,

Reads an signed 128-bit integer in little-endian order from the +underlying reader. Read more
§

fn read_f32_le(&mut self) -> ReadF32Le<&mut Self>
where + Self: Unpin,

Reads an 32-bit floating point type in little-endian order from the +underlying reader. Read more
§

fn read_f64_le(&mut self) -> ReadF64Le<&mut Self>
where + Self: Unpin,

Reads an 64-bit floating point type in little-endian order from the +underlying reader. Read more
§

fn read_to_end<'a>(&'a mut self, buf: &'a mut Vec<u8>) -> ReadToEnd<'a, Self>
where + Self: Unpin,

Reads all bytes until EOF in this source, placing them into buf. Read more
§

fn read_to_string<'a>( + &'a mut self, + dst: &'a mut String, +) -> ReadToString<'a, Self>
where + Self: Unpin,

Reads all bytes until EOF in this source, appending them to buf. Read more
§

fn take(self, limit: u64) -> Take<Self>
where + Self: Sized,

Creates an adaptor which reads at most limit bytes from it. Read more
§

impl<S> AsyncSeekExt for S
where + S: AsyncSeek + ?Sized,

§

fn seek(&mut self, pos: SeekFrom) -> Seek<'_, Self>
where + Self: Unpin,

Creates a future which will seek an IO object, and then yield the +new position in the object and the object itself. Read more
§

fn rewind(&mut self) -> Seek<'_, Self>
where + Self: Unpin,

Creates a future which will rewind to the beginning of the stream. Read more
§

fn stream_position(&mut self) -> Seek<'_, Self>
where + Self: Unpin,

Creates a future which will return the current seek position from the +start of the stream. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/input/struct.AudioStream.html b/next/songbird/input/struct.AudioStream.html new file mode 100644 index 0000000..644124a --- /dev/null +++ b/next/songbird/input/struct.AudioStream.html @@ -0,0 +1,46 @@ +AudioStream in songbird::input - Rust

AudioStream

Struct AudioStream 

Source
pub struct AudioStream<T: Send> {
+    pub input: T,
+    pub hint: Option<Hint>,
+}
Expand description

An unread byte stream for an audio file.

+

Fields§

§input: T

The wrapped file stream.

+

An input stream must not have been read into past the start of the +audio container’s header.

+
§hint: Option<Hint>

Extension and MIME type information which may help guide format selection.

+

Auto Trait Implementations§

§

impl<T> Freeze for AudioStream<T>
where + T: Freeze,

§

impl<T> RefUnwindSafe for AudioStream<T>
where + T: RefUnwindSafe,

§

impl<T> Send for AudioStream<T>

§

impl<T> Sync for AudioStream<T>
where + T: Sync,

§

impl<T> Unpin for AudioStream<T>
where + T: Unpin,

§

impl<T> UnwindSafe for AudioStream<T>
where + T: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/input/struct.AuxMetadata.html b/next/songbird/input/struct.AuxMetadata.html new file mode 100644 index 0000000..e1d43a1 --- /dev/null +++ b/next/songbird/input/struct.AuxMetadata.html @@ -0,0 +1,76 @@ +AuxMetadata in songbird::input - Rust

AuxMetadata

Struct AuxMetadata 

Source
pub struct AuxMetadata {
+    pub track: Option<String>,
+    pub artist: Option<String>,
+    pub album: Option<String>,
+    pub date: Option<String>,
+    pub channels: Option<u8>,
+    pub channel: Option<String>,
+    pub start_time: Option<Duration>,
+    pub duration: Option<Duration>,
+    pub sample_rate: Option<u32>,
+    pub source_url: Option<String>,
+    pub title: Option<String>,
+    pub thumbnail: Option<String>,
+}
Expand description

Extra information about an Input which is acquired without +parsing the file itself (e.g., from a webpage).

+

You can access this via Input::aux_metadata and Compose::aux_metadata.

+

Fields§

§track: Option<String>

The track name of this stream.

+
§artist: Option<String>

The main artist of this stream.

+
§album: Option<String>

The album name of this stream.

+
§date: Option<String>

The date of creation of this stream.

+
§channels: Option<u8>

The number of audio channels in this stream.

+
§channel: Option<String>

The YouTube channel of this stream.

+
§start_time: Option<Duration>

The time at which the first true sample is played back.

+

This occurs as an artefact of coder delay.

+
§duration: Option<Duration>

The reported duration of this stream.

+
§sample_rate: Option<u32>

The sample rate of this stream.

+
§source_url: Option<String>

The source url of this stream.

+
§title: Option<String>

The YouTube title of this stream.

+
§thumbnail: Option<String>

The thumbnail url of this stream.

+

Implementations§

Source§

impl AuxMetadata

Source

pub fn from_ffprobe_json(value: &mut [u8]) -> Result<Self, JsonError>

Extract metadata and details from the output of ffprobe -of json.

+
Source

pub fn take(&mut self) -> Self

Move all fields from an AuxMetadata object into a new one.

+

Trait Implementations§

Source§

impl Clone for AuxMetadata

Source§

fn clone(&self) -> AuxMetadata

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for AuxMetadata

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for AuxMetadata

Source§

fn default() -> AuxMetadata

Returns the “default value” for a type. Read more
Source§

impl PartialEq for AuxMetadata

Source§

fn eq(&self, other: &AuxMetadata) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for AuxMetadata

Source§

impl StructuralPartialEq for AuxMetadata

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/input/struct.ChildContainer.html b/next/songbird/input/struct.ChildContainer.html new file mode 100644 index 0000000..253f259 --- /dev/null +++ b/next/songbird/input/struct.ChildContainer.html @@ -0,0 +1,92 @@ +ChildContainer in songbird::input - Rust

ChildContainer

Struct ChildContainer 

Source
pub struct ChildContainer(pub Vec<Child>);
Expand description

Handle for a child process which ensures that any subprocesses are properly closed +on drop.

+

§Warning

+

To allow proper cleanup of child processes, if you create a process chain you must +make sure to use From<Vec<Child>>. Here, the last process in the Vec will be +used as the audio byte source.

+

Tuple Fields§

§0: Vec<Child>

Implementations§

Source§

impl ChildContainer

Source

pub fn new(children: Vec<Child>) -> Self

Create a new ChildContainer from a child process

+

Trait Implementations§

Source§

impl Debug for ChildContainer

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Drop for ChildContainer

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

impl From<Child> for ChildContainer

Source§

fn from(container: Child) -> Self

Converts to this type from the input type.
Source§

impl From<ChildContainer> for Input

Source§

fn from(val: ChildContainer) -> Self

Converts to this type from the input type.
Source§

impl From<Vec<Child>> for ChildContainer

Source§

fn from(container: Vec<Child>) -> Self

Converts to this type from the input type.
Source§

impl Read for ChildContainer

Source§

fn read(&mut self, buffer: &mut [u8]) -> IoResult<usize>

Pull some bytes from this source into the specified buffer, returning +how many bytes were read. Read more
1.36.0 · Source§

fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>

Like read, except that it reads into a slice of buffers. Read more
Source§

fn is_read_vectored(&self) -> bool

🔬This is a nightly-only experimental API. (can_vector)
Determines if this Reader has an efficient read_vectored +implementation. Read more
1.0.0 · Source§

fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize, Error>

Reads all bytes until EOF in this source, placing them into buf. Read more
1.0.0 · Source§

fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>

Reads all bytes until EOF in this source, appending them to buf. Read more
1.6.0 · Source§

fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>

Reads the exact number of bytes required to fill buf. Read more
Source§

fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>

🔬This is a nightly-only experimental API. (read_buf)
Pull some bytes from this source into the specified buffer. Read more
Source§

fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>

🔬This is a nightly-only experimental API. (read_buf)
Reads the exact number of bytes required to fill cursor. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where + Self: Sized,

Creates a “by reference” adaptor for this instance of Read. Read more
1.0.0 · Source§

fn bytes(self) -> Bytes<Self>
where + Self: Sized,

Transforms this Read instance to an Iterator over its bytes. Read more
1.0.0 · Source§

fn chain<R>(self, next: R) -> Chain<Self, R>
where + R: Read, + Self: Sized,

Creates an adapter which will chain this stream with another. Read more
1.0.0 · Source§

fn take(self, limit: u64) -> Take<Self>
where + Self: Sized,

Creates an adapter which will read at most limit bytes from it. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
§

impl<R> ReadBytesExt for R
where + R: Read + ?Sized,

§

fn read_u8(&mut self) -> Result<u8, Error>

Reads an unsigned 8 bit integer from the underlying reader. Read more
§

fn read_i8(&mut self) -> Result<i8, Error>

Reads a signed 8 bit integer from the underlying reader. Read more
§

fn read_u16<T>(&mut self) -> Result<u16, Error>
where + T: ByteOrder,

Reads an unsigned 16 bit integer from the underlying reader. Read more
§

fn read_i16<T>(&mut self) -> Result<i16, Error>
where + T: ByteOrder,

Reads a signed 16 bit integer from the underlying reader. Read more
§

fn read_u24<T>(&mut self) -> Result<u32, Error>
where + T: ByteOrder,

Reads an unsigned 24 bit integer from the underlying reader. Read more
§

fn read_i24<T>(&mut self) -> Result<i32, Error>
where + T: ByteOrder,

Reads a signed 24 bit integer from the underlying reader. Read more
§

fn read_u32<T>(&mut self) -> Result<u32, Error>
where + T: ByteOrder,

Reads an unsigned 32 bit integer from the underlying reader. Read more
§

fn read_i32<T>(&mut self) -> Result<i32, Error>
where + T: ByteOrder,

Reads a signed 32 bit integer from the underlying reader. Read more
§

fn read_u48<T>(&mut self) -> Result<u64, Error>
where + T: ByteOrder,

Reads an unsigned 48 bit integer from the underlying reader. Read more
§

fn read_i48<T>(&mut self) -> Result<i64, Error>
where + T: ByteOrder,

Reads a signed 48 bit integer from the underlying reader. Read more
§

fn read_u64<T>(&mut self) -> Result<u64, Error>
where + T: ByteOrder,

Reads an unsigned 64 bit integer from the underlying reader. Read more
§

fn read_i64<T>(&mut self) -> Result<i64, Error>
where + T: ByteOrder,

Reads a signed 64 bit integer from the underlying reader. Read more
§

fn read_u128<T>(&mut self) -> Result<u128, Error>
where + T: ByteOrder,

Reads an unsigned 128 bit integer from the underlying reader. Read more
§

fn read_i128<T>(&mut self) -> Result<i128, Error>
where + T: ByteOrder,

Reads a signed 128 bit integer from the underlying reader. Read more
§

fn read_uint<T>(&mut self, nbytes: usize) -> Result<u64, Error>
where + T: ByteOrder,

Reads an unsigned n-bytes integer from the underlying reader. Read more
§

fn read_int<T>(&mut self, nbytes: usize) -> Result<i64, Error>
where + T: ByteOrder,

Reads a signed n-bytes integer from the underlying reader. Read more
§

fn read_uint128<T>(&mut self, nbytes: usize) -> Result<u128, Error>
where + T: ByteOrder,

Reads an unsigned n-bytes integer from the underlying reader.
§

fn read_int128<T>(&mut self, nbytes: usize) -> Result<i128, Error>
where + T: ByteOrder,

Reads a signed n-bytes integer from the underlying reader.
§

fn read_f32<T>(&mut self) -> Result<f32, Error>
where + T: ByteOrder,

Reads a IEEE754 single-precision (4 bytes) floating point number from +the underlying reader. Read more
§

fn read_f64<T>(&mut self) -> Result<f64, Error>
where + T: ByteOrder,

Reads a IEEE754 double-precision (8 bytes) floating point number from +the underlying reader. Read more
§

fn read_u16_into<T>(&mut self, dst: &mut [u16]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of unsigned 16 bit integers from the underlying +reader. Read more
§

fn read_u32_into<T>(&mut self, dst: &mut [u32]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of unsigned 32 bit integers from the underlying +reader. Read more
§

fn read_u64_into<T>(&mut self, dst: &mut [u64]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of unsigned 64 bit integers from the underlying +reader. Read more
§

fn read_u128_into<T>(&mut self, dst: &mut [u128]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of unsigned 128 bit integers from the underlying +reader. Read more
§

fn read_i8_into(&mut self, dst: &mut [i8]) -> Result<(), Error>

Reads a sequence of signed 8 bit integers from the underlying reader. Read more
§

fn read_i16_into<T>(&mut self, dst: &mut [i16]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of signed 16 bit integers from the underlying +reader. Read more
§

fn read_i32_into<T>(&mut self, dst: &mut [i32]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of signed 32 bit integers from the underlying +reader. Read more
§

fn read_i64_into<T>(&mut self, dst: &mut [i64]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of signed 64 bit integers from the underlying +reader. Read more
§

fn read_i128_into<T>(&mut self, dst: &mut [i128]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of signed 128 bit integers from the underlying +reader. Read more
§

fn read_f32_into<T>(&mut self, dst: &mut [f32]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of IEEE754 single-precision (4 bytes) floating +point numbers from the underlying reader. Read more
§

fn read_f32_into_unchecked<T>(&mut self, dst: &mut [f32]) -> Result<(), Error>
where + T: ByteOrder,

👎Deprecated since 1.2.0: please use read_f32_into instead
DEPRECATED. Read more
§

fn read_f64_into<T>(&mut self, dst: &mut [f64]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of IEEE754 double-precision (8 bytes) floating +point numbers from the underlying reader. Read more
§

fn read_f64_into_unchecked<T>(&mut self, dst: &mut [f64]) -> Result<(), Error>
where + T: ByteOrder,

👎Deprecated since 1.2.0: please use read_f64_into instead
DEPRECATED. Read more
§

impl<R> ReadSkipExt for R
where + R: Read,

§

fn skip(&mut self, amt: usize) -> usize

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/input/struct.File.html b/next/songbird/input/struct.File.html new file mode 100644 index 0000000..7095984 --- /dev/null +++ b/next/songbird/input/struct.File.html @@ -0,0 +1,57 @@ +File in songbird::input - Rust

File

Struct File 

Source
pub struct File<P: AsRef<Path>> { /* private fields */ }
Expand description

A lazily instantiated local file.

+

Implementations§

Source§

impl<P: AsRef<Path>> File<P>

Source

pub fn new(path: P) -> Self

Creates a lazy file object, which will open the target path.

+

This is infallible as the path is only checked during creation.

+

Trait Implementations§

Source§

impl<P: Clone + AsRef<Path>> Clone for File<P>

Source§

fn clone(&self) -> File<P>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<P: AsRef<Path> + Send + Sync> Compose for File<P>

Source§

fn create( + &mut self, +) -> Result<AudioStream<Box<dyn MediaSource>>, AudioStreamError>

Create a source synchronously. Read more
Source§

fn create_async<'life0, 'async_trait>( + &'life0 mut self, +) -> Pin<Box<dyn Future<Output = Result<AudioStream<Box<dyn MediaSource>>, AudioStreamError>> + Send + 'async_trait>>
where + Self: 'async_trait, + 'life0: 'async_trait,

Create a source asynchronously. Read more
Source§

fn should_create_async(&self) -> bool

Determines whether this source will be instantiated using create or create_async. Read more
Source§

fn aux_metadata<'life0, 'async_trait>( + &'life0 mut self, +) -> Pin<Box<dyn Future<Output = Result<AuxMetadata, AudioStreamError>> + Send + 'async_trait>>
where + Self: 'async_trait, + 'life0: 'async_trait,

Requests auxiliary metadata which can be accessed without parsing the file. Read more
Source§

impl<P: Debug + AsRef<Path>> Debug for File<P>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<P: AsRef<Path> + Send + Sync + 'static> From<File<P>> for Input

Source§

fn from(val: File<P>) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

§

impl<P> Freeze for File<P>
where + P: Freeze,

§

impl<P> RefUnwindSafe for File<P>
where + P: RefUnwindSafe,

§

impl<P> Send for File<P>
where + P: Send,

§

impl<P> Sync for File<P>
where + P: Sync,

§

impl<P> Unpin for File<P>
where + P: Unpin,

§

impl<P> UnwindSafe for File<P>
where + P: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/input/struct.HlsRequest.html b/next/songbird/input/struct.HlsRequest.html new file mode 100644 index 0000000..684f033 --- /dev/null +++ b/next/songbird/input/struct.HlsRequest.html @@ -0,0 +1,54 @@ +HlsRequest in songbird::input - Rust

HlsRequest

Struct HlsRequest 

Source
pub struct HlsRequest { /* private fields */ }
Expand description

Lazy HLS stream

+

§Note:

+

Compose::create for this struct panics if called outside of a +tokio executor since it uses background tasks.

+

Implementations§

Source§

impl HlsRequest

Source

pub fn new(client: Client, request: String) -> Self

Create a lazy HLS request.

+
Source

pub fn new_with_headers( + client: Client, + request: String, + headers: HeaderMap, +) -> Self

Create a lazy HTTP request.

+

Trait Implementations§

Source§

impl Compose for HlsRequest

Source§

fn create( + &mut self, +) -> Result<AudioStream<Box<dyn MediaSource>>, AudioStreamError>

Create a source synchronously. Read more
Source§

fn create_async<'life0, 'async_trait>( + &'life0 mut self, +) -> Pin<Box<dyn Future<Output = Result<AudioStream<Box<dyn MediaSource>>, AudioStreamError>> + Send + 'async_trait>>
where + Self: 'async_trait, + 'life0: 'async_trait,

Create a source asynchronously. Read more
Source§

fn should_create_async(&self) -> bool

Determines whether this source will be instantiated using create or create_async. Read more
Source§

fn aux_metadata<'life0, 'async_trait>( + &'life0 mut self, +) -> Pin<Box<dyn Future<Output = Result<AuxMetadata, AudioStreamError>> + Send + 'async_trait>>
where + Self: 'async_trait, + 'life0: 'async_trait,

Requests auxiliary metadata which can be accessed without parsing the file. Read more
Source§

impl Debug for HlsRequest

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl From<HlsRequest> for Input

Source§

fn from(val: HlsRequest) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/input/struct.HttpRequest.html b/next/songbird/input/struct.HttpRequest.html new file mode 100644 index 0000000..1e7fdfb --- /dev/null +++ b/next/songbird/input/struct.HttpRequest.html @@ -0,0 +1,67 @@ +HttpRequest in songbird::input - Rust

HttpRequest

Struct HttpRequest 

Source
pub struct HttpRequest {
+    pub client: Client,
+    pub request: String,
+    pub headers: HeaderMap,
+    pub content_length: Option<u64>,
+}
Expand description

A lazily instantiated HTTP request.

+

Fields§

§client: Client

A reqwest client instance used to send the HTTP GET request.

+
§request: String

The target URL of the required resource.

+
§headers: HeaderMap

HTTP header fields to add to any created requests.

+
§content_length: Option<u64>

Content length, used as an upper bound in range requests if known.

+

This is only needed for certain domains who expect to see a value like +range: bytes=0-1023 instead of the simpler range: bytes=0- (such as +Youtube).

+

Implementations§

Source§

impl HttpRequest

Source

pub fn new(client: Client, request: String) -> Self

Create a lazy HTTP request.

+
Source

pub fn new_with_headers( + client: Client, + request: String, + headers: HeaderMap, +) -> Self

Create a lazy HTTP request.

+

Trait Implementations§

Source§

impl Clone for HttpRequest

Source§

fn clone(&self) -> HttpRequest

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Compose for HttpRequest

Source§

fn create( + &mut self, +) -> Result<AudioStream<Box<dyn MediaSource>>, AudioStreamError>

Create a source synchronously. Read more
Source§

fn create_async<'life0, 'async_trait>( + &'life0 mut self, +) -> Pin<Box<dyn Future<Output = Result<AudioStream<Box<dyn MediaSource>>, AudioStreamError>> + Send + 'async_trait>>
where + Self: 'async_trait, + 'life0: 'async_trait,

Create a source asynchronously. Read more
Source§

fn should_create_async(&self) -> bool

Determines whether this source will be instantiated using create or create_async. Read more
Source§

fn aux_metadata<'life0, 'async_trait>( + &'life0 mut self, +) -> Pin<Box<dyn Future<Output = Result<AuxMetadata, AudioStreamError>> + Send + 'async_trait>>
where + Self: 'async_trait, + 'life0: 'async_trait,

Requests auxiliary metadata which can be accessed without parsing the file. Read more
Source§

impl Debug for HttpRequest

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl From<HttpRequest> for Input

Source§

fn from(val: HttpRequest) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/input/struct.Metadata.html b/next/songbird/input/struct.Metadata.html new file mode 100644 index 0000000..06e070c --- /dev/null +++ b/next/songbird/input/struct.Metadata.html @@ -0,0 +1,49 @@ +Metadata in songbird::input - Rust

Metadata

Struct Metadata 

Source
pub struct Metadata<'a> {
+    pub probe: &'a mut ProbedMetadata,
+    pub format: Metadata<'a>,
+}
Expand description

In-stream information about an Input acquired by parsing an audio file.

+

To access this, the Input must be made live and parsed by symphonia. To do +this, you can:

+ +

You probably want to use AuxMetadata instead; this requires a live track, +which has higher memory use for buffers etc.

+

Fields§

§probe: &'a mut ProbedMetadata

Metadata found while probing for the format of an Input (e.g., ID3 tags).

+
§format: Metadata<'a>

Metadata found inside the format/container of an audio stream.

+

Trait Implementations§

Source§

impl<'a> From<&'a mut Parsed> for Metadata<'a>

Source§

fn from(val: &'a mut Parsed) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

§

impl<'a> Freeze for Metadata<'a>

§

impl<'a> RefUnwindSafe for Metadata<'a>

§

impl<'a> Send for Metadata<'a>

§

impl<'a> Sync for Metadata<'a>

§

impl<'a> Unpin for Metadata<'a>

§

impl<'a> !UnwindSafe for Metadata<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/input/struct.Parsed.html b/next/songbird/input/struct.Parsed.html new file mode 100644 index 0000000..145117d --- /dev/null +++ b/next/songbird/input/struct.Parsed.html @@ -0,0 +1,53 @@ +Parsed in songbird::input - Rust

Parsed

Struct Parsed 

Source
pub struct Parsed {
+    pub format: Box<dyn FormatReader>,
+    pub decoder: Box<dyn Decoder>,
+    pub track_id: u32,
+    pub meta: ProbedMetadata,
+    pub supports_backseek: bool,
+}
Expand description

An audio file which has had its headers parsed and decoder state built.

+

Fields§

§format: Box<dyn FormatReader>

Audio packet, seeking, and state access for all tracks in a file.

+

This may be used to access packets one at a time from the input file. +Additionally, this exposes container-level and per track metadata which +have been extracted.

+
§decoder: Box<dyn Decoder>

Decoder state for the chosen track.

+
§track_id: u32

The chosen track’s ID.

+

This is required to identify the correct packet stream inside the container.

+
§meta: ProbedMetadata

Metadata extracted by symphonia while detecting a file’s format.

+

Typically, this detects metadata outside the file’s core format (i.e., +ID3 tags in MP3 and WAV files).

+
§supports_backseek: bool

Whether the contained format supports arbitrary seeking.

+

If set to false, Songbird will attempt to recreate the input if +it must seek backwards.

+

Trait Implementations§

Source§

impl<'a> From<&'a mut Parsed> for Metadata<'a>

Source§

fn from(val: &'a mut Parsed) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

§

impl Freeze for Parsed

§

impl !RefUnwindSafe for Parsed

§

impl Send for Parsed

§

impl Sync for Parsed

§

impl Unpin for Parsed

§

impl !UnwindSafe for Parsed

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/input/struct.RawAdapter.html b/next/songbird/input/struct.RawAdapter.html new file mode 100644 index 0000000..a84ddb6 --- /dev/null +++ b/next/songbird/input/struct.RawAdapter.html @@ -0,0 +1,96 @@ +RawAdapter in songbird::input - Rust

RawAdapter

Struct RawAdapter 

Source
pub struct RawAdapter<A> { /* private fields */ }
Expand description

Adapter around a raw, interleaved, f32 PCM byte stream.

+

This may be used to port legacy songbird audio sources to be compatible with +the symphonia backend, particularly those with unknown length (making WAV +unsuitable).

+

The format is described in RawReader.

+

Implementations§

Source§

impl<A: MediaSource> RawAdapter<A>

Source

pub fn new(audio_source: A, sample_rate: u32, channel_count: u32) -> Self

Wrap an input PCM byte source to be readable by symphonia.

+

Trait Implementations§

Source§

impl<A: MediaSource + Send + Sync + 'static> From<RawAdapter<A>> for Input

Source§

fn from(val: RawAdapter<A>) -> Self

Converts to this type from the input type.
Source§

impl<A: MediaSource> MediaSource for RawAdapter<A>

Source§

fn is_seekable(&self) -> bool

Returns if the source is seekable. This may be an expensive operation.
Source§

fn byte_len(&self) -> Option<u64>

Returns the length in bytes, if available. This may be an expensive operation.
Source§

impl<A: MediaSource> Read for RawAdapter<A>

Source§

fn read(&mut self, buf: &mut [u8]) -> IoResult<usize>

Pull some bytes from this source into the specified buffer, returning +how many bytes were read. Read more
1.36.0 · Source§

fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>

Like read, except that it reads into a slice of buffers. Read more
Source§

fn is_read_vectored(&self) -> bool

🔬This is a nightly-only experimental API. (can_vector)
Determines if this Reader has an efficient read_vectored +implementation. Read more
1.0.0 · Source§

fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize, Error>

Reads all bytes until EOF in this source, placing them into buf. Read more
1.0.0 · Source§

fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>

Reads all bytes until EOF in this source, appending them to buf. Read more
1.6.0 · Source§

fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>

Reads the exact number of bytes required to fill buf. Read more
Source§

fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>

🔬This is a nightly-only experimental API. (read_buf)
Pull some bytes from this source into the specified buffer. Read more
Source§

fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>

🔬This is a nightly-only experimental API. (read_buf)
Reads the exact number of bytes required to fill cursor. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where + Self: Sized,

Creates a “by reference” adaptor for this instance of Read. Read more
1.0.0 · Source§

fn bytes(self) -> Bytes<Self>
where + Self: Sized,

Transforms this Read instance to an Iterator over its bytes. Read more
1.0.0 · Source§

fn chain<R>(self, next: R) -> Chain<Self, R>
where + R: Read, + Self: Sized,

Creates an adapter which will chain this stream with another. Read more
1.0.0 · Source§

fn take(self, limit: u64) -> Take<Self>
where + Self: Sized,

Creates an adapter which will read at most limit bytes from it. Read more
Source§

impl<A: MediaSource> Seek for RawAdapter<A>

Source§

fn seek(&mut self, pos: SeekFrom) -> IoResult<u64>

Seek to an offset, in bytes, in a stream. Read more
1.55.0 · Source§

fn rewind(&mut self) -> Result<(), Error>

Rewind to the beginning of a stream. Read more
Source§

fn stream_len(&mut self) -> Result<u64, Error>

🔬This is a nightly-only experimental API. (seek_stream_len)
Returns the length of this stream (in bytes). Read more
1.51.0 · Source§

fn stream_position(&mut self) -> Result<u64, Error>

Returns the current seek position from the start of the stream. Read more
1.80.0 · Source§

fn seek_relative(&mut self, offset: i64) -> Result<(), Error>

Seeks relative to the current position. Read more

Auto Trait Implementations§

§

impl<A> Freeze for RawAdapter<A>
where + A: Freeze,

§

impl<A> RefUnwindSafe for RawAdapter<A>
where + A: RefUnwindSafe,

§

impl<A> Send for RawAdapter<A>
where + A: Send,

§

impl<A> Sync for RawAdapter<A>
where + A: Sync,

§

impl<A> Unpin for RawAdapter<A>
where + A: Unpin,

§

impl<A> UnwindSafe for RawAdapter<A>
where + A: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
§

impl<R> ReadBytesExt for R
where + R: Read + ?Sized,

§

fn read_u8(&mut self) -> Result<u8, Error>

Reads an unsigned 8 bit integer from the underlying reader. Read more
§

fn read_i8(&mut self) -> Result<i8, Error>

Reads a signed 8 bit integer from the underlying reader. Read more
§

fn read_u16<T>(&mut self) -> Result<u16, Error>
where + T: ByteOrder,

Reads an unsigned 16 bit integer from the underlying reader. Read more
§

fn read_i16<T>(&mut self) -> Result<i16, Error>
where + T: ByteOrder,

Reads a signed 16 bit integer from the underlying reader. Read more
§

fn read_u24<T>(&mut self) -> Result<u32, Error>
where + T: ByteOrder,

Reads an unsigned 24 bit integer from the underlying reader. Read more
§

fn read_i24<T>(&mut self) -> Result<i32, Error>
where + T: ByteOrder,

Reads a signed 24 bit integer from the underlying reader. Read more
§

fn read_u32<T>(&mut self) -> Result<u32, Error>
where + T: ByteOrder,

Reads an unsigned 32 bit integer from the underlying reader. Read more
§

fn read_i32<T>(&mut self) -> Result<i32, Error>
where + T: ByteOrder,

Reads a signed 32 bit integer from the underlying reader. Read more
§

fn read_u48<T>(&mut self) -> Result<u64, Error>
where + T: ByteOrder,

Reads an unsigned 48 bit integer from the underlying reader. Read more
§

fn read_i48<T>(&mut self) -> Result<i64, Error>
where + T: ByteOrder,

Reads a signed 48 bit integer from the underlying reader. Read more
§

fn read_u64<T>(&mut self) -> Result<u64, Error>
where + T: ByteOrder,

Reads an unsigned 64 bit integer from the underlying reader. Read more
§

fn read_i64<T>(&mut self) -> Result<i64, Error>
where + T: ByteOrder,

Reads a signed 64 bit integer from the underlying reader. Read more
§

fn read_u128<T>(&mut self) -> Result<u128, Error>
where + T: ByteOrder,

Reads an unsigned 128 bit integer from the underlying reader. Read more
§

fn read_i128<T>(&mut self) -> Result<i128, Error>
where + T: ByteOrder,

Reads a signed 128 bit integer from the underlying reader. Read more
§

fn read_uint<T>(&mut self, nbytes: usize) -> Result<u64, Error>
where + T: ByteOrder,

Reads an unsigned n-bytes integer from the underlying reader. Read more
§

fn read_int<T>(&mut self, nbytes: usize) -> Result<i64, Error>
where + T: ByteOrder,

Reads a signed n-bytes integer from the underlying reader. Read more
§

fn read_uint128<T>(&mut self, nbytes: usize) -> Result<u128, Error>
where + T: ByteOrder,

Reads an unsigned n-bytes integer from the underlying reader.
§

fn read_int128<T>(&mut self, nbytes: usize) -> Result<i128, Error>
where + T: ByteOrder,

Reads a signed n-bytes integer from the underlying reader.
§

fn read_f32<T>(&mut self) -> Result<f32, Error>
where + T: ByteOrder,

Reads a IEEE754 single-precision (4 bytes) floating point number from +the underlying reader. Read more
§

fn read_f64<T>(&mut self) -> Result<f64, Error>
where + T: ByteOrder,

Reads a IEEE754 double-precision (8 bytes) floating point number from +the underlying reader. Read more
§

fn read_u16_into<T>(&mut self, dst: &mut [u16]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of unsigned 16 bit integers from the underlying +reader. Read more
§

fn read_u32_into<T>(&mut self, dst: &mut [u32]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of unsigned 32 bit integers from the underlying +reader. Read more
§

fn read_u64_into<T>(&mut self, dst: &mut [u64]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of unsigned 64 bit integers from the underlying +reader. Read more
§

fn read_u128_into<T>(&mut self, dst: &mut [u128]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of unsigned 128 bit integers from the underlying +reader. Read more
§

fn read_i8_into(&mut self, dst: &mut [i8]) -> Result<(), Error>

Reads a sequence of signed 8 bit integers from the underlying reader. Read more
§

fn read_i16_into<T>(&mut self, dst: &mut [i16]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of signed 16 bit integers from the underlying +reader. Read more
§

fn read_i32_into<T>(&mut self, dst: &mut [i32]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of signed 32 bit integers from the underlying +reader. Read more
§

fn read_i64_into<T>(&mut self, dst: &mut [i64]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of signed 64 bit integers from the underlying +reader. Read more
§

fn read_i128_into<T>(&mut self, dst: &mut [i128]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of signed 128 bit integers from the underlying +reader. Read more
§

fn read_f32_into<T>(&mut self, dst: &mut [f32]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of IEEE754 single-precision (4 bytes) floating +point numbers from the underlying reader. Read more
§

fn read_f32_into_unchecked<T>(&mut self, dst: &mut [f32]) -> Result<(), Error>
where + T: ByteOrder,

👎Deprecated since 1.2.0: please use read_f32_into instead
DEPRECATED. Read more
§

fn read_f64_into<T>(&mut self, dst: &mut [f64]) -> Result<(), Error>
where + T: ByteOrder,

Reads a sequence of IEEE754 double-precision (8 bytes) floating +point numbers from the underlying reader. Read more
§

fn read_f64_into_unchecked<T>(&mut self, dst: &mut [f64]) -> Result<(), Error>
where + T: ByteOrder,

👎Deprecated since 1.2.0: please use read_f64_into instead
DEPRECATED. Read more
§

impl<R> ReadSkipExt for R
where + R: Read,

§

fn skip(&mut self, amt: usize) -> usize

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/input/struct.YoutubeDl.html b/next/songbird/input/struct.YoutubeDl.html new file mode 100644 index 0000000..f26edf8 --- /dev/null +++ b/next/songbird/input/struct.YoutubeDl.html @@ -0,0 +1,75 @@ +YoutubeDl in songbird::input - Rust

YoutubeDl

Struct YoutubeDl 

Source
pub struct YoutubeDl<'a> { /* private fields */ }
Expand description

A lazily instantiated call to download a file, finding its URL via youtube-dl.

+

By default, this uses yt-dlp and is backed by an HttpRequest. This handler +attempts to find the best audio-only source (typically WebM, enabling low-cost +Opus frame passthrough).

+

Implementations§

Source§

impl<'a> YoutubeDl<'a>

Source

pub fn new(client: Client, url: impl Into<Cow<'a, str>>) -> Self

Creates a lazy request to select an audio stream from url, using “yt-dlp”.

+

This requires a reqwest client: ideally, one should be created and shared between +all requests.

+
Source

pub fn new_ytdl_like( + program: &'a str, + client: Client, + url: impl Into<Cow<'a, str>>, +) -> Self

Creates a lazy request to select an audio stream from url as in new, using program.

+

Creates a request to search youtube for an optionally specified number of videos matching query, +using “yt-dlp”.

+
Source

pub fn new_search_ytdl_like( + program: &'a str, + client: Client, + query: impl Into<Cow<'a, str>>, +) -> Self

Creates a request to search youtube for an optionally specified number of videos matching query, +using program.

+
Source

pub fn user_args(self, user_args: Vec<String>) -> Self

Sets additional arguments for the “yt-dlp” process

+
Source

pub async fn search( + &mut self, + n_results: Option<usize>, +) -> Result<impl Iterator<Item = AuxMetadata>, AudioStreamError>

Runs a search for the given query, returning a list of up to n_results +possible matches which are AuxMetadata objects containing a valid URL.

+

Returns up to 5 matches by default.

+

Trait Implementations§

Source§

impl<'a> Clone for YoutubeDl<'a>

Source§

fn clone(&self) -> YoutubeDl<'a>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Compose for YoutubeDl<'_>

Source§

fn create( + &mut self, +) -> Result<AudioStream<Box<dyn MediaSource>>, AudioStreamError>

Create a source synchronously. Read more
Source§

fn create_async<'life0, 'async_trait>( + &'life0 mut self, +) -> Pin<Box<dyn Future<Output = Result<AudioStream<Box<dyn MediaSource>>, AudioStreamError>> + Send + 'async_trait>>
where + Self: 'async_trait, + 'life0: 'async_trait,

Create a source asynchronously. Read more
Source§

fn should_create_async(&self) -> bool

Determines whether this source will be instantiated using create or create_async. Read more
Source§

fn aux_metadata<'life0, 'async_trait>( + &'life0 mut self, +) -> Pin<Box<dyn Future<Output = Result<AuxMetadata, AudioStreamError>> + Send + 'async_trait>>
where + Self: 'async_trait, + 'life0: 'async_trait,

Requests auxiliary metadata which can be accessed without parsing the file. Read more
Source§

impl<'a> Debug for YoutubeDl<'a>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl From<YoutubeDl<'static>> for Input

Source§

fn from(val: YoutubeDl<'static>) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

§

impl<'a> Freeze for YoutubeDl<'a>

§

impl<'a> !RefUnwindSafe for YoutubeDl<'a>

§

impl<'a> Send for YoutubeDl<'a>

§

impl<'a> Sync for YoutubeDl<'a>

§

impl<'a> Unpin for YoutubeDl<'a>

§

impl<'a> !UnwindSafe for YoutubeDl<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/input/trait.AsyncMediaSource.html b/next/songbird/input/trait.AsyncMediaSource.html new file mode 100644 index 0000000..1deebbd --- /dev/null +++ b/next/songbird/input/trait.AsyncMediaSource.html @@ -0,0 +1,37 @@ +AsyncMediaSource in songbird::input - Rust

AsyncMediaSource

Trait AsyncMediaSource 

Source
pub trait AsyncMediaSource:
+    AsyncRead
+    + AsyncSeek
+    + Send
+    + Sync
+    + Unpin {
+    // Required methods
+    fn is_seekable(&self) -> bool;
+    fn byte_len<'life0, 'async_trait>(
+        &'life0 self,
+    ) -> Pin<Box<dyn Future<Output = Option<u64>> + Send + 'async_trait>>
+       where Self: 'async_trait,
+             'life0: 'async_trait;
+
+    // Provided method
+    fn try_resume<'life0, 'async_trait>(
+        &'life0 mut self,
+        _offset: u64,
+    ) -> Pin<Box<dyn Future<Output = Result<Box<dyn AsyncMediaSource>, AudioStreamError>> + Send + 'async_trait>>
+       where Self: 'async_trait,
+             'life0: 'async_trait { ... }
+}
Expand description

An async port of symphonia’s MediaSource.

+

Streams which are not seekable should implement AsyncSeek such that all operations +fail with Unsupported, and implement fn is_seekable(&self) -> { false }.

+

Required Methods§

Source

fn is_seekable(&self) -> bool

Returns if the source is seekable. This may be an expensive operation.

+
Source

fn byte_len<'life0, 'async_trait>( + &'life0 self, +) -> Pin<Box<dyn Future<Output = Option<u64>> + Send + 'async_trait>>
where + Self: 'async_trait, + 'life0: 'async_trait,

Returns the length in bytes, if available. This may be an expensive operation.

+

Provided Methods§

Source

fn try_resume<'life0, 'async_trait>( + &'life0 mut self, + _offset: u64, +) -> Pin<Box<dyn Future<Output = Result<Box<dyn AsyncMediaSource>, AudioStreamError>> + Send + 'async_trait>>
where + Self: 'async_trait, + 'life0: 'async_trait,

Tries to recreate this stream in event of an error, resuming from the given offset.

+

Implementors§

\ No newline at end of file diff --git a/next/songbird/input/trait.Compose.html b/next/songbird/input/trait.Compose.html new file mode 100644 index 0000000..6dde907 --- /dev/null +++ b/next/songbird/input/trait.Compose.html @@ -0,0 +1,41 @@ +Compose in songbird::input - Rust

Compose

Trait Compose 

Source
pub trait Compose: Send {
+    // Required methods
+    fn create(
+        &mut self,
+    ) -> Result<AudioStream<Box<dyn MediaSource>>, AudioStreamError>;
+    fn create_async<'life0, 'async_trait>(
+        &'life0 mut self,
+    ) -> Pin<Box<dyn Future<Output = Result<AudioStream<Box<dyn MediaSource>>, AudioStreamError>> + Send + 'async_trait>>
+       where Self: 'async_trait,
+             'life0: 'async_trait;
+    fn should_create_async(&self) -> bool;
+
+    // Provided method
+    fn aux_metadata<'life0, 'async_trait>(
+        &'life0 mut self,
+    ) -> Pin<Box<dyn Future<Output = Result<AuxMetadata, AudioStreamError>> + Send + 'async_trait>>
+       where Self: 'async_trait,
+             'life0: 'async_trait { ... }
+}
Expand description

Data and behaviour required to instantiate a lazy audio source.

+

Required Methods§

Source

fn create( + &mut self, +) -> Result<AudioStream<Box<dyn MediaSource>>, AudioStreamError>

Create a source synchronously.

+

If should_create_async returns false, this method will chosen at runtime.

+
Source

fn create_async<'life0, 'async_trait>( + &'life0 mut self, +) -> Pin<Box<dyn Future<Output = Result<AudioStream<Box<dyn MediaSource>>, AudioStreamError>> + Send + 'async_trait>>
where + Self: 'async_trait, + 'life0: 'async_trait,

Create a source asynchronously.

+

If should_create_async returns true, this method will chosen at runtime.

+
Source

fn should_create_async(&self) -> bool

Determines whether this source will be instantiated using create or create_async.

+

Songbird will create the audio stream using either a dynamically sized thread pool, +or a task on the async runtime it was spawned in respectively. Users do not need to +support both these methods.

+

Provided Methods§

Source

fn aux_metadata<'life0, 'async_trait>( + &'life0 mut self, +) -> Pin<Box<dyn Future<Output = Result<AuxMetadata, AudioStreamError>> + Send + 'async_trait>>
where + Self: 'async_trait, + 'life0: 'async_trait,

Requests auxiliary metadata which can be accessed without parsing the file.

+

This method will never be called by songbird but allows, for instance, access to metadata +which might only be visible to a web crawler e.g., uploader or source URL.

+

Implementors§

\ No newline at end of file diff --git a/next/songbird/input/utils/fn.byte_count_to_timestamp.html b/next/songbird/input/utils/fn.byte_count_to_timestamp.html new file mode 100644 index 0000000..50c4b04 --- /dev/null +++ b/next/songbird/input/utils/fn.byte_count_to_timestamp.html @@ -0,0 +1,3 @@ +byte_count_to_timestamp in songbird::input::utils - Rust

byte_count_to_timestamp

Function byte_count_to_timestamp 

Source
pub fn byte_count_to_timestamp(amt: usize, stereo: bool) -> Duration
Expand description

Calculates the time position in a FloatPCM stream from a byte index.

+

Each sample is sized by mem::size_of::<f32>() == 4usize.

+
\ No newline at end of file diff --git a/next/songbird/input/utils/fn.decoder.html b/next/songbird/input/utils/fn.decoder.html new file mode 100644 index 0000000..2756b69 --- /dev/null +++ b/next/songbird/input/utils/fn.decoder.html @@ -0,0 +1,2 @@ +decoder in songbird::input::utils - Rust

decoder

Function decoder 

Source
pub fn decoder(stereo: bool) -> Result<Decoder>
Expand description

Create an Opus decoder outputting at a sample rate of 48kHz.

+
\ No newline at end of file diff --git a/next/songbird/input/utils/fn.sample_count_to_timestamp.html b/next/songbird/input/utils/fn.sample_count_to_timestamp.html new file mode 100644 index 0000000..5f204a5 --- /dev/null +++ b/next/songbird/input/utils/fn.sample_count_to_timestamp.html @@ -0,0 +1,2 @@ +sample_count_to_timestamp in songbird::input::utils - Rust

sample_count_to_timestamp

Function sample_count_to_timestamp 

Source
pub fn sample_count_to_timestamp(amt: usize, stereo: bool) -> Duration
Expand description

Calculates the time position in a FloatPCM stream from a sample index.

+
\ No newline at end of file diff --git a/next/songbird/input/utils/fn.timestamp_to_byte_count.html b/next/songbird/input/utils/fn.timestamp_to_byte_count.html new file mode 100644 index 0000000..1d5d2d9 --- /dev/null +++ b/next/songbird/input/utils/fn.timestamp_to_byte_count.html @@ -0,0 +1,3 @@ +timestamp_to_byte_count in songbird::input::utils - Rust

timestamp_to_byte_count

Function timestamp_to_byte_count 

Source
pub fn timestamp_to_byte_count(timestamp: Duration, stereo: bool) -> usize
Expand description

Calculates the byte position in a FloatPCM stream from a timestamp.

+

Each sample is sized by mem::size_of::<f32>() == 4usize.

+
\ No newline at end of file diff --git a/next/songbird/input/utils/fn.timestamp_to_sample_count.html b/next/songbird/input/utils/fn.timestamp_to_sample_count.html new file mode 100644 index 0000000..3ea1c67 --- /dev/null +++ b/next/songbird/input/utils/fn.timestamp_to_sample_count.html @@ -0,0 +1,2 @@ +timestamp_to_sample_count in songbird::input::utils - Rust

timestamp_to_sample_count

Function timestamp_to_sample_count 

Source
pub fn timestamp_to_sample_count(timestamp: Duration, stereo: bool) -> usize
Expand description

Calculates the sample position in a FloatPCM stream from a timestamp.

+
\ No newline at end of file diff --git a/next/songbird/input/utils/index.html b/next/songbird/input/utils/index.html new file mode 100644 index 0000000..29ec527 --- /dev/null +++ b/next/songbird/input/utils/index.html @@ -0,0 +1,2 @@ +songbird::input::utils - Rust

Module utils

Module utils 

Source
Expand description

Utility methods for seeking or decoding.

+

Functions§

byte_count_to_timestamp
Calculates the time position in a FloatPCM stream from a byte index.
decoder
Create an Opus decoder outputting at a sample rate of 48kHz.
sample_count_to_timestamp
Calculates the time position in a FloatPCM stream from a sample index.
timestamp_to_byte_count
Calculates the byte position in a FloatPCM stream from a timestamp.
timestamp_to_sample_count
Calculates the sample position in a FloatPCM stream from a timestamp.
\ No newline at end of file diff --git a/next/songbird/input/utils/sidebar-items.js b/next/songbird/input/utils/sidebar-items.js new file mode 100644 index 0000000..ad9beb5 --- /dev/null +++ b/next/songbird/input/utils/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["byte_count_to_timestamp","decoder","sample_count_to_timestamp","timestamp_to_byte_count","timestamp_to_sample_count"]}; \ No newline at end of file diff --git a/next/songbird/join/index.html b/next/songbird/join/index.html new file mode 100644 index 0000000..73d1400 --- /dev/null +++ b/next/songbird/join/index.html @@ -0,0 +1,2 @@ +songbird::join - Rust

Module join

Module join 

Source
Expand description

Future types for gateway interactions.

+

Structs§

Join
Future for a call to Call::join.
JoinGateway
Future for a call to Call::join_gateway.
\ No newline at end of file diff --git a/next/songbird/join/sidebar-items.js b/next/songbird/join/sidebar-items.js new file mode 100644 index 0000000..c04277d --- /dev/null +++ b/next/songbird/join/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["Join","JoinGateway"]}; \ No newline at end of file diff --git a/next/songbird/join/struct.Join.html b/next/songbird/join/struct.Join.html new file mode 100644 index 0000000..41e6aa0 --- /dev/null +++ b/next/songbird/join/struct.Join.html @@ -0,0 +1,149 @@ +Join in songbird::join - Rust

Join

Struct Join 

Source
pub struct Join { /* private fields */ }
Expand description

Future for a call to Call::join.

+

This future awaits Discord’s response and +connection via the Driver. Both phases have +separate timeouts and failure conditions.

+

This future must not be awaited while +holding the lock around a Call.

+

Trait Implementations§

Source§

impl Future for Join

Source§

type Output = Result<(), JoinError>

The type of value produced on completion.
Source§

fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output>

Attempts to resolve the future to a final value, registering +the current task for wakeup if the value is not yet available. Read more
Source§

impl<'pin> Unpin for Join
where + PinnedFieldsOf<__Join<'pin>>: Unpin,

Auto Trait Implementations§

§

impl !Freeze for Join

§

impl !RefUnwindSafe for Join

§

impl Send for Join

§

impl Sync for Join

§

impl !UnwindSafe for Join

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> FutureExt for T
where + T: Future + ?Sized,

§

fn map<U, F>(self, f: F) -> Map<Self, F>
where + F: FnOnce(Self::Output) -> U, + Self: Sized,

Map this future’s output to a different type, returning a new future of +the resulting type. Read more
§

fn map_into<U>(self) -> MapInto<Self, U>
where + Self::Output: Into<U>, + Self: Sized,

Map this future’s output to a different type, returning a new future of +the resulting type. Read more
§

fn then<Fut, F>(self, f: F) -> Then<Self, Fut, F>
where + F: FnOnce(Self::Output) -> Fut, + Fut: Future, + Self: Sized,

Chain on a computation for when a future finished, passing the result of +the future to the provided closure f. Read more
§

fn left_future<B>(self) -> Either<Self, B>
where + B: Future<Output = Self::Output>, + Self: Sized,

Wrap this future in an Either future, making it the left-hand variant +of that Either. Read more
§

fn right_future<A>(self) -> Either<A, Self>
where + A: Future<Output = Self::Output>, + Self: Sized,

Wrap this future in an Either future, making it the right-hand variant +of that Either. Read more
§

fn into_stream(self) -> IntoStream<Self>
where + Self: Sized,

Convert this future into a single element stream. Read more
§

fn flatten(self) -> Flatten<Self>
where + Self::Output: Future, + Self: Sized,

Flatten the execution of this future when the output of this +future is itself another future. Read more
§

fn flatten_stream(self) -> FlattenStream<Self>
where + Self::Output: Stream, + Self: Sized,

Flatten the execution of this future when the successful result of this +future is a stream. Read more
§

fn fuse(self) -> Fuse<Self>
where + Self: Sized,

Fuse a future such that poll will never again be called once it has +completed. This method can be used to turn any Future into a +FusedFuture. Read more
§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where + F: FnOnce(&Self::Output), + Self: Sized,

Do something with the output of a future before passing it on. Read more
§

fn catch_unwind(self) -> CatchUnwind<Self>
where + Self: Sized + UnwindSafe,

Catches unwinding panics while polling the future. Read more
§

fn shared(self) -> Shared<Self>
where + Self: Sized, + Self::Output: Clone,

Create a cloneable handle to this future where all handles will resolve +to the same result. Read more
§

fn remote_handle(self) -> (Remote<Self>, RemoteHandle<Self::Output>)
where + Self: Sized,

Turn this future into a future that yields () on completion and sends +its output to another future on a separate task. Read more
§

fn boxed<'a>(self) -> Pin<Box<dyn Future<Output = Self::Output> + Send + 'a>>
where + Self: Sized + Send + 'a,

Wrap the future in a Box, pinning it. Read more
§

fn boxed_local<'a>(self) -> Pin<Box<dyn Future<Output = Self::Output> + 'a>>
where + Self: Sized + 'a,

Wrap the future in a Box, pinning it. Read more
§

fn unit_error(self) -> UnitError<Self>
where + Self: Sized,

§

fn never_error(self) -> NeverError<Self>
where + Self: Sized,

§

fn poll_unpin(&mut self, cx: &mut Context<'_>) -> Poll<Self::Output>
where + Self: Unpin,

A convenience for calling Future::poll on Unpin future types.
§

fn now_or_never(self) -> Option<Self::Output>
where + Self: Sized,

Evaluates and consumes the future, returning the resulting output if +the future is ready after the first call to Future::poll. Read more
§

impl<T> FutureExt for T
where + T: Future + ?Sized,

§

fn with_cancellation_token( + self, + cancellation_token: &CancellationToken, +) -> WithCancellationTokenFuture<'_, Self>
where + Self: Sized,

Similar to [CancellationToken::run_until_cancelled], +but with the advantage that it is easier to write fluent call chains, +and biased towards waiting for [CancellationToken] to complete. Read more
§

fn with_cancellation_token_owned( + self, + cancellation_token: CancellationToken, +) -> WithCancellationTokenFutureOwned<Self>
where + Self: Sized,

Similar to [CancellationToken::run_until_cancelled_owned], +but with the advantage that it is easier to write fluent call chains, +and biased towards waiting for [CancellationToken] to complete. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

impl<F> IntoFuture for F
where + F: Future,

Source§

type Output = <F as Future>::Output

The output that the future will produce on completion.
Source§

type IntoFuture = F

Which kind of future are we turning this into?
Source§

fn into_future(self) -> <F as IntoFuture>::IntoFuture

Creates a future from a value. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
§

impl<F, T, E> TryFuture for F
where + F: Future<Output = Result<T, E>> + ?Sized,

§

type Ok = T

The type of successful values yielded by this future
§

type Error = E

The type of failures yielded by this future
§

fn try_poll( + self: Pin<&mut F>, + cx: &mut Context<'_>, +) -> Poll<<F as Future>::Output>

Poll this TryFuture as if it were a Future. Read more
§

impl<Fut> TryFutureExt for Fut
where + Fut: TryFuture + ?Sized,

§

fn flatten_sink<Item>(self) -> FlattenSink<Self, Self::Ok>
where + Self::Ok: Sink<Item, Error = Self::Error>, + Self: Sized,

Flattens the execution of this future when the successful result of this +future is a [Sink]. Read more
§

fn map_ok<T, F>(self, f: F) -> MapOk<Self, F>
where + F: FnOnce(Self::Ok) -> T, + Self: Sized,

Maps this future’s success value to a different value. Read more
§

fn map_ok_or_else<T, E, F>(self, e: E, f: F) -> MapOkOrElse<Self, F, E>
where + F: FnOnce(Self::Ok) -> T, + E: FnOnce(Self::Error) -> T, + Self: Sized,

Maps this future’s success value to a different value, and permits for error handling resulting in the same type. Read more
§

fn map_err<E, F>(self, f: F) -> MapErr<Self, F>
where + F: FnOnce(Self::Error) -> E, + Self: Sized,

Maps this future’s error value to a different value. Read more
§

fn err_into<E>(self) -> ErrInto<Self, E>
where + Self: Sized, + Self::Error: Into<E>,

Maps this future’s Error to a new error type +using the Into trait. Read more
§

fn ok_into<U>(self) -> OkInto<Self, U>
where + Self: Sized, + Self::Ok: Into<U>,

Maps this future’s Ok to a new type +using the Into trait.
§

fn and_then<Fut, F>(self, f: F) -> AndThen<Self, Fut, F>
where + F: FnOnce(Self::Ok) -> Fut, + Fut: TryFuture<Error = Self::Error>, + Self: Sized,

Executes another future after this one resolves successfully. The +success value is passed to a closure to create this subsequent future. Read more
§

fn or_else<Fut, F>(self, f: F) -> OrElse<Self, Fut, F>
where + F: FnOnce(Self::Error) -> Fut, + Fut: TryFuture<Ok = Self::Ok>, + Self: Sized,

Executes another future if this one resolves to an error. The +error value is passed to a closure to create this subsequent future. Read more
§

fn inspect_ok<F>(self, f: F) -> InspectOk<Self, F>
where + F: FnOnce(&Self::Ok), + Self: Sized,

Do something with the success value of a future before passing it on. Read more
§

fn inspect_err<F>(self, f: F) -> InspectErr<Self, F>
where + F: FnOnce(&Self::Error), + Self: Sized,

Do something with the error value of a future before passing it on. Read more
§

fn try_flatten(self) -> TryFlatten<Self, Self::Ok>
where + Self::Ok: TryFuture<Error = Self::Error>, + Self: Sized,

Flatten the execution of this future when the successful result of this +future is another future. Read more
§

fn try_flatten_stream(self) -> TryFlattenStream<Self>
where + Self::Ok: TryStream<Error = Self::Error>, + Self: Sized,

Flatten the execution of this future when the successful result of this +future is a stream. Read more
§

fn unwrap_or_else<F>(self, f: F) -> UnwrapOrElse<Self, F>
where + Self: Sized, + F: FnOnce(Self::Error) -> Self::Ok,

Unwraps this future’s output, producing a future with this future’s +Ok type as its +Output type. Read more
§

fn into_future(self) -> IntoFuture<Self>
where + Self: Sized,

Wraps a [TryFuture] into a type that implements +Future. Read more
§

fn try_poll_unpin( + &mut self, + cx: &mut Context<'_>, +) -> Poll<Result<Self::Ok, Self::Error>>
where + Self: Unpin,

A convenience method for calling [TryFuture::try_poll] on Unpin +future types.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/join/struct.JoinGateway.html b/next/songbird/join/struct.JoinGateway.html new file mode 100644 index 0000000..2fc13fc --- /dev/null +++ b/next/songbird/join/struct.JoinGateway.html @@ -0,0 +1,148 @@ +JoinGateway in songbird::join - Rust

JoinGateway

Struct JoinGateway 

Source
pub struct JoinGateway { /* private fields */ }
Expand description

Future for a call to Call::join_gateway.

+

This future awaits Discord’s gateway response, subject +to any timeouts.

+

This future must not be awaited while +holding the lock around a Call.

+

Trait Implementations§

Source§

impl Future for JoinGateway

Source§

type Output = Result<ConnectionInfo, JoinError>

The type of value produced on completion.
Source§

fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output>

Attempts to resolve the future to a final value, registering +the current task for wakeup if the value is not yet available. Read more
Source§

impl<'pin> Unpin for JoinGateway
where + PinnedFieldsOf<__JoinGateway<'pin>>: Unpin,

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> FutureExt for T
where + T: Future + ?Sized,

§

fn map<U, F>(self, f: F) -> Map<Self, F>
where + F: FnOnce(Self::Output) -> U, + Self: Sized,

Map this future’s output to a different type, returning a new future of +the resulting type. Read more
§

fn map_into<U>(self) -> MapInto<Self, U>
where + Self::Output: Into<U>, + Self: Sized,

Map this future’s output to a different type, returning a new future of +the resulting type. Read more
§

fn then<Fut, F>(self, f: F) -> Then<Self, Fut, F>
where + F: FnOnce(Self::Output) -> Fut, + Fut: Future, + Self: Sized,

Chain on a computation for when a future finished, passing the result of +the future to the provided closure f. Read more
§

fn left_future<B>(self) -> Either<Self, B>
where + B: Future<Output = Self::Output>, + Self: Sized,

Wrap this future in an Either future, making it the left-hand variant +of that Either. Read more
§

fn right_future<A>(self) -> Either<A, Self>
where + A: Future<Output = Self::Output>, + Self: Sized,

Wrap this future in an Either future, making it the right-hand variant +of that Either. Read more
§

fn into_stream(self) -> IntoStream<Self>
where + Self: Sized,

Convert this future into a single element stream. Read more
§

fn flatten(self) -> Flatten<Self>
where + Self::Output: Future, + Self: Sized,

Flatten the execution of this future when the output of this +future is itself another future. Read more
§

fn flatten_stream(self) -> FlattenStream<Self>
where + Self::Output: Stream, + Self: Sized,

Flatten the execution of this future when the successful result of this +future is a stream. Read more
§

fn fuse(self) -> Fuse<Self>
where + Self: Sized,

Fuse a future such that poll will never again be called once it has +completed. This method can be used to turn any Future into a +FusedFuture. Read more
§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where + F: FnOnce(&Self::Output), + Self: Sized,

Do something with the output of a future before passing it on. Read more
§

fn catch_unwind(self) -> CatchUnwind<Self>
where + Self: Sized + UnwindSafe,

Catches unwinding panics while polling the future. Read more
§

fn shared(self) -> Shared<Self>
where + Self: Sized, + Self::Output: Clone,

Create a cloneable handle to this future where all handles will resolve +to the same result. Read more
§

fn remote_handle(self) -> (Remote<Self>, RemoteHandle<Self::Output>)
where + Self: Sized,

Turn this future into a future that yields () on completion and sends +its output to another future on a separate task. Read more
§

fn boxed<'a>(self) -> Pin<Box<dyn Future<Output = Self::Output> + Send + 'a>>
where + Self: Sized + Send + 'a,

Wrap the future in a Box, pinning it. Read more
§

fn boxed_local<'a>(self) -> Pin<Box<dyn Future<Output = Self::Output> + 'a>>
where + Self: Sized + 'a,

Wrap the future in a Box, pinning it. Read more
§

fn unit_error(self) -> UnitError<Self>
where + Self: Sized,

§

fn never_error(self) -> NeverError<Self>
where + Self: Sized,

§

fn poll_unpin(&mut self, cx: &mut Context<'_>) -> Poll<Self::Output>
where + Self: Unpin,

A convenience for calling Future::poll on Unpin future types.
§

fn now_or_never(self) -> Option<Self::Output>
where + Self: Sized,

Evaluates and consumes the future, returning the resulting output if +the future is ready after the first call to Future::poll. Read more
§

impl<T> FutureExt for T
where + T: Future + ?Sized,

§

fn with_cancellation_token( + self, + cancellation_token: &CancellationToken, +) -> WithCancellationTokenFuture<'_, Self>
where + Self: Sized,

Similar to [CancellationToken::run_until_cancelled], +but with the advantage that it is easier to write fluent call chains, +and biased towards waiting for [CancellationToken] to complete. Read more
§

fn with_cancellation_token_owned( + self, + cancellation_token: CancellationToken, +) -> WithCancellationTokenFutureOwned<Self>
where + Self: Sized,

Similar to [CancellationToken::run_until_cancelled_owned], +but with the advantage that it is easier to write fluent call chains, +and biased towards waiting for [CancellationToken] to complete. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

impl<F> IntoFuture for F
where + F: Future,

Source§

type Output = <F as Future>::Output

The output that the future will produce on completion.
Source§

type IntoFuture = F

Which kind of future are we turning this into?
Source§

fn into_future(self) -> <F as IntoFuture>::IntoFuture

Creates a future from a value. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
§

impl<F, T, E> TryFuture for F
where + F: Future<Output = Result<T, E>> + ?Sized,

§

type Ok = T

The type of successful values yielded by this future
§

type Error = E

The type of failures yielded by this future
§

fn try_poll( + self: Pin<&mut F>, + cx: &mut Context<'_>, +) -> Poll<<F as Future>::Output>

Poll this TryFuture as if it were a Future. Read more
§

impl<Fut> TryFutureExt for Fut
where + Fut: TryFuture + ?Sized,

§

fn flatten_sink<Item>(self) -> FlattenSink<Self, Self::Ok>
where + Self::Ok: Sink<Item, Error = Self::Error>, + Self: Sized,

Flattens the execution of this future when the successful result of this +future is a [Sink]. Read more
§

fn map_ok<T, F>(self, f: F) -> MapOk<Self, F>
where + F: FnOnce(Self::Ok) -> T, + Self: Sized,

Maps this future’s success value to a different value. Read more
§

fn map_ok_or_else<T, E, F>(self, e: E, f: F) -> MapOkOrElse<Self, F, E>
where + F: FnOnce(Self::Ok) -> T, + E: FnOnce(Self::Error) -> T, + Self: Sized,

Maps this future’s success value to a different value, and permits for error handling resulting in the same type. Read more
§

fn map_err<E, F>(self, f: F) -> MapErr<Self, F>
where + F: FnOnce(Self::Error) -> E, + Self: Sized,

Maps this future’s error value to a different value. Read more
§

fn err_into<E>(self) -> ErrInto<Self, E>
where + Self: Sized, + Self::Error: Into<E>,

Maps this future’s Error to a new error type +using the Into trait. Read more
§

fn ok_into<U>(self) -> OkInto<Self, U>
where + Self: Sized, + Self::Ok: Into<U>,

Maps this future’s Ok to a new type +using the Into trait.
§

fn and_then<Fut, F>(self, f: F) -> AndThen<Self, Fut, F>
where + F: FnOnce(Self::Ok) -> Fut, + Fut: TryFuture<Error = Self::Error>, + Self: Sized,

Executes another future after this one resolves successfully. The +success value is passed to a closure to create this subsequent future. Read more
§

fn or_else<Fut, F>(self, f: F) -> OrElse<Self, Fut, F>
where + F: FnOnce(Self::Error) -> Fut, + Fut: TryFuture<Ok = Self::Ok>, + Self: Sized,

Executes another future if this one resolves to an error. The +error value is passed to a closure to create this subsequent future. Read more
§

fn inspect_ok<F>(self, f: F) -> InspectOk<Self, F>
where + F: FnOnce(&Self::Ok), + Self: Sized,

Do something with the success value of a future before passing it on. Read more
§

fn inspect_err<F>(self, f: F) -> InspectErr<Self, F>
where + F: FnOnce(&Self::Error), + Self: Sized,

Do something with the error value of a future before passing it on. Read more
§

fn try_flatten(self) -> TryFlatten<Self, Self::Ok>
where + Self::Ok: TryFuture<Error = Self::Error>, + Self: Sized,

Flatten the execution of this future when the successful result of this +future is another future. Read more
§

fn try_flatten_stream(self) -> TryFlattenStream<Self>
where + Self::Ok: TryStream<Error = Self::Error>, + Self: Sized,

Flatten the execution of this future when the successful result of this +future is a stream. Read more
§

fn unwrap_or_else<F>(self, f: F) -> UnwrapOrElse<Self, F>
where + Self: Sized, + F: FnOnce(Self::Error) -> Self::Ok,

Unwraps this future’s output, producing a future with this future’s +Ok type as its +Output type. Read more
§

fn into_future(self) -> IntoFuture<Self>
where + Self: Sized,

Wraps a [TryFuture] into a type that implements +Future. Read more
§

fn try_poll_unpin( + &mut self, + cx: &mut Context<'_>, +) -> Poll<Result<Self::Ok, Self::Error>>
where + Self: Unpin,

A convenience method for calling [TryFuture::try_poll] on Unpin +future types.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/manager/struct.Iter.html b/next/songbird/manager/struct.Iter.html new file mode 100644 index 0000000..b12c8a8 --- /dev/null +++ b/next/songbird/manager/struct.Iter.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../songbird/struct.Iter.html...

+ + + \ No newline at end of file diff --git a/next/songbird/manager/struct.Songbird.html b/next/songbird/manager/struct.Songbird.html new file mode 100644 index 0000000..71b8e9f --- /dev/null +++ b/next/songbird/manager/struct.Songbird.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../songbird/struct.Songbird.html...

+ + + \ No newline at end of file diff --git a/next/songbird/serenity/fn.get.html b/next/songbird/serenity/fn.get.html new file mode 100644 index 0000000..409d65a --- /dev/null +++ b/next/songbird/serenity/fn.get.html @@ -0,0 +1,3 @@ +get in songbird::serenity - Rust

get

Function get 

Source
pub async fn get(ctx: &Context) -> Option<Arc<Songbird>>
Expand description

Retrieve the Songbird voice client from a serenity context’s +shared key-value store.

+
\ No newline at end of file diff --git a/next/songbird/serenity/fn.register.html b/next/songbird/serenity/fn.register.html new file mode 100644 index 0000000..8b489d0 --- /dev/null +++ b/next/songbird/serenity/fn.register.html @@ -0,0 +1,3 @@ +register in songbird::serenity - Rust

register

Function register 

Source
pub fn register(client_builder: ClientBuilder) -> ClientBuilder
Expand description

Installs a new songbird instance into the serenity client.

+

This should be called after any uses of ClientBuilder::type_map.

+
\ No newline at end of file diff --git a/next/songbird/serenity/fn.register_from_config.html b/next/songbird/serenity/fn.register_from_config.html new file mode 100644 index 0000000..bbdbf43 --- /dev/null +++ b/next/songbird/serenity/fn.register_from_config.html @@ -0,0 +1,6 @@ +register_from_config in songbird::serenity - Rust

register_from_config

Function register_from_config 

Source
pub fn register_from_config(
+    client_builder: ClientBuilder,
+    config: Config,
+) -> ClientBuilder
Expand description

Installs a given songbird instance into the serenity client.

+

This should be called after any uses of ClientBuilder::type_map.

+
\ No newline at end of file diff --git a/next/songbird/serenity/fn.register_with.html b/next/songbird/serenity/fn.register_with.html new file mode 100644 index 0000000..72ad7b2 --- /dev/null +++ b/next/songbird/serenity/fn.register_with.html @@ -0,0 +1,6 @@ +register_with in songbird::serenity - Rust

register_with

Function register_with 

Source
pub fn register_with(
+    client_builder: ClientBuilder,
+    voice: Arc<Songbird>,
+) -> ClientBuilder
Expand description

Installs a given songbird instance into the serenity client.

+

This should be called after any uses of ClientBuilder::type_map.

+
\ No newline at end of file diff --git a/next/songbird/serenity/index.html b/next/songbird/serenity/index.html new file mode 100644 index 0000000..a93ecf8 --- /dev/null +++ b/next/songbird/serenity/index.html @@ -0,0 +1,6 @@ +songbird::serenity - Rust

Module serenity

Module serenity 

Source
Expand description

Compatibility and convenience methods for working with serenity. +Requires the "serenity" feature.

+

Structs§

SongbirdKey
Zero-size type used to retrieve the registered Songbird instance +from serenity’s inner TypeMap.

Traits§

SerenityInit
Helper trait to add installation/creation methods to serenity’s +ClientBuilder.

Functions§

get
Retrieve the Songbird voice client from a serenity context’s +shared key-value store.
register
Installs a new songbird instance into the serenity client.
register_from_config
Installs a given songbird instance into the serenity client.
register_with
Installs a given songbird instance into the serenity client.
\ No newline at end of file diff --git a/next/songbird/serenity/sidebar-items.js b/next/songbird/serenity/sidebar-items.js new file mode 100644 index 0000000..1fdd617 --- /dev/null +++ b/next/songbird/serenity/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["get","register","register_from_config","register_with"],"struct":["SongbirdKey"],"trait":["SerenityInit"]}; \ No newline at end of file diff --git a/next/songbird/serenity/struct.SongbirdKey.html b/next/songbird/serenity/struct.SongbirdKey.html new file mode 100644 index 0000000..f26c2f6 --- /dev/null +++ b/next/songbird/serenity/struct.SongbirdKey.html @@ -0,0 +1,35 @@ +SongbirdKey in songbird::serenity - Rust

SongbirdKey

Struct SongbirdKey 

Source
pub struct SongbirdKey;
Expand description

Zero-size type used to retrieve the registered Songbird instance +from serenity’s inner TypeMap.

+

Trait Implementations§

Source§

impl TypeMapKey for SongbirdKey

Source§

type Value = Arc<Songbird>

Defines the value type that corresponds to this TypeMapKey.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/serenity/trait.SerenityInit.html b/next/songbird/serenity/trait.SerenityInit.html new file mode 100644 index 0000000..0770775 --- /dev/null +++ b/next/songbird/serenity/trait.SerenityInit.html @@ -0,0 +1,14 @@ +SerenityInit in songbird::serenity - Rust

SerenityInit

Trait SerenityInit 

Source
pub trait SerenityInit {
+    // Required methods
+    fn register_songbird(self) -> Self;
+    fn register_songbird_with(self, voice: Arc<Songbird>) -> Self;
+    fn register_songbird_from_config(self, config: Config) -> Self;
+}
Expand description

Helper trait to add installation/creation methods to serenity’s +ClientBuilder.

+

These install the client to receive gateway voice events, and +store an easily accessible reference to Songbird’s managers.

+

Required Methods§

Source

fn register_songbird(self) -> Self

Registers a new Songbird voice system with serenity, storing it for easy +access via get.

+
Source

fn register_songbird_with(self, voice: Arc<Songbird>) -> Self

Registers a given Songbird voice system with serenity, as above.

+
Source

fn register_songbird_from_config(self, config: Config) -> Self

Registers a Songbird voice system serenity, based on the given configuration.

+

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementations on Foreign Types§

Source§

impl SerenityInit for ClientBuilder

Implementors§

\ No newline at end of file diff --git a/next/songbird/shards/enum.Shard.html b/next/songbird/shards/enum.Shard.html new file mode 100644 index 0000000..399c4c4 --- /dev/null +++ b/next/songbird/shards/enum.Shard.html @@ -0,0 +1,54 @@ +Shard in songbird::shards - Rust

Shard

Enum Shard 

Source
#[non_exhaustive]
pub enum Shard { + Serenity(Arc<SerenityShardHandle>), + Twilight(Arc<TwilightMap>, u32), + Generic(Arc<dyn VoiceUpdate + Send + Sync>), +}
Expand description

A reference to an individual websocket connection.

+

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

Serenity(Arc<SerenityShardHandle>)

Handle to one of serenity’s shard runners.

+
§

Twilight(Arc<TwilightMap>, u32)

Handle to a map of twilight command senders.

+
§

Generic(Arc<dyn VoiceUpdate + Send + Sync>)

Handle to a generic shard instance.

+

Trait Implementations§

Source§

impl Clone for Shard

Source§

fn clone(&self) -> Shard

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Shard

Source§

fn fmt(&self, __f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl VoiceUpdate for Shard

Source§

fn update_voice_state<'life0, 'async_trait>( + &'life0 self, + guild_id: GuildId, + channel_id: Option<ChannelId>, + self_deaf: bool, + self_mute: bool, +) -> Pin<Box<dyn Future<Output = JoinResult<()>> + Send + 'async_trait>>
where + Self: 'async_trait, + 'life0: 'async_trait,

Send a voice update message to the inner shard handle.

Auto Trait Implementations§

§

impl Freeze for Shard

§

impl !RefUnwindSafe for Shard

§

impl Send for Shard

§

impl Sync for Shard

§

impl Unpin for Shard

§

impl !UnwindSafe for Shard

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/shards/enum.Sharder.html b/next/songbird/shards/enum.Sharder.html new file mode 100644 index 0000000..8c2003e --- /dev/null +++ b/next/songbird/shards/enum.Sharder.html @@ -0,0 +1,43 @@ +Sharder in songbird::shards - Rust

Sharder

Enum Sharder 

Source
#[non_exhaustive]
pub enum Sharder { + Serenity(SerenitySharder), + Twilight(Arc<TwilightMap>), + Generic(Arc<dyn GenericSharder + Send + Sync>), +}
Expand description

Source of individual shard connection handles.

+

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

Serenity(SerenitySharder)

Serenity-specific wrapper for sharder state initialised by the library.

+
§

Twilight(Arc<TwilightMap>)

Twilight-specific wrapper for a map of command senders.

+
§

Generic(Arc<dyn GenericSharder + Send + Sync>)

A generic shard handle source.

+

Implementations§

Source§

impl Sharder

Source

pub fn get_shard(&self, shard_id: u64) -> Option<Shard>

Returns a new handle to the required inner shard.

+

Trait Implementations§

Source§

impl Debug for Sharder

Source§

fn fmt(&self, __f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/shards/index.html b/next/songbird/shards/index.html new file mode 100644 index 0000000..e336802 --- /dev/null +++ b/next/songbird/shards/index.html @@ -0,0 +1,3 @@ +songbird::shards - Rust

Module shards

Module shards 

Source
Expand description

Handlers for sending packets over sharded connections.

+

Structs§

SerenityShardHandle
Handle to an individual shard designed to buffer unsent messages while +a reconnect/rebalance is ongoing.
SerenitySharder
Serenity-specific wrapper for sharder state initialised by the library.
TwilightMap
Map containing MessageSenders for Twilight.

Enums§

Shard
A reference to an individual websocket connection.
Sharder
Source of individual shard connection handles.

Traits§

GenericSharder
Trait for a generic shard cluster or other handle source.
VoiceUpdate
Trait for a generic shard handle to send voice state updates to Discord.
\ No newline at end of file diff --git a/next/songbird/shards/sidebar-items.js b/next/songbird/shards/sidebar-items.js new file mode 100644 index 0000000..7ee734b --- /dev/null +++ b/next/songbird/shards/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["Shard","Sharder"],"struct":["SerenityShardHandle","SerenitySharder","TwilightMap"],"trait":["GenericSharder","VoiceUpdate"]}; \ No newline at end of file diff --git a/next/songbird/shards/struct.SerenityShardHandle.html b/next/songbird/shards/struct.SerenityShardHandle.html new file mode 100644 index 0000000..8b7dd49 --- /dev/null +++ b/next/songbird/shards/struct.SerenityShardHandle.html @@ -0,0 +1,36 @@ +SerenityShardHandle in songbird::shards - Rust

SerenityShardHandle

Struct SerenityShardHandle 

Source
pub struct SerenityShardHandle { /* private fields */ }
Expand description

Handle to an individual shard designed to buffer unsent messages while +a reconnect/rebalance is ongoing.

+

Trait Implementations§

Source§

impl Debug for SerenityShardHandle

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for SerenityShardHandle

Source§

fn default() -> SerenityShardHandle

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/shards/struct.SerenitySharder.html b/next/songbird/shards/struct.SerenitySharder.html new file mode 100644 index 0000000..35f82fd --- /dev/null +++ b/next/songbird/shards/struct.SerenitySharder.html @@ -0,0 +1,37 @@ +SerenitySharder in songbird::shards - Rust

SerenitySharder

Struct SerenitySharder 

Source
pub struct SerenitySharder(/* private fields */);
Expand description

Serenity-specific wrapper for sharder state initialised by the library.

+

This is updated and maintained by the library, and is designed to prevent +message loss during rebalances and reconnects.

+

Trait Implementations§

Source§

impl Debug for SerenitySharder

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for SerenitySharder

Source§

fn default() -> SerenitySharder

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/shards/struct.TwilightMap.html b/next/songbird/shards/struct.TwilightMap.html new file mode 100644 index 0000000..58fa43d --- /dev/null +++ b/next/songbird/shards/struct.TwilightMap.html @@ -0,0 +1,39 @@ +TwilightMap in songbird::shards - Rust

TwilightMap

Struct TwilightMap 

Source
pub struct TwilightMap { /* private fields */ }
Expand description

Map containing MessageSenders for Twilight.

+

Implementations§

Source§

impl TwilightMap

Source

pub fn new(map: HashMap<u32, MessageSender>) -> Self

Construct a map of shards and command senders to those shards.

+

For correctness all shards should be in the map.

+
Source

pub fn get(&self, shard_id: u32) -> Option<&MessageSender>

Get the message sender for shard_id.

+
Source

pub fn shard_count(&self) -> u64

Get the total number of shards in the map.

+

Trait Implementations§

Source§

impl Debug for TwilightMap

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/shards/trait.GenericSharder.html b/next/songbird/shards/trait.GenericSharder.html new file mode 100644 index 0000000..d7014b4 --- /dev/null +++ b/next/songbird/shards/trait.GenericSharder.html @@ -0,0 +1,11 @@ +GenericSharder in songbird::shards - Rust

GenericSharder

Trait GenericSharder 

Source
pub trait GenericSharder {
+    // Required method
+    fn get_shard(
+        &self,
+        shard_id: u64,
+    ) -> Option<Arc<dyn VoiceUpdate + Send + Sync>>;
+}
Expand description

Trait for a generic shard cluster or other handle source.

+

This allows any Discord library to be integrated with Songbird, and offers a source +of generic shard handles.

+

Required Methods§

Source

fn get_shard(&self, shard_id: u64) -> Option<Arc<dyn VoiceUpdate + Send + Sync>>

Get access to a new shard

+

Implementors§

\ No newline at end of file diff --git a/next/songbird/shards/trait.VoiceUpdate.html b/next/songbird/shards/trait.VoiceUpdate.html new file mode 100644 index 0000000..a40d7e2 --- /dev/null +++ b/next/songbird/shards/trait.VoiceUpdate.html @@ -0,0 +1,27 @@ +VoiceUpdate in songbird::shards - Rust

VoiceUpdate

Trait VoiceUpdate 

Source
pub trait VoiceUpdate {
+    // Required method
+    fn update_voice_state<'life0, 'async_trait>(
+        &'life0 self,
+        guild_id: GuildId,
+        channel_id: Option<ChannelId>,
+        self_deaf: bool,
+        self_mute: bool,
+    ) -> Pin<Box<dyn Future<Output = JoinResult<()>> + Send + 'async_trait>>
+       where Self: 'async_trait,
+             'life0: 'async_trait;
+}
Expand description

Trait for a generic shard handle to send voice state updates to Discord.

+

This allows any Discord library to be integrated with Songbird, and is intended to +wrap a message channel to a single shard. Songbird only needs to send VoiceStateUpdates +to Discord to function.

+

Generic libraries must be sure to call Call::update_server and Call::update_state +in response to their own received messages.

+

Required Methods§

Source

fn update_voice_state<'life0, 'async_trait>( + &'life0 self, + guild_id: GuildId, + channel_id: Option<ChannelId>, + self_deaf: bool, + self_mute: bool, +) -> Pin<Box<dyn Future<Output = JoinResult<()>> + Send + 'async_trait>>
where + Self: 'async_trait, + 'life0: 'async_trait,

Send a voice update message to the inner shard handle.

+

Implementors§

\ No newline at end of file diff --git a/next/songbird/sidebar-items.js b/next/songbird/sidebar-items.js new file mode 100644 index 0000000..0ca5368 --- /dev/null +++ b/next/songbird/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"mod":["constants","driver","error","events","id","input","join","serenity","shards","tracks"],"struct":["Call","Config","ConnectionInfo","Iter","Songbird"]}; \ No newline at end of file diff --git a/next/songbird/struct.Call.html b/next/songbird/struct.Call.html new file mode 100644 index 0000000..c1922bb --- /dev/null +++ b/next/songbird/struct.Call.html @@ -0,0 +1,191 @@ +Call in songbird - Rust

Call

Struct Call 

Source
pub struct Call { /* private fields */ }
Expand description

The Call handler is responsible for a single voice connection, acting +as a clean API above the inner state and gateway message management.

+

If the "driver" feature is enabled, then a Call exposes all control methods of +Driver via Deref(Mut).

+

Implementations§

Source§

impl Call

Source

pub fn new<G, U>(guild_id: G, ws: Shard, user_id: U) -> Self
where + G: Into<GuildId> + Debug, + U: Into<UserId> + Debug,

Creates a new Call, which will send out WebSocket messages via +the given shard.

+
Source

pub fn from_config<G, U>( + guild_id: G, + ws: Shard, + user_id: U, + config: Config, +) -> Self
where + G: Into<GuildId> + Debug, + U: Into<UserId> + Debug,

Creates a new Call, configuring the driver as specified.

+
Source

pub fn standalone<G, U>(guild_id: G, user_id: U) -> Self
where + G: Into<GuildId> + Debug, + U: Into<UserId> + Debug,

Creates a new, standalone Call which is not connected via +WebSocket to the Gateway.

+

Actions such as muting, deafening, and switching channels will not +function through this Call and must be done through some other +method, as the values will only be internally updated.

+

For most use cases you do not want this.

+
Source

pub fn standalone_from_config<G, U>( + guild_id: G, + user_id: U, + config: Config, +) -> Self
where + G: Into<GuildId> + Debug, + U: Into<UserId> + Debug,

Creates a new standalone Call from the given configuration file.

+
Source

pub async fn deafen(&mut self, deaf: bool) -> JoinResult<()>

Sets whether the current connection is to be deafened.

+

If there is no live voice connection, then this only acts as a settings +update for future connections.

+

Note: Unlike in the official client, you can be deafened while +not being muted.

+

Note: If the Call was created via standalone, then this +will only update whether the connection is internally deafened.

+
Source

pub fn is_deaf(&self) -> bool

Returns whether the current connection is self-deafened in this server.

+

This is purely cosmetic.

+
Source

pub async fn join<C>(&mut self, channel_id: C) -> JoinResult<Join>
where + C: Into<ChannelId> + Debug,

Connect or switch to the given voice channel by its Id.

+

This function acts as a future in two stages:

+
    +
  • The first await sends the request over the gateway.
  • +
  • The second awaits a the driver’s connection attempt. +To prevent deadlock, any mutexes around this Call +must be released before this result is queried.
  • +
+

When using Songbird::join, this pattern is correctly handled for you.

+
Source

pub async fn join_gateway<C>( + &mut self, + channel_id: C, +) -> JoinResult<JoinGateway>
where + C: Into<ChannelId> + Debug,

Join the selected voice channel, without running/starting an RTP +session or running the driver.

+

Use this if you require connection info for lavalink, +some other voice implementation, or don’t want to use the driver for a given call.

+

This function acts as a future in two stages:

+
    +
  • The first await sends the request over the gateway.
  • +
  • The second awaits voice session data from Discord. +To prevent deadlock, any mutexes around this Call +must be released before this result is queried.
  • +
+

When using Songbird::join_gateway, this pattern is correctly handled for you.

+
Source

pub fn current_connection(&self) -> Option<&ConnectionInfo>

Returns the current voice connection details for this Call, +if available.

+
Source

pub fn current_channel(&self) -> Option<ChannelId>

Returns id of the channel, if connected or connecting to any.

+

This remains set after a connection failure, to allow for reconnection +as needed. This will change if moved into another voice channel by an +admin, and will be unset if kicked from a voice channel.

+
Source

pub async fn leave(&mut self) -> JoinResult<()>

Leaves the current voice channel, disconnecting from it.

+

This does not forget settings, like whether to be self-deafened or +self-muted.

+

Note: If the Call was created via standalone, then this +will only update whether the connection is internally connected to a +voice channel.

+
Source

pub async fn mute(&mut self, mute: bool) -> JoinResult<()>

Sets whether the current connection is to be muted.

+

If there is no live voice connection, then this only acts as a settings +update for future connections.

+

Note: If the Call was created via standalone, then this +will only update whether the connection is internally muted.

+
Source

pub fn is_mute(&self) -> bool

Returns whether the current connection is self-muted in this server.

+
Source

pub fn update_server(&mut self, endpoint: String, token: String)

Updates the voice server data.

+

You should only need to use this if you initialized the Call via +standalone.

+
Source

pub fn update_state<C>(&mut self, session_id: String, channel_id: Option<C>)
where + C: Into<ChannelId> + Debug,

Updates the internal voice state of the current user.

+

You should only need to use this if you initialized the Call via +standalone.

+

Methods from Deref<Target = Driver>§

Source

pub fn connect(&mut self, info: ConnectionInfo) -> Connect

Connects to a voice channel using the specified server.

+

This method instantly contacts the driver tasks, and its +does not need to be awaited to start the actual connection.

+
Source

pub fn leave(&mut self)

Leaves the current voice channel, disconnecting from it.

+

This does not forget settings, like whether to be self-deafened or +self-muted.

+
Source

pub fn mute(&mut self, mute: bool)

Sets whether the current connection is to be muted.

+

If there is no live voice connection, then this only acts as a settings +update for future connections.

+
Source

pub fn is_mute(&self) -> bool

Returns whether the driver is muted (i.e., processes audio internally +but submits none).

+
Source

pub fn play_input(&mut self, input: Input) -> TrackHandle

Plays audio from an input, returning a handle for further control.

+
Source

pub fn play_only_input(&mut self, input: Input) -> TrackHandle

Plays audio from an input, returning a handle for further control.

+

Unlike Self::play_input, this stops all other inputs attached +to the channel.

+
Source

pub fn play(&mut self, track: Track) -> TrackHandle

Plays audio from a Track object.

+

The main difference between this function and Self::play_input is +that this allows for direct manipulation of the Track object +before it is passed over to the voice and mixing contexts.

+
Source

pub fn play_only(&mut self, track: Track) -> TrackHandle

Exclusively plays audio from a Track object.

+

As in Self::play_only_input, this stops all other sources attached to the +channel. Like Self::play, however, this allows for direct manipulation of the +Track object before it is passed over to the voice and mixing contexts.

+
Source

pub fn set_bitrate(&mut self, bitrate: Bitrate)

Sets the bitrate for encoding Opus packets sent along +the channel being managed.

+

The default rate is 128 kbps. +Sensible values range between Bits(512) and Bits(512_000) +bits per second. +Alternatively, Auto and Max remain available.

+
Source

pub fn stop(&mut self)

Stops playing audio from all sources, if any are set.

+
Source

pub fn set_config(&mut self, config: Config)

Sets the configuration for this driver (and parent Call, if applicable).

+
Source

pub fn config(&self) -> &Config

Returns a view of this driver’s configuration.

+
Source

pub fn add_global_event<F: EventHandler + 'static>( + &mut self, + event: Event, + action: F, +)

Attach a global event handler to an audio context. Global events may receive +any EventContext.

+

Global timing events will tick regardless of whether audio is playing, +so long as the bot is connected to a voice channel, and have no tracks. +TrackEvents will respond to all relevant tracks, giving some audio elements.

+

Users must ensure that no costly work or blocking occurs +within the supplied function or closure. Taking excess time could prevent +timely sending of packets, causing audio glitches and delays.

+
Source

pub fn remove_all_global_events(&mut self)

Removes all global event handlers from an audio context.

+
Source

pub fn queue(&self) -> &TrackQueue

Returns a reference to this driver’s built-in queue.

+

Requires the "builtin-queue" feature. +Queue additions should be made via Driver::enqueue and +Driver::enqueue_input.

+
Source

pub async fn enqueue_input(&mut self, input: Input) -> TrackHandle

Adds an audio Input to this driver’s built-in queue.

+

Requires the "builtin-queue" feature.

+
Source

pub async fn enqueue(&mut self, track: Track) -> TrackHandle

Adds an existing Track to this driver’s built-in queue.

+

Requires the "builtin-queue" feature.

+
Source

pub fn enqueue_with_preload( + &mut self, + track: Track, + preload_time: Option<Duration>, +) -> TrackHandle

Add an existing Track to the queue, using a known time to preload the next track.

+

See TrackQueue::add_with_preload for how preload_time is used.

+

Requires the "builtin-queue" feature.

+

Trait Implementations§

Source§

impl Clone for Call

Source§

fn clone(&self) -> Call

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Call

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Deref for Call

Source§

type Target = Driver

The resulting type after dereferencing.
Source§

fn deref(&self) -> &Self::Target

Dereferences the value.
Source§

impl DerefMut for Call

Source§

fn deref_mut(&mut self) -> &mut Self::Target

Mutably dereferences the value.

Auto Trait Implementations§

§

impl Freeze for Call

§

impl !RefUnwindSafe for Call

§

impl Send for Call

§

impl Sync for Call

§

impl Unpin for Call

§

impl !UnwindSafe for Call

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<P, T> Receiver for P
where + P: Deref<Target = T> + ?Sized, + T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/struct.Config.html b/next/songbird/struct.Config.html new file mode 100644 index 0000000..14eef05 --- /dev/null +++ b/next/songbird/struct.Config.html @@ -0,0 +1,141 @@ +Config in songbird - Rust

Config

Struct Config 

Source
#[non_exhaustive]
pub struct Config {
Show 15 fields + pub crypto_mode: CryptoMode, + pub decode_mode: DecodeMode, + pub decode_state_timeout: Duration, + pub playout_buffer_length: NonZeroUsize, + pub playout_spike_length: usize, + pub gateway_timeout: Option<Duration>, + pub mix_mode: MixMode, + pub preallocated_tracks: usize, + pub driver_retry: Retry, + pub use_softclip: bool, + pub driver_timeout: Option<Duration>, + pub codec_registry: &'static CodecRegistry, + pub format_registry: &'static Probe, + pub disposer: Option<DisposalThread>, + pub scheduler: Option<Scheduler>, +
}
Expand description

Configuration for drivers and calls.

+

Fields (Non-exhaustive)§

This struct is marked as non-exhaustive
Non-exhaustive structs could have additional fields added in future. Therefore, non-exhaustive structs cannot be constructed in external crates using the traditional Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.
§crypto_mode: CryptoMode

Selected tagging mode for voice packet encryption.

+

Defaults to CryptoMode::Aes256Gcm.

+

Changes to this field will not immediately apply if the +driver is actively connected, but will apply to subsequent +sessions.

+
§decode_mode: DecodeMode

Configures whether decoding and decryption occur for all received packets.

+

If receiving and using voice packets, generally you should choose DecodeMode::Decode. +DecodeMode::Decrypt is intended for users running their own selective decoding or +who need to inspect Opus packets. User speaking state can still be seen using DecodeMode::Pass. +If you’re certain you will never need any RT(C)P events, then consider building without +the "receive" feature for extra performance.

+

Defaults to DecodeMode::Decrypt. This is due to per-packet decoding costs, +which most users will not want to pay, but allowing speaking events which are commonly used.

+
§decode_state_timeout: Duration

Configures the amount of time after a user/SSRC is inactive before their decoder state +should be removed.

+

Defaults to 1 minute.

+
§playout_buffer_length: NonZeroUsize

Configures the number of audio packets to buffer for each user before playout.

+

A playout buffer allows Songbird to smooth out jitter in audio packet arrivals, +as well as to correct for reordering of packets by the network.

+

This does not affect the arrival of raw packet events.

+

Defaults to 5 packets (100ms).

+
§playout_spike_length: usize

Configures the initial amount of extra space allocated to handle packet bursts.

+

Each SSRC’s receive buffer will start at capacity playout_buffer_length + playout_spike_length, up to a maximum 64 packets.

+

Defaults to 3 packets (thus capacity defaults to 8).

+
§gateway_timeout: Option<Duration>

Configures the amount of time to wait for Discord to reply with connection information +if Call::join/join_gateway are used.

+

This is a useful fallback in the event that:

+
    +
  • the underlying Discord client restarts and loses a join request, or
  • +
  • a channel join fails because the bot is already believed to be there.
  • +
+

Defaults to 10 seconds. If set to None, connections will never time out.

+
§mix_mode: MixMode

Configures whether the driver will mix and output stereo or mono Opus data +over a voice channel.

+

Defaults to Stereo.

+
§preallocated_tracks: usize

Number of concurrently active tracks to allocate memory for.

+

This should be set at, or just above, the maximum number of tracks +you expect your bot will play at the same time. Exceeding the size of +the internal queue will trigger a larger memory allocation and copy, +possibly causing the mixer thread to miss a packet deadline.

+

Defaults to 1.

+

Changes to this field in a running driver will only ever increase +the capacity of the track store.

+
§driver_retry: Retry

Connection retry logic for the Driver.

+

This controls how many times the Driver should retry any connections, +as well as how long to wait between attempts.

+
§use_softclip: bool

Configures whether or not each mixed audio packet is soft-clipped into the +[-1, 1] audio range.

+

Defaults to true, preventing clipping and dangerously loud audio from being sent.

+

This operation adds ~3% cost to a standard (non-passthrough) mix cycle. +If you know that your bot will only play one sound at a time and that +your volume is between 0.0 and 1.0, then you can disable soft-clipping +for a performance boost. If you are playing several sounds at once, do not +disable this unless you make sure to reduce the volume of each sound.

+
§driver_timeout: Option<Duration>

Configures the maximum amount of time to wait for an attempted voice +connection to Discord.

+

Defaults to 10 seconds. If set to None, connections will never time out.

+
§codec_registry: &'static CodecRegistry

Registry of the inner codecs supported by the driver, adding audiopus-based +Opus codec support to all of Symphonia’s default codecs.

+

Defaults to get_codec_registry.

+
§format_registry: &'static Probe

Registry of the muxers and container formats supported by the driver.

+

Defaults to get_probe, which includes all of Symphonia’s default format handlers +and DCA format support.

+
§disposer: Option<DisposalThread>

The Sender for a channel that will run the destructor of possibly blocking values.

+

If not set, a thread will be spawned to perform this, but it is recommended to create +a long running thread instead of relying on a per-driver thread.

+

Note: When using Songbird this is overwritten automatically by its disposal thread.

+
§scheduler: Option<Scheduler>

The scheduler is responsible for mapping idle and active Driver instances +to threads.

+

If set to None, then songbird will use get_default_scheduler.

+

Implementations§

Source§

impl Config

Source

pub fn crypto_mode(self, crypto_mode: CryptoMode) -> Self

Sets this Config’s chosen cryptographic tagging scheme.

+
Source

pub fn decode_mode(self, decode_mode: DecodeMode) -> Self

Sets this Config’s received packet decryption/decoding behaviour.

+
Source

pub fn decode_state_timeout(self, decode_state_timeout: Duration) -> Self

Sets this Config’s received packet decoder cleanup timer.

+
Source

pub fn playout_buffer_length(self, playout_buffer_length: NonZeroUsize) -> Self

Sets this Config’s playout buffer length, in packets.

+
Source

pub fn playout_spike_length(self, playout_spike_length: usize) -> Self

Sets this Config’s additional pre-allocated space to handle bursty audio packets.

+
Source

pub fn mix_mode(self, mix_mode: MixMode) -> Self

Sets this Config’s audio mixing channel count.

+
Source

pub fn preallocated_tracks(self, preallocated_tracks: usize) -> Self

Sets this Config’s number of tracks to preallocate.

+
Source

pub fn use_softclip(self, use_softclip: bool) -> Self

Sets this Config’s number to enable/disable soft-clipping sent audio.

+
Source

pub fn driver_timeout(self, driver_timeout: Option<Duration>) -> Self

Sets this Config’s timeout for establishing a voice connection.

+
Source

pub fn driver_retry(self, driver_retry: Retry) -> Self

Sets this Config’s voice connection retry configuration.

+
Source

pub fn codec_registry(self, codec_registry: &'static CodecRegistry) -> Self

Sets this Config’s symphonia codec registry.

+
Source

pub fn format_registry(self, format_registry: &'static Probe) -> Self

Sets this Config’s symphonia format registry/probe set.

+
Source

pub fn disposer(self, disposer: DisposalThread) -> Self

Sets this Config’s channel for sending disposal messages.

+
Source

pub fn scheduler(self, scheduler: Scheduler) -> Self

Sets this Config’s mixer scheduler.

+
Source

pub fn get_scheduler(&self) -> Scheduler

Returns a lightweight reference to the audio scheduler this Config will use.

+
Source§

impl Config

Source

pub fn gateway_timeout(self, gateway_timeout: Option<Duration>) -> Self

Sets this Config’s timeout for joining a voice channel.

+

Trait Implementations§

Source§

impl Clone for Config

Source§

fn clone(&self) -> Config

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Config

Source§

fn fmt(&self, __f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for Config

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

§

impl Freeze for Config

§

impl RefUnwindSafe for Config

§

impl Send for Config

§

impl Sync for Config

§

impl Unpin for Config

§

impl UnwindSafe for Config

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/struct.ConnectionInfo.html b/next/songbird/struct.ConnectionInfo.html new file mode 100644 index 0000000..aefdc1e --- /dev/null +++ b/next/songbird/struct.ConnectionInfo.html @@ -0,0 +1,65 @@ +ConnectionInfo in songbird - Rust

ConnectionInfo

Struct ConnectionInfo 

Source
pub struct ConnectionInfo {
+    pub channel_id: Option<ChannelId>,
+    pub endpoint: String,
+    pub guild_id: GuildId,
+    pub session_id: String,
+    pub token: String,
+    pub user_id: UserId,
+}
Expand description

Parameters and information needed to start communicating with Discord’s voice servers, either +with the Songbird driver, lavalink, or other system.

+

Fields§

§channel_id: Option<ChannelId>

ID of the voice channel being joined, if it is known.

+

This is not needed to establish a connection, but can be useful +for book-keeping.

+
§endpoint: String

URL of the voice websocket gateway server assigned to this call.

+
§guild_id: GuildId

ID of the target voice channel’s parent guild.

+

Bots cannot connect to a guildless (i.e., direct message) voice call.

+
§session_id: String

Unique string describing this session for validation/authentication purposes.

+
§token: String

Ephemeral secret used to validate the above session.

+
§user_id: UserId

UserID of this bot.

+

Trait Implementations§

Source§

impl Clone for ConnectionInfo

Source§

fn clone(&self) -> ConnectionInfo

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ConnectionInfo

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for ConnectionInfo

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for ConnectionInfo

Source§

fn eq(&self, other: &ConnectionInfo) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for ConnectionInfo

Source§

impl StructuralPartialEq for ConnectionInfo

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/struct.Iter.html b/next/songbird/struct.Iter.html new file mode 100644 index 0000000..d112915 --- /dev/null +++ b/next/songbird/struct.Iter.html @@ -0,0 +1,242 @@ +Iter in songbird - Rust

Iter

Struct Iter 

Source
pub struct Iter<'a> { /* private fields */ }
Expand description

An iterator over all Calls currently stored in the manager instance.

+

Trait Implementations§

Source§

impl Iterator for Iter<'_>

Source§

type Item = (GuildId, Arc<Mutex<Call>>)

The type of the elements being iterated over.
Source§

fn next(&mut self) -> Option<Self::Item>

Advances the iterator and returns the next value. Read more
Source§

fn size_hint(&self) -> (usize, Option<usize>)

Returns the bounds on the remaining length of the iterator. Read more
Source§

fn count(self) -> usize

Consumes the iterator, counting the number of iterations and returning it. Read more
Source§

fn fold<B, F>(self, init: B, f: F) -> B
where + Self: Sized, + F: FnMut(B, Self::Item) -> B,

Folds every element into an accumulator by applying an operation, +returning the final result. Read more
Source§

fn next_chunk<const N: usize>( + &mut self, +) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_next_chunk)
Advances the iterator and returns an array containing the next N values. Read more
1.0.0 · Source§

fn last(self) -> Option<Self::Item>
where + Self: Sized,

Consumes the iterator, returning the last element. Read more
Source§

fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator by n elements. Read more
1.0.0 · Source§

fn nth(&mut self, n: usize) -> Option<Self::Item>

Returns the nth element of the iterator. Read more
1.28.0 · Source§

fn step_by(self, step: usize) -> StepBy<Self>
where + Self: Sized,

Creates an iterator starting at the same point, but stepping by +the given amount at each iteration. Read more
1.0.0 · Source§

fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator<Item = Self::Item>,

Takes two iterators and creates a new iterator over both in sequence. Read more
1.0.0 · Source§

fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator,

‘Zips up’ two iterators into a single iterator of pairs. Read more
Source§

fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
where + Self: Sized, + Self::Item: Clone,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places a copy of separator between adjacent +items of the original iterator. Read more
Source§

fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
where + Self: Sized, + G: FnMut() -> Self::Item,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places an item generated by separator +between adjacent items of the original iterator. Read more
1.0.0 · Source§

fn map<B, F>(self, f: F) -> Map<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> B,

Takes a closure and creates an iterator which calls that closure on each +element. Read more
1.21.0 · Source§

fn for_each<F>(self, f: F)
where + Self: Sized, + F: FnMut(Self::Item),

Calls a closure on each element of an iterator. Read more
1.0.0 · Source§

fn filter<P>(self, predicate: P) -> Filter<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator which uses a closure to determine if an element +should be yielded. Read more
1.0.0 · Source§

fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both filters and maps. Read more
1.0.0 · Source§

fn enumerate(self) -> Enumerate<Self>
where + Self: Sized,

Creates an iterator which gives the current iteration count as well as +the next value. Read more
1.0.0 · Source§

fn peekable(self) -> Peekable<Self>
where + Self: Sized,

Creates an iterator which can use the peek and peek_mut methods +to look at the next element of the iterator without consuming it. See +their documentation for more information. Read more
1.0.0 · Source§

fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that skips elements based on a predicate. Read more
1.0.0 · Source§

fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that yields elements based on a predicate. Read more
1.57.0 · Source§

fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
where + Self: Sized, + P: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both yields elements based on a predicate and maps. Read more
1.0.0 · Source§

fn skip(self, n: usize) -> Skip<Self>
where + Self: Sized,

Creates an iterator that skips the first n elements. Read more
1.0.0 · Source§

fn take(self, n: usize) -> Take<Self>
where + Self: Sized,

Creates an iterator that yields the first n elements, or fewer +if the underlying iterator ends sooner. Read more
1.0.0 · Source§

fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>
where + Self: Sized, + F: FnMut(&mut St, Self::Item) -> Option<B>,

An iterator adapter which, like fold, holds internal state, but +unlike fold, produces a new iterator. Read more
1.0.0 · Source§

fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
where + Self: Sized, + U: IntoIterator, + F: FnMut(Self::Item) -> U,

Creates an iterator that works like map, but flattens nested structure. Read more
1.29.0 · Source§

fn flatten(self) -> Flatten<Self>
where + Self: Sized, + Self::Item: IntoIterator,

Creates an iterator that flattens nested structure. Read more
Source§

fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
where + Self: Sized, + F: FnMut(&[Self::Item; N]) -> R,

🔬This is a nightly-only experimental API. (iter_map_windows)
Calls the given function f for each contiguous window of size N over +self and returns an iterator over the outputs of f. Like slice::windows(), +the windows during mapping overlap as well. Read more
1.0.0 · Source§

fn fuse(self) -> Fuse<Self>
where + Self: Sized,

Creates an iterator which ends after the first None. Read more
1.0.0 · Source§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where + Self: Sized, + F: FnMut(&Self::Item),

Does something with each element of an iterator, passing the value on. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where + Self: Sized,

Creates a “by reference” adapter for this instance of Iterator. Read more
1.0.0 · Source§

fn collect<B>(self) -> B
where + B: FromIterator<Self::Item>, + Self: Sized,

Transforms an iterator into a collection. Read more
Source§

fn try_collect<B>( + &mut self, +) -> <<Self::Item as Try>::Residual as Residual<B>>::TryType
where + Self: Sized, + Self::Item: Try, + <Self::Item as Try>::Residual: Residual<B>, + B: FromIterator<<Self::Item as Try>::Output>,

🔬This is a nightly-only experimental API. (iterator_try_collect)
Fallibly transforms an iterator into a collection, short circuiting if +a failure is encountered. Read more
Source§

fn collect_into<E>(self, collection: &mut E) -> &mut E
where + E: Extend<Self::Item>, + Self: Sized,

🔬This is a nightly-only experimental API. (iter_collect_into)
Collects all the items from an iterator into a collection. Read more
1.0.0 · Source§

fn partition<B, F>(self, f: F) -> (B, B)
where + Self: Sized, + B: Default + Extend<Self::Item>, + F: FnMut(&Self::Item) -> bool,

Consumes an iterator, creating two collections from it. Read more
Source§

fn is_partitioned<P>(self, predicate: P) -> bool
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_is_partitioned)
Checks if the elements of this iterator are partitioned according to the given predicate, +such that all those that return true precede all those that return false. Read more
1.27.0 · Source§

fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try<Output = B>,

An iterator method that applies a function as long as it returns +successfully, producing a single, final value. Read more
1.27.0 · Source§

fn try_for_each<F, R>(&mut self, f: F) -> R
where + Self: Sized, + F: FnMut(Self::Item) -> R, + R: Try<Output = ()>,

An iterator method that applies a fallible function to each item in the +iterator, stopping at the first error and returning that error. Read more
1.51.0 · Source§

fn reduce<F>(self, f: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(Self::Item, Self::Item) -> Self::Item,

Reduces the elements to a single one, by repeatedly applying a reducing +operation. Read more
Source§

fn try_reduce<R>( + &mut self, + f: impl FnMut(Self::Item, Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
where + Self: Sized, + R: Try<Output = Self::Item>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (iterator_try_reduce)
Reduces the elements to a single one by repeatedly applying a reducing operation. If the +closure returns a failure, the failure is propagated back to the caller immediately. Read more
1.0.0 · Source§

fn all<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if every element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn any<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if any element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator that satisfies a predicate. Read more
1.30.0 · Source§

fn find_map<B, F>(&mut self, f: F) -> Option<B>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Applies function to the elements of iterator and returns +the first non-none result. Read more
Source§

fn try_find<R>( + &mut self, + f: impl FnMut(&Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
where + Self: Sized, + R: Try<Output = bool>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (try_find)
Applies function to the elements of iterator and returns +the first true result or the first error. Read more
1.0.0 · Source§

fn position<P>(&mut self, predicate: P) -> Option<usize>
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

Searches for an element in an iterator, returning its index. Read more
1.0.0 · Source§

fn max(self) -> Option<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Returns the maximum element of an iterator. Read more
1.0.0 · Source§

fn min(self) -> Option<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Returns the minimum element of an iterator. Read more
1.6.0 · Source§

fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the maximum value from the +specified function. Read more
1.15.0 · Source§

fn max_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the maximum value with respect to the +specified comparison function. Read more
1.6.0 · Source§

fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the minimum value from the +specified function. Read more
1.15.0 · Source§

fn min_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the minimum value with respect to the +specified comparison function. Read more
1.0.0 · Source§

fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
where + FromA: Default + Extend<A>, + FromB: Default + Extend<B>, + Self: Sized + Iterator<Item = (A, B)>,

Converts an iterator of pairs into a pair of containers. Read more
1.36.0 · Source§

fn copied<'a, T>(self) -> Copied<Self>
where + T: Copy + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which copies all of its elements. Read more
1.0.0 · Source§

fn cloned<'a, T>(self) -> Cloned<Self>
where + T: Clone + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which clones all of its elements. Read more
Source§

fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_array_chunks)
Returns an iterator over N elements of the iterator at a time. Read more
1.11.0 · Source§

fn sum<S>(self) -> S
where + Self: Sized, + S: Sum<Self::Item>,

Sums the elements of an iterator. Read more
1.11.0 · Source§

fn product<P>(self) -> P
where + Self: Sized, + P: Product<Self::Item>,

Iterates over the entire iterator, multiplying all the elements Read more
1.5.0 · Source§

fn cmp<I>(self, other: I) -> Ordering
where + I: IntoIterator<Item = Self::Item>, + Self::Item: Ord, + Self: Sized,

Lexicographically compares the elements of this Iterator with those +of another. Read more
Source§

fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn partial_cmp<I>(self, other: I) -> Option<Ordering>
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Lexicographically compares the PartialOrd elements of +this Iterator with those of another. The comparison works like short-circuit +evaluation, returning a result without comparing the remaining elements. +As soon as an order can be determined, the evaluation stops and a result is returned. Read more
Source§

fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn eq<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are equal to those of +another. Read more
Source§

fn eq_by<I, F>(self, other: I, eq: F) -> bool
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_order_by)
Determines if the elements of this Iterator are equal to those of +another with respect to the specified equality function. Read more
1.5.0 · Source§

fn ne<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are not equal to those of +another. Read more
1.5.0 · Source§

fn lt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less than those of another. Read more
1.5.0 · Source§

fn le<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less or equal to those of another. Read more
1.5.0 · Source§

fn gt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than those of another. Read more
1.5.0 · Source§

fn ge<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than or equal to those of another. Read more
1.82.0 · Source§

fn is_sorted(self) -> bool
where + Self: Sized, + Self::Item: PartialOrd,

Checks if the elements of this iterator are sorted. Read more
1.82.0 · Source§

fn is_sorted_by<F>(self, compare: F) -> bool
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> bool,

Checks if the elements of this iterator are sorted using the given comparator function. Read more
1.82.0 · Source§

fn is_sorted_by_key<F, K>(self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> K, + K: PartialOrd,

Checks if the elements of this iterator are sorted using the given key extraction +function. Read more

Auto Trait Implementations§

§

impl<'a> Freeze for Iter<'a>

§

impl<'a> !RefUnwindSafe for Iter<'a>

§

impl<'a> Send for Iter<'a>

§

impl<'a> Sync for Iter<'a>

§

impl<'a> Unpin for Iter<'a>

§

impl<'a> !UnwindSafe for Iter<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

impl<I> IntoIterator for I
where + I: Iterator,

Source§

type Item = <I as Iterator>::Item

The type of the elements being iterated over.
Source§

type IntoIter = I

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> I

Creates an iterator from a value. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

Source§

impl<I> IteratorRandom for I
where + I: Iterator,

Source§

fn choose<R>(self, rng: &mut R) -> Option<Self::Item>
where + R: Rng + ?Sized,

Uniformly sample one element Read more
Source§

fn choose_stable<R>(self, rng: &mut R) -> Option<Self::Item>
where + R: Rng + ?Sized,

Uniformly sample one element (stable) Read more
Source§

fn choose_multiple_fill<R>(self, rng: &mut R, buf: &mut [Self::Item]) -> usize
where + R: Rng + ?Sized,

Uniformly sample amount distinct elements into a buffer Read more
Source§

fn choose_multiple<R>(self, rng: &mut R, amount: usize) -> Vec<Self::Item>
where + R: Rng + ?Sized,

Uniformly sample amount distinct elements into a Vec Read more
Source§

impl<I> IteratorRandom for I
where + I: Iterator,

Source§

fn choose<R>(self, rng: &mut R) -> Option<Self::Item>
where + R: Rng + ?Sized,

Choose one element at random from the iterator. Read more
Source§

fn choose_stable<R>(self, rng: &mut R) -> Option<Self::Item>
where + R: Rng + ?Sized,

Choose one element at random from the iterator. Read more
Source§

fn choose_multiple_fill<R>(self, rng: &mut R, buf: &mut [Self::Item]) -> usize
where + R: Rng + ?Sized,

Collects values at random from the iterator into a supplied buffer +until that buffer is filled. Read more
Source§

fn choose_multiple<R>(self, rng: &mut R, amount: usize) -> Vec<Self::Item>
where + R: Rng + ?Sized,

Collects amount values at random from the iterator into a vector. Read more
§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/struct.Songbird.html b/next/songbird/struct.Songbird.html new file mode 100644 index 0000000..a546245 --- /dev/null +++ b/next/songbird/struct.Songbird.html @@ -0,0 +1,158 @@ +Songbird in songbird - Rust

Songbird

Struct Songbird 

Source
pub struct Songbird { /* private fields */ }
Expand description

A shard-aware struct responsible for managing Calls.

+

This manager transparently maps guild state and a source of shard information +into individual calls, and forwards state updates which affect call state.

+

Implementations§

Source§

impl Songbird

Source

pub fn serenity() -> Arc<Self>

Create a new Songbird instance for serenity.

+

This must be registered after creation.

+
Source

pub fn serenity_from_config(config: Config) -> Arc<Self>

Create a new Songbird instance for serenity, using the given configuration.

+

This must be registered after creation.

+
Source

pub fn twilight<U>(cluster: Arc<TwilightMap>, user_id: U) -> Self
where + U: Into<UserId>,

Create a new Songbird instance for twilight.

+

Twilight handlers do not need to be registered, but +users are responsible for passing in any events using +process.

+
Source

pub fn twilight_from_config<U>( + sender_map: Arc<TwilightMap>, + user_id: U, + config: Config, +) -> Self
where + U: Into<UserId>,

Create a new Songbird instance for twilight.

+

Twilight handlers do not need to be registered, but +users are responsible for passing in any events using +process.

+
Source

pub fn initialise_client_data<U: Into<UserId>>( + &self, + shard_count: u64, + user_id: U, +)

Set the bot’s user, and the number of shards in use.

+

If this struct is already initialised (e.g., from ::twilight), +or a previous call, then this function is a no-op.

+
Source

pub fn get<G: Into<GuildId>>(&self, guild_id: G) -> Option<Arc<Mutex<Call>>>

Retrieves a Call for the given guild, if one already exists.

+
Source

pub fn get_or_insert<G>(&self, guild_id: G) -> Arc<Mutex<Call>>
where + G: Into<GuildId>,

Retrieves a Call for the given guild, creating a new one if +none is found.

+

This will not join any calls, or cause connection state to change.

+
Source

pub fn iter(&self) -> Iter<'_>

Creates an iterator for all Calls currently managed.

+
Source

pub fn set_config(&self, new_config: Config)

Sets a shared configuration for all drivers created from this +manager.

+

Changes made here will apply to new Call and Driver instances only.

+

Requires the "driver" feature.

+
Source

pub async fn join<C, G>( + &self, + guild_id: G, + channel_id: C, +) -> JoinResult<Arc<Mutex<Call>>>
where + C: Into<ChannelId>, + G: Into<GuildId>,

Connects to a target by retrieving its relevant Call and +connecting, or creating the handler if required.

+

This can also switch to the given channel, if a handler already exists +for the target and the current connected channel is not equal to the +given channel.

+

The provided channel ID is used as a connection target. The +channel must be in the provided guild. This is not checked by the +library, and will result in an error. If there is already a connected +handler for the guild, and the provided channel is different from the +channel that the connection is already connected to, then the handler +will switch the connection to the provided channel.

+

If you only need to retrieve the handler for a target, then use +get.

+

Twilight users should read the caveats mentioned in process.

+

NOTE: an Err(..) value will still create a Call accessible via get.

+
Source

pub async fn join_gateway<C, G>( + &self, + guild_id: G, + channel_id: C, +) -> JoinResult<(ConnectionInfo, Arc<Mutex<Call>>)>
where + C: Into<ChannelId>, + G: Into<GuildId>,

Partially connects to a target by retrieving its relevant Call and +connecting, or creating the handler if required.

+

This method returns the handle and the connection info needed for other libraries +or drivers, such as lavalink, and does not actually start or run a voice call.

+

NOTE: an Err(..) value will still create a Call accessible via get.

+
Source

pub async fn leave<G: Into<GuildId>>(&self, guild_id: G) -> JoinResult<()>

Retrieves the handler for the given target and leaves the +associated voice channel, if connected.

+

This will not drop the handler, and will preserve it and its settings. +If you do not need to reuse event handlers, configuration, or active tracks +in the underlying driver consider calling remove to release tasks, +threads, and memory.

+

This is a wrapper around getting a handler and calling +leave on it.

+
Source

pub async fn remove<G: Into<GuildId>>(&self, guild_id: G) -> JoinResult<()>

Retrieves the Call for the given target and leaves the associated +voice channel, if connected.

+

The handler is then dropped, removing settings for the target.

+

An Err(…) value implies that the gateway could not be contacted, +and that leaving should be attempted again later (i.e., after reconnect).

+
Source§

impl Songbird

Source

pub async fn process(&self, event: &TwilightEvent)

Handle events received on the cluster.

+

When using twilight, you are required to call this with all inbound +(voice) events, i.e., at least VoiceStateUpdates and VoiceServerUpdates.

+

Users must ensure that calls to this function happen on a separate task +to any calls to join, join_gateway. The simplest way to ensure this is +to tokio::spawn any command invocation.

+

Returned futures generally require the inner Call to be updated via this function, +and will deadlock if event processing is not carried out on another spawned task.

+

Trait Implementations§

Source§

impl Debug for Songbird

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'a> IntoIterator for &'a Songbird

Source§

type Item = <Iter<'a> as Iterator>::Item

The type of the elements being iterated over.
Source§

type IntoIter = Iter<'a>

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> Self::IntoIter

Creates an iterator from a value. Read more
Source§

impl VoiceGatewayManager for Songbird

Source§

fn initialise<'life0, 'async_trait>( + &'life0 self, + shard_count: u32, + user_id: SerenityUser, +) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>
where + Self: 'async_trait, + 'life0: 'async_trait,

Performs initial setup at the start of a connection to Discord. Read more
Source§

fn register_shard<'life0, 'async_trait>( + &'life0 self, + shard_id: u32, + sender: Sender<ShardRunnerMessage>, +) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>
where + Self: 'async_trait, + 'life0: 'async_trait,

Handler fired in response to a Ready event. Read more
Source§

fn deregister_shard<'life0, 'async_trait>( + &'life0 self, + shard_id: u32, +) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>
where + Self: 'async_trait, + 'life0: 'async_trait,

Handler fired in response to a disconnect, reconnection, or rebalance. Read more
Source§

fn server_update<'life0, 'life1, 'life2, 'async_trait>( + &'life0 self, + guild_id: SerenityGuild, + endpoint: &'life1 Option<String>, + token: &'life2 str, +) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>
where + Self: 'async_trait, + 'life0: 'async_trait, + 'life1: 'async_trait, + 'life2: 'async_trait,

Handler for VOICE_SERVER_UPDATE messages. Read more
Source§

fn state_update<'life0, 'life1, 'async_trait>( + &'life0 self, + guild_id: SerenityGuild, + voice_state: &'life1 VoiceState, +) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>
where + Self: 'async_trait, + 'life0: 'async_trait, + 'life1: 'async_trait,

Handler for VOICE_STATE_UPDATE messages. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/tracks/action/struct.Action.html b/next/songbird/tracks/action/struct.Action.html new file mode 100644 index 0000000..61011a7 --- /dev/null +++ b/next/songbird/tracks/action/struct.Action.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/tracks/struct.Action.html...

+ + + \ No newline at end of file diff --git a/next/songbird/tracks/enum.ControlError.html b/next/songbird/tracks/enum.ControlError.html new file mode 100644 index 0000000..21c7b71 --- /dev/null +++ b/next/songbird/tracks/enum.ControlError.html @@ -0,0 +1,56 @@ +ControlError in songbird::tracks - Rust

ControlError

Enum ControlError 

Source
#[non_exhaustive]
pub enum ControlError { + Finished, + InvalidTrackEvent, + Play(PlayError), + Dropped, +}
Expand description

Errors associated with control and manipulation of tracks.

+

Unless otherwise stated, these don’t invalidate an existing track, +but do advise on valid operations and commands.

+

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

Finished

The operation failed because the track has ended, has been removed +due to call closure, or some error within the driver.

+
§

InvalidTrackEvent

The supplied event listener can never be fired by a track, and should +be attached to the driver instead.

+
§

Play(PlayError)

A command to seek or ready the target track failed when parsing or creating the stream.

+

This is a fatal error, and the track will be removed.

+
§

Dropped

Another seek/make_playable request was made, and so this callback handler was dropped.

+

Trait Implementations§

Source§

impl Clone for ControlError

Source§

fn clone(&self) -> ControlError

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ControlError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for ControlError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult

Formats the value using the given formatter. Read more
Source§

impl Error for ControlError

1.30.0 · Source§

fn source(&self) -> Option<&(dyn Error + 'static)>

Returns the lower-level source of this error, if any. Read more
1.0.0 · Source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · Source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
Source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type-based access to context intended for error reports. Read more
Source§

impl From<RecvError> for ControlError

Source§

fn from(_: RecvError) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
§

impl<T> ToStringFallible for T
where + T: Display,

§

fn try_to_string(&self) -> Result<String, TryReserveError>

ToString::to_string, but without panic on OOM.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/tracks/enum.LoopState.html b/next/songbird/tracks/enum.LoopState.html new file mode 100644 index 0000000..434b35b --- /dev/null +++ b/next/songbird/tracks/enum.LoopState.html @@ -0,0 +1,53 @@ +LoopState in songbird::tracks - Rust

LoopState

Enum LoopState 

Source
pub enum LoopState {
+    Infinite,
+    Finite(usize),
+}
Expand description

Looping behaviour for a Track.

+

Variants§

§

Infinite

Track will loop endlessly until loop state is changed or +manually stopped.

+
§

Finite(usize)

Track will loop n more times.

+

Finite(0) is the Default, stopping the track once its Input ends.

+

Trait Implementations§

Source§

impl Clone for LoopState

Source§

fn clone(&self) -> LoopState

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for LoopState

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for LoopState

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl PartialEq for LoopState

Source§

fn eq(&self, other: &LoopState) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for LoopState

Source§

impl Eq for LoopState

Source§

impl StructuralPartialEq for LoopState

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/tracks/enum.PlayError.html b/next/songbird/tracks/enum.PlayError.html new file mode 100644 index 0000000..7b72a18 --- /dev/null +++ b/next/songbird/tracks/enum.PlayError.html @@ -0,0 +1,51 @@ +PlayError in songbird::tracks - Rust

PlayError

Enum PlayError 

Source
#[non_exhaustive]
pub enum PlayError { + Create(Arc<AudioStreamError>), + Parse(Arc<Error>), + Decode(Arc<Error>), + Seek(Arc<Error>), +}
Expand description

Errors reported by the mixer while attempting to play (or ready) a Track.

+

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

Create(Arc<AudioStreamError>)

Failed to create a live bytestream from the lazy Compose.

+
§

Parse(Arc<Error>)

Failed to read headers, codecs, or a valid stream from an Input.

+
§

Decode(Arc<Error>)

Failed to decode a frame received from an Input.

+
§

Seek(Arc<Error>)

Failed to seek to the requested location.

+

Trait Implementations§

Source§

impl Clone for PlayError

Source§

fn clone(&self) -> PlayError

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for PlayError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for PlayError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult

Formats the value using the given formatter. Read more
Source§

impl Error for PlayError

1.30.0 · Source§

fn source(&self) -> Option<&(dyn Error + 'static)>

Returns the lower-level source of this error, if any. Read more
1.0.0 · Source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · Source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
Source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type-based access to context intended for error reports. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
§

impl<T> ToStringFallible for T
where + T: Display,

§

fn try_to_string(&self) -> Result<String, TryReserveError>

ToString::to_string, but without panic on OOM.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/tracks/enum.PlayMode.html b/next/songbird/tracks/enum.PlayMode.html new file mode 100644 index 0000000..3805cd2 --- /dev/null +++ b/next/songbird/tracks/enum.PlayMode.html @@ -0,0 +1,58 @@ +PlayMode in songbird::tracks - Rust

PlayMode

Enum PlayMode 

Source
#[non_exhaustive]
pub enum PlayMode { + Play, + Pause, + Stop, + End, + Errored(PlayError), +}
Expand description

Playback status of a track.

+

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

Play

The track is currently playing.

+
§

Pause

The track is currently paused, and may be resumed.

+
§

Stop

The track has been manually stopped, and cannot be restarted.

+
§

End

The track has naturally ended, and cannot be restarted.

+
§

Errored(PlayError)

The track has encountered a runtime or initialisation error, and cannot be restarted.

+

Implementations§

Source§

impl PlayMode

Source

pub fn is_done(&self) -> bool

Returns whether the track has irreversibly stopped.

+

Trait Implementations§

Source§

impl Clone for PlayMode

Source§

fn clone(&self) -> PlayMode

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for PlayMode

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for PlayMode

Source§

fn default() -> PlayMode

Returns the “default value” for a type. Read more
Source§

impl PartialEq for PlayMode

Source§

fn eq(&self, other: &Self) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for PlayMode

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/tracks/enum.ReadyState.html b/next/songbird/tracks/enum.ReadyState.html new file mode 100644 index 0000000..e536530 --- /dev/null +++ b/next/songbird/tracks/enum.ReadyState.html @@ -0,0 +1,54 @@ +ReadyState in songbird::tracks - Rust

ReadyState

Enum ReadyState 

Source
pub enum ReadyState {
+    Uninitialised,
+    Preparing,
+    Playable,
+}
Expand description

Whether this track has been made live, is being processed, or is +currently uninitialised.

+

Variants§

§

Uninitialised

This track is still a lazy Compose object, and hasn’t been made playable.

+
§

Preparing

The mixer is currently creating and parsing this track’s bytestream.

+
§

Playable

This track is fully initialised and usable.

+

Trait Implementations§

Source§

impl Clone for ReadyState

Source§

fn clone(&self) -> ReadyState

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ReadyState

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ReadyState

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl PartialEq for ReadyState

Source§

fn eq(&self, other: &ReadyState) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for ReadyState

Source§

impl Eq for ReadyState

Source§

impl StructuralPartialEq for ReadyState

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/tracks/error/enum.ControlError.html b/next/songbird/tracks/error/enum.ControlError.html new file mode 100644 index 0000000..675f062 --- /dev/null +++ b/next/songbird/tracks/error/enum.ControlError.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/tracks/enum.ControlError.html...

+ + + \ No newline at end of file diff --git a/next/songbird/tracks/error/enum.PlayError.html b/next/songbird/tracks/error/enum.PlayError.html new file mode 100644 index 0000000..4304b87 --- /dev/null +++ b/next/songbird/tracks/error/enum.PlayError.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/tracks/enum.PlayError.html...

+ + + \ No newline at end of file diff --git a/next/songbird/tracks/error/type.TrackResult.html b/next/songbird/tracks/error/type.TrackResult.html new file mode 100644 index 0000000..2ad4b17 --- /dev/null +++ b/next/songbird/tracks/error/type.TrackResult.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/tracks/type.TrackResult.html...

+ + + \ No newline at end of file diff --git a/next/songbird/tracks/handle/struct.TrackCallback.html b/next/songbird/tracks/handle/struct.TrackCallback.html new file mode 100644 index 0000000..61a72cf --- /dev/null +++ b/next/songbird/tracks/handle/struct.TrackCallback.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/tracks/struct.TrackCallback.html...

+ + + \ No newline at end of file diff --git a/next/songbird/tracks/handle/struct.TrackHandle.html b/next/songbird/tracks/handle/struct.TrackHandle.html new file mode 100644 index 0000000..5f150a0 --- /dev/null +++ b/next/songbird/tracks/handle/struct.TrackHandle.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/tracks/struct.TrackHandle.html...

+ + + \ No newline at end of file diff --git a/next/songbird/tracks/index.html b/next/songbird/tracks/index.html new file mode 100644 index 0000000..3436085 --- /dev/null +++ b/next/songbird/tracks/index.html @@ -0,0 +1,18 @@ +songbird::tracks - Rust

Module tracks

Module tracks 

Source
Expand description

Live, controllable audio instances.

+

Tracks add control and event data around the bytestreams offered by Input, +where each represents a live audio source inside of the driver’s mixer. This includes +play state, volume, and looping behaviour.

+

To configure an audio source as it is created, you can create a Track to set the +above playback state from any Input or T: Into<Input> +using Track::from(...).

+

To configure an audio source once it has been given to a Driver, you are given a +TrackHandle once you hand the Input and state over to be played. These handles +remotely send commands from your bot’s (a)sync context to control playback, register events, +and execute synchronous closures. This design prevents user code from being able to lock +or stall the audio mixer.

+

Structs§

Action
Actions for the mixer to take after inspecting track state via +TrackHandle::action.
Queued
Reference to a track which is known to be part of a queue.
Track
Initial state for audio playback.
TrackCallback
Asynchronous reply for an operation applied to a TrackHandle.
TrackHandle
Handle for safe control of a Track from other threads, outside +of the audio mixing and voice handling context.
TrackQueue
A simple queue for several audio sources, designed to +play in sequence.
TrackState
State of an Track object, designed to be passed to event handlers +and retrieved remotely via TrackHandle::get_info.
View
Live track and input state exposed during TrackHandle::action.

Enums§

ControlError
Errors associated with control and manipulation of tracks.
LoopState
Looping behaviour for a Track.
PlayError
Errors reported by the mixer while attempting to play (or ready) a Track.
PlayMode
Playback status of a track.
ReadyState
Whether this track has been made live, is being processed, or is +currently uninitialised.

Type Aliases§

TrackResult
Alias for most calls to a TrackHandle.
\ No newline at end of file diff --git a/next/songbird/tracks/looping/enum.LoopState.html b/next/songbird/tracks/looping/enum.LoopState.html new file mode 100644 index 0000000..e536389 --- /dev/null +++ b/next/songbird/tracks/looping/enum.LoopState.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/tracks/enum.LoopState.html...

+ + + \ No newline at end of file diff --git a/next/songbird/tracks/mode/enum.PlayMode.html b/next/songbird/tracks/mode/enum.PlayMode.html new file mode 100644 index 0000000..a033c61 --- /dev/null +++ b/next/songbird/tracks/mode/enum.PlayMode.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/tracks/enum.PlayMode.html...

+ + + \ No newline at end of file diff --git a/next/songbird/tracks/queue/struct.Queued.html b/next/songbird/tracks/queue/struct.Queued.html new file mode 100644 index 0000000..850fb10 --- /dev/null +++ b/next/songbird/tracks/queue/struct.Queued.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/tracks/struct.Queued.html...

+ + + \ No newline at end of file diff --git a/next/songbird/tracks/queue/struct.TrackQueue.html b/next/songbird/tracks/queue/struct.TrackQueue.html new file mode 100644 index 0000000..4c26c0d --- /dev/null +++ b/next/songbird/tracks/queue/struct.TrackQueue.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/tracks/struct.TrackQueue.html...

+ + + \ No newline at end of file diff --git a/next/songbird/tracks/ready/enum.ReadyState.html b/next/songbird/tracks/ready/enum.ReadyState.html new file mode 100644 index 0000000..179e6c0 --- /dev/null +++ b/next/songbird/tracks/ready/enum.ReadyState.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/tracks/enum.ReadyState.html...

+ + + \ No newline at end of file diff --git a/next/songbird/tracks/sidebar-items.js b/next/songbird/tracks/sidebar-items.js new file mode 100644 index 0000000..8b78928 --- /dev/null +++ b/next/songbird/tracks/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["ControlError","LoopState","PlayError","PlayMode","ReadyState"],"struct":["Action","Queued","Track","TrackCallback","TrackHandle","TrackQueue","TrackState","View"],"type":["TrackResult"]}; \ No newline at end of file diff --git a/next/songbird/tracks/state/struct.TrackState.html b/next/songbird/tracks/state/struct.TrackState.html new file mode 100644 index 0000000..62ceff9 --- /dev/null +++ b/next/songbird/tracks/state/struct.TrackState.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/tracks/struct.TrackState.html...

+ + + \ No newline at end of file diff --git a/next/songbird/tracks/struct.Action.html b/next/songbird/tracks/struct.Action.html new file mode 100644 index 0000000..ee70a43 --- /dev/null +++ b/next/songbird/tracks/struct.Action.html @@ -0,0 +1,40 @@ +Action in songbird::tracks - Rust

Action

Struct Action 

Source
pub struct Action { /* private fields */ }
Expand description

Actions for the mixer to take after inspecting track state via +TrackHandle::action.

+

Implementations§

Source§

impl Action

Source

pub fn seek(self, time: Duration) -> Self

Requests a seek to the given time for this track.

+
Source

pub fn make_playable(self) -> Self

Readies the track to be playable, if this is not already the case.

+

Trait Implementations§

Source§

impl Clone for Action

Source§

fn clone(&self) -> Action

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Default for Action

Source§

fn default() -> Action

Returns the “default value” for a type. Read more

Auto Trait Implementations§

§

impl Freeze for Action

§

impl RefUnwindSafe for Action

§

impl Send for Action

§

impl Sync for Action

§

impl Unpin for Action

§

impl UnwindSafe for Action

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/tracks/struct.Queued.html b/next/songbird/tracks/struct.Queued.html new file mode 100644 index 0000000..f2368fe --- /dev/null +++ b/next/songbird/tracks/struct.Queued.html @@ -0,0 +1,87 @@ +Queued in songbird::tracks - Rust

Queued

Struct Queued 

Source
pub struct Queued(/* private fields */);
Expand description

Reference to a track which is known to be part of a queue.

+

Instances should not be moved from one queue to another.

+

Implementations§

Source§

impl Queued

Source

pub fn handle(&self) -> TrackHandle

Clones the inner handle

+

Methods from Deref<Target = TrackHandle>§

Source

pub fn play(&self) -> TrackResult<()>

Unpauses an audio track.

+
Source

pub fn pause(&self) -> TrackResult<()>

Pauses an audio track.

+
Source

pub fn stop(&self) -> TrackResult<()>

Stops an audio track.

+

This is final, and will cause the audio context to fire +a TrackEvent::End event.

+
Source

pub fn set_volume(&self, volume: f32) -> TrackResult<()>

Sets the volume of an audio track.

+
Source

pub fn make_playable(&self) -> TrackCallback<()>

Ready a track for playing if it is lazily initialised.

+

If a track is already playable, the callback will instantly succeed.

+
Source

pub async fn make_playable_async(&self) -> TrackResult<()>

Ready a track for playing if it is lazily initialised.

+

This folds Self::make_playable into a single async result, but must +be awaited for the command to be sent.

+
Source

pub fn seek(&self, position: Duration) -> TrackCallback<Duration>

Seeks along the track to the specified position.

+

If the underlying Input does not support seeking, +forward seeks will succeed. Backward seeks will recreate the +track using the lazy Compose if present. The returned callback +will indicate whether the seek succeeded.

+
Source

pub async fn seek_async(&self, position: Duration) -> TrackResult<Duration>

Seeks along the track to the specified position.

+

This folds Self::seek into a single async result, but must +be awaited for the command to be sent.

+
Source

pub fn add_event<F: EventHandler + 'static>( + &self, + event: Event, + action: F, +) -> TrackResult<()>

Attach an event handler to an audio track. These will receive EventContext::Track.

+

Events which can only be fired by the global context return ControlError::InvalidTrackEvent

+
Source

pub fn action<F>(&self, action: F) -> TrackResult<()>
where + F: FnOnce(View<'_>) -> Option<Action> + Send + Sync + 'static,

Perform an arbitrary synchronous action on a raw Track object.

+

This will give access to a View of the current track state and Metadata, +which can be used to take an Action.

+

Users must ensure that no costly work or blocking occurs +within the supplied function or closure. Taking excess time could prevent +timely sending of packets, causing audio glitches and delays.

+
Source

pub async fn get_info(&self) -> TrackResult<TrackState>

Request playback information and state from the audio context.

+
Source

pub fn enable_loop(&self) -> TrackResult<()>

Set an audio track to loop indefinitely.

+

This requires either a Compose to be present or for the +input stream to be seekable.

+
Source

pub fn disable_loop(&self) -> TrackResult<()>

Set an audio track to no longer loop.

+

This follows the same rules as enable_loop.

+
Source

pub fn loop_for(&self, count: usize) -> TrackResult<()>

Set an audio track to loop a set number of times.

+

This follows the same rules as enable_loop.

+
Source

pub fn uuid(&self) -> Uuid

Returns this handle’s (and track’s) unique identifier.

+
Source

pub fn data<Data>(&self) -> Arc<Data>
where + Data: Send + Sync + 'static,

Allows access to this track’s attached Data.

+

Data allows additional, user-defined data shared by all handles +to be attached to any track.

+
§Panics
+

This method will panic if the Data has not been initialised, or the type +provided does not equal the type passed to Track::new_with_data.

+

Trait Implementations§

Source§

impl Debug for Queued

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Deref for Queued

Source§

type Target = TrackHandle

The resulting type after dereferencing.
Source§

fn deref(&self) -> &Self::Target

Dereferences the value.

Auto Trait Implementations§

§

impl Freeze for Queued

§

impl !RefUnwindSafe for Queued

§

impl Send for Queued

§

impl Sync for Queued

§

impl Unpin for Queued

§

impl !UnwindSafe for Queued

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<P, T> Receiver for P
where + P: Deref<Target = T> + ?Sized, + T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/tracks/struct.Track.html b/next/songbird/tracks/struct.Track.html new file mode 100644 index 0000000..69e5658 --- /dev/null +++ b/next/songbird/tracks/struct.Track.html @@ -0,0 +1,92 @@ +Track in songbird::tracks - Rust

Track

Struct Track 

Source
pub struct Track {
+    pub playing: PlayMode,
+    pub volume: f32,
+    pub input: Input,
+    pub events: EventStore,
+    pub loops: LoopState,
+    pub uuid: Uuid,
+    pub user_data: Arc<dyn Any + Send + Sync>,
+}
Expand description

Initial state for audio playback.

+

Tracks allow you to configure play modes, volume, event handlers, and other track state +before you pass an input to the Driver.

+

Live track data is accessed via a TrackHandle, which is returned by Driver::play and +related methods.

+

§Example

+
use songbird::{driver::Driver, input::File, tracks::Track};
+
+// A Call is also valid here!
+let mut driver: Driver = Default::default();
+let source = File::new("../audio/my-favourite-song.mp3");
+
+let handle = driver.play_only(Track::from(source).volume(0.5));
+
+// Future access occurs via audio.
+

Fields§

§playing: PlayMode

Whether or not this sound is currently playing.

+

Defaults to PlayMode::Play.

+
§volume: f32

The volume for playback.

+

Sensible values fall between 0.0 and 1.0. Values outside this range can +cause clipping or other audio artefacts.

+

Defaults to 1.0.

+
§input: Input

The live or lazily-initialised audio stream to be played.

+
§events: EventStore

List of events attached to this audio track.

+

This may be used to add additional events to a track +before it is sent to the audio context for playing.

+

Defaults to an empty set.

+
§loops: LoopState

Count of remaining loops.

+

Defaults to play a track once (i.e., LoopState::Finite(0)).

+
§uuid: Uuid

Unique identifier for this track.

+

Defaults to a random 128-bit number.

+
§user_data: Arc<dyn Any + Send + Sync>

Any data to be associated with the track.

+

Implementations§

Source§

impl Track

Source

pub fn new(input: Input) -> Self

Create a new track directly from an Input and a random Uuid.

+
Source

pub fn new_with_uuid(input: Input, uuid: Uuid) -> Self

Create a new track directly from an Input with a custom Uuid.

+
Source

pub fn new_with_data( + input: Input, + user_data: Arc<dyn Any + Send + Sync + 'static>, +) -> Self

Create a new track directly from an Input, user data to be associated with the track, and a random Uuid.

+
Source

pub fn new_with_uuid_and_data( + input: Input, + uuid: Uuid, + user_data: Arc<dyn Any + Send + Sync + 'static>, +) -> Self

Create a new track directly from an Input, user data to be associated with the track, and a custom Uuid.

+
Source

pub fn play(self) -> Self

Sets a track to playing if it is paused.

+
Source

pub fn pause(self) -> Self

Pre-emptively pauses a track, preventing it from being automatically played.

+
Source

pub fn stop(self) -> Self

Manually stops a track.

+

This will cause the audio track to be removed by the driver almost immediately, +with any relevant events triggered.

+
Source

pub fn volume(self, volume: f32) -> Self

Sets volume in a manner that allows method chaining.

+
Source

pub fn loops(self, loops: LoopState) -> Self

Set an audio track to loop a set number of times.

+
Source

pub fn uuid(self, uuid: Uuid) -> Self

Returns this track’s unique identifier.

+

Trait Implementations§

Source§

impl<T: Into<Input>> From<T> for Track

Any Input (or struct which can be used as one) can also be made into a Track.

+
Source§

fn from(val: T) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

§

impl Freeze for Track

§

impl !RefUnwindSafe for Track

§

impl Send for Track

§

impl !Sync for Track

§

impl Unpin for Track

§

impl !UnwindSafe for Track

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/tracks/struct.TrackCallback.html b/next/songbird/tracks/struct.TrackCallback.html new file mode 100644 index 0000000..f515ad0 --- /dev/null +++ b/next/songbird/tracks/struct.TrackCallback.html @@ -0,0 +1,43 @@ +TrackCallback in songbird::tracks - Rust

TrackCallback

Struct TrackCallback 

Source
pub struct TrackCallback<T> { /* private fields */ }
Expand description

Asynchronous reply for an operation applied to a TrackHandle.

+

This object does not need to be .awaited for the driver to perform an action. +Async threads can then call, e.g., TrackHandle::make_playable, and safely drop +this callback if the result isn’t needed.

+

Implementations§

Source§

impl<T> TrackCallback<T>

Source

pub fn result(self) -> TrackResult<T>

Consumes this handle to await a reply from the driver, blocking the current thread.

+
Source

pub async fn result_async(self) -> TrackResult<T>

Consumes this handle to await a reply from the driver asynchronously.

+
Source

pub fn is_hung_up(&self) -> bool

Returns true if the operation instantly failed due to the target track being +removed.

+

Auto Trait Implementations§

§

impl<T> Freeze for TrackCallback<T>

§

impl<T> RefUnwindSafe for TrackCallback<T>

§

impl<T> Send for TrackCallback<T>
where + T: Send,

§

impl<T> Sync for TrackCallback<T>
where + T: Send,

§

impl<T> Unpin for TrackCallback<T>

§

impl<T> UnwindSafe for TrackCallback<T>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/tracks/struct.TrackHandle.html b/next/songbird/tracks/struct.TrackHandle.html new file mode 100644 index 0000000..bb60b98 --- /dev/null +++ b/next/songbird/tracks/struct.TrackHandle.html @@ -0,0 +1,92 @@ +TrackHandle in songbird::tracks - Rust

TrackHandle

Struct TrackHandle 

Source
pub struct TrackHandle { /* private fields */ }
Expand description

Handle for safe control of a Track from other threads, outside +of the audio mixing and voice handling context.

+

These are cheap to clone, using Arc<...> internally.

+

Many method calls here are fallible; in most cases, this will be because +the underlying Track object has been discarded. Those which aren’t refer +to shared data not used by the driver.

+

Implementations§

Source§

impl TrackHandle

Source

pub fn play(&self) -> TrackResult<()>

Unpauses an audio track.

+
Source

pub fn pause(&self) -> TrackResult<()>

Pauses an audio track.

+
Source

pub fn stop(&self) -> TrackResult<()>

Stops an audio track.

+

This is final, and will cause the audio context to fire +a TrackEvent::End event.

+
Source

pub fn set_volume(&self, volume: f32) -> TrackResult<()>

Sets the volume of an audio track.

+
Source

pub fn make_playable(&self) -> TrackCallback<()>

Ready a track for playing if it is lazily initialised.

+

If a track is already playable, the callback will instantly succeed.

+
Source

pub async fn make_playable_async(&self) -> TrackResult<()>

Ready a track for playing if it is lazily initialised.

+

This folds Self::make_playable into a single async result, but must +be awaited for the command to be sent.

+
Source

pub fn seek(&self, position: Duration) -> TrackCallback<Duration>

Seeks along the track to the specified position.

+

If the underlying Input does not support seeking, +forward seeks will succeed. Backward seeks will recreate the +track using the lazy Compose if present. The returned callback +will indicate whether the seek succeeded.

+
Source

pub async fn seek_async(&self, position: Duration) -> TrackResult<Duration>

Seeks along the track to the specified position.

+

This folds Self::seek into a single async result, but must +be awaited for the command to be sent.

+
Source

pub fn add_event<F: EventHandler + 'static>( + &self, + event: Event, + action: F, +) -> TrackResult<()>

Attach an event handler to an audio track. These will receive EventContext::Track.

+

Events which can only be fired by the global context return ControlError::InvalidTrackEvent

+
Source

pub fn action<F>(&self, action: F) -> TrackResult<()>
where + F: FnOnce(View<'_>) -> Option<Action> + Send + Sync + 'static,

Perform an arbitrary synchronous action on a raw Track object.

+

This will give access to a View of the current track state and Metadata, +which can be used to take an Action.

+

Users must ensure that no costly work or blocking occurs +within the supplied function or closure. Taking excess time could prevent +timely sending of packets, causing audio glitches and delays.

+
Source

pub async fn get_info(&self) -> TrackResult<TrackState>

Request playback information and state from the audio context.

+
Source

pub fn enable_loop(&self) -> TrackResult<()>

Set an audio track to loop indefinitely.

+

This requires either a Compose to be present or for the +input stream to be seekable.

+
Source

pub fn disable_loop(&self) -> TrackResult<()>

Set an audio track to no longer loop.

+

This follows the same rules as enable_loop.

+
Source

pub fn loop_for(&self, count: usize) -> TrackResult<()>

Set an audio track to loop a set number of times.

+

This follows the same rules as enable_loop.

+
Source

pub fn uuid(&self) -> Uuid

Returns this handle’s (and track’s) unique identifier.

+
Source

pub fn data<Data>(&self) -> Arc<Data>
where + Data: Send + Sync + 'static,

Allows access to this track’s attached Data.

+

Data allows additional, user-defined data shared by all handles +to be attached to any track.

+
§Panics
+

This method will panic if the Data has not been initialised, or the type +provided does not equal the type passed to Track::new_with_data.

+

Trait Implementations§

Source§

impl Clone for TrackHandle

Source§

fn clone(&self) -> TrackHandle

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for TrackHandle

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/tracks/struct.TrackQueue.html b/next/songbird/tracks/struct.TrackQueue.html new file mode 100644 index 0000000..b1a8169 --- /dev/null +++ b/next/songbird/tracks/struct.TrackQueue.html @@ -0,0 +1,107 @@ +TrackQueue in songbird::tracks - Rust

TrackQueue

Struct TrackQueue 

Source
pub struct TrackQueue { /* private fields */ }
Expand description

A simple queue for several audio sources, designed to +play in sequence.

+

This makes use of TrackEvents to determine when the current +song or audio file has finished before playing the next entry.

+

One of these is automatically included via Driver::queue when +the "builtin-queue" feature is enabled.

+

examples/serenity/voice_events_queue demonstrates how a user might manage, +track and use this to run a song queue in many guilds in parallel. +This code is trivial to extend if extra functionality is needed.

+

§Example

+
use songbird::{
+    driver::Driver,
+    id::GuildId,
+    input::File,
+    tracks::TrackQueue,
+};
+use std::collections::HashMap;
+use std::num::NonZeroU64;
+
+let guild = GuildId(NonZeroU64::new(1).unwrap());
+// A Call is also valid here!
+let mut driver: Driver = Default::default();
+
+let mut queues: HashMap<GuildId, TrackQueue> = Default::default();
+
+let source = File::new("../audio/my-favourite-song.mp3");
+
+// We need to ensure that this guild has a TrackQueue created for it.
+let queue = queues.entry(guild)
+    .or_default();
+
+// Queueing a track is this easy!
+queue.add_source(source.into(), &mut driver);
+

Implementations§

Source§

impl TrackQueue

Source

pub fn new() -> Self

Create a new, empty, track queue.

+
Source

pub async fn add_source(&self, input: Input, driver: &mut Driver) -> TrackHandle

Adds an audio source to the queue, to be played in the channel managed by driver.

+

This method will preload the next track 5 seconds before the current track ends, if +the AuxMetadata can be successfully queried for a Duration.

+
Source

pub async fn add(&self, track: Track, driver: &mut Driver) -> TrackHandle

Adds a Track object to the queue, to be played in the channel managed by driver.

+

This allows additional configuration or event handlers to be added +before enqueueing the audio track. Tracks will be paused pre-emptively.

+

This method will preload the next track 5 seconds before the current track ends, if +the AuxMetadata can be successfully queried for a Duration.

+
Source

pub fn add_with_preload( + &self, + track: Track, + driver: &mut Driver, + preload_time: Option<Duration>, +) -> TrackHandle

Add an existing Track to the queue, using a known time to preload the next track.

+

preload_time can be specified to enable gapless playback: this is the +playback position in this track when the the driver will begin to load the next track. +The standard Self::add method use AuxMetadata to set this to 5 seconds before +a track ends.

+

A None value will not ready the next track until this track ends, disabling preload.

+
Source

pub fn current(&self) -> Option<TrackHandle>

Returns a handle to the currently playing track.

+
Source

pub fn dequeue(&self, index: usize) -> Option<Queued>

Attempts to remove a track from the specified index.

+

The returned entry can be readded to this queue via modify_queue.

+
Source

pub fn len(&self) -> usize

Returns the number of tracks currently in the queue.

+
Source

pub fn is_empty(&self) -> bool

Returns whether there are no tracks currently in the queue.

+
Source

pub fn modify_queue<F, O>(&self, func: F) -> O
where + F: FnOnce(&mut VecDeque<Queued>) -> O,

Allows modification of the inner queue (i.e., deletion, reordering).

+

Users must be careful to stop removed tracks, so as to prevent +resource leaks.

+
Source

pub fn pause(&self) -> TrackResult<()>

Pause the track at the head of the queue.

+
Source

pub fn resume(&self) -> TrackResult<()>

Resume the track at the head of the queue.

+
Source

pub fn stop(&self)

Stop the currently playing track, and clears the queue.

+
Source

pub fn skip(&self) -> TrackResult<()>

Skip to the next track in the queue, if it exists.

+
Source

pub fn current_queue(&self) -> Vec<TrackHandle>

Returns a list of currently queued tracks.

+

Does not allow for modification of the queue, instead returns a snapshot of the queue at the time of calling.

+

Use modify_queue for direct modification of the queue.

+

Trait Implementations§

Source§

impl Clone for TrackQueue

Source§

fn clone(&self) -> TrackQueue

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for TrackQueue

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for TrackQueue

Source§

fn default() -> TrackQueue

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/tracks/struct.TrackState.html b/next/songbird/tracks/struct.TrackState.html new file mode 100644 index 0000000..175bbf5 --- /dev/null +++ b/next/songbird/tracks/struct.TrackState.html @@ -0,0 +1,57 @@ +TrackState in songbird::tracks - Rust

TrackState

Struct TrackState 

Source
pub struct TrackState {
+    pub playing: PlayMode,
+    pub volume: f32,
+    pub position: Duration,
+    pub play_time: Duration,
+    pub loops: LoopState,
+    pub ready: ReadyState,
+}
Expand description

State of an Track object, designed to be passed to event handlers +and retrieved remotely via TrackHandle::get_info.

+

Fields§

§playing: PlayMode

Play status (e.g., active, paused, stopped) of this track.

+
§volume: f32

Current volume of this track.

+
§position: Duration

Current playback position in the source.

+

This is altered by loops and seeks, and represents this track’s +position in its underlying input stream.

+
§play_time: Duration

Total playback time, increasing monotonically.

+
§loops: LoopState

Remaining loops on this track.

+
§ready: ReadyState

Whether this track has been made live, is being processed, or is +currently uninitialised.

+

Trait Implementations§

Source§

impl Clone for TrackState

Source§

fn clone(&self) -> TrackState

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for TrackState

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for TrackState

Source§

fn default() -> TrackState

Returns the “default value” for a type. Read more
Source§

impl PartialEq for TrackState

Source§

fn eq(&self, other: &TrackState) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl StructuralPartialEq for TrackState

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneDebuggableStorage for T
where + T: DebuggableStorage + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneDebuggableStorage>

Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CloneableStorage for T
where + T: Any + Send + Sync + Clone,

§

fn clone_storage(&self) -> Box<dyn CloneableStorage>

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> DebuggableStorage for T
where + T: Any + Send + Sync + Debug,

§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/tracks/struct.View.html b/next/songbird/tracks/struct.View.html new file mode 100644 index 0000000..d0d3fb9 --- /dev/null +++ b/next/songbird/tracks/struct.View.html @@ -0,0 +1,50 @@ +View in songbird::tracks - Rust

View

Struct View 

Source
#[non_exhaustive]
pub struct View<'a> { + pub position: &'a Duration, + pub play_time: &'a Duration, + pub volume: &'a mut f32, + pub meta: Option<Metadata<'a>>, + pub playing: &'a mut PlayMode, + pub ready: ReadyState, + pub loops: &'a mut LoopState, +}
Expand description

Live track and input state exposed during TrackHandle::action.

+

Fields (Non-exhaustive)§

This struct is marked as non-exhaustive
Non-exhaustive structs could have additional fields added in future. Therefore, non-exhaustive structs cannot be constructed in external crates using the traditional Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.
§position: &'a Duration

The current position within this track.

+
§play_time: &'a Duration

The total time a track has been played for.

+
§volume: &'a mut f32

The current mixing volume of this track.

+
§meta: Option<Metadata<'a>>

In-stream metadata for this track, if it is fully readied.

+
§playing: &'a mut PlayMode

The current play status of this track.

+
§ready: ReadyState

Whether this track has been made live, is being processed, or is +currently uninitialised.

+
§loops: &'a mut LoopState

The number of remaning loops on this track.

+

Auto Trait Implementations§

§

impl<'a> Freeze for View<'a>

§

impl<'a> !RefUnwindSafe for View<'a>

§

impl<'a> Send for View<'a>

§

impl<'a> Sync for View<'a>

§

impl<'a> Unpin for View<'a>

§

impl<'a> !UnwindSafe for View<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> +if into_left is true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where + F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> +if into_left(&self) returns true. +Converts self into a Right variant of Either<Self, Self> +otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where + T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> PolicyExt for T
where + T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return +Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where + T: Policy<B, E>, + P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns +Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

impl<T> ErasedDestructor for T
where + T: 'static,

\ No newline at end of file diff --git a/next/songbird/tracks/type.TrackResult.html b/next/songbird/tracks/type.TrackResult.html new file mode 100644 index 0000000..9ec9470 --- /dev/null +++ b/next/songbird/tracks/type.TrackResult.html @@ -0,0 +1,7 @@ +TrackResult in songbird::tracks - Rust

TrackResult

Type Alias TrackResult 

Source
pub type TrackResult<T> = Result<T, ControlError>;
Expand description

Alias for most calls to a TrackHandle.

+

Aliased Type§

pub enum TrackResult<T> {
+    Ok(T),
+    Err(ControlError),
+}

Variants§

§1.0.0

Ok(T)

Contains the success value

+
§1.0.0

Err(ControlError)

Contains the error value

+
\ No newline at end of file diff --git a/next/songbird/tracks/view/struct.View.html b/next/songbird/tracks/view/struct.View.html new file mode 100644 index 0000000..512ce07 --- /dev/null +++ b/next/songbird/tracks/view/struct.View.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../songbird/tracks/struct.View.html...

+ + + \ No newline at end of file diff --git a/next/src-files.js b/next/src-files.js new file mode 100644 index 0000000..5242cef --- /dev/null +++ b/next/src-files.js @@ -0,0 +1,2 @@ +createSrcSidebar('[["songbird",["",[["driver",[["connection",[],["error.rs","mod.rs"]],["retry",[],["mod.rs","strategy.rs"]],["scheduler",[],["config.rs","idle.rs","live.rs","mod.rs","stats.rs","task.rs"]],["tasks",[["message",[],["core.rs","disposal.rs","events.rs","mixer.rs","mod.rs","udp_rx.rs","ws.rs"]],["mixer",[],["mix_logic.rs","mod.rs","pool.rs","result.rs","state.rs","track.rs","util.rs"]],["udp_rx",[],["decode_sizes.rs","mod.rs","playout_buffer.rs","ssrc_state.rs"]]],["disposal.rs","error.rs","events.rs","mod.rs","ws.rs"]]],["crypto.rs","decode_mode.rs","mix_mode.rs","mod.rs"]],["events",[["context",[["data",[],["connect.rs","disconnect.rs","mod.rs","rtcp.rs","rtp.rs","voice.rs"]]],["internal_data.rs","mod.rs"]]],["core.rs","data.rs","mod.rs","store.rs","track.rs","untimed.rs"]],["input",[["adapters",[["cached",[],["compressed.rs","decompressed.rs","error.rs","hint.rs","memory.rs","mod.rs","util.rs"]]],["async_adapter.rs","child.rs","mod.rs","raw_adapter.rs"]],["codecs",[["dca",[],["metadata.rs","mod.rs"]]],["mod.rs","opus.rs","raw.rs"]],["metadata",[],["ffprobe.rs","mod.rs","ytdl.rs"]],["sources",[],["file.rs","hls.rs","http.rs","mod.rs","ytdl.rs"]]],["audiostream.rs","compose.rs","error.rs","live_input.rs","mod.rs","parsed.rs","utils.rs"]],["tracks",[],["action.rs","command.rs","error.rs","handle.rs","looping.rs","mod.rs","mode.rs","queue.rs","ready.rs","state.rs","view.rs"]]],["config.rs","constants.rs","error.rs","handler.rs","id.rs","info.rs","join.rs","lib.rs","manager.rs","serenity.rs","shards.rs","ws.rs"]]]]'); +//{"start":19,"fragment_lengths":[1531]} \ No newline at end of file diff --git a/next/src/songbird/config.rs.html b/next/src/songbird/config.rs.html new file mode 100644 index 0000000..be57f57 --- /dev/null +++ b/next/src/songbird/config.rs.html @@ -0,0 +1,443 @@ +config.rs - source

songbird/
config.rs

1#[cfg(all(feature = "driver", feature = "receive"))]
+2use crate::driver::DecodeMode;
+3#[cfg(feature = "driver")]
+4use crate::{
+5    driver::{
+6        get_default_scheduler,
+7        retry::Retry,
+8        tasks::disposal::DisposalThread,
+9        CryptoMode,
+10        MixMode,
+11        Scheduler,
+12    },
+13    input::codecs::*,
+14};
+15
+16#[cfg(test)]
+17use crate::driver::test_config::*;
+18#[cfg(all(test, feature = "driver"))]
+19use crate::driver::SchedulerConfig;
+20
+21#[cfg(feature = "driver")]
+22use symphonia::core::{codecs::CodecRegistry, probe::Probe};
+23
+24use derivative::Derivative;
+25#[cfg(feature = "receive")]
+26use std::num::NonZeroUsize;
+27use std::time::Duration;
+28
+29/// Configuration for drivers and calls.
+30#[derive(Clone, Derivative)]
+31#[derivative(Debug)]
+32#[non_exhaustive]
+33pub struct Config {
+34    #[cfg(feature = "driver")]
+35    /// Selected tagging mode for voice packet encryption.
+36    ///
+37    /// Defaults to [`CryptoMode::Aes256Gcm`].
+38    ///
+39    /// Changes to this field will not immediately apply if the
+40    /// driver is actively connected, but will apply to subsequent
+41    /// sessions.
+42    ///
+43    /// [`CryptoMode::Aes256Gcm`]: CryptoMode::Aes256Gcm
+44    pub crypto_mode: CryptoMode,
+45
+46    #[cfg(all(feature = "driver", feature = "receive"))]
+47    /// Configures whether decoding and decryption occur for all received packets.
+48    ///
+49    /// If receiving and using voice packets, generally you should choose [`DecodeMode::Decode`].
+50    /// [`DecodeMode::Decrypt`] is intended for users running their own selective decoding or
+51    /// who need to inspect Opus packets. [User speaking state] can still be seen using [`DecodeMode::Pass`].
+52    /// If you're certain you will never need any RT(C)P events, then consider building without
+53    /// the `"receive"` feature for extra performance.
+54    ///
+55    /// Defaults to [`DecodeMode::Decrypt`]. This is due to per-packet decoding costs,
+56    /// which most users will not want to pay, but allowing speaking events which are commonly used.
+57    ///
+58    /// [`DecodeMode::Decode`]: DecodeMode::Decode
+59    /// [`DecodeMode::Decrypt`]: DecodeMode::Decrypt
+60    /// [`DecodeMode::Pass`]: DecodeMode::Pass
+61    /// [User speaking state]: crate::events::CoreEvent::VoiceTick
+62    pub decode_mode: DecodeMode,
+63
+64    #[cfg(all(feature = "driver", feature = "receive"))]
+65    /// Configures the amount of time after a user/SSRC is inactive before their decoder state
+66    /// should be removed.
+67    ///
+68    /// Defaults to 1 minute.
+69    pub decode_state_timeout: Duration,
+70
+71    #[cfg(all(feature = "driver", feature = "receive"))]
+72    /// Configures the number of audio packets to buffer for each user before playout.
+73    ///
+74    /// A playout buffer allows Songbird to smooth out jitter in audio packet arrivals,
+75    /// as well as to correct for reordering of packets by the network.
+76    ///
+77    /// This does not affect the arrival of raw packet events.
+78    ///
+79    /// Defaults to 5 packets (100ms).
+80    pub playout_buffer_length: NonZeroUsize,
+81
+82    #[cfg(all(feature = "driver", feature = "receive"))]
+83    /// Configures the initial amount of extra space allocated to handle packet bursts.
+84    ///
+85    /// Each SSRC's receive buffer will start at capacity `playout_buffer_length +
+86    /// playout_spike_length`, up to a maximum 64 packets.
+87    ///
+88    /// Defaults to 3 packets (thus capacity defaults to 8).
+89    pub playout_spike_length: usize,
+90
+91    #[cfg(feature = "gateway")]
+92    /// Configures the amount of time to wait for Discord to reply with connection information
+93    /// if [`Call::join`]/[`join_gateway`] are used.
+94    ///
+95    /// This is a useful fallback in the event that:
+96    ///  * the underlying Discord client restarts and loses a join request, or
+97    ///  * a channel join fails because the bot is already believed to be there.
+98    ///
+99    /// Defaults to 10 seconds. If set to `None`, connections will never time out.
+100    ///
+101    /// [`Call::join`]: crate::Call::join
+102    /// [`join_gateway`]: crate::Call::join_gateway
+103    pub gateway_timeout: Option<Duration>,
+104
+105    #[cfg(feature = "driver")]
+106    /// Configures whether the driver will mix and output stereo or mono Opus data
+107    /// over a voice channel.
+108    ///
+109    /// Defaults to [`Stereo`].
+110    ///
+111    /// [`Stereo`]: MixMode::Stereo
+112    pub mix_mode: MixMode,
+113
+114    #[cfg(feature = "driver")]
+115    /// Number of concurrently active tracks to allocate memory for.
+116    ///
+117    /// This should be set at, or just above, the maximum number of tracks
+118    /// you expect your bot will play at the same time. Exceeding the size of
+119    /// the internal queue will trigger a larger memory allocation and copy,
+120    /// possibly causing the mixer thread to miss a packet deadline.
+121    ///
+122    /// Defaults to `1`.
+123    ///
+124    /// Changes to this field in a running driver will only ever increase
+125    /// the capacity of the track store.
+126    pub preallocated_tracks: usize,
+127
+128    #[cfg(feature = "driver")]
+129    /// Connection retry logic for the [`Driver`].
+130    ///
+131    /// This controls how many times the [`Driver`] should retry any connections,
+132    /// as well as how long to wait between attempts.
+133    ///
+134    /// [`Driver`]: crate::driver::Driver
+135    pub driver_retry: Retry,
+136
+137    #[cfg(feature = "driver")]
+138    /// Configures whether or not each mixed audio packet is [soft-clipped] into the
+139    /// [-1, 1] audio range.
+140    ///
+141    /// Defaults to `true`, preventing clipping and dangerously loud audio from being sent.
+142    ///
+143    /// **This operation adds ~3% cost to a standard (non-passthrough) mix cycle.**
+144    /// If you *know* that your bot will only play one sound at a time and that
+145    /// your volume is between `0.0` and `1.0`, then you can disable soft-clipping
+146    /// for a performance boost. If you are playing several sounds at once, do not
+147    /// disable this unless you make sure to reduce the volume of each sound.
+148    ///
+149    /// [soft-clipped]: https://opus-codec.org/docs/opus_api-1.3.1/group__opus__decoder.html#gaff99598b352e8939dded08d96e125e0b
+150    pub use_softclip: bool,
+151
+152    #[cfg(feature = "driver")]
+153    /// Configures the maximum amount of time to wait for an attempted voice
+154    /// connection to Discord.
+155    ///
+156    /// Defaults to 10 seconds. If set to `None`, connections will never time out.
+157    pub driver_timeout: Option<Duration>,
+158
+159    #[cfg(feature = "driver")]
+160    #[derivative(Debug = "ignore")]
+161    /// Registry of the inner codecs supported by the driver, adding audiopus-based
+162    /// Opus codec support to all of Symphonia's default codecs.
+163    ///
+164    /// Defaults to [`get_codec_registry`].
+165    pub codec_registry: &'static CodecRegistry,
+166
+167    #[cfg(feature = "driver")]
+168    #[derivative(Debug = "ignore")]
+169    /// Registry of the muxers and container formats supported by the driver.
+170    ///
+171    /// Defaults to [`get_probe`], which includes all of Symphonia's default format handlers
+172    /// and DCA format support.
+173    pub format_registry: &'static Probe,
+174
+175    #[cfg(feature = "driver")]
+176    /// The Sender for a channel that will run the destructor of possibly blocking values.
+177    ///
+178    /// If not set, a thread will be spawned to perform this, but it is recommended to create
+179    /// a long running thread instead of relying on a per-driver thread.
+180    ///
+181    /// Note: When using [`Songbird`] this is overwritten automatically by its disposal thread.
+182    ///
+183    /// [`Songbird`]: crate::Songbird
+184    pub disposer: Option<DisposalThread>,
+185
+186    #[cfg(feature = "driver")]
+187    /// The scheduler is responsible for mapping idle and active [`Driver`] instances
+188    /// to threads.
+189    ///
+190    /// If set to None, then songbird will use [`get_default_scheduler`].
+191    ///
+192    /// [`Driver`]: crate::Driver
+193    pub scheduler: Option<Scheduler>,
+194
+195    // Test only attributes
+196    #[cfg(feature = "driver")]
+197    #[cfg(test)]
+198    /// Test config to offer precise control over mixing tick rate/count.
+199    pub(crate) tick_style: TickStyle,
+200    #[cfg(feature = "driver")]
+201    #[cfg(test)]
+202    /// If set, skip connection and encryption steps.
+203    pub(crate) override_connection: Option<OutputMode>,
+204}
+205
+206impl Default for Config {
+207    fn default() -> Self {
+208        Self {
+209            #[cfg(feature = "driver")]
+210            crypto_mode: CryptoMode::Aes256Gcm,
+211            #[cfg(all(feature = "driver", feature = "receive"))]
+212            decode_mode: DecodeMode::Decrypt,
+213            #[cfg(all(feature = "driver", feature = "receive"))]
+214            decode_state_timeout: Duration::from_secs(60),
+215            #[cfg(all(feature = "driver", feature = "receive"))]
+216            playout_buffer_length: NonZeroUsize::new(5).unwrap(),
+217            #[cfg(all(feature = "driver", feature = "receive"))]
+218            playout_spike_length: 3,
+219            #[cfg(feature = "gateway")]
+220            gateway_timeout: Some(Duration::from_secs(10)),
+221            #[cfg(feature = "driver")]
+222            mix_mode: MixMode::Stereo,
+223            #[cfg(feature = "driver")]
+224            preallocated_tracks: 1,
+225            #[cfg(feature = "driver")]
+226            use_softclip: true,
+227            #[cfg(feature = "driver")]
+228            driver_retry: Retry::default(),
+229            #[cfg(feature = "driver")]
+230            driver_timeout: Some(Duration::from_secs(10)),
+231            #[cfg(feature = "driver")]
+232            codec_registry: get_codec_registry(),
+233            #[cfg(feature = "driver")]
+234            format_registry: get_probe(),
+235            #[cfg(feature = "driver")]
+236            disposer: None,
+237            #[cfg(feature = "driver")]
+238            scheduler: None,
+239            #[cfg(feature = "driver")]
+240            #[cfg(test)]
+241            tick_style: TickStyle::Timed,
+242            #[cfg(feature = "driver")]
+243            #[cfg(test)]
+244            override_connection: None,
+245        }
+246    }
+247}
+248
+249#[cfg(feature = "driver")]
+250impl Config {
+251    /// Sets this `Config`'s chosen cryptographic tagging scheme.
+252    #[must_use]
+253    pub fn crypto_mode(mut self, crypto_mode: CryptoMode) -> Self {
+254        self.crypto_mode = crypto_mode;
+255        self
+256    }
+257
+258    #[cfg(feature = "receive")]
+259    /// Sets this `Config`'s received packet decryption/decoding behaviour.
+260    #[must_use]
+261    pub fn decode_mode(mut self, decode_mode: DecodeMode) -> Self {
+262        self.decode_mode = decode_mode;
+263        self
+264    }
+265
+266    #[cfg(feature = "receive")]
+267    /// Sets this `Config`'s received packet decoder cleanup timer.
+268    #[must_use]
+269    pub fn decode_state_timeout(mut self, decode_state_timeout: Duration) -> Self {
+270        self.decode_state_timeout = decode_state_timeout;
+271        self
+272    }
+273
+274    #[cfg(feature = "receive")]
+275    /// Sets this `Config`'s playout buffer length, in packets.
+276    #[must_use]
+277    pub fn playout_buffer_length(mut self, playout_buffer_length: NonZeroUsize) -> Self {
+278        self.playout_buffer_length = playout_buffer_length;
+279        self
+280    }
+281
+282    #[cfg(feature = "receive")]
+283    /// Sets this `Config`'s additional pre-allocated space to handle bursty audio packets.
+284    #[must_use]
+285    pub fn playout_spike_length(mut self, playout_spike_length: usize) -> Self {
+286        self.playout_spike_length = playout_spike_length;
+287        self
+288    }
+289
+290    /// Sets this `Config`'s audio mixing channel count.
+291    #[must_use]
+292    pub fn mix_mode(mut self, mix_mode: MixMode) -> Self {
+293        self.mix_mode = mix_mode;
+294        self
+295    }
+296
+297    /// Sets this `Config`'s number of tracks to preallocate.
+298    #[must_use]
+299    pub fn preallocated_tracks(mut self, preallocated_tracks: usize) -> Self {
+300        self.preallocated_tracks = preallocated_tracks;
+301        self
+302    }
+303
+304    /// Sets this `Config`'s number to enable/disable soft-clipping sent audio.
+305    #[must_use]
+306    pub fn use_softclip(mut self, use_softclip: bool) -> Self {
+307        self.use_softclip = use_softclip;
+308        self
+309    }
+310
+311    /// Sets this `Config`'s timeout for establishing a voice connection.
+312    #[must_use]
+313    pub fn driver_timeout(mut self, driver_timeout: Option<Duration>) -> Self {
+314        self.driver_timeout = driver_timeout;
+315        self
+316    }
+317
+318    /// Sets this `Config`'s voice connection retry configuration.
+319    #[must_use]
+320    pub fn driver_retry(mut self, driver_retry: Retry) -> Self {
+321        self.driver_retry = driver_retry;
+322        self
+323    }
+324
+325    /// Sets this `Config`'s symphonia codec registry.
+326    #[must_use]
+327    pub fn codec_registry(mut self, codec_registry: &'static CodecRegistry) -> Self {
+328        self.codec_registry = codec_registry;
+329        self
+330    }
+331
+332    /// Sets this `Config`'s symphonia format registry/probe set.
+333    #[must_use]
+334    pub fn format_registry(mut self, format_registry: &'static Probe) -> Self {
+335        self.format_registry = format_registry;
+336        self
+337    }
+338
+339    /// Sets this `Config`'s channel for sending disposal messages.
+340    #[must_use]
+341    pub fn disposer(mut self, disposer: DisposalThread) -> Self {
+342        self.disposer = Some(disposer);
+343        self
+344    }
+345
+346    /// Sets this `Config`'s mixer scheduler.
+347    #[must_use]
+348    pub fn scheduler(mut self, scheduler: Scheduler) -> Self {
+349        self.scheduler = Some(scheduler);
+350        self
+351    }
+352
+353    /// Returns a lightweight reference to the audio scheduler this `Config` will use.
+354    #[must_use]
+355    pub fn get_scheduler(&self) -> Scheduler {
+356        self.scheduler
+357            .as_ref()
+358            .unwrap_or(get_default_scheduler())
+359            .clone()
+360    }
+361
+362    /// Ensures a global disposer has been set, initializing one if not.
+363    #[must_use]
+364    pub(crate) fn initialise_disposer(self) -> Self {
+365        if self.disposer.is_some() {
+366            self
+367        } else {
+368            self.disposer(DisposalThread::run())
+369        }
+370    }
+371
+372    /// This is used to prevent changes which would invalidate the current session.
+373    pub(crate) fn make_safe(&mut self, previous: &Config, connected: bool) {
+374        if connected {
+375            self.crypto_mode = previous.crypto_mode;
+376        }
+377    }
+378}
+379
+380#[cfg(not(feature = "driver"))]
+381impl Config {
+382    pub(crate) fn initialise_disposer(self) -> Self {
+383        self
+384    }
+385}
+386
+387// Test only attributes
+388#[cfg(all(test, feature = "driver"))]
+389#[allow(missing_docs)]
+390impl Config {
+391    #[must_use]
+392    pub fn tick_style(mut self, tick_style: TickStyle) -> Self {
+393        self.tick_style = tick_style;
+394        self
+395    }
+396
+397    /// Sets this `Config`'s voice connection retry configuration.
+398    #[must_use]
+399    pub fn override_connection(mut self, override_connection: Option<OutputMode>) -> Self {
+400        self.override_connection = override_connection;
+401        self
+402    }
+403
+404    #[must_use]
+405    pub fn test_cfg(raw_output: bool) -> (DriverTestHandle, Config) {
+406        let (tick_tx, tick_rx) = flume::unbounded();
+407
+408        let (conn, rx) = if raw_output {
+409            let (pkt_tx, pkt_rx) = flume::unbounded();
+410
+411            (OutputMode::Raw(pkt_tx), OutputReceiver::Raw(pkt_rx))
+412        } else {
+413            let (rtp_tx, rtp_rx) = flume::unbounded();
+414
+415            (OutputMode::Rtp(rtp_tx), OutputReceiver::Rtp(rtp_rx))
+416        };
+417
+418        let sc_config = SchedulerConfig {
+419            strategy: crate::driver::SchedulerMode::MaxPerThread(1.try_into().unwrap()),
+420            move_expensive_tasks: true,
+421        };
+422
+423        let config = Config::default()
+424            .tick_style(TickStyle::UntimedWithExecLimit(tick_rx))
+425            // give each test its own thread in the scheduler for simplicity.
+426            .scheduler(Scheduler::new(sc_config))
+427            .override_connection(Some(conn));
+428
+429        let handle = DriverTestHandle { rx, tx: tick_tx };
+430
+431        (handle, config)
+432    }
+433}
+434
+435#[cfg(feature = "gateway")]
+436impl Config {
+437    /// Sets this `Config`'s timeout for joining a voice channel.
+438    #[must_use]
+439    pub fn gateway_timeout(mut self, gateway_timeout: Option<Duration>) -> Self {
+440        self.gateway_timeout = gateway_timeout;
+441        self
+442    }
+443}
\ No newline at end of file diff --git a/next/src/songbird/constants.rs.html b/next/src/songbird/constants.rs.html new file mode 100644 index 0000000..262a440 --- /dev/null +++ b/next/src/songbird/constants.rs.html @@ -0,0 +1,131 @@ +constants.rs - source

songbird/
constants.rs

1//! Constants affecting driver function and API handling.
+2
+3#[cfg(feature = "driver")]
+4use audiopus::{Bitrate, SampleRate};
+5#[cfg(feature = "driver")]
+6use discortp::rtp::RtpType;
+7use std::time::Duration;
+8
+9#[cfg(feature = "driver")]
+10/// The voice gateway version used by the library.
+11pub const VOICE_GATEWAY_VERSION: u8 = crate::model::constants::GATEWAY_VERSION;
+12
+13#[cfg(feature = "driver")]
+14/// Sample rate of audio to be sent to Discord.
+15pub const SAMPLE_RATE: SampleRate = SampleRate::Hz48000;
+16
+17/// Sample rate of audio to be sent to Discord.
+18pub const SAMPLE_RATE_RAW: usize = 48_000;
+19
+20/// Number of audio frames/packets to be sent per second.
+21pub const AUDIO_FRAME_RATE: usize = 50;
+22
+23/// Length of time between any two audio frames.
+24pub const TIMESTEP_LENGTH: Duration = Duration::from_millis(1000 / AUDIO_FRAME_RATE as u64);
+25
+26#[cfg(feature = "driver")]
+27/// Default bitrate for audio.
+28pub const DEFAULT_BITRATE: Bitrate = Bitrate::BitsPerSecond(128_000);
+29
+30/// Number of output samples at 48kHZ to produced when resampling subframes.
+31pub(crate) const RESAMPLE_OUTPUT_FRAME_SIZE: usize = MONO_FRAME_SIZE / 2;
+32
+33/// The maximum number of bad frames to allow in an Opus source before blocking passthrough.
+34pub(crate) const OPUS_PASSTHROUGH_STRIKE_LIMIT: u8 = 3;
+35
+36/// Number of samples in one complete frame of audio per channel.
+37///
+38/// This is equally the number of stereo (joint) samples in an audio frame.
+39pub const MONO_FRAME_SIZE: usize = SAMPLE_RATE_RAW / AUDIO_FRAME_RATE;
+40
+41/// Number of individual samples in one complete frame of stereo audio.
+42pub const STEREO_FRAME_SIZE: usize = 2 * MONO_FRAME_SIZE;
+43
+44/// Number of bytes in one complete frame of raw `f32`-encoded mono audio.
+45pub const MONO_FRAME_BYTE_SIZE: usize = MONO_FRAME_SIZE * std::mem::size_of::<f32>();
+46
+47/// Number of bytes in one complete frame of raw `f32`-encoded stereo audio.
+48pub const STEREO_FRAME_BYTE_SIZE: usize = STEREO_FRAME_SIZE * std::mem::size_of::<f32>();
+49
+50/// Length (in milliseconds) of any audio frame.
+51pub const FRAME_LEN_MS: usize = 1000 / AUDIO_FRAME_RATE;
+52
+53/// Maximum number of audio frames/packets to be sent per second to be buffered.
+54pub const CHILD_BUFFER_LEN: usize = AUDIO_FRAME_RATE / 2;
+55
+56/// Maximum packet size for a voice packet.
+57///
+58/// Set a safe amount below the Ethernet MTU to avoid fragmentation/rejection.
+59pub const VOICE_PACKET_MAX: usize = 1460;
+60
+61/// Delay between sends of UDP keepalive frames.
+62///
+63/// Passive monitoring of Discord itself shows that these fire every 5 seconds
+64/// irrespective of outgoing UDP traffic.
+65pub const UDP_KEEPALIVE_GAP_MS: u64 = 5_000;
+66
+67/// Type-converted delay between sends of UDP keepalive frames.
+68///
+69/// Passive monitoring of Discord itself shows that these fire every 5 seconds
+70/// irrespective of outgoing UDP traffic.
+71pub const UDP_KEEPALIVE_GAP: Duration = Duration::from_millis(UDP_KEEPALIVE_GAP_MS);
+72
+73/// Opus silent frame, used to signal speech start and end (and prevent audio glitching).
+74pub const SILENT_FRAME: [u8; 3] = [0xf8, 0xff, 0xfe];
+75
+76/// The one (and only) RTP version.
+77pub const RTP_VERSION: u8 = 2;
+78
+79#[cfg(feature = "driver")]
+80/// Profile type used by Discord's Opus audio traffic.
+81pub const RTP_PROFILE_TYPE: RtpType = RtpType::Dynamic(120);
+82
+83#[cfg(test)]
+84#[allow(clippy::doc_markdown, missing_docs)]
+85pub mod test_data {
+86    /// URL for a source which YTDL must extract.
+87    ///
+88    /// Referenced under CC BY-NC-SA 3.0 -- https://creativecommons.org/licenses/by-nc-sa/3.0/
+89    pub const YTDL_TARGET: &str = "https://cloudkicker.bandcamp.com/track/94-days";
+90
+91    /// URL for a source that has both a playlist and a music video,
+92    /// which YTDL should extract.
+93    ///
+94    /// Referenced under CC BY-NC-SA 3.0 -- https://creativecommons.org/licenses/by-nc-sa/3.0/
+95    pub const YTDL_PLAYLIST_TARGET: &str =
+96        "https://www.youtube.com/watch?v=KSgEFfWZ-W0&list=OLAK5uy_l2x81ffbpevMSjUn7NniL_rNLulWM3n6g&index=7";
+97
+98    /// URL for a source which can be read via an Http Request.
+99    ///
+100    /// Referenced under CC BY-NC-SA 3.0 -- https://creativecommons.org/licenses/by-nc-sa/3.0/
+101    pub const HTTP_TARGET: &str = "https://github.com/FelixMcFelix/songbird/raw/symphonia/resources/Cloudkicker%20-%202011%2007.mp3";
+102
+103    /// URL for an opus/ogg source which can be read via an Http Request.
+104    ///
+105    /// Referenced under CC BY 3.0 -- https://creativecommons.org/licenses/by/3.0/
+106    pub const HTTP_OPUS_TARGET: &str = "https://github.com/FelixMcFelix/songbird/raw/symphonia/resources/Cloudkicker%20-%20Making%20Will%20Mad.opus";
+107
+108    /// URL for an opus/webm source which can be read via an Http Request.
+109    ///
+110    /// Referenced under CC BY 3.0 -- https://creativecommons.org/licenses/by/3.0/
+111    pub const HTTP_WEBM_TARGET: &str = "https://github.com/FelixMcFelix/songbird/raw/symphonia/resources/Cloudkicker%20-%20Making%20Will%20Mad.webm";
+112
+113    /// Path to a DCA source.
+114    ///
+115    /// Referenced under CC BY-NC-SA 3.0 -- https://creativecommons.org/licenses/by-nc-sa/3.0/
+116    pub const FILE_DCA_TARGET: &str = "resources/Cloudkicker - 2011 07.dca1";
+117
+118    /// Path to an opus source which can be read via a File.
+119    ///
+120    /// Referenced under CC BY 3.0 -- https://creativecommons.org/licenses/by/3.0/
+121    pub const FILE_WEBM_TARGET: &str = "resources/Cloudkicker - Making Will Mad.webm";
+122
+123    /// Path to a Wav source which can be read via a File.
+124    pub const FILE_WAV_TARGET: &str = "resources/loop.wav";
+125
+126    /// Path to a shorter MP3 source which can be read via a File.
+127    pub const FILE_SHORT_MP3_TARGET: &str = "resources/ting.mp3";
+128
+129    /// Path to an MP4 (H264 + AAC) source which can be read via a File.
+130    pub const FILE_VID_TARGET: &str = "resources/ting-vid.mp4";
+131}
\ No newline at end of file diff --git a/next/src/songbird/driver/connection/error.rs.html b/next/src/songbird/driver/connection/error.rs.html new file mode 100644 index 0000000..82f826f --- /dev/null +++ b/next/src/songbird/driver/connection/error.rs.html @@ -0,0 +1,138 @@ +error.rs - source

songbird/driver/connection/
error.rs

1//! Connection errors and convenience types.
+2
+3use crate::{
+4    driver::tasks::{error::Recipient, message::*},
+5    ws::Error as WsError,
+6};
+7use aes_gcm::Error as CryptoError;
+8use flume::SendError;
+9use serde_json::Error as JsonError;
+10use std::{error::Error as StdError, fmt, io::Error as IoError};
+11use tokio::time::error::Elapsed;
+12
+13/// Errors encountered while connecting to a Discord voice server over the driver.
+14#[derive(Debug)]
+15#[non_exhaustive]
+16pub enum Error {
+17    /// The driver hung up an internal signaller, either due to another connection attempt
+18    /// or a crash.
+19    AttemptDiscarded,
+20    /// An error occurred during [en/de]cryption of voice packets.
+21    Crypto(CryptoError),
+22    /// The symmetric key supplied by Discord had the wrong size.
+23    CryptoInvalidLength,
+24    /// Server did not return the expected crypto mode during negotiation.
+25    CryptoModeInvalid,
+26    /// Selected crypto mode was not offered by server.
+27    CryptoModeUnavailable,
+28    /// An indicator that an endpoint URL was invalid.
+29    EndpointUrl,
+30    /// Discord failed to correctly respond to IP discovery.
+31    IllegalDiscoveryResponse,
+32    /// Could not parse Discord's view of our IP.
+33    IllegalIp,
+34    /// Miscellaneous I/O error.
+35    Io(IoError),
+36    /// JSON (de)serialization error.
+37    Json(JsonError),
+38    /// Failed to message other background tasks after connection establishment.
+39    InterconnectFailure(Recipient),
+40    /// Error communicating with gateway server over WebSocket.
+41    Ws(WsError),
+42    /// Connection attempt timed out.
+43    TimedOut,
+44}
+45
+46impl From<CryptoError> for Error {
+47    fn from(e: CryptoError) -> Self {
+48        Error::Crypto(e)
+49    }
+50}
+51
+52impl From<IoError> for Error {
+53    fn from(e: IoError) -> Error {
+54        Error::Io(e)
+55    }
+56}
+57
+58impl From<JsonError> for Error {
+59    fn from(e: JsonError) -> Error {
+60        Error::Json(e)
+61    }
+62}
+63
+64impl From<SendError<WsMessage>> for Error {
+65    fn from(_e: SendError<WsMessage>) -> Error {
+66        Error::InterconnectFailure(Recipient::AuxNetwork)
+67    }
+68}
+69
+70impl From<SendError<EventMessage>> for Error {
+71    fn from(_e: SendError<EventMessage>) -> Error {
+72        Error::InterconnectFailure(Recipient::Event)
+73    }
+74}
+75
+76impl From<SendError<MixerMessage>> for Error {
+77    fn from(_e: SendError<MixerMessage>) -> Error {
+78        Error::InterconnectFailure(Recipient::Mixer)
+79    }
+80}
+81
+82impl From<WsError> for Error {
+83    fn from(e: WsError) -> Error {
+84        Error::Ws(e)
+85    }
+86}
+87
+88impl From<Elapsed> for Error {
+89    fn from(_e: Elapsed) -> Error {
+90        Error::TimedOut
+91    }
+92}
+93
+94impl fmt::Display for Error {
+95    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+96        write!(f, "failed to connect to Discord RTP server: ")?;
+97        match self {
+98            Self::AttemptDiscarded => write!(f, "connection attempt was aborted/discarded"),
+99            Self::Crypto(e) => e.fmt(f),
+100            Self::CryptoInvalidLength => write!(f, "server supplied key of wrong length"),
+101            Self::CryptoModeInvalid => write!(f, "server changed negotiated encryption mode"),
+102            Self::CryptoModeUnavailable => write!(f, "server did not offer chosen encryption mode"),
+103            Self::EndpointUrl => write!(f, "endpoint URL received from gateway was invalid"),
+104            Self::IllegalDiscoveryResponse => {
+105                write!(f, "IP discovery/NAT punching response was invalid")
+106            },
+107            Self::IllegalIp => write!(f, "IP discovery/NAT punching response had bad IP value"),
+108            Self::Io(e) => e.fmt(f),
+109            Self::Json(e) => e.fmt(f),
+110            Self::InterconnectFailure(e) => write!(f, "failed to contact other task ({e:?})"),
+111            Self::Ws(e) => write!(f, "websocket issue ({e:?})."),
+112            Self::TimedOut => write!(f, "connection attempt timed out"),
+113        }
+114    }
+115}
+116
+117impl StdError for Error {
+118    fn source(&self) -> Option<&(dyn StdError + 'static)> {
+119        match self {
+120            Error::AttemptDiscarded
+121            | Error::Crypto(_)
+122            | Error::CryptoInvalidLength
+123            | Error::CryptoModeInvalid
+124            | Error::CryptoModeUnavailable
+125            | Error::EndpointUrl
+126            | Error::IllegalDiscoveryResponse
+127            | Error::IllegalIp
+128            | Error::InterconnectFailure(_)
+129            | Error::Ws(_)
+130            | Error::TimedOut => None,
+131            Error::Io(e) => e.source(),
+132            Error::Json(e) => e.source(),
+133        }
+134    }
+135}
+136
+137/// Convenience type for Discord voice/driver connection error handling.
+138pub type Result<T> = std::result::Result<T, Error>;
\ No newline at end of file diff --git a/next/src/songbird/driver/connection/mod.rs.html b/next/src/songbird/driver/connection/mod.rs.html new file mode 100644 index 0000000..90bd4c2 --- /dev/null +++ b/next/src/songbird/driver/connection/mod.rs.html @@ -0,0 +1,372 @@ +mod.rs - source

songbird/driver/connection/
mod.rs

1pub mod error;
+2
+3#[cfg(feature = "receive")]
+4use super::tasks::udp_rx;
+5use super::{
+6    crypto::Cipher,
+7    tasks::{
+8        message::*,
+9        ws::{self as ws_task, AuxNetwork},
+10    },
+11    Config,
+12    CryptoMode,
+13};
+14use crate::{
+15    constants::*,
+16    model::{
+17        payload::{Identify, Resume, SelectProtocol},
+18        Event as GatewayEvent,
+19        ProtocolData,
+20    },
+21    ws::WsStream,
+22    ConnectionInfo,
+23};
+24use discortp::discord::{IpDiscoveryPacket, IpDiscoveryType, MutableIpDiscoveryPacket};
+25use error::{Error, Result};
+26use flume::Sender;
+27use socket2::Socket;
+28#[cfg(feature = "receive")]
+29use std::sync::Arc;
+30use std::{net::IpAddr, str::FromStr};
+31use tokio::{net::UdpSocket, spawn, time::timeout};
+32use tracing::{debug, info, instrument};
+33use url::Url;
+34
+35pub(crate) struct Connection {
+36    pub(crate) info: ConnectionInfo,
+37    pub(crate) ssrc: u32,
+38    pub(crate) ws: Sender<WsMessage>,
+39}
+40
+41impl Connection {
+42    pub(crate) async fn new(
+43        info: ConnectionInfo,
+44        interconnect: &Interconnect,
+45        config: &Config,
+46        idx: usize,
+47    ) -> Result<Connection> {
+48        if let Some(t) = config.driver_timeout {
+49            timeout(t, Connection::new_inner(info, interconnect, config, idx)).await?
+50        } else {
+51            Connection::new_inner(info, interconnect, config, idx).await
+52        }
+53    }
+54
+55    pub(crate) async fn new_inner(
+56        mut info: ConnectionInfo,
+57        interconnect: &Interconnect,
+58        config: &Config,
+59        idx: usize,
+60    ) -> Result<Connection> {
+61        let url = generate_url(&mut info.endpoint)?;
+62
+63        let mut client = WsStream::connect(url).await?;
+64        let (ws_msg_tx, ws_msg_rx) = flume::unbounded();
+65
+66        let mut hello = None;
+67        let mut ready = None;
+68
+69        client
+70            .send_json(&GatewayEvent::from(Identify {
+71                server_id: info.guild_id.into(),
+72                session_id: info.session_id.clone(),
+73                token: info.token.clone(),
+74                user_id: info.user_id.into(),
+75            }))
+76            .await?;
+77
+78        loop {
+79            let Some(value) = client.recv_json().await? else {
+80                continue;
+81            };
+82
+83            match value {
+84                GatewayEvent::Ready(r) => {
+85                    ready = Some(r);
+86                    if hello.is_some() {
+87                        break;
+88                    }
+89                },
+90                GatewayEvent::Hello(h) => {
+91                    hello = Some(h);
+92                    if ready.is_some() {
+93                        break;
+94                    }
+95                },
+96                other => {
+97                    // Discord hold back per-user connection state until after this handshake.
+98                    // There's no guarantee that will remain the case, so buffer it like all
+99                    // subsequent steps where we know they *do* send these packets.
+100                    debug!("Expected ready/hello; got: {:?}", other);
+101                    ws_msg_tx.send(WsMessage::Deliver(other))?;
+102                },
+103            }
+104        }
+105
+106        let hello =
+107            hello.expect("Hello packet expected in connection initialisation, but not found.");
+108        let ready =
+109            ready.expect("Ready packet expected in connection initialisation, but not found.");
+110
+111        let chosen_crypto = CryptoMode::negotiate(&ready.modes, Some(config.crypto_mode))?;
+112
+113        info!(
+114            "Crypto scheme negotiation -- wanted {:?}. Chose {:?} from modes {:?}.",
+115            config.crypto_mode, chosen_crypto, ready.modes
+116        );
+117
+118        let udp = UdpSocket::bind("0.0.0.0:0").await?;
+119
+120        // Optimisation for non-receive case: set rx buffer size to zero.
+121        let udp = if cfg!(feature = "receive") {
+122            udp
+123        } else {
+124            let socket = Socket::from(udp.into_std()?);
+125
+126            // Some operating systems do not allow setting the recv buffer to 0.
+127            #[cfg(any(target_os = "linux", target_os = "windows"))]
+128            socket.set_recv_buffer_size(0)?;
+129
+130            UdpSocket::from_std(socket.into())?
+131        };
+132
+133        udp.connect((ready.ip, ready.port)).await?;
+134
+135        // Follow Discord's IP Discovery procedures, in case NAT tunnelling is needed.
+136        let mut bytes = [0; IpDiscoveryPacket::const_packet_size()];
+137        {
+138            let mut view = MutableIpDiscoveryPacket::new(&mut bytes[..]).expect(
+139                "Too few bytes in 'bytes' for IPDiscovery packet.\
+140                    (Blame: IpDiscoveryPacket::const_packet_size()?)",
+141            );
+142            view.set_pkt_type(IpDiscoveryType::Request);
+143            view.set_length(70);
+144            view.set_ssrc(ready.ssrc);
+145        }
+146
+147        udp.send(&bytes).await?;
+148
+149        let (len, _addr) = udp.recv_from(&mut bytes).await?;
+150        {
+151            let view =
+152                IpDiscoveryPacket::new(&bytes[..len]).ok_or(Error::IllegalDiscoveryResponse)?;
+153
+154            if view.get_pkt_type() != IpDiscoveryType::Response {
+155                return Err(Error::IllegalDiscoveryResponse);
+156            }
+157
+158            // We could do something clever like binary search,
+159            // but possibility of UDP spoofing precludes us from
+160            // making the assumption we can find a "left edge" of '\0's.
+161            let nul_byte_index = view
+162                .get_address_raw()
+163                .iter()
+164                .position(|&b| b == 0)
+165                .ok_or(Error::IllegalIp)?;
+166
+167            let address_str = std::str::from_utf8(&view.get_address_raw()[..nul_byte_index])
+168                .map_err(|_| Error::IllegalIp)?;
+169
+170            let address = IpAddr::from_str(address_str).map_err(|_| Error::IllegalIp)?;
+171
+172            client
+173                .send_json(&GatewayEvent::from(SelectProtocol {
+174                    protocol: "udp".into(),
+175                    data: ProtocolData {
+176                        address,
+177                        mode: chosen_crypto.to_request_str().into(),
+178                        port: view.get_port(),
+179                    },
+180                }))
+181                .await?;
+182        }
+183
+184        let cipher = init_cipher(&mut client, chosen_crypto, &ws_msg_tx).await?;
+185
+186        info!("Connected to: {}", info.endpoint);
+187
+188        info!("WS heartbeat duration {}ms.", hello.heartbeat_interval);
+189
+190        #[cfg(feature = "receive")]
+191        let (udp_receiver_msg_tx, udp_receiver_msg_rx) = flume::unbounded();
+192
+193        // NOTE: This causes the UDP Socket on "receive" to be non-blocking,
+194        // and the standard to be blocking. A UDP send should only WouldBlock if
+195        // you're sending more data than the OS can handle (not likely, and
+196        // at that point you should scale horizontally).
+197        //
+198        // If this is a problem for anyone, we can make non-blocking sends
+199        // queue up a delayed send up to a limit.
+200        #[cfg(feature = "receive")]
+201        let (udp_rx, udp_tx) = {
+202            let udp_tx = udp.into_std()?;
+203            let udp_rx = UdpSocket::from_std(udp_tx.try_clone()?)?;
+204            (udp_rx, udp_tx)
+205        };
+206        #[cfg(not(feature = "receive"))]
+207        let udp_tx = udp.into_std()?;
+208
+209        let ssrc = ready.ssrc;
+210
+211        let mix_conn = MixerConnection {
+212            #[cfg(feature = "receive")]
+213            cipher: cipher.clone(),
+214            #[cfg(not(feature = "receive"))]
+215            cipher,
+216            crypto_state: chosen_crypto.into(),
+217            #[cfg(feature = "receive")]
+218            udp_rx: udp_receiver_msg_tx,
+219            udp_tx,
+220        };
+221
+222        interconnect
+223            .mixer
+224            .send(MixerMessage::Ws(Some(ws_msg_tx.clone())))?;
+225
+226        interconnect
+227            .mixer
+228            .send(MixerMessage::SetConn(mix_conn, ready.ssrc))?;
+229
+230        #[cfg(feature = "receive")]
+231        let ssrc_tracker = Arc::new(SsrcTracker::default());
+232
+233        let ws_state = AuxNetwork::new(
+234            ws_msg_rx,
+235            client,
+236            ssrc,
+237            hello.heartbeat_interval,
+238            idx,
+239            info.clone(),
+240            #[cfg(feature = "receive")]
+241            ssrc_tracker.clone(),
+242        );
+243
+244        spawn(ws_task::runner(interconnect.clone(), ws_state));
+245
+246        #[cfg(feature = "receive")]
+247        spawn(udp_rx::runner(
+248            interconnect.clone(),
+249            udp_receiver_msg_rx,
+250            cipher,
+251            chosen_crypto,
+252            config.clone(),
+253            udp_rx,
+254            ssrc_tracker,
+255        ));
+256
+257        Ok(Connection {
+258            info,
+259            ssrc,
+260            ws: ws_msg_tx,
+261        })
+262    }
+263
+264    #[instrument(skip(self))]
+265    pub async fn reconnect(&mut self, config: &Config) -> Result<()> {
+266        if let Some(t) = config.driver_timeout {
+267            timeout(t, self.reconnect_inner()).await?
+268        } else {
+269            self.reconnect_inner().await
+270        }
+271    }
+272
+273    #[instrument(skip(self))]
+274    pub async fn reconnect_inner(&mut self) -> Result<()> {
+275        let url = generate_url(&mut self.info.endpoint)?;
+276
+277        // Thread may have died, we want to send to prompt a clean exit
+278        // (if at all possible) and then proceed as normal.
+279        let mut client = WsStream::connect(url).await?;
+280
+281        client
+282            .send_json(&GatewayEvent::from(Resume {
+283                server_id: self.info.guild_id.into(),
+284                session_id: self.info.session_id.clone(),
+285                token: self.info.token.clone(),
+286            }))
+287            .await?;
+288
+289        let mut hello = None;
+290        let mut resumed = None;
+291
+292        loop {
+293            let Some(value) = client.recv_json().await? else {
+294                continue;
+295            };
+296
+297            match value {
+298                GatewayEvent::Resumed => {
+299                    resumed = Some(());
+300                    if hello.is_some() {
+301                        break;
+302                    }
+303                },
+304                GatewayEvent::Hello(h) => {
+305                    hello = Some(h);
+306                    if resumed.is_some() {
+307                        break;
+308                    }
+309                },
+310                other => {
+311                    self.ws.send(WsMessage::Deliver(other))?;
+312                },
+313            }
+314        }
+315
+316        let hello =
+317            hello.expect("Hello packet expected in connection initialisation, but not found.");
+318
+319        self.ws
+320            .send(WsMessage::SetKeepalive(hello.heartbeat_interval))?;
+321        self.ws.send(WsMessage::Ws(Box::new(client)))?;
+322
+323        info!("Reconnected to: {}", &self.info.endpoint);
+324        Ok(())
+325    }
+326}
+327
+328impl Drop for Connection {
+329    fn drop(&mut self) {
+330        info!("Disconnected");
+331    }
+332}
+333
+334fn generate_url(endpoint: &mut String) -> Result<Url> {
+335    if endpoint.ends_with(":80") {
+336        let len = endpoint.len();
+337
+338        endpoint.truncate(len - 3);
+339    }
+340
+341    Url::parse(&format!("wss://{endpoint}/?v={VOICE_GATEWAY_VERSION}")).or(Err(Error::EndpointUrl))
+342}
+343
+344#[inline]
+345async fn init_cipher(
+346    client: &mut WsStream,
+347    mode: CryptoMode,
+348    tx: &Sender<WsMessage>,
+349) -> Result<Cipher> {
+350    loop {
+351        let Some(value) = client.recv_json().await? else {
+352            continue;
+353        };
+354
+355        match value {
+356            GatewayEvent::SessionDescription(desc) => {
+357                if desc.mode != mode.to_request_str() {
+358                    return Err(Error::CryptoModeInvalid);
+359                }
+360
+361                return mode
+362                    .cipher_from_key(&desc.secret_key)
+363                    .map_err(|_| Error::CryptoInvalidLength);
+364            },
+365            other => {
+366                // Discord can and will send user-specific payload packets during this time
+367                // which are needed to map SSRCs to `UserId`s.
+368                tx.send(WsMessage::Deliver(other))?;
+369            },
+370        }
+371    }
+372}
\ No newline at end of file diff --git a/next/src/songbird/driver/crypto.rs.html b/next/src/songbird/driver/crypto.rs.html new file mode 100644 index 0000000..e85d43c --- /dev/null +++ b/next/src/songbird/driver/crypto.rs.html @@ -0,0 +1,587 @@ +crypto.rs - source

songbird/driver/
crypto.rs

1//! Encryption schemes supported by Discord's secure RTP negotiation.
+2#[cfg(any(feature = "receive", test))]
+3use super::tasks::error::Error as InternalError;
+4use aead::AeadCore;
+5use aes_gcm::{AeadInPlace, Aes256Gcm, Error as CryptoError};
+6use byteorder::{NetworkEndian, WriteBytesExt};
+7use chacha20poly1305::XChaCha20Poly1305;
+8use crypto_common::{InvalidLength, KeyInit};
+9#[cfg(feature = "receive")]
+10use discortp::rtcp::MutableRtcpPacket;
+11use discortp::MutablePacket;
+12#[cfg(any(feature = "receive", test))]
+13use discortp::{
+14    rtp::{MutableRtpPacket, RtpExtensionPacket},
+15    Packet,
+16};
+17use std::{num::Wrapping, str::FromStr};
+18use typenum::Unsigned;
+19
+20use crate::error::ConnectionError;
+21
+22/// Encryption schemes supportd by Discord.
+23#[derive(Clone, Copy, Debug, Eq, PartialEq, Default, Hash)]
+24#[non_exhaustive]
+25pub enum CryptoMode {
+26    #[default]
+27    /// Discord's currently preferred non-E2EE encryption scheme.
+28    ///
+29    /// Packets are encrypted and decrypted using the `AES256GCM` encryption scheme.
+30    /// An additional random 4B suffix is used as the source of nonce bytes for the packet.
+31    /// This nonce value increments by `1` with each packet.
+32    ///
+33    /// Encrypted content begins *after* the RTP header and extensions, following the SRTP
+34    /// specification.
+35    ///
+36    /// Nonce width of 4B (32b), at an extra 4B per packet (~0.2 kB/s).
+37    Aes256Gcm,
+38    /// A fallback non-E2EE encryption scheme.
+39    ///
+40    /// Packets are encrypted and decrypted using the `XChaCha20Poly1305` encryption scheme.
+41    /// An additional random 4B suffix is used as the source of nonce bytes for the packet.
+42    /// This nonce value increments by `1` with each packet.
+43    ///
+44    /// Encrypted content begins *after* the RTP header and extensions, following the SRTP
+45    /// specification.
+46    ///
+47    /// Nonce width of 4B (32b), at an extra 4B per packet (~0.2 kB/s).
+48    XChaCha20Poly1305,
+49}
+50
+51impl From<CryptoState> for CryptoMode {
+52    fn from(val: CryptoState) -> Self {
+53        match val {
+54            CryptoState::Aes256Gcm(_) => Self::Aes256Gcm,
+55            CryptoState::XChaCha20Poly1305(_) => Self::XChaCha20Poly1305,
+56        }
+57    }
+58}
+59
+60/// The input string could not be parsed as an encryption scheme supported by songbird.
+61#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
+62pub struct UnrecognisedCryptoMode;
+63
+64impl FromStr for CryptoMode {
+65    type Err = UnrecognisedCryptoMode;
+66
+67    fn from_str(s: &str) -> Result<Self, Self::Err> {
+68        match s {
+69            "aead_aes256_gcm_rtpsize" => Ok(Self::Aes256Gcm),
+70            "aead_xchacha20_poly1305_rtpsize" => Ok(Self::XChaCha20Poly1305),
+71            _ => Err(UnrecognisedCryptoMode),
+72        }
+73    }
+74}
+75
+76impl CryptoMode {
+77    /// Returns the underlying crypto algorithm used by a given [`CryptoMode`].
+78    #[must_use]
+79    pub(crate) const fn algorithm(self) -> EncryptionAlgorithm {
+80        match self {
+81            CryptoMode::Aes256Gcm => EncryptionAlgorithm::Aes256Gcm,
+82            CryptoMode::XChaCha20Poly1305 => EncryptionAlgorithm::XChaCha20Poly1305,
+83        }
+84    }
+85
+86    /// Returns an encryption cipher based on the supplied key.
+87    ///
+88    /// Creation fails if the key is the incorrect length for the target cipher.
+89    pub(crate) fn cipher_from_key(self, key: &[u8]) -> Result<Cipher, InvalidLength> {
+90        match self.algorithm() {
+91            EncryptionAlgorithm::Aes256Gcm => Aes256Gcm::new_from_slice(key)
+92                .map(Box::new)
+93                .map(Cipher::Aes256Gcm),
+94            EncryptionAlgorithm::XChaCha20Poly1305 =>
+95                XChaCha20Poly1305::new_from_slice(key).map(Cipher::XChaCha20Poly1305),
+96        }
+97    }
+98
+99    /// Returns a local priority score for a given [`CryptoMode`].
+100    ///
+101    /// Higher values are preferred.
+102    #[must_use]
+103    pub(crate) fn priority(self) -> u64 {
+104        match self {
+105            CryptoMode::Aes256Gcm => 1,
+106            CryptoMode::XChaCha20Poly1305 => 0,
+107        }
+108    }
+109
+110    /// Returns the best available crypto mode, given the `modes` offered by the Discord voice server.
+111    ///
+112    /// If `preferred` is set and the mode exists in the server's supported algorithms, then that
+113    /// mode will be chosen. Otherwise we select the highest-scoring option which is mutually understood.
+114    pub(crate) fn negotiate<It, T>(
+115        modes: It,
+116        preferred: Option<Self>,
+117    ) -> Result<Self, ConnectionError>
+118    where
+119        T: AsRef<str>,
+120        It: IntoIterator<Item = T>,
+121    {
+122        let mut best = None;
+123        for el in modes {
+124            let Ok(el) = CryptoMode::from_str(el.as_ref()) else {
+125                // Unsupported mode. Ignore.
+126                continue;
+127            };
+128
+129            let mut el_priority = el.priority();
+130            if let Some(preferred) = preferred {
+131                if el == preferred {
+132                    el_priority = u64::MAX;
+133                }
+134            }
+135
+136            let accept = match best {
+137                None => true,
+138                Some((_, score)) if el_priority > score => true,
+139                _ => false,
+140            };
+141
+142            if accept {
+143                best = Some((el, el_priority));
+144            }
+145        }
+146
+147        best.map(|(v, _)| v)
+148            .ok_or(ConnectionError::CryptoModeUnavailable)
+149    }
+150
+151    /// Returns the name of a mode as it will appear during negotiation.
+152    #[must_use]
+153    pub const fn to_request_str(self) -> &'static str {
+154        match self {
+155            Self::Aes256Gcm => "aead_aes256_gcm_rtpsize",
+156            Self::XChaCha20Poly1305 => "aead_xchacha20_poly1305_rtpsize",
+157        }
+158    }
+159
+160    /// Returns the nonce length in bytes required by algorithm.
+161    #[must_use]
+162    pub const fn algorithm_nonce_size(self) -> usize {
+163        use typenum::Unsigned as _;
+164        match self {
+165            Self::XChaCha20Poly1305 => <XChaCha20Poly1305 as AeadCore>::NonceSize::USIZE, // => 24
+166            Self::Aes256Gcm => <Aes256Gcm as AeadCore>::NonceSize::USIZE,                 // => 12
+167        }
+168    }
+169
+170    /// Returns the number of bytes each nonce is stored as within
+171    /// a packet.
+172    #[must_use]
+173    pub const fn nonce_size(self) -> usize {
+174        match self {
+175            Self::Aes256Gcm | Self::XChaCha20Poly1305 => 4,
+176        }
+177    }
+178
+179    /// Returns the number of bytes occupied by the encryption scheme
+180    /// which fall before the payload.
+181    ///
+182    /// Method name duplicated until v0.5, to prevent breaking change.
+183    #[must_use]
+184    pub(crate) const fn payload_prefix_len(self) -> usize {
+185        match self {
+186            CryptoMode::Aes256Gcm | CryptoMode::XChaCha20Poly1305 => 0,
+187        }
+188    }
+189
+190    /// Returns the tag length in bytes.
+191    #[must_use]
+192    pub(crate) const fn encryption_tag_len(self) -> usize {
+193        self.algorithm().encryption_tag_len()
+194    }
+195
+196    /// Returns the number of bytes occupied by the encryption scheme
+197    /// which fall after the payload.
+198    #[must_use]
+199    pub const fn payload_suffix_len(self) -> usize {
+200        self.nonce_size() + self.encryption_tag_len()
+201    }
+202
+203    /// Returns the number of bytes occupied by an encryption scheme's tag which
+204    /// fall *after* the payload.
+205    #[must_use]
+206    pub const fn tag_suffix_len(self) -> usize {
+207        self.encryption_tag_len()
+208    }
+209
+210    /// Calculates the number of additional bytes required compared
+211    /// to an unencrypted payload.
+212    #[must_use]
+213    pub const fn payload_overhead(self) -> usize {
+214        self.payload_prefix_len() + self.payload_suffix_len()
+215    }
+216
+217    /// Extracts the byte slice in a packet used as the nonce, and the remaining mutable
+218    /// portion of the packet.
+219    fn nonce_slice<'a>(
+220        self,
+221        _header: &'a [u8],
+222        body: &'a mut [u8],
+223    ) -> Result<(&'a [u8], &'a mut [u8]), CryptoError> {
+224        match self {
+225            Self::Aes256Gcm | Self::XChaCha20Poly1305 => {
+226                let len = body.len();
+227                if len < self.payload_suffix_len() {
+228                    Err(CryptoError)
+229                } else {
+230                    let (body_left, nonce_loc) = body.split_at_mut(len - self.nonce_size());
+231                    Ok((nonce_loc, body_left))
+232                }
+233            },
+234        }
+235    }
+236}
+237
+238/// State used in nonce generation for the encryption variants in [`CryptoMode`].
+239#[derive(Clone, Copy, Debug, Eq, PartialEq)]
+240#[non_exhaustive]
+241pub enum CryptoState {
+242    /// An additional random 4B suffix is used as the source of nonce bytes for the packet.
+243    /// This nonce value increments by `1` with each packet.
+244    ///
+245    /// The last used nonce is stored.
+246    Aes256Gcm(Wrapping<u32>),
+247    /// An additional random 4B suffix is used as the source of nonce bytes for the packet.
+248    /// This nonce value increments by `1` with each packet.
+249    ///
+250    /// The last used nonce is stored.
+251    XChaCha20Poly1305(Wrapping<u32>),
+252}
+253
+254impl From<CryptoMode> for CryptoState {
+255    fn from(val: CryptoMode) -> Self {
+256        match val {
+257            CryptoMode::Aes256Gcm => CryptoState::Aes256Gcm(Wrapping(rand::random::<u32>())),
+258            CryptoMode::XChaCha20Poly1305 =>
+259                CryptoState::XChaCha20Poly1305(Wrapping(rand::random::<u32>())),
+260        }
+261    }
+262}
+263
+264impl CryptoState {
+265    /// Writes packet nonce into the body, if required, returning the new length.
+266    pub fn write_packet_nonce(
+267        &mut self,
+268        packet: &mut impl MutablePacket,
+269        payload_end: usize,
+270    ) -> usize {
+271        let mode = self.kind();
+272        let endpoint = payload_end + mode.payload_suffix_len();
+273        let startpoint = endpoint - mode.nonce_size();
+274
+275        match self {
+276            Self::Aes256Gcm(ref mut i) | Self::XChaCha20Poly1305(ref mut i) => {
+277                (&mut packet.payload_mut()[startpoint..endpoint])
+278                    .write_u32::<NetworkEndian>(i.0)
+279                    .expect(
+280                        "Nonce size is guaranteed to be sufficient to write u32 for lite tagging.",
+281                    );
+282                *i += Wrapping(1);
+283            },
+284        }
+285
+286        endpoint
+287    }
+288
+289    /// Returns the underlying (stateless) type of the active crypto mode.
+290    #[must_use]
+291    pub fn kind(self) -> CryptoMode {
+292        CryptoMode::from(self)
+293    }
+294}
+295
+296#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
+297pub(crate) enum EncryptionAlgorithm {
+298    Aes256Gcm,
+299    XChaCha20Poly1305,
+300}
+301
+302impl EncryptionAlgorithm {
+303    #[must_use]
+304    pub(crate) const fn encryption_tag_len(self) -> usize {
+305        match self {
+306            Self::Aes256Gcm => <Aes256Gcm as AeadCore>::TagSize::USIZE, // 16
+307            Self::XChaCha20Poly1305 => <XChaCha20Poly1305 as AeadCore>::TagSize::USIZE, // 16
+308        }
+309    }
+310}
+311
+312impl From<&Cipher> for EncryptionAlgorithm {
+313    fn from(value: &Cipher) -> Self {
+314        match value {
+315            Cipher::XChaCha20Poly1305(_) => EncryptionAlgorithm::XChaCha20Poly1305,
+316            Cipher::Aes256Gcm(_) => EncryptionAlgorithm::Aes256Gcm,
+317        }
+318    }
+319}
+320
+321#[derive(Clone)]
+322pub enum Cipher {
+323    XChaCha20Poly1305(XChaCha20Poly1305),
+324    Aes256Gcm(Box<Aes256Gcm>),
+325}
+326
+327impl Cipher {
+328    #[must_use]
+329    pub(crate) fn mode(&self) -> CryptoMode {
+330        match self {
+331            Cipher::XChaCha20Poly1305(_) => CryptoMode::XChaCha20Poly1305,
+332            Cipher::Aes256Gcm(_) => CryptoMode::Aes256Gcm,
+333        }
+334    }
+335
+336    #[must_use]
+337    pub(crate) fn encryption_tag_len(&self) -> usize {
+338        EncryptionAlgorithm::from(self).encryption_tag_len()
+339    }
+340
+341    /// Encrypts a Discord RT(C)P packet using the given key.
+342    ///
+343    /// Use of this requires that the input packet has had a nonce generated in the correct location,
+344    /// and `payload_len` specifies the number of bytes after the header including this nonce.
+345    #[inline]
+346    pub fn encrypt_pkt_in_place(
+347        &self,
+348        packet: &mut impl MutablePacket,
+349        payload_len: usize,
+350    ) -> Result<(), CryptoError> {
+351        let mode = self.mode();
+352        let header_len = packet.packet().len() - packet.payload().len();
+353
+354        let (header, body) = packet.packet_mut().split_at_mut(header_len);
+355        let (slice_to_use, body_remaining) = mode.nonce_slice(header, &mut body[..payload_len])?;
+356
+357        let tag_size = self.encryption_tag_len();
+358
+359        // body_remaining is now correctly truncated to exclude the nonce by this point.
+360        // the true_payload to encrypt is within the buf[prefix:-suffix].
+361        let (_, body_remaining) = body_remaining.split_at_mut(mode.payload_prefix_len());
+362        let (body, post_payload) =
+363            body_remaining.split_at_mut(body_remaining.len() - mode.tag_suffix_len());
+364
+365        // All these Nonce types are distinct at the type level
+366        // (96b for AES, 192b for XChaCha).
+367        match self {
+368            // The below variants follow part of the SRTP spec (RFC3711, sec 3.1)
+369            // by requiring that we include the cleartext header portion as
+370            // authenticated data.
+371            Self::Aes256Gcm(aes_gcm) => {
+372                let mut nonce = aes_gcm::Nonce::default();
+373                nonce[..mode.nonce_size()].copy_from_slice(slice_to_use);
+374
+375                let tag = aes_gcm.encrypt_in_place_detached(&nonce, header, body)?;
+376                post_payload[..tag_size].copy_from_slice(&tag[..]);
+377            },
+378            Self::XChaCha20Poly1305(cha_cha_poly1305) => {
+379                let mut nonce = chacha20poly1305::XNonce::default();
+380                nonce[..mode.nonce_size()].copy_from_slice(slice_to_use);
+381
+382                let tag = cha_cha_poly1305.encrypt_in_place_detached(&nonce, header, body)?;
+383                post_payload[..tag_size].copy_from_slice(&tag[..]);
+384            },
+385        }
+386
+387        Ok(())
+388    }
+389
+390    #[cfg(any(feature = "receive", test))]
+391    pub(crate) fn decrypt_rtp_in_place(
+392        &self,
+393        packet: &mut MutableRtpPacket<'_>,
+394    ) -> Result<(usize, usize), InternalError> {
+395        // An exciting difference from the SRTP spec: Discord begins encryption
+396        // after the RTP extension *header*, encrypting the extensions themselves,
+397        // whereas the spec leaves all extensions in the clear.
+398        // This header is described as the 'extension preamble'.
+399        let has_extension = packet.get_extension() != 0;
+400
+401        let plain_bytes = if has_extension {
+402            // CSRCs and extension bytes will be in the plaintext segment.
+403            // We will need these demarcated to select the right bytes to
+404            // decrypt, and to use as auth data.
+405            RtpExtensionPacket::minimum_packet_size()
+406        } else {
+407            0
+408        };
+409
+410        let (_, end) = self.decrypt_pkt_in_place(packet, plain_bytes)?;
+411
+412        // Update the start estimate to account for bytes occupied by extension headers.
+413        let payload_offset = if has_extension {
+414            let payload = packet.payload();
+415            let extension =
+416                RtpExtensionPacket::new(payload).ok_or(InternalError::IllegalVoicePacket)?;
+417            extension.packet().len() - extension.payload().len()
+418        } else {
+419            0
+420        };
+421
+422        Ok((payload_offset, end))
+423    }
+424
+425    #[cfg(feature = "receive")]
+426    pub(crate) fn decrypt_rtcp_in_place(
+427        &self,
+428        packet: &mut MutableRtcpPacket<'_>,
+429    ) -> Result<(usize, usize), InternalError> {
+430        // RTCP/SRTCP have identical handling -- no var-length elements
+431        // are included as part of the plaintext.
+432        self.decrypt_pkt_in_place(packet, 0)
+433    }
+434
+435    /// Decrypts an arbitrary packet using the given key.
+436    ///
+437    /// If successful, this returns the number of bytes to be ignored from the
+438    /// start and end of the packet payload.
+439    #[inline]
+440    #[cfg(any(feature = "receive", test))]
+441    pub(crate) fn decrypt_pkt_in_place(
+442        &self,
+443        packet: &mut impl MutablePacket,
+444        n_plaintext_body_bytes: usize,
+445    ) -> Result<(usize, usize), InternalError> {
+446        let mode = self.mode();
+447        let header_len = packet.packet().len() - packet.payload().len();
+448        let plaintext_end = header_len + n_plaintext_body_bytes;
+449
+450        let (plaintext, ciphertext) =
+451            split_at_mut_checked(packet.packet_mut(), plaintext_end).ok_or(CryptoError)?;
+452        let (slice_to_use, body_remaining) = mode.nonce_slice(plaintext, ciphertext)?;
+453
+454        let (pre_payload, body_remaining) =
+455            split_at_mut_checked(body_remaining, mode.payload_prefix_len()).ok_or(CryptoError)?;
+456
+457        let suffix_split_point = body_remaining
+458            .len()
+459            .checked_sub(mode.tag_suffix_len())
+460            .ok_or(CryptoError)?;
+461
+462        let (body, post_payload) =
+463            split_at_mut_checked(body_remaining, suffix_split_point).ok_or(CryptoError)?;
+464
+465        let tag_size = self.encryption_tag_len();
+466
+467        match self {
+468            // The below variants follow part of the SRTP spec (RFC3711, sec 3.1)
+469            // by requiring that we include the cleartext header portion as
+470            // authenticated data.
+471            Self::Aes256Gcm(aes_gcm) => {
+472                let mut nonce = aes_gcm::Nonce::default();
+473                nonce[..mode.nonce_size()].copy_from_slice(slice_to_use);
+474
+475                let tag = aes_gcm::Tag::from_slice(&post_payload[..tag_size]);
+476                aes_gcm.decrypt_in_place_detached(&nonce, plaintext, body, tag)?;
+477            },
+478            Self::XChaCha20Poly1305(cha_cha_poly1305) => {
+479                let mut nonce = chacha20poly1305::XNonce::default();
+480                nonce[..mode.nonce_size()].copy_from_slice(slice_to_use);
+481
+482                let tag = chacha20poly1305::Tag::from_slice(&post_payload[..tag_size]);
+483                cha_cha_poly1305.decrypt_in_place_detached(&nonce, plaintext, body, tag)?;
+484            },
+485        }
+486
+487        Ok((
+488            plaintext_end + pre_payload.len(),
+489            post_payload.len() + slice_to_use.len(),
+490        ))
+491    }
+492}
+493
+494// Temporary functions -- MSRV is ostensibly 1.74, slice::split_at(_mut)_checked is 1.80+.
+495// TODO: Remove in v0.5+ with MSRV bump to 1.81+.
+496#[cfg(any(feature = "receive", test))]
+497#[inline]
+498#[must_use]
+499fn split_at_mut_checked(els: &mut [u8], mid: usize) -> Option<(&mut [u8], &mut [u8])> {
+500    if mid <= els.len() {
+501        Some(els.split_at_mut(mid))
+502    } else {
+503        None
+504    }
+505}
+506
+507#[cfg(test)]
+508mod test {
+509    use super::*;
+510    use discortp::rtp::MutableRtpPacket;
+511
+512    #[test]
+513
+514    fn small_packet_decrypts_error() {
+515        let mut buf = [0u8; MutableRtpPacket::minimum_packet_size()];
+516        let modes = [CryptoMode::Aes256Gcm, CryptoMode::XChaCha20Poly1305];
+517        let mut pkt = MutableRtpPacket::new(&mut buf[..]).unwrap();
+518
+519        for mode in modes {
+520            // Coincidentally, these are all 32B for now.
+521            let cipher = mode.cipher_from_key(&[1u8; 32]).unwrap();
+522            // AIM: should error, and not panic.
+523            assert!(cipher.decrypt_rtp_in_place(&mut pkt).is_err());
+524        }
+525    }
+526
+527    #[test]
+528    fn symmetric_encrypt_decrypt_tag_after_data() {
+529        const TRUE_PAYLOAD: [u8; 8] = [1, 2, 3, 4, 5, 6, 7, 8];
+530        for mode in [CryptoMode::Aes256Gcm, CryptoMode::XChaCha20Poly1305] {
+531            let mut buf = vec![
+532                0u8;
+533                MutableRtpPacket::minimum_packet_size()
+534                    + TRUE_PAYLOAD.len()
+535                    + mode.nonce_size()
+536                    + mode.encryption_tag_len()
+537            ];
+538
+539            buf.fill(0);
+540            let cipher = mode.cipher_from_key(&[7u8; 32]).unwrap();
+541            let mut pkt = MutableRtpPacket::new(&mut buf[..]).unwrap();
+542            let mut crypto_state = CryptoState::from(mode);
+543            let payload = pkt.payload_mut();
+544            payload[mode.payload_prefix_len()..TRUE_PAYLOAD.len()].copy_from_slice(&TRUE_PAYLOAD);
+545
+546            let final_payload_size = crypto_state.write_packet_nonce(&mut pkt, TRUE_PAYLOAD.len());
+547
+548            let enc_succ = cipher.encrypt_pkt_in_place(&mut pkt, final_payload_size);
+549
+550            assert!(enc_succ.is_ok());
+551
+552            let final_pkt_len = MutableRtpPacket::minimum_packet_size() + final_payload_size;
+553            let mut pkt = MutableRtpPacket::new(&mut buf[..final_pkt_len]).unwrap();
+554
+555            assert!(cipher.decrypt_rtp_in_place(&mut pkt).is_ok());
+556        }
+557    }
+558
+559    #[test]
+560
+561    fn negotiate_cryptomode() {
+562        // If we have no preference (or our preference is missing), choose the highest available in the set.
+563        let test_set =
+564            [CryptoMode::XChaCha20Poly1305, CryptoMode::Aes256Gcm].map(CryptoMode::to_request_str);
+565        assert_eq!(
+566            CryptoMode::negotiate(test_set, None).unwrap(),
+567            CryptoMode::Aes256Gcm
+568        );
+569
+570        let test_set_missing = [CryptoMode::XChaCha20Poly1305].map(CryptoMode::to_request_str);
+571        assert_eq!(
+572            CryptoMode::negotiate(test_set_missing, Some(CryptoMode::Aes256Gcm)).unwrap(),
+573            CryptoMode::XChaCha20Poly1305
+574        );
+575
+576        // Preference wins in spite of the defined `priority` value.
+577        assert_eq!(
+578            CryptoMode::negotiate(test_set, Some(CryptoMode::XChaCha20Poly1305)).unwrap(),
+579            CryptoMode::XChaCha20Poly1305
+580        );
+581
+582        // If there is no mutual intelligibility, return an error.
+583        let bad_modes = ["not_real", "des", "rc5"];
+584        assert!(CryptoMode::negotiate(bad_modes, None).is_err());
+585        assert!(CryptoMode::negotiate(bad_modes, Some(CryptoMode::Aes256Gcm)).is_err());
+586    }
+587}
\ No newline at end of file diff --git a/next/src/songbird/driver/decode_mode.rs.html b/next/src/songbird/driver/decode_mode.rs.html new file mode 100644 index 0000000..ec2cdb9 --- /dev/null +++ b/next/src/songbird/driver/decode_mode.rs.html @@ -0,0 +1,125 @@ +decode_mode.rs - source

songbird/driver/
decode_mode.rs

1use audiopus::{Channels as OpusChannels, SampleRate as OpusRate};
+2
+3/// Decode behaviour for received RTP packets within the driver.
+4#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
+5#[non_exhaustive]
+6pub enum DecodeMode {
+7    /// Packets received from Discord are handed over to events without any
+8    /// changes applied.
+9    ///
+10    /// No CPU work involved.
+11    Pass,
+12    /// Decrypts the body of each received packet.
+13    ///
+14    /// Small per-packet CPU use.
+15    Decrypt,
+16    /// Decrypts and decodes each received packet, correctly accounting for losses.
+17    ///
+18    /// Larger per-packet CPU use.
+19    Decode(DecodeConfig),
+20}
+21
+22impl DecodeMode {
+23    /// Returns whether this mode will decrypt and decode received packets.
+24    #[must_use]
+25    pub fn should_decode(self) -> bool {
+26        matches!(self, DecodeMode::Decode(..))
+27    }
+28
+29    /// Returns whether this mode will decrypt received packets.
+30    #[must_use]
+31    pub fn should_decrypt(self) -> bool {
+32        self != DecodeMode::Pass
+33    }
+34}
+35
+36/// Configuration for [`DecodeMode::Decode`]
+37#[non_exhaustive]
+38#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Hash)]
+39pub struct DecodeConfig {
+40    /// Configures the channel layout for output audio.
+41    ///
+42    /// Defaults to [`Channels::Stereo`].
+43    pub channels: Channels,
+44
+45    /// Configures the sample rate for output audio.
+46    ///
+47    /// Defaults to [`SampleRate::Hz48000`].
+48    pub sample_rate: SampleRate,
+49}
+50
+51impl DecodeConfig {
+52    /// Creates a new [`DecodeConfig`] with the specified channels and sample rate.
+53    #[must_use]
+54    pub fn new(channels: Channels, sample_rate: SampleRate) -> Self {
+55        Self {
+56            channels,
+57            sample_rate,
+58        }
+59    }
+60}
+61
+62/// The channel layout of output audio when using [`DecodeMode::Decode`].
+63#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Hash)]
+64#[non_exhaustive]
+65pub enum Channels {
+66    /// Decode received audio packets into a single channel.
+67    Mono,
+68    /// Decode received audio packets into two interleaved channels.
+69    ///
+70    /// Received mono packets' samples will automatically be duplicated across
+71    /// both channels.
+72    ///
+73    /// The default choice.
+74    #[default]
+75    Stereo,
+76}
+77
+78impl Channels {
+79    pub(crate) fn channels(self) -> usize {
+80        match self {
+81            Channels::Mono => 1,
+82            Channels::Stereo => 2,
+83        }
+84    }
+85}
+86
+87impl From<Channels> for OpusChannels {
+88    fn from(value: Channels) -> Self {
+89        match value {
+90            Channels::Mono => OpusChannels::Mono,
+91            Channels::Stereo => OpusChannels::Stereo,
+92        }
+93    }
+94}
+95
+96/// The sample rate of output audio when using [`DecodeMode::Decode`].
+97#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Hash)]
+98#[non_exhaustive]
+99pub enum SampleRate {
+100    /// Decode to a sample rate of 8kHz.
+101    Hz8000,
+102    /// Decode to a sample rate of 12kHz.
+103    Hz12000,
+104    /// Decode to a sample rate of 16kHz.
+105    Hz16000,
+106    /// Decode to a sample rate of 24kHz.
+107    Hz24000,
+108    /// Decode to a sample rate of 48kHz.
+109    ///
+110    /// The preferred option for encoding/decoding at or above CD quality.
+111    #[default]
+112    Hz48000,
+113}
+114
+115impl From<SampleRate> for OpusRate {
+116    fn from(value: SampleRate) -> Self {
+117        match value {
+118            SampleRate::Hz8000 => OpusRate::Hz8000,
+119            SampleRate::Hz12000 => OpusRate::Hz12000,
+120            SampleRate::Hz16000 => OpusRate::Hz16000,
+121            SampleRate::Hz24000 => OpusRate::Hz24000,
+122            SampleRate::Hz48000 => OpusRate::Hz48000,
+123        }
+124    }
+125}
\ No newline at end of file diff --git a/next/src/songbird/driver/mix_mode.rs.html b/next/src/songbird/driver/mix_mode.rs.html new file mode 100644 index 0000000..7c7e817 --- /dev/null +++ b/next/src/songbird/driver/mix_mode.rs.html @@ -0,0 +1,59 @@ +mix_mode.rs - source

songbird/driver/
mix_mode.rs

1use audiopus::Channels;
+2use symphonia_core::audio::Layout;
+3
+4use crate::constants::{MONO_FRAME_SIZE, STEREO_FRAME_SIZE};
+5
+6/// Mixing behaviour for sent audio sources processed within the driver.
+7///
+8/// This has no impact on Opus packet passthrough, which will pass packets
+9/// irrespective of their channel count.
+10#[derive(Clone, Copy, Debug, Eq, PartialEq)]
+11pub enum MixMode {
+12    /// Audio sources will be downmixed into a mono buffer.
+13    Mono,
+14    /// Audio sources will be mixed into into a stereo buffer, where mono sources
+15    /// will be duplicated into both channels.
+16    Stereo,
+17}
+18
+19impl MixMode {
+20    pub(crate) const fn to_opus(self) -> Channels {
+21        match self {
+22            Self::Mono => Channels::Mono,
+23            Self::Stereo => Channels::Stereo,
+24        }
+25    }
+26
+27    pub(crate) const fn sample_count_in_frame(self) -> usize {
+28        match self {
+29            Self::Mono => MONO_FRAME_SIZE,
+30            Self::Stereo => STEREO_FRAME_SIZE,
+31        }
+32    }
+33
+34    pub(crate) const fn channels(self) -> usize {
+35        match self {
+36            Self::Mono => 1,
+37            Self::Stereo => 2,
+38        }
+39    }
+40
+41    pub(crate) const fn symph_layout(self) -> Layout {
+42        match self {
+43            Self::Mono => Layout::Mono,
+44            Self::Stereo => Layout::Stereo,
+45        }
+46    }
+47}
+48
+49impl From<MixMode> for Layout {
+50    fn from(val: MixMode) -> Self {
+51        val.symph_layout()
+52    }
+53}
+54
+55impl From<MixMode> for Channels {
+56    fn from(val: MixMode) -> Self {
+57        val.to_opus()
+58    }
+59}
\ No newline at end of file diff --git a/next/src/songbird/driver/mod.rs.html b/next/src/songbird/driver/mod.rs.html new file mode 100644 index 0000000..96da63b --- /dev/null +++ b/next/src/songbird/driver/mod.rs.html @@ -0,0 +1,357 @@ +mod.rs - source

songbird/driver/
mod.rs

1//! Runner for a voice connection.
+2//!
+3//! Songbird's driver is a mixed-sync system, using:
+4//!  * Asynchronous connection management, event-handling, and gateway integration.
+5//!  * Synchronous audio mixing, packet generation, and encoding.
+6//!
+7//! This splits up work according to its IO/compute bound nature, preventing packet
+8//! generation from being slowed down past its deadline, or from affecting other
+9//! asynchronous tasks your bot must handle.
+10
+11#[cfg(feature = "internals")]
+12pub mod bench_internals;
+13
+14pub(crate) mod connection;
+15mod crypto;
+16#[cfg(feature = "receive")]
+17mod decode_mode;
+18mod mix_mode;
+19pub mod retry;
+20mod scheduler;
+21pub(crate) mod tasks;
+22#[cfg(test)]
+23pub(crate) mod test_config;
+24#[cfg(any(test, feature = "internals"))]
+25mod test_impls;
+26
+27use connection::error::{Error, Result};
+28pub use crypto::CryptoMode;
+29pub(crate) use crypto::CryptoState;
+30#[cfg(feature = "receive")]
+31pub use decode_mode::*;
+32pub use mix_mode::MixMode;
+33pub use scheduler::{
+34    get_default_scheduler,
+35    Config as SchedulerConfig,
+36    Error as SchedulerError,
+37    LiveStatBlock,
+38    Mode as SchedulerMode,
+39    Scheduler,
+40};
+41#[cfg(test)]
+42pub use test_config::*;
+43#[cfg(any(test, feature = "internals"))]
+44pub use test_impls::*;
+45
+46#[cfg(feature = "builtin-queue")]
+47use crate::tracks::TrackQueue;
+48use crate::{
+49    events::EventData,
+50    input::Input,
+51    tracks::{Track, TrackHandle},
+52    Config,
+53    ConnectionInfo,
+54    Event,
+55    EventHandler,
+56};
+57/// Opus encoder bitrate settings.
+58pub use audiopus::{self as opus, Bitrate};
+59use core::{
+60    future::Future,
+61    pin::Pin,
+62    task::{Context, Poll},
+63};
+64use flume::{r#async::RecvFut, SendError, Sender};
+65#[cfg(feature = "builtin-queue")]
+66use std::time::Duration;
+67#[allow(unused_imports)]
+68pub use tasks::disposal::DisposalThread;
+69use tasks::message::CoreMessage;
+70use tracing::instrument;
+71
+72/// The control object for a Discord voice connection, handling connection,
+73/// mixing, encoding, en/decryption, and event generation.
+74///
+75/// When compiled with the `"builtin-queue"` feature, each driver includes a track queue
+76/// as a convenience to prevent the additional overhead of per-guild state management.
+77#[derive(Clone, Debug)]
+78pub struct Driver {
+79    config: Config,
+80    self_mute: bool,
+81    sender: Sender<CoreMessage>,
+82    // Making this an Option is an abhorrent hack to coerce the borrow checker
+83    // into letting us have an &TrackQueue at the same time as an &mut Driver.
+84    // This is probably preferable to cloning the driver: Arc<...> should be nonzero
+85    // and if the compiler's smart we'll just codegen a pointer swap. It definitely makes
+86    // use of NonZero.
+87    #[cfg(feature = "builtin-queue")]
+88    queue: Option<TrackQueue>,
+89}
+90
+91impl Driver {
+92    /// Creates a new voice driver.
+93    ///
+94    /// This will create the core voice tasks in the background.
+95    #[inline]
+96    #[must_use]
+97    pub fn new(config: Config) -> Self {
+98        let sender = Self::start_inner(config.clone());
+99
+100        Driver {
+101            config,
+102            self_mute: false,
+103            sender,
+104            #[cfg(feature = "builtin-queue")]
+105            queue: Some(TrackQueue::default()),
+106        }
+107    }
+108
+109    fn start_inner(config: Config) -> Sender<CoreMessage> {
+110        let (tx, rx) = flume::unbounded();
+111
+112        tasks::start(config, rx, tx.clone());
+113
+114        tx
+115    }
+116
+117    fn restart_inner(&mut self) {
+118        self.sender = Self::start_inner(self.config.clone());
+119
+120        self.mute(self.self_mute);
+121    }
+122
+123    /// Connects to a voice channel using the specified server.
+124    ///
+125    /// This method instantly contacts the driver tasks, and its
+126    /// does not need to be `await`ed to start the actual connection.
+127    #[instrument(skip(self))]
+128    pub fn connect(&mut self, info: ConnectionInfo) -> Connect {
+129        let (tx, rx) = flume::bounded(1);
+130
+131        self.raw_connect(info, tx);
+132
+133        Connect {
+134            inner: rx.into_recv_async(),
+135        }
+136    }
+137
+138    /// Connects to a voice channel using the specified server.
+139    #[instrument(skip(self))]
+140    pub(crate) fn raw_connect(&mut self, info: ConnectionInfo, tx: Sender<Result<()>>) {
+141        self.send(CoreMessage::ConnectWithResult(info, tx));
+142    }
+143
+144    /// Leaves the current voice channel, disconnecting from it.
+145    ///
+146    /// This does *not* forget settings, like whether to be self-deafened or
+147    /// self-muted.
+148    #[instrument(skip(self))]
+149    pub fn leave(&mut self) {
+150        self.send(CoreMessage::Disconnect);
+151    }
+152
+153    /// Sets whether the current connection is to be muted.
+154    ///
+155    /// If there is no live voice connection, then this only acts as a settings
+156    /// update for future connections.
+157    #[instrument(skip(self))]
+158    pub fn mute(&mut self, mute: bool) {
+159        self.self_mute = mute;
+160        self.send(CoreMessage::Mute(mute));
+161    }
+162
+163    /// Returns whether the driver is muted (i.e., processes audio internally
+164    /// but submits none).
+165    #[instrument(skip(self))]
+166    pub fn is_mute(&self) -> bool {
+167        self.self_mute
+168    }
+169
+170    /// Plays audio from an input, returning a handle for further control.
+171    #[instrument(skip(self, input))]
+172    pub fn play_input(&mut self, input: Input) -> TrackHandle {
+173        self.play(input.into())
+174    }
+175
+176    /// Plays audio from an input, returning a handle for further control.
+177    ///
+178    /// Unlike [`Self::play_input`], this stops all other inputs attached
+179    /// to the channel.
+180    #[instrument(skip(self, input))]
+181    pub fn play_only_input(&mut self, input: Input) -> TrackHandle {
+182        self.play_only(input.into())
+183    }
+184
+185    /// Plays audio from a [`Track`] object.
+186    ///
+187    /// The main difference between this function and [`Self::play_input`] is
+188    /// that this allows for direct manipulation of the [`Track`] object
+189    /// before it is passed over to the voice and mixing contexts.
+190    #[instrument(skip(self, track))]
+191    pub fn play(&mut self, track: Track) -> TrackHandle {
+192        let (handle, ctx) = track.into_context();
+193        self.send(CoreMessage::AddTrack(ctx));
+194
+195        handle
+196    }
+197
+198    /// Exclusively plays audio from a [`Track`] object.
+199    ///
+200    /// As in [`Self::play_only_input`], this stops all other sources attached to the
+201    /// channel. Like [`Self::play`], however, this allows for direct manipulation of the
+202    /// [`Track`] object before it is passed over to the voice and mixing contexts.
+203    #[instrument(skip(self, track))]
+204    pub fn play_only(&mut self, track: Track) -> TrackHandle {
+205        let (handle, ctx) = track.into_context();
+206        self.send(CoreMessage::SetTrack(Some(ctx)));
+207
+208        handle
+209    }
+210
+211    /// Sets the bitrate for encoding Opus packets sent along
+212    /// the channel being managed.
+213    ///
+214    /// The default rate is 128 kbps.
+215    /// Sensible values range between `Bits(512)` and `Bits(512_000)`
+216    /// bits per second.
+217    /// Alternatively, `Auto` and `Max` remain available.
+218    #[instrument(skip(self))]
+219    pub fn set_bitrate(&mut self, bitrate: Bitrate) {
+220        self.send(CoreMessage::SetBitrate(bitrate));
+221    }
+222
+223    /// Stops playing audio from all sources, if any are set.
+224    #[instrument(skip(self))]
+225    pub fn stop(&mut self) {
+226        self.send(CoreMessage::SetTrack(None));
+227    }
+228
+229    /// Sets the configuration for this driver (and parent `Call`, if applicable).
+230    #[instrument(skip(self))]
+231    pub fn set_config(&mut self, config: Config) {
+232        self.config = config.clone();
+233        self.send(CoreMessage::SetConfig(config));
+234    }
+235
+236    /// Returns a view of this driver's configuration.
+237    #[instrument(skip(self))]
+238    pub fn config(&self) -> &Config {
+239        &self.config
+240    }
+241
+242    /// Attach a global event handler to an audio context. Global events may receive
+243    /// any [`EventContext`].
+244    ///
+245    /// Global timing events will tick regardless of whether audio is playing,
+246    /// so long as the bot is connected to a voice channel, and have no tracks.
+247    /// [`TrackEvent`]s will respond to all relevant tracks, giving some audio elements.
+248    ///
+249    /// Users **must** ensure that no costly work or blocking occurs
+250    /// within the supplied function or closure. *Taking excess time could prevent
+251    /// timely sending of packets, causing audio glitches and delays*.
+252    ///
+253    /// [`TrackEvent`]: crate::events::TrackEvent
+254    /// [`EventContext`]: crate::events::EventContext
+255    #[instrument(skip(self, action))]
+256    pub fn add_global_event<F: EventHandler + 'static>(&mut self, event: Event, action: F) {
+257        self.send(CoreMessage::AddEvent(EventData::new(event, action)));
+258    }
+259
+260    /// Removes all global event handlers from an audio context.
+261    #[instrument(skip(self))]
+262    pub fn remove_all_global_events(&mut self) {
+263        self.send(CoreMessage::RemoveGlobalEvents);
+264    }
+265
+266    /// Sends a message to the inner tasks, restarting it if necessary.
+267    fn send(&mut self, status: CoreMessage) {
+268        // Restart thread if it errored.
+269        if let Err(SendError(status)) = self.sender.send(status) {
+270            self.restart_inner();
+271
+272            self.sender.send(status).unwrap();
+273        }
+274    }
+275}
+276
+277#[cfg(feature = "builtin-queue")]
+278impl Driver {
+279    /// Returns a reference to this driver's built-in queue.
+280    ///
+281    /// Requires the `"builtin-queue"` feature.
+282    /// Queue additions should be made via [`Driver::enqueue`] and
+283    /// [`Driver::enqueue_input`].
+284    #[must_use]
+285    pub fn queue(&self) -> &TrackQueue {
+286        self.queue
+287            .as_ref()
+288            .expect("Queue: The only case this can fail is if a previous queue operation panicked.")
+289    }
+290
+291    /// Adds an audio [`Input`] to this driver's built-in queue.
+292    ///
+293    /// Requires the `"builtin-queue"` feature.
+294    pub async fn enqueue_input(&mut self, input: Input) -> TrackHandle {
+295        self.enqueue(input.into()).await
+296    }
+297
+298    /// Adds an existing [`Track`] to this driver's built-in queue.
+299    ///
+300    /// Requires the `"builtin-queue"` feature.
+301    pub async fn enqueue(&mut self, mut track: Track) -> TrackHandle {
+302        let preload_time = TrackQueue::get_preload_time(&mut track).await;
+303        self.enqueue_with_preload(track, preload_time)
+304    }
+305
+306    /// Add an existing [`Track`] to the queue, using a known time to preload the next track.
+307    ///
+308    /// See [`TrackQueue::add_with_preload`] for how `preload_time` is used.
+309    ///
+310    /// Requires the `"builtin-queue"` feature.
+311    pub fn enqueue_with_preload(
+312        &mut self,
+313        track: Track,
+314        preload_time: Option<Duration>,
+315    ) -> TrackHandle {
+316        let queue = self.queue.take().expect(
+317            "Enqueue: The only case this can fail is if a previous queue operation panicked.",
+318        );
+319        let handle = queue.add_with_preload(track, self, preload_time);
+320        self.queue = Some(queue);
+321
+322        handle
+323    }
+324}
+325
+326impl Default for Driver {
+327    fn default() -> Self {
+328        Self::new(Config::default())
+329    }
+330}
+331
+332impl Drop for Driver {
+333    /// Leaves the current connected voice channel, if connected to one, and
+334    /// forgets all configurations relevant to this Handler.
+335    fn drop(&mut self) {
+336        drop(self.sender.send(CoreMessage::Poison));
+337    }
+338}
+339
+340/// Future for a call to [`Driver::connect`].
+341///
+342/// This future awaits the *result* of a connection; the driver
+343/// is messaged at the time of the call.
+344pub struct Connect {
+345    inner: RecvFut<'static, Result<()>>,
+346}
+347
+348impl Future for Connect {
+349    type Output = Result<()>;
+350
+351    fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
+352        match Pin::new(&mut self.inner).poll(cx) {
+353            Poll::Ready(r) => Poll::Ready(r.map_err(|_| Error::AttemptDiscarded).and_then(|x| x)),
+354            Poll::Pending => Poll::Pending,
+355        }
+356    }
+357}
\ No newline at end of file diff --git a/next/src/songbird/driver/retry/mod.rs.html b/next/src/songbird/driver/retry/mod.rs.html new file mode 100644 index 0000000..84d2b3d --- /dev/null +++ b/next/src/songbird/driver/retry/mod.rs.html @@ -0,0 +1,49 @@ +mod.rs - source

songbird/driver/retry/
mod.rs

1//! Configuration for connection retries.
+2
+3mod strategy;
+4
+5pub use self::strategy::*;
+6
+7use std::time::Duration;
+8
+9/// Configuration to be used for retrying driver connection attempts.
+10#[derive(Clone, Copy, Debug, PartialEq)]
+11pub struct Retry {
+12    /// Strategy used to determine how long to wait between retry attempts.
+13    ///
+14    /// *Defaults to an [`ExponentialBackoff`] from 0.25s
+15    /// to 10s, with a jitter of `0.1`.*
+16    ///
+17    /// [`ExponentialBackoff`]: Strategy::Backoff
+18    pub strategy: Strategy,
+19    /// The maximum number of retries to attempt.
+20    ///
+21    /// `None` will attempt an infinite number of retries,
+22    /// while `Some(0)` will attempt to connect *once* (no retries).
+23    ///
+24    /// *Defaults to `Some(5)`.*
+25    pub retry_limit: Option<usize>,
+26}
+27
+28impl Default for Retry {
+29    fn default() -> Self {
+30        Self {
+31            strategy: Strategy::Backoff(ExponentialBackoff::default()),
+32            retry_limit: Some(5),
+33        }
+34    }
+35}
+36
+37impl Retry {
+38    pub(crate) fn retry_in(
+39        &self,
+40        last_wait: Option<Duration>,
+41        attempts: usize,
+42    ) -> Option<Duration> {
+43        if self.retry_limit.map_or(true, |a| attempts < a) {
+44            Some(self.strategy.retry_in(last_wait))
+45        } else {
+46            None
+47        }
+48    }
+49}
\ No newline at end of file diff --git a/next/src/songbird/driver/retry/strategy.rs.html b/next/src/songbird/driver/retry/strategy.rs.html new file mode 100644 index 0000000..73f0d8e --- /dev/null +++ b/next/src/songbird/driver/retry/strategy.rs.html @@ -0,0 +1,76 @@ +strategy.rs - source

songbird/driver/retry/
strategy.rs

1use rand::random;
+2use std::time::Duration;
+3
+4/// Logic used to determine how long to wait between retry attempts.
+5#[derive(Clone, Copy, Debug, PartialEq)]
+6#[non_exhaustive]
+7pub enum Strategy {
+8    /// The driver will wait for the same amount of time between each retry.
+9    Every(Duration),
+10    /// Exponential backoff waiting strategy, where the duration between
+11    /// attempts (approximately) doubles each time.
+12    Backoff(ExponentialBackoff),
+13}
+14
+15impl Strategy {
+16    pub(crate) fn retry_in(&self, last_wait: Option<Duration>) -> Duration {
+17        match self {
+18            Self::Every(t) => *t,
+19            Self::Backoff(exp) => exp.retry_in(last_wait),
+20        }
+21    }
+22}
+23
+24/// Exponential backoff waiting strategy.
+25///
+26/// Each attempt waits for twice the last delay plus/minus a
+27/// random jitter, clamped to a min and max value.
+28#[derive(Clone, Copy, Debug, PartialEq)]
+29pub struct ExponentialBackoff {
+30    /// Minimum amount of time to wait between retries.
+31    ///
+32    /// *Defaults to 0.25s.*
+33    pub min: Duration,
+34    /// Maximum amount of time to wait between retries.
+35    ///
+36    /// This will be clamped to `>=` min.
+37    ///
+38    /// *Defaults to 10s.*
+39    pub max: Duration,
+40    /// Amount of uniform random jitter to apply to generated wait times.
+41    /// I.e., 0.1 will add +/-10% to generated intervals.
+42    ///
+43    /// This is restricted to within +/-100%.
+44    ///
+45    /// *Defaults to `0.1`.*
+46    pub jitter: f32,
+47}
+48
+49impl Default for ExponentialBackoff {
+50    fn default() -> Self {
+51        Self {
+52            min: Duration::from_millis(250),
+53            max: Duration::from_secs(10),
+54            jitter: 0.1,
+55        }
+56    }
+57}
+58
+59impl ExponentialBackoff {
+60    pub(crate) fn retry_in(&self, last_wait: Option<Duration>) -> Duration {
+61        let attempt = last_wait.map_or(self.min, |t| 2 * t);
+62        let perturb = (1.0 - (self.jitter * 2.0 * (random::<f32>() - 1.0))).clamp(0.0, 2.0);
+63        let mut target_time = attempt.mul_f32(perturb);
+64
+65        // Now clamp target time into given range.
+66        let safe_max = if self.max < self.min {
+67            self.min
+68        } else {
+69            self.max
+70        };
+71
+72        target_time = target_time.clamp(self.min, safe_max);
+73
+74        target_time
+75    }
+76}
\ No newline at end of file diff --git a/next/src/songbird/driver/scheduler/config.rs.html b/next/src/songbird/driver/scheduler/config.rs.html new file mode 100644 index 0000000..9856ec0 --- /dev/null +++ b/next/src/songbird/driver/scheduler/config.rs.html @@ -0,0 +1,64 @@ +config.rs - source

songbird/driver/scheduler/
config.rs

1use super::*;
+2
+3/// Configuration for how a [`Scheduler`] handles tasks.
+4///
+5/// [`Scheduler`]: super::Scheduler
+6#[derive(Clone, Debug)]
+7#[non_exhaustive]
+8pub struct Config {
+9    /// How Live mixer tasks will be mapped to individual threads.
+10    ///
+11    /// Defaults to `Mode::MaxPerThread(16)`.
+12    pub strategy: Mode,
+13    /// Move costly mixers to another thread if their parent worker is at
+14    /// risk of missing its deadlines.
+15    ///
+16    /// Defaults to `true`.
+17    pub move_expensive_tasks: bool,
+18}
+19
+20impl Default for Config {
+21    fn default() -> Self {
+22        Self {
+23            strategy: Mode::default(),
+24            move_expensive_tasks: true,
+25        }
+26    }
+27}
+28
+29/// Strategies for mapping live mixer tasks to individual threads.
+30///
+31/// Defaults to `MaxPerThread(16)`.
+32#[derive(Clone, Debug)]
+33#[non_exhaustive]
+34pub enum Mode {
+35    /// Allows at most `n` tasks to run per thread.
+36    MaxPerThread(NonZeroUsize),
+37}
+38
+39impl Mode {
+40    /// Returns the number of `Mixer`s that a scheduler should preallocate
+41    /// resources for.
+42    pub(crate) fn prealloc_size(&self) -> usize {
+43        match self {
+44            Self::MaxPerThread(n) => n.get(),
+45        }
+46    }
+47
+48    /// Returns the maximum number of concurrent mixers that a scheduler is
+49    /// allowed to place on a single thread.
+50    ///
+51    /// Future scheduling modes may choose to limit *only* on execution cost.
+52    #[allow(clippy::unnecessary_wraps)]
+53    pub(crate) fn task_limit(&self) -> Option<usize> {
+54        match self {
+55            Self::MaxPerThread(n) => Some(n.get()),
+56        }
+57    }
+58}
+59
+60impl Default for Mode {
+61    fn default() -> Self {
+62        Self::MaxPerThread(DEFAULT_MIXERS_PER_THREAD)
+63    }
+64}
\ No newline at end of file diff --git a/next/src/songbird/driver/scheduler/idle.rs.html b/next/src/songbird/driver/scheduler/idle.rs.html new file mode 100644 index 0000000..309722a --- /dev/null +++ b/next/src/songbird/driver/scheduler/idle.rs.html @@ -0,0 +1,335 @@ +idle.rs - source

songbird/driver/scheduler/
idle.rs

1use std::{collections::HashMap, time::Duration};
+2
+3use nohash_hasher::{BuildNoHashHasher, IntMap};
+4use tokio::time::{Instant as TokInstant, Interval};
+5use tracing::info;
+6
+7use crate::constants::*;
+8
+9use super::*;
+10
+11const THREAD_CULL_TIMER: Duration = Duration::from_secs(60);
+12
+13/// An async task responsible for maintaining UDP keepalives and event state for inactive
+14/// `Mixer` tasks.
+15pub(crate) struct Idle {
+16    config: Config,
+17    cull_timer: Duration,
+18    tasks: IntMap<TaskId, ParkedMixer>,
+19    // track taskids which are live to prevent their realloc? unlikely w u64 but still
+20    pub(crate) stats: Arc<StatBlock>,
+21    rx: Receiver<SchedulerMessage>,
+22    tx: Sender<SchedulerMessage>,
+23    next_id: TaskId,
+24    next_worker_id: WorkerId,
+25    workers: Vec<Worker>,
+26    to_cull: Vec<TaskId>,
+27}
+28
+29impl Idle {
+30    pub fn new(config: Config) -> (Self, Sender<SchedulerMessage>) {
+31        let (tx, rx) = flume::unbounded();
+32
+33        let stats = Arc::default();
+34        let tasks = HashMap::with_capacity_and_hasher(128, BuildNoHashHasher::default());
+35
+36        // TODO: include heap of keepalive sending times?
+37        let out = Self {
+38            config,
+39            cull_timer: THREAD_CULL_TIMER,
+40            tasks,
+41            stats,
+42            rx,
+43            tx: tx.clone(),
+44            next_id: TaskId::new(),
+45            next_worker_id: WorkerId::new(),
+46            workers: Vec::with_capacity(16),
+47            to_cull: vec![],
+48        };
+49
+50        (out, tx)
+51    }
+52
+53    /// Run the inner task until all external `Scheduler` handles are dropped.
+54    async fn run(&mut self) {
+55        let mut interval = tokio::time::interval(TIMESTEP_LENGTH);
+56        while self.run_once(&mut interval).await {}
+57    }
+58
+59    /// Run one 'tick' of idle thread maintenance.
+60    ///
+61    /// This is a priority system over 2 main tasks:
+62    ///  1) handle scheduling/upgrade/action requests for mixers
+63    ///  2) [every 20ms]tick the main timer for each task, send keepalive if
+64    ///     needed, reclaim & cull workers.
+65    ///
+66    /// Idle mixers spawn an async task each to forward their `MixerMessage`s
+67    /// on to this task to be handled by 1). These tasks self-terminate if a
+68    /// message would make a mixer `now_live`.
+69    async fn run_once(&mut self, interval: &mut Interval) -> bool {
+70        tokio::select! {
+71            biased;
+72            msg = self.rx.recv_async() => match msg {
+73                Ok(SchedulerMessage::NewMixer(rx, ic, cfg)) => {
+74                    let mut mixer = ParkedMixer::new(rx, ic, cfg);
+75                    let id = self.next_id.incr();
+76
+77                    mixer.spawn_forwarder(self.tx.clone(), id);
+78                    self.tasks.insert(id, mixer);
+79                    self.stats.add_idle_mixer();
+80                },
+81                Ok(SchedulerMessage::Demote(id, mut task)) => {
+82                    task.send_gateway_not_speaking();
+83
+84                    task.spawn_forwarder(self.tx.clone(), id);
+85                    self.tasks.insert(id, task);
+86                },
+87                Ok(SchedulerMessage::Do(id, mix_msg)) => {
+88                    let maybe_live = mix_msg.is_mixer_maybe_live();
+89                    if let Some(task) = self.tasks.get_mut(&id) {
+90                        match task.handle_message(mix_msg) {
+91                            Ok(false) if maybe_live => {
+92                                if task.mixer.tracks.is_empty() {
+93                                    // No tracks, likely due to SetConn.
+94                                    // Recreate message forwarding task.
+95                                    task.spawn_forwarder(self.tx.clone(), id);
+96                                } else {
+97                                    let task = self.tasks.remove(&id).unwrap();
+98                                    self.schedule_mixer(task, id, None);
+99                                }
+100                            },
+101                            Ok(false) => {},
+102                            Ok(true) | Err(()) => self.to_cull.push(id),
+103                        }
+104                    } else {
+105                        info!("Received post-cull message for {id:?}, discarding.");
+106                    }
+107                },
+108                Ok(SchedulerMessage::Overspill(worker_id, id, task)) => {
+109                    self.schedule_mixer(task, id, Some(worker_id));
+110                },
+111                Ok(SchedulerMessage::GetStats(tx)) => {
+112                    _ = tx.send(self.workers.iter().map(Worker::stats).collect());
+113                },
+114                Ok(SchedulerMessage::Kill) | Err(_) => {
+115                    return false;
+116                },
+117            },
+118            _ = interval.tick() => {
+119                // TODO: store keepalive sends in another data structure so
+120                // we don't check every task every 20ms.
+121                //
+122                // if we can also make tick handling lazy(er), we can also optimise for that.
+123                let now = TokInstant::now();
+124
+125                for (id, task) in &mut self.tasks {
+126                    // NOTE: this is a non-blocking send so safe from async context.
+127                    if task.tick_and_keepalive(now.into()).is_err() {
+128                        self.to_cull.push(*id);
+129                    }
+130                }
+131
+132                let mut i = 0;
+133                while i < self.workers.len() {
+134                    if let Some(then) = self.workers[i].try_mark_empty(now) {
+135                        if now.duration_since(then) >= self.cull_timer {
+136                            self.workers.swap_remove(i);
+137                            continue;
+138                        }
+139                    }
+140
+141                    i += 1;
+142                }
+143            },
+144        }
+145
+146        for id in self.to_cull.drain(..) {
+147            if let Some(tx) = self.tasks.remove(&id).and_then(|t| t.cull_handle) {
+148                _ = tx.send_async(()).await;
+149            }
+150        }
+151
+152        true
+153    }
+154
+155    /// Promote a task to a live mixer thread.
+156    fn schedule_mixer(&mut self, mut task: ParkedMixer, id: TaskId, avoid: Option<WorkerId>) {
+157        if task.send_gateway_speaking().is_ok() {
+158            // If a worker ever completely fails, then we need to remove it here
+159            // `fetch_worker` will either find another, or generate us a new one if
+160            // none exist.
+161
+162            // We need to track ownership of the task coming back via SendError using this
+163            // Option.
+164            let mut loop_task = Some(task);
+165            loop {
+166                let task = loop_task.take().unwrap();
+167                let (worker, idx) = self.fetch_worker(&task, avoid);
+168                match worker.schedule_mixer(id, task) {
+169                    Ok(()) => {
+170                        self.stats.move_mixer_to_live();
+171                        break;
+172                    },
+173                    Err(e) => {
+174                        loop_task = Some(e.0 .1);
+175                        let worker = self.workers.swap_remove(idx);
+176
+177                        // NOTE: we have incremented worker's live counter for this mixer in
+178                        // `schedule_mixer`.
+179                        // The only time this branch is ever hit is if a worker crashed, so we
+180                        // need to replicate some of their cleanup.
+181                        self.stats
+182                            .remove_live_mixers(worker.stats().live_mixers().saturating_sub(1));
+183                        self.stats.remove_worker();
+184                    },
+185                }
+186            }
+187        }
+188    }
+189
+190    /// Fetch the first `Worker` that has room for a new task, creating one if needed.
+191    ///
+192    /// If an inbound task has spilled from another thread, then do not reschedule it there.
+193    fn fetch_worker(
+194        &mut self,
+195        task: &ParkedMixer,
+196        avoid: Option<WorkerId>,
+197    ) -> (&mut Worker, usize) {
+198        let idx = self
+199            .workers
+200            .iter()
+201            .position(|w| w.can_schedule(task, avoid))
+202            .unwrap_or_else(|| {
+203                self.workers.push(Worker::new(
+204                    self.next_worker_id.incr(),
+205                    self.config.clone(),
+206                    self.tx.clone(),
+207                    self.stats.clone(),
+208                ));
+209                self.stats.add_worker();
+210                self.workers.len() - 1
+211            });
+212
+213        (&mut self.workers[idx], idx)
+214    }
+215
+216    pub fn spawn(mut self) {
+217        tokio::spawn(async move { self.run().await });
+218    }
+219}
+220
+221#[cfg(test)]
+222mod test {
+223    use super::*;
+224    use crate::{
+225        constants::test_data::FILE_WEBM_TARGET,
+226        driver::{tasks::mixer::Mixer, OutputMode},
+227        input::File,
+228        Driver,
+229    };
+230    use tokio::runtime::Handle;
+231
+232    #[tokio::test]
+233    async fn inactive_mixers_dont_need_threads() {
+234        let sched = Scheduler::new(Config::default());
+235        let cfg = DriverConfig::default().scheduler(sched.clone());
+236
+237        let _drivers: Vec<Driver> = (0..1024).map(|_| Driver::new(cfg.clone())).collect();
+238        tokio::time::sleep(Duration::from_secs(1)).await;
+239
+240        assert_eq!(sched.total_tasks(), 1024);
+241        assert_eq!(sched.live_tasks(), 0);
+242        assert_eq!(sched.worker_threads(), 0);
+243    }
+244
+245    #[tokio::test]
+246    async fn active_mixers_spawn_threads() {
+247        let config = Config {
+248            strategy: Mode::default(),
+249            move_expensive_tasks: false,
+250        };
+251
+252        let sched = Scheduler::new(config);
+253        let (pkt_tx, _pkt_rx) = flume::unbounded();
+254        let cfg = DriverConfig::default()
+255            .scheduler(sched.clone())
+256            .override_connection(Some(OutputMode::Rtp(pkt_tx)));
+257
+258        let n_tasks = 1024;
+259
+260        let _drivers: Vec<Driver> = (0..n_tasks)
+261            .map(|_| {
+262                let mut driver = Driver::new(cfg.clone());
+263                let file = File::new(FILE_WEBM_TARGET);
+264                driver.play_input(file.into());
+265                driver
+266            })
+267            .collect();
+268        tokio::time::sleep(Duration::from_secs(10)).await;
+269
+270        assert_eq!(sched.total_tasks(), n_tasks);
+271        assert_eq!(sched.live_tasks(), n_tasks);
+272        assert_eq!(
+273            sched.worker_threads(),
+274            n_tasks / (DEFAULT_MIXERS_PER_THREAD.get() as u64)
+275        );
+276    }
+277
+278    #[tokio::test]
+279    async fn excess_threads_are_cleaned_up() {
+280        const TEST_TIMER: Duration = Duration::from_millis(500);
+281
+282        let config = Config {
+283            strategy: Mode::MaxPerThread(1.try_into().unwrap()),
+284            move_expensive_tasks: true,
+285        };
+286
+287        let (mut core, tx) = Idle::new(config.clone());
+288        core.cull_timer = TEST_TIMER;
+289
+290        let mut next_id = TaskId::new();
+291        let mut thread_id = WorkerId::new();
+292        let mut handles = vec![];
+293        for i in 0..2 {
+294            let mut worker = Worker::new(
+295                thread_id.incr(),
+296                config.clone(),
+297                tx.clone(),
+298                core.stats.clone(),
+299            );
+300            let ((mixer, listeners), track_handle) =
+301                Mixer::test_with_float_unending(Handle::current(), false);
+302
+303            let send_mixer = ParkedMixer {
+304                mixer: Box::new(mixer),
+305                ssrc: i,
+306                rtp_sequence: i as u16,
+307                rtp_timestamp: i,
+308                park_time: TokInstant::now().into(),
+309                last_cost: None,
+310                cull_handle: None,
+311            };
+312            core.stats.add_idle_mixer();
+313            core.stats.move_mixer_to_live();
+314            worker.schedule_mixer(next_id.incr(), send_mixer).unwrap();
+315            handles.push((track_handle, listeners));
+316            core.workers.push(worker);
+317        }
+318
+319        let mut timer = tokio::time::interval(TIMESTEP_LENGTH);
+320        assert!(core.run_once(&mut timer).await);
+321
+322        // Stop one of the handles, allow it to exit, and then run core again.
+323        handles[1].0.stop().unwrap();
+324        while core.workers[1].is_busy() {
+325            assert!(core.run_once(&mut timer).await);
+326        }
+327
+328        tokio::time::sleep(TEST_TIMER + Duration::from_secs(1)).await;
+329        while core.workers.len() != 1 {
+330            assert!(core.run_once(&mut timer).await);
+331        }
+332
+333        assert_eq!(core.stats.worker_threads(), 0);
+334    }
+335}
\ No newline at end of file diff --git a/next/src/songbird/driver/scheduler/live.rs.html b/next/src/songbird/driver/scheduler/live.rs.html new file mode 100644 index 0000000..53db564 --- /dev/null +++ b/next/src/songbird/driver/scheduler/live.rs.html @@ -0,0 +1,824 @@ +live.rs - source

songbird/driver/scheduler/
live.rs

1use std::time::{Duration, Instant};
+2
+3use discortp::rtp::{MutableRtpPacket, RtpPacket};
+4use flume::{SendError, TryRecvError};
+5use tokio::time::Instant as TokInstant;
+6
+7use crate::{
+8    constants::*,
+9    driver::tasks::{error::Error as DriverError, mixer::Mixer},
+10};
+11
+12#[cfg(test)]
+13use crate::driver::test_config::TickStyle;
+14
+15use super::*;
+16
+17/// The send-half of a worker thread, with bookkeeping mechanisms to help
+18/// the idle task schedule incoming tasks.
+19pub struct Worker {
+20    id: WorkerId,
+21    stats: Arc<LiveStatBlock>,
+22    config: Config,
+23    tx: Sender<(TaskId, ParkedMixer)>,
+24    known_empty_since: Option<TokInstant>,
+25}
+26
+27#[allow(missing_docs)]
+28impl Worker {
+29    pub fn new(
+30        id: WorkerId,
+31        config: Config,
+32        sched_tx: Sender<SchedulerMessage>,
+33        global_stats: Arc<StatBlock>,
+34    ) -> Self {
+35        let stats = Arc::new(LiveStatBlock::default());
+36        let (live_tx, live_rx) = flume::unbounded();
+37
+38        let core = Live::new(
+39            id,
+40            config.clone(),
+41            global_stats,
+42            stats.clone(),
+43            live_rx,
+44            sched_tx,
+45        );
+46        core.spawn();
+47
+48        Self {
+49            id,
+50            stats,
+51            config,
+52            tx: live_tx,
+53            known_empty_since: None,
+54        }
+55    }
+56
+57    /// Mark the worker thread as idle from the present time if it reports no tasks.
+58    ///
+59    /// This time information is used for thread culling.
+60    #[inline]
+61    pub fn try_mark_empty(&mut self, now: TokInstant) -> Option<TokInstant> {
+62        if self.stats.live_mixers() == 0 {
+63            self.known_empty_since.get_or_insert(now);
+64        } else {
+65            self.mark_busy();
+66        }
+67
+68        self.known_empty_since
+69    }
+70
+71    /// Unset the thread culling time on this worker.
+72    #[inline]
+73    pub fn mark_busy(&mut self) {
+74        self.known_empty_since = None;
+75    }
+76
+77    #[cfg(test)]
+78    #[inline]
+79    pub fn is_busy(&mut self) -> bool {
+80        self.known_empty_since.is_none()
+81    }
+82
+83    /// Return whether this thread has enough room (task count, spare cycles)
+84    /// for the given task.
+85    #[inline]
+86    #[must_use]
+87    pub fn can_schedule(&self, task: &ParkedMixer, avoid: Option<WorkerId>) -> bool {
+88        avoid.map_or(true, |id| !self.has_id(id))
+89            && self.stats.has_room(&self.config.strategy, task)
+90    }
+91
+92    #[inline]
+93    #[must_use]
+94    pub fn stats(&self) -> Arc<LiveStatBlock> {
+95        self.stats.clone()
+96    }
+97
+98    /// Increment this worker's statistics and hand off a task for execution.
+99    #[inline]
+100    pub fn schedule_mixer(
+101        &mut self,
+102        id: TaskId,
+103        task: ParkedMixer,
+104    ) -> Result<(), SendError<(TaskId, ParkedMixer)>> {
+105        self.mark_busy();
+106        self.stats.add_mixer();
+107        self.tx.send((id, task))
+108    }
+109
+110    #[must_use]
+111    pub fn has_id(&self, id: WorkerId) -> bool {
+112        self.id == id
+113    }
+114}
+115
+116const PACKETS_PER_BLOCK: usize = 16;
+117const MEMORY_CULL_TIMER: Duration = Duration::from_secs(10);
+118
+119/// A synchronous thread responsible for mixing, encoding, encrypting, and
+120/// sending the audio output of many `Mixer`s.
+121///
+122/// `Mixer`s remain `Box`ed due to large move costs, and unboxing them appeared to have
+123/// a 5--10% perf cost from benchmarks.
+124pub struct Live {
+125    packets: Vec<Box<[u8]>>,
+126    packet_lens: Vec<usize>,
+127    #[allow(clippy::vec_box)]
+128    tasks: Vec<Box<Mixer>>,
+129    ids: Vec<TaskId>,
+130    to_cull: Vec<bool>,
+131
+132    deadline: Instant,
+133    start_of_work: Option<Instant>,
+134
+135    id: WorkerId,
+136    config: Config,
+137    stats: Arc<LiveStatBlock>,
+138    global_stats: Arc<StatBlock>,
+139    rx: Receiver<(TaskId, ParkedMixer)>,
+140    tx: Sender<SchedulerMessage>,
+141
+142    excess_buffer_cull_time: Option<Instant>,
+143}
+144
+145#[allow(missing_docs)]
+146impl Live {
+147    pub fn new(
+148        id: WorkerId,
+149        config: Config,
+150        global_stats: Arc<StatBlock>,
+151        stats: Arc<LiveStatBlock>,
+152        rx: Receiver<(TaskId, ParkedMixer)>,
+153        tx: Sender<SchedulerMessage>,
+154    ) -> Self {
+155        let to_prealloc = config.strategy.prealloc_size();
+156
+157        let block_size = config
+158            .strategy
+159            .task_limit()
+160            .unwrap_or(PACKETS_PER_BLOCK)
+161            .min(PACKETS_PER_BLOCK);
+162
+163        let packets = vec![packet_block(block_size)];
+164
+165        Self {
+166            packets,
+167            packet_lens: Vec::with_capacity(to_prealloc),
+168            tasks: Vec::with_capacity(to_prealloc),
+169            ids: Vec::with_capacity(to_prealloc),
+170            to_cull: Vec::with_capacity(to_prealloc),
+171
+172            deadline: Instant::now(),
+173            start_of_work: None,
+174
+175            id,
+176            config,
+177            stats,
+178            global_stats,
+179            rx,
+180            tx,
+181
+182            excess_buffer_cull_time: None,
+183        }
+184    }
+185
+186    #[inline]
+187    fn run(&mut self) {
+188        while self.run_once() {}
+189        self.global_stats.remove_worker();
+190    }
+191
+192    /// Returns whether the loop should exit (i.e., culled by main `Scheduler`).
+193    #[inline]
+194    pub fn run_once(&mut self) -> bool {
+195        // Check for new tasks.
+196        if self.handle_scheduler_msgs().is_err() {
+197            return false;
+198        }
+199
+200        // Receive commands for each task.
+201        self.handle_task_msgs();
+202
+203        // Move any idle calls back to the global pool.
+204        self.demote_and_remove_mixers();
+205
+206        // Take a clock measure before and after each packet.
+207        let mut pre_pkt_time = Instant::now();
+208        let mut worst_task = (0, Duration::default());
+209
+210        for (i, (packet_len, mixer)) in self
+211            .packet_lens
+212            .iter_mut()
+213            .zip(self.tasks.iter_mut())
+214            .enumerate()
+215        {
+216            let (block, inner) = get_memory_indices(i);
+217            match mixer.mix_and_build_packet(&mut self.packets[block][inner..][..VOICE_PACKET_MAX])
+218            {
+219                Ok(written_sz) => *packet_len = written_sz,
+220                e => {
+221                    *packet_len = 0;
+222                    rebuild_if_err(mixer, e, &mut self.to_cull, i);
+223                },
+224            }
+225            let post_pkt_time = Instant::now();
+226            let cost = post_pkt_time.duration_since(pre_pkt_time);
+227            if cost > worst_task.1 {
+228                worst_task = (i, cost);
+229            }
+230            pre_pkt_time = post_pkt_time;
+231        }
+232
+233        let end_of_work = pre_pkt_time;
+234
+235        if let Some(start_of_work) = self.start_of_work {
+236            let ns_cost = self.stats.store_compute_cost(end_of_work - start_of_work);
+237
+238            if self.config.move_expensive_tasks
+239                && ns_cost >= RESCHEDULE_THRESHOLD
+240                && self.ids.len() > 1
+241            {
+242                self.offload_mixer(worst_task.0, worst_task.1);
+243            }
+244        }
+245
+246        self.timed_remove_excess_blocks(end_of_work);
+247
+248        // Wait till the right time to send this packet:
+249        // usually a 20ms tick, in test modes this is either a finite number of runs or user input.
+250        self.march_deadline();
+251
+252        // Send all.
+253        self.start_of_work = Some(Instant::now());
+254        for (i, (packet_len, mixer)) in self
+255            .packet_lens
+256            .iter_mut()
+257            .zip(self.tasks.iter_mut())
+258            .enumerate()
+259        {
+260            let (block, inner) = get_memory_indices(i);
+261            let packet = &mut self.packets[block][inner..];
+262            if *packet_len > 0 {
+263                let res = mixer.send_packet(&packet[..*packet_len]);
+264                rebuild_if_err(mixer, res, &mut self.to_cull, i);
+265            }
+266            #[cfg(test)]
+267            if *packet_len == 0 {
+268                mixer.test_signal_empty_tick();
+269            }
+270            advance_rtp_counters(packet);
+271        }
+272
+273        for (i, mixer) in self.tasks.iter_mut().enumerate() {
+274            let res = mixer
+275                .audio_commands_events()
+276                .and_then(|()| mixer.check_and_send_keepalive(self.start_of_work));
+277            rebuild_if_err(mixer, res, &mut self.to_cull, i);
+278        }
+279
+280        true
+281    }
+282
+283    #[cfg(test)]
+284    fn _march_deadline(&mut self) {
+285        // For testing, assume all will have same tick style.
+286        // Only count 'remaining loops' on one of the nodes.
+287        let mixer = self.tasks.get_mut(0).map(|m| {
+288            let style = m.config.tick_style.clone();
+289            (m, style)
+290        });
+291
+292        match mixer {
+293            None | Some((_, TickStyle::Timed)) => {
+294                std::thread::sleep(self.deadline.saturating_duration_since(Instant::now()));
+295                self.deadline += TIMESTEP_LENGTH;
+296            },
+297            Some((m, TickStyle::UntimedWithExecLimit(rx))) => {
+298                if m.remaining_loops.is_none() {
+299                    if let Ok(new_val) = rx.recv() {
+300                        m.remaining_loops = Some(new_val.wrapping_sub(1));
+301                    }
+302                }
+303
+304                if let Some(cnt) = m.remaining_loops.as_mut() {
+305                    if *cnt == 0 {
+306                        m.remaining_loops = None;
+307                    } else {
+308                        *cnt = cnt.wrapping_sub(1);
+309                    }
+310                }
+311            },
+312        }
+313    }
+314
+315    #[cfg(not(test))]
+316    #[inline(always)]
+317    #[allow(clippy::inline_always)]
+318    fn _march_deadline(&mut self) {
+319        std::thread::sleep(self.deadline.saturating_duration_since(Instant::now()));
+320        self.deadline += TIMESTEP_LENGTH;
+321    }
+322
+323    #[inline]
+324    fn march_deadline(&mut self) {
+325        #[cfg(feature = "internals")]
+326        {
+327            return;
+328        }
+329
+330        #[allow(clippy::used_underscore_items)]
+331        self._march_deadline();
+332    }
+333
+334    #[inline]
+335    fn handle_scheduler_msgs(&mut self) -> Result<(), ()> {
+336        let mut activation_time = None;
+337        loop {
+338            match self.rx.try_recv() {
+339                Ok((id, task)) => {
+340                    self.add_task(
+341                        task,
+342                        id,
+343                        *activation_time.get_or_insert_with(|| {
+344                            self.deadline
+345                                .checked_sub(TIMESTEP_LENGTH)
+346                                .unwrap_or(self.deadline)
+347                        }),
+348                    );
+349                },
+350                Err(TryRecvError::Empty) => break,
+351                Err(TryRecvError::Disconnected) => return Err(()),
+352            }
+353        }
+354
+355        Ok(())
+356    }
+357
+358    /// Handle messages from each tasks's `Driver`, marking dead tasks for removal.
+359    #[inline]
+360    fn handle_task_msgs(&mut self) {
+361        for (i, (packet, mixer)) in self
+362            .packets
+363            .iter_mut()
+364            .flat_map(|v| v.chunks_exact_mut(VOICE_PACKET_MAX))
+365            .zip(self.tasks.iter_mut())
+366            .enumerate()
+367        {
+368            let mut events_failure = false;
+369            let mut conn_failure = false;
+370
+371            let fatal = loop {
+372                match mixer.mix_rx.try_recv() {
+373                    Ok(m) => {
+374                        let (events, conn, should_exit) = mixer.handle_message(m, packet);
+375                        events_failure |= events;
+376                        conn_failure |= conn;
+377
+378                        if should_exit {
+379                            break true;
+380                        }
+381                    },
+382                    Err(TryRecvError::Disconnected) => {
+383                        break true;
+384                    },
+385
+386                    Err(TryRecvError::Empty) => {
+387                        break false;
+388                    },
+389                }
+390            };
+391
+392            if fatal || mixer.do_rebuilds(events_failure, conn_failure).is_err() {
+393                // this is not zipped in because it is *not* needed most ticks.
+394                self.to_cull[i] = true;
+395            }
+396        }
+397    }
+398
+399    #[cfg(feature = "internals")]
+400    #[inline]
+401    pub fn mark_for_cull(&mut self, idx: usize) {
+402        self.to_cull[idx] = true;
+403    }
+404
+405    /// Check and demote for any tasks without live audio sources who have sent all
+406    /// necessary silent frames (or remove dead tasks).
+407    ///
+408    /// This must occur *after* handling per-track events to prevent erroneously
+409    /// descheduling tasks.
+410    #[inline]
+411    pub fn demote_and_remove_mixers(&mut self) {
+412        let mut i = 0;
+413        while i < self.tasks.len() {
+414            #[cfg(test)]
+415            let force_conn = self.tasks[i].config.override_connection.is_some();
+416            #[cfg(not(test))]
+417            let force_conn = false;
+418
+419            // Benchmarking suggests that these asserts remove some bounds checks for us.
+420            assert!(i < self.tasks.len());
+421            assert!(i < self.to_cull.len());
+422
+423            if self.to_cull[i]
+424                || (self.tasks[i].tracks.is_empty() && self.tasks[i].silence_frames == 0)
+425                || !(self.tasks[i].conn_active.is_some() || force_conn)
+426            {
+427                self.stats.remove_mixer();
+428
+429                if let Some((id, parked)) = self.remove_task(i) {
+430                    self.global_stats.move_mixer_to_idle();
+431                    _ = self.tx.send(SchedulerMessage::Demote(id, parked));
+432                } else {
+433                    self.global_stats.remove_live_mixer();
+434                }
+435            } else {
+436                i += 1;
+437            }
+438        }
+439    }
+440
+441    /// Return a given mixer to the main scheduler if this worker is overloaded.
+442    #[inline]
+443    pub fn offload_mixer(&mut self, idx: usize, cost: Duration) {
+444        self.stats.remove_mixer();
+445
+446        if let Some((id, mut parked)) = self.remove_task(idx) {
+447            self.global_stats.move_mixer_to_idle();
+448            parked.last_cost = Some(cost);
+449            _ = self
+450                .tx
+451                .send(SchedulerMessage::Overspill(self.id, id, parked));
+452        } else {
+453            self.global_stats.remove_live_mixer();
+454        }
+455    }
+456
+457    #[inline]
+458    fn needed_blocks(&self) -> usize {
+459        let div = self.ids.len() / PACKETS_PER_BLOCK;
+460        let rem = self.ids.len() % PACKETS_PER_BLOCK;
+461        (rem != 0) as usize + div
+462    }
+463
+464    #[inline]
+465    fn has_excess_blocks(&self) -> bool {
+466        self.packets.len() > self.needed_blocks()
+467    }
+468
+469    #[inline]
+470    fn remove_excess_blocks(&mut self) {
+471        self.packets.truncate(self.needed_blocks());
+472    }
+473
+474    /// Try to offload excess packet buffers.
+475    ///
+476    /// If there is currently overallocation, then store the first time at which
+477    /// this was seenb. If this condition persists past `MEMORY_CULL_TIMER`, remove
+478    /// unnecessary blocks.
+479    #[inline]
+480    fn timed_remove_excess_blocks(&mut self, now: Instant) {
+481        if self.has_excess_blocks() {
+482            if let Some(mark_time) = self.excess_buffer_cull_time {
+483                if now.duration_since(mark_time) >= MEMORY_CULL_TIMER {
+484                    self.remove_excess_blocks();
+485                    self.excess_buffer_cull_time = None;
+486                }
+487            } else {
+488                self.excess_buffer_cull_time = Some(now);
+489            }
+490        } else {
+491            self.excess_buffer_cull_time = None;
+492        }
+493    }
+494
+495    #[inline]
+496    fn add_task(&mut self, task: ParkedMixer, id: TaskId, activation_time: Instant) {
+497        let idx = self.ids.len();
+498
+499        let elapsed = task.park_time - activation_time;
+500
+501        let samples_f64 = elapsed.as_secs_f64() * (SAMPLE_RATE_RAW as f64);
+502        let mod_samples = (samples_f64 as u64) as u32;
+503        let rtp_timestamp = task.rtp_timestamp.wrapping_add(mod_samples);
+504
+505        self.ids.push(id);
+506        self.tasks.push(task.mixer);
+507        self.packet_lens.push(0);
+508        self.to_cull.push(false);
+509
+510        let (block, inner_idx) = get_memory_indices(idx);
+511
+512        while self.packets.len() <= block {
+513            self.add_packet_block();
+514        }
+515        let packet = &mut self.packets[block][inner_idx..][..VOICE_PACKET_MAX];
+516
+517        let mut rtp = MutableRtpPacket::new(packet).expect(
+518            "FATAL: Too few bytes in self.packet for RTP header.\
+519                (Blame: VOICE_PACKET_MAX?)",
+520        );
+521        rtp.set_ssrc(task.ssrc);
+522        rtp.set_timestamp(rtp_timestamp.into());
+523        rtp.set_sequence(task.rtp_sequence.into());
+524    }
+525
+526    /// Allocate and store a new packet block.
+527    ///
+528    /// This will be full-size (`PACKETS_PER_BLOCK`) unless this block
+529    /// is a) the last required for the task limit and b) this limit
+530    /// is not aligned to `PACKETS_PER_BLOCK`.
+531    #[inline]
+532    fn add_packet_block(&mut self) {
+533        let n_packets = if let Some(limit) = self.config.strategy.task_limit() {
+534            let (block, inner) = get_memory_indices_unscaled(limit);
+535            if self.packets.len() < block || inner == 0 {
+536                PACKETS_PER_BLOCK
+537            } else {
+538                inner
+539            }
+540        } else {
+541            PACKETS_PER_BLOCK
+542        };
+543        self.packets.push(packet_block(n_packets));
+544    }
+545
+546    #[cfg(any(test, feature = "internals"))]
+547    #[inline]
+548    pub fn add_task_direct(&mut self, task: Mixer, id: TaskId) {
+549        let id_0 = id.get();
+550        self.add_task(
+551            ParkedMixer {
+552                mixer: Box::new(task),
+553                ssrc: id_0 as u32,
+554                rtp_sequence: id_0 as u16,
+555                rtp_timestamp: id_0 as u32,
+556                park_time: Instant::now(),
+557                last_cost: None,
+558                cull_handle: None,
+559            },
+560            id,
+561            Instant::now(),
+562        );
+563    }
+564
+565    /// Remove a `Mixer`, returning it to the idle scheduler.
+566    ///
+567    /// This operates by `swap_remove`ing each element of a Mixer's state, including
+568    /// on RTP packet headers. This is achieved by setting up a memcpy between
+569    /// buffer segments.
+570    #[inline]
+571    pub fn remove_task(&mut self, idx: usize) -> Option<(TaskId, ParkedMixer)> {
+572        let end = self.tasks.len() - 1;
+573
+574        let id = self.ids.swap_remove(idx);
+575        let _len = self.packet_lens.swap_remove(idx);
+576        let mixer = self.tasks.swap_remove(idx);
+577        let alive = !self.to_cull.swap_remove(idx);
+578
+579        let (block, inner_idx) = get_memory_indices(idx);
+580
+581        let (removed, replacement) = if end > idx {
+582            let (end_block, end_inner) = get_memory_indices(end);
+583            let (rest, target_block) = self.packets.split_at_mut(end_block);
+584            let (last_block, end_pkt) = target_block[0].split_at_mut(end_inner);
+585
+586            if end_block == block {
+587                (&mut last_block[inner_idx..], Some(end_pkt))
+588            } else {
+589                (&mut rest[block][inner_idx..], Some(end_pkt))
+590            }
+591        } else {
+592            (&mut self.packets[block][inner_idx..], None)
+593        };
+594
+595        let rtp = RtpPacket::new(removed).expect(
+596            "FATAL: Too few bytes in self.packet for RTP header.\
+597                (Blame: VOICE_PACKET_MAX?)",
+598        );
+599        let ssrc = rtp.get_ssrc();
+600        let rtp_timestamp = rtp.get_timestamp().into();
+601        let rtp_sequence = rtp.get_sequence().into();
+602
+603        if let Some(replacement) = replacement {
+604            // Copy the whole packet header since we know it'll be 4B aligned.
+605            // 'Just necessary fields' is 2B aligned.
+606            const COPY_LEN: usize = RtpPacket::minimum_packet_size();
+607            removed[..COPY_LEN].copy_from_slice(&replacement[..COPY_LEN]);
+608        }
+609
+610        alive.then(move || {
+611            let park_time = Instant::now();
+612
+613            (
+614                id,
+615                ParkedMixer {
+616                    mixer,
+617                    ssrc,
+618                    rtp_sequence,
+619                    rtp_timestamp,
+620                    park_time,
+621                    last_cost: None,
+622                    cull_handle: None,
+623                },
+624            )
+625        })
+626    }
+627
+628    /// Spawn a new sync thread to manage `Mixer`s.
+629    fn spawn(mut self) {
+630        std::thread::spawn(move || {
+631            self.run();
+632        });
+633    }
+634}
+635
+636/// Initialises a packet block of the required size, prefilling any constant RTP data.
+637#[inline]
+638fn packet_block(n_packets: usize) -> Box<[u8]> {
+639    let mut packets = vec![0u8; VOICE_PACKET_MAX * n_packets].into_boxed_slice();
+640
+641    for packet in packets.chunks_exact_mut(VOICE_PACKET_MAX) {
+642        let mut rtp = MutableRtpPacket::new(packet).expect(
+643            "FATAL: Too few bytes in self.packet for RTP header.\
+644                (Blame: VOICE_PACKET_MAX?)",
+645        );
+646        rtp.set_version(RTP_VERSION);
+647        rtp.set_payload_type(RTP_PROFILE_TYPE);
+648    }
+649
+650    packets
+651}
+652
+653/// Returns the block index into `self.packets` and the packet number in
+654/// the block for a given worker's index.
+655#[inline]
+656fn get_memory_indices_unscaled(idx: usize) -> (usize, usize) {
+657    let block_size = PACKETS_PER_BLOCK;
+658    (idx / block_size, idx % block_size)
+659}
+660
+661/// Returns the block index into `self.packets` and the byte offset into
+662/// a packet block for a given worker's index.
+663#[inline]
+664fn get_memory_indices(idx: usize) -> (usize, usize) {
+665    let (block, inner_unscaled) = get_memory_indices_unscaled(idx);
+666    (block, inner_unscaled * VOICE_PACKET_MAX)
+667}
+668
+669#[inline]
+670fn advance_rtp_counters(packet: &mut [u8]) {
+671    let mut rtp = MutableRtpPacket::new(packet).expect(
+672        "FATAL: Too few bytes in self.packet for RTP header.\
+673            (Blame: VOICE_PACKET_MAX?)",
+674    );
+675    rtp.set_sequence(rtp.get_sequence() + 1);
+676    rtp.set_timestamp(rtp.get_timestamp() + MONO_FRAME_SIZE as u32);
+677}
+678
+679/// Structured slightly confusingly: we only want to even access `cull_markers`
+680/// in the event of error.
+681#[inline]
+682fn rebuild_if_err<T>(
+683    mixer: &mut Box<Mixer>,
+684    res: Result<T, DriverError>,
+685    cull_markers: &mut [bool],
+686    idx: usize,
+687) {
+688    if let Err(e) = res {
+689        cull_markers[idx] |= mixer
+690            .do_rebuilds(
+691                e.should_trigger_interconnect_rebuild(),
+692                e.should_trigger_connect(),
+693            )
+694            .is_err();
+695    }
+696}
+697
+698#[cfg(test)]
+699mod test {
+700    use super::*;
+701    use crate::driver::test_impls::*;
+702    use tokio::runtime::Handle;
+703
+704    fn rtp_has_index(pkt: &[u8], sentinel_val: u16) {
+705        let rtp = RtpPacket::new(pkt).unwrap();
+706
+707        assert_eq!(rtp.get_version(), RTP_VERSION);
+708        assert_eq!(rtp.get_padding(), 0);
+709        assert_eq!(rtp.get_extension(), 0);
+710        assert_eq!(rtp.get_csrc_count(), 0);
+711        assert_eq!(rtp.get_marker(), 0);
+712        assert_eq!(rtp.get_payload_type(), RTP_PROFILE_TYPE);
+713        assert_eq!(rtp.get_sequence(), sentinel_val.into());
+714        assert_eq!(rtp.get_timestamp(), (sentinel_val as u32).into());
+715        assert_eq!(rtp.get_ssrc(), sentinel_val as u32);
+716    }
+717
+718    #[tokio::test]
+719    async fn block_alloc_is_partial_small() {
+720        let n_mixers = 1;
+721        let (sched, _listeners) = MockScheduler::from_mixers(
+722            Some(Mode::MaxPerThread(n_mixers.try_into().unwrap())),
+723            (0..n_mixers)
+724                .map(|_| Mixer::test_with_float(1, Handle::current(), false))
+725                .collect(),
+726        );
+727
+728        assert_eq!(sched.core.packets.len(), 1);
+729        assert_eq!(sched.core.packets[0].len(), VOICE_PACKET_MAX);
+730    }
+731
+732    #[tokio::test]
+733    async fn block_alloc_is_partial_large() {
+734        let n_mixers = 33;
+735        let (sched, _listeners) = MockScheduler::from_mixers(
+736            Some(Mode::MaxPerThread(n_mixers.try_into().unwrap())),
+737            (0..n_mixers)
+738                .map(|_| Mixer::test_with_float(1, Handle::current(), false))
+739                .collect(),
+740        );
+741
+742        assert_eq!(sched.core.packets.len(), 3);
+743        assert_eq!(
+744            sched.core.packets[0].len(),
+745            PACKETS_PER_BLOCK * VOICE_PACKET_MAX
+746        );
+747        assert_eq!(
+748            sched.core.packets[1].len(),
+749            PACKETS_PER_BLOCK * VOICE_PACKET_MAX
+750        );
+751        assert_eq!(sched.core.packets[2].len(), VOICE_PACKET_MAX);
+752    }
+753
+754    #[tokio::test]
+755    async fn deletion_moves_pkt_header() {
+756        let (mut sched, _listeners) = MockScheduler::from_mixers(
+757            None,
+758            (0..PACKETS_PER_BLOCK)
+759                .map(|_| Mixer::test_with_float(1, Handle::current(), false))
+760                .collect(),
+761        );
+762
+763        let last_idx = (PACKETS_PER_BLOCK - 1) as u16;
+764
+765        // Remove head.
+766        sched.core.remove_task(0);
+767        rtp_has_index(&sched.core.packets[0], last_idx);
+768
+769        // Remove head.
+770        sched.core.remove_task(5);
+771        rtp_has_index(&sched.core.packets[0][5 * VOICE_PACKET_MAX..], last_idx - 1);
+772    }
+773
+774    #[tokio::test]
+775    async fn deletion_moves_pkt_header_multiblock() {
+776        let n_pkts = PACKETS_PER_BLOCK + 8;
+777        let (mut sched, _listeners) = MockScheduler::from_mixers(
+778            None,
+779            (0..n_pkts)
+780                .map(|_| Mixer::test_with_float(1, Handle::current(), false))
+781                .collect(),
+782        );
+783
+784        let last_idx = (n_pkts - 1) as u16;
+785
+786        // Remove head (read from block 1 into block 0).
+787        sched.core.remove_task(0);
+788        rtp_has_index(&sched.core.packets[0], last_idx);
+789
+790        // Remove later (read from block 1 into block 1).
+791        sched.core.remove_task(17);
+792        rtp_has_index(&sched.core.packets[1][VOICE_PACKET_MAX..], last_idx - 1);
+793    }
+794
+795    #[tokio::test]
+796    async fn packet_blocks_are_cleaned_up() {
+797        // Allocate 2 blocks.
+798        let n_pkts = PACKETS_PER_BLOCK + 1;
+799        let (mut sched, _listeners) = MockScheduler::from_mixers(
+800            None,
+801            (0..n_pkts)
+802                .map(|_| Mixer::test_with_float(1, Handle::current(), false))
+803                .collect(),
+804        );
+805
+806        // Assert no cleanup at start.
+807        assert!(sched.core.run_once());
+808        assert_eq!(sched.core.needed_blocks(), 2);
+809        assert!(sched.core.excess_buffer_cull_time.is_none());
+810
+811        // Remove only entry in last block. Cleanup should be sched'd.
+812        sched.core.remove_task(n_pkts - 1);
+813        assert!(sched.core.run_once());
+814        assert!(sched.core.has_excess_blocks());
+815        assert!(sched.core.excess_buffer_cull_time.is_some());
+816
+817        tokio::time::sleep(Duration::from_secs(2) + MEMORY_CULL_TIMER).await;
+818
+819        // Cleanup should be unsched'd.
+820        assert!(sched.core.run_once());
+821        assert!(sched.core.excess_buffer_cull_time.is_none());
+822        assert!(!sched.core.has_excess_blocks());
+823    }
+824}
\ No newline at end of file diff --git a/next/src/songbird/driver/scheduler/mod.rs.html b/next/src/songbird/driver/scheduler/mod.rs.html new file mode 100644 index 0000000..591ee88 --- /dev/null +++ b/next/src/songbird/driver/scheduler/mod.rs.html @@ -0,0 +1,180 @@ +mod.rs - source

songbird/driver/scheduler/
mod.rs

1use std::{
+2    error::Error as StdError,
+3    fmt::Display,
+4    num::NonZeroUsize,
+5    sync::{Arc, OnceLock},
+6};
+7
+8use flume::{Receiver, RecvError, Sender};
+9
+10use super::tasks::message::{Interconnect, MixerMessage};
+11use crate::{constants::TIMESTEP_LENGTH, Config as DriverConfig};
+12
+13mod config;
+14mod idle;
+15mod live;
+16mod stats;
+17mod task;
+18
+19pub use config::*;
+20use idle::*;
+21pub use live::*;
+22pub use stats::*;
+23pub use task::*;
+24
+25/// A soft maximum of 90% of the 20ms budget to account for variance in execution time.
+26const RESCHEDULE_THRESHOLD: u64 = ((TIMESTEP_LENGTH.subsec_nanos() as u64) * 9) / 10;
+27
+28const DEFAULT_MIXERS_PER_THREAD: NonZeroUsize = match NonZeroUsize::new(16) {
+29    Some(v) => v,
+30    None => unreachable!(),
+31};
+32
+33/// The default shared scheduler instance.
+34///
+35/// This is built using the default value of [`ScheduleMode`]. Users desiring
+36/// a custom strategy should avoid calling [`Config::default`].
+37///
+38/// [`Config::default`]: crate::Config::default
+39/// [`ScheduleMode`]: Mode
+40pub fn get_default_scheduler() -> &'static Scheduler {
+41    static DEFAULT_SCHEDULER: OnceLock<Scheduler> = OnceLock::new();
+42    DEFAULT_SCHEDULER.get_or_init(Scheduler::default)
+43}
+44
+45/// A reference to a shared group of threads used for running idle and active
+46/// audio threads.
+47#[derive(Clone, Debug)]
+48pub struct Scheduler {
+49    inner: Arc<InnerScheduler>,
+50}
+51
+52/// Inner contents of a [`Scheduler`] instance.
+53///
+54/// This is an `Arc` around `Arc`'d contents so that we can make use of the
+55/// drop check on `Scheduler` to clean up resources.
+56#[derive(Clone, Debug)]
+57struct InnerScheduler {
+58    tx: Sender<SchedulerMessage>,
+59    stats: Arc<StatBlock>,
+60}
+61
+62impl Scheduler {
+63    /// Create a new mixer scheduler from the allocation strategy in `config`.
+64    #[must_use]
+65    pub fn new(config: Config) -> Self {
+66        let (core, tx) = Idle::new(config);
+67
+68        let stats = core.stats.clone();
+69        core.spawn();
+70
+71        let inner = Arc::new(InnerScheduler { tx, stats });
+72
+73        Self { inner }
+74    }
+75
+76    pub(crate) fn new_mixer(
+77        &self,
+78        config: &DriverConfig,
+79        ic: Interconnect,
+80        rx: Receiver<MixerMessage>,
+81    ) {
+82        self.inner
+83            .tx
+84            .send(SchedulerMessage::NewMixer(rx, ic, config.clone()))
+85            .unwrap();
+86    }
+87
+88    /// Returns the total number of calls (idle and active) scheduled.
+89    #[must_use]
+90    pub fn total_tasks(&self) -> u64 {
+91        self.inner.stats.total_mixers()
+92    }
+93
+94    /// Returns the total number of *active* calls scheduled and processing
+95    /// audio.
+96    #[must_use]
+97    pub fn live_tasks(&self) -> u64 {
+98        self.inner.stats.live_mixers()
+99    }
+100
+101    /// Returns the total number of threads spawned to process live audio sessions.
+102    #[must_use]
+103    pub fn worker_threads(&self) -> u64 {
+104        self.inner.stats.worker_threads()
+105    }
+106
+107    /// Request a list of handles to statistics for currently live workers.
+108    pub async fn worker_thread_stats(&self) -> Result<Vec<Arc<LiveStatBlock>>, Error> {
+109        let (tx, rx) = flume::bounded(1);
+110        _ = self.inner.tx.send(SchedulerMessage::GetStats(tx));
+111
+112        rx.recv_async().await.map_err(Error::from)
+113    }
+114
+115    /// Request a list of handles to statistics for currently live workers with a blocking call.
+116    pub fn worker_thread_stats_blocking(&self) -> Result<Vec<Arc<LiveStatBlock>>, Error> {
+117        let (tx, rx) = flume::bounded(1);
+118        _ = self.inner.tx.send(SchedulerMessage::GetStats(tx));
+119
+120        rx.recv().map_err(Error::from)
+121    }
+122}
+123
+124impl Drop for InnerScheduler {
+125    fn drop(&mut self) {
+126        _ = self.tx.send(SchedulerMessage::Kill);
+127    }
+128}
+129
+130impl Default for Scheduler {
+131    fn default() -> Self {
+132        Scheduler::new(Config::default())
+133    }
+134}
+135
+136/// Control messages for a scheduler.
+137pub enum SchedulerMessage {
+138    /// Build a new `Mixer` as part of the initialisation of a `Driver`.
+139    NewMixer(Receiver<MixerMessage>, Interconnect, DriverConfig),
+140    /// Forward a command for
+141    Do(TaskId, MixerMessage),
+142    /// Return a `Mixer` from a worker back to the idle pool.
+143    Demote(TaskId, ParkedMixer),
+144    /// Move an expensive `Mixer` to another thread in the worker pool.
+145    Overspill(WorkerId, TaskId, ParkedMixer),
+146    /// Request a copy of all per-worker statistics.
+147    GetStats(Sender<Vec<Arc<LiveStatBlock>>>),
+148    /// Cleanup once all `Scheduler` handles are dropped.
+149    Kill,
+150}
+151
+152/// Errors encountered when communicating with the internals of a [`Scheduler`].
+153///
+154/// [`Scheduler`]: crate::driver::Scheduler
+155#[non_exhaustive]
+156#[derive(Debug)]
+157pub enum Error {
+158    /// The scheduler exited or crashed while awating the request.
+159    Disconnected,
+160}
+161
+162impl Display for Error {
+163    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+164        match self {
+165            Self::Disconnected => f.write_str("the scheduler terminated mid-request"),
+166        }
+167    }
+168}
+169
+170impl StdError for Error {
+171    fn source(&self) -> Option<&(dyn StdError + 'static)> {
+172        None
+173    }
+174}
+175
+176impl From<RecvError> for Error {
+177    fn from(_: RecvError) -> Self {
+178        Self::Disconnected
+179    }
+180}
\ No newline at end of file diff --git a/next/src/songbird/driver/scheduler/stats.rs.html b/next/src/songbird/driver/scheduler/stats.rs.html new file mode 100644 index 0000000..1188b7e --- /dev/null +++ b/next/src/songbird/driver/scheduler/stats.rs.html @@ -0,0 +1,134 @@ +stats.rs - source

songbird/driver/scheduler/
stats.rs

1use std::{
+2    sync::atomic::{AtomicU64, Ordering},
+3    time::Duration,
+4};
+5
+6use super::{Mode, ParkedMixer, RESCHEDULE_THRESHOLD};
+7
+8/// Statistics shared by an entire `Scheduler`.
+9#[derive(Debug, Default)]
+10pub struct StatBlock {
+11    total: AtomicU64,
+12    live: AtomicU64,
+13    threads: AtomicU64,
+14}
+15
+16#[allow(missing_docs)]
+17impl StatBlock {
+18    #[inline]
+19    pub fn total_mixers(&self) -> u64 {
+20        self.total.load(Ordering::Relaxed)
+21    }
+22
+23    #[inline]
+24    pub fn live_mixers(&self) -> u64 {
+25        self.live.load(Ordering::Relaxed)
+26    }
+27
+28    #[inline]
+29    pub fn worker_threads(&self) -> u64 {
+30        self.threads.load(Ordering::Relaxed)
+31    }
+32
+33    #[inline]
+34    pub fn add_idle_mixer(&self) {
+35        self.total.fetch_add(1, Ordering::Relaxed);
+36    }
+37
+38    #[inline]
+39    pub fn remove_idle_mixers(&self, n: u64) {
+40        self.total.fetch_sub(n, Ordering::Relaxed);
+41    }
+42
+43    #[inline]
+44    pub fn move_mixer_to_live(&self) {
+45        self.live.fetch_add(1, Ordering::Relaxed);
+46    }
+47
+48    #[inline]
+49    pub fn move_mixer_to_idle(&self) {
+50        self.move_mixers_to_idle(1);
+51    }
+52
+53    #[inline]
+54    pub fn move_mixers_to_idle(&self, n: u64) {
+55        self.live.fetch_sub(n, Ordering::Relaxed);
+56    }
+57
+58    #[inline]
+59    pub fn remove_live_mixer(&self) {
+60        self.remove_live_mixers(1);
+61    }
+62
+63    #[inline]
+64    pub fn remove_live_mixers(&self, n: u64) {
+65        self.move_mixers_to_idle(n);
+66        self.remove_idle_mixers(n);
+67    }
+68
+69    #[inline]
+70    pub fn add_worker(&self) {
+71        self.threads.fetch_add(1, Ordering::Relaxed);
+72    }
+73
+74    #[inline]
+75    pub fn remove_worker(&self) {
+76        self.threads.fetch_sub(1, Ordering::Relaxed);
+77    }
+78}
+79
+80/// Runtime statistics for an individual worker.
+81///
+82/// Individual statistics are measured atomically -- the worker thread
+83/// may have been cleaned up, or its mixer count may not match the
+84/// count when [`Self::last_compute_cost_ns`] was set.
+85#[derive(Debug, Default)]
+86pub struct LiveStatBlock {
+87    live: AtomicU64,
+88    last_ns: AtomicU64,
+89}
+90
+91impl LiveStatBlock {
+92    /// Returns the number of mixer tasks scheduled on this worker thread.
+93    #[inline]
+94    pub fn live_mixers(&self) -> u64 {
+95        self.live.load(Ordering::Relaxed)
+96    }
+97
+98    #[inline]
+99    pub(crate) fn add_mixer(&self) {
+100        self.live.fetch_add(1, Ordering::Relaxed);
+101    }
+102
+103    #[inline]
+104    pub(crate) fn remove_mixer(&self) {
+105        self.live.fetch_sub(1, Ordering::Relaxed);
+106    }
+107
+108    #[inline]
+109    pub(crate) fn store_compute_cost(&self, work: Duration) -> u64 {
+110        let cost = work.as_nanos() as u64;
+111        self.last_ns.store(cost, Ordering::Relaxed);
+112        cost
+113    }
+114
+115    /// Returns the number of nanoseconds required to process all worker threads'
+116    /// packet transmission, mixing, encoding, and encryption in the last tick.
+117    #[inline]
+118    pub fn last_compute_cost_ns(&self) -> u64 {
+119        self.last_ns.load(Ordering::Relaxed)
+120    }
+121
+122    #[inline]
+123    pub(crate) fn has_room(&self, strategy: &Mode, task: &ParkedMixer) -> bool {
+124        let task_room = strategy
+125            .task_limit()
+126            .map_or(true, |limit| self.live_mixers() < limit as u64);
+127
+128        let exec_room = task.last_cost.map_or(true, |cost| {
+129            cost.as_nanos() as u64 + self.last_compute_cost_ns() < RESCHEDULE_THRESHOLD
+130        });
+131
+132        task_room && exec_room
+133    }
+134}
\ No newline at end of file diff --git a/next/src/songbird/driver/scheduler/task.rs.html b/next/src/songbird/driver/scheduler/task.rs.html new file mode 100644 index 0000000..0e5427a --- /dev/null +++ b/next/src/songbird/driver/scheduler/task.rs.html @@ -0,0 +1,214 @@ +task.rs - source

songbird/driver/scheduler/
task.rs

1use std::{
+2    marker::PhantomData,
+3    time::{Duration, Instant},
+4};
+5
+6use flume::{Receiver, Sender};
+7use nohash_hasher::IsEnabled;
+8use rand::random;
+9use tokio::runtime::Handle;
+10
+11use crate::{
+12    driver::tasks::{
+13        error::Error as DriverError,
+14        message::{EventMessage, Interconnect, MixerMessage},
+15        mixer::Mixer,
+16    },
+17    Config,
+18};
+19
+20use super::SchedulerMessage;
+21
+22/// Typesafe counter used to identify individual mixer/worker instances.
+23#[derive(Copy, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
+24pub struct ResId<T>(u64, PhantomData<T>);
+25#[allow(missing_docs)]
+26pub type TaskId = ResId<TaskMarker>;
+27#[allow(missing_docs)]
+28pub type WorkerId = ResId<WorkerMarker>;
+29
+30#[allow(missing_docs)]
+31#[derive(Copy, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
+32pub struct TaskMarker;
+33#[allow(missing_docs)]
+34#[derive(Copy, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
+35pub struct WorkerMarker;
+36
+37impl<T> IsEnabled for ResId<T> {}
+38
+39#[allow(missing_docs)]
+40impl<T: Copy> ResId<T> {
+41    #[must_use]
+42    pub fn new() -> Self {
+43        Self::default()
+44    }
+45
+46    pub fn incr(&mut self) -> Self {
+47        let out = *self;
+48        self.0 = self.0.wrapping_add(1);
+49        out
+50    }
+51
+52    #[cfg(any(test, feature = "internals"))]
+53    #[must_use]
+54    pub fn get(self) -> u64 {
+55        self.0
+56    }
+57}
+58
+59impl<T: Copy> Default for ResId<T> {
+60    fn default() -> Self {
+61        Self(0, PhantomData)
+62    }
+63}
+64
+65/// An idle mixer instance, externally controlled by a `Driver`.
+66///
+67/// Since we do not allocate packet buffers for idle threads, this
+68/// struct includes various RTP fields.
+69pub struct ParkedMixer {
+70    /// Mixer, track, etc. state as well as message receivers.
+71    pub mixer: Box<Mixer>,
+72    /// The SSRC assigned to this voice session.
+73    pub ssrc: u32,
+74    /// The last recorded/generated RTP sequence.
+75    pub rtp_sequence: u16,
+76    /// The last recorded/generated RTP timestamp.
+77    pub rtp_timestamp: u32,
+78    /// The time at which this `Mixer` was made idle.
+79    ///
+80    /// This is used when transitioning to a live state to determine
+81    /// how far we should adjust the RTP timestamp by.
+82    pub park_time: Instant,
+83    /// The last known cost of executing this task, if it had to be moved
+84    /// due to a limit on thread resources.
+85    pub last_cost: Option<Duration>,
+86    /// Handle to any forwarder task, used if this mixer is culled while idle.
+87    pub cull_handle: Option<Sender<()>>,
+88}
+89
+90#[allow(missing_docs)]
+91impl ParkedMixer {
+92    /// Create a new `Mixer` in a parked state.
+93    #[must_use]
+94    pub fn new(mix_rx: Receiver<MixerMessage>, interconnect: Interconnect, config: Config) -> Self {
+95        Self {
+96            mixer: Box::new(Mixer::new(mix_rx, Handle::current(), interconnect, config)),
+97            ssrc: 0,
+98            rtp_sequence: random::<u16>(),
+99            rtp_timestamp: random::<u32>(),
+100            park_time: Instant::now(),
+101            last_cost: None,
+102            cull_handle: None,
+103        }
+104    }
+105
+106    /// Spawn a tokio task which forwards any mixer messages to the central `Idle` task pool.
+107    ///
+108    /// Any requests which would cause this mixer to become live will terminate
+109    /// this task.
+110    pub fn spawn_forwarder(&mut self, tx: Sender<SchedulerMessage>, id: TaskId) {
+111        let (kill_tx, kill_rx) = flume::bounded(1);
+112        self.cull_handle = Some(kill_tx);
+113
+114        let remote_rx = self.mixer.mix_rx.clone();
+115        tokio::spawn(async move {
+116            loop {
+117                tokio::select! {
+118                    biased;
+119                    _ = kill_rx.recv_async() => break,
+120                    msg = remote_rx.recv_async() => {
+121                        let exit = if let Ok(msg) = msg {
+122                            let remove_self = msg.is_mixer_maybe_live();
+123                            tx.send_async(SchedulerMessage::Do(id, msg)).await.is_err() || remove_self
+124                        } else {
+125                            true
+126                        };
+127
+128                        if exit {
+129                            break;
+130                        }
+131                    }
+132                }
+133            }
+134        });
+135    }
+136
+137    /// Returns whether the mixer should exit and be cleaned up.
+138    pub fn handle_message(&mut self, msg: MixerMessage) -> Result<bool, ()> {
+139        match msg {
+140            MixerMessage::SetConn(conn, ssrc) => {
+141                // Overridden because payload-specific fields are carried
+142                // externally on `ParkedMixer`.
+143                self.ssrc = ssrc;
+144                self.rtp_sequence = random::<u16>();
+145                self.rtp_timestamp = random::<u32>();
+146                self.mixer.conn_active = Some(conn);
+147                self.mixer.update_keepalive(ssrc);
+148
+149                Ok(false)
+150            },
+151            MixerMessage::Ws(ws) => {
+152                // Overridden so that we don't mistakenly tell Discord we're speaking.
+153                self.mixer.ws = ws;
+154                self.send_gateway_not_speaking();
+155
+156                Ok(false)
+157            },
+158            msg => {
+159                let (events_failure, conn_failure, should_exit) =
+160                    self.mixer.handle_message(msg, &mut []);
+161
+162                self.mixer
+163                    .do_rebuilds(events_failure, conn_failure)
+164                    .map_err(|_| ())
+165                    .map(|()| should_exit)
+166            },
+167        }
+168    }
+169
+170    /// Handle periodic events attached to this `Mixer`, including timer state
+171    /// on the event thread and UDP keepalives needed to prevent session termination.
+172    ///
+173    /// As we init our UDP sockets as non-blocking via Tokio -> `into_std`, it is
+174    /// safe to call UDP packet sends like this.
+175    pub fn tick_and_keepalive(&mut self, now: Instant) -> Result<(), ()> {
+176        // TODO: should we include an atomic which signals whether the event
+177        //  thread *cares*, so we can prevent wakeups?
+178        //  Can we do the same for live tracks?
+179        let mut events_failure = self.mixer.fire_event(EventMessage::Tick).is_err();
+180
+181        let ka_err = self
+182            .mixer
+183            .check_and_send_keepalive(Some(now))
+184            .or_else(DriverError::disarm_would_block);
+185
+186        let conn_failure = if let Err(e) = ka_err {
+187            events_failure |= e.should_trigger_interconnect_rebuild();
+188            e.should_trigger_connect()
+189        } else {
+190            false
+191        };
+192
+193        self.mixer
+194            .do_rebuilds(events_failure, conn_failure)
+195            .map_err(|_| ())
+196    }
+197
+198    pub fn send_gateway_speaking(&mut self) -> Result<(), ()> {
+199        if let Err(e) = self.mixer.send_gateway_speaking() {
+200            self.mixer
+201                .do_rebuilds(
+202                    e.should_trigger_interconnect_rebuild(),
+203                    e.should_trigger_connect(),
+204                )
+205                .map_err(|_| ())
+206        } else {
+207            Ok(())
+208        }
+209    }
+210
+211    pub fn send_gateway_not_speaking(&self) {
+212        self.mixer.send_gateway_not_speaking();
+213    }
+214}
\ No newline at end of file diff --git a/next/src/songbird/driver/tasks/disposal.rs.html b/next/src/songbird/driver/tasks/disposal.rs.html new file mode 100644 index 0000000..47cfa0a --- /dev/null +++ b/next/src/songbird/driver/tasks/disposal.rs.html @@ -0,0 +1,40 @@ +disposal.rs - source

songbird/driver/tasks/
disposal.rs

1use super::message::*;
+2use flume::{Receiver, Sender};
+3use tracing::{instrument, trace};
+4
+5#[derive(Debug, Clone)]
+6pub struct DisposalThread(Sender<DisposalMessage>);
+7
+8impl Default for DisposalThread {
+9    fn default() -> Self {
+10        Self::run()
+11    }
+12}
+13
+14impl DisposalThread {
+15    #[must_use]
+16    pub fn run() -> Self {
+17        let (mix_tx, mix_rx) = flume::unbounded();
+18        std::thread::spawn(move || {
+19            trace!("Disposal thread started.");
+20            runner(mix_rx);
+21            trace!("Disposal thread finished.");
+22        });
+23
+24        Self(mix_tx)
+25    }
+26
+27    pub(super) fn dispose(&self, message: DisposalMessage) {
+28        drop(self.0.send(message));
+29    }
+30}
+31
+32/// The mixer's disposal thread is also synchronous, due to tracks,
+33/// inputs, etc. being based on synchronous I/O.
+34///
+35/// The mixer uses this to offload heavy and expensive drop operations
+36/// to prevent deadline misses.
+37#[instrument(skip(mix_rx))]
+38fn runner(mix_rx: Receiver<DisposalMessage>) {
+39    while mix_rx.recv().is_ok() {}
+40}
\ No newline at end of file diff --git a/next/src/songbird/driver/tasks/error.rs.html b/next/src/songbird/driver/tasks/error.rs.html new file mode 100644 index 0000000..f6fad8c --- /dev/null +++ b/next/src/songbird/driver/tasks/error.rs.html @@ -0,0 +1,102 @@ +error.rs - source

songbird/driver/tasks/
error.rs

1use super::message::*;
+2use crate::ws::Error as WsError;
+3use aes_gcm::Error as CryptoError;
+4use audiopus::Error as OpusError;
+5use flume::SendError;
+6use std::io::{Error as IoError, ErrorKind as IoErrorKind};
+7
+8#[derive(Debug)]
+9pub enum Recipient {
+10    AuxNetwork,
+11    Event,
+12    Mixer,
+13    #[cfg(feature = "receive")]
+14    UdpRx,
+15}
+16
+17pub type Result<T> = std::result::Result<T, Error>;
+18
+19#[derive(Debug)]
+20#[non_exhaustive]
+21pub enum Error {
+22    Crypto(CryptoError),
+23    #[cfg(any(feature = "receive", test))]
+24    /// Received an illegal voice packet on the voice UDP socket.
+25    IllegalVoicePacket,
+26    InterconnectFailure(Recipient),
+27    Io(IoError),
+28    Other,
+29}
+30
+31impl Error {
+32    pub(crate) fn should_trigger_connect(&self) -> bool {
+33        match self {
+34            Error::InterconnectFailure(Recipient::AuxNetwork) => true,
+35            #[cfg(feature = "receive")]
+36            Error::InterconnectFailure(Recipient::UdpRx) => true,
+37            _ => false,
+38        }
+39    }
+40
+41    pub(crate) fn should_trigger_interconnect_rebuild(&self) -> bool {
+42        matches!(self, Error::InterconnectFailure(Recipient::Event))
+43    }
+44
+45    // This prevents a `WouldBlock` from triggering a full reconnect,
+46    // instead simply dropping the packet.
+47    pub(crate) fn disarm_would_block(self) -> Result<()> {
+48        match self {
+49            Self::Io(i) if i.kind() == IoErrorKind::WouldBlock => Ok(()),
+50            e => Err(e),
+51        }
+52    }
+53}
+54
+55impl From<CryptoError> for Error {
+56    fn from(e: CryptoError) -> Self {
+57        Error::Crypto(e)
+58    }
+59}
+60
+61impl From<IoError> for Error {
+62    fn from(e: IoError) -> Error {
+63        Error::Io(e)
+64    }
+65}
+66
+67impl From<OpusError> for Error {
+68    fn from(_: OpusError) -> Error {
+69        Error::Other
+70    }
+71}
+72
+73impl From<SendError<WsMessage>> for Error {
+74    fn from(_e: SendError<WsMessage>) -> Error {
+75        Error::InterconnectFailure(Recipient::AuxNetwork)
+76    }
+77}
+78
+79impl From<SendError<EventMessage>> for Error {
+80    fn from(_e: SendError<EventMessage>) -> Error {
+81        Error::InterconnectFailure(Recipient::Event)
+82    }
+83}
+84
+85impl From<SendError<MixerMessage>> for Error {
+86    fn from(_e: SendError<MixerMessage>) -> Error {
+87        Error::InterconnectFailure(Recipient::Mixer)
+88    }
+89}
+90
+91#[cfg(feature = "receive")]
+92impl From<SendError<UdpRxMessage>> for Error {
+93    fn from(_e: SendError<UdpRxMessage>) -> Error {
+94        Error::InterconnectFailure(Recipient::UdpRx)
+95    }
+96}
+97
+98impl From<WsError> for Error {
+99    fn from(_: WsError) -> Error {
+100        Error::Other
+101    }
+102}
\ No newline at end of file diff --git a/next/src/songbird/driver/tasks/events.rs.html b/next/src/songbird/driver/tasks/events.rs.html new file mode 100644 index 0000000..04207ce --- /dev/null +++ b/next/src/songbird/driver/tasks/events.rs.html @@ -0,0 +1,139 @@ +events.rs - source

songbird/driver/tasks/
events.rs

1use super::message::*;
+2use crate::{
+3    events::{EventStore, GlobalEvents, TrackEvent},
+4    tracks::{ReadyState, TrackHandle, TrackState},
+5};
+6use flume::Receiver;
+7use tracing::{debug, info, instrument, trace};
+8
+9#[instrument(skip(evt_rx))]
+10pub(crate) async fn runner(evt_rx: Receiver<EventMessage>) {
+11    let mut global = GlobalEvents::default();
+12
+13    let mut events: Vec<EventStore> = vec![];
+14    let mut states: Vec<TrackState> = vec![];
+15    let mut handles: Vec<TrackHandle> = vec![];
+16
+17    while let Ok(msg) = evt_rx.recv_async().await {
+18        match msg {
+19            EventMessage::AddGlobalEvent(data) => {
+20                info!("Global event added.");
+21                global.add_event(data);
+22            },
+23            EventMessage::AddTrackEvent(i, data) => {
+24                info!("Adding event to track {}.", i);
+25
+26                let event_store = events
+27                    .get_mut(i)
+28                    .expect("Event thread was given an illegal store index for AddTrackEvent.");
+29                let state = states
+30                    .get_mut(i)
+31                    .expect("Event thread was given an illegal state index for AddTrackEvent.");
+32
+33                event_store.add_event(data, state.position);
+34            },
+35            EventMessage::FireCoreEvent(ctx) => {
+36                let ctx = ctx.to_user_context();
+37                let evt = ctx
+38                    .to_core_event()
+39                    .expect("Event thread was passed a non-core event in FireCoreEvent.");
+40
+41                trace!("Firing core event {:?}.", evt);
+42
+43                global.fire_core_event(evt, ctx).await;
+44            },
+45            EventMessage::RemoveGlobalEvents => {
+46                global.remove_handlers();
+47            },
+48            EventMessage::AddTrack(store, state, handle) => {
+49                events.push(store);
+50                states.push(state);
+51                handles.push(handle);
+52
+53                info!("Event state for track {} added", events.len());
+54            },
+55            EventMessage::ChangeState(i, change) => {
+56                let max_states = states.len();
+57                debug!(
+58                    "Changing state for track {} of {}: {:?}",
+59                    i, max_states, change
+60                );
+61
+62                let state = states
+63                    .get_mut(i)
+64                    .expect("Event thread was given an illegal state index for ChangeState.");
+65
+66                match change {
+67                    TrackStateChange::Mode(mut mode) => {
+68                        std::mem::swap(&mut state.playing, &mut mode);
+69                        if state.playing != mode {
+70                            global.fire_track_event(state.playing.as_track_event(), i);
+71                            if let Some(other_evts) = state.playing.also_fired_track_events() {
+72                                for evt in other_evts {
+73                                    global.fire_track_event(evt, i);
+74                                }
+75                            }
+76                        }
+77                    },
+78                    TrackStateChange::Volume(vol) => {
+79                        state.volume = vol;
+80                    },
+81                    TrackStateChange::Position(pos) => {
+82                        // Currently, only Tick should fire time events.
+83                        state.position = pos;
+84                    },
+85                    TrackStateChange::Loops(loops, user_set) => {
+86                        state.loops = loops;
+87                        if !user_set {
+88                            global.fire_track_event(TrackEvent::Loop, i);
+89                        }
+90                    },
+91                    TrackStateChange::Total(new) => {
+92                        // Massive, unprecedented state changes.
+93                        *state = new;
+94                    },
+95                    TrackStateChange::Ready(ready_state) => {
+96                        state.ready = ready_state;
+97
+98                        match ready_state {
+99                            ReadyState::Playable => {
+100                                global.fire_track_event(TrackEvent::Playable, i);
+101                            },
+102                            ReadyState::Preparing => {
+103                                global.fire_track_event(TrackEvent::Preparing, i);
+104                            },
+105                            ReadyState::Uninitialised => {},
+106                        }
+107                    },
+108                }
+109            },
+110            EventMessage::RemoveAllTracks => {
+111                info!("Event state for all tracks removed.");
+112
+113                events.clear();
+114                states.clear();
+115                handles.clear();
+116            },
+117            EventMessage::Tick => {
+118                // NOTE: this should fire saved up blocks of state change evts.
+119                global.tick(&mut events, &mut states, &mut handles).await;
+120
+121                let mut i = 0;
+122                while i < states.len() {
+123                    if states[i].playing.is_done() {
+124                        info!("Event state for track {} of {} removed.", i, events.len());
+125
+126                        events.swap_remove(i);
+127                        states.swap_remove(i);
+128                        handles.swap_remove(i);
+129                    } else {
+130                        i += 1;
+131                    }
+132                }
+133            },
+134            EventMessage::Poison => break,
+135        }
+136    }
+137
+138    trace!("Event thread exited.");
+139}
\ No newline at end of file diff --git a/next/src/songbird/driver/tasks/message/core.rs.html b/next/src/songbird/driver/tasks/message/core.rs.html new file mode 100644 index 0000000..d913e31 --- /dev/null +++ b/next/src/songbird/driver/tasks/message/core.rs.html @@ -0,0 +1,33 @@ +core.rs - source

songbird/driver/tasks/message/
core.rs

1#![allow(missing_docs)]
+2
+3use crate::{
+4    driver::{connection::error::Error, Bitrate, Config},
+5    events::{context_data::DisconnectReason, EventData},
+6    tracks::{Track, TrackCommand, TrackHandle},
+7    ConnectionInfo,
+8};
+9use flume::{Receiver, Sender};
+10
+11pub enum CoreMessage {
+12    ConnectWithResult(ConnectionInfo, Sender<Result<(), Error>>),
+13    RetryConnect(usize),
+14    SignalWsClosure(usize, ConnectionInfo, Option<DisconnectReason>),
+15    Disconnect,
+16    SetTrack(Option<TrackContext>),
+17    AddTrack(TrackContext),
+18    SetBitrate(Bitrate),
+19    AddEvent(EventData),
+20    RemoveGlobalEvents,
+21    SetConfig(Config),
+22    Mute(bool),
+23    Reconnect,
+24    FullReconnect,
+25    RebuildInterconnect,
+26    Poison,
+27}
+28
+29pub struct TrackContext {
+30    pub track: Track,
+31    pub handle: TrackHandle,
+32    pub receiver: Receiver<TrackCommand>,
+33}
\ No newline at end of file diff --git a/next/src/songbird/driver/tasks/message/disposal.rs.html b/next/src/songbird/driver/tasks/message/disposal.rs.html new file mode 100644 index 0000000..21a23a6 --- /dev/null +++ b/next/src/songbird/driver/tasks/message/disposal.rs.html @@ -0,0 +1,9 @@ +disposal.rs - source

songbird/driver/tasks/message/
disposal.rs

1#![allow(missing_docs)]
+2
+3use crate::{driver::tasks::mixer::InternalTrack, tracks::TrackHandle};
+4
+5#[allow(dead_code)] // We don't read because all we are doing is dropping.
+6pub enum DisposalMessage {
+7    Track(Box<InternalTrack>),
+8    Handle(TrackHandle),
+9}
\ No newline at end of file diff --git a/next/src/songbird/driver/tasks/message/events.rs.html b/next/src/songbird/driver/tasks/message/events.rs.html new file mode 100644 index 0000000..15a72f1 --- /dev/null +++ b/next/src/songbird/driver/tasks/message/events.rs.html @@ -0,0 +1,34 @@ +events.rs - source

songbird/driver/tasks/message/
events.rs

1#![allow(missing_docs)]
+2
+3use crate::{
+4    events::{CoreContext, EventData, EventStore},
+5    tracks::{LoopState, PlayMode, ReadyState, TrackHandle, TrackState},
+6};
+7use std::time::Duration;
+8
+9pub enum EventMessage {
+10    // Event related.
+11    // Track events should fire off the back of state changes.
+12    AddGlobalEvent(EventData),
+13    AddTrackEvent(usize, EventData),
+14    FireCoreEvent(CoreContext),
+15    RemoveGlobalEvents,
+16
+17    AddTrack(EventStore, TrackState, TrackHandle),
+18    ChangeState(usize, TrackStateChange),
+19    RemoveAllTracks,
+20    Tick,
+21
+22    Poison,
+23}
+24
+25#[derive(Debug)]
+26pub enum TrackStateChange {
+27    Mode(PlayMode),
+28    Volume(f32),
+29    Position(Duration),
+30    // Bool indicates user-set.
+31    Loops(LoopState, bool),
+32    Total(TrackState),
+33    Ready(ReadyState),
+34}
\ No newline at end of file diff --git a/next/src/songbird/driver/tasks/message/mixer.rs.html b/next/src/songbird/driver/tasks/message/mixer.rs.html new file mode 100644 index 0000000..ac986e9 --- /dev/null +++ b/next/src/songbird/driver/tasks/message/mixer.rs.html @@ -0,0 +1,60 @@ +mixer.rs - source

songbird/driver/tasks/message/
mixer.rs

1#![allow(missing_docs)]
+2
+3#[cfg(feature = "receive")]
+4use super::UdpRxMessage;
+5use super::{Interconnect, TrackContext, WsMessage};
+6
+7use crate::{
+8    driver::{crypto::Cipher, Bitrate, Config, CryptoState},
+9    input::{AudioStreamError, Compose, Parsed},
+10};
+11use flume::Sender;
+12use std::{net::UdpSocket, sync::Arc};
+13use symphonia_core::{errors::Error as SymphoniaError, formats::SeekedTo};
+14
+15pub struct MixerConnection {
+16    pub cipher: Cipher,
+17    pub crypto_state: CryptoState,
+18    #[cfg(feature = "receive")]
+19    pub udp_rx: Sender<UdpRxMessage>,
+20    pub udp_tx: UdpSocket,
+21}
+22
+23pub enum MixerMessage {
+24    AddTrack(TrackContext),
+25    SetTrack(Option<TrackContext>),
+26
+27    SetBitrate(Bitrate),
+28    SetConfig(Config),
+29    SetMute(bool),
+30
+31    SetConn(MixerConnection, u32),
+32    Ws(Option<Sender<WsMessage>>),
+33    DropConn,
+34
+35    ReplaceInterconnect(Interconnect),
+36    RebuildEncoder,
+37
+38    Poison,
+39}
+40
+41impl MixerMessage {
+42    #[must_use]
+43    pub fn is_mixer_maybe_live(&self) -> bool {
+44        matches!(
+45            self,
+46            Self::AddTrack(_) | Self::SetTrack(Some(_)) | Self::SetConn(..)
+47        )
+48    }
+49}
+50
+51pub enum MixerInputResultMessage {
+52    CreateErr(Arc<AudioStreamError>),
+53    ParseErr(Arc<SymphoniaError>),
+54    Seek(
+55        Parsed,
+56        Option<Box<dyn Compose>>,
+57        Result<SeekedTo, Arc<SymphoniaError>>,
+58    ),
+59    Built(Parsed, Option<Box<dyn Compose>>),
+60}
\ No newline at end of file diff --git a/next/src/songbird/driver/tasks/message/mod.rs.html b/next/src/songbird/driver/tasks/message/mod.rs.html new file mode 100644 index 0000000..31335b7 --- /dev/null +++ b/next/src/songbird/driver/tasks/message/mod.rs.html @@ -0,0 +1,55 @@ +mod.rs - source

songbird/driver/tasks/message/
mod.rs

1#![allow(missing_docs)]
+2
+3mod core;
+4mod disposal;
+5mod events;
+6mod mixer;
+7#[cfg(feature = "receive")]
+8mod udp_rx;
+9mod ws;
+10
+11#[cfg(feature = "receive")]
+12pub use self::udp_rx::*;
+13pub use self::{core::*, disposal::*, events::*, mixer::*, ws::*};
+14
+15use flume::Sender;
+16use tokio::spawn;
+17use tracing::trace;
+18
+19#[derive(Clone, Debug)]
+20pub struct Interconnect {
+21    pub core: Sender<CoreMessage>,
+22    pub events: Sender<EventMessage>,
+23    pub mixer: Sender<MixerMessage>,
+24}
+25
+26impl Interconnect {
+27    pub fn poison(&self) {
+28        drop(self.events.send(EventMessage::Poison));
+29    }
+30
+31    pub fn poison_all(&self) {
+32        drop(self.mixer.send(MixerMessage::Poison));
+33        self.poison();
+34    }
+35
+36    pub fn restart_volatile_internals(&mut self) {
+37        self.poison();
+38
+39        let (evt_tx, evt_rx) = flume::unbounded();
+40
+41        self.events = evt_tx;
+42
+43        spawn(async move {
+44            trace!("Event processor restarted.");
+45            super::events::runner(evt_rx).await;
+46            trace!("Event processor finished.");
+47        });
+48
+49        // Make mixer aware of new targets...
+50        drop(
+51            self.mixer
+52                .send(MixerMessage::ReplaceInterconnect(self.clone())),
+53        );
+54    }
+55}
\ No newline at end of file diff --git a/next/src/songbird/driver/tasks/message/udp_rx.rs.html b/next/src/songbird/driver/tasks/message/udp_rx.rs.html new file mode 100644 index 0000000..ad9428c --- /dev/null +++ b/next/src/songbird/driver/tasks/message/udp_rx.rs.html @@ -0,0 +1,17 @@ +udp_rx.rs - source

songbird/driver/tasks/message/
udp_rx.rs

1#![allow(missing_docs)]
+2
+3use super::Interconnect;
+4use crate::driver::DecodeConfig;
+5use dashmap::{DashMap, DashSet};
+6use serenity_voice_model::id::UserId;
+7
+8pub enum UdpRxMessage {
+9    SetConfig(DecodeConfig),
+10    ReplaceInterconnect(Interconnect),
+11}
+12
+13#[derive(Debug, Default)]
+14pub struct SsrcTracker {
+15    pub disconnected_users: DashSet<UserId>,
+16    pub user_ssrc_map: DashMap<UserId, u32>,
+17}
\ No newline at end of file diff --git a/next/src/songbird/driver/tasks/message/ws.rs.html b/next/src/songbird/driver/tasks/message/ws.rs.html new file mode 100644 index 0000000..83feaf3 --- /dev/null +++ b/next/src/songbird/driver/tasks/message/ws.rs.html @@ -0,0 +1,12 @@ +ws.rs - source

songbird/driver/tasks/message/
ws.rs

1#![allow(missing_docs)]
+2
+3use super::Interconnect;
+4use crate::{model::Event as GatewayEvent, ws::WsStream};
+5
+6pub enum WsMessage {
+7    Ws(Box<WsStream>),
+8    ReplaceInterconnect(Interconnect),
+9    SetKeepalive(f64),
+10    Speaking(bool),
+11    Deliver(GatewayEvent),
+12}
\ No newline at end of file diff --git a/next/src/songbird/driver/tasks/mixer/mix_logic.rs.html b/next/src/songbird/driver/tasks/mixer/mix_logic.rs.html new file mode 100644 index 0000000..ba26872 --- /dev/null +++ b/next/src/songbird/driver/tasks/mixer/mix_logic.rs.html @@ -0,0 +1,444 @@ +mix_logic.rs - source

songbird/driver/tasks/mixer/
mix_logic.rs

1use super::*;
+2
+3/// Mix a track's audio stream into either the shared mixing buffer, or directly into the output
+4/// packet ("passthrough") when possible.
+5///
+6/// Passthrough is highest performance, but the source MUST be opus, have 20ms frames, and be the only
+7/// live track. In this case we copy the opus-encoded data with no changes. Otherwise, we fall back to
+8/// below.
+9///
+10/// There are a few functional requirements here for non-passthrough mixing that make it tricky:
+11/// * Input frame lengths are not congruent with what we need to send (i.e., 26.12ms in MP3 vs
+12///   needed 20ms).
+13/// * Input audio arrives at a different sample rate from required (i.e., 44.1 vs needed 48 kHz).
+14/// * Input data may not be `f32`s.
+15/// * Input data may not match stereo/mono of desired output.
+16///
+17/// All of the above challenges often happen at once. The rough pipeline in processing is:
+18///
+19/// until source end or 20 ms taken:
+20///   (use previous frame 'til empty / get new frame) -> [resample] -> [audio += vol * (sample as f32)]
+21///
+22/// Typically, we mix between a subset of the input packet and the output buf because the 20ms window
+23/// straddles packet boundaries. If there's enough space AND 48kHz AND receive f32s, then we use a fast
+24/// path.
+25///
+26/// In the mono -> stereo case, we duplicate across all target channels. In stereo -> mono, we average
+27/// the samples from each channel.
+28///
+29/// To avoid needing to hold onto resampled data longer than one mix cycle, we take enough input samples
+30/// to fill a chunk of the mixer (e.g., 10ms == 20ms / 2) so that they will all be used.
+31///
+32/// This is a fairly annoying piece of code to reason about, mainly because you need to hold so many
+33/// internal positions into: the mix buffer, resample buffers, and previous/current packets
+34/// for a stream.
+35#[inline]
+36pub fn mix_symph_indiv(
+37    // shared buffer to mix into.
+38    symph_mix: &mut AudioBuffer<f32>,
+39    // buffer to hold built up packet
+40    resample_scratch: &mut AudioBuffer<f32>,
+41    // the input stream to use
+42    input: &mut Parsed,
+43    // resampler state and positions into partially read packets
+44    local_state: &mut DecodeState,
+45    // volume of this source
+46    volume: f32,
+47    // window into the output UDP buffer to copy opus frames into.
+48    // This is set to `Some` IF passthrough is possible (i.e., one live source).
+49    mut opus_slot: Option<&mut [u8]>,
+50) -> (MixType, MixStatus) {
+51    let mut samples_written = 0;
+52    let mut resample_in_progress = false;
+53    let mut track_status = MixStatus::Live;
+54    let codec_type = input.decoder.codec_params().codec;
+55
+56    resample_scratch.clear();
+57
+58    while samples_written != MONO_FRAME_SIZE {
+59        // fetch a packet: either in progress, passthrough (early exit), or
+60        let source_packet = if local_state.inner_pos != 0 {
+61            Some(input.decoder.last_decoded())
+62        } else if let Ok(pkt) = input.format.next_packet() {
+63            if pkt.track_id() != input.track_id {
+64                continue;
+65            }
+66
+67            let buf = pkt.buf();
+68
+69            // Opus packet passthrough special case.
+70            if codec_type == CODEC_TYPE_OPUS && local_state.passthrough != Passthrough::Block {
+71                if let Some(slot) = opus_slot.as_mut() {
+72                    let sample_ct = buf
+73                        .try_into()
+74                        .and_then(|buf| audiopus::packet::nb_samples(buf, SAMPLE_RATE));
+75
+76                    // We don't actually block passthrough until a few violations are
+77                    // seen. The main one is that most Opus tracks end on a sub-20ms
+78                    // frame, particularly on Youtube.
+79                    // However, a frame that's bigger than the target buffer is an instant block.
+80                    let buf_size_fatal = buf.len() >= slot.len();
+81
+82                    if match sample_ct {
+83                        Ok(MONO_FRAME_SIZE) => true,
+84                        _ => !local_state.record_and_check_passthrough_strike_final(buf_size_fatal),
+85                    } {
+86                        slot.write_all(buf)
+87                            .expect("Bounds check performed, and failure will block passthrough.");
+88
+89                        return (MixType::Passthrough(buf.len()), MixStatus::Live);
+90                    }
+91                }
+92            }
+93
+94            input
+95                .decoder
+96                .decode(&pkt)
+97                .map_err(|e| {
+98                    track_status = e.into();
+99                })
+100                .ok()
+101        } else {
+102            track_status = MixStatus::Ended;
+103            None
+104        };
+105
+106        // Cleanup: failed to get the next packet, but still have to convert and mix scratch.
+107        if source_packet.is_none() {
+108            if resample_in_progress {
+109                // fill up remainder of buf with zeroes, resample, mix
+110                let (chan_c, resampler, rs_out_buf) = local_state.resampler.as_mut().unwrap();
+111                let in_len = resample_scratch.frames();
+112                let to_render = resampler.input_frames_next().saturating_sub(in_len);
+113
+114                if to_render != 0 {
+115                    resample_scratch.render_reserved(Some(to_render));
+116                    for plane in resample_scratch.planes_mut().planes() {
+117                        for val in &mut plane[in_len..] {
+118                            *val = 0.0f32;
+119                        }
+120                    }
+121                }
+122
+123                // Luckily, we make use of the WHOLE input buffer here.
+124                resampler
+125                    .process_into_buffer(
+126                        &resample_scratch.planes().planes()[..*chan_c],
+127                        rs_out_buf,
+128                        None,
+129                    )
+130                    .unwrap();
+131
+132                // Calculate true end position using sample rate math
+133                let ratio = (rs_out_buf[0].len() as f32) / (resample_scratch.frames() as f32);
+134                let out_samples = (ratio * (in_len as f32)).round() as usize;
+135
+136                mix_resampled(rs_out_buf, symph_mix, samples_written, volume);
+137
+138                samples_written += out_samples;
+139            }
+140
+141            break;
+142        }
+143
+144        let source_packet = source_packet.unwrap();
+145
+146        let in_rate = source_packet.spec().rate;
+147        let pkt_frames = source_packet.frames();
+148
+149        if pkt_frames == 0 {
+150            continue;
+151        }
+152
+153        if in_rate == SAMPLE_RATE_RAW as u32 {
+154            // No need to resample: mix as standard.
+155            let samples_marched = mix_over_ref(
+156                &source_packet,
+157                symph_mix,
+158                local_state.inner_pos,
+159                samples_written,
+160                volume,
+161            );
+162
+163            samples_written += samples_marched;
+164
+165            local_state.inner_pos += samples_marched;
+166            local_state.inner_pos %= pkt_frames;
+167        } else {
+168            // NOTE: this should NEVER change in one stream.
+169            let chan_c = source_packet.spec().channels.count();
+170            let (_, resampler, rs_out_buf) = local_state.resampler.get_or_insert_with(|| {
+171                // TODO: integ. error handling here.
+172                let resampler = FftFixedOut::new(
+173                    in_rate as usize,
+174                    SAMPLE_RATE_RAW,
+175                    RESAMPLE_OUTPUT_FRAME_SIZE,
+176                    4,
+177                    chan_c,
+178                )
+179                .expect("Failed to create resampler.");
+180                let out_buf = resampler.output_buffer_allocate(true);
+181
+182                (chan_c, resampler, out_buf)
+183            });
+184
+185            let inner_pos = local_state.inner_pos;
+186
+187            let needed_in_frames = resampler.input_frames_next();
+188            let available_frames = pkt_frames - inner_pos;
+189
+190            let force_copy = resample_in_progress || needed_in_frames > available_frames;
+191            if (!force_copy) && matches!(source_packet, AudioBufferRef::F32(_)) {
+192                // This is the only case where we can pull off a straight resample...
+193                // I would really like if this could be a slice of slices,
+194                // but the technology just isn't there yet. And I don't feel like
+195                // writing unsafe transformations to do so.
+196
+197                // NOTE: if let needed as if-let && {bool} is nightly only.
+198                if let AudioBufferRef::F32(s_pkt) = source_packet {
+199                    let refs: Vec<&[f32]> = s_pkt
+200                        .planes()
+201                        .planes()
+202                        .iter()
+203                        .map(|s| &s[inner_pos..][..needed_in_frames])
+204                        .collect();
+205
+206                    local_state.inner_pos += needed_in_frames;
+207                    local_state.inner_pos %= pkt_frames;
+208
+209                    resampler
+210                        .process_into_buffer(&refs, rs_out_buf, None)
+211                        .unwrap();
+212                } else {
+213                    unreachable!()
+214                }
+215            } else {
+216                // We either lack enough samples, or have the wrong data format, forcing
+217                // a conversion/copy into the buffer.
+218                let old_scratch_len = resample_scratch.frames();
+219                let missing_frames = needed_in_frames - old_scratch_len;
+220                let frames_to_take = available_frames.min(missing_frames);
+221
+222                resample_scratch.render_reserved(Some(frames_to_take));
+223                copy_into_resampler(
+224                    &source_packet,
+225                    resample_scratch,
+226                    inner_pos,
+227                    old_scratch_len,
+228                    frames_to_take,
+229                );
+230
+231                local_state.inner_pos += frames_to_take;
+232                local_state.inner_pos %= pkt_frames;
+233
+234                if resample_scratch.frames() == needed_in_frames {
+235                    resampler
+236                        .process_into_buffer(
+237                            &resample_scratch.planes().planes()[..chan_c],
+238                            rs_out_buf,
+239                            None,
+240                        )
+241                        .unwrap();
+242                    resample_scratch.clear();
+243                    resample_in_progress = false;
+244                } else {
+245                    // Not enough data to fill the resampler: fetch more.
+246                    resample_in_progress = true;
+247                    continue;
+248                }
+249            }
+250
+251            let samples_marched = mix_resampled(rs_out_buf, symph_mix, samples_written, volume);
+252
+253            samples_written += samples_marched;
+254        }
+255    }
+256
+257    (MixType::MixedPcm(samples_written), track_status)
+258}
+259
+260#[inline]
+261fn mix_over_ref(
+262    source: &AudioBufferRef<'_>,
+263    target: &mut AudioBuffer<f32>,
+264    source_pos: usize,
+265    dest_pos: usize,
+266    volume: f32,
+267) -> usize {
+268    match source {
+269        AudioBufferRef::U8(v) => mix_symph_buffer(v, target, source_pos, dest_pos, volume),
+270        AudioBufferRef::U16(v) => mix_symph_buffer(v, target, source_pos, dest_pos, volume),
+271        AudioBufferRef::U24(v) => mix_symph_buffer(v, target, source_pos, dest_pos, volume),
+272        AudioBufferRef::U32(v) => mix_symph_buffer(v, target, source_pos, dest_pos, volume),
+273        AudioBufferRef::S8(v) => mix_symph_buffer(v, target, source_pos, dest_pos, volume),
+274        AudioBufferRef::S16(v) => mix_symph_buffer(v, target, source_pos, dest_pos, volume),
+275        AudioBufferRef::S24(v) => mix_symph_buffer(v, target, source_pos, dest_pos, volume),
+276        AudioBufferRef::S32(v) => mix_symph_buffer(v, target, source_pos, dest_pos, volume),
+277        AudioBufferRef::F32(v) => mix_symph_buffer(v, target, source_pos, dest_pos, volume),
+278        AudioBufferRef::F64(v) => mix_symph_buffer(v, target, source_pos, dest_pos, volume),
+279    }
+280}
+281
+282#[inline]
+283fn mix_symph_buffer<S>(
+284    source: &AudioBuffer<S>,
+285    target: &mut AudioBuffer<f32>,
+286    source_pos: usize,
+287    dest_pos: usize,
+288    volume: f32,
+289) -> usize
+290where
+291    S: Sample + IntoSample<f32>,
+292{
+293    // mix in source_packet[inner_pos..] til end of EITHER buffer.
+294    let src_usable = source.frames() - source_pos;
+295    let tgt_usable = target.frames() - dest_pos;
+296
+297    let mix_ct = src_usable.min(tgt_usable);
+298
+299    let target_chans = target.spec().channels.count();
+300    let target_mono = target_chans == 1;
+301    let source_chans = source.spec().channels.count();
+302    let source_mono = source_chans == 1;
+303
+304    let source_planes = source.planes();
+305    let source_raw_planes = source_planes.planes();
+306
+307    if source_mono {
+308        // mix this signal into *all* output channels at req'd volume.
+309        let source_plane = source_raw_planes[0];
+310        for d_plane in &mut (*target.planes_mut().planes()) {
+311            for (d, s) in d_plane[dest_pos..dest_pos + mix_ct]
+312                .iter_mut()
+313                .zip(source_plane[source_pos..source_pos + mix_ct].iter())
+314            {
+315                *d += volume * (*s).into_sample();
+316            }
+317        }
+318    } else if target_mono {
+319        // mix all signals into the one target channel: reduce aggregate volume
+320        // by n_channels.
+321        let vol_adj = 1.0 / (source_chans as f32);
+322        let mut t_planes = target.planes_mut();
+323        let d_plane = &mut *t_planes.planes()[0];
+324        for s_plane in source_raw_planes {
+325            for (d, s) in d_plane[dest_pos..dest_pos + mix_ct]
+326                .iter_mut()
+327                .zip(s_plane[source_pos..source_pos + mix_ct].iter())
+328            {
+329                *d += volume * vol_adj * (*s).into_sample();
+330            }
+331        }
+332    } else {
+333        // stereo -> stereo: don't change volume, map input -> output channels w/ no duplication
+334        for (d_plane, s_plane) in (*target.planes_mut().planes())
+335            .iter_mut()
+336            .zip(source_raw_planes[..].iter())
+337        {
+338            for (d, s) in d_plane[dest_pos..dest_pos + mix_ct]
+339                .iter_mut()
+340                .zip(s_plane[source_pos..source_pos + mix_ct].iter())
+341            {
+342                *d += volume * (*s).into_sample();
+343            }
+344        }
+345    }
+346
+347    mix_ct
+348}
+349
+350#[inline]
+351fn mix_resampled(
+352    source: &[Vec<f32>],
+353    target: &mut AudioBuffer<f32>,
+354    dest_pos: usize,
+355    volume: f32,
+356) -> usize {
+357    let mix_ct = source[0].len();
+358
+359    let target_chans = target.spec().channels.count();
+360    let target_mono = target_chans == 1;
+361    let source_chans = source.len();
+362    let source_mono = source_chans == 1;
+363
+364    // see `mix_symph_buffer` for explanations of stereo<->mono logic.
+365    if source_mono {
+366        let source_plane = &source[0];
+367        for d_plane in &mut (*target.planes_mut().planes()) {
+368            for (d, s) in d_plane[dest_pos..dest_pos + mix_ct]
+369                .iter_mut()
+370                .zip(source_plane)
+371            {
+372                *d += volume * s;
+373            }
+374        }
+375    } else if target_mono {
+376        let vol_adj = 1.0 / (source_chans as f32);
+377        let mut t_planes = target.planes_mut();
+378        let d_plane = &mut *t_planes.planes()[0];
+379        for s_plane in source {
+380            for (d, s) in d_plane[dest_pos..dest_pos + mix_ct].iter_mut().zip(s_plane) {
+381                *d += volume * vol_adj * s;
+382            }
+383        }
+384    } else {
+385        for (d_plane, s_plane) in (*target.planes_mut().planes())
+386            .iter_mut()
+387            .zip(source[..].iter())
+388        {
+389            for (d, s) in d_plane[dest_pos..dest_pos + mix_ct].iter_mut().zip(s_plane) {
+390                *d += volume * (*s);
+391            }
+392        }
+393    }
+394
+395    mix_ct
+396}
+397
+398#[inline]
+399pub(crate) fn copy_into_resampler(
+400    source: &AudioBufferRef<'_>,
+401    target: &mut AudioBuffer<f32>,
+402    source_pos: usize,
+403    dest_pos: usize,
+404    len: usize,
+405) -> usize {
+406    match source {
+407        AudioBufferRef::U8(v) => copy_symph_buffer(v, target, source_pos, dest_pos, len),
+408        AudioBufferRef::U16(v) => copy_symph_buffer(v, target, source_pos, dest_pos, len),
+409        AudioBufferRef::U24(v) => copy_symph_buffer(v, target, source_pos, dest_pos, len),
+410        AudioBufferRef::U32(v) => copy_symph_buffer(v, target, source_pos, dest_pos, len),
+411        AudioBufferRef::S8(v) => copy_symph_buffer(v, target, source_pos, dest_pos, len),
+412        AudioBufferRef::S16(v) => copy_symph_buffer(v, target, source_pos, dest_pos, len),
+413        AudioBufferRef::S24(v) => copy_symph_buffer(v, target, source_pos, dest_pos, len),
+414        AudioBufferRef::S32(v) => copy_symph_buffer(v, target, source_pos, dest_pos, len),
+415        AudioBufferRef::F32(v) => copy_symph_buffer(v, target, source_pos, dest_pos, len),
+416        AudioBufferRef::F64(v) => copy_symph_buffer(v, target, source_pos, dest_pos, len),
+417    }
+418}
+419
+420#[inline]
+421fn copy_symph_buffer<S>(
+422    source: &AudioBuffer<S>,
+423    target: &mut AudioBuffer<f32>,
+424    source_pos: usize,
+425    dest_pos: usize,
+426    len: usize,
+427) -> usize
+428where
+429    S: Sample + IntoSample<f32>,
+430{
+431    for (d_plane, s_plane) in (*target.planes_mut().planes())
+432        .iter_mut()
+433        .zip(source.planes().planes()[..].iter())
+434    {
+435        for (d, s) in d_plane[dest_pos..dest_pos + len]
+436            .iter_mut()
+437            .zip(s_plane[source_pos..source_pos + len].iter())
+438        {
+439            *d = (*s).into_sample();
+440        }
+441    }
+442
+443    len
+444}
\ No newline at end of file diff --git a/next/src/songbird/driver/tasks/mixer/mod.rs.html b/next/src/songbird/driver/tasks/mixer/mod.rs.html new file mode 100644 index 0000000..aa6bcdb --- /dev/null +++ b/next/src/songbird/driver/tasks/mixer/mod.rs.html @@ -0,0 +1,877 @@ +mod.rs - source

songbird/driver/tasks/mixer/
mod.rs

1pub mod mix_logic;
+2mod pool;
+3mod result;
+4pub mod state;
+5pub mod track;
+6mod util;
+7
+8use pool::*;
+9use result::*;
+10use state::*;
+11pub use track::*;
+12
+13use super::{
+14    disposal::DisposalThread,
+15    error::{Error, Result},
+16    message::*,
+17};
+18use crate::{
+19    constants::*,
+20    driver::{CryptoMode, MixMode},
+21    events::EventStore,
+22    input::{Input, Parsed},
+23    tracks::{Action, LoopState, PlayError, PlayMode, TrackCommand, TrackHandle, TrackState, View},
+24    Config,
+25};
+26use audiopus::{
+27    coder::Encoder as OpusEncoder,
+28    softclip::SoftClip,
+29    Application as CodingMode,
+30    Bitrate,
+31};
+32use discortp::{
+33    discord::MutableKeepalivePacket,
+34    rtp::{MutableRtpPacket, RtpPacket},
+35    MutablePacket,
+36};
+37use flume::{Receiver, SendError, Sender, TryRecvError};
+38use rand::random;
+39use rubato::{FftFixedOut, Resampler};
+40use std::{
+41    io::Write,
+42    result::Result as StdResult,
+43    sync::Arc,
+44    time::{Duration, Instant},
+45};
+46use symphonia_core::{
+47    audio::{AudioBuffer, AudioBufferRef, Layout, SampleBuffer, Signal, SignalSpec},
+48    codecs::CODEC_TYPE_OPUS,
+49    conv::IntoSample,
+50    formats::SeekTo,
+51    sample::Sample,
+52    units::Time,
+53};
+54use tokio::runtime::Handle;
+55use tracing::error;
+56
+57#[cfg(test)]
+58use crate::driver::test_config::{OutputMessage, OutputMode};
+59#[cfg(test)]
+60use discortp::Packet as _;
+61
+62pub struct Mixer {
+63    pub bitrate: Bitrate,
+64    pub config: Arc<Config>,
+65    pub conn_active: Option<MixerConnection>,
+66    pub deadline: Instant,
+67    pub disposer: DisposalThread,
+68    pub encoder: OpusEncoder,
+69    pub interconnect: Interconnect,
+70    pub mix_rx: Receiver<MixerMessage>,
+71    pub muted: bool,
+72    // pub packet: [u8; VOICE_PACKET_MAX],
+73    pub prevent_events: bool,
+74    pub silence_frames: u8,
+75    pub soft_clip: SoftClip,
+76    thread_pool: BlockyTaskPool,
+77    pub ws: Option<Sender<WsMessage>>,
+78
+79    pub keepalive_deadline: Instant,
+80    pub keepalive_packet: [u8; MutableKeepalivePacket::minimum_packet_size()],
+81
+82    pub tracks: Vec<InternalTrack>,
+83    track_handles: Vec<TrackHandle>,
+84
+85    sample_buffer: SampleBuffer<f32>,
+86    symph_mix: AudioBuffer<f32>,
+87    resample_scratch: AudioBuffer<f32>,
+88
+89    #[cfg(test)]
+90    pub remaining_loops: Option<u64>,
+91
+92    #[cfg(test)]
+93    raw_msg: Option<OutputMessage>,
+94}
+95
+96fn new_encoder(bitrate: Bitrate, mix_mode: MixMode) -> Result<OpusEncoder> {
+97    let mut encoder = OpusEncoder::new(SAMPLE_RATE, mix_mode.to_opus(), CodingMode::Audio)?;
+98    encoder.set_bitrate(bitrate)?;
+99
+100    Ok(encoder)
+101}
+102
+103impl Mixer {
+104    #[must_use]
+105    pub fn new(
+106        mix_rx: Receiver<MixerMessage>,
+107        async_handle: Handle,
+108        interconnect: Interconnect,
+109        config: Config,
+110    ) -> Self {
+111        let bitrate = DEFAULT_BITRATE;
+112        let encoder = new_encoder(bitrate, config.mix_mode)
+113            .expect("Failed to create encoder in mixing thread with known-good values.");
+114        let soft_clip = SoftClip::new(config.mix_mode.to_opus());
+115
+116        let keepalive_packet = [0u8; MutableKeepalivePacket::minimum_packet_size()];
+117
+118        let tracks = Vec::with_capacity(1.max(config.preallocated_tracks));
+119        let track_handles = Vec::with_capacity(1.max(config.preallocated_tracks));
+120
+121        let thread_pool = BlockyTaskPool::new(async_handle);
+122
+123        let symph_layout = config.mix_mode.symph_layout();
+124
+125        let disposer = config.disposer.clone().unwrap_or_default();
+126        let config = config.into();
+127
+128        let sample_buffer = SampleBuffer::<f32>::new(
+129            MONO_FRAME_SIZE as u64,
+130            symphonia_core::audio::SignalSpec::new_with_layout(
+131                SAMPLE_RATE_RAW as u32,
+132                symph_layout,
+133            ),
+134        );
+135        let symph_mix = AudioBuffer::<f32>::new(
+136            MONO_FRAME_SIZE as u64,
+137            symphonia_core::audio::SignalSpec::new_with_layout(
+138                SAMPLE_RATE_RAW as u32,
+139                symph_layout,
+140            ),
+141        );
+142        let resample_scratch = AudioBuffer::<f32>::new(
+143            MONO_FRAME_SIZE as u64,
+144            SignalSpec::new_with_layout(SAMPLE_RATE_RAW as u32, Layout::Stereo),
+145        );
+146
+147        let deadline = Instant::now();
+148
+149        Self {
+150            bitrate,
+151            config,
+152            conn_active: None,
+153            deadline,
+154            disposer,
+155            encoder,
+156            interconnect,
+157            mix_rx,
+158            muted: false,
+159            prevent_events: false,
+160            silence_frames: 0,
+161            soft_clip,
+162            thread_pool,
+163            ws: None,
+164
+165            keepalive_deadline: deadline,
+166            keepalive_packet,
+167
+168            tracks,
+169            track_handles,
+170
+171            sample_buffer,
+172            symph_mix,
+173            resample_scratch,
+174
+175            #[cfg(test)]
+176            remaining_loops: None,
+177            #[cfg(test)]
+178            raw_msg: None,
+179        }
+180    }
+181
+182    fn set_bitrate(&mut self, bitrate: Bitrate) -> Result<()> {
+183        self.encoder.set_bitrate(bitrate).map_err(Into::into)
+184    }
+185
+186    pub(crate) fn do_rebuilds(
+187        &mut self,
+188        event_failure: bool,
+189        conn_failure: bool,
+190    ) -> StdResult<(), SendError<CoreMessage>> {
+191        // event failure? rebuild interconnect.
+192        // ws or udp failure? full connect
+193        // (soft reconnect is covered by the ws task.)
+194        //
+195        // in both cases, send failure is fatal,
+196        // but will only occur on disconnect.
+197        if event_failure {
+198            self.rebuild_interconnect()?;
+199        }
+200
+201        if conn_failure {
+202            self.full_reconnect_gateway()?;
+203        }
+204
+205        Ok(())
+206    }
+207
+208    pub(crate) fn rebuild_interconnect(&mut self) -> StdResult<(), SendError<CoreMessage>> {
+209        self.prevent_events = true;
+210        self.interconnect
+211            .core
+212            .send(CoreMessage::RebuildInterconnect)
+213    }
+214
+215    pub(crate) fn full_reconnect_gateway(&mut self) -> StdResult<(), SendError<CoreMessage>> {
+216        self.conn_active = None;
+217        self.interconnect.core.send(CoreMessage::FullReconnect)
+218    }
+219
+220    #[inline]
+221    pub(crate) fn handle_message(
+222        &mut self,
+223        msg: MixerMessage,
+224        packet: &mut [u8],
+225    ) -> (bool, bool, bool) {
+226        let mut events_failure = false;
+227        let mut conn_failure = false;
+228        let mut should_exit = false;
+229
+230        let error = match msg {
+231            MixerMessage::AddTrack(t) => self.add_track(t),
+232            MixerMessage::SetTrack(t) => {
+233                self.tracks.clear();
+234                self.track_handles.clear();
+235
+236                let mut out = self.fire_event(EventMessage::RemoveAllTracks);
+237
+238                if let Some(t) = t {
+239                    // Do this unconditionally: this affects local state infallibly,
+240                    // with the event installation being the remote part.
+241                    if let Err(e) = self.add_track(t) {
+242                        out = Err(e);
+243                    }
+244                }
+245
+246                out
+247            },
+248            MixerMessage::SetBitrate(b) => {
+249                self.bitrate = b;
+250                if let Err(e) = self.set_bitrate(b) {
+251                    error!("Failed to update bitrate {:?}", e);
+252                }
+253                Ok(())
+254            },
+255            MixerMessage::SetMute(m) => {
+256                self.muted = m;
+257                Ok(())
+258            },
+259            MixerMessage::SetConn(conn, ssrc) => {
+260                self.conn_active = Some(conn);
+261                let mut rtp = MutableRtpPacket::new(packet).expect(
+262                    "Too few bytes in self.packet for RTP header.\
+263                        (Blame: VOICE_PACKET_MAX?)",
+264                );
+265                rtp.set_ssrc(ssrc);
+266                rtp.set_sequence(random::<u16>().into());
+267                rtp.set_timestamp(random::<u32>().into());
+268                self.deadline = Instant::now();
+269
+270                self.update_keepalive(ssrc);
+271                Ok(())
+272            },
+273            MixerMessage::DropConn => {
+274                self.conn_active = None;
+275                Ok(())
+276            },
+277            MixerMessage::ReplaceInterconnect(i) => {
+278                self.prevent_events = false;
+279
+280                if let Some(ws) = &self.ws {
+281                    conn_failure |= ws.send(WsMessage::ReplaceInterconnect(i.clone())).is_err();
+282                }
+283
+284                #[cfg(feature = "receive")]
+285                if let Some(conn) = &self.conn_active {
+286                    conn_failure |= conn
+287                        .udp_rx
+288                        .send(UdpRxMessage::ReplaceInterconnect(i.clone()))
+289                        .is_err();
+290                }
+291
+292                self.interconnect = i;
+293
+294                self.rebuild_tracks()
+295            },
+296            MixerMessage::SetConfig(new_config) => {
+297                if new_config.mix_mode != self.config.mix_mode {
+298                    self.soft_clip = SoftClip::new(new_config.mix_mode.to_opus());
+299                    if let Ok(enc) = new_encoder(self.bitrate, new_config.mix_mode) {
+300                        self.encoder = enc;
+301                    } else {
+302                        self.bitrate = DEFAULT_BITRATE;
+303                        self.encoder = new_encoder(self.bitrate, new_config.mix_mode)
+304                            .expect("Failed fallback rebuild of OpusEncoder with safe inputs.");
+305                    }
+306
+307                    let sl = new_config.mix_mode.symph_layout();
+308                    self.sample_buffer = SampleBuffer::<f32>::new(
+309                        MONO_FRAME_SIZE as u64,
+310                        SignalSpec::new_with_layout(SAMPLE_RATE_RAW as u32, sl),
+311                    );
+312                    self.symph_mix = AudioBuffer::<f32>::new(
+313                        MONO_FRAME_SIZE as u64,
+314                        SignalSpec::new_with_layout(SAMPLE_RATE_RAW as u32, sl),
+315                    );
+316                }
+317
+318                self.config = Arc::new(
+319                    #[cfg(feature = "receive")]
+320                    new_config.clone(),
+321                    #[cfg(not(feature = "receive"))]
+322                    new_config,
+323                );
+324
+325                if self.tracks.capacity() < self.config.preallocated_tracks {
+326                    self.tracks
+327                        .reserve(self.config.preallocated_tracks - self.tracks.len());
+328                }
+329
+330                #[cfg(feature = "receive")]
+331                if let Some(conn) = &self.conn_active {
+332                    if let crate::driver::DecodeMode::Decode(decode_config) = new_config.decode_mode
+333                    {
+334                        let msg = UdpRxMessage::SetConfig(decode_config);
+335                        conn_failure |= conn.udp_rx.send(msg).is_err();
+336                    }
+337                }
+338
+339                Ok(())
+340            },
+341            MixerMessage::RebuildEncoder => match new_encoder(self.bitrate, self.config.mix_mode) {
+342                Ok(encoder) => {
+343                    self.encoder = encoder;
+344                    Ok(())
+345                },
+346                Err(e) => {
+347                    error!("Failed to rebuild encoder. Resetting bitrate. {:?}", e);
+348                    self.bitrate = DEFAULT_BITRATE;
+349                    self.encoder = new_encoder(self.bitrate, self.config.mix_mode)
+350                        .expect("Failed fallback rebuild of OpusEncoder with safe inputs.");
+351                    Ok(())
+352                },
+353            },
+354            MixerMessage::Ws(new_ws_handle) => {
+355                self.ws = new_ws_handle;
+356                if let Err(e) = self.send_gateway_speaking() {
+357                    conn_failure |= e.should_trigger_connect();
+358                }
+359                Ok(())
+360            },
+361            MixerMessage::Poison => {
+362                should_exit = true;
+363                Ok(())
+364            },
+365        };
+366
+367        if let Err(e) = error {
+368            events_failure |= e.should_trigger_interconnect_rebuild();
+369            conn_failure |= e.should_trigger_connect();
+370        }
+371
+372        (events_failure, conn_failure, should_exit)
+373    }
+374
+375    pub(crate) fn update_keepalive(&mut self, ssrc: u32) {
+376        let mut ka = MutableKeepalivePacket::new(&mut self.keepalive_packet[..])
+377            .expect("FATAL: Insufficient bytes given to keepalive packet.");
+378        ka.set_ssrc(ssrc);
+379        self.keepalive_deadline = self.deadline + UDP_KEEPALIVE_GAP;
+380    }
+381
+382    #[inline]
+383    pub(crate) fn fire_event(&self, event: EventMessage) -> Result<()> {
+384        // As this task is responsible for noticing the potential death of an event context,
+385        // it's responsible for not forcibly recreating said context repeatedly.
+386        if !self.prevent_events {
+387            self.interconnect.events.send(event)?;
+388        }
+389
+390        Ok(())
+391    }
+392
+393    #[inline]
+394    pub fn add_track(&mut self, track: TrackContext) -> Result<()> {
+395        let (track, evts, state, handle) = InternalTrack::decompose_track(track);
+396        self.tracks.push(track);
+397        self.track_handles.push(handle.clone());
+398        self.interconnect
+399            .events
+400            .send(EventMessage::AddTrack(evts, state, handle))?;
+401
+402        Ok(())
+403    }
+404
+405    // rebuilds the event thread's view of each track, in event of a full rebuild.
+406    #[inline]
+407    fn rebuild_tracks(&mut self) -> Result<()> {
+408        for (track, handle) in self.tracks.iter().zip(self.track_handles.iter()) {
+409            let evts = EventStore::default();
+410            let state = track.state();
+411            let handle = handle.clone();
+412
+413            self.interconnect
+414                .events
+415                .send(EventMessage::AddTrack(evts, state, handle))?;
+416        }
+417
+418        Ok(())
+419    }
+420
+421    #[inline]
+422    pub(crate) fn audio_commands_events(&mut self) -> Result<()> {
+423        // Apply user commands.
+424        for (i, track) in self.tracks.iter_mut().enumerate() {
+425            // This causes fallible event system changes,
+426            // but if the event thread has died then we'll certainly
+427            // detect that on the tick later.
+428            // Changes to play state etc. MUST all be handled.
+429            let action = track.process_commands(i, &self.interconnect);
+430
+431            if let Some(req) = action.seek_point {
+432                track.seek(
+433                    i,
+434                    req,
+435                    &self.interconnect,
+436                    &self.thread_pool,
+437                    &self.config,
+438                    self.prevent_events,
+439                );
+440            }
+441
+442            if let Some(callback) = action.make_playable {
+443                if let Err(e) = track.get_or_ready_input(
+444                    i,
+445                    &self.interconnect,
+446                    &self.thread_pool,
+447                    &self.config,
+448                    self.prevent_events,
+449                ) {
+450                    track.callbacks.make_playable = Some(callback);
+451                    if let Some(fail) = e.as_user() {
+452                        track.playing = PlayMode::Errored(fail);
+453                    }
+454                    if let Some(req) = e.into_seek_request() {
+455                        track.seek(
+456                            i,
+457                            req,
+458                            &self.interconnect,
+459                            &self.thread_pool,
+460                            &self.config,
+461                            self.prevent_events,
+462                        );
+463                    }
+464                } else {
+465                    // Track is already ready: don't register callback and just act.
+466                    drop(callback.send(Ok(())));
+467                }
+468            }
+469        }
+470
+471        let mut i = 0;
+472        while i < self.tracks.len() {
+473            let track = self
+474                .tracks
+475                .get_mut(i)
+476                .expect("Tried to remove an illegal track index.");
+477
+478            if track.playing.is_done() {
+479                let p_state = track.playing.clone();
+480                let to_drop = self.tracks.swap_remove(i);
+481                self.disposer
+482                    .dispose(DisposalMessage::Track(Box::new(to_drop)));
+483
+484                let to_drop = self.track_handles.swap_remove(i);
+485                self.disposer.dispose(DisposalMessage::Handle(to_drop));
+486
+487                self.fire_event(EventMessage::ChangeState(
+488                    i,
+489                    TrackStateChange::Mode(p_state),
+490                ))?;
+491            } else {
+492                i += 1;
+493            }
+494        }
+495
+496        // Tick -- receive side also handles removals in same manner after it increments
+497        // times etc.
+498        self.fire_event(EventMessage::Tick)?;
+499
+500        Ok(())
+501    }
+502
+503    #[cfg(test)]
+504    #[inline]
+505    pub(crate) fn test_signal_empty_tick(&self) {
+506        match &self.config.override_connection {
+507            Some(OutputMode::Raw(tx)) =>
+508                drop(tx.send(crate::driver::test_config::TickMessage::NoEl)),
+509            Some(OutputMode::Rtp(tx)) =>
+510                drop(tx.send(crate::driver::test_config::TickMessage::NoEl)),
+511            None => {},
+512        }
+513    }
+514
+515    pub fn crypto_mode(&self) -> CryptoMode {
+516        let mode = self.conn_active.as_ref().map(|v| v.crypto_state.kind());
+517        if cfg!(not(test)) {
+518            mode.expect("Shouldn't be mixing packets without access to a cipher + UDP dest.")
+519        } else {
+520            mode.unwrap_or_else(|| self.config.crypto_mode)
+521        }
+522    }
+523
+524    #[inline]
+525    pub fn mix_and_build_packet(&mut self, packet: &mut [u8]) -> Result<usize> {
+526        // symph_mix is an `AudioBuffer` (planar format), we need to convert this
+527        // later into an interleaved `SampleBuffer` for libopus.
+528        self.symph_mix.clear();
+529        self.symph_mix.render_reserved(Some(MONO_FRAME_SIZE));
+530        self.resample_scratch.clear();
+531
+532        // Walk over all the audio files, combining into one audio frame according
+533        // to volume, play state, etc.
+534        let mut mix_len = {
+535            let out = self.mix_tracks(packet);
+536
+537            self.sample_buffer.copy_interleaved_typed(&self.symph_mix);
+538
+539            out
+540        };
+541
+542        if self.muted {
+543            mix_len = MixType::MixedPcm(0);
+544        }
+545
+546        // Explicit "Silence" frame handling: if there is no mixed data, we must send
+547        // ~5 frames of silence (unless another good audio frame appears) before we
+548        // stop sending RTP frames.
+549        if mix_len == MixType::MixedPcm(0) {
+550            if self.silence_frames > 0 {
+551                self.silence_frames -= 1;
+552                let mut rtp = MutableRtpPacket::new(packet).expect(
+553                    "FATAL: Too few bytes in self.packet for RTP header.\
+554                        (Blame: VOICE_PACKET_MAX?)",
+555                );
+556
+557                let payload = rtp.payload_mut();
+558                let pre_len = self.crypto_mode().payload_prefix_len();
+559
+560                payload[pre_len..pre_len + SILENT_FRAME.len()].copy_from_slice(&SILENT_FRAME[..]);
+561
+562                mix_len = MixType::Passthrough(SILENT_FRAME.len());
+563            } else {
+564                // Per official guidelines, send 5x silence BEFORE we stop speaking.
+565                return Ok(0);
+566            }
+567        } else {
+568            self.silence_frames = 5;
+569
+570            if let MixType::MixedPcm(n) = mix_len {
+571                if self.config.use_softclip {
+572                    self.soft_clip.apply(
+573                        (&mut self.sample_buffer.samples_mut()
+574                            [..n * self.config.mix_mode.channels()])
+575                            .try_into()
+576                            .expect("Mix buffer is known to have a valid sample count (softclip)."),
+577                    )?;
+578                }
+579            }
+580        }
+581
+582        // For the benefit of test cases, send the raw un-RTP'd data.
+583        #[cfg(test)]
+584        let out = if let Some(OutputMode::Raw(_)) = &self.config.override_connection {
+585            // This case has been handled before buffer clearing above.
+586            let msg = match mix_len {
+587                MixType::Passthrough(len) if len == SILENT_FRAME.len() => OutputMessage::Silent,
+588                MixType::Passthrough(len) => {
+589                    let rtp = RtpPacket::new(packet).expect(
+590                        "FATAL: Too few bytes in self.packet for RTP header.\
+591                            (Blame: VOICE_PACKET_MAX?)",
+592                    );
+593                    let payload = rtp.payload();
+594                    let opus_frame =
+595                        (payload[self.crypto_mode().payload_prefix_len()..][..len]).to_vec();
+596
+597                    OutputMessage::Passthrough(opus_frame)
+598                },
+599                MixType::MixedPcm(_) => OutputMessage::Mixed(
+600                    self.sample_buffer.samples()[..self.config.mix_mode.sample_count_in_frame()]
+601                        .to_vec(),
+602                ),
+603            };
+604
+605            self.raw_msg = Some(msg);
+606
+607            Ok(1)
+608        } else {
+609            self.prep_packet(mix_len, packet)
+610        };
+611
+612        #[cfg(not(test))]
+613        let out = self.prep_packet(mix_len, packet);
+614
+615        // Zero out all planes of the mix buffer if any audio was written.
+616        if matches!(mix_len, MixType::MixedPcm(a) if a > 0) {
+617            for plane in self.symph_mix.planes_mut().planes() {
+618                plane.fill(0.0);
+619            }
+620        }
+621
+622        out
+623    }
+624
+625    #[inline]
+626    fn prep_packet(&mut self, mix_len: MixType, packet: &mut [u8]) -> Result<usize> {
+627        let send_buffer = self.sample_buffer.samples();
+628
+629        let conn = self
+630            .conn_active
+631            .as_mut()
+632            .expect("Shouldn't be mixing packets without access to a cipher + UDP dest.");
+633
+634        let mut rtp = MutableRtpPacket::new(packet).expect(
+635            "FATAL: Too few bytes in self.packet for RTP header.\
+636                (Blame: VOICE_PACKET_MAX?)",
+637        );
+638
+639        let payload = rtp.payload_mut();
+640        let crypto_mode = conn.crypto_state.kind();
+641        let first_payload_byte = crypto_mode.payload_prefix_len();
+642
+643        // If passthrough, Opus payload in place already.
+644        // Else encode into buffer with space for AEAD encryption headers.
+645        let payload_len = match mix_len {
+646            MixType::Passthrough(opus_len) => opus_len,
+647            MixType::MixedPcm(_samples) => {
+648                let total_payload_space = payload.len() - crypto_mode.payload_suffix_len();
+649                self.encoder.encode_float(
+650                    &send_buffer[..self.config.mix_mode.sample_count_in_frame()],
+651                    &mut payload[first_payload_byte..total_payload_space],
+652                )?
+653            },
+654        };
+655
+656        let final_payload_size = conn
+657            .crypto_state
+658            .write_packet_nonce(&mut rtp, first_payload_byte + payload_len);
+659
+660        // Packet encryption ignored in test modes.
+661        #[cfg(not(test))]
+662        let encrypt = true;
+663        #[cfg(test)]
+664        let encrypt = self.config.override_connection.is_none();
+665
+666        if encrypt {
+667            conn.cipher
+668                .encrypt_pkt_in_place(&mut rtp, final_payload_size)?;
+669        }
+670
+671        Ok(RtpPacket::minimum_packet_size() + final_payload_size)
+672    }
+673
+674    #[inline]
+675    pub(crate) fn send_packet(&self, packet: &[u8]) -> Result<()> {
+676        #[cfg(test)]
+677        let send_status = if let Some(OutputMode::Raw(tx)) = &self.config.override_connection {
+678            // This case has been handled before buffer clearing in `mix_and_build_packet`.
+679            drop(tx.send(self.raw_msg.clone().unwrap().into()));
+680
+681            Ok(())
+682        } else {
+683            self.send_packet_(packet)
+684        };
+685
+686        #[cfg(not(test))]
+687        let send_status = self.send_packet_(packet);
+688
+689        send_status.or_else(Error::disarm_would_block)?;
+690
+691        Ok(())
+692    }
+693
+694    #[inline]
+695    fn send_packet_(&self, packet: &[u8]) -> Result<()> {
+696        let conn = self
+697            .conn_active
+698            .as_ref()
+699            .expect("Shouldn't be mixing packets without access to a cipher + UDP dest.");
+700
+701        #[cfg(test)]
+702        if let Some(OutputMode::Rtp(tx)) = &self.config.override_connection {
+703            // Test mode: send unencrypted (compressed) packets to local receiver.
+704            drop(tx.send(packet.to_vec().into()));
+705        } else {
+706            conn.udp_tx.send(packet)?;
+707        }
+708
+709        #[cfg(not(test))]
+710        {
+711            // Normal operation: send encrypted payload to UDP Tx task.
+712            conn.udp_tx.send(packet)?;
+713        }
+714
+715        Ok(())
+716    }
+717
+718    #[inline]
+719    pub(crate) fn check_and_send_keepalive(&mut self, now: Option<Instant>) -> Result<()> {
+720        if let Some(conn) = self.conn_active.as_mut() {
+721            let now = now.unwrap_or_else(Instant::now);
+722            if now >= self.keepalive_deadline {
+723                conn.udp_tx.send(&self.keepalive_packet)?;
+724                self.keepalive_deadline += UDP_KEEPALIVE_GAP;
+725            }
+726        }
+727
+728        Ok(())
+729    }
+730
+731    #[inline]
+732    pub(crate) fn send_gateway_speaking(&self) -> Result<()> {
+733        if let Some(ws) = &self.ws {
+734            ws.send(WsMessage::Speaking(true))?;
+735        }
+736
+737        Ok(())
+738    }
+739
+740    #[inline]
+741    pub(crate) fn send_gateway_not_speaking(&self) {
+742        if let Some(ws) = &self.ws {
+743            // NOTE: this explicit `drop` should prevent a catastrophic thread pileup.
+744            // A full reconnect might cause an inner closed connection.
+745            // It's safer to leave the central task to clean this up and
+746            // pass the mixer a new channel.
+747            drop(ws.send(WsMessage::Speaking(false)));
+748        }
+749    }
+750
+751    #[inline]
+752    fn mix_tracks(&mut self, packet: &mut [u8]) -> MixType {
+753        // Get a slice of bytes to write in data for Opus packet passthrough.
+754        let mut rtp = MutableRtpPacket::new(packet).expect(
+755            "FATAL: Too few bytes in self.packet for RTP header.\
+756                (Blame: VOICE_PACKET_MAX?)",
+757        );
+758        let payload = rtp.payload_mut();
+759        let opus_frame = &mut payload[self.crypto_mode().payload_prefix_len()..];
+760
+761        // Opus frame passthrough.
+762        // This requires that we have only one PLAYING track, who has volume 1.0, and an
+763        // Opus codec type (verified later in mix_symph_indiv).
+764        //
+765        // We *could* cache the number of live tracks separately, but that makes this
+766        // quite fragile given all the ways a user can alter the PlayMode.
+767        let mut num_live = 0;
+768        let mut last_live_vol = 1.0;
+769        for track in &self.tracks {
+770            if track.playing.is_playing() {
+771                num_live += 1;
+772                last_live_vol = track.volume;
+773            }
+774        }
+775        let do_passthrough = num_live == 1 && (last_live_vol - 1.0).abs() < f32::EPSILON;
+776
+777        let mut len = 0;
+778        for (i, track) in self.tracks.iter_mut().enumerate() {
+779            let vol = track.volume;
+780
+781            // This specifically tries to get tracks who are "preparing",
+782            // so that event handlers and the like can all be fired without
+783            // the track being in a `Play` state.
+784            if !track.should_check_input() {
+785                continue;
+786            }
+787
+788            let should_play = track.playing.is_playing();
+789
+790            let input = track.get_or_ready_input(
+791                i,
+792                &self.interconnect,
+793                &self.thread_pool,
+794                &self.config,
+795                self.prevent_events,
+796            );
+797
+798            let (input, mix_state) = match input {
+799                Ok(i) => i,
+800                Err(InputReadyingError::Waiting) => continue,
+801                Err(InputReadyingError::NeedsSeek(req)) => {
+802                    track.seek(
+803                        i,
+804                        req,
+805                        &self.interconnect,
+806                        &self.thread_pool,
+807                        &self.config,
+808                        self.prevent_events,
+809                    );
+810                    continue;
+811                },
+812                // TODO: allow for retry in given time.
+813                Err(e) => {
+814                    if let Some(fail) = e.as_user() {
+815                        track.playing = PlayMode::Errored(fail);
+816                    }
+817                    continue;
+818                },
+819            };
+820
+821            // Now that we have dealt with potential errors in preparing tracks,
+822            // only do any mixing if the track is to be played!
+823            if !should_play {
+824                continue;
+825            }
+826
+827            let (mix_type, status) = mix_logic::mix_symph_indiv(
+828                &mut self.symph_mix,
+829                &mut self.resample_scratch,
+830                input,
+831                mix_state,
+832                vol,
+833                do_passthrough.then_some(&mut *opus_frame),
+834            );
+835
+836            let return_here = if let MixType::MixedPcm(pcm_len) = mix_type {
+837                len = len.max(pcm_len);
+838                false
+839            } else {
+840                if mix_state.passthrough == Passthrough::Inactive {
+841                    input.decoder.reset();
+842                }
+843                mix_state.passthrough = Passthrough::Active;
+844                true
+845            };
+846
+847            // FIXME: allow Ended to trigger a seek/loop/revisit in the same mix cycle?
+848            // Would this be possible with special-casing to mark some inputs as fast
+849            // to recreate? Probably not doable in the general case.
+850            match status {
+851                MixStatus::Live => track.step_frame(),
+852                MixStatus::Errored(e) =>
+853                    track.playing = PlayMode::Errored(PlayError::Decode(e.into())),
+854                MixStatus::Ended if track.do_loop() => {
+855                    drop(self.track_handles[i].seek(Duration::default()));
+856                    if !self.prevent_events {
+857                        // position update is sent out later, when the seek concludes.
+858                        drop(self.interconnect.events.send(EventMessage::ChangeState(
+859                            i,
+860                            TrackStateChange::Loops(track.loops, false),
+861                        )));
+862                    }
+863                },
+864                MixStatus::Ended => {
+865                    track.end();
+866                },
+867            }
+868
+869            // This needs to happen here due to borrow checker shenanigans.
+870            if return_here {
+871                return mix_type;
+872            }
+873        }
+874
+875        MixType::MixedPcm(len)
+876    }
+877}
\ No newline at end of file diff --git a/next/src/songbird/driver/tasks/mixer/pool.rs.html b/next/src/songbird/driver/tasks/mixer/pool.rs.html new file mode 100644 index 0000000..4262019 --- /dev/null +++ b/next/src/songbird/driver/tasks/mixer/pool.rs.html @@ -0,0 +1,141 @@ +pool.rs - source

songbird/driver/tasks/mixer/
pool.rs

1use super::util::copy_seek_to;
+2
+3use crate::{
+4    driver::tasks::message::MixerInputResultMessage,
+5    input::{AudioStream, AudioStreamError, Compose, Input, LiveInput, Parsed},
+6    Config,
+7};
+8use flume::Sender;
+9use rusty_pool::ThreadPool;
+10use std::{result::Result as StdResult, sync::Arc, time::Duration};
+11use symphonia_core::{
+12    formats::{SeekMode, SeekTo},
+13    io::MediaSource,
+14};
+15use tokio::runtime::Handle;
+16
+17#[derive(Clone)]
+18pub struct BlockyTaskPool {
+19    pool: ThreadPool,
+20    handle: Handle,
+21}
+22
+23impl BlockyTaskPool {
+24    pub fn new(handle: Handle) -> Self {
+25        Self {
+26            pool: ThreadPool::new(0, 64, Duration::from_secs(5)),
+27            handle,
+28        }
+29    }
+30
+31    pub fn create(
+32        &self,
+33        callback: Sender<MixerInputResultMessage>,
+34        input: Input,
+35        seek_time: Option<SeekTo>,
+36        config: Arc<Config>,
+37    ) {
+38        // Moves an Input from Lazy -> Live.
+39        // We either do this on this pool, or move it to the tokio executor as the source requires.
+40        // This takes a seek_time to pass on and execute *after* parsing (i.e., back-seek on
+41        // read-only stream).
+42        match input {
+43            Input::Lazy(mut lazy) => {
+44                let far_pool = self.clone();
+45                if lazy.should_create_async() {
+46                    self.handle.spawn(async move {
+47                        let out = lazy.create_async().await;
+48                        far_pool.send_to_parse(out, lazy, callback, seek_time, config);
+49                    });
+50                } else {
+51                    self.pool.execute(move || {
+52                        let out = lazy.create();
+53                        far_pool.send_to_parse(out, lazy, callback, seek_time, config);
+54                    });
+55                }
+56            },
+57            Input::Live(live, maybe_create) =>
+58                self.parse(config, callback, live, maybe_create, seek_time),
+59        }
+60    }
+61
+62    pub fn send_to_parse(
+63        &self,
+64        create_res: StdResult<AudioStream<Box<dyn MediaSource>>, AudioStreamError>,
+65        rec: Box<dyn Compose>,
+66        callback: Sender<MixerInputResultMessage>,
+67        seek_time: Option<SeekTo>,
+68        config: Arc<Config>,
+69    ) {
+70        match create_res {
+71            Ok(o) => {
+72                self.parse(config, callback, LiveInput::Raw(o), Some(rec), seek_time);
+73            },
+74            Err(e) => {
+75                drop(callback.send(MixerInputResultMessage::CreateErr(e.into())));
+76            },
+77        }
+78    }
+79
+80    pub fn parse(
+81        &self,
+82        config: Arc<Config>,
+83        callback: Sender<MixerInputResultMessage>,
+84        input: LiveInput,
+85        rec: Option<Box<dyn Compose>>,
+86        seek_time: Option<SeekTo>,
+87    ) {
+88        let pool_clone = self.clone();
+89
+90        self.pool.execute(move || {
+91            match input.promote(config.codec_registry, config.format_registry) {
+92                Ok(LiveInput::Parsed(parsed)) => match seek_time {
+93                    // If seek time is zero, then wipe it out.
+94                    // Some formats (MKV) make SeekTo(0) require a backseek to realign with the
+95                    // current page.
+96                    Some(seek_time) if !super::util::seek_to_is_zero(&seek_time) => {
+97                        pool_clone.seek(callback, parsed, rec, seek_time, false, config);
+98                    },
+99                    _ => {
+100                        drop(callback.send(MixerInputResultMessage::Built(parsed, rec)));
+101                    },
+102                },
+103                Ok(_) => unreachable!(),
+104                Err(e) => {
+105                    drop(callback.send(MixerInputResultMessage::ParseErr(e.into())));
+106                },
+107            }
+108        });
+109    }
+110
+111    pub fn seek(
+112        &self,
+113        callback: Sender<MixerInputResultMessage>,
+114        mut input: Parsed,
+115        rec: Option<Box<dyn Compose>>,
+116        seek_time: SeekTo,
+117        // Not all of symphonia's formats bother to return SeekErrorKind::ForwardOnly.
+118        // So, we need *this* flag.
+119        backseek_needed: bool,
+120        config: Arc<Config>,
+121    ) {
+122        let pool_clone = self.clone();
+123
+124        self.pool.execute(move || match rec {
+125            Some(rec) if (!input.supports_backseek) && backseek_needed => {
+126                pool_clone.create(callback, Input::Lazy(rec), Some(seek_time), config);
+127            },
+128            _ => {
+129                let seek_result = input
+130                    .format
+131                    .seek(SeekMode::Accurate, copy_seek_to(&seek_time));
+132                input.decoder.reset();
+133                drop(callback.send(MixerInputResultMessage::Seek(
+134                    input,
+135                    rec,
+136                    seek_result.map_err(Arc::new),
+137                )));
+138            },
+139        });
+140    }
+141}
\ No newline at end of file diff --git a/next/src/songbird/driver/tasks/mixer/result.rs.html b/next/src/songbird/driver/tasks/mixer/result.rs.html new file mode 100644 index 0000000..b4e4e3d --- /dev/null +++ b/next/src/songbird/driver/tasks/mixer/result.rs.html @@ -0,0 +1,55 @@ +result.rs - source

songbird/driver/tasks/mixer/
result.rs

1use crate::{
+2    input::AudioStreamError,
+3    tracks::{PlayError, SeekRequest},
+4};
+5use std::sync::Arc;
+6use symphonia_core::errors::Error as SymphoniaError;
+7
+8#[derive(Copy, Clone, Debug, Eq, PartialEq)]
+9pub enum MixType {
+10    Passthrough(usize),
+11    MixedPcm(usize),
+12}
+13
+14pub enum MixStatus {
+15    Live,
+16    Ended,
+17    Errored(SymphoniaError),
+18}
+19
+20impl From<SymphoniaError> for MixStatus {
+21    fn from(e: SymphoniaError) -> Self {
+22        Self::Errored(e)
+23    }
+24}
+25
+26// The Symph errors are Arc'd here since if they come up, they will always
+27// be Arc'd anyway via into_user.
+28#[derive(Clone, Debug)]
+29pub enum InputReadyingError {
+30    Parsing(Arc<SymphoniaError>),
+31    Creation(Arc<AudioStreamError>),
+32    Seeking(Arc<SymphoniaError>),
+33    Dropped,
+34    Waiting,
+35    NeedsSeek(SeekRequest),
+36}
+37
+38impl InputReadyingError {
+39    pub fn as_user(&self) -> Option<PlayError> {
+40        match self {
+41            Self::Parsing(e) => Some(PlayError::Parse(e.clone())),
+42            Self::Creation(e) => Some(PlayError::Create(e.clone())),
+43            Self::Seeking(e) => Some(PlayError::Seek(e.clone())),
+44            _ => None,
+45        }
+46    }
+47
+48    pub fn into_seek_request(self) -> Option<SeekRequest> {
+49        if let Self::NeedsSeek(a) = self {
+50            Some(a)
+51        } else {
+52            None
+53        }
+54    }
+55}
\ No newline at end of file diff --git a/next/src/songbird/driver/tasks/mixer/state.rs.html b/next/src/songbird/driver/tasks/mixer/state.rs.html new file mode 100644 index 0000000..fbf315e --- /dev/null +++ b/next/src/songbird/driver/tasks/mixer/state.rs.html @@ -0,0 +1,105 @@ +state.rs - source

songbird/driver/tasks/mixer/
state.rs

1use crate::{
+2    constants::OPUS_PASSTHROUGH_STRIKE_LIMIT,
+3    driver::tasks::message::*,
+4    input::{Compose, Input, LiveInput, Metadata, Parsed},
+5    tracks::{ReadyState, SeekRequest},
+6};
+7use flume::Receiver;
+8use rubato::FftFixedOut;
+9use std::time::Instant;
+10
+11pub enum InputState {
+12    NotReady(Input),
+13    Preparing(PreparingInfo),
+14    Ready(Parsed, Option<Box<dyn Compose>>),
+15}
+16
+17impl InputState {
+18    pub fn metadata(&mut self) -> Option<Metadata<'_>> {
+19        if let Self::Ready(parsed, _) = self {
+20            Some(parsed.into())
+21        } else {
+22            None
+23        }
+24    }
+25
+26    #[must_use]
+27    pub fn ready_state(&self) -> ReadyState {
+28        match self {
+29            Self::NotReady(_) => ReadyState::Uninitialised,
+30            Self::Preparing(_) => ReadyState::Preparing,
+31            Self::Ready(_, _) => ReadyState::Playable,
+32        }
+33    }
+34}
+35
+36impl From<Input> for InputState {
+37    fn from(val: Input) -> Self {
+38        match val {
+39            a @ Input::Lazy(_) => Self::NotReady(a),
+40            Input::Live(live, rec) => match live {
+41                LiveInput::Parsed(p) => Self::Ready(p, rec),
+42                other => Self::NotReady(Input::Live(other, rec)),
+43            },
+44        }
+45    }
+46}
+47
+48pub struct PreparingInfo {
+49    #[allow(dead_code)]
+50    /// Time this request was fired.
+51    pub time: Instant,
+52    /// Used to handle seek requests fired while a track was being created (or a seek was in progress).
+53    pub queued_seek: Option<SeekRequest>,
+54    /// Callback from the thread pool to indicate the result of creating/parsing this track.
+55    pub callback: Receiver<MixerInputResultMessage>,
+56}
+57
+58pub struct DecodeState {
+59    pub inner_pos: usize,
+60    pub resampler: Option<(usize, FftFixedOut<f32>, Vec<Vec<f32>>)>,
+61    pub passthrough: Passthrough,
+62    pub passthrough_violations: u8,
+63}
+64
+65impl DecodeState {
+66    pub fn reset(&mut self) {
+67        self.inner_pos = 0;
+68        self.resampler = None;
+69    }
+70
+71    pub fn record_and_check_passthrough_strike_final(&mut self, fatal: bool) -> bool {
+72        self.passthrough_violations = self.passthrough_violations.saturating_add(1);
+73        let blocked = fatal || self.passthrough_violations > OPUS_PASSTHROUGH_STRIKE_LIMIT;
+74        if blocked {
+75            self.passthrough = Passthrough::Block;
+76        }
+77        blocked
+78    }
+79}
+80
+81impl Default for DecodeState {
+82    fn default() -> Self {
+83        Self {
+84            inner_pos: 0,
+85            resampler: None,
+86            passthrough: Passthrough::Inactive,
+87            passthrough_violations: 0,
+88        }
+89    }
+90}
+91
+92/// Simple state to manage decoder resets etc.
+93///
+94/// Inactive->Active transitions should trigger a reset.
+95///
+96/// Block should be used if a source contains known-bad packets:
+97/// it's unlikely that packet sizes will vary, but if they do then
+98/// we can't passthrough (and every attempt will trigger a codec reset,
+99/// which probably won't sound too smooth).
+100#[derive(Clone, Copy, Eq, PartialEq)]
+101pub enum Passthrough {
+102    Active,
+103    Inactive,
+104    Block,
+105}
\ No newline at end of file diff --git a/next/src/songbird/driver/tasks/mixer/track.rs.html b/next/src/songbird/driver/tasks/mixer/track.rs.html new file mode 100644 index 0000000..d74d888 --- /dev/null +++ b/next/src/songbird/driver/tasks/mixer/track.rs.html @@ -0,0 +1,401 @@ +track.rs - source

songbird/driver/tasks/mixer/
track.rs

1use crate::tracks::{ReadyState, SeekRequest};
+2use std::result::Result as StdResult;
+3use symphonia_core::errors::Error as SymphError;
+4
+5use super::*;
+6
+7pub struct InternalTrack {
+8    pub(crate) playing: PlayMode,
+9    pub(crate) volume: f32,
+10    pub(crate) input: InputState,
+11    pub(crate) mix_state: DecodeState,
+12    pub(crate) position: Duration,
+13    pub(crate) play_time: Duration,
+14    pub(crate) commands: Receiver<TrackCommand>,
+15    pub(crate) loops: LoopState,
+16    pub(crate) callbacks: Callbacks,
+17}
+18
+19impl<'a> InternalTrack {
+20    pub(crate) fn decompose_track(
+21        val: TrackContext,
+22    ) -> (Self, EventStore, TrackState, TrackHandle) {
+23        let TrackContext {
+24            handle,
+25            track,
+26            receiver,
+27        } = val;
+28        let out = InternalTrack {
+29            playing: track.playing,
+30            volume: track.volume,
+31            input: InputState::from(track.input),
+32            mix_state: DecodeState::default(),
+33            position: Duration::default(),
+34            play_time: Duration::default(),
+35            commands: receiver,
+36            loops: track.loops,
+37            callbacks: Callbacks::default(),
+38        };
+39
+40        let state = out.state();
+41
+42        (out, track.events, state, handle)
+43    }
+44
+45    pub(crate) fn state(&self) -> TrackState {
+46        let ready = self.input.ready_state();
+47
+48        TrackState {
+49            playing: self.playing.clone(),
+50            volume: self.volume,
+51            position: self.position,
+52            play_time: self.play_time,
+53            loops: self.loops,
+54            ready,
+55        }
+56    }
+57
+58    pub(crate) fn view(&'a mut self) -> View<'a> {
+59        let ready = self.input.ready_state();
+60
+61        View {
+62            position: &self.position,
+63            play_time: &self.play_time,
+64            volume: &mut self.volume,
+65            meta: self.input.metadata(),
+66            ready,
+67            playing: &mut self.playing,
+68            loops: &mut self.loops,
+69        }
+70    }
+71
+72    pub(crate) fn process_commands(&mut self, index: usize, ic: &Interconnect) -> Action {
+73        // Note: disconnection and an empty channel are both valid,
+74        // and should allow the audio object to keep running as intended.
+75
+76        // We also need to export a target seek point to the mixer, if known.
+77        let mut action = Action::default();
+78
+79        // Note that interconnect failures are not currently errors.
+80        // In correct operation, the event thread should never panic,
+81        // but it receiving status updates is secondary do actually
+82        // doing the work.
+83        while let Ok(cmd) = self.commands.try_recv() {
+84            match cmd {
+85                TrackCommand::Play => {
+86                    self.playing.change_to(PlayMode::Play);
+87                    drop(ic.events.send(EventMessage::ChangeState(
+88                        index,
+89                        TrackStateChange::Mode(self.playing.clone()),
+90                    )));
+91                },
+92                TrackCommand::Pause => {
+93                    self.playing.change_to(PlayMode::Pause);
+94                    drop(ic.events.send(EventMessage::ChangeState(
+95                        index,
+96                        TrackStateChange::Mode(self.playing.clone()),
+97                    )));
+98                },
+99                TrackCommand::Stop => {
+100                    self.playing.change_to(PlayMode::Stop);
+101                    drop(ic.events.send(EventMessage::ChangeState(
+102                        index,
+103                        TrackStateChange::Mode(self.playing.clone()),
+104                    )));
+105                },
+106                TrackCommand::Volume(vol) => {
+107                    self.volume = vol;
+108                    drop(ic.events.send(EventMessage::ChangeState(
+109                        index,
+110                        TrackStateChange::Volume(self.volume),
+111                    )));
+112                },
+113                TrackCommand::Seek(req) => action.seek_point = Some(req),
+114                TrackCommand::AddEvent(evt) => {
+115                    drop(ic.events.send(EventMessage::AddTrackEvent(index, evt)));
+116                },
+117                TrackCommand::Do(func) => {
+118                    if let Some(indiv_action) = func(self.view()) {
+119                        action.combine(indiv_action);
+120                    }
+121
+122                    drop(ic.events.send(EventMessage::ChangeState(
+123                        index,
+124                        TrackStateChange::Total(self.state()),
+125                    )));
+126                },
+127                TrackCommand::Request(tx) => {
+128                    drop(tx.send(self.state()));
+129                },
+130                TrackCommand::Loop(loops) => {
+131                    self.loops = loops;
+132                    drop(ic.events.send(EventMessage::ChangeState(
+133                        index,
+134                        TrackStateChange::Loops(self.loops, true),
+135                    )));
+136                },
+137                TrackCommand::MakePlayable(callback) => action.make_playable = Some(callback),
+138            }
+139        }
+140
+141        action
+142    }
+143
+144    pub(crate) fn do_loop(&mut self) -> bool {
+145        match self.loops {
+146            LoopState::Infinite => true,
+147            LoopState::Finite(0) => false,
+148            LoopState::Finite(ref mut n) => {
+149                *n -= 1;
+150                true
+151            },
+152        }
+153    }
+154
+155    /// Steps playback location forward by one frame.
+156    pub(crate) fn step_frame(&mut self) {
+157        self.position += TIMESTEP_LENGTH;
+158        self.play_time += TIMESTEP_LENGTH;
+159    }
+160
+161    pub(crate) fn should_check_input(&self) -> bool {
+162        self.playing.is_playing() || matches!(self.input, InputState::Preparing(_))
+163    }
+164
+165    pub(crate) fn end(&mut self) -> &mut Self {
+166        self.playing.change_to(PlayMode::End);
+167
+168        self
+169    }
+170
+171    /// Readies the requested input state.
+172    ///
+173    /// Returns the usable version of the audio if available, and whether the track should be deleted.
+174    pub(crate) fn get_or_ready_input(
+175        &'a mut self,
+176        id: usize,
+177        interconnect: &Interconnect,
+178        pool: &BlockyTaskPool,
+179        config: &Arc<Config>,
+180        prevent_events: bool,
+181    ) -> StdResult<(&'a mut Parsed, &'a mut DecodeState), InputReadyingError> {
+182        let input = &mut self.input;
+183        let mix_state = &mut self.mix_state;
+184
+185        let (out, queued_seek) = match input {
+186            InputState::NotReady(_) => {
+187                let (tx, rx) = flume::bounded(1);
+188
+189                let mut state = InputState::Preparing(PreparingInfo {
+190                    time: Instant::now(),
+191                    queued_seek: None,
+192                    callback: rx,
+193                });
+194
+195                std::mem::swap(&mut state, input);
+196
+197                match state {
+198                    InputState::NotReady(a @ Input::Lazy(_)) => {
+199                        pool.create(tx, a, None, config.clone());
+200                    },
+201                    InputState::NotReady(Input::Live(audio, rec)) => {
+202                        pool.parse(config.clone(), tx, audio, rec, None);
+203                    },
+204                    _ => unreachable!(),
+205                }
+206
+207                if !prevent_events {
+208                    drop(interconnect.events.send(EventMessage::ChangeState(
+209                        id,
+210                        TrackStateChange::Ready(ReadyState::Preparing),
+211                    )));
+212                }
+213
+214                (Err(InputReadyingError::Waiting), None)
+215            },
+216            InputState::Preparing(info) => {
+217                let queued_seek = info.queued_seek.take();
+218
+219                let orig_out = match info.callback.try_recv() {
+220                    Ok(MixerInputResultMessage::Built(parsed, rec)) => {
+221                        *input = InputState::Ready(parsed, rec);
+222                        mix_state.reset();
+223
+224                        // possible TODO: set position to the true track position here?
+225                        // ISSUE: need to get next_packet to see its `ts`, but inner_pos==0
+226                        // will trigger next packet to be taken at mix time.
+227
+228                        if !prevent_events {
+229                            drop(interconnect.events.send(EventMessage::ChangeState(
+230                                id,
+231                                TrackStateChange::Ready(ReadyState::Playable),
+232                            )));
+233                        }
+234
+235                        self.callbacks.playable();
+236
+237                        if let InputState::Ready(ref mut parsed, _) = input {
+238                            Ok(parsed)
+239                        } else {
+240                            unreachable!()
+241                        }
+242                    },
+243                    Ok(MixerInputResultMessage::Seek(parsed, rec, seek_res)) => {
+244                        match seek_res {
+245                            Ok(pos) => {
+246                                if let Some(time_base) = parsed.decoder.codec_params().time_base {
+247                                    // Update track's position to match the actual timestamp the
+248                                    // seek landed at.
+249                                    let new_time = time_base.calc_time(pos.actual_ts);
+250                                    let time_in_float = new_time.seconds as f64 + new_time.frac;
+251                                    self.position =
+252                                        std::time::Duration::from_secs_f64(time_in_float);
+253
+254                                    self.callbacks.seeked(self.position);
+255                                    self.callbacks.playable();
+256
+257                                    if !prevent_events {
+258                                        drop(interconnect.events.send(EventMessage::ChangeState(
+259                                            id,
+260                                            TrackStateChange::Position(self.position),
+261                                        )));
+262
+263                                        drop(interconnect.events.send(EventMessage::ChangeState(
+264                                            id,
+265                                            TrackStateChange::Ready(ReadyState::Playable),
+266                                        )));
+267                                    }
+268
+269                                    // Our decoder state etc. must be reset.
+270                                    // (Symphonia decoder state reset in the thread pool during
+271                                    // the operation.)
+272                                    mix_state.reset();
+273                                    *input = InputState::Ready(parsed, rec);
+274
+275                                    if let InputState::Ready(ref mut parsed, _) = input {
+276                                        Ok(parsed)
+277                                    } else {
+278                                        unreachable!()
+279                                    }
+280                                } else {
+281                                    Err(InputReadyingError::Seeking(
+282                                        SymphError::Unsupported("Track had no recorded time base.")
+283                                            .into(),
+284                                    ))
+285                                }
+286                            },
+287                            Err(e) => Err(InputReadyingError::Seeking(e)),
+288                        }
+289                    },
+290                    Ok(MixerInputResultMessage::CreateErr(e)) =>
+291                        Err(InputReadyingError::Creation(e)),
+292                    Ok(MixerInputResultMessage::ParseErr(e)) => Err(InputReadyingError::Parsing(e)),
+293                    Err(TryRecvError::Disconnected) => Err(InputReadyingError::Dropped),
+294                    Err(TryRecvError::Empty) => Err(InputReadyingError::Waiting),
+295                };
+296
+297                let orig_out = orig_out.map(|a| (a, mix_state));
+298
+299                if let Err(ref e) = orig_out {
+300                    if let Some(e) = e.as_user() {
+301                        self.callbacks.readying_error(e);
+302                    }
+303                }
+304
+305                (orig_out, queued_seek)
+306            },
+307            InputState::Ready(ref mut parsed, _) => (Ok((parsed, mix_state)), None),
+308        };
+309
+310        match (out, queued_seek) {
+311            (Ok(_), Some(request)) => Err(InputReadyingError::NeedsSeek(request)),
+312            (a, _) => a,
+313        }
+314    }
+315
+316    pub(crate) fn seek(
+317        &mut self,
+318        id: usize,
+319        request: SeekRequest,
+320        interconnect: &Interconnect,
+321        pool: &BlockyTaskPool,
+322        config: &Arc<Config>,
+323        prevent_events: bool,
+324    ) {
+325        if let InputState::Preparing(p) = &mut self.input {
+326            p.queued_seek = Some(request);
+327            return;
+328        }
+329
+330        // might be a little topsy turvy: rethink me.
+331        let SeekRequest { time, callback } = request;
+332
+333        self.callbacks.seek = Some(callback);
+334        if !prevent_events {
+335            drop(interconnect.events.send(EventMessage::ChangeState(
+336                id,
+337                TrackStateChange::Ready(ReadyState::Preparing),
+338            )));
+339        }
+340
+341        let backseek_needed = time < self.position;
+342
+343        let time = Time::from(time.as_secs_f64());
+344        let mut ts = SeekTo::Time {
+345            time,
+346            track_id: None,
+347        };
+348        let (tx, rx) = flume::bounded(1);
+349
+350        let state = std::mem::replace(
+351            &mut self.input,
+352            InputState::Preparing(PreparingInfo {
+353                time: Instant::now(),
+354                callback: rx,
+355                queued_seek: None,
+356            }),
+357        );
+358
+359        match state {
+360            InputState::Ready(p, r) => {
+361                if let SeekTo::Time { time: _, track_id } = &mut ts {
+362                    *track_id = Some(p.track_id);
+363                }
+364
+365                pool.seek(tx, p, r, ts, backseek_needed, config.clone());
+366            },
+367            InputState::NotReady(lazy) => pool.create(tx, lazy, Some(ts), config.clone()),
+368            InputState::Preparing(_) => unreachable!(), // Covered above.
+369        }
+370    }
+371}
+372
+373#[derive(Debug, Default)]
+374pub struct Callbacks {
+375    pub seek: Option<Sender<StdResult<Duration, PlayError>>>,
+376    pub make_playable: Option<Sender<StdResult<(), PlayError>>>,
+377}
+378
+379impl Callbacks {
+380    fn readying_error(&mut self, err: PlayError) {
+381        if let Some(callback) = self.seek.take() {
+382            drop(callback.send(Err(err.clone())));
+383        }
+384
+385        if let Some(callback) = self.make_playable.take() {
+386            drop(callback.send(Err(err)));
+387        }
+388    }
+389
+390    fn playable(&mut self) {
+391        if let Some(callback) = self.make_playable.take() {
+392            drop(callback.send(Ok(())));
+393        }
+394    }
+395
+396    fn seeked(&mut self, time: Duration) {
+397        if let Some(callback) = self.seek.take() {
+398            drop(callback.send(Ok(time)));
+399        }
+400    }
+401}
\ No newline at end of file diff --git a/next/src/songbird/driver/tasks/mixer/util.rs.html b/next/src/songbird/driver/tasks/mixer/util.rs.html new file mode 100644 index 0000000..5810d46 --- /dev/null +++ b/next/src/songbird/driver/tasks/mixer/util.rs.html @@ -0,0 +1,20 @@ +util.rs - source

songbird/driver/tasks/mixer/
util.rs

1use symphonia_core::{formats::SeekTo, units::Time};
+2
+3// SeekTo lacks Copy and Clone... somehow.
+4pub fn copy_seek_to(pos: &SeekTo) -> SeekTo {
+5    match *pos {
+6        SeekTo::Time { time, track_id } => SeekTo::Time { time, track_id },
+7        SeekTo::TimeStamp { ts, track_id } => SeekTo::TimeStamp { ts, track_id },
+8    }
+9}
+10
+11pub fn seek_to_is_zero(pos: &SeekTo) -> bool {
+12    match *pos {
+13        SeekTo::Time { time, .. } =>
+14            time == Time {
+15                seconds: 0,
+16                frac: 0.0,
+17            },
+18        SeekTo::TimeStamp { ts, .. } => ts == 0,
+19    }
+20}
\ No newline at end of file diff --git a/next/src/songbird/driver/tasks/mod.rs.html b/next/src/songbird/driver/tasks/mod.rs.html new file mode 100644 index 0000000..0af1cfc --- /dev/null +++ b/next/src/songbird/driver/tasks/mod.rs.html @@ -0,0 +1,352 @@ +mod.rs - source

songbird/driver/tasks/
mod.rs

1#![allow(missing_docs)]
+2
+3pub(crate) mod disposal;
+4pub mod error;
+5mod events;
+6pub mod message;
+7pub mod mixer;
+8#[cfg(feature = "receive")]
+9pub(crate) mod udp_rx;
+10pub(crate) mod ws;
+11
+12use std::time::Duration;
+13
+14use super::connection::{error::Error as ConnectionError, Connection};
+15use crate::{
+16    events::{
+17        context_data::{DisconnectKind, DisconnectReason},
+18        internal_data::{InternalConnect, InternalDisconnect},
+19        CoreContext,
+20    },
+21    Config,
+22    ConnectionInfo,
+23};
+24use flume::{Receiver, Sender};
+25use message::*;
+26use tokio::{spawn, time::sleep as tsleep};
+27use tracing::{debug, instrument, trace};
+28
+29pub(crate) fn start(config: Config, rx: Receiver<CoreMessage>, tx: Sender<CoreMessage>) {
+30    spawn(async move {
+31        trace!("Driver started.");
+32        runner(config, rx, tx).await;
+33        trace!("Driver finished.");
+34    });
+35}
+36
+37fn start_internals(core: Sender<CoreMessage>, config: &Config) -> Interconnect {
+38    let (evt_tx, evt_rx) = flume::unbounded();
+39    let (mix_tx, mix_rx) = flume::unbounded();
+40
+41    spawn(async move {
+42        trace!("Event processor started.");
+43        events::runner(evt_rx).await;
+44        trace!("Event processor finished.");
+45    });
+46
+47    let ic = Interconnect {
+48        core,
+49        events: evt_tx,
+50        mixer: mix_tx,
+51    };
+52
+53    config.get_scheduler().new_mixer(config, ic.clone(), mix_rx);
+54    ic
+55}
+56
+57#[instrument(skip(rx, tx))]
+58async fn runner(mut config: Config, rx: Receiver<CoreMessage>, tx: Sender<CoreMessage>) {
+59    let mut next_config: Option<Config> = None;
+60    let mut connection: Option<Connection> = None;
+61    let mut interconnect = start_internals(tx, &config);
+62    let mut retrying = None;
+63    let mut attempt_idx = 0;
+64
+65    while let Ok(msg) = rx.recv_async().await {
+66        match msg {
+67            CoreMessage::ConnectWithResult(info, tx) => {
+68                config = if let Some(new_config) = next_config.take() {
+69                    drop(
+70                        interconnect
+71                            .mixer
+72                            .send(MixerMessage::SetConfig(new_config.clone())),
+73                    );
+74                    new_config
+75                } else {
+76                    config
+77                };
+78
+79                if connection.as_ref().map_or(true, |conn| conn.info != info) {
+80                    // Only *actually* reconnect if the conn info changed, or we don't have an
+81                    // active connection.
+82                    // This allows the gateway component to keep sending join requests independent
+83                    // of driver failures.
+84                    connection = ConnectionRetryData::connect(tx, info, &mut attempt_idx)
+85                        .attempt(&mut retrying, &interconnect, &config)
+86                        .await;
+87                } else {
+88                    // No reconnection was attempted as there's a valid, identical connection;
+89                    // tell the outside listener that the operation was a success.
+90                    drop(tx.send(Ok(())));
+91                }
+92            },
+93            CoreMessage::RetryConnect(retry_idx) => {
+94                debug!("Retrying idx: {} (vs. {})", retry_idx, attempt_idx);
+95                if retry_idx == attempt_idx {
+96                    if let Some(progress) = retrying.take() {
+97                        connection = progress
+98                            .attempt(&mut retrying, &interconnect, &config)
+99                            .await;
+100                    }
+101                }
+102            },
+103            CoreMessage::Disconnect => {
+104                let last_conn = connection.take();
+105                drop(interconnect.mixer.send(MixerMessage::DropConn));
+106                drop(interconnect.mixer.send(MixerMessage::RebuildEncoder));
+107
+108                if let Some(conn) = last_conn {
+109                    drop(interconnect.events.send(EventMessage::FireCoreEvent(
+110                        CoreContext::DriverDisconnect(InternalDisconnect {
+111                            kind: DisconnectKind::Runtime,
+112                            reason: Some(DisconnectReason::Requested),
+113                            info: conn.info.clone(),
+114                        }),
+115                    )));
+116                }
+117            },
+118            CoreMessage::SignalWsClosure(ws_idx, ws_info, mut reason) => {
+119                // if idx is not a match, quash reason
+120                // (i.e., prevent users from mistakenly trying to reconnect for an *old* dead conn).
+121                // if it *is* a match, the conn needs to die!
+122                // (as the WS channel has truly given up the ghost).
+123                let conn = if ws_idx == attempt_idx {
+124                    drop(interconnect.mixer.send(MixerMessage::DropConn));
+125                    drop(interconnect.mixer.send(MixerMessage::RebuildEncoder));
+126                    connection.take()
+127                } else {
+128                    reason = None;
+129                    None
+130                };
+131
+132                // Conn may have been unset earlier (i.e., in a deliberate disconnect).
+133                // If so, do not repropagate/repeat the disconnect event.
+134                if conn.is_some() {
+135                    drop(interconnect.events.send(EventMessage::FireCoreEvent(
+136                        CoreContext::DriverDisconnect(InternalDisconnect {
+137                            kind: DisconnectKind::Runtime,
+138                            reason,
+139                            info: ws_info,
+140                        }),
+141                    )));
+142                }
+143            },
+144            CoreMessage::SetTrack(s) => {
+145                drop(interconnect.mixer.send(MixerMessage::SetTrack(s)));
+146            },
+147            CoreMessage::AddTrack(s) => {
+148                drop(interconnect.mixer.send(MixerMessage::AddTrack(s)));
+149            },
+150            CoreMessage::SetBitrate(b) => {
+151                drop(interconnect.mixer.send(MixerMessage::SetBitrate(b)));
+152            },
+153            CoreMessage::SetConfig(mut new_config) => {
+154                next_config = Some(new_config.clone());
+155
+156                new_config.make_safe(&config, connection.is_some());
+157
+158                drop(interconnect.mixer.send(MixerMessage::SetConfig(new_config)));
+159            },
+160            CoreMessage::AddEvent(evt) => {
+161                drop(interconnect.events.send(EventMessage::AddGlobalEvent(evt)));
+162            },
+163            CoreMessage::RemoveGlobalEvents => {
+164                drop(interconnect.events.send(EventMessage::RemoveGlobalEvents));
+165            },
+166            CoreMessage::Mute(m) => {
+167                drop(interconnect.mixer.send(MixerMessage::SetMute(m)));
+168            },
+169            CoreMessage::Reconnect => {
+170                if let Some(mut conn) = connection.take() {
+171                    // try once: if interconnect, try again.
+172                    // if still issue, full connect.
+173                    let info = conn.info.clone();
+174
+175                    let full_connect = match conn.reconnect(&config).await {
+176                        Ok(()) => {
+177                            connection = Some(conn);
+178                            false
+179                        },
+180                        Err(ConnectionError::InterconnectFailure(_)) => {
+181                            interconnect.restart_volatile_internals();
+182
+183                            match conn.reconnect(&config).await {
+184                                Ok(()) => {
+185                                    connection = Some(conn);
+186                                    false
+187                                },
+188                                _ => true,
+189                            }
+190                        },
+191                        _ => true,
+192                    };
+193
+194                    if full_connect {
+195                        connection = ConnectionRetryData::reconnect(info, &mut attempt_idx)
+196                            .attempt(&mut retrying, &interconnect, &config)
+197                            .await;
+198                    } else if let Some(ref connection) = &connection {
+199                        drop(interconnect.events.send(EventMessage::FireCoreEvent(
+200                            CoreContext::DriverReconnect(InternalConnect {
+201                                info: connection.info.clone(),
+202                                ssrc: connection.ssrc,
+203                            }),
+204                        )));
+205                    }
+206                }
+207            },
+208            CoreMessage::FullReconnect =>
+209                if let Some(conn) = connection.take() {
+210                    let info = conn.info.clone();
+211
+212                    connection = ConnectionRetryData::reconnect(info, &mut attempt_idx)
+213                        .attempt(&mut retrying, &interconnect, &config)
+214                        .await;
+215                },
+216            CoreMessage::RebuildInterconnect => {
+217                interconnect.restart_volatile_internals();
+218            },
+219            CoreMessage::Poison => break,
+220        }
+221    }
+222
+223    trace!("Main thread exited");
+224    interconnect.poison_all();
+225}
+226
+227struct ConnectionRetryData {
+228    flavour: ConnectionFlavour,
+229    attempts: usize,
+230    last_wait: Option<Duration>,
+231    info: ConnectionInfo,
+232    idx: usize,
+233}
+234
+235impl ConnectionRetryData {
+236    fn connect(
+237        tx: Sender<Result<(), ConnectionError>>,
+238        info: ConnectionInfo,
+239        idx_src: &mut usize,
+240    ) -> Self {
+241        Self::base(ConnectionFlavour::Connect(tx), info, idx_src)
+242    }
+243
+244    fn reconnect(info: ConnectionInfo, idx_src: &mut usize) -> Self {
+245        Self::base(ConnectionFlavour::Reconnect, info, idx_src)
+246    }
+247
+248    fn base(flavour: ConnectionFlavour, info: ConnectionInfo, idx_src: &mut usize) -> Self {
+249        *idx_src = idx_src.wrapping_add(1);
+250
+251        Self {
+252            flavour,
+253            attempts: 0,
+254            last_wait: None,
+255            info,
+256            idx: *idx_src,
+257        }
+258    }
+259
+260    async fn attempt(
+261        mut self,
+262        attempt_slot: &mut Option<Self>,
+263        interconnect: &Interconnect,
+264        config: &Config,
+265    ) -> Option<Connection> {
+266        match Connection::new(self.info.clone(), interconnect, config, self.idx).await {
+267            Ok(connection) => {
+268                match self.flavour {
+269                    ConnectionFlavour::Connect(tx) => {
+270                        // Other side may not be listening: this is fine.
+271                        drop(tx.send(Ok(())));
+272
+273                        drop(interconnect.events.send(EventMessage::FireCoreEvent(
+274                            CoreContext::DriverConnect(InternalConnect {
+275                                info: connection.info.clone(),
+276                                ssrc: connection.ssrc,
+277                            }),
+278                        )));
+279                    },
+280                    ConnectionFlavour::Reconnect => {
+281                        drop(interconnect.events.send(EventMessage::FireCoreEvent(
+282                            CoreContext::DriverReconnect(InternalConnect {
+283                                info: connection.info.clone(),
+284                                ssrc: connection.ssrc,
+285                            }),
+286                        )));
+287                    },
+288                }
+289
+290                Some(connection)
+291            },
+292            Err(why) => {
+293                debug!("Failed to connect for {:?}: {}", self.info.guild_id, why);
+294                if let Some(t) = config.driver_retry.retry_in(self.last_wait, self.attempts) {
+295                    let remote_ic = interconnect.clone();
+296                    let idx = self.idx;
+297
+298                    spawn(async move {
+299                        tsleep(t).await;
+300                        drop(remote_ic.core.send(CoreMessage::RetryConnect(idx)));
+301                    });
+302
+303                    self.attempts += 1;
+304                    self.last_wait = Some(t);
+305
+306                    debug!(
+307                        "Retrying connection for {:?} in {}s ({}/{:?})",
+308                        self.info.guild_id,
+309                        t.as_secs_f32(),
+310                        self.attempts,
+311                        config.driver_retry.retry_limit
+312                    );
+313
+314                    *attempt_slot = Some(self);
+315                } else {
+316                    let reason = Some(DisconnectReason::from(&why));
+317
+318                    match self.flavour {
+319                        ConnectionFlavour::Connect(tx) => {
+320                            // See above.
+321                            drop(tx.send(Err(why)));
+322
+323                            drop(interconnect.events.send(EventMessage::FireCoreEvent(
+324                                CoreContext::DriverDisconnect(InternalDisconnect {
+325                                    kind: DisconnectKind::Connect,
+326                                    reason,
+327                                    info: self.info,
+328                                }),
+329                            )));
+330                        },
+331                        ConnectionFlavour::Reconnect => {
+332                            drop(interconnect.events.send(EventMessage::FireCoreEvent(
+333                                CoreContext::DriverDisconnect(InternalDisconnect {
+334                                    kind: DisconnectKind::Reconnect,
+335                                    reason,
+336                                    info: self.info,
+337                                }),
+338                            )));
+339                        },
+340                    }
+341                }
+342
+343                None
+344            },
+345        }
+346    }
+347}
+348
+349enum ConnectionFlavour {
+350    Connect(Sender<Result<(), ConnectionError>>),
+351    Reconnect,
+352}
\ No newline at end of file diff --git a/next/src/songbird/driver/tasks/udp_rx/decode_sizes.rs.html b/next/src/songbird/driver/tasks/udp_rx/decode_sizes.rs.html new file mode 100644 index 0000000..80bab42 --- /dev/null +++ b/next/src/songbird/driver/tasks/udp_rx/decode_sizes.rs.html @@ -0,0 +1,42 @@ +decode_sizes.rs - source

songbird/driver/tasks/udp_rx/
decode_sizes.rs

1use crate::constants::STEREO_FRAME_SIZE;
+2
+3#[derive(Clone, Copy, Debug, Eq, PartialEq)]
+4pub enum PacketDecodeSize {
+5    /// Minimum frame size on Discord.
+6    TwentyMillis,
+7    /// Hybrid packet, sent by Firefox web client.
+8    ///
+9    /// Likely 20ms frame + 10ms frame.
+10    ThirtyMillis,
+11    /// Next largest frame size.
+12    FortyMillis,
+13    /// Maximum Opus frame size.
+14    SixtyMillis,
+15    /// Maximum Opus packet size: 120ms.
+16    Max,
+17}
+18
+19impl PacketDecodeSize {
+20    pub fn bump_up(self) -> Self {
+21        match self {
+22            Self::TwentyMillis => Self::ThirtyMillis,
+23            Self::ThirtyMillis => Self::FortyMillis,
+24            Self::FortyMillis => Self::SixtyMillis,
+25            Self::SixtyMillis | Self::Max => Self::Max,
+26        }
+27    }
+28
+29    pub fn can_bump_up(self) -> bool {
+30        self != Self::Max
+31    }
+32
+33    pub fn len(self) -> usize {
+34        match self {
+35            Self::TwentyMillis => STEREO_FRAME_SIZE,
+36            Self::ThirtyMillis => (STEREO_FRAME_SIZE / 2) * 3,
+37            Self::FortyMillis => 2 * STEREO_FRAME_SIZE,
+38            Self::SixtyMillis => 3 * STEREO_FRAME_SIZE,
+39            Self::Max => 6 * STEREO_FRAME_SIZE,
+40        }
+41    }
+42}
\ No newline at end of file diff --git a/next/src/songbird/driver/tasks/udp_rx/mod.rs.html b/next/src/songbird/driver/tasks/udp_rx/mod.rs.html new file mode 100644 index 0000000..334cc40 --- /dev/null +++ b/next/src/songbird/driver/tasks/udp_rx/mod.rs.html @@ -0,0 +1,277 @@ +mod.rs - source

songbird/driver/tasks/udp_rx/
mod.rs

1mod decode_sizes;
+2mod playout_buffer;
+3mod ssrc_state;
+4
+5use self::{decode_sizes::*, playout_buffer::*, ssrc_state::*};
+6
+7use super::message::*;
+8use crate::driver::{CryptoMode, DecodeMode};
+9use crate::{
+10    constants::*,
+11    driver::crypto::Cipher,
+12    events::{context_data::VoiceTick, internal_data::*, CoreContext},
+13    Config,
+14};
+15use bytes::BytesMut;
+16use discortp::{
+17    demux::{self, DemuxedMut},
+18    rtp::RtpPacket,
+19};
+20use flume::Receiver;
+21use std::{
+22    collections::{HashMap, HashSet},
+23    num::Wrapping,
+24    sync::Arc,
+25    time::Duration,
+26};
+27use tokio::{net::UdpSocket, select, time::Instant};
+28use tracing::{error, instrument, trace, warn};
+29
+30type RtpSequence = Wrapping<u16>;
+31type RtpTimestamp = Wrapping<u32>;
+32type RtpSsrc = u32;
+33
+34struct UdpRx {
+35    cipher: Cipher,
+36    crypto_mode: CryptoMode,
+37    decoder_map: HashMap<RtpSsrc, SsrcState>,
+38    config: Config,
+39    rx: Receiver<UdpRxMessage>,
+40    ssrc_signalling: Arc<SsrcTracker>,
+41    udp_socket: UdpSocket,
+42}
+43
+44impl UdpRx {
+45    #[instrument(skip(self))]
+46    async fn run(&mut self, interconnect: &mut Interconnect) {
+47        let mut cleanup_time = Instant::now();
+48        let mut playout_time = Instant::now() + TIMESTEP_LENGTH;
+49        let mut byte_dest: Option<BytesMut> = None;
+50
+51        loop {
+52            if byte_dest.is_none() {
+53                byte_dest = Some(BytesMut::zeroed(VOICE_PACKET_MAX));
+54            }
+55
+56            select! {
+57                Ok((len, _addr)) = self.udp_socket.recv_from(byte_dest.as_mut().unwrap()) => {
+58                    let mut pkt = byte_dest.take().unwrap();
+59                    pkt.truncate(len);
+60
+61                    self.process_udp_message(interconnect, pkt);
+62                },
+63                msg = self.rx.recv_async() => {
+64                    match msg {
+65                        Ok(UdpRxMessage::ReplaceInterconnect(i)) => {
+66                            *interconnect = i;
+67                        },
+68                        Ok(UdpRxMessage::SetConfig(new_config)) => {
+69                            if let DecodeMode::Decode(old_config) = &mut self.config.decode_mode {
+70                                if *old_config != new_config {
+71                                    *old_config = new_config;
+72                                    self.decoder_map.values_mut().for_each(|v| v.reconfigure_decoder(new_config));
+73                                }
+74                            }
+75                        },
+76                        Err(flume::RecvError::Disconnected) => break,
+77                    }
+78                },
+79                () = tokio::time::sleep_until(playout_time) => {
+80                    let mut tick = VoiceTick {
+81                        speaking: HashMap::new(),
+82                        silent: HashSet::new(),
+83                    };
+84
+85                    for (ssrc, state) in &mut self.decoder_map {
+86                        match state.get_voice_tick(&self.config) {
+87                            Ok(Some(data)) => {
+88                                tick.speaking.insert(*ssrc, data);
+89                            },
+90                            Ok(None) => {
+91                                if !state.disconnected {
+92                                    tick.silent.insert(*ssrc);
+93                                }
+94                            },
+95                            Err(e) => {
+96                                warn!("Decode error for SSRC {ssrc}: {e:?}");
+97                                tick.silent.insert(*ssrc);
+98                            },
+99                        }
+100                    }
+101
+102                    playout_time += TIMESTEP_LENGTH;
+103
+104                    drop(interconnect.events.send(EventMessage::FireCoreEvent(CoreContext::VoiceTick(tick))));
+105                },
+106                () = tokio::time::sleep_until(cleanup_time) => {
+107                    // periodic cleanup.
+108                    let now = Instant::now();
+109
+110                    // check ssrc map to see if the WS task has informed us of any disconnects.
+111                    loop {
+112                        // This is structured in an odd way to prevent deadlocks.
+113                        // while-let seemed to keep the dashmap iter() alive for block scope, rather than
+114                        // just the initialiser.
+115                        let id = {
+116                            if let Some(id) = self.ssrc_signalling.disconnected_users.iter().next().map(|v| *v.key()) {
+117                                id
+118                            } else {
+119                                break;
+120                            }
+121                        };
+122
+123                        _ = self.ssrc_signalling.disconnected_users.remove(&id);
+124                        if let Some((_, ssrc)) = self.ssrc_signalling.user_ssrc_map.remove(&id) {
+125                            if let Some(state) = self.decoder_map.get_mut(&ssrc) {
+126                                // don't cleanup immediately: leave for later cycle
+127                                // this is key with reorder/jitter buffers where we may
+128                                // still need to decode post disconnect for ~0.2s.
+129                                state.prune_time = now + Duration::from_secs(1);
+130                                state.disconnected = true;
+131                            }
+132                        }
+133                    }
+134
+135                    // now remove all dead ssrcs.
+136                    self.decoder_map.retain(|_, v| v.prune_time > now);
+137
+138                    cleanup_time = now + Duration::from_secs(5);
+139                },
+140            }
+141        }
+142    }
+143
+144    fn process_udp_message(&mut self, interconnect: &Interconnect, mut packet: BytesMut) {
+145        // NOTE: errors here (and in general for UDP) are not fatal to the connection.
+146        // Panics should be avoided due to adversarial nature of rx'd packets,
+147        // but correct handling should not prompt a reconnect.
+148        //
+149        // For simplicity, if the event task fails then we nominate the mixing thread
+150        // to rebuild their context etc. (hence, the `let _ =` statements.), as it will
+151        // try to make contact every 20ms.
+152        let crypto_mode = self.crypto_mode;
+153
+154        match demux::demux_mut(packet.as_mut()) {
+155            DemuxedMut::Rtp(mut rtp) => {
+156                if !rtp_valid(&rtp.to_immutable()) {
+157                    error!("Illegal RTP message received.");
+158                    return;
+159                }
+160
+161                let packet_data = if self.config.decode_mode.should_decrypt() {
+162                    let out = self
+163                        .cipher
+164                        .decrypt_rtp_in_place(&mut rtp)
+165                        .map(|(s, t)| (s, t, true));
+166
+167                    if let Err(ref e) = out {
+168                        warn!("RTP decryption failed: {:?}", e);
+169                    }
+170
+171                    out.ok()
+172                } else {
+173                    None
+174                };
+175
+176                let rtp = rtp.to_immutable();
+177                let (rtp_body_start, rtp_body_tail, decrypted) = packet_data.unwrap_or_else(|| {
+178                    (
+179                        crypto_mode.payload_prefix_len(),
+180                        crypto_mode.payload_suffix_len(),
+181                        false,
+182                    )
+183                });
+184
+185                let entry = self
+186                    .decoder_map
+187                    .entry(rtp.get_ssrc())
+188                    .or_insert_with(|| SsrcState::new(&rtp, crypto_mode, &self.config));
+189
+190                // Only do this on RTP, rather than RTCP -- this pins decoder state liveness
+191                // to *speech* rather than just presence.
+192                entry.refresh_timer(self.config.decode_state_timeout);
+193
+194                let store_pkt = StoredPacket {
+195                    packet: packet.freeze(),
+196                    decrypted,
+197                };
+198                let packet = store_pkt.packet.clone();
+199                entry.store_packet(store_pkt, &self.config);
+200
+201                drop(interconnect.events.send(EventMessage::FireCoreEvent(
+202                    CoreContext::RtpPacket(InternalRtpPacket {
+203                        packet,
+204                        payload_offset: rtp_body_start,
+205                        payload_end_pad: rtp_body_tail,
+206                    }),
+207                )));
+208            },
+209            DemuxedMut::Rtcp(mut rtcp) => {
+210                let packet_data = if self.config.decode_mode.should_decrypt() {
+211                    let out = self.cipher.decrypt_rtcp_in_place(&mut rtcp);
+212
+213                    if let Err(ref e) = out {
+214                        warn!("RTCP decryption failed: {:?}", e);
+215                    }
+216
+217                    out.ok()
+218                } else {
+219                    None
+220                };
+221
+222                let (start, tail) = packet_data.unwrap_or_else(|| {
+223                    (
+224                        crypto_mode.payload_prefix_len(),
+225                        crypto_mode.payload_suffix_len(),
+226                    )
+227                });
+228
+229                drop(interconnect.events.send(EventMessage::FireCoreEvent(
+230                    CoreContext::RtcpPacket(InternalRtcpPacket {
+231                        packet: packet.freeze(),
+232                        payload_offset: start,
+233                        payload_end_pad: tail,
+234                    }),
+235                )));
+236            },
+237            DemuxedMut::FailedParse(t) => {
+238                warn!("Failed to parse message of type {:?}.", t);
+239            },
+240            DemuxedMut::TooSmall => {
+241                warn!("Illegal UDP packet from voice server.");
+242            },
+243        }
+244    }
+245}
+246
+247#[instrument(skip(interconnect, rx, cipher))]
+248pub(crate) async fn runner(
+249    mut interconnect: Interconnect,
+250    rx: Receiver<UdpRxMessage>,
+251    cipher: Cipher,
+252    crypto_mode: CryptoMode,
+253    config: Config,
+254    udp_socket: UdpSocket,
+255    ssrc_signalling: Arc<SsrcTracker>,
+256) {
+257    trace!("UDP receive handle started.");
+258
+259    let mut state = UdpRx {
+260        cipher,
+261        crypto_mode,
+262        decoder_map: HashMap::new(),
+263        config,
+264        rx,
+265        ssrc_signalling,
+266        udp_socket,
+267    };
+268
+269    state.run(&mut interconnect).await;
+270
+271    trace!("UDP receive handle stopped.");
+272}
+273
+274#[inline]
+275fn rtp_valid(packet: &RtpPacket<'_>) -> bool {
+276    packet.get_version() == RTP_VERSION && packet.get_payload_type() == RTP_PROFILE_TYPE
+277}
\ No newline at end of file diff --git a/next/src/songbird/driver/tasks/udp_rx/playout_buffer.rs.html b/next/src/songbird/driver/tasks/udp_rx/playout_buffer.rs.html new file mode 100644 index 0000000..2305000 --- /dev/null +++ b/next/src/songbird/driver/tasks/udp_rx/playout_buffer.rs.html @@ -0,0 +1,203 @@ +playout_buffer.rs - source

songbird/driver/tasks/udp_rx/
playout_buffer.rs

1use super::*;
+2use bytes::Bytes;
+3use std::collections::VecDeque;
+4use tracing::trace;
+5
+6#[derive(Clone, Debug, Eq, PartialEq)]
+7pub struct StoredPacket {
+8    pub packet: Bytes,
+9    // We need to store this as it's possible that a user can change config modes.
+10    pub decrypted: bool,
+11}
+12
+13/// Determines whether an SSRC's packets should be decoded.
+14///
+15/// Playout requires us to keep an almost constant delay, to do so we build
+16/// a user's packet buffer up to the required length ([`Config::playout_buffer_length`])
+17/// ([`Self::Fill`]) and then emit packets on each tick ([`Self::Drain`]).
+18///
+19/// This gets a bit harder to reason about when users stop speaking. If a speech gap
+20/// lasts longer than the playout buffer, then we can simply swap from `Drain` -> `Fill`.
+21/// However, a genuine gap of `n` frames must lead to us reverting to `Fill` for `n` frames.
+22/// To compute this, we use the RTP timestamp of two `seq`-adjacent packets at playout: if the next
+23/// timestamp is too large, then we revert to `Fill`.
+24///
+25/// Small playout bursts also require care.
+26///
+27/// If timestamp info is incorrect, then in the worst case we eventually need to rebuffer if the delay
+28/// drains to zero.
+29#[derive(Clone, Copy, Debug, Eq, PartialEq)]
+30enum PlayoutMode {
+31    Fill,
+32    Drain,
+33}
+34
+35#[derive(Clone, Debug, Eq, PartialEq)]
+36pub enum PacketLookup {
+37    Packet(StoredPacket),
+38    MissedPacket,
+39    Filling,
+40}
+41
+42#[derive(Debug)]
+43pub struct PlayoutBuffer {
+44    buffer: VecDeque<Option<StoredPacket>>,
+45    playout_mode: PlayoutMode,
+46    next_seq: RtpSequence,
+47    current_timestamp: Option<RtpTimestamp>,
+48    consecutive_store_fails: usize,
+49}
+50
+51impl PlayoutBuffer {
+52    pub fn new(capacity: usize, next_seq: RtpSequence) -> Self {
+53        Self {
+54            buffer: VecDeque::with_capacity(capacity),
+55            playout_mode: PlayoutMode::Fill,
+56            next_seq,
+57            current_timestamp: None,
+58            consecutive_store_fails: 0,
+59        }
+60    }
+61
+62    /// Slot a received RTP packet into the correct location in the playout buffer using
+63    /// its sequence number, subject to maximums.
+64    ///
+65    /// An out of bounds packet must create any remaining `None`s
+66    pub fn store_packet(&mut self, packet: StoredPacket, config: &Config) {
+67        let rtp = RtpPacket::new(&packet.packet)
+68            .expect("FATAL: earlier valid packet now invalid (store)");
+69
+70        if self.current_timestamp.is_none() {
+71            self.current_timestamp = Some(reset_timeout(&rtp, config));
+72        }
+73
+74        // compute index by taking wrapping difference between both seq numbers.
+75        // If the difference is *too big*, or in the past [also too big, in a way],
+76        // ignore the packet
+77        let pkt_seq = rtp.get_sequence().0;
+78        let desired_index = (pkt_seq - self.next_seq).0 as i16;
+79
+80        // Similar concept to fetch_packet -- if there's a critical desync, and we're unwilling
+81        // to slot this packet into an empty/stuck buffer then behave as though this packet is the next
+82        // sequence number we're releasing.
+83        let err_threshold = i16::try_from(config.playout_buffer_length.get() * 5).unwrap_or(32);
+84        let handling_desync = (self.buffer.is_empty()
+85            || self.consecutive_store_fails >= (err_threshold as usize))
+86            && desired_index >= err_threshold;
+87
+88        if desired_index < 0 {
+89            trace!("Missed packet arrived late, discarding from playout.");
+90        } else if !handling_desync && desired_index >= 64 {
+91            trace!(
+92                "Packet arrived beyond playout max length({}): wanted slot {desired_index}.\
+93                ts {}, seq {}, next_out_seq {}",
+94                rtp.get_ssrc(),
+95                rtp.get_timestamp().0,
+96                rtp.get_sequence().0,
+97                self.next_seq,
+98            );
+99            self.consecutive_store_fails += 1;
+100        } else {
+101            let index = if handling_desync {
+102                self.buffer.clear();
+103                self.next_seq = pkt_seq;
+104
+105                0
+106            } else {
+107                desired_index as usize
+108            };
+109            while self.buffer.len() <= index {
+110                self.buffer.push_back(None);
+111            }
+112            self.buffer[index] = Some(packet);
+113            self.consecutive_store_fails = 0;
+114        }
+115
+116        if self.buffer.len() >= config.playout_buffer_length.get() {
+117            self.playout_mode = PlayoutMode::Drain;
+118        }
+119    }
+120
+121    pub fn fetch_packet(&mut self, config: &Config) -> PacketLookup {
+122        if self.playout_mode == PlayoutMode::Fill {
+123            return PacketLookup::Filling;
+124        }
+125
+126        let out = match self.buffer.pop_front() {
+127            Some(Some(pkt)) => {
+128                let rtp = RtpPacket::new(&pkt.packet)
+129                    .expect("FATAL: earlier valid packet now invalid (fetch)");
+130
+131                // The curr_ts captures the current playout point; we want to
+132                // be able to emit *all* packets with a smaller timestamp.
+133                // However, we need to handle this in a wrap-safe way.
+134                // ts_diff shows where the current time lies if we treat packet_ts
+135                // as 0, s.t. ts_diff >= 0 (equiv) packet_time <= curr_time.
+136                let curr_ts = self.current_timestamp.as_mut().unwrap();
+137                let pkt_ts = rtp.get_timestamp().0;
+138                let ts_diff = (*curr_ts - pkt_ts).0 as i32;
+139
+140                // At least one client in the wild has seen unusual timestamp behaviour: the
+141                // first packet sent out in a run of audio may have an older timestamp.
+142                // This could be badly timestamped, or could conceivably be an orphaned packet
+143                // from a prior run, or e.g.:
+144                //  (n x RTP) -> [>100ms delay] -> (RTP) -> [long O(s) delay] -> (m x RTP)
+145                // This leaves us with two adjacent packets in the same playout with wildly varying
+146                // timestamps. We have a slightly tricky situation -- we need to preserve accurate
+147                // timing to correctly drain/refill/recreate very small pauses in audio, but don't
+148                // want to block indefinitely.
+149                //
+150                // We have a compromise here -- if an adjacent (Drain) packet has a ts gap
+151                // larger than it would take to go through multiple Fill/Drain cycles, then
+152                // treat its TS as the next expected value to avoid jamming the buffer and losing
+153                // later audio.
+154                let skip_after =
+155                    i32::try_from(config.playout_buffer_length.get() * 5 * MONO_FRAME_SIZE)
+156                        .unwrap_or((AUDIO_FRAME_RATE * 2 * MONO_FRAME_SIZE) as i32);
+157
+158                if ts_diff >= 0 {
+159                    // At or before expected timestamp.
+160                    self.next_seq = (rtp.get_sequence() + 1).0;
+161
+162                    PacketLookup::Packet(pkt)
+163                } else if ts_diff <= -skip_after {
+164                    // >5 playouts ahead.
+165                    self.next_seq = (rtp.get_sequence() + 1).0;
+166                    *curr_ts = pkt_ts;
+167                    PacketLookup::Packet(pkt)
+168                } else {
+169                    trace!("Witholding packet: ts_diff is {ts_diff}");
+170                    self.buffer.push_front(Some(pkt));
+171                    self.playout_mode = PlayoutMode::Fill;
+172                    PacketLookup::Filling
+173                }
+174            },
+175            Some(None) => {
+176                self.next_seq += 1;
+177                PacketLookup::MissedPacket
+178            },
+179            None => PacketLookup::Filling,
+180        };
+181
+182        if self.buffer.is_empty() {
+183            self.playout_mode = PlayoutMode::Fill;
+184            self.current_timestamp = None;
+185        }
+186
+187        if let Some(ts) = self.current_timestamp.as_mut() {
+188            *ts += &(MONO_FRAME_SIZE as u32);
+189        }
+190
+191        out
+192    }
+193
+194    pub fn next_seq(&self) -> RtpSequence {
+195        self.next_seq
+196    }
+197}
+198
+199#[inline]
+200fn reset_timeout(packet: &RtpPacket<'_>, config: &Config) -> RtpTimestamp {
+201    let t_shift = MONO_FRAME_SIZE * config.playout_buffer_length.get();
+202    (packet.get_timestamp() + (t_shift as u32)).0
+203}
\ No newline at end of file diff --git a/next/src/songbird/driver/tasks/udp_rx/ssrc_state.rs.html b/next/src/songbird/driver/tasks/udp_rx/ssrc_state.rs.html new file mode 100644 index 0000000..57f085d --- /dev/null +++ b/next/src/songbird/driver/tasks/udp_rx/ssrc_state.rs.html @@ -0,0 +1,202 @@ +ssrc_state.rs - source

songbird/driver/tasks/udp_rx/
ssrc_state.rs

1use super::*;
+2use crate::{
+3    driver::{
+4        tasks::error::{Error, Result},
+5        Channels,
+6        DecodeConfig,
+7        DecodeMode,
+8    },
+9    events::context_data::{RtpData, VoiceData},
+10};
+11use audiopus::{
+12    coder::Decoder as OpusDecoder,
+13    error::{Error as OpusError, ErrorCode},
+14    packet::Packet as OpusPacket,
+15};
+16use discortp::{rtp::RtpExtensionPacket, Packet, PacketSize};
+17use tracing::{error, warn};
+18
+19#[derive(Debug)]
+20pub struct SsrcState {
+21    playout_buffer: PlayoutBuffer,
+22    crypto_mode: CryptoMode,
+23    decoder: OpusDecoder,
+24    decode_size: PacketDecodeSize,
+25    pub(crate) prune_time: Instant,
+26    pub(crate) disconnected: bool,
+27    channels: Channels,
+28}
+29
+30impl SsrcState {
+31    pub fn new(pkt: &RtpPacket<'_>, crypto_mode: CryptoMode, config: &Config) -> Self {
+32        let playout_capacity = config.playout_buffer_length.get() + config.playout_spike_length;
+33        let (sample_rate, channels) = match config.decode_mode {
+34            DecodeMode::Decode(config) => (config.sample_rate, config.channels),
+35            DecodeMode::Decrypt | DecodeMode::Pass => Default::default(),
+36        };
+37
+38        Self {
+39            playout_buffer: PlayoutBuffer::new(playout_capacity, pkt.get_sequence().0),
+40            crypto_mode,
+41            decoder: OpusDecoder::new(sample_rate.into(), channels.into())
+42                .expect("Failed to create new Opus decoder for source."),
+43            decode_size: PacketDecodeSize::TwentyMillis,
+44            prune_time: Instant::now() + config.decode_state_timeout,
+45            disconnected: false,
+46            channels,
+47        }
+48    }
+49
+50    pub fn reconfigure_decoder(&mut self, config: DecodeConfig) {
+51        self.decoder = OpusDecoder::new(config.sample_rate.into(), config.channels.into())
+52            .expect("Failed to create new Opus decoder for source.");
+53
+54        self.channels = config.channels;
+55    }
+56
+57    pub fn store_packet(&mut self, packet: StoredPacket, config: &Config) {
+58        self.playout_buffer.store_packet(packet, config);
+59    }
+60
+61    pub fn refresh_timer(&mut self, state_timeout: Duration) {
+62        if !self.disconnected {
+63            self.prune_time = Instant::now() + state_timeout;
+64        }
+65    }
+66
+67    pub fn get_voice_tick(&mut self, config: &Config) -> Result<Option<VoiceData>> {
+68        // Acquire a packet from the playout buffer:
+69        // Update nexts, lasts...
+70        // different cases: null packet who we want to decode as a miss, and packet who we must ignore temporarily.
+71        let m_pkt = self.playout_buffer.fetch_packet(config);
+72        let pkt = match m_pkt {
+73            PacketLookup::Packet(StoredPacket { packet, decrypted }) => Some((packet, decrypted)),
+74            PacketLookup::MissedPacket => None,
+75            PacketLookup::Filling => return Ok(None),
+76        };
+77
+78        let mut out = VoiceData {
+79            packet: None,
+80            decoded_voice: None,
+81        };
+82
+83        let should_decode = config.decode_mode.should_decode();
+84        if let Some((packet, decrypted)) = pkt {
+85            let rtp = RtpPacket::new(&packet).unwrap();
+86            let extensions = rtp.get_extension() != 0;
+87
+88            let payload = rtp.payload();
+89            let payload_offset = self.crypto_mode.payload_prefix_len();
+90            let payload_end_pad = payload.len() - self.crypto_mode.payload_suffix_len();
+91
+92            // We still need to compute missed packets here in case of long loss chains or similar.
+93            // This occurs due to the fallback in 'store_packet' (i.e., empty buffer and massive seq difference).
+94            // Normal losses should be handled by the below `else` branch.
+95            let new_seq: u16 = rtp.get_sequence().into();
+96            let missed_packets = new_seq.saturating_sub(self.playout_buffer.next_seq().0);
+97
+98            // TODO: maybe hand over audio and extension indices alongside packet?
+99            let (audio, _packet_size) = self.scan_and_decode(
+100                &payload[payload_offset..payload_end_pad],
+101                extensions,
+102                missed_packets,
+103                should_decode && decrypted,
+104            )?;
+105
+106            let rtp_data = RtpData {
+107                packet,
+108                payload_offset,
+109                payload_end_pad,
+110            };
+111
+112            out.packet = Some(rtp_data);
+113            out.decoded_voice = audio;
+114        } else if should_decode {
+115            let mut audio = vec![0; self.decode_size.len()];
+116            let dest_samples = (&mut audio[..])
+117                .try_into()
+118                .expect("Decode logic will cap decode buffer size at i32::MAX.");
+119            let len = self.decoder.decode(None, dest_samples, false)?;
+120            audio.truncate(2 * len);
+121
+122            out.decoded_voice = Some(audio);
+123        }
+124
+125        Ok(Some(out))
+126    }
+127
+128    fn scan_and_decode(
+129        &mut self,
+130        data: &[u8],
+131        extension: bool,
+132        missed_packets: u16,
+133        decode: bool,
+134    ) -> Result<(Option<Vec<i16>>, usize)> {
+135        let start = if extension {
+136            RtpExtensionPacket::new(data)
+137                .map(|pkt| pkt.packet_size())
+138                .ok_or_else(|| {
+139                    error!("Extension packet indicated, but insufficient space.");
+140                    Error::IllegalVoicePacket
+141                })
+142        } else {
+143            Ok(0)
+144        }?;
+145
+146        let pkt = if decode {
+147            let mut out = vec![0; self.decode_size.len()];
+148
+149            for _ in 0..missed_packets {
+150                let missing_frame: Option<OpusPacket<'_>> = None;
+151                let dest_samples = (&mut out[..])
+152                    .try_into()
+153                    .expect("Decode logic will cap decode buffer size at i32::MAX.");
+154                if let Err(e) = self.decoder.decode(missing_frame, dest_samples, false) {
+155                    warn!("Issue while decoding for missed packet: {:?}.", e);
+156                }
+157            }
+158
+159            // In general, we should expect 20 ms frames.
+160            // However, Discord occasionally like to surprise us with something bigger.
+161            // This is *sender-dependent behaviour*.
+162            //
+163            // This should scan up to find the "correct" size that a source is using,
+164            // and then remember that.
+165            loop {
+166                let tried_audio_len = self.decoder.decode(
+167                    Some(data[start..].try_into()?),
+168                    (&mut out[..]).try_into()?,
+169                    false,
+170                );
+171                match tried_audio_len {
+172                    Ok(audio_len) => {
+173                        // Decoding to stereo: audio_len refers to sample count irrespective of channel count.
+174                        // => multiply by number of channels.
+175                        out.truncate(self.channels.channels() * audio_len);
+176
+177                        break;
+178                    },
+179                    Err(OpusError::Opus(ErrorCode::BufferTooSmall)) => {
+180                        if self.decode_size.can_bump_up() {
+181                            self.decode_size = self.decode_size.bump_up();
+182                            out = vec![0; self.decode_size.len()];
+183                        } else {
+184                            error!("Received packet larger than Opus standard maximum,");
+185                            return Err(Error::IllegalVoicePacket);
+186                        }
+187                    },
+188                    Err(e) => {
+189                        error!("Failed to decode received packet: {:?}.", e);
+190                        return Err(e.into());
+191                    },
+192                }
+193            }
+194
+195            Some(out)
+196        } else {
+197            None
+198        };
+199
+200        Ok((pkt, data.len() - start))
+201    }
+202}
\ No newline at end of file diff --git a/next/src/songbird/driver/tasks/ws.rs.html b/next/src/songbird/driver/tasks/ws.rs.html new file mode 100644 index 0000000..7a51bea --- /dev/null +++ b/next/src/songbird/driver/tasks/ws.rs.html @@ -0,0 +1,278 @@ +ws.rs - source

songbird/driver/tasks/
ws.rs

1use super::message::*;
+2use crate::{
+3    events::CoreContext,
+4    model::{
+5        payload::{Heartbeat, Speaking},
+6        CloseCode as VoiceCloseCode,
+7        Event as GatewayEvent,
+8        FromPrimitive,
+9        SpeakingState,
+10    },
+11    ws::{Error as WsError, WsStream},
+12    ConnectionInfo,
+13};
+14use flume::Receiver;
+15use rand::{distr::Uniform, Rng};
+16#[cfg(feature = "receive")]
+17use std::sync::Arc;
+18use std::time::Duration;
+19use tokio::{
+20    select,
+21    time::{sleep_until, Instant},
+22};
+23#[cfg(feature = "tungstenite")]
+24use tokio_tungstenite::tungstenite::protocol::frame::coding::CloseCode;
+25use tracing::{debug, info, instrument, trace, warn};
+26
+27pub(crate) struct AuxNetwork {
+28    rx: Receiver<WsMessage>,
+29    ws_client: WsStream,
+30    dont_send: bool,
+31
+32    ssrc: u32,
+33    heartbeat_interval: Duration,
+34
+35    speaking: SpeakingState,
+36    last_heartbeat_nonce: Option<u64>,
+37
+38    attempt_idx: usize,
+39    info: ConnectionInfo,
+40
+41    #[cfg(feature = "receive")]
+42    ssrc_signalling: Arc<SsrcTracker>,
+43}
+44
+45impl AuxNetwork {
+46    pub(crate) fn new(
+47        evt_rx: Receiver<WsMessage>,
+48        ws_client: WsStream,
+49        ssrc: u32,
+50        heartbeat_interval: f64,
+51        attempt_idx: usize,
+52        info: ConnectionInfo,
+53        #[cfg(feature = "receive")] ssrc_signalling: Arc<SsrcTracker>,
+54    ) -> Self {
+55        Self {
+56            rx: evt_rx,
+57            ws_client,
+58            dont_send: false,
+59
+60            ssrc,
+61            heartbeat_interval: Duration::from_secs_f64(heartbeat_interval / 1000.0),
+62
+63            speaking: SpeakingState::empty(),
+64            last_heartbeat_nonce: None,
+65
+66            attempt_idx,
+67            info,
+68
+69            #[cfg(feature = "receive")]
+70            ssrc_signalling,
+71        }
+72    }
+73
+74    #[instrument(skip(self))]
+75    async fn run(&mut self, interconnect: &mut Interconnect) {
+76        let mut next_heartbeat = Instant::now() + self.heartbeat_interval;
+77
+78        loop {
+79            let mut ws_error = false;
+80            let mut should_reconnect = false;
+81            let mut ws_reason = None;
+82
+83            let hb = sleep_until(next_heartbeat);
+84
+85            select! {
+86                () = hb => {
+87                    ws_error = match self.send_heartbeat().await {
+88                        Err(e) => {
+89                            should_reconnect = ws_error_is_not_final(&e);
+90                            ws_reason = Some((&e).into());
+91                            true
+92                        },
+93                        _ => false,
+94                    };
+95                    next_heartbeat = self.next_heartbeat();
+96                }
+97                ws_msg = self.ws_client.recv_json_no_timeout(), if !self.dont_send => {
+98                    ws_error = match ws_msg {
+99                        Err(e) => {
+100                            should_reconnect = ws_error_is_not_final(&e);
+101                            ws_reason = Some((&e).into());
+102                            true
+103                        },
+104                        Ok(Some(msg)) => {
+105                            self.process_ws(interconnect, msg);
+106                            false
+107                        },
+108                        _ => false,
+109                    };
+110                }
+111                inner_msg = self.rx.recv_async() => {
+112                    match inner_msg {
+113                        Ok(WsMessage::Ws(data)) => {
+114                            self.ws_client = *data;
+115                            next_heartbeat = self.next_heartbeat();
+116                            self.dont_send = false;
+117                        },
+118                        Ok(WsMessage::ReplaceInterconnect(i)) => {
+119                            *interconnect = i;
+120                        },
+121                        Ok(WsMessage::SetKeepalive(keepalive)) => {
+122                            self.heartbeat_interval = Duration::from_secs_f64(keepalive / 1000.0);
+123                            next_heartbeat = self.next_heartbeat();
+124                        },
+125                        Ok(WsMessage::Speaking(is_speaking)) => {
+126                            if self.speaking.contains(SpeakingState::MICROPHONE) != is_speaking && !self.dont_send {
+127                                self.speaking.set(SpeakingState::MICROPHONE, is_speaking);
+128                                info!("Changing to {:?}", self.speaking);
+129
+130                                let ssu_status = self.ws_client
+131                                    .send_json(&GatewayEvent::from(Speaking {
+132                                        delay: Some(0),
+133                                        speaking: self.speaking,
+134                                        ssrc: self.ssrc,
+135                                        user_id: None,
+136                                    }))
+137                                    .await;
+138
+139                                ws_error |= match ssu_status {
+140                                    Err(e) => {
+141                                        should_reconnect = ws_error_is_not_final(&e);
+142                                        ws_reason = Some((&e).into());
+143                                        true
+144                                    },
+145                                    _ => false,
+146                                }
+147                            }
+148                        },
+149                        Ok(WsMessage::Deliver(msg)) => {
+150                            self.process_ws(interconnect, msg);
+151                        },
+152                        Err(flume::RecvError::Disconnected) => {
+153                            break;
+154                        },
+155                    }
+156                }
+157            }
+158
+159            if ws_error {
+160                self.dont_send = true;
+161
+162                if should_reconnect {
+163                    drop(interconnect.core.send(CoreMessage::Reconnect));
+164                } else {
+165                    drop(interconnect.core.send(CoreMessage::SignalWsClosure(
+166                        self.attempt_idx,
+167                        self.info.clone(),
+168                        ws_reason,
+169                    )));
+170                    break;
+171                }
+172            }
+173        }
+174    }
+175
+176    fn next_heartbeat(&self) -> Instant {
+177        Instant::now() + self.heartbeat_interval
+178    }
+179
+180    async fn send_heartbeat(&mut self) -> Result<(), WsError> {
+181        // Discord have suddenly, mysteriously, started rejecting
+182        // ints-as-strings. Keep JS happy here, I suppose...
+183        const JS_MAX_INT: u64 = (1u64 << 53) - 1;
+184        let nonce_range =
+185            Uniform::new(0, JS_MAX_INT).expect("uniform range is finite and nonempty");
+186        let nonce = rand::rng().sample(nonce_range);
+187        self.last_heartbeat_nonce = Some(nonce);
+188
+189        trace!("Sent heartbeat {:?}", self.speaking);
+190
+191        if !self.dont_send {
+192            self.ws_client
+193                .send_json(&GatewayEvent::from(Heartbeat { nonce }))
+194                .await?;
+195        }
+196
+197        Ok(())
+198    }
+199
+200    fn process_ws(&mut self, interconnect: &Interconnect, value: GatewayEvent) {
+201        match value {
+202            GatewayEvent::Speaking(ev) => {
+203                #[cfg(feature = "receive")]
+204                if let Some(user_id) = &ev.user_id {
+205                    self.ssrc_signalling.user_ssrc_map.insert(*user_id, ev.ssrc);
+206                }
+207
+208                drop(interconnect.events.send(EventMessage::FireCoreEvent(
+209                    CoreContext::SpeakingStateUpdate(ev),
+210                )));
+211            },
+212            GatewayEvent::ClientConnect(ev) => {
+213                debug!("Received discontinued ClientConnect: {:?}", ev);
+214            },
+215            GatewayEvent::ClientDisconnect(ev) => {
+216                #[cfg(feature = "receive")]
+217                {
+218                    self.ssrc_signalling.disconnected_users.insert(ev.user_id);
+219                }
+220
+221                drop(interconnect.events.send(EventMessage::FireCoreEvent(
+222                    CoreContext::ClientDisconnect(ev),
+223                )));
+224            },
+225            GatewayEvent::HeartbeatAck(ev) => {
+226                if let Some(nonce) = self.last_heartbeat_nonce.take() {
+227                    if ev.nonce == nonce {
+228                        trace!("Heartbeat ACK received.");
+229                    } else {
+230                        warn!(
+231                            "Heartbeat nonce mismatch! Expected {}, saw {}.",
+232                            nonce, ev.nonce
+233                        );
+234                    }
+235                }
+236            },
+237            other => {
+238                trace!("Received other websocket data: {:?}", other);
+239            },
+240        }
+241    }
+242}
+243
+244#[instrument(skip(interconnect, aux))]
+245pub(crate) async fn runner(mut interconnect: Interconnect, mut aux: AuxNetwork) {
+246    trace!("WS thread started.");
+247    aux.run(&mut interconnect).await;
+248    trace!("WS thread finished.");
+249}
+250
+251fn ws_error_is_not_final(err: &WsError) -> bool {
+252    match err {
+253        #[cfg(feature = "tungstenite")]
+254        WsError::WsClosed(Some(frame)) => match frame.code {
+255            CloseCode::Library(l) =>
+256                if let Some(code) = VoiceCloseCode::from_u16(l) {
+257                    code.should_resume()
+258                } else {
+259                    true
+260                },
+261            _ => true,
+262        },
+263        #[cfg(feature = "tws")]
+264        WsError::WsClosed(Some(code)) => match (*code).into() {
+265            code @ 4000..=4999_u16 =>
+266                if let Some(code) = VoiceCloseCode::from_u16(code) {
+267                    code.should_resume()
+268                } else {
+269                    true
+270                },
+271            _ => true,
+272        },
+273        e => {
+274            debug!("Error sending/receiving ws {:?}.", e);
+275            true
+276        },
+277    }
+278}
\ No newline at end of file diff --git a/next/src/songbird/error.rs.html b/next/src/songbird/error.rs.html new file mode 100644 index 0000000..2fe1990 --- /dev/null +++ b/next/src/songbird/error.rs.html @@ -0,0 +1,148 @@ +error.rs - source

songbird/
error.rs

1//! Driver and gateway error handling.
+2
+3#[cfg(feature = "serenity")]
+4use futures::channel::mpsc::TrySendError;
+5pub use serde_json::Error as JsonError;
+6#[cfg(feature = "serenity")]
+7use serenity::gateway::ShardRunnerMessage;
+8#[cfg(feature = "gateway")]
+9use std::{error::Error, fmt};
+10#[cfg(feature = "twilight")]
+11use twilight_gateway::error::ChannelError;
+12
+13#[cfg(feature = "gateway")]
+14#[derive(Debug)]
+15#[non_exhaustive]
+16/// Error returned when a manager or call handler is
+17/// unable to send messages over Discord's gateway.
+18pub enum JoinError {
+19    /// Request to join was dropped, cancelled, or replaced.
+20    Dropped,
+21    /// No available gateway connection was provided to send
+22    /// voice state update messages.
+23    NoSender,
+24    /// Tried to leave a [`Call`] which was not found.
+25    ///
+26    /// [`Call`]: crate::Call
+27    NoCall,
+28    /// Connection details were not received from Discord in the
+29    /// time given in [the `Call`'s configuration].
+30    ///
+31    /// This can occur if a message is lost by the Discord client
+32    /// between restarts, or if Discord's gateway believes that
+33    /// this bot is still in the channel it attempts to join.
+34    ///
+35    /// *Users should `leave` the server on the gateway before
+36    /// re-attempting connection.*
+37    ///
+38    /// [the `Call`'s configuration]: crate::Config
+39    TimedOut,
+40    #[cfg(feature = "driver")]
+41    /// The driver failed to establish a voice connection.
+42    ///
+43    /// *Users should `leave` the server on the gateway before
+44    /// re-attempting connection.*
+45    Driver(ConnectionError),
+46    #[cfg(feature = "serenity")]
+47    /// Serenity-specific WebSocket send error.
+48    Serenity(Box<TrySendError<ShardRunnerMessage>>),
+49    #[cfg(feature = "twilight")]
+50    /// Twilight-specific WebSocket send error when a message fails to send over websocket.
+51    Twilight(ChannelError),
+52}
+53
+54#[cfg(feature = "gateway")]
+55impl JoinError {
+56    /// Indicates whether this failure may have left (or been
+57    /// caused by) Discord's gateway state being in an
+58    /// inconsistent state.
+59    ///
+60    /// Failure to `leave` before rejoining may cause further
+61    /// timeouts.
+62    pub fn should_leave_server(&self) -> bool {
+63        matches!(self, JoinError::TimedOut)
+64    }
+65
+66    #[cfg(feature = "driver")]
+67    /// Indicates whether this failure can be reattempted via
+68    /// [`Driver::connect`] with retreived connection info.
+69    ///
+70    /// Failure to `leave` before rejoining may cause further
+71    /// timeouts.
+72    ///
+73    /// [`Driver::connect`]: crate::driver::Driver
+74    pub fn should_reconnect_driver(&self) -> bool {
+75        matches!(self, JoinError::Driver(_))
+76    }
+77}
+78
+79#[cfg(feature = "gateway")]
+80impl fmt::Display for JoinError {
+81    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+82        write!(f, "failed to join voice channel: ")?;
+83        match self {
+84            JoinError::Dropped => write!(f, "request was cancelled/dropped"),
+85            JoinError::NoSender => write!(f, "no gateway destination"),
+86            JoinError::NoCall => write!(f, "tried to leave a non-existent call"),
+87            JoinError::TimedOut => write!(f, "gateway response from Discord timed out"),
+88            #[cfg(feature = "driver")]
+89            JoinError::Driver(_) => write!(f, "establishing connection failed"),
+90            #[cfg(feature = "serenity")]
+91            JoinError::Serenity(e) => e.fmt(f),
+92            #[cfg(feature = "twilight")]
+93            JoinError::Twilight(e) => e.fmt(f),
+94        }
+95    }
+96}
+97
+98#[cfg(feature = "gateway")]
+99impl Error for JoinError {
+100    fn source(&self) -> Option<&(dyn Error + 'static)> {
+101        match self {
+102            JoinError::Dropped => None,
+103            JoinError::NoSender => None,
+104            JoinError::NoCall => None,
+105            JoinError::TimedOut => None,
+106            #[cfg(feature = "driver")]
+107            JoinError::Driver(e) => Some(e),
+108            #[cfg(feature = "serenity")]
+109            JoinError::Serenity(e) => e.source(),
+110            #[cfg(feature = "twilight")]
+111            JoinError::Twilight(e) => e.source(),
+112        }
+113    }
+114}
+115
+116#[cfg(all(feature = "serenity", feature = "gateway"))]
+117impl From<Box<TrySendError<ShardRunnerMessage>>> for JoinError {
+118    fn from(e: Box<TrySendError<ShardRunnerMessage>>) -> Self {
+119        JoinError::Serenity(e)
+120    }
+121}
+122
+123#[cfg(all(feature = "twilight", feature = "gateway"))]
+124impl From<ChannelError> for JoinError {
+125    fn from(e: ChannelError) -> Self {
+126        JoinError::Twilight(e)
+127    }
+128}
+129
+130#[cfg(all(feature = "driver", feature = "gateway"))]
+131impl From<ConnectionError> for JoinError {
+132    fn from(e: ConnectionError) -> Self {
+133        JoinError::Driver(e)
+134    }
+135}
+136
+137#[cfg(feature = "gateway")]
+138/// Convenience type for Discord gateway error handling.
+139pub type JoinResult<T> = Result<T, JoinError>;
+140
+141#[cfg(feature = "driver")]
+142pub use crate::{
+143    driver::{
+144        connection::error::{Error as ConnectionError, Result as ConnectionResult},
+145        SchedulerError,
+146    },
+147    tracks::{ControlError, PlayError, TrackResult},
+148};
\ No newline at end of file diff --git a/next/src/songbird/events/context/data/connect.rs.html b/next/src/songbird/events/context/data/connect.rs.html new file mode 100644 index 0000000..176bcb1 --- /dev/null +++ b/next/src/songbird/events/context/data/connect.rs.html @@ -0,0 +1,32 @@ +connect.rs - source

songbird/events/context/data/
connect.rs

1use crate::id::*;
+2
+3/// Voice connection details gathered at setup/reinstantiation.
+4#[derive(Clone, Debug, Eq, Hash, PartialEq)]
+5#[non_exhaustive]
+6pub struct ConnectData<'a> {
+7    /// ID of the voice channel being joined, if it is known.
+8    ///
+9    /// If this is available, then this can be used to reconnect/renew
+10    /// a voice session via thew gateway.
+11    pub channel_id: Option<ChannelId>,
+12    /// ID of the target voice channel's parent guild.
+13    pub guild_id: GuildId,
+14    /// Unique string describing this session for validation/authentication purposes.
+15    pub session_id: &'a str,
+16    /// The domain name of Discord's voice/TURN server.
+17    ///
+18    /// With the introduction of Discord's automatic voice server selection,
+19    /// this is no longer guaranteed to match a server's settings. This field
+20    /// may be useful if you need/wish to move your voice connection to a node/shard
+21    /// closer to Discord.
+22    pub server: &'a str,
+23    /// The [RTP SSRC] *("Synchronisation source")* assigned by the voice server
+24    /// for the duration of this call.
+25    ///
+26    /// All packets sent will use this SSRC, which is not related to the sender's User
+27    /// ID. These are usually allocated sequentially by Discord, following on from
+28    /// a random starting SSRC.
+29    ///
+30    /// [RTP SSRC]: https://tools.ietf.org/html/rfc3550#section-3
+31    pub ssrc: u32,
+32}
\ No newline at end of file diff --git a/next/src/songbird/events/context/data/disconnect.rs.html b/next/src/songbird/events/context/data/disconnect.rs.html new file mode 100644 index 0000000..956cdf8 --- /dev/null +++ b/next/src/songbird/events/context/data/disconnect.rs.html @@ -0,0 +1,125 @@ +disconnect.rs - source

songbird/events/context/data/
disconnect.rs

1use crate::{
+2    error::ConnectionError,
+3    id::*,
+4    model::{CloseCode as VoiceCloseCode, FromPrimitive},
+5    ws::Error as WsError,
+6};
+7#[cfg(feature = "tungstenite")]
+8use tokio_tungstenite::tungstenite::protocol::frame::coding::CloseCode;
+9
+10/// Voice connection details gathered at termination or failure.
+11///
+12/// In the event of a failure, this event data is gathered after
+13/// a reconnection strategy has exhausted all of its attempts.
+14#[derive(Debug)]
+15#[non_exhaustive]
+16pub struct DisconnectData<'a> {
+17    /// The location that a voice connection was terminated.
+18    pub kind: DisconnectKind,
+19    /// The cause of any connection failure.
+20    ///
+21    /// If `None`, then this disconnect was requested by the user in some way
+22    /// (i.e., leaving or changing voice channels).
+23    pub reason: Option<DisconnectReason>,
+24    /// ID of the voice channel being joined, if it is known.
+25    ///
+26    /// If this is available, then this can be used to reconnect/renew
+27    /// a voice session via thew gateway.
+28    pub channel_id: Option<ChannelId>,
+29    /// ID of the target voice channel's parent guild.
+30    pub guild_id: GuildId,
+31    /// Unique string describing this session for validation/authentication purposes.
+32    pub session_id: &'a str,
+33}
+34
+35/// The location that a voice connection was terminated.
+36#[derive(Copy, Clone, Debug, Eq, Hash, PartialEq)]
+37#[non_exhaustive]
+38pub enum DisconnectKind {
+39    /// The voice driver failed to connect to the server.
+40    ///
+41    /// This requires explicit handling at the gateway level
+42    /// to either reconnect or fully disconnect.
+43    Connect,
+44    /// The voice driver failed to reconnect to the server.
+45    ///
+46    /// This requires explicit handling at the gateway level
+47    /// to either reconnect or fully disconnect.
+48    Reconnect,
+49    /// The voice connection was terminated mid-session by either
+50    /// the user or Discord.
+51    ///
+52    /// If `reason == None`, then this disconnection is either
+53    /// a full disconnect or a user-requested channel change.
+54    /// Otherwise, this is likely a session expiry (requiring user
+55    /// handling to fully disconnect/reconnect).
+56    Runtime,
+57}
+58
+59/// The reason that a voice connection failed.
+60#[derive(Copy, Clone, Debug, Eq, PartialEq)]
+61#[non_exhaustive]
+62pub enum DisconnectReason {
+63    /// This (re)connection attempt was dropped due to another request.
+64    AttemptDiscarded,
+65    /// Songbird had an internal error.
+66    ///
+67    /// This should never happen; if this is ever seen, raise an issue with logs.
+68    Internal,
+69    /// A host-specific I/O error caused the fault; this is likely transient, and
+70    /// should be retried some time later.
+71    Io,
+72    /// Songbird and Discord disagreed on the protocol used to establish a
+73    /// voice connection.
+74    ///
+75    /// This should never happen; if this is ever seen, raise an issue with logs.
+76    ProtocolViolation,
+77    /// A voice connection was not established in the specified time.
+78    TimedOut,
+79    /// The call was manually disconnected by a user command, e.g. [`Driver::leave`].
+80    ///
+81    /// [`Driver::leave`]: crate::driver::Driver::leave
+82    Requested,
+83    /// The Websocket connection was closed by Discord.
+84    ///
+85    /// This typically indicates that the voice session has expired,
+86    /// and a new one needs to be requested via the gateway.
+87    WsClosed(Option<VoiceCloseCode>),
+88}
+89
+90impl From<&ConnectionError> for DisconnectReason {
+91    fn from(e: &ConnectionError) -> Self {
+92        match e {
+93            ConnectionError::AttemptDiscarded => Self::AttemptDiscarded,
+94            ConnectionError::CryptoInvalidLength
+95            | ConnectionError::CryptoModeInvalid
+96            | ConnectionError::CryptoModeUnavailable
+97            | ConnectionError::EndpointUrl
+98            | ConnectionError::IllegalDiscoveryResponse
+99            | ConnectionError::IllegalIp
+100            | ConnectionError::Json(_) => Self::ProtocolViolation,
+101            ConnectionError::Io(_) => Self::Io,
+102            ConnectionError::Crypto(_) | ConnectionError::InterconnectFailure(_) => Self::Internal,
+103            ConnectionError::Ws(ws) => ws.into(),
+104            ConnectionError::TimedOut => Self::TimedOut,
+105        }
+106    }
+107}
+108
+109impl From<&WsError> for DisconnectReason {
+110    fn from(e: &WsError) -> Self {
+111        Self::WsClosed(match e {
+112            #[cfg(feature = "tungstenite")]
+113            WsError::WsClosed(Some(frame)) => match frame.code {
+114                CloseCode::Library(l) => VoiceCloseCode::from_u16(l),
+115                _ => None,
+116            },
+117            #[cfg(feature = "tws")]
+118            WsError::WsClosed(Some(code)) => match (*code).into() {
+119                code @ 4000..=4999_u16 => VoiceCloseCode::from_u16(code),
+120                _ => None,
+121            },
+122            _ => None,
+123        })
+124    }
+125}
\ No newline at end of file diff --git a/next/src/songbird/events/context/data/mod.rs.html b/next/src/songbird/events/context/data/mod.rs.html new file mode 100644 index 0000000..7e8754a --- /dev/null +++ b/next/src/songbird/events/context/data/mod.rs.html @@ -0,0 +1,18 @@ +mod.rs - source

songbird/events/context/data/
mod.rs

1//! Types containing the main body of an [`EventContext`].
+2//!
+3//! [`EventContext`]: super::EventContext
+4mod connect;
+5mod disconnect;
+6#[cfg(feature = "receive")]
+7mod rtcp;
+8#[cfg(feature = "receive")]
+9mod rtp;
+10#[cfg(feature = "receive")]
+11mod voice;
+12
+13#[cfg(feature = "receive")]
+14use bytes::Bytes;
+15
+16pub use self::{connect::*, disconnect::*};
+17#[cfg(feature = "receive")]
+18pub use self::{rtcp::*, rtp::*, voice::*};
\ No newline at end of file diff --git a/next/src/songbird/events/context/data/rtcp.rs.html b/next/src/songbird/events/context/data/rtcp.rs.html new file mode 100644 index 0000000..df67d2a --- /dev/null +++ b/next/src/songbird/events/context/data/rtcp.rs.html @@ -0,0 +1,29 @@ +rtcp.rs - source

songbird/events/context/data/
rtcp.rs

1use discortp::rtcp::RtcpPacket;
+2
+3use super::*;
+4
+5#[derive(Clone, Debug, Eq, PartialEq)]
+6#[non_exhaustive]
+7/// Telemetry/statistics packet, received from another stream
+8///
+9/// `payload_offset` contains the true payload location within the raw packet's `payload()`,
+10/// to allow manual decoding of `Rtcp` packet bodies.
+11pub struct RtcpData {
+12    /// Raw RTCP packet data.
+13    pub packet: Bytes,
+14    /// Byte index into the packet body (after headers) for where the payload begins.
+15    pub payload_offset: usize,
+16    /// Number of bytes at the end of the packet to discard.
+17    pub payload_end_pad: usize,
+18}
+19
+20impl RtcpData {
+21    /// Create a zero-copy view of the inner RTCP packet.
+22    ///
+23    /// This allows easy access to packet header fields, taking them from the underlying
+24    /// `Bytes` as needed while handling endianness etc.
+25    pub fn rtcp(&'_ self) -> RtcpPacket<'_> {
+26        RtcpPacket::new(&self.packet)
+27            .expect("FATAL: leaked illegally small RTP packet from UDP Rx task.")
+28    }
+29}
\ No newline at end of file diff --git a/next/src/songbird/events/context/data/rtp.rs.html b/next/src/songbird/events/context/data/rtp.rs.html new file mode 100644 index 0000000..e4024f6 --- /dev/null +++ b/next/src/songbird/events/context/data/rtp.rs.html @@ -0,0 +1,31 @@ +rtp.rs - source

songbird/events/context/data/
rtp.rs

1use discortp::rtp::RtpPacket;
+2
+3use super::*;
+4
+5#[derive(Clone, Debug, Eq, PartialEq)]
+6#[non_exhaustive]
+7/// Opus audio packet, received from another stream
+8///
+9/// `payload_offset` contains the true payload location within the raw packet's `payload()`,
+10/// if extensions or raw packet data are required.
+11pub struct RtpData {
+12    /// Raw RTP packet data.
+13    ///
+14    /// Includes the SSRC (i.e., sender) of this packet.
+15    pub packet: Bytes,
+16    /// Byte index into the packet body (after headers) for where the payload begins.
+17    pub payload_offset: usize,
+18    /// Number of bytes at the end of the packet to discard.
+19    pub payload_end_pad: usize,
+20}
+21
+22impl RtpData {
+23    /// Create a zero-copy view of the inner RTP packet.
+24    ///
+25    /// This allows easy access to packet header fields, taking them from the underlying
+26    /// `Bytes` as needed while handling endianness etc.
+27    pub fn rtp(&'_ self) -> RtpPacket<'_> {
+28        RtpPacket::new(&self.packet)
+29            .expect("FATAL: leaked illegally small RTP packet from UDP Rx task.")
+30    }
+31}
\ No newline at end of file diff --git a/next/src/songbird/events/context/data/voice.rs.html b/next/src/songbird/events/context/data/voice.rs.html new file mode 100644 index 0000000..47da1bf --- /dev/null +++ b/next/src/songbird/events/context/data/voice.rs.html @@ -0,0 +1,43 @@ +voice.rs - source

songbird/events/context/data/
voice.rs

1use std::collections::{HashMap, HashSet};
+2
+3use super::*;
+4
+5#[derive(Clone, Debug, Eq, PartialEq)]
+6#[non_exhaustive]
+7/// Audio data from all users in a voice channel, fired every 20ms.
+8///
+9/// Songbird implements a jitter buffer to sycnhronise user packets, smooth out network latency, and
+10/// handle packet reordering by the network. Packet playout  via this event is delayed by approximately
+11/// [`Config::playout_buffer_length`]` * 20ms` from its original arrival.
+12///
+13/// [`Config::playout_buffer_length`]: crate::Config::playout_buffer_length
+14pub struct VoiceTick {
+15    /// Decoded voice data and source packets sent by each user.
+16    pub speaking: HashMap<u32, VoiceData>,
+17
+18    /// Set of all SSRCs currently known in the call who aren't included in [`Self::speaking`].
+19    pub silent: HashSet<u32>,
+20}
+21
+22#[derive(Clone, Debug, Eq, PartialEq)]
+23#[non_exhaustive]
+24/// Voice packet and audio data for a single user, from a single tick.
+25pub struct VoiceData {
+26    /// RTP packet clocked out for this tick.
+27    ///
+28    /// If `None`, then the packet was lost, and [`Self::decoded_voice`] may include
+29    /// around one codec delay's worth of audio.
+30    pub packet: Option<RtpData>,
+31    /// PCM audio obtained from a user.
+32    ///
+33    /// Valid audio data (`Some(audio)` where `audio.len >= 0`) typically contains 20ms of 16-bit PCM audio
+34    /// using native endianness. This defaults to stereo audio at 48kHz, and can be configured via
+35    /// [`DecodeConfig::sample_rate`] and [`DecodeConfig::sample_rate`] -- channels are interleaved
+36    /// (i.e., `L, R, L, R, ...`) if stereo.
+37    ///
+38    /// This value will be `None` if Songbird is not configured to decode audio.
+39    ///
+40    /// [`DecodeConfig::decode_channels`]: crate::driver::DecodeConfig::channels
+41    /// [`DecodeConfig::sample_rate`]: crate::driver::DecodeConfig::sample_rate
+42    pub decoded_voice: Option<Vec<i16>>,
+43}
\ No newline at end of file diff --git a/next/src/songbird/events/context/internal_data.rs.html b/next/src/songbird/events/context/internal_data.rs.html new file mode 100644 index 0000000..0a24077 --- /dev/null +++ b/next/src/songbird/events/context/internal_data.rs.html @@ -0,0 +1,82 @@ +internal_data.rs - source

songbird/events/context/
internal_data.rs

1use super::context_data::*;
+2use crate::ConnectionInfo;
+3
+4#[derive(Clone, Debug, Eq, Hash, PartialEq)]
+5pub struct InternalConnect {
+6    pub info: ConnectionInfo,
+7    pub ssrc: u32,
+8}
+9
+10#[derive(Debug)]
+11pub struct InternalDisconnect {
+12    pub kind: DisconnectKind,
+13    pub reason: Option<DisconnectReason>,
+14    pub info: ConnectionInfo,
+15}
+16
+17impl<'a> From<&'a InternalConnect> for ConnectData<'a> {
+18    fn from(val: &'a InternalConnect) -> Self {
+19        Self {
+20            channel_id: val.info.channel_id,
+21            guild_id: val.info.guild_id,
+22            session_id: &val.info.session_id,
+23            server: &val.info.endpoint,
+24            ssrc: val.ssrc,
+25        }
+26    }
+27}
+28
+29impl<'a> From<&'a InternalDisconnect> for DisconnectData<'a> {
+30    fn from(val: &'a InternalDisconnect) -> Self {
+31        Self {
+32            kind: val.kind,
+33            reason: val.reason,
+34            channel_id: val.info.channel_id,
+35            guild_id: val.info.guild_id,
+36            session_id: &val.info.session_id,
+37        }
+38    }
+39}
+40
+41#[cfg(feature = "receive")]
+42mod receive {
+43    use super::*;
+44    use bytes::Bytes;
+45
+46    #[derive(Clone, Debug, Eq, PartialEq)]
+47    pub struct InternalRtpPacket {
+48        pub packet: Bytes,
+49        pub payload_offset: usize,
+50        pub payload_end_pad: usize,
+51    }
+52
+53    #[derive(Clone, Debug, Eq, PartialEq)]
+54    pub struct InternalRtcpPacket {
+55        pub packet: Bytes,
+56        pub payload_offset: usize,
+57        pub payload_end_pad: usize,
+58    }
+59
+60    impl<'a> From<&'a InternalRtpPacket> for RtpData {
+61        fn from(val: &'a InternalRtpPacket) -> Self {
+62            Self {
+63                packet: val.packet.clone(),
+64                payload_offset: val.payload_offset,
+65                payload_end_pad: val.payload_end_pad,
+66            }
+67        }
+68    }
+69
+70    impl<'a> From<&'a InternalRtcpPacket> for RtcpData {
+71        fn from(val: &'a InternalRtcpPacket) -> Self {
+72            Self {
+73                packet: val.packet.clone(),
+74                payload_offset: val.payload_offset,
+75                payload_end_pad: val.payload_end_pad,
+76            }
+77        }
+78    }
+79}
+80
+81#[cfg(feature = "receive")]
+82pub use receive::*;
\ No newline at end of file diff --git a/next/src/songbird/events/context/mod.rs.html b/next/src/songbird/events/context/mod.rs.html new file mode 100644 index 0000000..279774b --- /dev/null +++ b/next/src/songbird/events/context/mod.rs.html @@ -0,0 +1,114 @@ +mod.rs - source

songbird/events/context/
mod.rs

1pub mod data;
+2pub(crate) mod internal_data;
+3
+4use super::*;
+5use crate::{
+6    model::payload::{ClientDisconnect, Speaking},
+7    tracks::{TrackHandle, TrackState},
+8};
+9pub use data as context_data;
+10use data::*;
+11use internal_data::*;
+12
+13/// Information about which tracks or data fired an event.
+14///
+15/// [`Track`] events may be local or global, and have no tracks
+16/// if fired on the global context via [`Driver::add_global_event`].
+17///
+18/// [`Track`]: crate::tracks::Track
+19/// [`Driver::add_global_event`]: crate::driver::Driver::add_global_event
+20#[derive(Debug)]
+21#[non_exhaustive]
+22pub enum EventContext<'a> {
+23    /// Track event context, passed to events created via [`TrackHandle::add_event`],
+24    /// [`EventStore::add_event`], or relevant global events.
+25    ///
+26    /// [`EventStore::add_event`]: EventStore::add_event
+27    /// [`TrackHandle::add_event`]: TrackHandle::add_event
+28    Track(&'a [(&'a TrackState, &'a TrackHandle)]),
+29
+30    /// Speaking state update, typically describing how another voice
+31    /// user is transmitting audio data. Clients must send at least one such
+32    /// packet to allow SSRC/UserID matching.
+33    SpeakingStateUpdate(Speaking),
+34
+35    #[cfg(feature = "receive")]
+36    /// Reordered and decoded audio packets, received every 20ms.
+37    VoiceTick(VoiceTick),
+38
+39    #[cfg(feature = "receive")]
+40    /// Opus audio packet, received from another stream.
+41    RtpPacket(RtpData),
+42
+43    #[cfg(feature = "receive")]
+44    /// Telemetry/statistics packet, received from another stream.
+45    RtcpPacket(RtcpData),
+46
+47    /// Fired whenever a client disconnects.
+48    ClientDisconnect(ClientDisconnect),
+49
+50    /// Fires when this driver successfully connects to a voice channel.
+51    DriverConnect(ConnectData<'a>),
+52
+53    /// Fires when this driver successfully reconnects after a network error.
+54    DriverReconnect(ConnectData<'a>),
+55
+56    /// Fires when this driver fails to connect to, or drops from, a voice channel.
+57    DriverDisconnect(DisconnectData<'a>),
+58}
+59
+60#[derive(Debug)]
+61pub enum CoreContext {
+62    SpeakingStateUpdate(Speaking),
+63    #[cfg(feature = "receive")]
+64    VoiceTick(VoiceTick),
+65    #[cfg(feature = "receive")]
+66    RtpPacket(InternalRtpPacket),
+67    #[cfg(feature = "receive")]
+68    RtcpPacket(InternalRtcpPacket),
+69    ClientDisconnect(ClientDisconnect),
+70    DriverConnect(InternalConnect),
+71    DriverReconnect(InternalConnect),
+72    DriverDisconnect(InternalDisconnect),
+73}
+74
+75impl<'a> CoreContext {
+76    pub(crate) fn to_user_context(&'a self) -> EventContext<'a> {
+77        match self {
+78            Self::SpeakingStateUpdate(evt) => EventContext::SpeakingStateUpdate(*evt),
+79            #[cfg(feature = "receive")]
+80            Self::VoiceTick(evt) => EventContext::VoiceTick(evt.clone()),
+81            #[cfg(feature = "receive")]
+82            Self::RtpPacket(evt) => EventContext::RtpPacket(RtpData::from(evt)),
+83            #[cfg(feature = "receive")]
+84            Self::RtcpPacket(evt) => EventContext::RtcpPacket(RtcpData::from(evt)),
+85            Self::ClientDisconnect(evt) => EventContext::ClientDisconnect(*evt),
+86            Self::DriverConnect(evt) => EventContext::DriverConnect(ConnectData::from(evt)),
+87            Self::DriverReconnect(evt) => EventContext::DriverReconnect(ConnectData::from(evt)),
+88            Self::DriverDisconnect(evt) =>
+89                EventContext::DriverDisconnect(DisconnectData::from(evt)),
+90        }
+91    }
+92}
+93
+94impl EventContext<'_> {
+95    /// Retreive the event class for an event (i.e., when matching)
+96    /// an event against the registered listeners.
+97    #[must_use]
+98    pub fn to_core_event(&self) -> Option<CoreEvent> {
+99        match self {
+100            Self::SpeakingStateUpdate(_) => Some(CoreEvent::SpeakingStateUpdate),
+101            #[cfg(feature = "receive")]
+102            Self::VoiceTick(_) => Some(CoreEvent::VoiceTick),
+103            #[cfg(feature = "receive")]
+104            Self::RtpPacket(_) => Some(CoreEvent::RtpPacket),
+105            #[cfg(feature = "receive")]
+106            Self::RtcpPacket(_) => Some(CoreEvent::RtcpPacket),
+107            Self::ClientDisconnect(_) => Some(CoreEvent::ClientDisconnect),
+108            Self::DriverConnect(_) => Some(CoreEvent::DriverConnect),
+109            Self::DriverReconnect(_) => Some(CoreEvent::DriverReconnect),
+110            Self::DriverDisconnect(_) => Some(CoreEvent::DriverDisconnect),
+111            _ => None,
+112        }
+113    }
+114}
\ No newline at end of file diff --git a/next/src/songbird/events/core.rs.html b/next/src/songbird/events/core.rs.html new file mode 100644 index 0000000..b0fe64d --- /dev/null +++ b/next/src/songbird/events/core.rs.html @@ -0,0 +1,77 @@ +core.rs - source

songbird/events/
core.rs

1/// Voice core events occur on receipt of
+2/// voice packets and telemetry.
+3///
+4/// Core events persist while the `action` in [`EventData`]
+5/// returns `None`.
+6///
+7/// ## Events from other users
+8/// Songbird can observe when a user *speaks for the first time* ([`SpeakingStateUpdate`]),
+9/// when a client leaves the session ([`ClientDisconnect`]).
+10///
+11/// When the `"receive"` feature is enabled, songbird can also handle voice packets
+12#[cfg_attr(feature = "receive", doc = "([`RtpPacket`](Self::RtpPacket)),")]
+13#[cfg_attr(not(feature = "receive"), doc = "(`RtpPacket`),")]
+14/// decode and track speaking users
+15#[cfg_attr(feature = "receive", doc = "([`VoiceTick`](Self::VoiceTick)),")]
+16#[cfg_attr(not(feature = "receive"), doc = "(`VoiceTick`),")]
+17/// and handle telemetry data
+18#[cfg_attr(feature = "receive", doc = "([`RtcpPacket`](Self::RtcpPacket)).")]
+19#[cfg_attr(not(feature = "receive"), doc = "(`RtcpPacket`).")]
+20/// The format of voice packets is described by
+21#[cfg_attr(
+22    feature = "receive",
+23    doc = "[`VoiceData`](super::context::data::VoiceData)."
+24)]
+25#[cfg_attr(not(feature = "receive"), doc = "`VoiceData`.")]
+26///
+27/// To detect when a user connects, you must correlate gateway (e.g., `VoiceStateUpdate`) events
+28/// from the main part of your bot.
+29///
+30/// To obtain a user's SSRC, you must use [`SpeakingStateUpdate`] events.
+31///
+32/// [`EventData`]: super::EventData
+33/// [`SpeakingStateUpdate`]: Self::SpeakingStateUpdate
+34/// [`ClientDisconnect`]: Self::ClientDisconnect
+35#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
+36#[non_exhaustive]
+37pub enum CoreEvent {
+38    /// Speaking state update from the WS gateway, typically describing how another voice
+39    /// user is transmitting audio data. Clients must send at least one such
+40    /// packet to allow SSRC/UserID matching.
+41    ///
+42    /// Fired on receipt of a speaking state update from another host.
+43    ///
+44    /// Note: this will fire when a user starts speaking for the first time,
+45    /// or changes their capabilities.
+46    SpeakingStateUpdate,
+47
+48    #[cfg(feature = "receive")]
+49    /// Fires every 20ms, containing the scheduled voice packet and decoded audio
+50    /// data for each live user.
+51    VoiceTick,
+52
+53    #[cfg(feature = "receive")]
+54    /// Fires on receipt of a voice packet from another stream in the voice call.
+55    ///
+56    /// As RTP packets do not map to Discord's notion of users, SSRCs must be mapped
+57    /// back using the user IDs seen through client connection, disconnection,
+58    /// or speaking state update.
+59    RtpPacket,
+60
+61    #[cfg(feature = "receive")]
+62    /// Fires on receipt of an RTCP packet, containing various call stats
+63    /// such as latency reports.
+64    RtcpPacket,
+65
+66    /// Fires whenever a user disconnects from the same stream as the bot.
+67    ClientDisconnect,
+68
+69    /// Fires when this driver successfully connects to a voice channel.
+70    DriverConnect,
+71
+72    /// Fires when this driver successfully reconnects after a network error.
+73    DriverReconnect,
+74
+75    /// Fires when this driver fails to connect to, or drops from, a voice channel.
+76    DriverDisconnect,
+77}
\ No newline at end of file diff --git a/next/src/songbird/events/data.rs.html b/next/src/songbird/events/data.rs.html new file mode 100644 index 0000000..3491ad8 --- /dev/null +++ b/next/src/songbird/events/data.rs.html @@ -0,0 +1,88 @@ +data.rs - source

songbird/events/
data.rs

1use super::*;
+2use std::cmp::Ordering;
+3
+4/// Internal representation of an event, as handled by the audio context.
+5pub struct EventData {
+6    pub(crate) event: Event,
+7    pub(crate) fire_time: Option<Duration>,
+8    pub(crate) action: Box<dyn EventHandler>,
+9}
+10
+11impl EventData {
+12    /// Create a representation of an event and its associated handler.
+13    ///
+14    /// An event handler, `action`, receives an [`EventContext`] and optionally
+15    /// produces a new [`Event`] type for itself. Returning `None` will
+16    /// maintain the same event type, while removing any [`Delayed`] entries.
+17    /// Event handlers will be re-added with their new trigger condition,
+18    /// or removed if [`Cancel`]led
+19    ///
+20    /// [`EventContext`]: EventContext
+21    /// [`Event`]: Event
+22    /// [`Delayed`]: Event::Delayed
+23    /// [`Cancel`]: Event::Cancel
+24    pub fn new<F: EventHandler + 'static>(event: Event, action: F) -> Self {
+25        Self {
+26            event,
+27            fire_time: None,
+28            action: Box::new(action),
+29        }
+30    }
+31
+32    /// Computes the next firing time for a timer event.
+33    pub fn compute_activation(&mut self, now: Duration) {
+34        match self.event {
+35            Event::Periodic(period, phase) => {
+36                self.fire_time = Some(now + phase.unwrap_or(period));
+37            },
+38            Event::Delayed(offset) => {
+39                self.fire_time = Some(now + offset);
+40            },
+41            _ => {},
+42        }
+43    }
+44}
+45
+46impl std::fmt::Debug for EventData {
+47    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
+48        write!(
+49            f,
+50            "Event {{ event: {:?}, fire_time: {:?}, action: <fn> }}",
+51            self.event, self.fire_time
+52        )
+53    }
+54}
+55
+56/// Events are ordered/compared based on their firing time.
+57impl Ord for EventData {
+58    fn cmp(&self, other: &Self) -> Ordering {
+59        if self.fire_time.is_some() && other.fire_time.is_some() {
+60            let t1 = self
+61                .fire_time
+62                .as_ref()
+63                .expect("T1 known to be well-defined by above.");
+64            let t2 = other
+65                .fire_time
+66                .as_ref()
+67                .expect("T2 known to be well-defined by above.");
+68
+69            t2.cmp(t1)
+70        } else {
+71            Ordering::Equal
+72        }
+73    }
+74}
+75
+76impl PartialOrd for EventData {
+77    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
+78        Some(self.cmp(other))
+79    }
+80}
+81
+82impl PartialEq for EventData {
+83    fn eq(&self, other: &Self) -> bool {
+84        self.fire_time == other.fire_time
+85    }
+86}
+87
+88impl Eq for EventData {}
\ No newline at end of file diff --git a/next/src/songbird/events/mod.rs.html b/next/src/songbird/events/mod.rs.html new file mode 100644 index 0000000..9ded010 --- /dev/null +++ b/next/src/songbird/events/mod.rs.html @@ -0,0 +1,147 @@ +mod.rs - source

songbird/events/
mod.rs

1//! Events relating to tracks, timing, and other callers.
+2//!
+3//! ## Listening for events
+4//! Driver events in Songbird are composed of two parts:
+5//! * An [`Event`] to listen out for. These may be discrete events,
+6//!   or generated by timers.
+7//! * An [`EventHandler`] to be called on receipt of an event. As event
+8//!   handlers may be shared between several events, the handler is called
+9//!   with an [`EventContext`] describing which event was fired.
+10//!
+11//! Event handlers are registered using functions such as [`Driver::add_global_event`],
+12//! or [`TrackHandle::add_event`], or. Internally, these pairs are stored
+13//! as [`EventData`].
+14//!
+15//! ## `EventHandler` lifecycle
+16//! An event handler is essentially just an async function which may return
+17//! another type of event to listen out for (an `Option<Event>`). For instance,
+18//! [`Some(Event::Cancel)`] will remove that event listener, while `None` won't
+19//! change it at all.
+20//!
+21//! The exception is one-off events like [`Event::Delayed`], which remove themselves
+22//! after one call *unless* an [`Event`] override is returned.
+23//!
+24//! ## Global and local listeners
+25//! *Global* event listeners are those which are placed onto the [`Driver`],
+26//! while *local* event listeners are those which are placed on a
+27//! [`Track`]/[`Handle`].
+28//!
+29//! Track or timed events, when local, return a reference to the parent track.
+30//! When registered globally, they fire on a per-tick basis, returning references to
+31//! all relevant tracks in that 20ms window. Global/local timed events use a global
+32//! timer or a [track's playback time], respectively.
+33//!
+34//! [`CoreEvent`]s may only be registered globally.
+35//!
+36//! [`Event`]: Event
+37//! [`EventHandler`]: EventHandler
+38//! [`EventContext`]: EventContext
+39//! [`Driver::add_global_event`]: crate::driver::Driver::add_global_event
+40//! [`Driver`]: crate::driver::Driver::add_global_event
+41//! [`TrackHandle::add_event`]: crate::tracks::TrackHandle::add_event
+42//! [`Track`]: crate::tracks::Track::events
+43//! [`Handle`]: crate::tracks::TrackHandle::add_event
+44//! [`EventData`]: EventData
+45//! [`Some(Event::Cancel)`]: Event::Cancel
+46//! [`Event::Delayed`]: Event::Delayed
+47//! [track's playback time]: crate::tracks::TrackState::play_time
+48//! [`CoreEvent`]: CoreEvent
+49
+50mod context;
+51mod core;
+52mod data;
+53mod store;
+54mod track;
+55mod untimed;
+56
+57pub use self::{
+58    context::{context_data, EventContext},
+59    core::*,
+60    data::*,
+61    store::*,
+62    track::*,
+63    untimed::*,
+64};
+65pub(crate) use context::{internal_data, CoreContext};
+66
+67use async_trait::async_trait;
+68use std::time::Duration;
+69
+70/// Trait to handle an event which can be fired per-track, or globally.
+71///
+72/// These may be feasibly reused between several event sources.
+73#[async_trait]
+74pub trait EventHandler: Send + Sync {
+75    /// Respond to one received event.
+76    async fn act(&self, ctx: &EventContext<'_>) -> Option<Event>;
+77}
+78
+79/// Classes of event which may occur, triggering a handler
+80/// at the local (track-specific) or global level.
+81///
+82/// Local time-based events rely upon the current playback
+83/// time of a track, and so will not fire if a track becomes paused
+84/// or stops. In case this is required, global events are a better
+85/// fit.
+86///
+87/// Event handlers themselves are described in [`EventData::new`].
+88///
+89/// [`EventData::new`]: EventData::new
+90#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
+91#[non_exhaustive]
+92pub enum Event {
+93    /// Periodic events rely upon two parameters: a *period*
+94    /// and an optional *phase*.
+95    ///
+96    /// If the *phase* is `None`, then the event will first fire
+97    /// in one *period*. Periodic events repeat automatically
+98    /// so long as the `action` in [`EventData`] returns `None`.
+99    ///
+100    /// [`EventData`]: EventData
+101    Periodic(Duration, Option<Duration>),
+102    /// Delayed events rely upon a *delay* parameter, and
+103    /// fire one *delay* after the audio context processes them.
+104    ///
+105    /// Delayed events are automatically removed once fired,
+106    /// so long as the `action` in [`EventData`] returns `None`.
+107    ///
+108    /// [`EventData`]: EventData
+109    Delayed(Duration),
+110    /// Track events correspond to certain actions or changes
+111    /// of state, such as a track finishing, looping, or being
+112    /// manually stopped.
+113    ///
+114    /// Track events persist while the `action` in [`EventData`]
+115    /// returns `None`.
+116    ///
+117    /// [`EventData`]: EventData
+118    Track(TrackEvent),
+119    /// Core events
+120    ///
+121    /// Track events persist while the `action` in [`EventData`]
+122    /// returns `None`. Core events **must** be applied globally,
+123    /// as attaching them to a track is a no-op.
+124    ///
+125    /// [`EventData`]: EventData
+126    Core(CoreEvent),
+127    /// Cancels the event, if it was intended to persist.
+128    Cancel,
+129}
+130
+131impl Event {
+132    pub(crate) fn is_global_only(&self) -> bool {
+133        matches!(self, Self::Core(_))
+134    }
+135}
+136
+137impl From<TrackEvent> for Event {
+138    fn from(evt: TrackEvent) -> Self {
+139        Event::Track(evt)
+140    }
+141}
+142
+143impl From<CoreEvent> for Event {
+144    fn from(evt: CoreEvent) -> Self {
+145        Event::Core(evt)
+146    }
+147}
\ No newline at end of file diff --git a/next/src/songbird/events/store.rs.html b/next/src/songbird/events/store.rs.html new file mode 100644 index 0000000..c82a6bf --- /dev/null +++ b/next/src/songbird/events/store.rs.html @@ -0,0 +1,262 @@ +store.rs - source

songbird/events/
store.rs

1use super::*;
+2use crate::{
+3    constants::*,
+4    tracks::{ReadyState, TrackHandle, TrackState},
+5};
+6use std::collections::{BinaryHeap, HashMap};
+7use tracing::info;
+8
+9#[derive(Debug, Default)]
+10/// Storage for [`EventData`], designed to be used for both local and global contexts.
+11///
+12/// Timed events are stored in a binary heap for fast selection, and have custom `Eq`,
+13/// `Ord`, etc. implementations to support (only) this.
+14///
+15/// [`EventData`]: EventData
+16pub struct EventStore {
+17    timed: BinaryHeap<EventData>,
+18    untimed: HashMap<UntimedEvent, Vec<EventData>>,
+19    local_only: bool,
+20}
+21
+22impl EventStore {
+23    /// Creates a new event store to be used globally.
+24    #[must_use]
+25    pub fn new() -> Self {
+26        Self::default()
+27    }
+28
+29    /// Creates a new event store to be used within a [`Track`].
+30    ///
+31    /// This is usually automatically installed by the driver once
+32    /// a track has been registered.
+33    ///
+34    /// [`Track`]: crate::tracks::Track
+35    #[must_use]
+36    pub fn new_local() -> Self {
+37        EventStore {
+38            local_only: true,
+39            ..Default::default()
+40        }
+41    }
+42
+43    /// Add an event to this store.
+44    ///
+45    /// Updates `evt` according to [`EventData::compute_activation`].
+46    ///
+47    /// [`EventData::compute_activation`]: EventData::compute_activation
+48    pub fn add_event(&mut self, mut evt: EventData, now: Duration) {
+49        evt.compute_activation(now);
+50
+51        if self.local_only && evt.event.is_global_only() {
+52            return;
+53        }
+54
+55        match evt.event {
+56            Event::Core(c) => {
+57                self.untimed.entry(c.into()).or_default().push(evt);
+58            },
+59            Event::Track(t) => {
+60                self.untimed.entry(t.into()).or_default().push(evt);
+61            },
+62            Event::Delayed(_) | Event::Periodic(_, _) => {
+63                self.timed.push(evt);
+64            },
+65            _ => {
+66                // Event cancelled.
+67            },
+68        }
+69    }
+70
+71    /// Processes all events due up to and including `now`.
+72    pub(crate) async fn process_timed(&mut self, now: Duration, ctx: EventContext<'_>) {
+73        while let Some(evt) = self.timed.peek() {
+74            if evt
+75                .fire_time
+76                .as_ref()
+77                .expect("Timed event must have a fire_time.")
+78                > &now
+79            {
+80                break;
+81            }
+82            let mut evt = self
+83                .timed
+84                .pop()
+85                .expect("Can only succeed due to peek = Some(...).");
+86
+87            let old_evt_type = evt.event;
+88            if let Some(new_evt_type) = evt.action.act(&ctx).await {
+89                evt.event = new_evt_type;
+90                self.add_event(evt, now);
+91            } else if let Event::Periodic(d, _) = old_evt_type {
+92                evt.event = Event::Periodic(d, None);
+93                self.add_event(evt, now);
+94            }
+95        }
+96    }
+97
+98    /// Processes all events due up to and including `now`.
+99    pub(crate) fn timed_event_ready(&self, now: Duration) -> bool {
+100        self.timed.peek().is_some_and(|evt| {
+101            evt.fire_time
+102                .as_ref()
+103                .expect("Timed event must have a fire_time.")
+104                <= &now
+105        })
+106    }
+107
+108    /// Processes all events attached to the given track event.
+109    pub(crate) async fn process_untimed(
+110        &mut self,
+111        now: Duration,
+112        untimed_event: UntimedEvent,
+113        ctx: EventContext<'_>,
+114    ) {
+115        // move a Vec in and out: not too expensive, but could be better.
+116        // Although it's obvious that moving an event out of one vec and into
+117        // another necessitates that they be different event types, thus entries,
+118        // convincing the compiler of this is non-trivial without making them dedicated
+119        // fields.
+120        let events = self.untimed.remove(&untimed_event);
+121        if let Some(mut events) = events {
+122            // TODO: Possibly use tombstones to prevent realloc/memcpys?
+123            // i.e., never shrink array, replace ended tracks with <DEAD>,
+124            // maintain a "first-track" stack and freelist alongside.
+125            let mut i = 0;
+126            while i < events.len() {
+127                let evt = &mut events[i];
+128                // Only remove/readd if the event type changes (i.e., Some AND new != old)
+129                if let Some(new_evt_type) = evt.action.act(&ctx).await {
+130                    if evt.event == new_evt_type {
+131                        let mut evt = events.remove(i);
+132
+133                        evt.event = new_evt_type;
+134                        self.add_event(evt, now);
+135                    } else {
+136                        i += 1;
+137                    }
+138                } else {
+139                    i += 1;
+140                };
+141            }
+142            self.untimed.insert(untimed_event, events);
+143        }
+144    }
+145}
+146
+147#[derive(Debug, Default)]
+148pub(crate) struct GlobalEvents {
+149    pub(crate) store: EventStore,
+150    pub(crate) time: Duration,
+151    pub(crate) awaiting_tick: HashMap<TrackEvent, Vec<usize>>,
+152}
+153
+154impl GlobalEvents {
+155    pub(crate) fn add_event(&mut self, evt: EventData) {
+156        self.store.add_event(evt, self.time);
+157    }
+158
+159    pub(crate) async fn fire_core_event(&mut self, evt: CoreEvent, ctx: EventContext<'_>) {
+160        self.store.process_untimed(self.time, evt.into(), ctx).await;
+161    }
+162
+163    pub(crate) fn fire_track_event(&mut self, evt: TrackEvent, index: usize) {
+164        let holder = self.awaiting_tick.entry(evt).or_default();
+165
+166        holder.push(index);
+167    }
+168
+169    pub(crate) fn remove_handlers(&mut self) {
+170        self.store = EventStore::new();
+171    }
+172
+173    pub(crate) async fn tick(
+174        &mut self,
+175        events: &mut [EventStore],
+176        states: &mut [TrackState],
+177        handles: &mut [TrackHandle],
+178    ) {
+179        // Global timed events
+180        self.time += TIMESTEP_LENGTH;
+181        if self.store.timed_event_ready(self.time) {
+182            let global_ctx: Vec<(&TrackState, &TrackHandle)> =
+183                states.iter().zip(handles.iter()).collect();
+184            self.store
+185                .process_timed(self.time, EventContext::Track(&global_ctx[..]))
+186                .await;
+187        }
+188
+189        // Local timed events
+190        for (i, state) in states.iter_mut().enumerate() {
+191            if state.playing.is_playing() && state.ready == ReadyState::Playable {
+192                state.step_frame();
+193
+194                let event_store = events
+195                    .get_mut(i)
+196                    .expect("Missing store index for Tick (local timed).");
+197                let handle = handles
+198                    .get_mut(i)
+199                    .expect("Missing handle index for Tick (local timed).");
+200
+201                event_store
+202                    .process_timed(state.play_time, EventContext::Track(&[(state, handle)]))
+203                    .await;
+204            }
+205        }
+206
+207        for (evt, indices) in &self.awaiting_tick {
+208            let untimed = (*evt).into();
+209
+210            if !indices.is_empty() {
+211                info!("Firing {:?} for {:?}", evt, indices);
+212            }
+213
+214            // Local untimed track events.
+215            for &i in indices {
+216                let event_store = events
+217                    .get_mut(i)
+218                    .expect("Missing store index for Tick (local untimed).");
+219                let handle = handles
+220                    .get_mut(i)
+221                    .expect("Missing handle index for Tick (local untimed).");
+222                let state = states
+223                    .get_mut(i)
+224                    .expect("Missing state index for Tick (local untimed).");
+225
+226                event_store
+227                    .process_untimed(
+228                        state.position,
+229                        untimed,
+230                        EventContext::Track(&[(state, handle)]),
+231                    )
+232                    .await;
+233            }
+234
+235            // Global untimed track events.
+236            if self.store.untimed.contains_key(&untimed) && !indices.is_empty() {
+237                let global_ctx: Vec<(&TrackState, &TrackHandle)> = indices
+238                    .iter()
+239                    .map(|i| {
+240                        (
+241                            states
+242                                .get(*i)
+243                                .expect("Missing state index for Tick (global untimed)"),
+244                            handles
+245                                .get(*i)
+246                                .expect("Missing handle index for Tick (global untimed)"),
+247                        )
+248                    })
+249                    .collect();
+250
+251                self.store
+252                    .process_untimed(self.time, untimed, EventContext::Track(&global_ctx[..]))
+253                    .await;
+254            }
+255        }
+256
+257        // Now drain vecs.
+258        for indices in self.awaiting_tick.values_mut() {
+259            indices.clear();
+260        }
+261    }
+262}
\ No newline at end of file diff --git a/next/src/songbird/events/track.rs.html b/next/src/songbird/events/track.rs.html new file mode 100644 index 0000000..8818605 --- /dev/null +++ b/next/src/songbird/events/track.rs.html @@ -0,0 +1,35 @@ +track.rs - source

songbird/events/
track.rs

1// TODO: Could this be a bitset? Could accelerate lookups,
+2// allow easy joint subscription & remove Vecs for related evt handling?
+3
+4/// Track events correspond to certain actions or changes
+5/// of state, such as a track finishing, looping, or being
+6/// manually stopped. Voice core events occur on receipt of
+7/// voice packets and telemetry.
+8///
+9/// Track events persist while the `action` in [`EventData`]
+10/// returns `None`.
+11///
+12/// [`EventData`]: super::EventData
+13#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
+14#[non_exhaustive]
+15pub enum TrackEvent {
+16    /// The attached track has resumed playing.
+17    ///
+18    /// This event will not fire when a track first starts,
+19    /// but will fire when a track changes from, e.g., paused to playing.
+20    /// This is most relevant for queue users: queued tracks placed into a
+21    /// non-empty queue are initlally paused, and are later moved to `Play`.
+22    Play,
+23    /// The attached track has been paused.
+24    Pause,
+25    /// The attached track has ended.
+26    End,
+27    /// The attached track has looped.
+28    Loop,
+29    /// The attached track is being readied or recreated.
+30    Preparing,
+31    /// The attached track has become playable.
+32    Playable,
+33    /// The attached track has encountered a runtime or initialisation error.
+34    Error,
+35}
\ No newline at end of file diff --git a/next/src/songbird/events/untimed.rs.html b/next/src/songbird/events/untimed.rs.html new file mode 100644 index 0000000..c4b87e7 --- /dev/null +++ b/next/src/songbird/events/untimed.rs.html @@ -0,0 +1,29 @@ +untimed.rs - source

songbird/events/
untimed.rs

1use super::*;
+2
+3/// Track and voice core events.
+4///
+5/// Untimed events persist while the `action` in [`EventData`]
+6/// returns `None`.
+7///
+8/// [`EventData`]: EventData
+9#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
+10#[non_exhaustive]
+11pub enum UntimedEvent {
+12    /// Untimed events belonging to a track, such as state changes, end, or loops.
+13    Track(TrackEvent),
+14    /// Untimed events belonging to the global context, such as finished tracks,
+15    /// client speaking updates, or RT(C)P voice and telemetry data.
+16    Core(CoreEvent),
+17}
+18
+19impl From<TrackEvent> for UntimedEvent {
+20    fn from(evt: TrackEvent) -> Self {
+21        UntimedEvent::Track(evt)
+22    }
+23}
+24
+25impl From<CoreEvent> for UntimedEvent {
+26    fn from(evt: CoreEvent) -> Self {
+27        UntimedEvent::Core(evt)
+28    }
+29}
\ No newline at end of file diff --git a/next/src/songbird/handler.rs.html b/next/src/songbird/handler.rs.html new file mode 100644 index 0000000..e65a4e7 --- /dev/null +++ b/next/src/songbird/handler.rs.html @@ -0,0 +1,490 @@ +handler.rs - source

songbird/
handler.rs

1#[cfg(feature = "driver")]
+2use crate::{driver::Driver, error::ConnectionResult};
+3use crate::{
+4    error::{JoinError, JoinResult},
+5    id::{ChannelId, GuildId, UserId},
+6    info::{ConnectionInfo, ConnectionProgress},
+7    join::*,
+8    shards::{Shard, VoiceUpdate},
+9    Config,
+10};
+11use flume::Sender;
+12use std::fmt::Debug;
+13use tracing::instrument;
+14
+15#[cfg(feature = "driver")]
+16use std::ops::{Deref, DerefMut};
+17
+18#[derive(Clone, Debug)]
+19enum Return {
+20    // Return the connection info as it is received.
+21    Info(Sender<ConnectionInfo>),
+22
+23    // Two channels: first indicates "gateway connection" was successful,
+24    // second indicates that the driver successfully connected.
+25    // The first is needed to cancel a timeout as the driver can/should
+26    // have separate connection timing/retry config.
+27    #[cfg(feature = "driver")]
+28    Conn(Sender<()>, Sender<ConnectionResult<()>>),
+29}
+30
+31/// The Call handler is responsible for a single voice connection, acting
+32/// as a clean API above the inner state and gateway message management.
+33///
+34/// If the `"driver"` feature is enabled, then a Call exposes all control methods of
+35/// [`Driver`] via `Deref(Mut)`.
+36///
+37/// [`Driver`]: struct@Driver
+38#[derive(Clone, Debug)]
+39pub struct Call {
+40    #[cfg(not(feature = "driver"))]
+41    config: Config,
+42
+43    connection: Option<(ConnectionProgress, Return)>,
+44
+45    #[cfg(feature = "driver")]
+46    /// The internal controller of the voice connection monitor thread.
+47    driver: Driver,
+48
+49    guild_id: GuildId,
+50    /// Whether the current handler is set to deafen voice connections.
+51    self_deaf: bool,
+52    /// Whether the current handler is set to mute voice connections.
+53    self_mute: bool,
+54    user_id: UserId,
+55    /// Will be set when a `Call` is made via the [`new`]
+56    /// method.
+57    ///
+58    /// When set via [`standalone`](`Call::standalone`), it will not be
+59    /// present.
+60    ///
+61    /// [`new`]: Call::new
+62    /// [`standalone`]: Call::standalone
+63    ws: Option<Shard>,
+64}
+65
+66impl Call {
+67    /// Creates a new Call, which will send out WebSocket messages via
+68    /// the given shard.
+69    #[inline]
+70    #[instrument]
+71    pub fn new<G, U>(guild_id: G, ws: Shard, user_id: U) -> Self
+72    where
+73        G: Into<GuildId> + Debug,
+74        U: Into<UserId> + Debug,
+75    {
+76        Self::new_raw_cfg(guild_id.into(), Some(ws), user_id.into(), Config::default())
+77    }
+78
+79    /// Creates a new Call, configuring the driver as specified.
+80    #[inline]
+81    #[instrument]
+82    pub fn from_config<G, U>(guild_id: G, ws: Shard, user_id: U, config: Config) -> Self
+83    where
+84        G: Into<GuildId> + Debug,
+85        U: Into<UserId> + Debug,
+86    {
+87        Self::new_raw_cfg(guild_id.into(), Some(ws), user_id.into(), config)
+88    }
+89
+90    /// Creates a new, standalone Call which is not connected via
+91    /// WebSocket to the Gateway.
+92    ///
+93    /// Actions such as muting, deafening, and switching channels will not
+94    /// function through this Call and must be done through some other
+95    /// method, as the values will only be internally updated.
+96    ///
+97    /// For most use cases you do not want this.
+98    #[inline]
+99    #[instrument]
+100    pub fn standalone<G, U>(guild_id: G, user_id: U) -> Self
+101    where
+102        G: Into<GuildId> + Debug,
+103        U: Into<UserId> + Debug,
+104    {
+105        Self::new_raw_cfg(guild_id.into(), None, user_id.into(), Config::default())
+106    }
+107
+108    /// Creates a new standalone Call from the given configuration file.
+109    #[inline]
+110    #[instrument]
+111    pub fn standalone_from_config<G, U>(guild_id: G, user_id: U, config: Config) -> Self
+112    where
+113        G: Into<GuildId> + Debug,
+114        U: Into<UserId> + Debug,
+115    {
+116        Self::new_raw_cfg(guild_id.into(), None, user_id.into(), config)
+117    }
+118
+119    fn new_raw_cfg(guild_id: GuildId, ws: Option<Shard>, user_id: UserId, config: Config) -> Self {
+120        Call {
+121            #[cfg(not(feature = "driver"))]
+122            config,
+123            connection: None,
+124            #[cfg(feature = "driver")]
+125            driver: Driver::new(config),
+126            guild_id,
+127            self_deaf: false,
+128            self_mute: false,
+129            user_id,
+130            ws,
+131        }
+132    }
+133
+134    #[instrument(skip(self))]
+135    fn do_connect(&mut self) {
+136        match &self.connection {
+137            Some((ConnectionProgress::Complete(c), Return::Info(tx))) => {
+138                // It's okay if the receiver hung up.
+139                drop(tx.send(c.clone()));
+140            },
+141            #[cfg(feature = "driver")]
+142            Some((ConnectionProgress::Complete(c), Return::Conn(first_tx, driver_tx))) => {
+143                // It's okay if the receiver hung up.
+144                _ = first_tx.send(());
+145
+146                self.driver.raw_connect(c.clone(), driver_tx.clone());
+147            },
+148            _ => {},
+149        }
+150    }
+151
+152    /// Sets whether the current connection is to be deafened.
+153    ///
+154    /// If there is no live voice connection, then this only acts as a settings
+155    /// update for future connections.
+156    ///
+157    /// **Note**: Unlike in the official client, you _can_ be deafened while
+158    /// not being muted.
+159    ///
+160    /// **Note**: If the `Call` was created via [`standalone`], then this
+161    /// will _only_ update whether the connection is internally deafened.
+162    ///
+163    /// [`standalone`]: Call::standalone
+164    #[instrument(skip(self))]
+165    pub async fn deafen(&mut self, deaf: bool) -> JoinResult<()> {
+166        self.self_deaf = deaf;
+167
+168        self.update().await
+169    }
+170
+171    /// Returns whether the current connection is self-deafened in this server.
+172    ///
+173    /// This is purely cosmetic.
+174    #[instrument(skip(self))]
+175    pub fn is_deaf(&self) -> bool {
+176        self.self_deaf
+177    }
+178
+179    async fn should_actually_join<F, G>(
+180        &mut self,
+181        completion_generator: F,
+182        tx: &Sender<G>,
+183        channel_id: ChannelId,
+184    ) -> JoinResult<bool>
+185    where
+186        F: FnOnce(&Self) -> G,
+187    {
+188        Ok(if let Some(conn) = &self.connection {
+189            if conn.0.in_progress() {
+190                self.leave().await?;
+191                true
+192            } else if conn.0.channel_id() == channel_id {
+193                drop(tx.send(completion_generator(self)));
+194                false
+195            } else {
+196                // not in progress, and/or a channel change.
+197                true
+198            }
+199        } else {
+200            true
+201        })
+202    }
+203
+204    #[cfg(feature = "driver")]
+205    /// Connect or switch to the given voice channel by its Id.
+206    ///
+207    /// This function acts as a future in two stages:
+208    /// * The first `await` sends the request over the gateway.
+209    /// * The second `await`s a the driver's connection attempt.
+210    ///   To prevent deadlock, any mutexes around this Call
+211    ///   *must* be released before this result is queried.
+212    ///
+213    /// When using [`Songbird::join`], this pattern is correctly handled for you.
+214    ///
+215    /// [`Songbird::join`]: crate::Songbird::join
+216    #[instrument(skip(self))]
+217    #[inline]
+218    pub async fn join<C>(&mut self, channel_id: C) -> JoinResult<Join>
+219    where
+220        C: Into<ChannelId> + Debug,
+221    {
+222        self.join_inner(channel_id.into()).await
+223    }
+224
+225    #[cfg(feature = "driver")]
+226    async fn join_inner(&mut self, channel_id: ChannelId) -> JoinResult<Join> {
+227        let (tx, rx) = flume::unbounded();
+228        let (gw_tx, gw_rx) = flume::unbounded();
+229
+230        let do_conn = self
+231            .should_actually_join(|_| (), &gw_tx, channel_id)
+232            .await?;
+233
+234        if do_conn {
+235            self.connection = Some((
+236                ConnectionProgress::new(self.guild_id, self.user_id, channel_id),
+237                Return::Conn(gw_tx, tx),
+238            ));
+239
+240            let timeout = self.config().gateway_timeout;
+241
+242            self.update()
+243                .await
+244                .map(|()| Join::new(rx.into_recv_async(), gw_rx.into_recv_async(), timeout))
+245        } else {
+246            // Skipping the gateway connection implies that the current connection is complete
+247            // AND the channel is a match.
+248            //
+249            // Send a polite request to the driver, which should only *actually* reconnect
+250            // if it had a problem earlier.
+251            let info = self.current_connection().unwrap().clone();
+252            self.driver.raw_connect(info, tx.clone());
+253
+254            Ok(Join::new(
+255                rx.into_recv_async(),
+256                gw_rx.into_recv_async(),
+257                None,
+258            ))
+259        }
+260    }
+261
+262    /// Join the selected voice channel, *without* running/starting an RTP
+263    /// session or running the driver.
+264    ///
+265    /// Use this if you require connection info for lavalink,
+266    /// some other voice implementation, or don't want to use the driver for a given call.
+267    ///
+268    /// This function acts as a future in two stages:
+269    /// * The first `await` sends the request over the gateway.
+270    /// * The second `await`s voice session data from Discord.
+271    ///   To prevent deadlock, any mutexes around this Call
+272    ///   *must* be released before this result is queried.
+273    ///
+274    /// When using [`Songbird::join_gateway`], this pattern is correctly handled for you.
+275    ///
+276    /// [`Songbird::join_gateway`]: crate::Songbird::join_gateway
+277    #[instrument(skip(self))]
+278    #[inline]
+279    pub async fn join_gateway<C>(&mut self, channel_id: C) -> JoinResult<JoinGateway>
+280    where
+281        C: Into<ChannelId> + Debug,
+282    {
+283        self.join_gateway_inner(channel_id.into()).await
+284    }
+285
+286    async fn join_gateway_inner(&mut self, channel_id: ChannelId) -> JoinResult<JoinGateway> {
+287        let (tx, rx) = flume::unbounded();
+288
+289        let do_conn = self
+290            .should_actually_join(
+291                |call| call.connection.as_ref().unwrap().0.info().unwrap(),
+292                &tx,
+293                channel_id,
+294            )
+295            .await?;
+296
+297        if do_conn {
+298            self.connection = Some((
+299                ConnectionProgress::new(self.guild_id, self.user_id, channel_id),
+300                Return::Info(tx),
+301            ));
+302
+303            let timeout = self.config().gateway_timeout;
+304
+305            self.update()
+306                .await
+307                .map(|()| JoinGateway::new(rx.into_recv_async(), timeout))
+308        } else {
+309            Ok(JoinGateway::new(rx.into_recv_async(), None))
+310        }
+311    }
+312
+313    /// Returns the current voice connection details for this Call,
+314    /// if available.
+315    #[instrument(skip(self))]
+316    pub fn current_connection(&self) -> Option<&ConnectionInfo> {
+317        match &self.connection {
+318            Some((progress, _)) => progress.get_connection_info(),
+319            _ => None,
+320        }
+321    }
+322
+323    /// Returns `id` of the channel, if connected or connecting to any.
+324    ///
+325    /// This remains set after a connection failure, to allow for reconnection
+326    /// as needed. This will change if moved into another voice channel by an
+327    /// admin, and will be unset if kicked from a voice channel.
+328    #[instrument(skip(self))]
+329    pub fn current_channel(&self) -> Option<ChannelId> {
+330        match &self.connection {
+331            Some((progress, _)) => Some(progress.channel_id()),
+332            _ => None,
+333        }
+334    }
+335
+336    /// Leaves the current voice channel, disconnecting from it.
+337    ///
+338    /// This does _not_ forget settings, like whether to be self-deafened or
+339    /// self-muted.
+340    ///
+341    /// **Note**: If the `Call` was created via [`standalone`], then this
+342    /// will _only_ update whether the connection is internally connected to a
+343    /// voice channel.
+344    ///
+345    /// [`standalone`]: Call::standalone
+346    #[instrument(skip(self))]
+347    pub async fn leave(&mut self) -> JoinResult<()> {
+348        self.leave_local();
+349
+350        // Only send an update if we were in a voice channel.
+351        self.update().await
+352    }
+353
+354    fn leave_local(&mut self) {
+355        self.connection = None;
+356
+357        #[cfg(feature = "driver")]
+358        self.driver.leave();
+359    }
+360
+361    /// Sets whether the current connection is to be muted.
+362    ///
+363    /// If there is no live voice connection, then this only acts as a settings
+364    /// update for future connections.
+365    ///
+366    /// **Note**: If the `Call` was created via [`standalone`], then this
+367    /// will _only_ update whether the connection is internally muted.
+368    ///
+369    /// [`standalone`]: Call::standalone
+370    #[instrument(skip(self))]
+371    pub async fn mute(&mut self, mute: bool) -> JoinResult<()> {
+372        self.self_mute = mute;
+373
+374        #[cfg(feature = "driver")]
+375        self.driver.mute(mute);
+376
+377        self.update().await
+378    }
+379
+380    /// Returns whether the current connection is self-muted in this server.
+381    #[instrument(skip(self))]
+382    pub fn is_mute(&self) -> bool {
+383        self.self_mute
+384    }
+385
+386    /// Updates the voice server data.
+387    ///
+388    /// You should only need to use this if you initialized the `Call` via
+389    /// [`standalone`].
+390    ///
+391    /// [`standalone`]: Call::standalone
+392    #[instrument(skip(self, token))]
+393    pub fn update_server(&mut self, endpoint: String, token: String) {
+394        let try_conn = if let Some((ref mut progress, _)) = self.connection.as_mut() {
+395            progress.apply_server_update(endpoint, token)
+396        } else {
+397            false
+398        };
+399
+400        if try_conn {
+401            self.do_connect();
+402        }
+403    }
+404
+405    /// Updates the internal voice state of the current user.
+406    ///
+407    /// You should only need to use this if you initialized the `Call` via
+408    /// [`standalone`].
+409    ///
+410    /// [`standalone`]: Call::standalone
+411    #[instrument(skip(self))]
+412    #[inline]
+413    pub fn update_state<C>(&mut self, session_id: String, channel_id: Option<C>)
+414    where
+415        C: Into<ChannelId> + Debug,
+416    {
+417        self.update_state_inner(session_id, channel_id.map(Into::into));
+418    }
+419
+420    fn update_state_inner(&mut self, session_id: String, channel_id: Option<ChannelId>) {
+421        if let Some(channel_id) = channel_id {
+422            let try_conn = if let Some((ref mut progress, _)) = self.connection.as_mut() {
+423                progress.apply_state_update(session_id, channel_id)
+424            } else {
+425                false
+426            };
+427
+428            if try_conn {
+429                self.do_connect();
+430            }
+431        } else {
+432            // Likely that we were disconnected by an admin.
+433            self.leave_local();
+434        }
+435    }
+436
+437    /// Send an update for the current session over WS.
+438    ///
+439    /// Does nothing if initialized via [`standalone`].
+440    ///
+441    /// [`standalone`]: Call::standalone
+442    #[instrument(skip(self))]
+443    async fn update(&mut self) -> JoinResult<()> {
+444        if let Some(ws) = self.ws.as_mut() {
+445            ws.update_voice_state(
+446                self.guild_id,
+447                self.connection.as_ref().map(|c| c.0.channel_id()),
+448                self.self_deaf,
+449                self.self_mute,
+450            )
+451            .await
+452        } else {
+453            Err(JoinError::NoSender)
+454        }
+455    }
+456}
+457
+458#[cfg(not(feature = "driver"))]
+459impl Call {
+460    /// Access this call handler's configuration.
+461    pub fn config(&self) -> &Config {
+462        &self.config
+463    }
+464
+465    /// Mutably access this call handler's configuration.
+466    pub fn config_mut(&mut self) -> &mut Config {
+467        &mut self.config
+468    }
+469
+470    /// Set this call handler's configuration.
+471    pub fn set_config(&mut self, config: Config) {
+472        self.config = config;
+473    }
+474}
+475
+476#[cfg(feature = "driver")]
+477impl Deref for Call {
+478    type Target = Driver;
+479
+480    fn deref(&self) -> &Self::Target {
+481        &self.driver
+482    }
+483}
+484
+485#[cfg(feature = "driver")]
+486impl DerefMut for Call {
+487    fn deref_mut(&mut self) -> &mut Self::Target {
+488        &mut self.driver
+489    }
+490}
\ No newline at end of file diff --git a/next/src/songbird/id.rs.html b/next/src/songbird/id.rs.html new file mode 100644 index 0000000..3e9b8e7 --- /dev/null +++ b/next/src/songbird/id.rs.html @@ -0,0 +1,123 @@ +id.rs - source

songbird/
id.rs

1//! Newtypes around Discord IDs for library cross-compatibility.
+2
+3#[cfg(feature = "driver")]
+4use crate::model::id::{GuildId as DriverGuild, UserId as DriverUser};
+5#[cfg(feature = "serenity")]
+6use serenity::model::id::{
+7    ChannelId as SerenityChannel,
+8    GuildId as SerenityGuild,
+9    UserId as SerenityUser,
+10};
+11use std::{
+12    fmt::{Display, Formatter, Result as FmtResult},
+13    num::NonZeroU64,
+14};
+15#[cfg(feature = "twilight")]
+16use twilight_model::id::{
+17    marker::{ChannelMarker, GuildMarker, UserMarker},
+18    Id as TwilightId,
+19};
+20
+21/// ID of a Discord voice/text channel.
+22#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
+23pub struct ChannelId(pub NonZeroU64);
+24
+25/// ID of a Discord guild (colloquially, "server").
+26#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
+27pub struct GuildId(pub NonZeroU64);
+28
+29/// ID of a Discord user.
+30#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
+31pub struct UserId(pub NonZeroU64);
+32
+33impl Display for ChannelId {
+34    fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
+35        Display::fmt(&self.0, f)
+36    }
+37}
+38
+39impl From<NonZeroU64> for ChannelId {
+40    fn from(id: NonZeroU64) -> Self {
+41        Self(id)
+42    }
+43}
+44
+45#[cfg(feature = "serenity")]
+46impl From<SerenityChannel> for ChannelId {
+47    fn from(id: SerenityChannel) -> Self {
+48        Self(NonZeroU64::new(id.get()).unwrap())
+49    }
+50}
+51
+52#[cfg(feature = "twilight")]
+53impl From<TwilightId<ChannelMarker>> for ChannelId {
+54    fn from(id: TwilightId<ChannelMarker>) -> Self {
+55        Self(id.into_nonzero())
+56    }
+57}
+58
+59impl Display for GuildId {
+60    fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
+61        Display::fmt(&self.0, f)
+62    }
+63}
+64
+65impl From<NonZeroU64> for GuildId {
+66    fn from(id: NonZeroU64) -> Self {
+67        Self(id)
+68    }
+69}
+70
+71#[cfg(feature = "serenity")]
+72impl From<SerenityGuild> for GuildId {
+73    fn from(id: SerenityGuild) -> Self {
+74        Self(NonZeroU64::new(id.get()).unwrap())
+75    }
+76}
+77
+78#[cfg(feature = "driver")]
+79impl From<GuildId> for DriverGuild {
+80    fn from(id: GuildId) -> Self {
+81        Self(id.0.get())
+82    }
+83}
+84
+85#[cfg(feature = "twilight")]
+86impl From<TwilightId<GuildMarker>> for GuildId {
+87    fn from(id: TwilightId<GuildMarker>) -> Self {
+88        Self(id.into_nonzero())
+89    }
+90}
+91
+92impl Display for UserId {
+93    fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
+94        Display::fmt(&self.0, f)
+95    }
+96}
+97
+98impl From<NonZeroU64> for UserId {
+99    fn from(id: NonZeroU64) -> Self {
+100        Self(id)
+101    }
+102}
+103
+104#[cfg(feature = "serenity")]
+105impl From<SerenityUser> for UserId {
+106    fn from(id: SerenityUser) -> Self {
+107        Self(NonZeroU64::new(id.get()).unwrap())
+108    }
+109}
+110
+111#[cfg(feature = "driver")]
+112impl From<UserId> for DriverUser {
+113    fn from(id: UserId) -> Self {
+114        Self(id.0.get())
+115    }
+116}
+117
+118#[cfg(feature = "twilight")]
+119impl From<TwilightId<UserMarker>> for UserId {
+120    fn from(id: TwilightId<UserMarker>) -> Self {
+121        Self(id.into_nonzero())
+122    }
+123}
\ No newline at end of file diff --git a/next/src/songbird/info.rs.html b/next/src/songbird/info.rs.html new file mode 100644 index 0000000..7810932 --- /dev/null +++ b/next/src/songbird/info.rs.html @@ -0,0 +1,203 @@ +info.rs - source

songbird/
info.rs

1use crate::id::{ChannelId, GuildId, UserId};
+2use std::fmt;
+3
+4#[derive(Clone, Debug)]
+5pub(crate) enum ConnectionProgress {
+6    Complete(ConnectionInfo),
+7    Incomplete(Partial),
+8}
+9
+10impl ConnectionProgress {
+11    pub(crate) fn new(guild_id: GuildId, user_id: UserId, channel_id: ChannelId) -> Self {
+12        ConnectionProgress::Incomplete(Partial {
+13            channel_id,
+14            guild_id,
+15            user_id,
+16            token: None,
+17            endpoint: None,
+18            session_id: None,
+19        })
+20    }
+21
+22    pub(crate) fn get_connection_info(&self) -> Option<&ConnectionInfo> {
+23        if let Self::Complete(c) = self {
+24            Some(c)
+25        } else {
+26            None
+27        }
+28    }
+29
+30    pub(crate) fn in_progress(&self) -> bool {
+31        matches!(self, ConnectionProgress::Incomplete(_))
+32    }
+33
+34    pub(crate) fn channel_id(&self) -> ChannelId {
+35        match self {
+36            ConnectionProgress::Complete(conn_info) => conn_info
+37                .channel_id
+38                .expect("All code paths MUST set channel_id for local tracking."),
+39            ConnectionProgress::Incomplete(part) => part.channel_id,
+40        }
+41    }
+42
+43    pub(crate) fn guild_id(&self) -> GuildId {
+44        match self {
+45            ConnectionProgress::Complete(conn_info) => conn_info.guild_id,
+46            ConnectionProgress::Incomplete(part) => part.guild_id,
+47        }
+48    }
+49
+50    pub(crate) fn user_id(&self) -> UserId {
+51        match self {
+52            ConnectionProgress::Complete(conn_info) => conn_info.user_id,
+53            ConnectionProgress::Incomplete(part) => part.user_id,
+54        }
+55    }
+56
+57    pub(crate) fn info(&self) -> Option<ConnectionInfo> {
+58        self.get_connection_info().cloned()
+59    }
+60
+61    pub(crate) fn apply_state_update(&mut self, session_id: String, channel_id: ChannelId) -> bool {
+62        if self.channel_id() != channel_id {
+63            // Likely that the bot was moved to a different channel by an admin.
+64            *self = ConnectionProgress::new(self.guild_id(), self.user_id(), channel_id);
+65        }
+66
+67        match self {
+68            Self::Complete(c) => {
+69                let should_reconn = c.session_id != session_id;
+70                c.session_id = session_id;
+71                should_reconn
+72            },
+73            Self::Incomplete(i) => i
+74                .apply_state_update(session_id, channel_id)
+75                .map(|info| {
+76                    *self = Self::Complete(info);
+77                })
+78                .is_some(),
+79        }
+80    }
+81
+82    pub(crate) fn apply_server_update(&mut self, endpoint: String, token: String) -> bool {
+83        match self {
+84            Self::Complete(c) => {
+85                let should_reconn = c.endpoint != endpoint || c.token != token;
+86
+87                c.endpoint = endpoint;
+88                c.token = token;
+89
+90                should_reconn
+91            },
+92            Self::Incomplete(i) => i
+93                .apply_server_update(endpoint, token)
+94                .map(|info| {
+95                    *self = Self::Complete(info);
+96                })
+97                .is_some(),
+98        }
+99    }
+100}
+101
+102/// Parameters and information needed to start communicating with Discord's voice servers, either
+103/// with the Songbird driver, lavalink, or other system.
+104#[derive(Clone, Eq, Hash, PartialEq)]
+105pub struct ConnectionInfo {
+106    /// ID of the voice channel being joined, if it is known.
+107    ///
+108    /// This is not needed to establish a connection, but can be useful
+109    /// for book-keeping.
+110    pub channel_id: Option<ChannelId>,
+111    /// URL of the voice websocket gateway server assigned to this call.
+112    pub endpoint: String,
+113    /// ID of the target voice channel's parent guild.
+114    ///
+115    /// Bots cannot connect to a guildless (i.e., direct message) voice call.
+116    pub guild_id: GuildId,
+117    /// Unique string describing this session for validation/authentication purposes.
+118    pub session_id: String,
+119    /// Ephemeral secret used to validate the above session.
+120    pub token: String,
+121    /// UserID of this bot.
+122    pub user_id: UserId,
+123}
+124
+125impl fmt::Debug for ConnectionInfo {
+126    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+127        f.debug_struct("ConnectionInfo")
+128            .field("channel_id", &self.channel_id)
+129            .field("endpoint", &self.endpoint)
+130            .field("guild_id", &self.guild_id)
+131            .field("session_id", &self.session_id)
+132            .field("token", &"<secret>")
+133            .field("user_id", &self.user_id)
+134            .finish()
+135    }
+136}
+137
+138#[derive(Clone)]
+139pub(crate) struct Partial {
+140    pub channel_id: ChannelId,
+141    pub endpoint: Option<String>,
+142    pub guild_id: GuildId,
+143    pub session_id: Option<String>,
+144    pub token: Option<String>,
+145    pub user_id: UserId,
+146}
+147
+148impl fmt::Debug for Partial {
+149    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+150        f.debug_struct("Partial")
+151            .field("channel_id", &self.channel_id)
+152            .field("endpoint", &self.endpoint)
+153            .field("guild_id", &self.guild_id)
+154            .field("session_id", &self.session_id)
+155            .field("token_is_some", &self.token.is_some())
+156            .field("user_id", &self.user_id)
+157            .finish()
+158    }
+159}
+160
+161impl Partial {
+162    fn finalise(&mut self) -> Option<ConnectionInfo> {
+163        if self.endpoint.is_some() && self.session_id.is_some() && self.token.is_some() {
+164            let endpoint = self.endpoint.take().unwrap();
+165            let session_id = self.session_id.take().unwrap();
+166            let token = self.token.take().unwrap();
+167
+168            Some(ConnectionInfo {
+169                channel_id: Some(self.channel_id),
+170                endpoint,
+171                session_id,
+172                token,
+173                guild_id: self.guild_id,
+174                user_id: self.user_id,
+175            })
+176        } else {
+177            None
+178        }
+179    }
+180
+181    fn apply_state_update(
+182        &mut self,
+183        session_id: String,
+184        channel_id: ChannelId,
+185    ) -> Option<ConnectionInfo> {
+186        if self.channel_id != channel_id {
+187            self.endpoint = None;
+188            self.token = None;
+189        }
+190
+191        self.channel_id = channel_id;
+192        self.session_id = Some(session_id);
+193
+194        self.finalise()
+195    }
+196
+197    fn apply_server_update(&mut self, endpoint: String, token: String) -> Option<ConnectionInfo> {
+198        self.endpoint = Some(endpoint);
+199        self.token = Some(token);
+200
+201        self.finalise()
+202    }
+203}
\ No newline at end of file diff --git a/next/src/songbird/input/adapters/async_adapter.rs.html b/next/src/songbird/input/adapters/async_adapter.rs.html new file mode 100644 index 0000000..519a60a --- /dev/null +++ b/next/src/songbird/input/adapters/async_adapter.rs.html @@ -0,0 +1,385 @@ +async_adapter.rs - source

songbird/input/adapters/
async_adapter.rs

1use crate::input::AudioStreamError;
+2use async_trait::async_trait;
+3use flume::{Receiver, RecvError, Sender, TryRecvError};
+4use futures::{future::Either, stream::FuturesUnordered, FutureExt, StreamExt};
+5use parking_lot::Mutex;
+6use ringbuf::{storage::Heap, traits::*, *};
+7use std::{
+8    io::{
+9        Error as IoError,
+10        ErrorKind as IoErrorKind,
+11        Read,
+12        Result as IoResult,
+13        Seek,
+14        SeekFrom,
+15        Write,
+16    },
+17    sync::{
+18        atomic::{AtomicBool, Ordering},
+19        Arc,
+20    },
+21};
+22use symphonia_core::io::MediaSource;
+23use tokio::{
+24    io::{AsyncRead, AsyncReadExt, AsyncSeek, AsyncSeekExt},
+25    sync::Notify,
+26};
+27
+28struct AsyncAdapterSink {
+29    bytes_in: HeapProd<u8>,
+30    req_rx: Receiver<AdapterRequest>,
+31    resp_tx: Sender<AdapterResponse>,
+32    stream: Box<dyn AsyncMediaSource>,
+33    notify_rx: Arc<Notify>,
+34}
+35
+36impl AsyncAdapterSink {
+37    async fn launch(mut self) {
+38        let mut inner_buf = vec![0u8; 32 * 1024].into_boxed_slice();
+39        let mut read_region = 0..0;
+40        let mut hit_end = false;
+41        let mut blocked = false;
+42        let mut pause_buf_moves = false;
+43        let mut seek_res = None;
+44        let mut seen_bytes = 0;
+45
+46        loop {
+47            // if read_region is empty, refill from src.
+48            //  if that read is zero, tell other half.
+49            // if WouldBlock, block on msg acquire,
+50            // else non_block msg acquire.
+51
+52            if !pause_buf_moves {
+53                if !hit_end && read_region.is_empty() {
+54                    if let Ok(n) = self.stream.read(&mut inner_buf).await {
+55                        read_region = 0..n;
+56                        if n == 0 {
+57                            drop(self.resp_tx.send_async(AdapterResponse::ReadZero).await);
+58                            hit_end = true;
+59                        }
+60                        seen_bytes += n as u64;
+61                    } else {
+62                        match self.stream.try_resume(seen_bytes).await {
+63                            Ok(s) => {
+64                                self.stream = s;
+65                            },
+66                            Err(_e) => break,
+67                        }
+68                    }
+69                }
+70
+71                while !read_region.is_empty() && !blocked {
+72                    if let Ok(n_moved) = self
+73                        .bytes_in
+74                        .write(&inner_buf[read_region.start..read_region.end])
+75                    {
+76                        read_region.start += n_moved;
+77                        drop(self.resp_tx.send_async(AdapterResponse::ReadOccurred).await);
+78                    } else {
+79                        blocked = true;
+80                    }
+81                }
+82            }
+83
+84            let msg = if blocked || hit_end {
+85                let mut fs = FuturesUnordered::new();
+86                fs.push(Either::Left(self.req_rx.recv_async()));
+87                fs.push(Either::Right(self.notify_rx.notified().map(|()| {
+88                    let o: Result<AdapterRequest, RecvError> = Ok(AdapterRequest::Wake);
+89                    o
+90                })));
+91
+92                match fs.next().await {
+93                    Some(Ok(a)) => a,
+94                    _ => break,
+95                }
+96            } else {
+97                match self.req_rx.try_recv() {
+98                    Ok(a) => a,
+99                    Err(TryRecvError::Empty) => continue,
+100                    _ => break,
+101                }
+102            };
+103
+104            match msg {
+105                AdapterRequest::Wake => blocked = false,
+106                AdapterRequest::ByteLen => {
+107                    drop(
+108                        self.resp_tx
+109                            .send_async(AdapterResponse::ByteLen(self.stream.byte_len().await))
+110                            .await,
+111                    );
+112                },
+113                AdapterRequest::Seek(pos) => {
+114                    pause_buf_moves = true;
+115                    drop(self.resp_tx.send_async(AdapterResponse::SeekClear).await);
+116                    seek_res = Some(self.stream.seek(pos).await);
+117                },
+118                AdapterRequest::SeekCleared => {
+119                    if let Some(res) = seek_res.take() {
+120                        drop(
+121                            self.resp_tx
+122                                .send_async(AdapterResponse::SeekResult(res))
+123                                .await,
+124                        );
+125                    }
+126                    pause_buf_moves = false;
+127                },
+128            }
+129        }
+130    }
+131}
+132
+133/// An adapter for converting an async media source into a synchronous one
+134/// usable by symphonia.
+135///
+136/// This adapter takes a source implementing `AsyncRead`, and allows the receive side to
+137/// pass along seek requests needed. This allows for passing bytes from exclusively `AsyncRead`
+138/// streams (e.g., hyper HTTP sessions) to Songbird.
+139pub struct AsyncAdapterStream {
+140    // Note: this mutex is here to appease symphonia's Send + Sync bound.
+141    // Only one thread should own and pull from this stream, so in practice
+142    // there is no contention.
+143    bytes_out: Mutex<HeapCons<u8>>,
+144    can_seek: bool,
+145    // Note: these are Atomic just to work around the need for
+146    // check_messages to take &self rather than &mut.
+147    finalised: AtomicBool,
+148    bytes_known_present: AtomicBool,
+149    req_tx: Sender<AdapterRequest>,
+150    resp_rx: Receiver<AdapterResponse>,
+151    notify_tx: Arc<Notify>,
+152}
+153
+154impl AsyncAdapterStream {
+155    /// Wrap and pull from an async file stream, with an intermediate ring-buffer of size `buf_len`
+156    /// between the async and sync halves.
+157    #[must_use]
+158    pub fn new(stream: Box<dyn AsyncMediaSource>, buf_len: usize) -> AsyncAdapterStream {
+159        let (bytes_in, bytes_out) = SharedRb::<Heap<_>>::new(buf_len).split();
+160        let bytes_out = bytes_out.into();
+161        let (resp_tx, resp_rx) = flume::unbounded();
+162        let (req_tx, req_rx) = flume::unbounded();
+163        let can_seek = stream.is_seekable();
+164        let notify_rx = Arc::new(Notify::new());
+165        let notify_tx = notify_rx.clone();
+166
+167        let sink = AsyncAdapterSink {
+168            bytes_in,
+169            req_rx,
+170            resp_tx,
+171            stream,
+172            notify_rx,
+173        };
+174        let stream = AsyncAdapterStream {
+175            bytes_out,
+176            can_seek,
+177            finalised: false.into(),
+178            bytes_known_present: false.into(),
+179            req_tx,
+180            resp_rx,
+181            notify_tx,
+182        };
+183
+184        tokio::spawn(async move {
+185            Box::pin(sink.launch()).await;
+186        });
+187
+188        stream
+189    }
+190
+191    fn handle_messages(&self, op: Operation) -> Option<AdapterResponse> {
+192        loop {
+193            let msg = if op.will_block() {
+194                self.resp_rx.recv().ok()
+195            } else {
+196                self.resp_rx.try_recv().ok()
+197            };
+198
+199            let Some(msg) = msg else { break None };
+200
+201            // state changes
+202            match &msg {
+203                AdapterResponse::ReadZero => {
+204                    self.finalised.store(true, Ordering::Relaxed);
+205                },
+206                AdapterResponse::ReadOccurred => {
+207                    self.bytes_known_present.store(true, Ordering::Relaxed);
+208                },
+209                _ => {},
+210            }
+211
+212            if op.expected_msg(&msg) {
+213                break Some(msg);
+214            }
+215        }
+216    }
+217
+218    fn is_dropped_and_clear(&self) -> bool {
+219        self.resp_rx.is_empty() && self.resp_rx.is_disconnected()
+220    }
+221
+222    fn check_dropped(&self) -> IoResult<()> {
+223        if self.is_dropped_and_clear() {
+224            Err(IoError::new(
+225                IoErrorKind::UnexpectedEof,
+226                "Async half was dropped.",
+227            ))
+228        } else {
+229            Ok(())
+230        }
+231    }
+232}
+233
+234impl Read for AsyncAdapterStream {
+235    fn read(&mut self, buf: &mut [u8]) -> IoResult<usize> {
+236        loop {
+237            let block = !(self.bytes_known_present.load(Ordering::Relaxed)
+238                || self.finalised.load(Ordering::Relaxed));
+239            drop(self.handle_messages(Operation::Read { block }));
+240
+241            let mut rb = self.bytes_out.lock();
+242            match rb.read(buf) {
+243                Ok(n) => {
+244                    self.notify_tx.notify_one();
+245                    return Ok(n);
+246                },
+247                Err(e) if e.kind() == IoErrorKind::WouldBlock => {
+248                    // receive side must ABSOLUTELY be unblocked here.
+249                    self.notify_tx.notify_one();
+250                    if self.finalised.load(Ordering::Relaxed) {
+251                        return Ok(0);
+252                    }
+253                    self.bytes_known_present.store(false, Ordering::Relaxed);
+254                    self.check_dropped()?;
+255                },
+256                a => {
+257                    println!("Misc err {a:?}");
+258                    return a;
+259                },
+260            }
+261        }
+262    }
+263}
+264
+265impl Seek for AsyncAdapterStream {
+266    fn seek(&mut self, pos: SeekFrom) -> IoResult<u64> {
+267        if !self.can_seek {
+268            return Err(IoError::new(
+269                IoErrorKind::Unsupported,
+270                "Async half does not support seek operations.",
+271            ));
+272        }
+273
+274        self.check_dropped()?;
+275
+276        _ = self.req_tx.send(AdapterRequest::Seek(pos));
+277
+278        // wait for async to tell us that it has stopped writing,
+279        // then clear buf and allow async to write again.
+280        self.finalised.store(false, Ordering::Relaxed);
+281        match self.handle_messages(Operation::Seek) {
+282            Some(AdapterResponse::SeekClear) => {},
+283            None => self.check_dropped().map(|()| unreachable!())?,
+284            _ => unreachable!(),
+285        }
+286
+287        let mut rb = self.bytes_out.lock();
+288        let cap = rb.capacity();
+289        rb.skip(cap.into());
+290
+291        _ = self.req_tx.send(AdapterRequest::SeekCleared);
+292
+293        match self.handle_messages(Operation::Seek) {
+294            Some(AdapterResponse::SeekResult(a)) => a,
+295            None => self.check_dropped().map(|()| unreachable!()),
+296            _ => unreachable!(),
+297        }
+298    }
+299}
+300
+301impl MediaSource for AsyncAdapterStream {
+302    fn is_seekable(&self) -> bool {
+303        self.can_seek
+304    }
+305
+306    fn byte_len(&self) -> Option<u64> {
+307        self.check_dropped().ok()?;
+308
+309        _ = self.req_tx.send(AdapterRequest::ByteLen);
+310
+311        match self.handle_messages(Operation::Len) {
+312            Some(AdapterResponse::ByteLen(a)) => a,
+313            None => self.check_dropped().ok().map(|()| unreachable!()),
+314            _ => unreachable!(),
+315        }
+316    }
+317}
+318
+319enum AdapterRequest {
+320    Wake,
+321    Seek(SeekFrom),
+322    SeekCleared,
+323    ByteLen,
+324}
+325
+326enum AdapterResponse {
+327    SeekResult(IoResult<u64>),
+328    SeekClear,
+329    ByteLen(Option<u64>),
+330    ReadZero,
+331    ReadOccurred,
+332}
+333
+334#[derive(Copy, Clone)]
+335enum Operation {
+336    Read { block: bool },
+337    Seek,
+338    Len,
+339}
+340
+341impl Operation {
+342    fn will_block(self) -> bool {
+343        match self {
+344            Self::Read { block } => block,
+345            _ => true,
+346        }
+347    }
+348
+349    fn expected_msg(self, msg: &AdapterResponse) -> bool {
+350        match self {
+351            Self::Read { .. } => matches!(
+352                msg,
+353                AdapterResponse::ReadOccurred | AdapterResponse::ReadZero
+354            ),
+355            Self::Seek => matches!(
+356                msg,
+357                AdapterResponse::SeekResult(_) | AdapterResponse::SeekClear
+358            ),
+359            Self::Len => matches!(msg, AdapterResponse::ByteLen(_)),
+360        }
+361    }
+362}
+363
+364/// An async port of symphonia's [`MediaSource`].
+365///
+366/// Streams which are not seekable should implement `AsyncSeek` such that all operations
+367/// fail with `Unsupported`, and implement `fn is_seekable(&self) -> { false }`.
+368///
+369/// [`MediaSource`]: MediaSource
+370#[async_trait]
+371pub trait AsyncMediaSource: AsyncRead + AsyncSeek + Send + Sync + Unpin {
+372    /// Returns if the source is seekable. This may be an expensive operation.
+373    fn is_seekable(&self) -> bool;
+374
+375    /// Returns the length in bytes, if available. This may be an expensive operation.
+376    async fn byte_len(&self) -> Option<u64>;
+377
+378    /// Tries to recreate this stream in event of an error, resuming from the given offset.
+379    async fn try_resume(
+380        &mut self,
+381        _offset: u64,
+382    ) -> Result<Box<dyn AsyncMediaSource>, AudioStreamError> {
+383        Err(AudioStreamError::Unsupported)
+384    }
+385}
\ No newline at end of file diff --git a/next/src/songbird/input/adapters/cached/compressed.rs.html b/next/src/songbird/input/adapters/cached/compressed.rs.html new file mode 100644 index 0000000..a25cd82 --- /dev/null +++ b/next/src/songbird/input/adapters/cached/compressed.rs.html @@ -0,0 +1,534 @@ +compressed.rs - source

songbird/input/adapters/cached/
compressed.rs

1use super::{compressed_cost_per_sec, default_config, CodecCacheError, ToAudioBytes};
+2use crate::{
+3    constants::*,
+4    input::{
+5        codecs::{dca::*, get_codec_registry, get_probe},
+6        AudioStream,
+7        Input,
+8        LiveInput,
+9    },
+10};
+11use audiopus::{
+12    coder::{Encoder as OpusEncoder, GenericCtl},
+13    Application,
+14    Bitrate,
+15    Channels,
+16    Error as OpusError,
+17    ErrorCode as OpusErrorCode,
+18    SampleRate,
+19};
+20use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};
+21use std::{
+22    io::{
+23        Cursor,
+24        Error as IoError,
+25        ErrorKind as IoErrorKind,
+26        Read,
+27        Result as IoResult,
+28        Seek,
+29        SeekFrom,
+30    },
+31    mem,
+32    sync::atomic::{AtomicUsize, Ordering},
+33};
+34use streamcatcher::{
+35    Config as ScConfig,
+36    NeedsBytes,
+37    Stateful,
+38    Transform,
+39    TransformPosition,
+40    TxCatcher,
+41};
+42use symphonia_core::{
+43    audio::Channels as SChannels,
+44    codecs::CodecRegistry,
+45    io::MediaSource,
+46    meta::{MetadataRevision, StandardTagKey, Value},
+47    probe::{Probe, ProbedMetadata},
+48};
+49use tracing::{debug, trace};
+50
+51/// Configuration for a cached source.
+52pub struct Config {
+53    /// Registry of audio codecs supported by the driver.
+54    ///
+55    /// Defaults to [`get_codec_registry`], which adds audiopus-based Opus codec support
+56    /// to all of Symphonia's default codecs.
+57    pub codec_registry: &'static CodecRegistry,
+58    /// Registry of the muxers and container formats supported by the driver.
+59    ///
+60    /// Defaults to [`get_probe`], which includes all of Symphonia's default format handlers
+61    /// and DCA format support.
+62    pub format_registry: &'static Probe,
+63    /// Configuration for the inner streamcatcher instance.
+64    ///
+65    /// Notably, this governs size hints and resize logic.
+66    pub streamcatcher: ScConfig,
+67}
+68
+69impl Default for Config {
+70    fn default() -> Self {
+71        Self {
+72            codec_registry: get_codec_registry(),
+73            format_registry: get_probe(),
+74            streamcatcher: ScConfig::default(),
+75        }
+76    }
+77}
+78
+79impl Config {
+80    /// Generate a storage configuration given an estimated storage bitrate
+81    /// `cost_per_sec` in bytes/s.
+82    #[must_use]
+83    pub fn default_from_cost(cost_per_sec: usize) -> Self {
+84        let streamcatcher = default_config(cost_per_sec);
+85        Self {
+86            streamcatcher,
+87            ..Default::default()
+88        }
+89    }
+90}
+91
+92/// A wrapper around an existing [`Input`] which compresses
+93/// the input using the Opus codec before storing it in memory.
+94///
+95/// The main purpose of this wrapper is to enable seeking on
+96/// incompatible sources and to ease resource consumption for
+97/// commonly reused/shared tracks. If only one Opus-compressed track
+98/// is playing at a time, then this removes the runtime decode cost
+99/// from the driver.
+100///
+101/// This is intended for use with larger, repeatedly used audio
+102/// tracks shared between sources, and stores the sound data
+103/// retrieved as **compressed Opus audio**.
+104///
+105/// Internally, this stores the stream and its metadata as a DCA1 file,
+106/// which can be written out to disk for later use.
+107///
+108/// [`Input`]: crate::input::Input
+109#[derive(Clone)]
+110pub struct Compressed {
+111    /// Inner shared bytestore.
+112    pub raw: TxCatcher<ToAudioBytes, OpusCompressor>,
+113}
+114
+115impl Compressed {
+116    /// Wrap an existing [`Input`] with an in-memory store, compressed using Opus.
+117    ///
+118    /// [`Input`]: Input
+119    pub async fn new(source: Input, bitrate: Bitrate) -> Result<Self, CodecCacheError> {
+120        Self::with_config(source, bitrate, None).await
+121    }
+122
+123    /// Wrap an existing [`Input`] with an in-memory store, compressed using Opus, with
+124    /// custom configuration for both Symphonia and the backing store.
+125    ///
+126    /// [`Input`]: Input
+127    pub async fn with_config(
+128        source: Input,
+129        bitrate: Bitrate,
+130        config: Option<Config>,
+131    ) -> Result<Self, CodecCacheError> {
+132        let input = match source {
+133            Input::Lazy(mut r) => {
+134                let created = if r.should_create_async() {
+135                    r.create_async().await.map_err(CodecCacheError::from)
+136                } else {
+137                    tokio::task::spawn_blocking(move || r.create().map_err(CodecCacheError::from))
+138                        .await
+139                        .map_err(CodecCacheError::from)
+140                        .and_then(|v| v)
+141                };
+142
+143                created.map(LiveInput::Raw)
+144            },
+145            Input::Live(LiveInput::Parsed(_), _) => Err(CodecCacheError::StreamNotAtStart),
+146            Input::Live(a, _rec) => Ok(a),
+147        }?;
+148
+149        let cost_per_sec = compressed_cost_per_sec(bitrate);
+150        let config = config.unwrap_or_else(|| Config::default_from_cost(cost_per_sec));
+151
+152        let promoted = tokio::task::spawn_blocking(move || {
+153            input.promote(config.codec_registry, config.format_registry)
+154        })
+155        .await??;
+156
+157        // If success, guaranteed to be Parsed
+158        let LiveInput::Parsed(mut parsed) = promoted else {
+159            unreachable!()
+160        };
+161
+162        // TODO: apply length hint.
+163        // if config.length_hint.is_none() {
+164        //     if let Some(dur) = metadata.duration {
+165        //         apply_length_hint(&mut config, dur, cost_per_sec);
+166        //     }
+167        // }
+168
+169        let track_info = parsed.decoder.codec_params();
+170        let chan_count = track_info.channels.map_or(2, SChannels::count);
+171
+172        let (channels, stereo) = if chan_count >= 2 {
+173            (Channels::Stereo, true)
+174        } else {
+175            (Channels::Mono, false)
+176        };
+177
+178        let mut encoder = OpusEncoder::new(SampleRate::Hz48000, channels, Application::Audio)?;
+179        encoder.set_bitrate(bitrate)?;
+180
+181        let codec_type = parsed.decoder.codec_params().codec;
+182        let encoding = config
+183            .codec_registry
+184            .get_codec(codec_type)
+185            .map(|v| v.short_name.to_string());
+186
+187        let format_meta_hold = parsed.format.metadata();
+188        let format_meta = format_meta_hold.current();
+189
+190        let metadata = create_metadata(
+191            &mut parsed.meta,
+192            format_meta,
+193            &encoder,
+194            chan_count as u8,
+195            encoding,
+196        )?;
+197        let mut metabytes = b"DCA1\0\0\0\0".to_vec();
+198        let orig_len = metabytes.len();
+199        serde_json::to_writer(&mut metabytes, &metadata)?;
+200        let meta_len = (metabytes.len() - orig_len)
+201            .try_into()
+202            .map_err(|_| CodecCacheError::MetadataTooLarge)?;
+203
+204        (&mut metabytes[4..][..mem::size_of::<i32>()])
+205            .write_i32::<LittleEndian>(meta_len)
+206            .expect("Magic byte writing location guaranteed to be well-founded.");
+207
+208        let source = ToAudioBytes::new(parsed, Some(2));
+209
+210        let raw = config
+211            .streamcatcher
+212            .build_tx(source, OpusCompressor::new(encoder, stereo, metabytes))?;
+213
+214        Ok(Self { raw })
+215    }
+216
+217    /// Acquire a new handle to this object, creating a new
+218    /// view of the existing cached data from the beginning.
+219    #[must_use]
+220    pub fn new_handle(&self) -> Self {
+221        Self {
+222            raw: self.raw.new_handle(),
+223        }
+224    }
+225}
+226
+227fn create_metadata(
+228    probe_metadata: &mut ProbedMetadata,
+229    track_metadata: Option<&MetadataRevision>,
+230    opus: &OpusEncoder,
+231    channels: u8,
+232    encoding: Option<String>,
+233) -> Result<DcaMetadata, CodecCacheError> {
+234    let dca = DcaInfo {
+235        version: 1,
+236        tool: Tool {
+237            name: env!("CARGO_PKG_NAME").into(),
+238            version: env!("CARGO_PKG_VERSION").into(),
+239            url: Some(env!("CARGO_PKG_HOMEPAGE").into()),
+240            author: Some(env!("CARGO_PKG_AUTHORS").into()),
+241        },
+242    };
+243
+244    let abr = match opus.bitrate()? {
+245        Bitrate::BitsPerSecond(i) => Some(i as u64),
+246        Bitrate::Auto => None,
+247        Bitrate::Max => Some(510_000),
+248    };
+249
+250    let mode = match opus.application()? {
+251        Application::Voip => "voip",
+252        Application::Audio => "music",
+253        Application::LowDelay => "lowdelay",
+254    }
+255    .to_string();
+256
+257    let sample_rate = opus.sample_rate()? as u32;
+258
+259    let opus = Opus {
+260        mode,
+261        sample_rate,
+262        frame_size: MONO_FRAME_BYTE_SIZE as u64,
+263        abr,
+264        vbr: opus.vbr()?,
+265        channels: channels.min(2),
+266    };
+267
+268    let mut origin = Origin {
+269        source: Some("file".into()),
+270        abr: None,
+271        channels: Some(channels),
+272        encoding,
+273        url: None,
+274    };
+275
+276    let mut info = Info {
+277        title: None,
+278        artist: None,
+279        album: None,
+280        genre: None,
+281        cover: None,
+282        comments: None,
+283    };
+284
+285    if let Some(meta) = probe_metadata.get() {
+286        apply_meta_to_dca(&mut info, &mut origin, meta.current());
+287    }
+288
+289    apply_meta_to_dca(&mut info, &mut origin, track_metadata);
+290
+291    Ok(DcaMetadata {
+292        dca,
+293        opus,
+294        info: Some(info),
+295        origin: Some(origin),
+296        extra: None,
+297    })
+298}
+299
+300fn apply_meta_to_dca(info: &mut Info, origin: &mut Origin, src_meta: Option<&MetadataRevision>) {
+301    if let Some(meta) = src_meta {
+302        for tag in meta.tags() {
+303            match tag.std_key {
+304                Some(StandardTagKey::Album) =>
+305                    if let Value::String(s) = &tag.value {
+306                        info.album = Some(s.clone());
+307                    },
+308                Some(StandardTagKey::Artist) =>
+309                    if let Value::String(s) = &tag.value {
+310                        info.artist = Some(s.clone());
+311                    },
+312                Some(StandardTagKey::Comment) =>
+313                    if let Value::String(s) = &tag.value {
+314                        info.comments = Some(s.clone());
+315                    },
+316                Some(StandardTagKey::Genre) =>
+317                    if let Value::String(s) = &tag.value {
+318                        info.genre = Some(s.clone());
+319                    },
+320                Some(StandardTagKey::TrackTitle) =>
+321                    if let Value::String(s) = &tag.value {
+322                        info.title = Some(s.clone());
+323                    },
+324                Some(StandardTagKey::Url | StandardTagKey::UrlSource) => {
+325                    if let Value::String(s) = &tag.value {
+326                        origin.url = Some(s.clone());
+327                    }
+328                },
+329                _ => {},
+330            }
+331        }
+332
+333        for _visual in meta.visuals() {
+334            // FIXME: will require MIME type inspection and Base64 conversion.
+335        }
+336    }
+337}
+338
+339/// Transform applied inside [`Compressed`], converting a floating-point PCM
+340/// input stream into a DCA-framed Opus stream.
+341///
+342/// Created and managed by [`Compressed`].
+343///
+344/// [`Compressed`]: Compressed
+345#[derive(Debug)]
+346pub struct OpusCompressor {
+347    prepend: Option<Cursor<Vec<u8>>>,
+348    encoder: OpusEncoder,
+349    last_frame: Vec<u8>,
+350    stereo_input: bool,
+351    frame_pos: usize,
+352    audio_bytes: AtomicUsize,
+353}
+354
+355impl OpusCompressor {
+356    fn new(encoder: OpusEncoder, stereo_input: bool, prepend: Vec<u8>) -> Self {
+357        Self {
+358            prepend: Some(Cursor::new(prepend)),
+359            encoder,
+360            last_frame: Vec::with_capacity(4000),
+361            stereo_input,
+362            frame_pos: 0,
+363            audio_bytes: AtomicUsize::default(),
+364        }
+365    }
+366}
+367
+368impl<T> Transform<T> for OpusCompressor
+369where
+370    T: Read,
+371{
+372    fn transform_read(&mut self, src: &mut T, buf: &mut [u8]) -> IoResult<TransformPosition> {
+373        if let Some(prepend) = self.prepend.as_mut() {
+374            match prepend.read(buf)? {
+375                0 => {},
+376                n => return Ok(TransformPosition::Read(n)),
+377            }
+378        }
+379
+380        self.prepend = None;
+381
+382        let output_start = mem::size_of::<u16>();
+383        let mut eof = false;
+384
+385        let mut raw_len = 0;
+386        let mut out = None;
+387        let mut sample_buf = [0f32; STEREO_FRAME_SIZE];
+388        let (samples_in_frame, interleaved_count) = if self.stereo_input {
+389            (STEREO_FRAME_SIZE, 2)
+390        } else {
+391            (MONO_FRAME_SIZE, 1)
+392        };
+393
+394        // Purge old frame and read new, if needed.
+395        if self.frame_pos == self.last_frame.len() + output_start || self.last_frame.is_empty() {
+396            self.last_frame.resize(self.last_frame.capacity(), 0);
+397
+398            // We can't use `read_f32_into` because we can't guarantee the buffer will be filled.
+399            // However, we can guarantee that reads will be channel aligned at least!
+400            for el in sample_buf[..samples_in_frame].chunks_mut(interleaved_count) {
+401                match src.read_f32_into::<LittleEndian>(el) {
+402                    Ok(()) => {
+403                        raw_len += interleaved_count;
+404                    },
+405                    Err(e) if e.kind() == IoErrorKind::UnexpectedEof => {
+406                        eof = true;
+407                        break;
+408                    },
+409                    Err(e) => {
+410                        out = Some(Err(e));
+411                        break;
+412                    },
+413                }
+414            }
+415
+416            if out.is_none() && raw_len > 0 {
+417                loop {
+418                    // NOTE: we don't index by raw_len because the last frame can be too small
+419                    // to occupy a "whole packet". Zero-padding is the correct behaviour.
+420                    match self
+421                        .encoder
+422                        .encode_float(&sample_buf[..samples_in_frame], &mut self.last_frame[..])
+423                    {
+424                        Ok(pkt_len) => {
+425                            trace!("Next packet to write has {:?}", pkt_len);
+426                            self.frame_pos = 0;
+427                            self.last_frame.truncate(pkt_len);
+428                            break;
+429                        },
+430                        Err(OpusError::Opus(OpusErrorCode::BufferTooSmall)) => {
+431                            // If we need more capacity to encode this frame, then take it.
+432                            trace!("Resizing inner buffer (+256).");
+433                            self.last_frame.resize(self.last_frame.len() + 256, 0);
+434                        },
+435                        Err(e) => {
+436                            debug!("Read error {:?} {:?} {:?}.", e, out, raw_len);
+437                            out = Some(Err(IoError::other(e)));
+438                            break;
+439                        },
+440                    }
+441                }
+442            }
+443        }
+444
+445        if out.is_none() {
+446            // Write from frame we have.
+447            let start = if self.frame_pos < output_start {
+448                (&mut buf[..output_start])
+449                    .write_i16::<LittleEndian>(self.last_frame.len() as i16)
+450                    .expect(
+451                        "Minimum bytes requirement for Opus (2) should mean that an i16 \
+452                             may always be written.",
+453                    );
+454                self.frame_pos += output_start;
+455
+456                trace!("Wrote frame header: {}.", self.last_frame.len());
+457
+458                output_start
+459            } else {
+460                0
+461            };
+462
+463            let out_pos = self.frame_pos - output_start;
+464            let remaining = self.last_frame.len() - out_pos;
+465            let write_len = remaining.min(buf.len() - start);
+466            buf[start..start + write_len]
+467                .copy_from_slice(&self.last_frame[out_pos..out_pos + write_len]);
+468            self.frame_pos += write_len;
+469            trace!("Appended {} to inner store", write_len);
+470            out = Some(Ok(write_len + start));
+471        }
+472
+473        // NOTE: use of raw_len here preserves true sample length even if
+474        // stream is extended to 20ms boundary.
+475        out.unwrap_or_else(|| Err(IoError::other("Unclear.")))
+476            .map(|compressed_sz| {
+477                self.audio_bytes
+478                    .fetch_add(raw_len * mem::size_of::<f32>(), Ordering::Release);
+479
+480                if eof {
+481                    TransformPosition::Finished
+482                } else {
+483                    TransformPosition::Read(compressed_sz)
+484                }
+485            })
+486    }
+487}
+488
+489impl NeedsBytes for OpusCompressor {
+490    fn min_bytes_required(&self) -> usize {
+491        2
+492    }
+493}
+494
+495impl Stateful for OpusCompressor {
+496    type State = usize;
+497
+498    fn state(&self) -> Self::State {
+499        self.audio_bytes.load(Ordering::Acquire)
+500    }
+501}
+502
+503impl Read for Compressed {
+504    fn read(&mut self, buf: &mut [u8]) -> IoResult<usize> {
+505        self.raw.read(buf)
+506    }
+507}
+508
+509impl Seek for Compressed {
+510    fn seek(&mut self, pos: SeekFrom) -> IoResult<u64> {
+511        self.raw.seek(pos)
+512    }
+513}
+514
+515impl MediaSource for Compressed {
+516    fn is_seekable(&self) -> bool {
+517        true
+518    }
+519
+520    fn byte_len(&self) -> Option<u64> {
+521        if self.raw.is_finished() {
+522            Some(self.raw.len() as u64)
+523        } else {
+524            None
+525        }
+526    }
+527}
+528
+529impl From<Compressed> for Input {
+530    fn from(val: Compressed) -> Input {
+531        let input = Box::new(val);
+532        Input::Live(LiveInput::Raw(AudioStream { input, hint: None }), None)
+533    }
+534}
\ No newline at end of file diff --git a/next/src/songbird/input/adapters/cached/decompressed.rs.html b/next/src/songbird/input/adapters/cached/decompressed.rs.html new file mode 100644 index 0000000..90dd04c --- /dev/null +++ b/next/src/songbird/input/adapters/cached/decompressed.rs.html @@ -0,0 +1,140 @@ +decompressed.rs - source

songbird/input/adapters/cached/
decompressed.rs

1use super::{compressed::Config, CodecCacheError, ToAudioBytes};
+2use crate::{
+3    constants::SAMPLE_RATE_RAW,
+4    input::{AudioStream, Input, LiveInput, RawAdapter},
+5};
+6use std::io::{Read, Result as IoResult, Seek, SeekFrom};
+7use streamcatcher::Catcher;
+8use symphonia_core::{audio::Channels, io::MediaSource};
+9
+10/// A wrapper around an existing [`Input`] which caches
+11/// the decoded and converted audio data locally in memory
+12/// as `f32`-format PCM data.
+13///
+14/// The main purpose of this wrapper is to enable seeking on
+15/// incompatible sources (i.e., ffmpeg output) and to ease resource
+16/// consumption for commonly reused/shared tracks. [`Compressed`]
+17/// offers similar functionality with different
+18/// tradeoffs.
+19///
+20/// This is intended for use with small, repeatedly used audio
+21/// tracks shared between sources, and stores the sound data
+22/// retrieved in **uncompressed floating point** form to minimise the
+23/// cost of audio processing when mixing several tracks together.
+24/// This must be used sparingly: these cost a significant
+25/// *3 Mbps (375 kiB/s)*, or 131 MiB of RAM for a 6 minute song.
+26///
+27/// [`Input`]: crate::input::Input
+28/// [`Compressed`]: super::Compressed
+29#[derive(Clone)]
+30pub struct Decompressed {
+31    /// Inner shared bytestore.
+32    pub raw: Catcher<RawAdapter<ToAudioBytes>>,
+33}
+34
+35impl Decompressed {
+36    /// Wrap an existing [`Input`] with an in-memory store, decompressed into `f32` PCM audio.
+37    ///
+38    /// [`Input`]: Input
+39    pub async fn new(source: Input) -> Result<Self, CodecCacheError> {
+40        Self::with_config(source, None).await
+41    }
+42
+43    /// Wrap an existing [`Input`] with an in-memory store, decompressed into `f32` PCM audio,
+44    /// with custom configuration for both Symphonia and the backing store.
+45    ///
+46    /// [`Input`]: Input
+47    pub async fn with_config(
+48        source: Input,
+49        config: Option<Config>,
+50    ) -> Result<Self, CodecCacheError> {
+51        let input = match source {
+52            Input::Lazy(mut r) => {
+53                let created = if r.should_create_async() {
+54                    r.create_async().await.map_err(CodecCacheError::from)
+55                } else {
+56                    tokio::task::spawn_blocking(move || r.create().map_err(CodecCacheError::from))
+57                        .await
+58                        .map_err(CodecCacheError::from)
+59                        .and_then(|v| v)
+60                };
+61
+62                created.map(LiveInput::Raw)
+63            },
+64            Input::Live(LiveInput::Parsed(_), _) => Err(CodecCacheError::StreamNotAtStart),
+65            Input::Live(a, _rec) => Ok(a),
+66        }?;
+67
+68        let cost_per_sec = super::raw_cost_per_sec(true);
+69        let config = config.unwrap_or_else(|| Config::default_from_cost(cost_per_sec));
+70
+71        let promoted = tokio::task::spawn_blocking(move || {
+72            input.promote(config.codec_registry, config.format_registry)
+73        })
+74        .await??;
+75
+76        // If success, guaranteed to be Parsed
+77        let LiveInput::Parsed(parsed) = promoted else {
+78            unreachable!()
+79        };
+80
+81        let track_info = parsed.decoder.codec_params();
+82        let chan_count = track_info
+83            .channels
+84            .map(Channels::count)
+85            .ok_or(CodecCacheError::UnknownChannelCount)?;
+86        let sample_rate = SAMPLE_RATE_RAW as u32;
+87
+88        let source = RawAdapter::new(
+89            ToAudioBytes::new(parsed, Some(chan_count)),
+90            sample_rate,
+91            chan_count as u32,
+92        );
+93
+94        let raw = config.streamcatcher.build(source)?;
+95
+96        Ok(Self { raw })
+97    }
+98
+99    /// Acquire a new handle to this object, creating a new
+100    /// view of the existing cached data from the beginning.
+101    #[must_use]
+102    pub fn new_handle(&self) -> Self {
+103        Self {
+104            raw: self.raw.new_handle(),
+105        }
+106    }
+107}
+108
+109impl Read for Decompressed {
+110    fn read(&mut self, buf: &mut [u8]) -> IoResult<usize> {
+111        self.raw.read(buf)
+112    }
+113}
+114
+115impl Seek for Decompressed {
+116    fn seek(&mut self, pos: SeekFrom) -> IoResult<u64> {
+117        self.raw.seek(pos)
+118    }
+119}
+120
+121impl MediaSource for Decompressed {
+122    fn is_seekable(&self) -> bool {
+123        true
+124    }
+125
+126    fn byte_len(&self) -> Option<u64> {
+127        if self.raw.is_finished() {
+128            Some(self.raw.len() as u64)
+129        } else {
+130            None
+131        }
+132    }
+133}
+134
+135impl From<Decompressed> for Input {
+136    fn from(val: Decompressed) -> Input {
+137        let input = Box::new(val);
+138        Input::Live(LiveInput::Raw(AudioStream { input, hint: None }), None)
+139    }
+140}
\ No newline at end of file diff --git a/next/src/songbird/input/adapters/cached/error.rs.html b/next/src/songbird/input/adapters/cached/error.rs.html new file mode 100644 index 0000000..d461386 --- /dev/null +++ b/next/src/songbird/input/adapters/cached/error.rs.html @@ -0,0 +1,144 @@ +error.rs - source

songbird/input/adapters/cached/
error.rs

1use crate::{error::JsonError, input::AudioStreamError};
+2use audiopus::error::Error as OpusError;
+3use std::{
+4    error::Error as StdError,
+5    fmt::{Display, Formatter, Result as FmtResult},
+6};
+7use streamcatcher::CatcherError;
+8use symphonia_core::errors::Error as SymphError;
+9use tokio::task::JoinError;
+10
+11/// Errors encountered using a [`Memory`] cached source.
+12///
+13/// [`Memory`]: super::Memory
+14#[derive(Debug)]
+15pub enum Error {
+16    /// The audio stream could not be created.
+17    Create(AudioStreamError),
+18    /// The audio stream failed to be created due to a panic in `spawn_blocking`.
+19    CreatePanicked,
+20    /// Streamcatcher's configuration was illegal, and the cache could not be created.
+21    Streamcatcher(CatcherError),
+22    /// The input stream had already been read (i.e., `Parsed`) and so the whole stream
+23    /// could not be used.
+24    StreamNotAtStart,
+25}
+26
+27impl Display for Error {
+28    fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
+29        match self {
+30            Self::Create(c) => f.write_fmt(format_args!("failed to create audio stream: {c}")),
+31            Self::CreatePanicked => f.write_str("sync thread panicked while creating stream"),
+32            Self::Streamcatcher(s) =>
+33                f.write_fmt(format_args!("illegal streamcatcher config: {s}")),
+34            Self::StreamNotAtStart =>
+35                f.write_str("stream cannot have been pre-read/parsed, missing headers"),
+36        }
+37    }
+38}
+39
+40impl StdError for Error {}
+41
+42impl From<AudioStreamError> for Error {
+43    fn from(val: AudioStreamError) -> Self {
+44        Self::Create(val)
+45    }
+46}
+47
+48impl From<CatcherError> for Error {
+49    fn from(val: CatcherError) -> Self {
+50        Self::Streamcatcher(val)
+51    }
+52}
+53
+54impl From<JoinError> for Error {
+55    fn from(_val: JoinError) -> Self {
+56        Self::CreatePanicked
+57    }
+58}
+59
+60/// Errors encountered using a [`Compressed`] or [`Decompressed`] cached source.
+61///
+62/// [`Compressed`]: super::Compressed
+63/// [`Decompressed`]: super::Decompressed
+64#[derive(Debug)]
+65pub enum CodecCacheError {
+66    /// The audio stream could not be created.
+67    Create(AudioStreamError),
+68    /// Symphonia failed to parse the container or decode the default stream.
+69    Parse(SymphError),
+70    /// The Opus encoder could not be created.
+71    Opus(OpusError),
+72    /// The file's metadata could not be converted to JSON.
+73    MetadataEncoding(JsonError),
+74    /// The input's metadata was too large after conversion to JSON to fit in a DCA file.
+75    MetadataTooLarge,
+76    /// The audio stream failed to be created due to a panic in `spawn_blocking`.
+77    CreatePanicked,
+78    /// The audio stream's channel count could not be determined.
+79    UnknownChannelCount,
+80    /// Streamcatcher's configuration was illegal, and the cache could not be created.
+81    Streamcatcher(CatcherError),
+82    /// The input stream had already been read (i.e., `Parsed`) and so the whole stream
+83    /// could not be used.
+84    StreamNotAtStart,
+85}
+86
+87impl Display for CodecCacheError {
+88    fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
+89        match self {
+90            Self::Create(c) => f.write_fmt(format_args!("failed to create audio stream: {c}")),
+91            Self::Parse(p) => f.write_fmt(format_args!("failed to parse audio format: {p}")),
+92            Self::Opus(o) => f.write_fmt(format_args!("failed to create Opus encoder: {o}")),
+93            Self::MetadataEncoding(m) => f.write_fmt(format_args!(
+94                "failed to convert track metadata to JSON: {m}"
+95            )),
+96            Self::MetadataTooLarge => f.write_str("track metadata was too large, >= 32kiB"),
+97            Self::CreatePanicked => f.write_str("sync thread panicked while creating stream"),
+98            Self::UnknownChannelCount =>
+99                f.write_str("audio stream's channel count could not be determined"),
+100            Self::Streamcatcher(s) =>
+101                f.write_fmt(format_args!("illegal streamcatcher config: {s}")),
+102            Self::StreamNotAtStart =>
+103                f.write_str("stream cannot have been pre-read/parsed, missing headers"),
+104        }
+105    }
+106}
+107
+108impl StdError for CodecCacheError {}
+109
+110impl From<AudioStreamError> for CodecCacheError {
+111    fn from(val: AudioStreamError) -> Self {
+112        Self::Create(val)
+113    }
+114}
+115
+116impl From<CatcherError> for CodecCacheError {
+117    fn from(val: CatcherError) -> Self {
+118        Self::Streamcatcher(val)
+119    }
+120}
+121
+122impl From<JoinError> for CodecCacheError {
+123    fn from(_val: JoinError) -> Self {
+124        Self::CreatePanicked
+125    }
+126}
+127
+128impl From<JsonError> for CodecCacheError {
+129    fn from(val: JsonError) -> Self {
+130        Self::MetadataEncoding(val)
+131    }
+132}
+133
+134impl From<OpusError> for CodecCacheError {
+135    fn from(val: OpusError) -> Self {
+136        Self::Opus(val)
+137    }
+138}
+139
+140impl From<SymphError> for CodecCacheError {
+141    fn from(val: SymphError) -> Self {
+142        Self::Parse(val)
+143    }
+144}
\ No newline at end of file diff --git a/next/src/songbird/input/adapters/cached/hint.rs.html b/next/src/songbird/input/adapters/cached/hint.rs.html new file mode 100644 index 0000000..c7ba009 --- /dev/null +++ b/next/src/songbird/input/adapters/cached/hint.rs.html @@ -0,0 +1,40 @@ +hint.rs - source

songbird/input/adapters/cached/
hint.rs

1use std::time::Duration;
+2use streamcatcher::Config;
+3
+4/// Expected amount of time that an input should last.
+5#[derive(Copy, Clone, Debug)]
+6pub enum LengthHint {
+7    /// Estimate of a source's length in bytes.
+8    Bytes(usize),
+9    /// Estimate of a source's length in time.
+10    ///
+11    /// This will be converted to a bytecount at setup.
+12    Time(Duration),
+13}
+14
+15impl From<usize> for LengthHint {
+16    fn from(size: usize) -> Self {
+17        LengthHint::Bytes(size)
+18    }
+19}
+20
+21impl From<Duration> for LengthHint {
+22    fn from(size: Duration) -> Self {
+23        LengthHint::Time(size)
+24    }
+25}
+26
+27/// Modify the given cache configuration to initially allocate
+28/// enough bytes to store a length of audio at the given bitrate.
+29pub fn apply_length_hint<H>(config: &mut Config, hint: H, cost_per_sec: usize)
+30where
+31    H: Into<LengthHint>,
+32{
+33    config.length_hint = Some(match hint.into() {
+34        LengthHint::Bytes(a) => a,
+35        LengthHint::Time(t) => {
+36            let s = t.as_secs() + u64::from(t.subsec_millis() > 0);
+37            (s as usize) * cost_per_sec
+38        },
+39    });
+40}
\ No newline at end of file diff --git a/next/src/songbird/input/adapters/cached/memory.rs.html b/next/src/songbird/input/adapters/cached/memory.rs.html new file mode 100644 index 0000000..5b8059b --- /dev/null +++ b/next/src/songbird/input/adapters/cached/memory.rs.html @@ -0,0 +1,111 @@ +memory.rs - source

songbird/input/adapters/cached/
memory.rs

1use super::{default_config, raw_cost_per_sec, Error};
+2use crate::input::{AudioStream, Input, LiveInput};
+3use std::io::{Read, Result as IoResult, Seek};
+4use streamcatcher::{Catcher, Config};
+5use symphonia_core::io::MediaSource;
+6
+7/// A wrapper around an existing [`Input`] which caches its data
+8/// in memory.
+9///
+10/// The main purpose of this wrapper is to enable fast seeking on
+11/// incompatible sources (i.e., HTTP streams) and to ease resource
+12/// consumption for commonly reused/shared tracks.
+13///
+14/// This consumes exactly as many bytes of memory as the input stream contains.
+15///
+16/// [`Input`]: Input
+17#[derive(Clone)]
+18pub struct Memory {
+19    /// Inner shared bytestore.
+20    pub raw: Catcher<Box<dyn MediaSource>>,
+21}
+22
+23impl Memory {
+24    /// Wrap an existing [`Input`] with an in-memory store with the same codec and framing.
+25    ///
+26    /// [`Input`]: Input
+27    pub async fn new(source: Input) -> Result<Self, Error> {
+28        Self::with_config(source, None).await
+29    }
+30
+31    /// Wrap an existing [`Input`] with an in-memory store with the same codec and framing.
+32    ///
+33    /// `length_hint` may be used to control the size of the initial chunk, preventing
+34    /// needless allocations and copies.
+35    ///
+36    /// [`Input`]: Input
+37    pub async fn with_config(source: Input, config: Option<Config>) -> Result<Self, Error> {
+38        let input = match source {
+39            Input::Lazy(mut r) => {
+40                let created = if r.should_create_async() {
+41                    r.create_async().await
+42                } else {
+43                    tokio::task::spawn_blocking(move || r.create()).await?
+44                };
+45
+46                created.map(|v| v.input).map_err(Error::from)
+47            },
+48            Input::Live(LiveInput::Raw(a), _rec) => Ok(a.input),
+49            Input::Live(LiveInput::Wrapped(a), _rec) =>
+50                Ok(Box::new(a.input) as Box<dyn MediaSource>),
+51            Input::Live(LiveInput::Parsed(_), _) => Err(Error::StreamNotAtStart),
+52        }?;
+53
+54        let cost_per_sec = raw_cost_per_sec(true);
+55
+56        let config = config.unwrap_or_else(|| default_config(cost_per_sec));
+57
+58        // TODO: apply length hint.
+59        // if config.length_hint.is_none() {
+60        //     if let Some(dur) = metadata.duration {
+61        //         apply_length_hint(&mut config, dur, cost_per_sec);
+62        //     }
+63        // }
+64
+65        let raw = config.build(input)?;
+66
+67        Ok(Self { raw })
+68    }
+69
+70    /// Acquire a new handle to this object, creating a new
+71    /// view of the existing cached data from the beginning.
+72    #[must_use]
+73    pub fn new_handle(&self) -> Self {
+74        Self {
+75            raw: self.raw.new_handle(),
+76        }
+77    }
+78}
+79
+80impl Read for Memory {
+81    fn read(&mut self, buf: &mut [u8]) -> IoResult<usize> {
+82        self.raw.read(buf)
+83    }
+84}
+85
+86impl Seek for Memory {
+87    fn seek(&mut self, pos: std::io::SeekFrom) -> IoResult<u64> {
+88        self.raw.seek(pos)
+89    }
+90}
+91
+92impl MediaSource for Memory {
+93    fn is_seekable(&self) -> bool {
+94        true
+95    }
+96
+97    fn byte_len(&self) -> Option<u64> {
+98        if self.raw.is_finished() {
+99            Some(self.raw.len() as u64)
+100        } else {
+101            None
+102        }
+103    }
+104}
+105
+106impl From<Memory> for Input {
+107    fn from(val: Memory) -> Input {
+108        let input = Box::new(val);
+109        Input::Live(LiveInput::Raw(AudioStream { input, hint: None }), None)
+110    }
+111}
\ No newline at end of file diff --git a/next/src/songbird/input/adapters/cached/mod.rs.html b/next/src/songbird/input/adapters/cached/mod.rs.html new file mode 100644 index 0000000..5114a78 --- /dev/null +++ b/next/src/songbird/input/adapters/cached/mod.rs.html @@ -0,0 +1,49 @@ +mod.rs - source

songbird/input/adapters/cached/
mod.rs

1//! In-memory, shared input sources for reuse between calls, fast seeking, and
+2//! direct Opus frame passthrough.
+3
+4mod compressed;
+5mod decompressed;
+6mod error;
+7mod hint;
+8mod memory;
+9mod util;
+10
+11pub(crate) use self::util::*;
+12pub use self::{compressed::*, decompressed::*, error::*, hint::*, memory::*};
+13
+14use crate::constants::*;
+15use crate::input::utils;
+16use audiopus::Bitrate;
+17use std::{mem, time::Duration};
+18use streamcatcher::{Config as ScConfig, GrowthStrategy};
+19
+20/// Estimates the cost, in B/s, of audio data compressed at the given bitrate.
+21#[must_use]
+22pub fn compressed_cost_per_sec(bitrate: Bitrate) -> usize {
+23    let framing_cost_per_sec = AUDIO_FRAME_RATE * mem::size_of::<u16>();
+24
+25    let bitrate_raw = match bitrate {
+26        Bitrate::BitsPerSecond(i) => i,
+27        Bitrate::Auto => 64_000,
+28        Bitrate::Max => 512_000,
+29    } as usize;
+30
+31    (bitrate_raw / 8) + framing_cost_per_sec
+32}
+33
+34/// Calculates the cost, in B/s, of raw floating-point audio data.
+35#[must_use]
+36pub fn raw_cost_per_sec(stereo: bool) -> usize {
+37    utils::timestamp_to_byte_count(Duration::from_secs(1), stereo)
+38}
+39
+40/// Provides the default config used by a cached source.
+41///
+42/// This maps to the default configuration in [`streamcatcher`], using
+43/// a constant chunk size of 5s worth of audio at the given bitrate estimate.
+44///
+45/// [`streamcatcher`]: https://docs.rs/streamcatcher/0.1.0/streamcatcher/struct.Config.html
+46#[must_use]
+47pub fn default_config(cost_per_sec: usize) -> ScConfig {
+48    ScConfig::new().chunk_size(GrowthStrategy::Constant(5 * cost_per_sec))
+49}
\ No newline at end of file diff --git a/next/src/songbird/input/adapters/cached/util.rs.html b/next/src/songbird/input/adapters/cached/util.rs.html new file mode 100644 index 0000000..1e380bb --- /dev/null +++ b/next/src/songbird/input/adapters/cached/util.rs.html @@ -0,0 +1,458 @@ +util.rs - source

songbird/input/adapters/cached/
util.rs

1use crate::{constants::*, driver::tasks::mixer::mix_logic, input::Parsed};
+2
+3use byteorder::{LittleEndian, WriteBytesExt};
+4use rubato::{FftFixedOut, Resampler};
+5use std::{
+6    io::{ErrorKind as IoErrorKind, Read, Result as IoResult, Seek, Write},
+7    mem,
+8    ops::Range,
+9};
+10use symphonia_core::{
+11    audio::{AudioBuffer, AudioBufferRef, Layout, Signal, SignalSpec},
+12    conv::IntoSample,
+13    io::MediaSource,
+14    sample::Sample,
+15};
+16
+17const SAMPLE_LEN: usize = mem::size_of::<f32>();
+18
+19/// Adapter for Symphonia sources into an interleaved f32 bytestream.
+20///
+21/// This will output `f32`s in LE byte order, matching the channel count
+22/// of the input.
+23pub struct ToAudioBytes {
+24    chan_count: usize,
+25    chan_limit: usize,
+26    parsed: Parsed,
+27    /// Position with parsed's last decoded frame.
+28    inner_pos: Range<usize>,
+29    resample: Option<ResampleState>,
+30    done: bool,
+31
+32    interrupted_samples: Vec<f32>,
+33    interrupted_byte_pos: Range<usize>,
+34}
+35
+36struct ResampleState {
+37    /// Used to hold outputs from resampling, *ready to be used*.
+38    resampled_data: Vec<Vec<f32>>,
+39    /// The actual resampler.
+40    resampler: FftFixedOut<f32>,
+41    /// Used to hold inputs to resampler across packet boundaries.
+42    scratch: AudioBuffer<f32>,
+43    /// The range of floats in `resampled_data` which have not yet
+44    /// been read.
+45    resample_pos: Range<usize>,
+46}
+47
+48impl ToAudioBytes {
+49    pub fn new(parsed: Parsed, chan_limit: Option<usize>) -> Self {
+50        let track_info = parsed.decoder.codec_params();
+51        let sample_rate = track_info.sample_rate.unwrap_or(SAMPLE_RATE_RAW as u32);
+52        let maybe_layout = track_info.channel_layout;
+53        let maybe_chans = track_info.channels;
+54
+55        let chan_count = if let Some(chans) = maybe_chans {
+56            chans.count()
+57        } else if let Some(layout) = maybe_layout {
+58            match layout {
+59                Layout::Mono => 1,
+60                Layout::Stereo => 2,
+61                Layout::TwoPointOne => 3,
+62                Layout::FivePointOne => 6,
+63            }
+64        } else {
+65            2
+66        };
+67
+68        let chan_limit = chan_limit.unwrap_or(chan_count);
+69
+70        let resample = (sample_rate != SAMPLE_RATE_RAW as u32).then(|| {
+71            let spec = if let Some(chans) = maybe_chans {
+72                SignalSpec::new(SAMPLE_RATE_RAW as u32, chans)
+73            } else if let Some(layout) = maybe_layout {
+74                SignalSpec::new_with_layout(SAMPLE_RATE_RAW as u32, layout)
+75            } else {
+76                SignalSpec::new_with_layout(SAMPLE_RATE_RAW as u32, Layout::Stereo)
+77            };
+78
+79            let scratch = AudioBuffer::<f32>::new(MONO_FRAME_SIZE as u64, spec);
+80
+81            // TODO: integ. error handling here.
+82            let resampler = FftFixedOut::new(
+83                sample_rate as usize,
+84                SAMPLE_RATE_RAW,
+85                RESAMPLE_OUTPUT_FRAME_SIZE,
+86                4,
+87                chan_count,
+88            )
+89            .expect("Failed to create resampler.");
+90
+91            let resampled_data = resampler.output_buffer_allocate(true);
+92
+93            ResampleState {
+94                resampled_data,
+95                resampler,
+96                scratch,
+97                resample_pos: 0..0,
+98            }
+99        });
+100
+101        Self {
+102            chan_count,
+103            chan_limit,
+104            parsed,
+105            inner_pos: 0..0,
+106            resample,
+107            done: false,
+108
+109            interrupted_samples: Vec::with_capacity(chan_count),
+110            interrupted_byte_pos: 0..0,
+111        }
+112    }
+113
+114    pub fn num_channels(&self) -> usize {
+115        self.chan_count.min(self.chan_limit)
+116    }
+117
+118    fn is_done(&self) -> bool {
+119        self.done
+120            && self.inner_pos.is_empty()
+121            && self.resample.as_ref().map_or(true, |v| {
+122                v.scratch.frames() == 0 && v.resample_pos.is_empty()
+123            })
+124            && self.interrupted_byte_pos.is_empty()
+125    }
+126}
+127
+128impl Read for ToAudioBytes {
+129    fn read(&mut self, mut buf: &mut [u8]) -> IoResult<usize> {
+130        // NOTE: this is disturbingly similar to the mixer code, but different enough that we can't
+131        // just reuse it freely.
+132        let orig_sz = buf.len();
+133        let num_chans = self.num_channels();
+134
+135        while !buf.is_empty() && !self.is_done() {
+136            // Work to clear interrupted channel floats.
+137            while !buf.is_empty() && !self.interrupted_byte_pos.is_empty() {
+138                let index_of_first_f32 = self.interrupted_byte_pos.start / SAMPLE_LEN;
+139                let f32_inner_pos = self.interrupted_byte_pos.start % SAMPLE_LEN;
+140                let f32_bytes_remaining = SAMPLE_LEN - f32_inner_pos;
+141                let to_write = f32_bytes_remaining.min(buf.len());
+142
+143                let bytes = self.interrupted_samples[index_of_first_f32].to_le_bytes();
+144                let written = buf.write(&bytes[f32_inner_pos..][..to_write])?;
+145                self.interrupted_byte_pos.start += written;
+146            }
+147
+148            // Clear out already produced resampled floats.
+149            if let Some(resample) = self.resample.as_mut() {
+150                if !buf.is_empty() && !resample.resample_pos.is_empty() {
+151                    let bytes_advanced = write_resample_buffer(
+152                        &resample.resampled_data,
+153                        buf,
+154                        &mut resample.resample_pos,
+155                        &mut self.interrupted_samples,
+156                        &mut self.interrupted_byte_pos,
+157                        num_chans,
+158                    );
+159
+160                    buf = &mut buf[bytes_advanced..];
+161                }
+162
+163                if !resample.resample_pos.is_empty() {
+164                    continue;
+165                }
+166            }
+167
+168            // Now work with new packets.
+169            let source_packet = if !self.inner_pos.is_empty() {
+170                Some(self.parsed.decoder.last_decoded())
+171            } else if let Ok(pkt) = self.parsed.format.next_packet() {
+172                if pkt.track_id() != self.parsed.track_id {
+173                    continue;
+174                }
+175
+176                self.parsed
+177                    .decoder
+178                    .decode(&pkt)
+179                    .map(|pkt| {
+180                        self.inner_pos = 0..pkt.frames();
+181                        pkt
+182                    })
+183                    .ok()
+184            } else {
+185                // EOF.
+186                None
+187            };
+188
+189            if source_packet.is_none() {
+190                self.done = true;
+191
+192                if let Some(resample) = self.resample.as_mut() {
+193                    if resample.scratch.frames() != 0 {
+194                        let data = &mut resample.resampled_data;
+195                        let resampler = &mut resample.resampler;
+196                        let in_len = resample.scratch.frames();
+197                        let to_render = resampler.input_frames_next().saturating_sub(in_len);
+198
+199                        if to_render != 0 {
+200                            resample.scratch.render_reserved(Some(to_render));
+201                            for plane in resample.scratch.planes_mut().planes() {
+202                                for val in &mut plane[in_len..] {
+203                                    *val = 0.0f32;
+204                                }
+205                            }
+206                        }
+207
+208                        // Luckily, we make use of the WHOLE input buffer here.
+209                        resampler
+210                            .process_into_buffer(resample.scratch.planes().planes(), data, None)
+211                            .unwrap();
+212
+213                        // Calculate true end position using sample rate math
+214                        let ratio = (data[0].len() as f32) / (resample.scratch.frames() as f32);
+215                        let out_samples = (ratio * (in_len as f32)).round() as usize;
+216
+217                        resample.scratch.clear();
+218                        resample.resample_pos = 0..out_samples;
+219                    }
+220                }
+221
+222                // Now go back and make use of the buffer.
+223                // We have to do this here because we can't make any guarantees about
+224                // the read site having enough space to hold all samples etc.
+225                continue;
+226            }
+227
+228            let source_packet = source_packet.unwrap();
+229
+230            if let Some(resample) = self.resample.as_mut() {
+231                // Do a resample using the newest packet.
+232                let pkt_frames = source_packet.frames();
+233
+234                if pkt_frames == 0 {
+235                    continue;
+236                }
+237
+238                let needed_in_frames = resample.resampler.input_frames_next();
+239                let available_frames = self.inner_pos.len();
+240
+241                let force_copy =
+242                    resample.scratch.frames() != 0 || needed_in_frames > available_frames;
+243
+244                if (!force_copy) && matches!(source_packet, AudioBufferRef::F32(_)) {
+245                    // This is the only case where we can pull off a straight resample...
+246                    // I.e., skip scratch.
+247
+248                    // NOTE: if let needed as if-let && {bool} is nightly only.
+249                    if let AudioBufferRef::F32(s_pkt) = source_packet {
+250                        let refs: Vec<&[f32]> = s_pkt
+251                            .planes()
+252                            .planes()
+253                            .iter()
+254                            .map(|s| &s[self.inner_pos.start..][..needed_in_frames])
+255                            .collect();
+256
+257                        self.inner_pos.start += needed_in_frames;
+258
+259                        resample
+260                            .resampler
+261                            .process_into_buffer(&refs, &mut resample.resampled_data, None)
+262                            .unwrap();
+263                    } else {
+264                        unreachable!()
+265                    }
+266                } else {
+267                    // We either lack enough samples, or have the wrong data format, forcing
+268                    // a conversion/copy into scratch.
+269
+270                    let old_scratch_len = resample.scratch.frames();
+271                    let missing_frames = needed_in_frames - old_scratch_len;
+272                    let frames_to_take = available_frames.min(missing_frames);
+273
+274                    resample.scratch.render_reserved(Some(frames_to_take));
+275                    mix_logic::copy_into_resampler(
+276                        &source_packet,
+277                        &mut resample.scratch,
+278                        self.inner_pos.start,
+279                        old_scratch_len,
+280                        frames_to_take,
+281                    );
+282
+283                    self.inner_pos.start += frames_to_take;
+284
+285                    if resample.scratch.frames() == needed_in_frames {
+286                        resample
+287                            .resampler
+288                            .process_into_buffer(
+289                                resample.scratch.planes().planes(),
+290                                &mut resample.resampled_data,
+291                                None,
+292                            )
+293                            .unwrap();
+294                        resample.scratch.clear();
+295                    } else {
+296                        continue;
+297                    }
+298                }
+299
+300                resample.resample_pos = 0..resample.resampled_data[0].len();
+301            } else {
+302                // Newest packet may be used straight away: just convert format
+303                // to ensure it's f32.
+304                let bytes_advanced = write_out(
+305                    &source_packet,
+306                    buf,
+307                    &mut self.inner_pos,
+308                    &mut self.interrupted_samples,
+309                    &mut self.interrupted_byte_pos,
+310                    num_chans,
+311                );
+312
+313                buf = &mut buf[bytes_advanced..];
+314            }
+315        }
+316        Ok(orig_sz - buf.len())
+317    }
+318}
+319
+320impl Seek for ToAudioBytes {
+321    fn seek(&mut self, _pos: std::io::SeekFrom) -> IoResult<u64> {
+322        Err(IoErrorKind::Unsupported.into())
+323    }
+324}
+325
+326impl MediaSource for ToAudioBytes {
+327    fn is_seekable(&self) -> bool {
+328        false
+329    }
+330
+331    fn byte_len(&self) -> Option<u64> {
+332        None
+333    }
+334}
+335
+336#[inline]
+337fn write_out(
+338    source: &AudioBufferRef<'_>,
+339    target: &mut [u8],
+340    source_pos: &mut Range<usize>,
+341    spillover: &mut Vec<f32>,
+342    spill_range: &mut Range<usize>,
+343    num_chans: usize,
+344) -> usize {
+345    match source {
+346        AudioBufferRef::U8(v) =>
+347            write_symph_buffer(v, target, source_pos, spillover, spill_range, num_chans),
+348        AudioBufferRef::U16(v) =>
+349            write_symph_buffer(v, target, source_pos, spillover, spill_range, num_chans),
+350        AudioBufferRef::U24(v) =>
+351            write_symph_buffer(v, target, source_pos, spillover, spill_range, num_chans),
+352        AudioBufferRef::U32(v) =>
+353            write_symph_buffer(v, target, source_pos, spillover, spill_range, num_chans),
+354        AudioBufferRef::S8(v) =>
+355            write_symph_buffer(v, target, source_pos, spillover, spill_range, num_chans),
+356        AudioBufferRef::S16(v) =>
+357            write_symph_buffer(v, target, source_pos, spillover, spill_range, num_chans),
+358        AudioBufferRef::S24(v) =>
+359            write_symph_buffer(v, target, source_pos, spillover, spill_range, num_chans),
+360        AudioBufferRef::S32(v) =>
+361            write_symph_buffer(v, target, source_pos, spillover, spill_range, num_chans),
+362        AudioBufferRef::F32(v) =>
+363            write_symph_buffer(v, target, source_pos, spillover, spill_range, num_chans),
+364        AudioBufferRef::F64(v) =>
+365            write_symph_buffer(v, target, source_pos, spillover, spill_range, num_chans),
+366    }
+367}
+368
+369#[inline]
+370fn write_symph_buffer<S>(
+371    source: &AudioBuffer<S>,
+372    buf: &mut [u8],
+373    source_pos: &mut Range<usize>,
+374    spillover: &mut Vec<f32>,
+375    spill_range: &mut Range<usize>,
+376    num_chans: usize,
+377) -> usize
+378where
+379    S: Sample + IntoSample<f32>,
+380{
+381    let float_space = buf.len() / SAMPLE_LEN;
+382    let interleaved_space = float_space / num_chans;
+383    let non_contiguous_end = (float_space % num_chans) != 0;
+384
+385    let remaining = source_pos.len();
+386    let to_write = remaining.min(interleaved_space);
+387    let need_spill = non_contiguous_end && to_write < remaining;
+388
+389    let samples_used = to_write + usize::from(need_spill);
+390    let last_sample = source_pos.start + to_write;
+391
+392    if need_spill {
+393        spillover.clear();
+394        *spill_range = 0..num_chans * SAMPLE_LEN;
+395    }
+396
+397    for (i, plane) in source.planes().planes()[..num_chans].iter().enumerate() {
+398        for (j, sample) in plane[source_pos.start..][..to_write].iter().enumerate() {
+399            // write this into the correct slot of buf.
+400            let addr = ((j * num_chans) + i) * SAMPLE_LEN;
+401            (&mut buf[addr..][..SAMPLE_LEN])
+402                .write_f32::<LittleEndian>((*sample).into_sample())
+403                .expect("Address known to exist by length checks.");
+404        }
+405
+406        if need_spill {
+407            spillover.push(plane[last_sample].into_sample());
+408        }
+409    }
+410
+411    source_pos.start += samples_used;
+412
+413    to_write * num_chans * SAMPLE_LEN
+414}
+415
+416#[inline]
+417fn write_resample_buffer(
+418    source: &[Vec<f32>],
+419    buf: &mut [u8],
+420    source_pos: &mut Range<usize>,
+421    spillover: &mut Vec<f32>,
+422    spill_range: &mut Range<usize>,
+423    num_chans: usize,
+424) -> usize {
+425    let float_space = buf.len() / SAMPLE_LEN;
+426    let interleaved_space = float_space / num_chans;
+427    let non_contiguous_end = (float_space % num_chans) != 0;
+428
+429    let remaining = source_pos.len();
+430    let to_write = remaining.min(interleaved_space);
+431    let need_spill = non_contiguous_end && to_write < remaining;
+432
+433    let samples_used = to_write + usize::from(need_spill);
+434    let last_sample = source_pos.start + to_write;
+435
+436    if need_spill {
+437        spillover.clear();
+438        *spill_range = 0..num_chans * SAMPLE_LEN;
+439    }
+440
+441    for (i, plane) in source[..num_chans].iter().enumerate() {
+442        for (j, sample) in plane[source_pos.start..][..to_write].iter().enumerate() {
+443            // write this into the correct slot of buf.
+444            let addr = ((j * num_chans) + i) * SAMPLE_LEN;
+445            (&mut buf[addr..][..SAMPLE_LEN])
+446                .write_f32::<LittleEndian>(*sample)
+447                .expect("Address well-formed according to bounds checks.");
+448        }
+449
+450        if need_spill {
+451            spillover.push(plane[last_sample]);
+452        }
+453    }
+454
+455    source_pos.start += samples_used;
+456
+457    to_write * num_chans * SAMPLE_LEN
+458}
\ No newline at end of file diff --git a/next/src/songbird/input/adapters/child.rs.html b/next/src/songbird/input/adapters/child.rs.html new file mode 100644 index 0000000..4fae0d8 --- /dev/null +++ b/next/src/songbird/input/adapters/child.rs.html @@ -0,0 +1,91 @@ +child.rs - source

songbird/input/adapters/
child.rs

1use crate::input::{AudioStream, Input, LiveInput};
+2use std::{
+3    io::{Read, Result as IoResult},
+4    mem,
+5    process::Child,
+6};
+7use symphonia_core::io::{MediaSource, ReadOnlySource};
+8use tokio::runtime::Handle;
+9use tracing::debug;
+10
+11/// Handle for a child process which ensures that any subprocesses are properly closed
+12/// on drop.
+13///
+14/// # Warning
+15/// To allow proper cleanup of child processes, if you create a process chain you must
+16/// make sure to use `From<Vec<Child>>`. Here, the *last* process in the `Vec` will be
+17/// used as the audio byte source.
+18#[derive(Debug)]
+19pub struct ChildContainer(pub Vec<Child>);
+20
+21impl Read for ChildContainer {
+22    fn read(&mut self, buffer: &mut [u8]) -> IoResult<usize> {
+23        match self.0.last_mut() {
+24            Some(ref mut child) => child.stdout.as_mut().unwrap().read(buffer),
+25            None => Ok(0),
+26        }
+27    }
+28}
+29
+30impl ChildContainer {
+31    /// Create a new [`ChildContainer`] from a child process
+32    #[must_use]
+33    pub fn new(children: Vec<Child>) -> Self {
+34        Self(children)
+35    }
+36}
+37
+38impl From<Child> for ChildContainer {
+39    fn from(container: Child) -> Self {
+40        Self(vec![container])
+41    }
+42}
+43
+44impl From<Vec<Child>> for ChildContainer {
+45    fn from(container: Vec<Child>) -> Self {
+46        Self(container)
+47    }
+48}
+49
+50impl From<ChildContainer> for Input {
+51    fn from(val: ChildContainer) -> Self {
+52        let audio_stream = AudioStream {
+53            input: Box::new(ReadOnlySource::new(val)) as Box<dyn MediaSource>,
+54            hint: None,
+55        };
+56        Input::Live(LiveInput::Raw(audio_stream), None)
+57    }
+58}
+59
+60impl Drop for ChildContainer {
+61    fn drop(&mut self) {
+62        let children = mem::take(&mut self.0);
+63
+64        if let Ok(handle) = Handle::try_current() {
+65            handle.spawn_blocking(move || {
+66                cleanup_child_processes(children);
+67            });
+68        } else {
+69            cleanup_child_processes(children);
+70        }
+71    }
+72}
+73
+74fn cleanup_child_processes(mut children: Vec<Child>) {
+75    let attempt = if let Some(child) = children.last_mut() {
+76        child.kill()
+77    } else {
+78        return;
+79    };
+80
+81    let attempt = attempt.and_then(|()| {
+82        children
+83            .iter_mut()
+84            .rev()
+85            .try_for_each(|child| child.wait().map(|_| ()))
+86    });
+87
+88    if let Err(e) = attempt {
+89        debug!("Error awaiting child process: {:?}", e);
+90    }
+91}
\ No newline at end of file diff --git a/next/src/songbird/input/adapters/mod.rs.html b/next/src/songbird/input/adapters/mod.rs.html new file mode 100644 index 0000000..19a2587 --- /dev/null +++ b/next/src/songbird/input/adapters/mod.rs.html @@ -0,0 +1,6 @@ +mod.rs - source

songbird/input/adapters/
mod.rs

1mod async_adapter;
+2pub mod cached;
+3mod child;
+4mod raw_adapter;
+5
+6pub use self::{async_adapter::*, child::*, raw_adapter::*};
\ No newline at end of file diff --git a/next/src/songbird/input/adapters/raw_adapter.rs.html b/next/src/songbird/input/adapters/raw_adapter.rs.html new file mode 100644 index 0000000..9d77cb9 --- /dev/null +++ b/next/src/songbird/input/adapters/raw_adapter.rs.html @@ -0,0 +1,114 @@ +raw_adapter.rs - source

songbird/input/adapters/
raw_adapter.rs

1use crate::input::{AudioStream, Input, LiveInput};
+2use byteorder::{LittleEndian, WriteBytesExt};
+3use std::io::{ErrorKind as IoErrorKind, Read, Result as IoResult, Seek, SeekFrom, Write};
+4use symphonia::core::io::MediaSource;
+5
+6// format header is a magic string, followed by two LE u32s (sample rate, channel count)
+7const FMT_HEADER: &[u8; 16] = b"SbirdRaw\0\0\0\0\0\0\0\0";
+8
+9/// Adapter around a raw, interleaved, `f32` PCM byte stream.
+10///
+11/// This may be used to port legacy songbird audio sources to be compatible with
+12/// the symphonia backend, particularly those with unknown length (making WAV
+13/// unsuitable).
+14///
+15/// The format is described in [`RawReader`].
+16///
+17/// [`RawReader`]: crate::input::codecs::RawReader
+18pub struct RawAdapter<A> {
+19    prepend: [u8; 16],
+20    inner: A,
+21    pos: u64,
+22}
+23
+24impl<A: MediaSource> RawAdapter<A> {
+25    /// Wrap an input PCM byte source to be readable by symphonia.
+26    pub fn new(audio_source: A, sample_rate: u32, channel_count: u32) -> Self {
+27        let mut prepend: [u8; 16] = *FMT_HEADER;
+28        let mut write_space = &mut prepend[8..];
+29
+30        write_space
+31            .write_u32::<LittleEndian>(sample_rate)
+32            .expect("Prepend buffer is sized to include enough space for sample rate.");
+33        write_space
+34            .write_u32::<LittleEndian>(channel_count)
+35            .expect("Prepend buffer is sized to include enough space for number of channels.");
+36
+37        Self {
+38            prepend,
+39            inner: audio_source,
+40            pos: 0,
+41        }
+42    }
+43}
+44
+45impl<A: MediaSource> Read for RawAdapter<A> {
+46    fn read(&mut self, mut buf: &mut [u8]) -> IoResult<usize> {
+47        let out = if self.pos < self.prepend.len() as u64 {
+48            let upos = self.pos as usize;
+49            let remaining = self.prepend.len() - upos;
+50            let to_write = buf.len().min(remaining);
+51
+52            buf.write(&self.prepend[upos..][..to_write])
+53        } else {
+54            self.inner.read(buf)
+55        };
+56
+57        if let Ok(n) = out {
+58            self.pos += n as u64;
+59        }
+60
+61        out
+62    }
+63}
+64
+65impl<A: MediaSource> Seek for RawAdapter<A> {
+66    fn seek(&mut self, pos: SeekFrom) -> IoResult<u64> {
+67        if self.is_seekable() {
+68            let target_pos = match pos {
+69                SeekFrom::Start(p) => p,
+70                SeekFrom::End(_) => return Err(IoErrorKind::Unsupported.into()),
+71                SeekFrom::Current(p) if p.unsigned_abs() > self.pos =>
+72                    return Err(IoErrorKind::InvalidInput.into()),
+73                SeekFrom::Current(p) => (self.pos as i64 + p) as u64,
+74            };
+75
+76            let out = if target_pos as usize <= self.prepend.len() {
+77                self.inner.rewind().map(|()| 0)
+78            } else {
+79                self.inner.seek(SeekFrom::Start(target_pos))
+80            };
+81
+82            match out {
+83                Ok(0) => self.pos = target_pos,
+84                Ok(a) => self.pos = a + self.prepend.len() as u64,
+85                _ => {},
+86            }
+87
+88            out.map(|_| self.pos)
+89        } else {
+90            Err(IoErrorKind::Unsupported.into())
+91        }
+92    }
+93}
+94
+95impl<A: MediaSource> MediaSource for RawAdapter<A> {
+96    fn is_seekable(&self) -> bool {
+97        self.inner.is_seekable()
+98    }
+99
+100    fn byte_len(&self) -> Option<u64> {
+101        self.inner.byte_len().map(|m| m + self.prepend.len() as u64)
+102    }
+103}
+104
+105impl<A: MediaSource + Send + Sync + 'static> From<RawAdapter<A>> for Input {
+106    fn from(val: RawAdapter<A>) -> Self {
+107        let live = LiveInput::Raw(AudioStream {
+108            input: Box::new(val),
+109            hint: None,
+110        });
+111
+112        Input::Live(live, None)
+113    }
+114}
\ No newline at end of file diff --git a/next/src/songbird/input/audiostream.rs.html b/next/src/songbird/input/audiostream.rs.html new file mode 100644 index 0000000..bb47e6b --- /dev/null +++ b/next/src/songbird/input/audiostream.rs.html @@ -0,0 +1,12 @@ +audiostream.rs - source

songbird/input/
audiostream.rs

1use symphonia_core::probe::Hint;
+2
+3/// An unread byte stream for an audio file.
+4pub struct AudioStream<T: Send> {
+5    /// The wrapped file stream.
+6    ///
+7    /// An input stream *must not* have been read into past the start of the
+8    /// audio container's header.
+9    pub input: T,
+10    /// Extension and MIME type information which may help guide format selection.
+11    pub hint: Option<Hint>,
+12}
\ No newline at end of file diff --git a/next/src/songbird/input/codecs/dca/metadata.rs.html b/next/src/songbird/input/codecs/dca/metadata.rs.html new file mode 100644 index 0000000..eea1571 --- /dev/null +++ b/next/src/songbird/input/codecs/dca/metadata.rs.html @@ -0,0 +1,53 @@ +metadata.rs - source

songbird/input/codecs/dca/
metadata.rs

1use serde::{Deserialize, Serialize};
+2
+3#[derive(Debug, Deserialize, Serialize)]
+4pub struct DcaMetadata {
+5    pub dca: DcaInfo,
+6    pub opus: Opus,
+7    pub info: Option<Info>,
+8    pub origin: Option<Origin>,
+9    pub extra: Option<serde_json::Value>,
+10}
+11
+12#[derive(Debug, Deserialize, Serialize)]
+13pub struct DcaInfo {
+14    pub version: u64,
+15    pub tool: Tool,
+16}
+17
+18#[derive(Debug, Deserialize, Serialize)]
+19pub struct Tool {
+20    pub name: String,
+21    pub version: String,
+22    pub url: Option<String>,
+23    pub author: Option<String>,
+24}
+25
+26#[derive(Debug, Deserialize, Serialize)]
+27pub struct Opus {
+28    pub mode: String,
+29    pub sample_rate: u32,
+30    pub frame_size: u64,
+31    pub abr: Option<u64>,
+32    pub vbr: bool,
+33    pub channels: u8,
+34}
+35
+36#[derive(Debug, Deserialize, Serialize)]
+37pub struct Info {
+38    pub title: Option<String>,
+39    pub artist: Option<String>,
+40    pub album: Option<String>,
+41    pub genre: Option<String>,
+42    pub cover: Option<String>,
+43    pub comments: Option<String>,
+44}
+45
+46#[derive(Debug, Deserialize, Serialize)]
+47pub struct Origin {
+48    pub source: Option<String>,
+49    pub abr: Option<u64>,
+50    pub channels: Option<u8>,
+51    pub encoding: Option<String>,
+52    pub url: Option<String>,
+53}
\ No newline at end of file diff --git a/next/src/songbird/input/codecs/dca/mod.rs.html b/next/src/songbird/input/codecs/dca/mod.rs.html new file mode 100644 index 0000000..07837ed --- /dev/null +++ b/next/src/songbird/input/codecs/dca/mod.rs.html @@ -0,0 +1,342 @@ +mod.rs - source

songbird/input/codecs/dca/
mod.rs

1mod metadata;
+2pub use self::metadata::*;
+3
+4use crate::constants::{SAMPLE_RATE, SAMPLE_RATE_RAW};
+5
+6use std::io::{Seek, SeekFrom};
+7use symphonia::core::{
+8    codecs::{CodecParameters, CODEC_TYPE_OPUS},
+9    errors::{self as symph_err, Error as SymphError, Result as SymphResult, SeekErrorKind},
+10    formats::prelude::*,
+11    io::{MediaSource, MediaSourceStream, ReadBytes, SeekBuffered},
+12    meta::{Metadata as SymphMetadata, MetadataBuilder, MetadataLog, StandardTagKey, Tag, Value},
+13    probe::{Descriptor, Instantiate, QueryDescriptor},
+14    sample::SampleFormat,
+15};
+16
+17impl QueryDescriptor for DcaReader {
+18    fn query() -> &'static [Descriptor] {
+19        &[symphonia_core::support_format!(
+20            "dca",
+21            "DCA[0/1] Opus Wrapper",
+22            &["dca"],
+23            &[],
+24            &[b"DCA1"]
+25        )]
+26    }
+27
+28    fn score(_context: &[u8]) -> u8 {
+29        255
+30    }
+31}
+32
+33struct SeekAccel {
+34    frame_offsets: Vec<(TimeStamp, u64)>,
+35    seek_index_fill_rate: u16,
+36    next_ts: TimeStamp,
+37}
+38
+39impl SeekAccel {
+40    fn new(options: FormatOptions, first_frame_byte_pos: u64) -> Self {
+41        let per_s = options.seek_index_fill_rate;
+42        let next_ts = (per_s as u64) * (SAMPLE_RATE_RAW as u64);
+43
+44        Self {
+45            frame_offsets: vec![(0, first_frame_byte_pos)],
+46            seek_index_fill_rate: per_s,
+47            next_ts,
+48        }
+49    }
+50
+51    fn update(&mut self, ts: TimeStamp, pos: u64) {
+52        if ts >= self.next_ts {
+53            self.next_ts += (self.seek_index_fill_rate as u64) * (SAMPLE_RATE_RAW as u64);
+54            self.frame_offsets.push((ts, pos));
+55        }
+56    }
+57
+58    fn get_seek_pos(&self, ts: TimeStamp) -> (TimeStamp, u64) {
+59        let index = self.frame_offsets.partition_point(|&(o_ts, _)| o_ts <= ts) - 1;
+60        self.frame_offsets[index]
+61    }
+62}
+63
+64/// [DCA\[0/1\]](https://github.com/bwmarrin/dca) Format reader for Symphonia.
+65pub struct DcaReader {
+66    source: MediaSourceStream,
+67    track: Option<Track>,
+68    metas: MetadataLog,
+69    seek_accel: SeekAccel,
+70    curr_ts: TimeStamp,
+71    max_ts: Option<TimeStamp>,
+72    held_packet: Option<Packet>,
+73}
+74
+75impl FormatReader for DcaReader {
+76    fn try_new(mut source: MediaSourceStream, options: &FormatOptions) -> SymphResult<Self> {
+77        // Read in the magic number to verify it's a DCA file.
+78        let magic = source.read_quad_bytes()?;
+79
+80        // FIXME: make use of the new options.enable_gapless to apply the opus coder delay.
+81
+82        let read_meta = match &magic {
+83            b"DCA1" => true,
+84            _ if &magic[..3] == b"DCA" => {
+85                return symph_err::unsupported_error("unsupported DCA version");
+86            },
+87            _ => {
+88                source.seek_buffered_rel(-4);
+89                false
+90            },
+91        };
+92
+93        let mut codec_params = CodecParameters::new();
+94
+95        codec_params
+96            .for_codec(CODEC_TYPE_OPUS)
+97            .with_max_frames_per_packet(1)
+98            .with_sample_rate(SAMPLE_RATE_RAW as u32)
+99            .with_time_base(TimeBase::new(1, SAMPLE_RATE_RAW as u32))
+100            .with_sample_format(SampleFormat::F32);
+101
+102        let mut metas = MetadataLog::default();
+103
+104        if read_meta {
+105            let size = source.read_u32()?;
+106
+107            // Sanity check
+108            if (size as i32) < 2 {
+109                return symph_err::decode_error("missing DCA1 metadata block");
+110            }
+111
+112            let raw_json = source.read_boxed_slice_exact(size as usize)?;
+113
+114            let metadata: DcaMetadata = serde_json::from_slice::<DcaMetadata>(&raw_json)
+115                .map_err(|_| SymphError::DecodeError("malformed DCA1 metadata block"))?;
+116
+117            let mut revision = MetadataBuilder::new();
+118
+119            if let Some(info) = metadata.info {
+120                if let Some(t) = info.title {
+121                    revision.add_tag(Tag::new(
+122                        Some(StandardTagKey::TrackTitle),
+123                        "title",
+124                        Value::String(t),
+125                    ));
+126                }
+127                if let Some(t) = info.album {
+128                    revision.add_tag(Tag::new(
+129                        Some(StandardTagKey::Album),
+130                        "album",
+131                        Value::String(t),
+132                    ));
+133                }
+134                if let Some(t) = info.artist {
+135                    revision.add_tag(Tag::new(
+136                        Some(StandardTagKey::Artist),
+137                        "artist",
+138                        Value::String(t),
+139                    ));
+140                }
+141                if let Some(t) = info.genre {
+142                    revision.add_tag(Tag::new(
+143                        Some(StandardTagKey::Genre),
+144                        "genre",
+145                        Value::String(t),
+146                    ));
+147                }
+148                if let Some(t) = info.comments {
+149                    revision.add_tag(Tag::new(
+150                        Some(StandardTagKey::Comment),
+151                        "comments",
+152                        Value::String(t),
+153                    ));
+154                }
+155                if let Some(_t) = info.cover {
+156                    // TODO: Add visual, figure out MIME types.
+157                }
+158            }
+159
+160            if let Some(origin) = metadata.origin {
+161                if let Some(t) = origin.url {
+162                    revision.add_tag(Tag::new(Some(StandardTagKey::Url), "url", Value::String(t)));
+163                }
+164            }
+165
+166            metas.push(revision.metadata());
+167        }
+168
+169        let bytes_read = source.pos();
+170
+171        Ok(Self {
+172            source,
+173            track: Some(Track {
+174                id: 0,
+175                language: None,
+176                codec_params,
+177            }),
+178            metas,
+179            seek_accel: SeekAccel::new(*options, bytes_read),
+180            curr_ts: 0,
+181            max_ts: None,
+182            held_packet: None,
+183        })
+184    }
+185
+186    fn cues(&self) -> &[Cue] {
+187        // No cues in DCA...
+188        &[]
+189    }
+190
+191    fn metadata(&mut self) -> SymphMetadata<'_> {
+192        self.metas.metadata()
+193    }
+194
+195    fn seek(&mut self, _mode: SeekMode, to: SeekTo) -> SymphResult<SeekedTo> {
+196        let can_backseek = self.source.is_seekable();
+197
+198        let track = if self.track.is_none() {
+199            return symph_err::seek_error(SeekErrorKind::Unseekable);
+200        } else {
+201            self.track.as_ref().unwrap()
+202        };
+203
+204        let rate = track.codec_params.sample_rate;
+205        let ts = match to {
+206            SeekTo::Time { time, .. } =>
+207                if let Some(rate) = rate {
+208                    TimeBase::new(1, rate).calc_timestamp(time)
+209                } else {
+210                    return symph_err::seek_error(SeekErrorKind::Unseekable);
+211                },
+212            SeekTo::TimeStamp { ts, .. } => ts,
+213        };
+214
+215        if let Some(max_ts) = self.max_ts {
+216            if ts > max_ts {
+217                return symph_err::seek_error(SeekErrorKind::OutOfRange);
+218            }
+219        }
+220
+221        let backseek_needed = self.curr_ts > ts;
+222
+223        if backseek_needed && !can_backseek {
+224            return symph_err::seek_error(SeekErrorKind::ForwardOnly);
+225        }
+226
+227        let (accel_seek_ts, accel_seek_pos) = self.seek_accel.get_seek_pos(ts);
+228
+229        if backseek_needed || accel_seek_pos > self.source.pos() {
+230            self.source.seek(SeekFrom::Start(accel_seek_pos))?;
+231            self.curr_ts = accel_seek_ts;
+232        }
+233
+234        while let Ok(pkt) = self.next_packet() {
+235            let pts = pkt.ts;
+236            let dur = pkt.dur;
+237            let track_id = pkt.track_id();
+238
+239            if (pts..pts + dur).contains(&ts) {
+240                self.held_packet = Some(pkt);
+241                return Ok(SeekedTo {
+242                    track_id,
+243                    required_ts: ts,
+244                    actual_ts: pts,
+245                });
+246            }
+247        }
+248
+249        symph_err::seek_error(SeekErrorKind::OutOfRange)
+250    }
+251
+252    fn tracks(&self) -> &[Track] {
+253        // DCA tracks can hold only one track by design.
+254        // Of course, a zero-length file is technically allowed,
+255        // in which case no track.
+256        if let Some(track) = self.track.as_ref() {
+257            std::slice::from_ref(track)
+258        } else {
+259            &[]
+260        }
+261    }
+262
+263    fn default_track(&self) -> Option<&Track> {
+264        self.track.as_ref()
+265    }
+266
+267    fn next_packet(&mut self) -> SymphResult<Packet> {
+268        if let Some(pkt) = self.held_packet.take() {
+269            return Ok(pkt);
+270        }
+271
+272        let frame_pos = self.source.pos();
+273
+274        let p_len = match self.source.read_u16() {
+275            Ok(len) => len as i16,
+276            Err(eof) => {
+277                self.max_ts = Some(self.curr_ts);
+278                return Err(eof.into());
+279            },
+280        };
+281
+282        if p_len < 0 {
+283            return symph_err::decode_error("DCA frame header had a negative length.");
+284        }
+285
+286        let buf = self.source.read_boxed_slice_exact(p_len as usize)?;
+287
+288        let checked_buf = buf[..].try_into().or_else(|_| {
+289            symph_err::decode_error("Packet was not a valid Opus Packet: too large for audiopus.")
+290        })?;
+291
+292        let sample_ct = audiopus::packet::nb_samples(checked_buf, SAMPLE_RATE).or_else(|_| {
+293            symph_err::decode_error(
+294                "Packet was not a valid Opus packet: couldn't read sample count.",
+295            )
+296        })? as u64;
+297
+298        let out = Packet::new_from_boxed_slice(0, self.curr_ts, sample_ct, buf);
+299
+300        self.seek_accel.update(self.curr_ts, frame_pos);
+301
+302        self.curr_ts += sample_ct;
+303
+304        Ok(out)
+305    }
+306
+307    fn into_inner(self: Box<Self>) -> MediaSourceStream {
+308        self.source
+309    }
+310}
+311
+312#[cfg(test)]
+313mod tests {
+314    use crate::input::input_tests::*;
+315    use crate::{constants::test_data::FILE_DCA_TARGET, input::File};
+316
+317    // NOTE: this covers youtube audio in a non-copyright-violating way, since
+318    // those depend on an HttpRequest internally anyhow.
+319    #[tokio::test]
+320    #[ntest::timeout(10_000)]
+321    async fn dca_track_plays() {
+322        track_plays_passthrough(|| File::new(FILE_DCA_TARGET)).await;
+323    }
+324
+325    #[tokio::test]
+326    #[ntest::timeout(10_000)]
+327    async fn dca_forward_seek_correct() {
+328        forward_seek_correct(|| File::new(FILE_DCA_TARGET)).await;
+329    }
+330
+331    #[tokio::test]
+332    #[ntest::timeout(10_000)]
+333    async fn dca_backward_seek_correct() {
+334        backward_seek_correct(|| File::new(FILE_DCA_TARGET)).await;
+335    }
+336
+337    #[tokio::test]
+338    #[ntest::timeout(10_000)]
+339    async fn opus_passthrough_when_other_tracks_paused() {
+340        track_plays_passthrough_when_is_only_active(|| File::new(FILE_DCA_TARGET)).await;
+341    }
+342}
\ No newline at end of file diff --git a/next/src/songbird/input/codecs/mod.rs.html b/next/src/songbird/input/codecs/mod.rs.html new file mode 100644 index 0000000..0fea9cc --- /dev/null +++ b/next/src/songbird/input/codecs/mod.rs.html @@ -0,0 +1,36 @@ +mod.rs - source

songbird/input/codecs/
mod.rs

1//! Codec registries extending Symphonia's probe and registry formats with Opus and DCA support.
+2
+3pub(crate) mod dca;
+4mod opus;
+5mod raw;
+6
+7use std::sync::OnceLock;
+8
+9pub use self::{dca::DcaReader, opus::OpusDecoder, raw::*};
+10use symphonia::{
+11    core::{codecs::CodecRegistry, probe::Probe},
+12    default::*,
+13};
+14
+15/// Default Symphonia [`CodecRegistry`], including the (audiopus-backed) Opus codec.
+16pub fn get_codec_registry() -> &'static CodecRegistry {
+17    static CODEC_REGISTRY: OnceLock<CodecRegistry> = OnceLock::new();
+18    CODEC_REGISTRY.get_or_init(|| {
+19        let mut registry = CodecRegistry::new();
+20        register_enabled_codecs(&mut registry);
+21        registry.register_all::<OpusDecoder>();
+22        registry
+23    })
+24}
+25
+26/// Default Symphonia Probe, including DCA format support.
+27pub fn get_probe() -> &'static Probe {
+28    static PROBE: OnceLock<Probe> = OnceLock::new();
+29    PROBE.get_or_init(|| {
+30        let mut probe = Probe::default();
+31        probe.register_all::<DcaReader>();
+32        probe.register_all::<RawReader>();
+33        register_enabled_formats(&mut probe);
+34        probe
+35    })
+36}
\ No newline at end of file diff --git a/next/src/songbird/input/codecs/opus.rs.html b/next/src/songbird/input/codecs/opus.rs.html new file mode 100644 index 0000000..3b3d2d5 --- /dev/null +++ b/next/src/songbird/input/codecs/opus.rs.html @@ -0,0 +1,167 @@ +opus.rs - source

songbird/input/codecs/
opus.rs

1use crate::constants::*;
+2use audiopus::{
+3    coder::{Decoder as AudiopusDecoder, GenericCtl},
+4    Channels,
+5    Error as OpusError,
+6    ErrorCode,
+7};
+8use symphonia_core::{
+9    audio::{AsAudioBufferRef, AudioBuffer, AudioBufferRef, Layout, Signal, SignalSpec},
+10    codecs::{
+11        CodecDescriptor,
+12        CodecParameters,
+13        Decoder,
+14        DecoderOptions,
+15        FinalizeResult,
+16        CODEC_TYPE_OPUS,
+17    },
+18    errors::{decode_error, Result as SymphResult},
+19    formats::Packet,
+20};
+21
+22/// Opus decoder for symphonia, based on libopus v1.3 (via [`audiopus`]).
+23pub struct OpusDecoder {
+24    inner: AudiopusDecoder,
+25    params: CodecParameters,
+26    buf: AudioBuffer<f32>,
+27    rawbuf: Vec<f32>,
+28}
+29
+30/// # SAFETY
+31/// The underlying Opus decoder (currently) requires only a `&self` parameter
+32/// to decode given packets, which is likely a mistaken decision.
+33///
+34/// This struct makes stronger assumptions and only touches FFI decoder state with a
+35/// `&mut self`, preventing data races via `&OpusDecoder` as required by `impl Sync`.
+36/// No access to other internal state relies on unsafety or crosses FFI.
+37unsafe impl Sync for OpusDecoder {}
+38
+39impl OpusDecoder {
+40    fn decode_inner(&mut self, packet: &Packet) -> SymphResult<()> {
+41        let s_ct = loop {
+42            let pkt = if packet.buf().is_empty() {
+43                None
+44            } else if let Ok(checked_pkt) = packet.buf().try_into() {
+45                Some(checked_pkt)
+46            } else {
+47                return decode_error("Opus packet was too large (greater than i32::MAX bytes).");
+48            };
+49            let out_space = (&mut self.rawbuf[..]).try_into().expect("The following logic expands this buffer safely below i32::MAX, and we throw our own error.");
+50
+51            match self.inner.decode_float(pkt, out_space, false) {
+52                Ok(v) => break v,
+53                Err(OpusError::Opus(ErrorCode::BufferTooSmall)) => {
+54                    // double the buffer size
+55                    // correct behav would be to mirror the decoder logic in the udp_rx set.
+56                    let new_size = (self.rawbuf.len() * 2).min(i32::MAX as usize);
+57                    if new_size == self.rawbuf.len() {
+58                        return decode_error("Opus frame too big: cannot expand opus frame decode buffer any further.");
+59                    }
+60
+61                    self.rawbuf.resize(new_size, 0.0);
+62                    self.buf = AudioBuffer::new(
+63                        self.rawbuf.len() as u64 / 2,
+64                        SignalSpec::new_with_layout(SAMPLE_RATE_RAW as u32, Layout::Stereo),
+65                    );
+66                },
+67                Err(e) => {
+68                    tracing::error!("Opus decode error: {:?}", e);
+69                    return decode_error("Opus decode error: see 'tracing' logs.");
+70                },
+71            }
+72        };
+73
+74        self.buf.clear();
+75        self.buf.render_reserved(Some(s_ct));
+76
+77        // Forcibly assuming stereo, for now.
+78        for ch in 0..2 {
+79            let iter = self.rawbuf.chunks_exact(2).map(|chunk| chunk[ch]);
+80            for (tgt, src) in self.buf.chan_mut(ch).iter_mut().zip(iter) {
+81                *tgt = src;
+82            }
+83        }
+84
+85        Ok(())
+86    }
+87}
+88
+89impl Decoder for OpusDecoder {
+90    fn try_new(params: &CodecParameters, _options: &DecoderOptions) -> SymphResult<Self> {
+91        let inner = AudiopusDecoder::new(SAMPLE_RATE, Channels::Stereo).unwrap();
+92
+93        let mut params = params.clone();
+94        params.with_sample_rate(SAMPLE_RATE_RAW as u32);
+95
+96        Ok(Self {
+97            inner,
+98            params,
+99            buf: AudioBuffer::new(
+100                MONO_FRAME_SIZE as u64,
+101                SignalSpec::new_with_layout(SAMPLE_RATE_RAW as u32, Layout::Stereo),
+102            ),
+103            rawbuf: vec![0.0f32; STEREO_FRAME_SIZE],
+104        })
+105    }
+106
+107    fn supported_codecs() -> &'static [CodecDescriptor] {
+108        &[symphonia_core::support_codec!(
+109            CODEC_TYPE_OPUS,
+110            "opus",
+111            "libopus (1.3+, audiopus)"
+112        )]
+113    }
+114
+115    fn codec_params(&self) -> &CodecParameters {
+116        &self.params
+117    }
+118
+119    fn decode(&mut self, packet: &Packet) -> SymphResult<AudioBufferRef<'_>> {
+120        if let Err(e) = self.decode_inner(packet) {
+121            self.buf.clear();
+122            Err(e)
+123        } else {
+124            Ok(self.buf.as_audio_buffer_ref())
+125        }
+126    }
+127
+128    fn reset(&mut self) {
+129        _ = self.inner.reset_state();
+130    }
+131
+132    fn finalize(&mut self) -> FinalizeResult {
+133        FinalizeResult::default()
+134    }
+135
+136    fn last_decoded(&self) -> AudioBufferRef<'_> {
+137        self.buf.as_audio_buffer_ref()
+138    }
+139}
+140
+141#[cfg(test)]
+142mod tests {
+143    use crate::{
+144        constants::test_data::FILE_WEBM_TARGET,
+145        input::{input_tests::*, File},
+146    };
+147
+148    // NOTE: this covers youtube audio in a non-copyright-violating way, since
+149    // those depend on an HttpRequest internally anyhow.
+150    #[tokio::test]
+151    #[ntest::timeout(10_000)]
+152    async fn webm_track_plays() {
+153        track_plays_passthrough(|| File::new(FILE_WEBM_TARGET)).await;
+154    }
+155
+156    #[tokio::test]
+157    #[ntest::timeout(10_000)]
+158    async fn webm_forward_seek_correct() {
+159        forward_seek_correct(|| File::new(FILE_WEBM_TARGET)).await;
+160    }
+161
+162    #[tokio::test]
+163    #[ntest::timeout(10_000)]
+164    async fn webm_backward_seek_correct() {
+165        backward_seek_correct(|| File::new(FILE_WEBM_TARGET)).await;
+166    }
+167}
\ No newline at end of file diff --git a/next/src/songbird/input/codecs/raw.rs.html b/next/src/songbird/input/codecs/raw.rs.html new file mode 100644 index 0000000..c931936 --- /dev/null +++ b/next/src/songbird/input/codecs/raw.rs.html @@ -0,0 +1,181 @@ +raw.rs - source

songbird/input/codecs/
raw.rs

1use std::io::{Seek, SeekFrom};
+2use symphonia::core::{
+3    audio::Channels,
+4    codecs::{CodecParameters, CODEC_TYPE_PCM_F32LE},
+5    errors::{self as symph_err, Result as SymphResult, SeekErrorKind},
+6    formats::prelude::*,
+7    io::{MediaSource, MediaSourceStream, ReadBytes, SeekBuffered},
+8    meta::{Metadata as SymphMetadata, MetadataLog},
+9    probe::{Descriptor, Instantiate, QueryDescriptor},
+10};
+11
+12impl QueryDescriptor for RawReader {
+13    fn query() -> &'static [Descriptor] {
+14        &[symphonia_core::support_format!(
+15            "raw",
+16            "Raw arbitrary-length f32 audio container.",
+17            &["rawf32"],
+18            &[],
+19            &[b"SbirdRaw"]
+20        )]
+21    }
+22
+23    fn score(_context: &[u8]) -> u8 {
+24        255
+25    }
+26}
+27
+28/// Symphonia support for a simple container for raw f32-PCM data of unknown duration.
+29///
+30/// Contained files have a simple header:
+31/// * the 8-byte signature `b"SbirdRaw"`,
+32/// * the sample rate, as a little-endian `u32`,
+33/// * the channel count, as a little-endian `u32`.
+34///
+35/// The remainder of the file is interleaved little-endian `f32` samples.
+36pub struct RawReader {
+37    source: MediaSourceStream,
+38    track: Track,
+39    meta: MetadataLog,
+40    curr_ts: TimeStamp,
+41    max_ts: Option<TimeStamp>,
+42}
+43
+44impl FormatReader for RawReader {
+45    fn try_new(mut source: MediaSourceStream, _options: &FormatOptions) -> SymphResult<Self> {
+46        let mut magic = [0u8; 8];
+47        ReadBytes::read_buf_exact(&mut source, &mut magic[..])?;
+48
+49        if &magic != b"SbirdRaw" {
+50            source.seek_buffered_rel(-(magic.len() as isize));
+51            return symph_err::decode_error("rawf32: illegal magic byte sequence.");
+52        }
+53
+54        let sample_rate = source.read_u32()?;
+55        let n_chans = source.read_u32()?;
+56
+57        let chans = match n_chans {
+58            1 => Channels::FRONT_LEFT,
+59            2 => Channels::FRONT_LEFT | Channels::FRONT_RIGHT,
+60            _ =>
+61                return symph_err::decode_error(
+62                    "rawf32: channel layout is not stereo or mono for fmt_pcm",
+63                ),
+64        };
+65
+66        let mut codec_params = CodecParameters::new();
+67
+68        codec_params
+69            .for_codec(CODEC_TYPE_PCM_F32LE)
+70            .with_bits_per_coded_sample((std::mem::size_of::<f32>() as u32) * 8)
+71            .with_bits_per_sample((std::mem::size_of::<f32>() as u32) * 8)
+72            .with_sample_rate(sample_rate)
+73            .with_time_base(TimeBase::new(1, sample_rate))
+74            .with_sample_format(symphonia_core::sample::SampleFormat::F32)
+75            .with_max_frames_per_packet(sample_rate as u64 / 50)
+76            .with_channels(chans);
+77
+78        Ok(Self {
+79            source,
+80            track: Track {
+81                id: 0,
+82                language: None,
+83                codec_params,
+84            },
+85            meta: MetadataLog::default(),
+86            curr_ts: 0,
+87            max_ts: None,
+88        })
+89    }
+90
+91    fn cues(&self) -> &[Cue] {
+92        &[]
+93    }
+94
+95    fn metadata(&mut self) -> SymphMetadata<'_> {
+96        self.meta.metadata()
+97    }
+98
+99    fn seek(&mut self, _mode: SeekMode, to: SeekTo) -> SymphResult<SeekedTo> {
+100        let can_backseek = self.source.is_seekable();
+101
+102        let track = &self.track;
+103        let rate = track.codec_params.sample_rate;
+104        let ts = match to {
+105            SeekTo::Time { time, .. } =>
+106                if let Some(rate) = rate {
+107                    TimeBase::new(1, rate).calc_timestamp(time)
+108                } else {
+109                    return symph_err::seek_error(SeekErrorKind::Unseekable);
+110                },
+111            SeekTo::TimeStamp { ts, .. } => ts,
+112        };
+113
+114        if let Some(max_ts) = self.max_ts {
+115            if ts > max_ts {
+116                return symph_err::seek_error(SeekErrorKind::OutOfRange);
+117            }
+118        }
+119
+120        let backseek_needed = self.curr_ts > ts;
+121
+122        if backseek_needed && !can_backseek {
+123            return symph_err::seek_error(SeekErrorKind::ForwardOnly);
+124        }
+125
+126        let chan_count = track
+127            .codec_params
+128            .channels
+129            .expect("Channel count is built into format.")
+130            .count() as u64;
+131
+132        let seek_pos = 16 + (std::mem::size_of::<f32>() as u64) * (ts * chan_count);
+133
+134        self.source.seek(SeekFrom::Start(seek_pos))?;
+135        self.curr_ts = ts;
+136
+137        Ok(SeekedTo {
+138            track_id: track.id,
+139            required_ts: ts,
+140            actual_ts: ts,
+141        })
+142    }
+143
+144    fn tracks(&self) -> &[Track] {
+145        std::slice::from_ref(&self.track)
+146    }
+147
+148    fn default_track(&self) -> Option<&Track> {
+149        Some(&self.track)
+150    }
+151
+152    fn next_packet(&mut self) -> SymphResult<Packet> {
+153        let track = &self.track;
+154        let rate = track
+155            .codec_params
+156            .sample_rate
+157            .expect("Sample rate is built into format.") as usize;
+158
+159        let chan_count = track
+160            .codec_params
+161            .channels
+162            .expect("Channel count is built into format.")
+163            .count();
+164
+165        let sample_unit = std::mem::size_of::<f32>() * chan_count;
+166
+167        // Aim for 20ms (50Hz).
+168        let buf = self.source.read_boxed_slice((rate / 50) * sample_unit)?;
+169
+170        let sample_ct = (buf.len() / sample_unit) as u64;
+171        let out = Packet::new_from_boxed_slice(0, self.curr_ts, sample_ct, buf);
+172
+173        self.curr_ts += sample_ct;
+174
+175        Ok(out)
+176    }
+177
+178    fn into_inner(self: Box<Self>) -> MediaSourceStream {
+179        self.source
+180    }
+181}
\ No newline at end of file diff --git a/next/src/songbird/input/compose.rs.html b/next/src/songbird/input/compose.rs.html new file mode 100644 index 0000000..b8e4679 --- /dev/null +++ b/next/src/songbird/input/compose.rs.html @@ -0,0 +1,40 @@ +compose.rs - source

songbird/input/
compose.rs

1use super::{AudioStream, AudioStreamError, AuxMetadata};
+2
+3use symphonia_core::io::MediaSource;
+4
+5/// Data and behaviour required to instantiate a lazy audio source.
+6#[async_trait::async_trait]
+7pub trait Compose: Send {
+8    /// Create a source synchronously.
+9    ///
+10    /// If [`should_create_async`] returns `false`, this method will chosen at runtime.
+11    ///
+12    /// [`should_create_async`]: Self::should_create_async
+13    fn create(&mut self) -> Result<AudioStream<Box<dyn MediaSource>>, AudioStreamError>;
+14
+15    /// Create a source asynchronously.
+16    ///
+17    /// If [`should_create_async`] returns `true`, this method will chosen at runtime.
+18    ///
+19    /// [`should_create_async`]: Self::should_create_async
+20    async fn create_async(&mut self)
+21        -> Result<AudioStream<Box<dyn MediaSource>>, AudioStreamError>;
+22
+23    /// Determines whether this source will be instantiated using [`create`] or [`create_async`].
+24    ///
+25    /// Songbird will create the audio stream using either a dynamically sized thread pool,
+26    /// or a task on the async runtime it was spawned in respectively. Users do not need to
+27    /// support both these methods.
+28    ///
+29    /// [`create_async`]: Self::create_async
+30    /// [`create`]: Self::create
+31    fn should_create_async(&self) -> bool;
+32
+33    /// Requests auxiliary metadata which can be accessed without parsing the file.
+34    ///
+35    /// This method will never be called by songbird but allows, for instance, access to metadata
+36    /// which might only be visible to a web crawler e.g., uploader or source URL.
+37    async fn aux_metadata(&mut self) -> Result<AuxMetadata, AudioStreamError> {
+38        Err(AudioStreamError::Unsupported)
+39    }
+40}
\ No newline at end of file diff --git a/next/src/songbird/input/error.rs.html b/next/src/songbird/input/error.rs.html new file mode 100644 index 0000000..bc195f9 --- /dev/null +++ b/next/src/songbird/input/error.rs.html @@ -0,0 +1,168 @@ +error.rs - source

songbird/input/
error.rs

1use std::{error::Error, fmt::Display, time::Duration};
+2use symphonia_core::errors::Error as SymphError;
+3
+4/// Errors encountered when creating an [`AudioStream`] or requesting metadata
+5/// from a [`Compose`].
+6///
+7/// [`AudioStream`]: super::AudioStream
+8/// [`Compose`]: super::Compose
+9#[non_exhaustive]
+10#[derive(Debug)]
+11pub enum AudioStreamError {
+12    /// The operation failed, and should be retried after a given time.
+13    ///
+14    /// Create operations invoked by the driver will retry on the first tick
+15    /// after this time has passed.
+16    RetryIn(Duration),
+17    /// The operation failed, and should not be retried.
+18    Fail(Box<dyn Error + Send + Sync>),
+19    /// The operation was not supported, and will never succeed.
+20    Unsupported,
+21}
+22
+23impl Display for AudioStreamError {
+24    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+25        f.write_str("failed to create audio: ")?;
+26        match self {
+27            Self::RetryIn(t) => f.write_fmt(format_args!("retry in {:.2}s", t.as_secs_f32())),
+28            Self::Fail(why) => f.write_fmt(format_args!("{why}")),
+29            Self::Unsupported => f.write_str("operation was not supported"),
+30        }
+31    }
+32}
+33
+34impl Error for AudioStreamError {
+35    fn source(&self) -> Option<&(dyn Error + 'static)> {
+36        None
+37    }
+38}
+39
+40/// Errors encountered when readying or pre-processing an [`Input`].
+41///
+42/// [`Input`]: super::Input
+43#[non_exhaustive]
+44#[derive(Debug)]
+45pub enum MakePlayableError {
+46    /// Failed to create a [`LiveInput`] from the lazy [`Compose`].
+47    ///
+48    /// [`LiveInput`]: super::LiveInput
+49    /// [`Compose`]: super::Compose
+50    Create(AudioStreamError),
+51    /// Failed to read headers, codecs, or a valid stream from a [`LiveInput`].
+52    ///
+53    /// [`LiveInput`]: super::LiveInput
+54    Parse(SymphError),
+55    /// A blocking thread panicked or failed to return a parsed input.
+56    Panicked,
+57}
+58
+59impl Display for MakePlayableError {
+60    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+61        f.write_str("failed to make track playable: ")?;
+62        match self {
+63            Self::Create(c) => {
+64                f.write_str("input creation [")?;
+65                f.write_fmt(format_args!("{}", &c))?;
+66                f.write_str("]")
+67            },
+68            Self::Parse(p) => {
+69                f.write_str("parsing formats/codecs [")?;
+70                f.write_fmt(format_args!("{}", &p))?;
+71                f.write_str("]")
+72            },
+73            Self::Panicked => f.write_str("panic during blocking I/O in parse"),
+74        }
+75    }
+76}
+77
+78impl Error for MakePlayableError {
+79    fn source(&self) -> Option<&(dyn Error + 'static)> {
+80        None
+81    }
+82}
+83
+84impl From<AudioStreamError> for MakePlayableError {
+85    fn from(val: AudioStreamError) -> Self {
+86        Self::Create(val)
+87    }
+88}
+89
+90impl From<SymphError> for MakePlayableError {
+91    fn from(val: SymphError) -> Self {
+92        Self::Parse(val)
+93    }
+94}
+95
+96/// Errors encountered when trying to access in-stream [`Metadata`] for an [`Input`].
+97///
+98/// Both cases can be solved by using [`Input::make_playable`] or [`LiveInput::promote`].
+99///
+100/// [`Input`]: super::Input
+101/// [`Metadata`]: super::Metadata
+102/// [`Input::make_playable`]: super::Input::make_playable
+103/// [`LiveInput::promote`]: super::LiveInput::promote
+104#[non_exhaustive]
+105#[derive(Debug)]
+106pub enum MetadataError {
+107    /// This input is currently lazily initialised, and must be made live.
+108    NotLive,
+109    /// This input is ready, but has not had its headers parsed.
+110    NotParsed,
+111}
+112
+113impl Display for MetadataError {
+114    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+115        f.write_str("failed to get metadata: ")?;
+116        match self {
+117            Self::NotLive => f.write_str("the input is not live, and hasn't been parsed"),
+118            Self::NotParsed => f.write_str("the input is live but hasn't been parsed"),
+119        }
+120    }
+121}
+122
+123impl Error for MetadataError {
+124    fn source(&self) -> Option<&(dyn Error + 'static)> {
+125        None
+126    }
+127}
+128
+129/// Errors encountered when trying to access out-of-band [`AuxMetadata`] for an [`Input`]
+130/// or [`Compose`].
+131///
+132/// [`Input`]: super::Input
+133/// [`AuxMetadata`]: super::AuxMetadata
+134/// [`Compose`]: super::Compose
+135#[non_exhaustive]
+136#[derive(Debug)]
+137pub enum AuxMetadataError {
+138    /// This input has no lazy [`Compose`] initialiser, which is needed to
+139    /// retrieve [`AuxMetadata`].
+140    ///
+141    /// [`Compose`]: super::Compose
+142    /// [`AuxMetadata`]: super::AuxMetadata
+143    NoCompose,
+144    /// There was an error when trying to access auxiliary metadata.
+145    Retrieve(AudioStreamError),
+146}
+147
+148impl Display for AuxMetadataError {
+149    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+150        f.write_str("failed to get aux_metadata: ")?;
+151        match self {
+152            Self::NoCompose => f.write_str("the input has no Compose object"),
+153            Self::Retrieve(e) => f.write_fmt(format_args!("aux_metadata error from Compose: {e}")),
+154        }
+155    }
+156}
+157
+158impl Error for AuxMetadataError {
+159    fn source(&self) -> Option<&(dyn Error + 'static)> {
+160        None
+161    }
+162}
+163
+164impl From<AudioStreamError> for AuxMetadataError {
+165    fn from(val: AudioStreamError) -> Self {
+166        Self::Retrieve(val)
+167    }
+168}
\ No newline at end of file diff --git a/next/src/songbird/input/live_input.rs.html b/next/src/songbird/input/live_input.rs.html new file mode 100644 index 0000000..fd621ff --- /dev/null +++ b/next/src/songbird/input/live_input.rs.html @@ -0,0 +1,167 @@ +live_input.rs - source

songbird/input/
live_input.rs

1use super::{AudioStream, Metadata, MetadataError, Parsed};
+2
+3use symphonia_core::{
+4    codecs::{CodecRegistry, DecoderOptions},
+5    errors::Error as SymphError,
+6    formats::FormatOptions,
+7    io::{MediaSource, MediaSourceStream, MediaSourceStreamOptions},
+8    meta::MetadataOptions,
+9    probe::Probe,
+10};
+11
+12/// An initialised audio source.
+13///
+14/// This type's variants reflect files at different stages of readiness for use by
+15/// symphonia. [`Parsed`] file streams are ready for playback.
+16///
+17/// [`Parsed`]: Self::Parsed
+18pub enum LiveInput {
+19    /// An unread, raw file stream.
+20    Raw(AudioStream<Box<dyn MediaSource>>),
+21    /// An unread file which has been wrapped with a large read-ahead buffer.
+22    Wrapped(AudioStream<MediaSourceStream>),
+23    /// An audio file which has had its headers parsed and decoder state built.
+24    Parsed(Parsed),
+25}
+26
+27impl LiveInput {
+28    /// Converts this audio source into a [`Parsed`] object using the supplied format and codec
+29    /// registries.
+30    ///
+31    /// Where applicable, this will convert [`Raw`] -> [`Wrapped`] -> [`Parsed`], and will
+32    /// play the default track (or the first encountered track if this is not available) if a
+33    /// container holds multiple audio streams.
+34    ///
+35    /// *This is a blocking operation. Symphonia uses standard library I/O (e.g., [`Read`], [`Seek`]).
+36    /// If you wish to use this from an async task, you must do so within `spawn_blocking`.*
+37    ///
+38    /// [`Parsed`]: Self::Parsed
+39    /// [`Raw`]: Self::Raw
+40    /// [`Wrapped`]: Self::Wrapped
+41    /// [`Read`]: https://doc.rust-lang.org/std/io/trait.Read.html
+42    /// [`Seek`]: https://doc.rust-lang.org/std/io/trait.Seek.html
+43    pub fn promote(self, codecs: &CodecRegistry, probe: &Probe) -> Result<Self, SymphError> {
+44        let mut out = self;
+45
+46        if let LiveInput::Raw(r) = out {
+47            // TODO: allow passing in of MSS options?
+48            let mss = MediaSourceStream::new(r.input, MediaSourceStreamOptions::default());
+49            out = LiveInput::Wrapped(AudioStream {
+50                input: mss,
+51                hint: r.hint,
+52            });
+53        }
+54
+55        if let LiveInput::Wrapped(w) = out {
+56            let hint = w.hint.unwrap_or_default();
+57            let input = w.input;
+58            let supports_backseek = input.is_seekable();
+59
+60            let probe_data = probe.format(
+61                &hint,
+62                input,
+63                &FormatOptions::default(),
+64                &MetadataOptions::default(),
+65            )?;
+66            let format = probe_data.format;
+67            let meta = probe_data.metadata;
+68
+69            // if default track exists, try to make a decoder
+70            // if that fails, linear scan and take first that succeeds
+71            let decoder = format
+72                .default_track()
+73                .and_then(|track| {
+74                    codecs
+75                        .make(&track.codec_params, &DecoderOptions::default())
+76                        .ok()
+77                        .map(|d| (d, track.id))
+78                })
+79                .or_else(|| {
+80                    format.tracks().iter().find_map(|track| {
+81                        codecs
+82                            .make(&track.codec_params, &DecoderOptions::default())
+83                            .ok()
+84                            .map(|d| (d, track.id))
+85                    })
+86                });
+87
+88            // No tracks is a playout error, a bad default track is also possible.
+89            // These are probably malformed? We could go best-effort, and fall back to tracks[0]
+90            // but drop such tracks for now.
+91            let (decoder, track_id) =
+92                decoder.ok_or(SymphError::DecodeError("no compatible track found"))?;
+93
+94            let p = Parsed {
+95                format,
+96                decoder,
+97                track_id,
+98                meta,
+99                supports_backseek,
+100            };
+101
+102            out = LiveInput::Parsed(p);
+103        }
+104
+105        Ok(out)
+106    }
+107
+108    /// Returns a reference to the data parsed from this input stream, if it has
+109    /// been made available via [`Self::promote`].
+110    #[must_use]
+111    pub fn parsed(&self) -> Option<&Parsed> {
+112        if let Self::Parsed(parsed) = self {
+113            Some(parsed)
+114        } else {
+115            None
+116        }
+117    }
+118
+119    /// Returns a mutable reference to the data parsed from this input stream, if it
+120    /// has been made available via [`Self::promote`].
+121    pub fn parsed_mut(&mut self) -> Option<&mut Parsed> {
+122        if let Self::Parsed(parsed) = self {
+123            Some(parsed)
+124        } else {
+125            None
+126        }
+127    }
+128
+129    /// Returns whether this stream's headers have been fully parsed, and so whether
+130    /// the track can be played or have its metadata read.
+131    #[must_use]
+132    pub fn is_playable(&self) -> bool {
+133        self.parsed().is_some()
+134    }
+135
+136    /// Tries to get any information about this audio stream acquired during parsing.
+137    ///
+138    /// Only exists when this input is [`LiveInput::Parsed`].
+139    pub fn metadata(&mut self) -> Result<Metadata<'_>, MetadataError> {
+140        if let Some(parsed) = self.parsed_mut() {
+141            Ok(parsed.into())
+142        } else {
+143            Err(MetadataError::NotParsed)
+144        }
+145    }
+146}
+147
+148#[cfg(test)]
+149mod tests {
+150    use crate::{
+151        constants::test_data::FILE_VID_TARGET,
+152        input::{codecs::*, File, Input},
+153    };
+154
+155    #[tokio::test]
+156    #[ntest::timeout(10_000)]
+157    async fn promote_finds_valid_audio() {
+158        // Video files often set their default to... the video stream, unsurprisingly.
+159        // In these cases we still want to play the attached audio -- this checks that songbird
+160        // finds the audio on a non-default track via `LiveInput::promote`.
+161        let input = Input::from(File::new(FILE_VID_TARGET));
+162        input
+163            .make_playable_async(get_codec_registry(), get_probe())
+164            .await
+165            .unwrap();
+166    }
+167}
\ No newline at end of file diff --git a/next/src/songbird/input/metadata/ffprobe.rs.html b/next/src/songbird/input/metadata/ffprobe.rs.html new file mode 100644 index 0000000..f3c444a --- /dev/null +++ b/next/src/songbird/input/metadata/ffprobe.rs.html @@ -0,0 +1,175 @@ +ffprobe.rs - source

songbird/input/metadata/
ffprobe.rs

1use super::AuxMetadata;
+2use serde::{Deserialize, Serialize};
+3use serde_aux::prelude::*;
+4use std::{collections::HashMap, time::Duration};
+5
+6// These have been put together by looking at ffprobe's output
+7// and the canonical data formats given in
+8// https://github.com/FFmpeg/FFmpeg/blob/master/doc/ffprobe.xsd
+9
+10#[derive(Deserialize, Serialize)]
+11pub struct Output {
+12    pub streams: Vec<Stream>,
+13    pub format: Format,
+14}
+15
+16#[derive(Deserialize, Serialize)]
+17pub struct Stream {
+18    pub index: u64,
+19    pub codec_name: Option<String>,
+20    pub codec_long_name: Option<String>,
+21    pub profile: Option<String>,
+22    pub codec_type: Option<String>,
+23    pub codec_tag: String,
+24    pub codec_tag_string: String,
+25    pub extradata: Option<String>,
+26    pub extradata_size: Option<u64>,
+27    pub extradata_hash: Option<String>,
+28
+29    // Video attributes skipped.
+30    pub sample_fmt: Option<String>,
+31    #[serde(deserialize_with = "deserialize_option_number_from_string")]
+32    pub sample_rate: Option<u32>,
+33    pub channels: Option<u32>,
+34    pub channel_layout: Option<String>,
+35    pub bits_per_sample: Option<u32>,
+36
+37    pub id: Option<String>,
+38    pub r_frame_rate: String,
+39    pub avg_frame_rate: String,
+40    pub time_base: String,
+41    pub start_pts: Option<i64>,
+42    #[serde(deserialize_with = "deserialize_option_number_from_string")]
+43    pub start_time: Option<f64>,
+44    pub duration_ts: Option<u64>,
+45    #[serde(deserialize_with = "deserialize_option_number_from_string")]
+46    pub duration: Option<f64>,
+47    #[serde(deserialize_with = "deserialize_option_number_from_string")]
+48    pub bit_rate: Option<u64>,
+49    #[serde(deserialize_with = "deserialize_option_number_from_string")]
+50    pub max_bit_rate: Option<u64>,
+51    pub bits_per_raw_sample: Option<u64>,
+52    pub nb_frames: Option<u64>,
+53    pub nb_read_frames: Option<u64>,
+54    pub nb_read_packets: Option<u64>,
+55
+56    // Side Data List skipped.
+57    pub disposition: Option<Disposition>,
+58    pub tags: Option<HashMap<String, String>>,
+59}
+60
+61#[allow(clippy::struct_excessive_bools)]
+62#[derive(Deserialize, Serialize)]
+63pub struct Disposition {
+64    #[serde(deserialize_with = "deserialize_bool_from_anything")]
+65    pub default: bool,
+66    #[serde(deserialize_with = "deserialize_bool_from_anything")]
+67    pub dub: bool,
+68    #[serde(deserialize_with = "deserialize_bool_from_anything")]
+69    pub original: bool,
+70    #[serde(deserialize_with = "deserialize_bool_from_anything")]
+71    pub comment: bool,
+72    #[serde(deserialize_with = "deserialize_bool_from_anything")]
+73    pub lyrics: bool,
+74    #[serde(deserialize_with = "deserialize_bool_from_anything")]
+75    pub karaoke: bool,
+76    #[serde(deserialize_with = "deserialize_bool_from_anything")]
+77    pub forced: bool,
+78    #[serde(deserialize_with = "deserialize_bool_from_anything")]
+79    pub hearing_impaired: bool,
+80    #[serde(deserialize_with = "deserialize_bool_from_anything")]
+81    pub visual_impaired: bool,
+82    #[serde(deserialize_with = "deserialize_bool_from_anything")]
+83    pub clean_effects: bool,
+84    #[serde(deserialize_with = "deserialize_bool_from_anything")]
+85    pub attached_pic: bool,
+86    #[serde(deserialize_with = "deserialize_bool_from_anything")]
+87    pub timed_thumbnails: bool,
+88    #[serde(deserialize_with = "deserialize_bool_from_anything")]
+89    pub captions: bool,
+90    #[serde(deserialize_with = "deserialize_bool_from_anything")]
+91    pub descriptions: bool,
+92    #[serde(deserialize_with = "deserialize_bool_from_anything")]
+93    pub metadata: bool,
+94    #[serde(deserialize_with = "deserialize_bool_from_anything")]
+95    pub dependent: bool,
+96    #[serde(deserialize_with = "deserialize_bool_from_anything")]
+97    pub still_image: bool,
+98}
+99
+100#[derive(Deserialize, Serialize)]
+101pub struct Format {
+102    pub filename: String,
+103    pub nb_streams: u64,
+104    pub nb_programs: u64,
+105    #[serde(rename = "format_name")]
+106    pub name: String,
+107    #[serde(rename = "format_long_name")]
+108    pub long_name: Option<String>,
+109
+110    #[serde(deserialize_with = "deserialize_option_number_from_string")]
+111    pub start_time: Option<f64>,
+112    #[serde(deserialize_with = "deserialize_option_number_from_string")]
+113    pub duration: Option<f64>,
+114    #[serde(deserialize_with = "deserialize_option_number_from_string")]
+115    pub size: Option<u64>,
+116    #[serde(deserialize_with = "deserialize_option_number_from_string")]
+117    pub bit_rate: Option<u64>,
+118
+119    pub probe_score: i64,
+120    pub tags: Option<HashMap<String, String>>,
+121}
+122
+123fn apply_tags(tag_map: HashMap<String, String>, dest: &mut AuxMetadata) {
+124    for (k, v) in tag_map {
+125        match k.as_str().to_lowercase().as_str() {
+126            "title" => dest.title = Some(v),
+127            "album" => dest.album = Some(v),
+128            "artist" => dest.artist = Some(v),
+129            "date" => dest.date = Some(v),
+130            "channels" =>
+131                if let Ok(chans) = str::parse::<u8>(&v) {
+132                    dest.channels = Some(chans);
+133                },
+134            "sample_rate" =>
+135                if let Ok(samples) = str::parse::<u32>(&v) {
+136                    dest.sample_rate = Some(samples);
+137                },
+138            _ => {},
+139        }
+140    }
+141}
+142
+143impl Output {
+144    pub fn into_aux_metadata(self) -> AuxMetadata {
+145        let duration = self.format.duration.map(Duration::from_secs_f64);
+146        let start_time = self
+147            .format
+148            .duration
+149            .map(|v| v.max(0.0))
+150            .map(Duration::from_secs_f64);
+151
+152        let mut out = AuxMetadata {
+153            start_time,
+154            duration,
+155
+156            ..AuxMetadata::default()
+157        };
+158
+159        if let Some(tags) = self.format.tags {
+160            apply_tags(tags, &mut out);
+161        }
+162
+163        for stream in self.streams {
+164            if stream.codec_type.as_deref() != Some("audio") {
+165                continue;
+166            }
+167
+168            if let Some(tags) = stream.tags {
+169                apply_tags(tags, &mut out);
+170            }
+171        }
+172
+173        out
+174    }
+175}
\ No newline at end of file diff --git a/next/src/songbird/input/metadata/mod.rs.html b/next/src/songbird/input/metadata/mod.rs.html new file mode 100644 index 0000000..a6212a8 --- /dev/null +++ b/next/src/songbird/input/metadata/mod.rs.html @@ -0,0 +1,110 @@ +mod.rs - source

songbird/input/metadata/
mod.rs

1use crate::error::JsonError;
+2use std::time::Duration;
+3use symphonia_core::{meta::Metadata as ContainerMetadata, probe::ProbedMetadata};
+4
+5pub(crate) mod ffprobe;
+6pub(crate) mod ytdl;
+7
+8use super::Parsed;
+9
+10/// Extra information about an [`Input`] which is acquired without
+11/// parsing the file itself (e.g., from a webpage).
+12///
+13/// You can access this via [`Input::aux_metadata`] and [`Compose::aux_metadata`].
+14///
+15/// [`Input`]: crate::input::Input
+16/// [`Input::aux_metadata`]: crate::input::Input::aux_metadata
+17/// [`Compose::aux_metadata`]: crate::input::Compose::aux_metadata
+18#[derive(Clone, Debug, Default, Eq, PartialEq)]
+19pub struct AuxMetadata {
+20    /// The track name of this stream.
+21    pub track: Option<String>,
+22    /// The main artist of this stream.
+23    pub artist: Option<String>,
+24    /// The album name of this stream.
+25    pub album: Option<String>,
+26    /// The date of creation of this stream.
+27    pub date: Option<String>,
+28
+29    /// The number of audio channels in this stream.
+30    pub channels: Option<u8>,
+31    /// The YouTube channel of this stream.
+32    pub channel: Option<String>,
+33    /// The time at which the first true sample is played back.
+34    ///
+35    /// This occurs as an artefact of coder delay.
+36    pub start_time: Option<Duration>,
+37    /// The reported duration of this stream.
+38    pub duration: Option<Duration>,
+39    /// The sample rate of this stream.
+40    pub sample_rate: Option<u32>,
+41    /// The source url of this stream.
+42    pub source_url: Option<String>,
+43    /// The YouTube title of this stream.
+44    pub title: Option<String>,
+45    /// The thumbnail url of this stream.
+46    pub thumbnail: Option<String>,
+47}
+48
+49impl AuxMetadata {
+50    /// Extract metadata and details from the output of `ffprobe -of json`.
+51    pub fn from_ffprobe_json(value: &mut [u8]) -> Result<Self, JsonError> {
+52        let output: ffprobe::Output = serde_json::from_slice(value)?;
+53
+54        Ok(output.into_aux_metadata())
+55    }
+56
+57    /// Move all fields from an [`AuxMetadata`] object into a new one.
+58    #[must_use]
+59    pub fn take(&mut self) -> Self {
+60        Self {
+61            track: self.track.take(),
+62            artist: self.artist.take(),
+63            album: self.album.take(),
+64            date: self.date.take(),
+65            channels: self.channels.take(),
+66            channel: self.channel.take(),
+67            start_time: self.start_time.take(),
+68            duration: self.duration.take(),
+69            sample_rate: self.sample_rate.take(),
+70            source_url: self.source_url.take(),
+71            title: self.title.take(),
+72            thumbnail: self.thumbnail.take(),
+73        }
+74    }
+75}
+76
+77/// In-stream information about an [`Input`] acquired by parsing an audio file.
+78///
+79/// To access this, the [`Input`] must be made live and parsed by symphonia. To do
+80/// this, you can:
+81/// * Pre-process the track in your own code using [`Input::make_playable`], and
+82///   then [`Input::metadata`].
+83/// * Use [`TrackHandle::action`] to access the track's metadata via [`View`],
+84///   *if the track has started or been made playable*.
+85///
+86/// You probably want to use [`AuxMetadata`] instead; this requires a live track,
+87/// which has higher memory use for buffers etc.
+88///
+89/// [`Input`]: crate::input::Input
+90/// [`Input::make_playable`]: super::Input::make_playable
+91/// [`Input::metadata`]: super::Input::metadata
+92/// [`TrackHandle::action`]: crate::tracks::TrackHandle::action
+93/// [`View`]: crate::tracks::View
+94pub struct Metadata<'a> {
+95    /// Metadata found while probing for the format of an [`Input`] (e.g., ID3 tags).
+96    ///
+97    /// [`Input`]: crate::input::Input
+98    pub probe: &'a mut ProbedMetadata,
+99    /// Metadata found inside the format/container of an audio stream.
+100    pub format: ContainerMetadata<'a>,
+101}
+102
+103impl<'a> From<&'a mut Parsed> for Metadata<'a> {
+104    fn from(val: &'a mut Parsed) -> Self {
+105        Metadata {
+106            probe: &mut val.meta,
+107            format: val.format.metadata(),
+108        }
+109    }
+110}
\ No newline at end of file diff --git a/next/src/songbird/input/metadata/ytdl.rs.html b/next/src/songbird/input/metadata/ytdl.rs.html new file mode 100644 index 0000000..5358d9a --- /dev/null +++ b/next/src/songbird/input/metadata/ytdl.rs.html @@ -0,0 +1,56 @@ +ytdl.rs - source

songbird/input/metadata/
ytdl.rs

1use super::AuxMetadata;
+2use crate::constants::SAMPLE_RATE_RAW;
+3use serde::{Deserialize, Serialize};
+4use std::{collections::HashMap, time::Duration};
+5
+6#[derive(Deserialize, Serialize, Debug)]
+7pub struct Output {
+8    pub artist: Option<String>,
+9    pub album: Option<String>,
+10    pub channel: Option<String>,
+11    pub duration: Option<f64>,
+12    pub filesize: Option<u64>,
+13    pub http_headers: Option<HashMap<String, String>>,
+14    pub release_date: Option<String>,
+15    pub thumbnail: Option<String>,
+16    pub title: Option<String>,
+17    pub track: Option<String>,
+18    pub upload_date: Option<String>,
+19    pub uploader: Option<String>,
+20    pub url: String,
+21    pub webpage_url: Option<String>,
+22    pub protocol: Option<String>,
+23}
+24
+25impl Output {
+26    pub fn as_aux_metadata(&self) -> AuxMetadata {
+27        let album = self.album.clone();
+28        let track = self.track.clone();
+29        let true_artist = self.artist.as_ref();
+30        let artist = true_artist.or(self.uploader.as_ref()).cloned();
+31        let r_date = self.release_date.as_ref();
+32        let date = r_date.or(self.upload_date.as_ref()).cloned();
+33        let channel = self.channel.clone();
+34        let duration = self.duration.map(Duration::from_secs_f64);
+35        let source_url = self.webpage_url.clone();
+36        let title = self.title.clone();
+37        let thumbnail = self.thumbnail.clone();
+38
+39        AuxMetadata {
+40            track,
+41            artist,
+42            album,
+43            date,
+44
+45            channels: Some(2),
+46            channel,
+47            duration,
+48            sample_rate: Some(SAMPLE_RATE_RAW as u32),
+49            source_url,
+50            title,
+51            thumbnail,
+52
+53            ..AuxMetadata::default()
+54        }
+55    }
+56}
\ No newline at end of file diff --git a/next/src/songbird/input/mod.rs.html b/next/src/songbird/input/mod.rs.html new file mode 100644 index 0000000..d837294 --- /dev/null +++ b/next/src/songbird/input/mod.rs.html @@ -0,0 +1,382 @@ +mod.rs - source

songbird/input/
mod.rs

1//! Raw audio input data streams and sources.
+2//!
+3//! [`Input`]s in Songbird are based on [symphonia], which provides demuxing,
+4//! decoding and management of synchronous byte sources (i.e., any items which
+5//! `impl` [`Read`]).
+6//!
+7//! Songbird adds support for the Opus codec to symphonia via [`OpusDecoder`],
+8//! the [DCA1] file format via [`DcaReader`], and a simple PCM adapter via [`RawReader`];
+9//! the [format] and [codec registries] in [`codecs`] install these on top of those
+10//! enabled in your `Cargo.toml` when you include symphonia.
+11//!
+12//! ## Common sources
+13//! * Any owned byte slice: `&'static [u8]`, `Bytes`, or `Vec<u8>`,
+14//! * [`File`] offers a lazy way to open local audio files,
+15//! * [`HttpRequest`] streams a given file from a URL using the reqwest HTTP library,
+16//! * [`YoutubeDl`] uses `yt-dlp` (or any other `youtube-dl`-like program) to scrape
+17//!   a target URL for a usable audio stream, before opening an [`HttpRequest`].
+18//!
+19//! ## Adapters
+20//! Songbird includes several adapters to make developing your own inputs easier:
+21//! * [`cached::*`], which allow seeking and shared caching of an input stream (storing
+22//!   it in memory in a variety of formats),
+23//! * [`ChildContainer`] for managing audio given by a process chain,
+24//! * [`RawAdapter`], for feeding in a synchronous `f32`-PCM stream, and
+25//! * [`AsyncAdapterStream`], for passing bytes from an `AsyncRead` (`+ AsyncSeek`) stream
+26//!   into the mixer.
+27//!
+28//! ## Opus frame passthrough.
+29//! Some sources, such as [`Compressed`] or any WebM/Opus/DCA file, support
+30//! direct frame passthrough to the driver. This lets you directly send the
+31//! audio data you have *without decoding, re-encoding, or mixing*. In many
+32//! cases, this can greatly reduce the CPU cost required by the driver.
+33//!
+34//! This functionality requires that:
+35//!  * only one track is active (including paused tracks),
+36//!  * that track's input supports direct Opus frame reads,
+37//!  * this input's frames are all sized to 20ms.
+38//!  * and that track's volume is set to `1.0`.
+39//!
+40//! [`Input`]s which are almost suitable but which have **any** illegal frames will be
+41//! blocked from passthrough to prevent glitches such as repeated encoder frame gaps.
+42//!
+43//! [symphonia]: https://docs.rs/symphonia
+44//! [`Read`]: https://doc.rust-lang.org/std/io/trait.Read.html
+45//! [`Compressed`]: cached::Compressed
+46//! [DCA1]: https://github.com/bwmarrin/dca
+47//! [`cached::*`]: cached
+48//! [`OpusDecoder`]: codecs::OpusDecoder
+49//! [`DcaReader`]: codecs::DcaReader
+50//! [`RawReader`]: codecs::RawReader
+51//! [format]: codecs::get_probe
+52//! [codec registries]: codecs::get_codec_registry
+53
+54mod adapters;
+55mod audiostream;
+56pub mod codecs;
+57mod compose;
+58mod error;
+59#[cfg(test)]
+60pub mod input_tests;
+61mod live_input;
+62mod metadata;
+63mod parsed;
+64mod sources;
+65pub mod utils;
+66
+67pub use self::{
+68    adapters::*,
+69    audiostream::*,
+70    compose::*,
+71    error::*,
+72    live_input::*,
+73    metadata::*,
+74    parsed::*,
+75    sources::*,
+76};
+77
+78pub use symphonia_core as core;
+79
+80use std::{error::Error, io::Cursor};
+81use symphonia_core::{codecs::CodecRegistry, probe::Probe};
+82use tokio::runtime::Handle as TokioHandle;
+83
+84/// An audio source, which can be live or lazily initialised.
+85///
+86/// This can be created from a wide variety of sources:
+87/// * Any owned byte slice: `&'static [u8]`, `Bytes`, or `Vec<u8>`,
+88/// * [`File`] offers a lazy way to open local audio files,
+89/// * [`HttpRequest`] streams a given file from a URL using the reqwest HTTP library,
+90/// * [`YoutubeDl`] uses `yt-dlp` (or any other `youtube-dl`-like program) to scrape
+91///   a target URL for a usable audio stream, before opening an [`HttpRequest`].
+92///
+93/// Any [`Input`] (or struct with `impl Into<Input>`) can also be made into a [`Track`] via
+94/// `From`/`Into`.
+95///
+96/// # Example
+97///
+98/// ```
+99/// # use tokio::runtime;
+100/// #
+101/// # let basic_rt = runtime::Builder::new_current_thread().enable_io().build().unwrap();
+102/// # basic_rt.block_on(async {
+103/// use songbird::{
+104///     driver::Driver,
+105///     input::{codecs::*, Compose, Input, MetadataError, YoutubeDl},
+106///     tracks::Track,
+107/// };
+108/// // Inputs are played using a `Driver`, or `Call`.
+109/// let mut driver = Driver::new(Default::default());
+110///
+111/// // Lazy inputs take very little resources, and don't occupy any resources until we
+112/// // need to play them (by default).
+113/// let mut lazy = YoutubeDl::new(
+114///     reqwest::Client::new(),
+115///     // Referenced under CC BY-NC-SA 3.0 -- https://creativecommons.org/licenses/by-nc-sa/3.0/
+116///     "https://cloudkicker.bandcamp.com/track/94-days",
+117/// );
+118/// let lazy_c = lazy.clone();
+119///
+120/// // With sources like `YoutubeDl`, we can get metadata from, e.g., a track's page.
+121/// let aux_metadata = lazy.aux_metadata().await.unwrap();
+122/// assert_eq!(aux_metadata.track, Some("94 Days".to_string()));
+123///
+124/// // Once we pass an `Input` to the `Driver`, we can only remotely control it via
+125/// // a `TrackHandle`.
+126/// let handle = driver.play_input(lazy.into());
+127///
+128/// // We can also modify some of its initial state via `Track`s.
+129/// let handle = driver.play(Track::from(lazy_c).volume(0.5).pause());
+130///
+131/// // In-memory sources like `Vec<u8>`, or `&'static [u8]` are easy to use, and only take a
+132/// // little time for the mixer to parse their headers.
+133/// // You can also use the adapters in `songbird::input::cached::*`to keep a source
+134/// // from the Internet, HTTP, or a File in-memory *and* share it among calls.
+135/// let in_memory = include_bytes!("../../resources/ting.mp3");
+136/// let mut in_memory_input = in_memory.into();
+137///
+138/// // This source is live...
+139/// assert!(matches!(in_memory_input, Input::Live(..)));
+140/// // ...but not yet playable, and we can't access its `Metadata`.
+141/// assert!(!in_memory_input.is_playable());
+142/// assert!(matches!(in_memory_input.metadata(), Err(MetadataError::NotParsed)));
+143///
+144/// // If we want to inspect metadata (and we can't use AuxMetadata for any reason), we have
+145/// // to parse the track ourselves.
+146/// //
+147/// // We can access it on a live track using `TrackHandle::action()`.
+148/// in_memory_input = in_memory_input
+149///     .make_playable_async(get_codec_registry(), get_probe())
+150///     .await
+151///     .expect("WAV support is included, and this file is good!");
+152///
+153/// // Symphonia's metadata can be difficult to use: prefer `AuxMetadata` when you can!
+154/// use symphonia_core::meta::{StandardTagKey, Value};
+155/// let mut metadata = in_memory_input.metadata();
+156/// let meta = metadata.as_mut().unwrap();
+157/// let mut probed = meta.probe.get().unwrap();
+158///
+159/// let track_name = probed
+160///     .current().unwrap()
+161///     .tags().iter().filter(|v| v.std_key == Some(StandardTagKey::TrackTitle))
+162///     .next().unwrap();
+163/// if let Value::String(s) = &track_name.value {
+164///     assert_eq!(s, "Ting!");
+165/// } else { panic!() };
+166///
+167/// // ...and these are played like any other input.
+168/// let handle = driver.play_input(in_memory_input);
+169/// # });
+170/// ```
+171///
+172/// [`Track`]: crate::tracks::Track
+173pub enum Input {
+174    /// A byte source which is not yet initialised.
+175    ///
+176    /// When a parent track is either played or explicitly readied, the inner [`Compose`]
+177    /// is used to create an [`Input::Live`].
+178    Lazy(
+179        /// A trait object which can be used to (re)create a usable byte stream.
+180        Box<dyn Compose>,
+181    ),
+182    /// An initialised byte source.
+183    ///
+184    /// This contains a raw byte stream, the lazy initialiser that was used,
+185    /// as well as any symphonia-specific format data and/or hints.
+186    Live(
+187        /// The byte source, plus symphonia-specific data.
+188        LiveInput,
+189        /// The struct used to initialise this source, if available.
+190        ///
+191        /// This is used to recreate the stream when a source does not support
+192        /// backward seeking, if present.
+193        Option<Box<dyn Compose>>,
+194    ),
+195}
+196
+197impl Input {
+198    /// Requests auxiliary metadata which can be accessed without parsing the file.
+199    ///
+200    /// This method will never be called by songbird but allows, for instance, access to metadata
+201    /// which might only be visible to a web crawler, e.g., uploader or source URL.
+202    ///
+203    /// This requires that the [`Input`] has a [`Compose`] available to use, otherwise it
+204    /// will always fail with [`AudioStreamError::Unsupported`].
+205    pub async fn aux_metadata(&mut self) -> Result<AuxMetadata, AuxMetadataError> {
+206        match self {
+207            Self::Lazy(ref mut composer) | Self::Live(_, Some(ref mut composer)) =>
+208                composer.aux_metadata().await.map_err(Into::into),
+209            Self::Live(_, None) => Err(AuxMetadataError::NoCompose),
+210        }
+211    }
+212
+213    /// Tries to get any information about this audio stream acquired during parsing.
+214    ///
+215    /// Only exists when this input is both [`Self::Live`] and has been fully parsed.
+216    /// In general, you probably want to use [`Self::aux_metadata`].
+217    pub fn metadata(&mut self) -> Result<Metadata<'_>, MetadataError> {
+218        if let Self::Live(live, _) = self {
+219            live.metadata()
+220        } else {
+221            Err(MetadataError::NotLive)
+222        }
+223    }
+224
+225    /// Initialises (but does not parse) an [`Input::Lazy`] into an [`Input::Live`],
+226    /// placing blocking I/O on the current thread.
+227    ///
+228    /// This requires a [`TokioHandle`] to a tokio runtime to spawn any `async` sources.
+229    ///
+230    /// *This is a blocking operation. If you wish to use this from an async task, you
+231    /// must do so via [`Self::make_live_async`].*
+232    ///
+233    /// This is a no-op for an [`Input::Live`].
+234    pub fn make_live(self, handle: &TokioHandle) -> Result<Self, AudioStreamError> {
+235        if let Self::Lazy(mut lazy) = self {
+236            let (created, lazy) = if lazy.should_create_async() {
+237                let (tx, rx) = flume::bounded(1);
+238                handle.spawn(async move {
+239                    let out = lazy.create_async().await;
+240                    drop(tx.send_async((out, lazy)));
+241                });
+242                rx.recv().map_err(|_| {
+243                    let err_msg: Box<dyn Error + Send + Sync> =
+244                        "async Input create handler panicked".into();
+245                    AudioStreamError::Fail(err_msg)
+246                })?
+247            } else {
+248                (lazy.create(), lazy)
+249            };
+250
+251            Ok(Self::Live(LiveInput::Raw(created?), Some(lazy)))
+252        } else {
+253            Ok(self)
+254        }
+255    }
+256
+257    /// Initialises (but does not parse) an [`Input::Lazy`] into an [`Input::Live`],
+258    /// placing blocking I/O on the a `spawn_blocking` executor.
+259    ///
+260    /// This is a no-op for an [`Input::Live`].
+261    pub async fn make_live_async(self) -> Result<Self, AudioStreamError> {
+262        if let Self::Lazy(mut lazy) = self {
+263            let (created, lazy) = if lazy.should_create_async() {
+264                (lazy.create_async().await, lazy)
+265            } else {
+266                tokio::task::spawn_blocking(move || (lazy.create(), lazy))
+267                    .await
+268                    .map_err(|_| {
+269                        let err_msg: Box<dyn Error + Send + Sync> =
+270                            "synchronous Input create handler panicked".into();
+271                        AudioStreamError::Fail(err_msg)
+272                    })?
+273            };
+274
+275            Ok(Self::Live(LiveInput::Raw(created?), Some(lazy)))
+276        } else {
+277            Ok(self)
+278        }
+279    }
+280
+281    /// Initialises and parses an [`Input::Lazy`] into an [`Input::Live`],
+282    /// placing blocking I/O on the current thread.
+283    ///
+284    /// This requires a [`TokioHandle`] to a tokio runtime to spawn any `async` sources.
+285    /// If you can't access one, then consider manually using [`LiveInput::promote`].
+286    ///
+287    /// *This is a blocking operation. Symphonia uses standard library I/O (e.g., [`Read`], [`Seek`]).
+288    /// If you wish to use this from an async task, you must do so within `spawn_blocking`.*
+289    ///
+290    /// [`Read`]: https://doc.rust-lang.org/std/io/trait.Read.html
+291    /// [`Seek`]: https://doc.rust-lang.org/std/io/trait.Seek.html
+292    pub fn make_playable(
+293        self,
+294        codecs: &CodecRegistry,
+295        probe: &Probe,
+296        handle: &TokioHandle,
+297    ) -> Result<Self, MakePlayableError> {
+298        let out = self.make_live(handle)?;
+299        match out {
+300            Self::Lazy(_) => unreachable!(),
+301            Self::Live(input, lazy) => {
+302                let promoted = input.promote(codecs, probe)?;
+303                Ok(Self::Live(promoted, lazy))
+304            },
+305        }
+306    }
+307
+308    /// Initialises and parses an [`Input::Lazy`] into an [`Input::Live`],
+309    /// placing blocking I/O on a tokio blocking thread.
+310    pub async fn make_playable_async(
+311        self,
+312        codecs: &'static CodecRegistry,
+313        probe: &'static Probe,
+314    ) -> Result<Self, MakePlayableError> {
+315        let out = self.make_live_async().await?;
+316        match out {
+317            Self::Lazy(_) => unreachable!(),
+318            Self::Live(input, lazy) => {
+319                let promoted = tokio::task::spawn_blocking(move || input.promote(codecs, probe))
+320                    .await
+321                    .map_err(|_| MakePlayableError::Panicked)??;
+322                Ok(Self::Live(promoted, lazy))
+323            },
+324        }
+325    }
+326
+327    /// Returns whether this audio stream is full initialised, parsed, and
+328    /// ready to play (e.g., `Self::Live(LiveInput::Parsed(p), _)`).
+329    #[must_use]
+330    pub fn is_playable(&self) -> bool {
+331        if let Self::Live(input, _) = self {
+332            input.is_playable()
+333        } else {
+334            false
+335        }
+336    }
+337
+338    /// Returns a reference to the live input, if it has been created via
+339    /// [`Self::make_live`] or [`Self::make_live_async`].
+340    #[must_use]
+341    pub fn live(&self) -> Option<&LiveInput> {
+342        if let Self::Live(input, _) = self {
+343            Some(input)
+344        } else {
+345            None
+346        }
+347    }
+348
+349    /// Returns a mutable reference to the live input, if it been created via
+350    /// [`Self::make_live`] or [`Self::make_live_async`].
+351    pub fn live_mut(&mut self) -> Option<&mut LiveInput> {
+352        if let Self::Live(ref mut input, _) = self {
+353            Some(input)
+354        } else {
+355            None
+356        }
+357    }
+358
+359    /// Returns a reference to the data parsed from this input stream, if it has
+360    /// been made available via [`Self::make_playable`] or [`LiveInput::promote`].
+361    #[must_use]
+362    pub fn parsed(&self) -> Option<&Parsed> {
+363        self.live().and_then(LiveInput::parsed)
+364    }
+365
+366    /// Returns a mutable reference to the data parsed from this input stream, if it
+367    /// has been made available via [`Self::make_playable`] or [`LiveInput::promote`].
+368    pub fn parsed_mut(&mut self) -> Option<&mut Parsed> {
+369        self.live_mut().and_then(LiveInput::parsed_mut)
+370    }
+371}
+372
+373impl<T: AsRef<[u8]> + Send + Sync + 'static> From<T> for Input {
+374    fn from(val: T) -> Self {
+375        let raw_src = LiveInput::Raw(AudioStream {
+376            input: Box::new(Cursor::new(val)),
+377            hint: None,
+378        });
+379
+380        Input::Live(raw_src, None)
+381    }
+382}
\ No newline at end of file diff --git a/next/src/songbird/input/parsed.rs.html b/next/src/songbird/input/parsed.rs.html new file mode 100644 index 0000000..99575b0 --- /dev/null +++ b/next/src/songbird/input/parsed.rs.html @@ -0,0 +1,31 @@ +parsed.rs - source

songbird/input/
parsed.rs

1use symphonia_core::{codecs::Decoder, formats::FormatReader, probe::ProbedMetadata};
+2
+3/// An audio file which has had its headers parsed and decoder state built.
+4pub struct Parsed {
+5    /// Audio packet, seeking, and state access for all tracks in a file.
+6    ///
+7    /// This may be used to access packets one at a time from the input file.
+8    /// Additionally, this exposes container-level and per track metadata which
+9    /// have been extracted.
+10    pub format: Box<dyn FormatReader>,
+11
+12    /// Decoder state for the chosen track.
+13    pub decoder: Box<dyn Decoder>,
+14
+15    /// The chosen track's ID.
+16    ///
+17    /// This is required to identify the correct packet stream inside the container.
+18    pub track_id: u32,
+19
+20    /// Metadata extracted by symphonia while detecting a file's format.
+21    ///
+22    /// Typically, this detects metadata *outside* the file's core format (i.e.,
+23    /// ID3 tags in MP3 and WAV files).
+24    pub meta: ProbedMetadata,
+25
+26    /// Whether the contained format supports arbitrary seeking.
+27    ///
+28    /// If set to false, Songbird will attempt to recreate the input if
+29    /// it must seek backwards.
+30    pub supports_backseek: bool,
+31}
\ No newline at end of file diff --git a/next/src/songbird/input/sources/file.rs.html b/next/src/songbird/input/sources/file.rs.html new file mode 100644 index 0000000..d009009 --- /dev/null +++ b/next/src/songbird/input/sources/file.rs.html @@ -0,0 +1,86 @@ +file.rs - source

songbird/input/sources/
file.rs

1use crate::input::{AudioStream, AudioStreamError, Compose, Input};
+2use std::{error::Error, ffi::OsStr, path::Path};
+3use symphonia_core::{io::MediaSource, probe::Hint};
+4
+5/// A lazily instantiated local file.
+6#[derive(Clone, Debug)]
+7pub struct File<P: AsRef<Path>> {
+8    path: P,
+9}
+10
+11impl<P: AsRef<Path>> File<P> {
+12    /// Creates a lazy file object, which will open the target path.
+13    ///
+14    /// This is infallible as the path is only checked during creation.
+15    pub fn new(path: P) -> Self {
+16        Self { path }
+17    }
+18}
+19
+20impl<P: AsRef<Path> + Send + Sync + 'static> From<File<P>> for Input {
+21    fn from(val: File<P>) -> Self {
+22        Input::Lazy(Box::new(val))
+23    }
+24}
+25
+26#[async_trait::async_trait]
+27impl<P: AsRef<Path> + Send + Sync> Compose for File<P> {
+28    fn create(&mut self) -> Result<AudioStream<Box<dyn MediaSource>>, AudioStreamError> {
+29        let err: Box<dyn Error + Send + Sync> =
+30            "Files should be created asynchronously.".to_string().into();
+31        Err(AudioStreamError::Fail(err))
+32    }
+33
+34    async fn create_async(
+35        &mut self,
+36    ) -> Result<AudioStream<Box<dyn MediaSource>>, AudioStreamError> {
+37        let file = tokio::fs::File::open(&self.path)
+38            .await
+39            .map_err(|io| AudioStreamError::Fail(Box::new(io)))?;
+40
+41        let input = Box::new(file.into_std().await);
+42
+43        let mut hint = Hint::default();
+44        if let Some(ext) = self.path.as_ref().extension().and_then(OsStr::to_str) {
+45            hint.with_extension(ext);
+46        }
+47
+48        Ok(AudioStream {
+49            input,
+50            hint: Some(hint),
+51        })
+52    }
+53
+54    fn should_create_async(&self) -> bool {
+55        true
+56    }
+57
+58    // SEE: issue #186
+59    // Below is removed due to issues with:
+60    // 1) deadlocks on small files.
+61    // 2) serde_aux poorly handles missing field names.
+62    //
+63
+64    // Probes for metadata about this audio file using `ffprobe`.
+65    // async fn aux_metadata(&mut self) -> Result<AuxMetadata, AudioStreamError> {
+66    //     let args = [
+67    //         "-v",
+68    //         "quiet",
+69    //         "-of",
+70    //         "json",
+71    //         "-show_format",
+72    //         "-show_streams",
+73    //         "-i",
+74    //     ];
+75
+76    //     let mut output = Command::new("ffprobe")
+77    //         .args(args)
+78    //         .arg(self.path.as_ref().as_os_str())
+79    //         .output()
+80    //         .await
+81    //         .map_err(|e| AudioStreamError::Fail(Box::new(e)))?;
+82
+83    //     AuxMetadata::from_ffprobe_json(&mut output.stdout[..])
+84    //         .map_err(|e| AudioStreamError::Fail(Box::new(e)))
+85    // }
+86}
\ No newline at end of file diff --git a/next/src/songbird/input/sources/hls.rs.html b/next/src/songbird/input/sources/hls.rs.html new file mode 100644 index 0000000..004bc90 --- /dev/null +++ b/next/src/songbird/input/sources/hls.rs.html @@ -0,0 +1,102 @@ +hls.rs - source

songbird/input/sources/
hls.rs

1use async_trait::async_trait;
+2use bytes::Bytes;
+3use futures::StreamExt;
+4use reqwest::{header::HeaderMap, Client};
+5use stream_lib::Event;
+6use symphonia_core::io::MediaSource;
+7use tokio_util::io::StreamReader;
+8
+9use crate::input::{
+10    AsyncAdapterStream,
+11    AsyncReadOnlySource,
+12    AudioStream,
+13    AudioStreamError,
+14    Compose,
+15    Input,
+16};
+17
+18/// Lazy HLS stream
+19///
+20/// # Note:
+21///
+22/// `Compose::create` for this struct panics if called outside of a
+23/// tokio executor since it uses background tasks.
+24#[derive(Debug)]
+25pub struct HlsRequest {
+26    /// HTTP client
+27    client: Client,
+28    /// URL of hls playlist
+29    request: String,
+30    /// Headers of the request
+31    headers: HeaderMap,
+32}
+33
+34impl HlsRequest {
+35    #[must_use]
+36    /// Create a lazy HLS request.
+37    pub fn new(client: Client, request: String) -> Self {
+38        Self::new_with_headers(client, request, HeaderMap::default())
+39    }
+40
+41    #[must_use]
+42    /// Create a lazy HTTP request.
+43    pub fn new_with_headers(client: Client, request: String, headers: HeaderMap) -> Self {
+44        HlsRequest {
+45            client,
+46            request,
+47            headers,
+48        }
+49    }
+50
+51    fn create_stream(&mut self) -> Result<AsyncReadOnlySource, AudioStreamError> {
+52        let request = self
+53            .client
+54            .get(&self.request)
+55            .headers(self.headers.clone())
+56            .build()
+57            .map_err(|why| AudioStreamError::Fail(why.into()))?;
+58
+59        let hls = stream_lib::download_hls(self.client.clone(), request, None);
+60
+61        let stream = Box::new(StreamReader::new(hls.map(|ev| match ev {
+62            Event::Bytes { bytes } => Ok(bytes),
+63            Event::End => Ok(Bytes::new()),
+64            Event::Error { error } => Err(std::io::Error::new(
+65                std::io::ErrorKind::UnexpectedEof,
+66                error,
+67            )),
+68        })));
+69
+70        Ok(AsyncReadOnlySource { stream })
+71    }
+72}
+73
+74#[async_trait]
+75impl Compose for HlsRequest {
+76    fn create(&mut self) -> Result<AudioStream<Box<dyn MediaSource>>, AudioStreamError> {
+77        self.create_stream().map(|input| {
+78            let stream = AsyncAdapterStream::new(Box::new(input), 64 * 1024);
+79
+80            AudioStream {
+81                input: Box::new(stream) as Box<dyn MediaSource>,
+82                hint: None,
+83            }
+84        })
+85    }
+86
+87    async fn create_async(
+88        &mut self,
+89    ) -> Result<AudioStream<Box<dyn MediaSource>>, AudioStreamError> {
+90        self.create()
+91    }
+92
+93    fn should_create_async(&self) -> bool {
+94        true
+95    }
+96}
+97
+98impl From<HlsRequest> for Input {
+99    fn from(val: HlsRequest) -> Self {
+100        Input::Lazy(Box::new(val))
+101    }
+102}
\ No newline at end of file diff --git a/next/src/songbird/input/sources/http.rs.html b/next/src/songbird/input/sources/http.rs.html new file mode 100644 index 0000000..8fe8599 --- /dev/null +++ b/next/src/songbird/input/sources/http.rs.html @@ -0,0 +1,295 @@ +http.rs - source

songbird/input/sources/
http.rs

1use crate::input::{
+2    AsyncAdapterStream,
+3    AsyncMediaSource,
+4    AudioStream,
+5    AudioStreamError,
+6    Compose,
+7    Input,
+8};
+9use async_trait::async_trait;
+10use futures::TryStreamExt;
+11use pin_project::pin_project;
+12use reqwest::{
+13    header::{HeaderMap, ACCEPT_RANGES, CONTENT_LENGTH, CONTENT_TYPE, RANGE, RETRY_AFTER},
+14    Client,
+15};
+16use std::{
+17    io::{Error as IoError, ErrorKind as IoErrorKind, Result as IoResult, SeekFrom},
+18    pin::Pin,
+19    task::{Context, Poll},
+20    time::Duration,
+21};
+22use symphonia_core::{io::MediaSource, probe::Hint};
+23use tokio::io::{AsyncRead, AsyncSeek, ReadBuf};
+24use tokio_util::io::StreamReader;
+25
+26/// A lazily instantiated HTTP request.
+27#[derive(Clone, Debug)]
+28pub struct HttpRequest {
+29    /// A reqwest client instance used to send the HTTP GET request.
+30    pub client: Client,
+31    /// The target URL of the required resource.
+32    pub request: String,
+33    /// HTTP header fields to add to any created requests.
+34    pub headers: HeaderMap,
+35    /// Content length, used as an upper bound in range requests if known.
+36    ///
+37    /// This is only needed for certain domains who expect to see a value like
+38    /// `range: bytes=0-1023` instead of the simpler `range: bytes=0-` (such as
+39    /// Youtube).
+40    pub content_length: Option<u64>,
+41}
+42
+43impl HttpRequest {
+44    #[must_use]
+45    /// Create a lazy HTTP request.
+46    pub fn new(client: Client, request: String) -> Self {
+47        Self::new_with_headers(client, request, HeaderMap::default())
+48    }
+49
+50    #[must_use]
+51    /// Create a lazy HTTP request.
+52    pub fn new_with_headers(client: Client, request: String, headers: HeaderMap) -> Self {
+53        HttpRequest {
+54            client,
+55            request,
+56            headers,
+57            content_length: None,
+58        }
+59    }
+60
+61    async fn create_stream(
+62        &mut self,
+63        offset: Option<u64>,
+64    ) -> Result<(HttpStream, Option<Hint>), AudioStreamError> {
+65        let mut resp = self.client.get(&self.request).headers(self.headers.clone());
+66
+67        match (offset, self.content_length) {
+68            (Some(offset), None) => {
+69                resp = resp.header(RANGE, format!("bytes={offset}-"));
+70            },
+71            (offset, Some(max)) => {
+72                resp = resp.header(
+73                    RANGE,
+74                    format!("bytes={}-{}", offset.unwrap_or(0), max.saturating_sub(1)),
+75                );
+76            },
+77            _ => {},
+78        }
+79
+80        let resp = resp
+81            .send()
+82            .await
+83            .map_err(|e| AudioStreamError::Fail(Box::new(e)))?;
+84
+85        if !resp.status().is_success() {
+86            let msg: Box<dyn std::error::Error + Send + Sync + 'static> =
+87                format!("failed with http status code: {}", resp.status()).into();
+88            return Err(AudioStreamError::Fail(msg));
+89        }
+90
+91        if let Some(t) = resp.headers().get(RETRY_AFTER) {
+92            t.to_str()
+93                .map_err(|_| {
+94                    let msg: Box<dyn std::error::Error + Send + Sync + 'static> =
+95                        "Retry-after field contained non-ASCII data.".into();
+96                    AudioStreamError::Fail(msg)
+97                })
+98                .and_then(|str_text| {
+99                    str_text.parse().map_err(|_| {
+100                        let msg: Box<dyn std::error::Error + Send + Sync + 'static> =
+101                            "Retry-after field was non-numeric.".into();
+102                        AudioStreamError::Fail(msg)
+103                    })
+104                })
+105                .and_then(|t| Err(AudioStreamError::RetryIn(Duration::from_secs(t))))
+106        } else {
+107            let headers = resp.headers();
+108
+109            let hint = headers
+110                .get(CONTENT_TYPE)
+111                .and_then(|val| val.to_str().ok())
+112                .map(|val| {
+113                    let mut out = Hint::default();
+114                    out.mime_type(val);
+115                    out
+116                });
+117
+118            let len = headers
+119                .get(CONTENT_LENGTH)
+120                .and_then(|val| val.to_str().ok())
+121                .and_then(|val| val.parse().ok());
+122
+123            let resume = headers
+124                .get(ACCEPT_RANGES)
+125                .and_then(|a| a.to_str().ok())
+126                .and_then(|a| {
+127                    if a == "bytes" {
+128                        Some(self.clone())
+129                    } else {
+130                        None
+131                    }
+132                });
+133
+134            let stream = Box::new(StreamReader::new(
+135                resp.bytes_stream().map_err(IoError::other),
+136            ));
+137
+138            let input = HttpStream {
+139                stream,
+140                len,
+141                resume,
+142            };
+143
+144            Ok((input, hint))
+145        }
+146    }
+147}
+148
+149#[pin_project]
+150struct HttpStream {
+151    #[pin]
+152    stream: Box<dyn AsyncRead + Send + Sync + Unpin>,
+153    len: Option<u64>,
+154    resume: Option<HttpRequest>,
+155}
+156
+157impl AsyncRead for HttpStream {
+158    fn poll_read(
+159        self: Pin<&mut Self>,
+160        cx: &mut Context<'_>,
+161        buf: &mut ReadBuf<'_>,
+162    ) -> Poll<IoResult<()>> {
+163        AsyncRead::poll_read(self.project().stream, cx, buf)
+164    }
+165}
+166
+167impl AsyncSeek for HttpStream {
+168    fn start_seek(self: Pin<&mut Self>, _position: SeekFrom) -> IoResult<()> {
+169        Err(IoErrorKind::Unsupported.into())
+170    }
+171
+172    fn poll_complete(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<IoResult<u64>> {
+173        unreachable!()
+174    }
+175}
+176
+177#[async_trait]
+178impl AsyncMediaSource for HttpStream {
+179    fn is_seekable(&self) -> bool {
+180        false
+181    }
+182
+183    async fn byte_len(&self) -> Option<u64> {
+184        self.len
+185    }
+186
+187    async fn try_resume(
+188        &mut self,
+189        offset: u64,
+190    ) -> Result<Box<dyn AsyncMediaSource>, AudioStreamError> {
+191        if let Some(resume) = &mut self.resume {
+192            resume
+193                .create_stream(Some(offset))
+194                .await
+195                .map(|a| Box::new(a.0) as Box<dyn AsyncMediaSource>)
+196        } else {
+197            Err(AudioStreamError::Unsupported)
+198        }
+199    }
+200}
+201
+202#[async_trait]
+203impl Compose for HttpRequest {
+204    fn create(&mut self) -> Result<AudioStream<Box<dyn MediaSource>>, AudioStreamError> {
+205        Err(AudioStreamError::Unsupported)
+206    }
+207
+208    async fn create_async(
+209        &mut self,
+210    ) -> Result<AudioStream<Box<dyn MediaSource>>, AudioStreamError> {
+211        self.create_stream(None).await.map(|(input, hint)| {
+212            let stream = AsyncAdapterStream::new(Box::new(input), 64 * 1024);
+213
+214            AudioStream {
+215                input: Box::new(stream) as Box<dyn MediaSource>,
+216                hint,
+217            }
+218        })
+219    }
+220
+221    fn should_create_async(&self) -> bool {
+222        true
+223    }
+224}
+225
+226impl From<HttpRequest> for Input {
+227    fn from(val: HttpRequest) -> Self {
+228        Input::Lazy(Box::new(val))
+229    }
+230}
+231
+232#[cfg(test)]
+233mod tests {
+234    use super::*;
+235    use crate::{
+236        constants::test_data::{HTTP_OPUS_TARGET, HTTP_TARGET, HTTP_WEBM_TARGET},
+237        input::input_tests::*,
+238    };
+239
+240    #[tokio::test]
+241    #[ntest::timeout(10_000)]
+242    async fn http_track_plays() {
+243        track_plays_mixed(|| HttpRequest::new(Client::new(), HTTP_TARGET.into())).await;
+244    }
+245
+246    #[tokio::test]
+247    #[ntest::timeout(10_000)]
+248    async fn http_forward_seek_correct() {
+249        forward_seek_correct(|| HttpRequest::new(Client::new(), HTTP_TARGET.into())).await;
+250    }
+251
+252    #[tokio::test]
+253    #[ntest::timeout(10_000)]
+254    async fn http_backward_seek_correct() {
+255        backward_seek_correct(|| HttpRequest::new(Client::new(), HTTP_TARGET.into())).await;
+256    }
+257
+258    // NOTE: this covers youtube audio in a non-copyright-violating way, since
+259    // those depend on an HttpRequest internally anyhow.
+260    #[tokio::test]
+261    #[ntest::timeout(10_000)]
+262    async fn http_opus_track_plays() {
+263        track_plays_passthrough(|| HttpRequest::new(Client::new(), HTTP_OPUS_TARGET.into())).await;
+264    }
+265
+266    #[tokio::test]
+267    #[ntest::timeout(10_000)]
+268    async fn http_opus_forward_seek_correct() {
+269        forward_seek_correct(|| HttpRequest::new(Client::new(), HTTP_OPUS_TARGET.into())).await;
+270    }
+271
+272    #[tokio::test]
+273    #[ntest::timeout(10_000)]
+274    async fn http_opus_backward_seek_correct() {
+275        backward_seek_correct(|| HttpRequest::new(Client::new(), HTTP_OPUS_TARGET.into())).await;
+276    }
+277
+278    #[tokio::test]
+279    #[ntest::timeout(10_000)]
+280    async fn http_webm_track_plays() {
+281        track_plays_passthrough(|| HttpRequest::new(Client::new(), HTTP_WEBM_TARGET.into())).await;
+282    }
+283
+284    #[tokio::test]
+285    #[ntest::timeout(10_000)]
+286    async fn http_webm_forward_seek_correct() {
+287        forward_seek_correct(|| HttpRequest::new(Client::new(), HTTP_WEBM_TARGET.into())).await;
+288    }
+289
+290    #[tokio::test]
+291    #[ntest::timeout(10_000)]
+292    async fn http_webm_backward_seek_correct() {
+293        backward_seek_correct(|| HttpRequest::new(Client::new(), HTTP_WEBM_TARGET.into())).await;
+294    }
+295}
\ No newline at end of file diff --git a/next/src/songbird/input/sources/mod.rs.html b/next/src/songbird/input/sources/mod.rs.html new file mode 100644 index 0000000..1e4ca56 --- /dev/null +++ b/next/src/songbird/input/sources/mod.rs.html @@ -0,0 +1,90 @@ +mod.rs - source

songbird/input/sources/
mod.rs

1mod file;
+2mod hls;
+3mod http;
+4mod ytdl;
+5
+6pub use self::{file::*, hls::*, http::*, ytdl::*};
+7
+8use std::{
+9    io::{ErrorKind as IoErrorKind, Result as IoResult, SeekFrom},
+10    pin::Pin,
+11    task::{Context, Poll},
+12};
+13
+14use async_trait::async_trait;
+15use pin_project::pin_project;
+16use tokio::io::{AsyncRead, AsyncSeek, ReadBuf};
+17
+18use crate::input::{AsyncMediaSource, AudioStreamError};
+19
+20/// `AsyncReadOnlySource` wraps any source implementing [`tokio::io::AsyncRead`] in an unseekable
+21/// [`symphonia_core::io::MediaSource`], similar to [`symphonia_core::io::ReadOnlySource`]
+22#[pin_project]
+23pub struct AsyncReadOnlySource {
+24    #[pin]
+25    stream: Box<dyn AsyncRead + Send + Sync + Unpin>,
+26}
+27
+28impl AsyncReadOnlySource {
+29    /// Instantiates a new `AsyncReadOnlySource` by taking ownership and wrapping the provided
+30    /// `Read`er.
+31    pub fn new<R>(inner: R) -> Self
+32    where
+33        R: AsyncRead + Send + Sync + Unpin + 'static,
+34    {
+35        AsyncReadOnlySource {
+36            stream: Box::new(inner),
+37        }
+38    }
+39
+40    /// Gets a reference to the underlying reader.
+41    #[allow(clippy::borrowed_box)] // FIXME: Changing this may break compatibility. remedy in v0.5
+42    #[must_use]
+43    pub fn get_ref(&self) -> &Box<dyn AsyncRead + Send + Sync + Unpin> {
+44        &self.stream
+45    }
+46
+47    /// Unwraps this `AsyncReadOnlySource`, returning the underlying reader.
+48    #[must_use]
+49    pub fn into_inner<R>(self) -> Box<dyn AsyncRead + Send + Sync + Unpin> {
+50        self.stream
+51    }
+52}
+53
+54impl AsyncRead for AsyncReadOnlySource {
+55    fn poll_read(
+56        self: Pin<&mut Self>,
+57        cx: &mut Context<'_>,
+58        buf: &mut ReadBuf<'_>,
+59    ) -> Poll<IoResult<()>> {
+60        AsyncRead::poll_read(self.project().stream, cx, buf)
+61    }
+62}
+63
+64impl AsyncSeek for AsyncReadOnlySource {
+65    fn start_seek(self: Pin<&mut Self>, _position: SeekFrom) -> IoResult<()> {
+66        Err(IoErrorKind::Unsupported.into())
+67    }
+68
+69    fn poll_complete(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<IoResult<u64>> {
+70        unreachable!()
+71    }
+72}
+73
+74#[async_trait]
+75impl AsyncMediaSource for AsyncReadOnlySource {
+76    fn is_seekable(&self) -> bool {
+77        false
+78    }
+79
+80    async fn byte_len(&self) -> Option<u64> {
+81        None
+82    }
+83
+84    async fn try_resume(
+85        &mut self,
+86        _offset: u64,
+87    ) -> Result<Box<dyn AsyncMediaSource>, AudioStreamError> {
+88        Err(AudioStreamError::Unsupported)
+89    }
+90}
\ No newline at end of file diff --git a/next/src/songbird/input/sources/ytdl.rs.html b/next/src/songbird/input/sources/ytdl.rs.html new file mode 100644 index 0000000..9f9ad90 --- /dev/null +++ b/next/src/songbird/input/sources/ytdl.rs.html @@ -0,0 +1,317 @@ +ytdl.rs - source

songbird/input/sources/
ytdl.rs

1use crate::input::{
+2    metadata::ytdl::Output,
+3    AudioStream,
+4    AudioStreamError,
+5    AuxMetadata,
+6    Compose,
+7    HttpRequest,
+8    Input,
+9};
+10use async_trait::async_trait;
+11use either::Either;
+12use reqwest::{
+13    header::{HeaderMap, HeaderName, HeaderValue},
+14    Client,
+15};
+16use std::{borrow::Cow, error::Error, io::ErrorKind};
+17use symphonia_core::io::MediaSource;
+18use tokio::process::Command;
+19
+20use super::HlsRequest;
+21
+22const YOUTUBE_DL_COMMAND: &str = "yt-dlp";
+23
+24#[derive(Clone, Debug)]
+25enum QueryType<'a> {
+26    Url(Cow<'a, str>),
+27    Search(Cow<'a, str>),
+28}
+29
+30impl<'a> QueryType<'a> {
+31    fn as_cow_str(&'a self, n_results: usize) -> Cow<'a, str> {
+32        match self {
+33            Self::Url(Cow::Owned(u)) => Cow::Borrowed(u),
+34            Self::Url(Cow::Borrowed(u)) => Cow::Borrowed(u),
+35            Self::Search(s) => Cow::Owned(format!("ytsearch{n_results}:{s}")),
+36        }
+37    }
+38}
+39
+40/// A lazily instantiated call to download a file, finding its URL via youtube-dl.
+41///
+42/// By default, this uses yt-dlp and is backed by an [`HttpRequest`]. This handler
+43/// attempts to find the best audio-only source (typically `WebM`, enabling low-cost
+44/// Opus frame passthrough).
+45///
+46/// [`HttpRequest`]: super::HttpRequest
+47#[derive(Clone, Debug)]
+48pub struct YoutubeDl<'a> {
+49    program: &'a str,
+50    client: Client,
+51    metadata: Option<AuxMetadata>,
+52    query: QueryType<'a>,
+53    user_args: Vec<String>,
+54}
+55
+56impl<'a> YoutubeDl<'a> {
+57    /// Creates a lazy request to select an audio stream from `url`, using "yt-dlp".
+58    ///
+59    /// This requires a reqwest client: ideally, one should be created and shared between
+60    /// all requests.
+61    #[must_use]
+62    pub fn new(client: Client, url: impl Into<Cow<'a, str>>) -> Self {
+63        Self::new_ytdl_like(YOUTUBE_DL_COMMAND, client, url)
+64    }
+65
+66    /// Creates a lazy request to select an audio stream from `url` as in [`new`], using `program`.
+67    ///
+68    /// [`new`]: Self::new
+69    #[must_use]
+70    pub fn new_ytdl_like(program: &'a str, client: Client, url: impl Into<Cow<'a, str>>) -> Self {
+71        Self {
+72            program,
+73            client,
+74            metadata: None,
+75            query: QueryType::Url(url.into()),
+76            user_args: Vec::new(),
+77        }
+78    }
+79
+80    /// Creates a request to search youtube for an optionally specified number of videos matching `query`,
+81    /// using "yt-dlp".
+82    #[must_use]
+83    pub fn new_search(client: Client, query: impl Into<Cow<'a, str>>) -> Self {
+84        Self::new_search_ytdl_like(YOUTUBE_DL_COMMAND, client, query)
+85    }
+86
+87    /// Creates a request to search youtube for an optionally specified number of videos matching `query`,
+88    /// using `program`.
+89    #[must_use]
+90    pub fn new_search_ytdl_like(
+91        program: &'a str,
+92        client: Client,
+93        query: impl Into<Cow<'a, str>>,
+94    ) -> Self {
+95        Self {
+96            program,
+97            client,
+98            metadata: None,
+99            query: QueryType::Search(query.into()),
+100            user_args: Vec::new(),
+101        }
+102    }
+103
+104    /// Sets additional arguments for the "yt-dlp" process
+105    #[must_use]
+106    pub fn user_args(mut self, user_args: Vec<String>) -> Self {
+107        self.user_args = user_args;
+108        self
+109    }
+110
+111    /// Runs a search for the given query, returning a list of up to `n_results`
+112    /// possible matches which are `AuxMetadata` objects containing a valid URL.
+113    ///
+114    /// Returns up to 5 matches by default.
+115    pub async fn search(
+116        &mut self,
+117        n_results: Option<usize>,
+118    ) -> Result<impl Iterator<Item = AuxMetadata>, AudioStreamError> {
+119        let n_results = n_results.unwrap_or(5);
+120
+121        Ok(match &self.query {
+122            // Safer to just return the metadata for the pointee if possible
+123            QueryType::Url(_) => Either::Left(std::iter::once(self.aux_metadata().await?)),
+124            QueryType::Search(_) => Either::Right(
+125                self.query(n_results)
+126                    .await?
+127                    .into_iter()
+128                    .map(|v| v.as_aux_metadata()),
+129            ),
+130        })
+131    }
+132
+133    async fn query(&mut self, n_results: usize) -> Result<Vec<Output>, AudioStreamError> {
+134        let query_str = self.query.as_cow_str(n_results);
+135        let ytdl_args = [
+136            "-j",
+137            &query_str,
+138            "-f",
+139            "ba[abr>0][vcodec=none]/best",
+140            "--no-playlist",
+141        ];
+142
+143        let output = Command::new(self.program)
+144            .args(self.user_args.clone())
+145            .args(ytdl_args)
+146            .output()
+147            .await
+148            .map_err(|e| {
+149                AudioStreamError::Fail(if e.kind() == ErrorKind::NotFound {
+150                    format!("could not find executable '{}' on path", self.program).into()
+151                } else {
+152                    Box::new(e)
+153                })
+154            })?;
+155
+156        if !output.status.success() {
+157            return Err(AudioStreamError::Fail(
+158                format!(
+159                    "{} failed with non-zero status code: {}",
+160                    self.program,
+161                    std::str::from_utf8(&output.stderr[..]).unwrap_or("<no error message>")
+162                )
+163                .into(),
+164            ));
+165        }
+166
+167        let out = output
+168            .stdout
+169            .split(|&b| b == b'\n')
+170            .filter(|&x| (!x.is_empty()))
+171            .map(serde_json::from_slice)
+172            .collect::<Result<Vec<Output>, _>>()
+173            .map_err(|e| AudioStreamError::Fail(Box::new(e)))?;
+174
+175        let meta = out
+176            .first()
+177            .ok_or_else(|| {
+178                AudioStreamError::Fail(format!("no results found for '{query_str}'").into())
+179            })?
+180            .as_aux_metadata();
+181
+182        self.metadata = Some(meta);
+183
+184        Ok(out)
+185    }
+186}
+187
+188impl From<YoutubeDl<'static>> for Input {
+189    fn from(val: YoutubeDl<'static>) -> Self {
+190        Input::Lazy(Box::new(val))
+191    }
+192}
+193
+194#[async_trait]
+195impl Compose for YoutubeDl<'_> {
+196    fn create(&mut self) -> Result<AudioStream<Box<dyn MediaSource>>, AudioStreamError> {
+197        Err(AudioStreamError::Unsupported)
+198    }
+199
+200    async fn create_async(
+201        &mut self,
+202    ) -> Result<AudioStream<Box<dyn MediaSource>>, AudioStreamError> {
+203        // panic safety: `query` should have ensured > 0 results if `Ok`
+204        let mut results = self.query(1).await?;
+205        let result = results.swap_remove(0);
+206
+207        let mut headers = HeaderMap::default();
+208
+209        if let Some(map) = result.http_headers {
+210            headers.extend(map.iter().filter_map(|(k, v)| {
+211                Some((
+212                    HeaderName::from_bytes(k.as_bytes()).ok()?,
+213                    HeaderValue::from_str(v).ok()?,
+214                ))
+215            }));
+216        }
+217
+218        #[allow(clippy::single_match_else)]
+219        match result.protocol.as_deref() {
+220            Some("m3u8_native") => {
+221                let mut req =
+222                    HlsRequest::new_with_headers(self.client.clone(), result.url, headers);
+223                req.create()
+224            },
+225            _ => {
+226                let mut req = HttpRequest {
+227                    client: self.client.clone(),
+228                    request: result.url,
+229                    headers,
+230                    content_length: result.filesize,
+231                };
+232                req.create_async().await
+233            },
+234        }
+235    }
+236
+237    fn should_create_async(&self) -> bool {
+238        true
+239    }
+240
+241    async fn aux_metadata(&mut self) -> Result<AuxMetadata, AudioStreamError> {
+242        if let Some(meta) = self.metadata.as_ref() {
+243            return Ok(meta.clone());
+244        }
+245
+246        self.query(1).await?;
+247
+248        self.metadata.clone().ok_or_else(|| {
+249            let msg: Box<dyn Error + Send + Sync + 'static> =
+250                "Failed to instansiate any metadata... Should be unreachable.".into();
+251            AudioStreamError::Fail(msg)
+252        })
+253    }
+254}
+255
+256#[cfg(test)]
+257mod tests {
+258    use super::*;
+259    use crate::constants::test_data::*;
+260    use crate::input::input_tests::*;
+261
+262    #[tokio::test]
+263    #[ntest::timeout(20_000)]
+264    async fn ytdl_track_plays() {
+265        track_plays_mixed(|| YoutubeDl::new(Client::new(), YTDL_TARGET)).await;
+266    }
+267
+268    #[tokio::test]
+269    #[ignore]
+270    #[ntest::timeout(20_000)]
+271    async fn ytdl_page_with_playlist_plays() {
+272        track_plays_passthrough(|| YoutubeDl::new(Client::new(), YTDL_PLAYLIST_TARGET)).await;
+273    }
+274
+275    #[tokio::test]
+276    #[ntest::timeout(20_000)]
+277    async fn ytdl_forward_seek_correct() {
+278        forward_seek_correct(|| YoutubeDl::new(Client::new(), YTDL_TARGET)).await;
+279    }
+280
+281    #[tokio::test]
+282    #[ntest::timeout(20_000)]
+283    async fn ytdl_backward_seek_correct() {
+284        backward_seek_correct(|| YoutubeDl::new(Client::new(), YTDL_TARGET)).await;
+285    }
+286
+287    #[tokio::test]
+288    #[ntest::timeout(20_000)]
+289    async fn fake_exe_errors() {
+290        let mut ytdl = YoutubeDl::new_ytdl_like("yt-dlq", Client::new(), YTDL_TARGET);
+291
+292        assert!(ytdl.aux_metadata().await.is_err());
+293    }
+294
+295    #[tokio::test]
+296    #[ignore]
+297    #[ntest::timeout(20_000)]
+298    async fn ytdl_search_plays() {
+299        let mut ytdl = YoutubeDl::new_search(Client::new(), "cloudkicker 94 days");
+300        let res = ytdl.search(Some(1)).await;
+301
+302        let res = res.unwrap();
+303        assert_eq!(res.count(), 1);
+304
+305        track_plays_passthrough(move || ytdl).await;
+306    }
+307
+308    #[tokio::test]
+309    #[ignore]
+310    #[ntest::timeout(20_000)]
+311    async fn ytdl_search_3() {
+312        let mut ytdl = YoutubeDl::new_search(Client::new(), "test");
+313        let res = ytdl.search(Some(3)).await;
+314
+315        assert_eq!(res.unwrap().count(), 3);
+316    }
+317}
\ No newline at end of file diff --git a/next/src/songbird/input/utils.rs.html b/next/src/songbird/input/utils.rs.html new file mode 100644 index 0000000..c9e0a29 --- /dev/null +++ b/next/src/songbird/input/utils.rs.html @@ -0,0 +1,45 @@ +utils.rs - source

songbird/input/
utils.rs

1//! Utility methods for seeking or decoding.
+2
+3use crate::constants::*;
+4use audiopus::{coder::Decoder, Channels, Result as OpusResult, SampleRate};
+5use std::{mem, time::Duration};
+6
+7/// Calculates the sample position in a `FloatPCM` stream from a timestamp.
+8#[must_use]
+9pub fn timestamp_to_sample_count(timestamp: Duration, stereo: bool) -> usize {
+10    ((timestamp.as_millis() as usize) * (MONO_FRAME_SIZE / FRAME_LEN_MS)) << stereo as usize
+11}
+12
+13/// Calculates the time position in a `FloatPCM` stream from a sample index.
+14#[must_use]
+15pub fn sample_count_to_timestamp(amt: usize, stereo: bool) -> Duration {
+16    Duration::from_millis((((amt * FRAME_LEN_MS) / MONO_FRAME_SIZE) as u64) >> stereo as u64)
+17}
+18
+19/// Calculates the byte position in a `FloatPCM` stream from a timestamp.
+20///
+21/// Each sample is sized by `mem::size_of::<f32>() == 4usize`.
+22#[must_use]
+23pub fn timestamp_to_byte_count(timestamp: Duration, stereo: bool) -> usize {
+24    timestamp_to_sample_count(timestamp, stereo) * mem::size_of::<f32>()
+25}
+26
+27/// Calculates the time position in a `FloatPCM` stream from a byte index.
+28///
+29/// Each sample is sized by `mem::size_of::<f32>() == 4usize`.
+30#[must_use]
+31pub fn byte_count_to_timestamp(amt: usize, stereo: bool) -> Duration {
+32    sample_count_to_timestamp(amt / mem::size_of::<f32>(), stereo)
+33}
+34
+35/// Create an Opus decoder outputting at a sample rate of 48kHz.
+36pub fn decoder(stereo: bool) -> OpusResult<Decoder> {
+37    Decoder::new(
+38        SampleRate::Hz48000,
+39        if stereo {
+40            Channels::Stereo
+41        } else {
+42            Channels::Mono
+43        },
+44    )
+45}
\ No newline at end of file diff --git a/next/src/songbird/join.rs.html b/next/src/songbird/join.rs.html new file mode 100644 index 0000000..36945dd --- /dev/null +++ b/next/src/songbird/join.rs.html @@ -0,0 +1,171 @@ +join.rs - source

songbird/
join.rs

1//! Future types for gateway interactions.
+2
+3#[cfg(feature = "driver")]
+4use crate::error::ConnectionResult;
+5use crate::{
+6    error::{JoinError, JoinResult},
+7    ConnectionInfo,
+8};
+9use core::{
+10    convert,
+11    future::Future,
+12    pin::Pin,
+13    task::{Context, Poll},
+14    time::Duration,
+15};
+16use flume::r#async::RecvFut;
+17use pin_project::pin_project;
+18use tokio::time::{self, Timeout};
+19
+20#[cfg(feature = "driver")]
+21/// Future for a call to [`Call::join`].
+22///
+23/// This future `await`s Discord's response *and*
+24/// connection via the [`Driver`]. Both phases have
+25/// separate timeouts and failure conditions.
+26///
+27/// This future ***must not*** be `await`ed while
+28/// holding the lock around a [`Call`].
+29///
+30/// [`Call::join`]: crate::Call::join
+31/// [`Call`]: crate::Call
+32/// [`Driver`]: crate::driver::Driver
+33#[pin_project]
+34pub struct Join {
+35    #[pin]
+36    gw: JoinClass<()>,
+37    #[pin]
+38    driver: JoinClass<ConnectionResult<()>>,
+39    state: JoinState,
+40}
+41
+42#[cfg(feature = "driver")]
+43impl Join {
+44    pub(crate) fn new(
+45        driver: RecvFut<'static, ConnectionResult<()>>,
+46        gw_recv: RecvFut<'static, ()>,
+47        timeout: Option<Duration>,
+48    ) -> Self {
+49        Self {
+50            gw: JoinClass::new(gw_recv, timeout),
+51            driver: JoinClass::new(driver, None),
+52            state: JoinState::BeforeGw,
+53        }
+54    }
+55}
+56
+57#[cfg(feature = "driver")]
+58impl Future for Join {
+59    type Output = JoinResult<()>;
+60
+61    fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
+62        let this = self.project();
+63
+64        if *this.state == JoinState::BeforeGw {
+65            let poll = this.gw.poll(cx);
+66            match poll {
+67                Poll::Ready(a) if a.is_ok() => {
+68                    *this.state = JoinState::AfterGw;
+69                },
+70                Poll::Ready(a) => {
+71                    *this.state = JoinState::Finalised;
+72                    return Poll::Ready(a);
+73                },
+74                Poll::Pending => return Poll::Pending,
+75            }
+76        }
+77
+78        if *this.state == JoinState::AfterGw {
+79            let poll = this
+80                .driver
+81                .poll(cx)
+82                .map_ok(|res| res.map_err(JoinError::Driver))
+83                .map(|res| res.and_then(convert::identity));
+84
+85            match poll {
+86                Poll::Ready(a) => {
+87                    *this.state = JoinState::Finalised;
+88                    return Poll::Ready(a);
+89                },
+90                Poll::Pending => return Poll::Pending,
+91            }
+92        }
+93
+94        Poll::Pending
+95    }
+96}
+97
+98#[cfg(feature = "driver")]
+99#[derive(Copy, Clone, Eq, PartialEq)]
+100enum JoinState {
+101    BeforeGw,
+102    AfterGw,
+103    Finalised,
+104}
+105
+106/// Future for a call to [`Call::join_gateway`].
+107///
+108/// This future `await`s Discord's gateway response, subject
+109/// to any timeouts.
+110///
+111/// This future ***must not*** be `await`ed while
+112/// holding the lock around a [`Call`].
+113///
+114/// [`Call::join_gateway`]: crate::Call::join_gateway
+115/// [`Call`]: crate::Call
+116/// [`Driver`]: crate::driver::Driver
+117#[pin_project]
+118pub struct JoinGateway {
+119    #[pin]
+120    inner: JoinClass<ConnectionInfo>,
+121}
+122
+123impl JoinGateway {
+124    pub(crate) fn new(recv: RecvFut<'static, ConnectionInfo>, timeout: Option<Duration>) -> Self {
+125        Self {
+126            inner: JoinClass::new(recv, timeout),
+127        }
+128    }
+129}
+130
+131impl Future for JoinGateway {
+132    type Output = JoinResult<ConnectionInfo>;
+133
+134    fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
+135        self.project().inner.poll(cx)
+136    }
+137}
+138
+139#[allow(clippy::large_enum_variant)]
+140#[pin_project(project = JoinClassProj)]
+141enum JoinClass<T: 'static> {
+142    WithTimeout(#[pin] Timeout<RecvFut<'static, T>>),
+143    Vanilla(RecvFut<'static, T>),
+144}
+145
+146impl<T: 'static> JoinClass<T> {
+147    pub(crate) fn new(recv: RecvFut<'static, T>, timeout: Option<Duration>) -> Self {
+148        match timeout {
+149            Some(t) => JoinClass::WithTimeout(time::timeout(t, recv)),
+150            None => JoinClass::Vanilla(recv),
+151        }
+152    }
+153}
+154
+155impl<T> Future for JoinClass<T>
+156where
+157    T: Unpin,
+158{
+159    type Output = JoinResult<T>;
+160
+161    fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
+162        match self.project() {
+163            JoinClassProj::WithTimeout(t) => t
+164                .poll(cx)
+165                .map_err(|_| JoinError::TimedOut)
+166                .map_ok(|res| res.map_err(|_| JoinError::Dropped))
+167                .map(|m| m.and_then(convert::identity)),
+168            JoinClassProj::Vanilla(t) => Pin::new(t).poll(cx).map_err(|_| JoinError::Dropped),
+169        }
+170    }
+171}
\ No newline at end of file diff --git a/next/src/songbird/lib.rs.html b/next/src/songbird/lib.rs.html new file mode 100644 index 0000000..2821192 --- /dev/null +++ b/next/src/songbird/lib.rs.html @@ -0,0 +1,133 @@ +lib.rs - source

songbird/
lib.rs

1#![doc(
+2    html_logo_url = "https://raw.githubusercontent.com/serenity-rs/songbird/current/songbird.png",
+3    html_favicon_url = "https://raw.githubusercontent.com/serenity-rs/songbird/current/songbird-ico.png"
+4)]
+5#![cfg_attr(docsrs, feature(doc_auto_cfg))]
+6#![deny(missing_docs)]
+7#![deny(rustdoc::broken_intra_doc_links)]
+8//! ![project logo][logo]
+9//!
+10//! Songbird is an async, cross-library compatible voice system for Discord, written in Rust.
+11//! The library offers:
+12//!  * A standalone gateway frontend compatible with [serenity] and [twilight] using the
+13//!    `"gateway"` and `"[serenity/twilight]"` plus `"[rustls/native]"` features. You can even run
+14//!    driverless, to help manage your [lavalink] sessions.
+15//!  * A standalone driver for voice calls, via the `"driver"` feature. If you can create
+16//!    a `ConnectionInfo` using any other gateway, or language for your bot, then you
+17//!    can run the songbird voice driver.
+18//!  * Voice receive and RT(C)P packet handling via the `"receive"` feature.
+19//!  * And, by default, a fully featured voice system featuring events, queues,
+20//!    seeking on compatible streams, shared multithreaded audio stream caches,
+21//!    and direct Opus data passthrough from DCA files.
+22//!
+23//! ## Intents
+24//! Songbird's gateway functionality requires you to specify the `GUILD_VOICE_STATES` intent.
+25//!
+26//! ## Examples
+27//! Full examples showing various types of functionality and integrations can be found
+28//! in [this crate's examples directory].
+29//!
+30//! ## Codec support
+31//! Songbird supports all [codecs and formats provided by Symphonia] (pure-Rust), with Opus support
+32//! provided by [audiopus] (an FFI wrapper for libopus).
+33//!
+34//! **By default, *Songbird will not request any codecs from Symphonia*.** To change this, in your own
+35//! project you will need to depend on Symphonia as well.
+36//!
+37//! ```toml
+38//! # Including songbird alone gives you support for Opus via the DCA file format.
+39//! [dependencies.songbird]
+40//! version = "0.5"
+41//! features = ["builtin-queue"]
+42//!
+43//! # To get additional codecs, you *must* add Symphonia yourself.
+44//! # This includes the default formats (MKV/WebM, Ogg, Wave) and codecs (FLAC, PCM, Vorbis)...
+45//! [dependencies.symphonia]
+46//! version = "0.5"
+47//! features = ["aac", "mp3", "isomp4", "alac"] # ...as well as any extras you need!
+48//! ```
+49//!
+50//! ## Attribution
+51//!
+52//! Songbird's logo is based upon the copyright-free image ["Black-Capped Chickadee"] by George Gorgas White.
+53//!
+54//! [logo]: https://raw.githubusercontent.com/serenity-rs/songbird/current/songbird.png
+55//! [serenity]: https://github.com/serenity-rs/serenity
+56//! [twilight]: https://github.com/twilight-rs/twilight
+57//! [this crate's examples directory]: https://github.com/serenity-rs/songbird/tree/current/examples
+58//! ["Black-Capped Chickadee"]: https://www.oldbookillustrations.com/illustrations/black-capped-chickadee/
+59//! [`ConnectionInfo`]: struct@ConnectionInfo
+60//! [lavalink]: https://github.com/freyacodes/Lavalink
+61//! [codecs and formats provided by Symphonia]: https://github.com/pdeljanov/Symphonia#formats-demuxers
+62//! [audiopus]: https://github.com/lakelezz/audiopus
+63
+64#![warn(clippy::pedantic, rust_2018_idioms)]
+65#![allow(
+66    // Allowed as they are too pedantic
+67    clippy::module_name_repetitions,
+68    clippy::wildcard_imports,
+69    clippy::too_many_lines,
+70    clippy::cast_lossless,
+71    clippy::cast_sign_loss,
+72    clippy::cast_possible_wrap,
+73    clippy::cast_precision_loss,
+74    clippy::cast_possible_truncation,
+75    // TODO: would require significant rewriting of all existing docs
+76    clippy::missing_errors_doc,
+77    clippy::missing_panics_doc,
+78    clippy::doc_link_with_quotes,
+79    clippy::doc_markdown,
+80    // Allowed as they cannot be fixed without breaking
+81    clippy::result_large_err,
+82    clippy::large_enum_variant,
+83)]
+84
+85mod config;
+86pub mod constants;
+87#[cfg(feature = "driver")]
+88pub mod driver;
+89pub mod error;
+90#[cfg(feature = "driver")]
+91pub mod events;
+92#[cfg(feature = "gateway")]
+93mod handler;
+94pub mod id;
+95pub(crate) mod info;
+96#[cfg(feature = "driver")]
+97pub mod input;
+98#[cfg(feature = "gateway")]
+99pub mod join;
+100#[cfg(feature = "gateway")]
+101mod manager;
+102#[cfg(feature = "serenity")]
+103pub mod serenity;
+104#[cfg(feature = "gateway")]
+105pub mod shards;
+106#[cfg(any(test, feature = "internals"))]
+107pub mod test_utils;
+108#[cfg(feature = "driver")]
+109pub mod tracks;
+110#[cfg(feature = "driver")]
+111mod ws;
+112
+113#[cfg(all(feature = "driver", feature = "receive"))]
+114pub use discortp as packet;
+115#[cfg(feature = "driver")]
+116pub use serenity_voice_model as model;
+117
+118pub(crate) use serde_json as json;
+119
+120#[cfg(feature = "driver")]
+121pub use crate::{
+122    driver::Driver,
+123    events::{CoreEvent, Event, EventContext, EventHandler, TrackEvent},
+124};
+125
+126#[cfg(feature = "gateway")]
+127pub use crate::{handler::*, manager::*};
+128
+129#[cfg(feature = "serenity")]
+130pub use crate::serenity::*;
+131
+132pub use config::Config;
+133pub use info::ConnectionInfo;
\ No newline at end of file diff --git a/next/src/songbird/manager.rs.html b/next/src/songbird/manager.rs.html new file mode 100644 index 0000000..da7cae7 --- /dev/null +++ b/next/src/songbird/manager.rs.html @@ -0,0 +1,505 @@ +manager.rs - source

songbird/
manager.rs

1#[cfg(feature = "serenity")]
+2use crate::shards::SerenitySharder;
+3use crate::{
+4    error::{JoinError, JoinResult},
+5    id::{ChannelId, GuildId, UserId},
+6    shards::Sharder,
+7    Call,
+8    Config,
+9    ConnectionInfo,
+10};
+11#[cfg(feature = "serenity")]
+12use async_trait::async_trait;
+13use dashmap::DashMap;
+14#[cfg(feature = "serenity")]
+15use futures::channel::mpsc::UnboundedSender as Sender;
+16use parking_lot::RwLock as PRwLock;
+17#[cfg(feature = "serenity")]
+18use serenity::{
+19    gateway::{ShardRunnerMessage, VoiceGatewayManager},
+20    model::{
+21        id::{GuildId as SerenityGuild, UserId as SerenityUser},
+22        voice::VoiceState,
+23    },
+24};
+25use std::sync::{Arc, OnceLock};
+26use tokio::sync::Mutex;
+27#[cfg(feature = "serenity")]
+28use tracing::debug;
+29#[cfg(feature = "twilight")]
+30use twilight_model::gateway::event::Event as TwilightEvent;
+31
+32#[derive(Clone, Copy, Debug)]
+33struct ClientData {
+34    shard_count: u64,
+35    user_id: UserId,
+36}
+37
+38/// A shard-aware struct responsible for managing [`Call`]s.
+39///
+40/// This manager transparently maps guild state and a source of shard information
+41/// into individual calls, and forwards state updates which affect call state.
+42///
+43/// [`Call`]: Call
+44#[derive(Debug)]
+45pub struct Songbird {
+46    client_data: OnceLock<ClientData>,
+47    calls: DashMap<GuildId, Arc<Mutex<Call>>>,
+48    sharder: Sharder,
+49    config: PRwLock<Config>,
+50}
+51
+52impl Songbird {
+53    #[cfg(feature = "serenity")]
+54    /// Create a new Songbird instance for serenity.
+55    ///
+56    /// This must be [registered] after creation.
+57    ///
+58    /// [registered]: crate::serenity::register_with
+59    #[must_use]
+60    pub fn serenity() -> Arc<Self> {
+61        Self::serenity_from_config(Config::default())
+62    }
+63
+64    #[cfg(feature = "serenity")]
+65    /// Create a new Songbird instance for serenity, using the given configuration.
+66    ///
+67    /// This must be [registered] after creation.
+68    ///
+69    /// [registered]: crate::serenity::register_with
+70    #[must_use]
+71    pub fn serenity_from_config(config: Config) -> Arc<Self> {
+72        Arc::new(Self {
+73            client_data: OnceLock::new(),
+74            calls: DashMap::new(),
+75            sharder: Sharder::Serenity(SerenitySharder::default()),
+76            config: config.initialise_disposer().into(),
+77        })
+78    }
+79
+80    #[cfg(feature = "twilight")]
+81    /// Create a new Songbird instance for twilight.
+82    ///
+83    /// Twilight handlers do not need to be registered, but
+84    /// users are responsible for passing in any events using
+85    /// [`process`].
+86    ///
+87    /// [`process`]: Songbird::process
+88    pub fn twilight<U>(cluster: Arc<crate::shards::TwilightMap>, user_id: U) -> Self
+89    where
+90        U: Into<UserId>,
+91    {
+92        Self::twilight_from_config(cluster, user_id, Config::default())
+93    }
+94
+95    #[cfg(feature = "twilight")]
+96    /// Create a new Songbird instance for twilight.
+97    ///
+98    /// Twilight handlers do not need to be registered, but
+99    /// users are responsible for passing in any events using
+100    /// [`process`].
+101    ///
+102    /// [`process`]: Songbird::process
+103    pub fn twilight_from_config<U>(
+104        sender_map: Arc<crate::shards::TwilightMap>,
+105        user_id: U,
+106        config: Config,
+107    ) -> Self
+108    where
+109        U: Into<UserId>,
+110    {
+111        Self {
+112            client_data: OnceLock::from(ClientData {
+113                shard_count: sender_map.shard_count(),
+114                user_id: user_id.into(),
+115            }),
+116            calls: DashMap::new(),
+117            sharder: Sharder::Twilight(sender_map),
+118            config: config.initialise_disposer().into(),
+119        }
+120    }
+121
+122    /// Set the bot's user, and the number of shards in use.
+123    ///
+124    /// If this struct is already initialised (e.g., from [`::twilight`]),
+125    /// or a previous call, then this function is a no-op.
+126    ///
+127    /// [`::twilight`]: #method.twilight
+128    pub fn initialise_client_data<U: Into<UserId>>(&self, shard_count: u64, user_id: U) {
+129        self.client_data
+130            .set(ClientData {
+131                shard_count,
+132                user_id: user_id.into(),
+133            })
+134            .ok();
+135    }
+136
+137    /// Retrieves a [`Call`] for the given guild, if one already exists.
+138    ///
+139    /// [`Call`]: Call
+140    pub fn get<G: Into<GuildId>>(&self, guild_id: G) -> Option<Arc<Mutex<Call>>> {
+141        self.calls
+142            .get(&guild_id.into())
+143            .map(|mapref| Arc::clone(&mapref))
+144    }
+145
+146    /// Retrieves a [`Call`] for the given guild, creating a new one if
+147    /// none is found.
+148    ///
+149    /// This will not join any calls, or cause connection state to change.
+150    ///
+151    /// [`Call`]: Call
+152    #[inline]
+153    pub fn get_or_insert<G>(&self, guild_id: G) -> Arc<Mutex<Call>>
+154    where
+155        G: Into<GuildId>,
+156    {
+157        self.get_or_insert_inner(guild_id.into())
+158    }
+159
+160    fn get_or_insert_inner(&self, guild_id: GuildId) -> Arc<Mutex<Call>> {
+161        self.calls
+162            .entry(guild_id)
+163            .or_insert_with(|| {
+164                let info = self
+165                    .client_data
+166                    .get()
+167                    .expect("Manager has not been initialised");
+168
+169                let shard = shard_id(guild_id.0.get(), info.shard_count);
+170                let shard_handle = self
+171                    .sharder
+172                    .get_shard(shard)
+173                    .expect("Failed to get shard handle: shard_count incorrect?");
+174
+175                let call = Call::from_config(
+176                    guild_id,
+177                    shard_handle,
+178                    info.user_id,
+179                    self.config.read().clone(),
+180                );
+181
+182                Arc::new(Mutex::new(call))
+183            })
+184            .clone()
+185    }
+186
+187    /// Creates an iterator for all [`Call`]s currently managed.
+188    pub fn iter(&self) -> Iter<'_> {
+189        Iter {
+190            inner: self.calls.iter().map(|x| (*x.key(), Arc::clone(x.value()))),
+191        }
+192    }
+193
+194    /// Sets a shared configuration for all drivers created from this
+195    /// manager.
+196    ///
+197    /// Changes made here will apply to new Call and Driver instances only.
+198    ///
+199    /// Requires the `"driver"` feature.
+200    pub fn set_config(&self, new_config: Config) {
+201        let mut config = self.config.write();
+202        *config = new_config;
+203    }
+204
+205    #[cfg(feature = "driver")]
+206    /// Connects to a target by retrieving its relevant [`Call`] and
+207    /// connecting, or creating the handler if required.
+208    ///
+209    /// This can also switch to the given channel, if a handler already exists
+210    /// for the target and the current connected channel is not equal to the
+211    /// given channel.
+212    ///
+213    /// The provided channel ID is used as a connection target. The
+214    /// channel _must_ be in the provided guild. This is _not_ checked by the
+215    /// library, and will result in an error. If there is already a connected
+216    /// handler for the guild, _and_ the provided channel is different from the
+217    /// channel that the connection is already connected to, then the handler
+218    /// will switch the connection to the provided channel.
+219    ///
+220    /// If you _only_ need to retrieve the handler for a target, then use
+221    /// [`get`].
+222    ///
+223    /// Twilight users should read the caveats mentioned in [`process`].
+224    ///
+225    /// NOTE: an `Err(..)` value will still create a [`Call`] accessible via [`get`].
+226    ///
+227    /// [`Call`]: Call
+228    /// [`get`]: Songbird::get
+229    /// [`process`]: #method.process
+230    #[inline]
+231    pub async fn join<C, G>(&self, guild_id: G, channel_id: C) -> JoinResult<Arc<Mutex<Call>>>
+232    where
+233        C: Into<ChannelId>,
+234        G: Into<GuildId>,
+235    {
+236        self.join_inner(guild_id.into(), channel_id.into()).await
+237    }
+238
+239    #[cfg(feature = "driver")]
+240    async fn join_inner(
+241        &self,
+242        guild_id: GuildId,
+243        channel_id: ChannelId,
+244    ) -> JoinResult<Arc<Mutex<Call>>> {
+245        let call = self.get_or_insert(guild_id);
+246
+247        let stage_1 = {
+248            let mut handler = call.lock().await;
+249            handler.join(channel_id).await
+250        };
+251
+252        match stage_1 {
+253            Ok(chan) => chan.await.map(|()| call),
+254            Err(e) => Err(e),
+255        }
+256    }
+257
+258    /// Partially connects to a target by retrieving its relevant [`Call`] and
+259    /// connecting, or creating the handler if required.
+260    ///
+261    /// This method returns the handle and the connection info needed for other libraries
+262    /// or drivers, such as lavalink, and does not actually start or run a voice call.
+263    ///
+264    /// NOTE: an `Err(..)` value will still create a [`Call`] accessible via [`get`].
+265    ///
+266    /// [`Call`]: Call
+267    /// [`get`]: Songbird::get
+268    #[inline]
+269    pub async fn join_gateway<C, G>(
+270        &self,
+271        guild_id: G,
+272        channel_id: C,
+273    ) -> JoinResult<(ConnectionInfo, Arc<Mutex<Call>>)>
+274    where
+275        C: Into<ChannelId>,
+276        G: Into<GuildId>,
+277    {
+278        self.join_gateway_inner(guild_id.into(), channel_id.into())
+279            .await
+280    }
+281
+282    async fn join_gateway_inner(
+283        &self,
+284        guild_id: GuildId,
+285        channel_id: ChannelId,
+286    ) -> JoinResult<(ConnectionInfo, Arc<Mutex<Call>>)> {
+287        let call = self.get_or_insert(guild_id);
+288
+289        let stage_1 = {
+290            let mut handler = call.lock().await;
+291            handler.join_gateway(channel_id).await
+292        };
+293
+294        match stage_1 {
+295            Ok(chan) => chan
+296                .await
+297                .map_err(|_| JoinError::Dropped)
+298                .map(|info| (info, call)),
+299            Err(e) => Err(e),
+300        }
+301    }
+302
+303    /// Retrieves the [handler][`Call`] for the given target and leaves the
+304    /// associated voice channel, if connected.
+305    ///
+306    /// This will _not_ drop the handler, and will preserve it and its settings.
+307    /// If you do not need to reuse event handlers, configuration, or active tracks
+308    /// in the underlying driver *consider calling [`remove`]* to release tasks,
+309    /// threads, and memory.
+310    ///
+311    /// This is a wrapper around [getting][`get`] a handler and calling
+312    /// [`leave`] on it.
+313    ///
+314    /// [`Call`]: Call
+315    /// [`get`]: Songbird::get
+316    /// [`leave`]: Call::leave
+317    /// [`remove`]: Songbird::remove
+318    #[inline]
+319    pub async fn leave<G: Into<GuildId>>(&self, guild_id: G) -> JoinResult<()> {
+320        self.leave_inner(guild_id.into()).await
+321    }
+322
+323    async fn leave_inner(&self, guild_id: GuildId) -> JoinResult<()> {
+324        if let Some(call) = self.get(guild_id) {
+325            let mut handler = call.lock().await;
+326            handler.leave().await
+327        } else {
+328            Err(JoinError::NoCall)
+329        }
+330    }
+331
+332    /// Retrieves the [`Call`] for the given target and leaves the associated
+333    /// voice channel, if connected.
+334    ///
+335    /// The handler is then dropped, removing settings for the target.
+336    ///
+337    /// An Err(...) value implies that the gateway could not be contacted,
+338    /// and that leaving should be attempted again later (i.e., after reconnect).
+339    ///
+340    /// [`Call`]: Call
+341    #[inline]
+342    pub async fn remove<G: Into<GuildId>>(&self, guild_id: G) -> JoinResult<()> {
+343        self.remove_inner(guild_id.into()).await
+344    }
+345
+346    async fn remove_inner(&self, guild_id: GuildId) -> JoinResult<()> {
+347        self.leave(guild_id).await?;
+348        self.calls.remove(&guild_id);
+349        Ok(())
+350    }
+351}
+352
+353impl<'a> IntoIterator for &'a Songbird {
+354    type Item = <Iter<'a> as Iterator>::Item;
+355
+356    type IntoIter = Iter<'a>;
+357
+358    fn into_iter(self) -> Self::IntoIter {
+359        self.iter()
+360    }
+361}
+362
+363#[cfg(feature = "twilight")]
+364impl Songbird {
+365    /// Handle events received on the cluster.
+366    ///
+367    /// When using twilight, you are required to call this with all inbound
+368    /// (voice) events, *i.e.*, at least `VoiceStateUpdate`s and `VoiceServerUpdate`s.
+369    ///
+370    /// Users *must* ensure that calls to this function happen on a **separate task**
+371    /// to any calls to [`join`], [`join_gateway`]. The simplest way to ensure this is
+372    /// to `tokio::spawn` any command invocation.
+373    ///
+374    /// Returned futures generally require the inner [`Call`] to be updated via this function,
+375    /// and will deadlock if event processing is not carried out on another spawned task.
+376    ///
+377    /// [`join`]: Songbird::join
+378    /// [`join_gateway`]: Songbird::join_gateway
+379    /// [`Call`]: Call
+380    pub async fn process(&self, event: &TwilightEvent) {
+381        match event {
+382            TwilightEvent::VoiceServerUpdate(v) => {
+383                let guild_id = GuildId::from(v.guild_id);
+384                let call = self.get(guild_id);
+385
+386                if let Some(call) = call {
+387                    let mut handler = call.lock().await;
+388                    if let Some(endpoint) = &v.endpoint {
+389                        handler.update_server(endpoint.clone(), v.token.clone());
+390                    }
+391                }
+392            },
+393            TwilightEvent::VoiceStateUpdate(v) => {
+394                if self
+395                    .client_data
+396                    .get()
+397                    .map_or(true, |data| v.0.user_id.into_nonzero() != data.user_id.0)
+398                {
+399                    return;
+400                }
+401
+402                let call = v.0.guild_id.map(GuildId::from).and_then(|id| self.get(id));
+403
+404                if let Some(call) = call {
+405                    let mut handler = call.lock().await;
+406                    handler.update_state(v.0.session_id.clone(), v.0.channel_id);
+407                }
+408            },
+409            _ => {},
+410        }
+411    }
+412}
+413
+414#[cfg(feature = "serenity")]
+415#[async_trait]
+416impl VoiceGatewayManager for Songbird {
+417    async fn initialise(&self, shard_count: u32, user_id: SerenityUser) {
+418        debug!(
+419            "Initialising Songbird for Serenity: ID {:?}, {} Shards",
+420            user_id, shard_count
+421        );
+422        self.initialise_client_data(shard_count as u64, user_id);
+423        debug!("Songbird ({:?}) Initialised!", user_id);
+424    }
+425
+426    async fn register_shard(&self, shard_id: u32, sender: Sender<ShardRunnerMessage>) {
+427        debug!(
+428            "Registering Serenity shard handle {} with Songbird",
+429            shard_id
+430        );
+431        self.sharder.register_shard_handle(shard_id, sender);
+432        debug!("Registered shard handle {}.", shard_id);
+433    }
+434
+435    async fn deregister_shard(&self, shard_id: u32) {
+436        debug!(
+437            "Deregistering Serenity shard handle {} with Songbird",
+438            shard_id
+439        );
+440        self.sharder.deregister_shard_handle(shard_id);
+441        debug!("Deregistered shard handle {}.", shard_id);
+442    }
+443
+444    async fn server_update(&self, guild_id: SerenityGuild, endpoint: &Option<String>, token: &str) {
+445        if let Some(call) = self.get(guild_id) {
+446            let mut handler = call.lock().await;
+447            if let Some(endpoint) = endpoint {
+448                handler.update_server(endpoint.clone(), token.to_string());
+449            }
+450        }
+451    }
+452
+453    async fn state_update(&self, guild_id: SerenityGuild, voice_state: &VoiceState) {
+454        if self.client_data.get().map_or(true, |data| {
+455            voice_state.user_id.get() != data.user_id.0.get()
+456        }) {
+457            return;
+458        }
+459
+460        if let Some(call) = self.get(guild_id) {
+461            let mut handler = call.lock().await;
+462            handler.update_state(voice_state.session_id.clone(), voice_state.channel_id);
+463        }
+464    }
+465}
+466
+467type DashMapIter<'a> = dashmap::iter::Iter<'a, GuildId, Arc<Mutex<Call>>>;
+468type InnerIter<'a> = std::iter::Map<
+469    DashMapIter<'a>,
+470    fn(<DashMapIter<'a> as Iterator>::Item) -> (GuildId, Arc<Mutex<Call>>),
+471>;
+472
+473/// An iterator over all [`Call`]s currently stored in the manager instance.
+474pub struct Iter<'a> {
+475    inner: InnerIter<'a>,
+476}
+477
+478impl Iterator for Iter<'_> {
+479    type Item = (GuildId, Arc<Mutex<Call>>);
+480
+481    fn next(&mut self) -> Option<Self::Item> {
+482        self.inner.next()
+483    }
+484
+485    fn size_hint(&self) -> (usize, Option<usize>) {
+486        self.inner.size_hint()
+487    }
+488
+489    fn count(self) -> usize {
+490        self.inner.count()
+491    }
+492
+493    fn fold<B, F>(self, init: B, f: F) -> B
+494    where
+495        Self: Sized,
+496        F: FnMut(B, Self::Item) -> B,
+497    {
+498        self.inner.fold(init, f)
+499    }
+500}
+501
+502#[inline]
+503fn shard_id(guild_id: u64, shard_count: u64) -> u64 {
+504    (guild_id >> 22) % shard_count
+505}
\ No newline at end of file diff --git a/next/src/songbird/serenity.rs.html b/next/src/songbird/serenity.rs.html new file mode 100644 index 0000000..ccfd4ef --- /dev/null +++ b/next/src/songbird/serenity.rs.html @@ -0,0 +1,89 @@ +serenity.rs - source

songbird/
serenity.rs

1//! Compatibility and convenience methods for working with [serenity].
+2//! Requires the `"serenity"` feature.
+3//!
+4//! [serenity]: https://crates.io/crates/serenity
+5
+6use crate::{Config, Songbird};
+7use serenity::{
+8    client::{ClientBuilder, Context},
+9    prelude::TypeMapKey,
+10};
+11use std::sync::Arc;
+12
+13/// Zero-size type used to retrieve the registered [`Songbird`] instance
+14/// from serenity's inner [`TypeMap`].
+15///
+16/// [`Songbird`]: Songbird
+17/// [`TypeMap`]: serenity::prelude::TypeMap
+18pub struct SongbirdKey;
+19
+20impl TypeMapKey for SongbirdKey {
+21    type Value = Arc<Songbird>;
+22}
+23
+24/// Installs a new songbird instance into the serenity client.
+25///
+26/// This should be called after any uses of `ClientBuilder::type_map`.
+27pub fn register(client_builder: ClientBuilder) -> ClientBuilder {
+28    let voice = Songbird::serenity();
+29    register_with(client_builder, voice)
+30}
+31
+32/// Installs a given songbird instance into the serenity client.
+33///
+34/// This should be called after any uses of `ClientBuilder::type_map`.
+35pub fn register_with(client_builder: ClientBuilder, voice: Arc<Songbird>) -> ClientBuilder {
+36    client_builder
+37        .voice_manager_arc(voice.clone())
+38        .type_map_insert::<SongbirdKey>(voice)
+39}
+40
+41/// Installs a given songbird instance into the serenity client.
+42///
+43/// This should be called after any uses of `ClientBuilder::type_map`.
+44pub fn register_from_config(client_builder: ClientBuilder, config: Config) -> ClientBuilder {
+45    let voice = Songbird::serenity_from_config(config);
+46    register_with(client_builder, voice)
+47}
+48
+49/// Retrieve the Songbird voice client from a serenity context's
+50/// shared key-value store.
+51pub async fn get(ctx: &Context) -> Option<Arc<Songbird>> {
+52    let data = ctx.data.read().await;
+53
+54    data.get::<SongbirdKey>().cloned()
+55}
+56
+57/// Helper trait to add installation/creation methods to serenity's
+58/// `ClientBuilder`.
+59///
+60/// These install the client to receive gateway voice events, and
+61/// store an easily accessible reference to Songbird's managers.
+62pub trait SerenityInit {
+63    /// Registers a new Songbird voice system with serenity, storing it for easy
+64    /// access via [`get`].
+65    ///
+66    /// [`get`]: get
+67    #[must_use]
+68    fn register_songbird(self) -> Self;
+69    /// Registers a given Songbird voice system with serenity, as above.
+70    #[must_use]
+71    fn register_songbird_with(self, voice: Arc<Songbird>) -> Self;
+72    /// Registers a Songbird voice system serenity, based on the given configuration.
+73    #[must_use]
+74    fn register_songbird_from_config(self, config: Config) -> Self;
+75}
+76
+77impl SerenityInit for ClientBuilder {
+78    fn register_songbird(self) -> Self {
+79        register(self)
+80    }
+81
+82    fn register_songbird_with(self, voice: Arc<Songbird>) -> Self {
+83        register_with(self, voice)
+84    }
+85
+86    fn register_songbird_from_config(self, config: Config) -> Self {
+87        register_from_config(self, config)
+88    }
+89}
\ No newline at end of file diff --git a/next/src/songbird/shards.rs.html b/next/src/songbird/shards.rs.html new file mode 100644 index 0000000..45be2e4 --- /dev/null +++ b/next/src/songbird/shards.rs.html @@ -0,0 +1,296 @@ +shards.rs - source

songbird/
shards.rs

1//! Handlers for sending packets over sharded connections.
+2
+3use crate::{error::JoinResult, id::*};
+4use async_trait::async_trait;
+5#[cfg(feature = "serenity")]
+6use dashmap::DashMap;
+7use derivative::Derivative;
+8#[cfg(feature = "serenity")]
+9use futures::channel::mpsc::{TrySendError, UnboundedSender as Sender};
+10#[cfg(feature = "serenity")]
+11use parking_lot::{lock_api::RwLockWriteGuard, Mutex as PMutex, RwLock as PRwLock};
+12#[cfg(feature = "serenity")]
+13use serde_json::json;
+14#[cfg(feature = "serenity")]
+15use serenity::gateway::ShardRunnerMessage;
+16#[cfg(feature = "serenity")]
+17use std::result::Result as StdResult;
+18use std::sync::Arc;
+19#[cfg(feature = "serenity")]
+20use tracing::{debug, error};
+21#[cfg(feature = "twilight")]
+22use twilight_gateway::MessageSender;
+23#[cfg(feature = "twilight")]
+24use twilight_model::gateway::payload::outgoing::update_voice_state::UpdateVoiceState as TwilightVoiceState;
+25
+26/// Map containing [`MessageSender`]s for Twilight.
+27///
+28/// [`MessageSender`]: twilight_gateway::MessageSender
+29#[cfg(feature = "twilight")]
+30#[derive(Debug)]
+31pub struct TwilightMap {
+32    map: std::collections::HashMap<u32, MessageSender>,
+33}
+34
+35#[cfg(feature = "twilight")]
+36impl TwilightMap {
+37    /// Construct a map of shards and command senders to those shards.
+38    ///
+39    /// For correctness all shards should be in the map.
+40    #[must_use]
+41    pub fn new(map: std::collections::HashMap<u32, MessageSender>) -> Self {
+42        TwilightMap { map }
+43    }
+44
+45    /// Get the message sender for `shard_id`.
+46    #[must_use]
+47    pub fn get(&self, shard_id: u32) -> Option<&MessageSender> {
+48        self.map.get(&shard_id)
+49    }
+50
+51    /// Get the total number of shards in the map.
+52    #[must_use]
+53    pub fn shard_count(&self) -> u64 {
+54        self.map.len() as u64
+55    }
+56}
+57
+58#[derive(Derivative)]
+59#[derivative(Debug)]
+60#[non_exhaustive]
+61/// Source of individual shard connection handles.
+62pub enum Sharder {
+63    #[cfg(feature = "serenity")]
+64    /// Serenity-specific wrapper for sharder state initialised by the library.
+65    Serenity(SerenitySharder),
+66    #[cfg(feature = "twilight")]
+67    /// Twilight-specific wrapper for a map of command senders.
+68    Twilight(Arc<TwilightMap>),
+69    /// A generic shard handle source.
+70    Generic(#[derivative(Debug = "ignore")] Arc<dyn GenericSharder + Send + Sync>),
+71}
+72
+73/// Trait for a generic shard cluster or other handle source.
+74///
+75/// This allows any Discord library to be integrated with Songbird, and offers a source
+76/// of generic shard handles.
+77#[async_trait]
+78pub trait GenericSharder {
+79    /// Get access to a new shard
+80    fn get_shard(&self, shard_id: u64) -> Option<Arc<dyn VoiceUpdate + Send + Sync>>;
+81}
+82
+83impl Sharder {
+84    /// Returns a new handle to the required inner shard.
+85    #[allow(clippy::must_use_candidate)] // get_or_insert_shard_handle has side effects
+86    pub fn get_shard(&self, shard_id: u64) -> Option<Shard> {
+87        match self {
+88            #[cfg(feature = "serenity")]
+89            Sharder::Serenity(s) => Some(Shard::Serenity(
+90                s.get_or_insert_shard_handle(shard_id as u32),
+91            )),
+92            #[cfg(feature = "twilight")]
+93            Sharder::Twilight(t) => Some(Shard::Twilight(t.clone(), shard_id as u32)),
+94            Sharder::Generic(src) => src.get_shard(shard_id).map(Shard::Generic),
+95        }
+96    }
+97}
+98
+99#[cfg(feature = "serenity")]
+100impl Sharder {
+101    #[allow(unreachable_patterns)]
+102    pub(crate) fn register_shard_handle(&self, shard_id: u32, sender: Sender<ShardRunnerMessage>) {
+103        if let Sharder::Serenity(s) = self {
+104            s.register_shard_handle(shard_id, sender);
+105        } else {
+106            error!("Called serenity management function on a non-serenity Songbird instance.");
+107        }
+108    }
+109
+110    #[allow(unreachable_patterns)]
+111    pub(crate) fn deregister_shard_handle(&self, shard_id: u32) {
+112        if let Sharder::Serenity(s) = self {
+113            s.deregister_shard_handle(shard_id);
+114        } else {
+115            error!("Called serenity management function on a non-serenity Songbird instance.");
+116        }
+117    }
+118}
+119
+120#[cfg(feature = "serenity")]
+121#[derive(Debug, Default)]
+122/// Serenity-specific wrapper for sharder state initialised by the library.
+123///
+124/// This is updated and maintained by the library, and is designed to prevent
+125/// message loss during rebalances and reconnects.
+126pub struct SerenitySharder(DashMap<u32, Arc<SerenityShardHandle>>);
+127
+128#[cfg(feature = "serenity")]
+129impl SerenitySharder {
+130    fn get_or_insert_shard_handle(&self, shard_id: u32) -> Arc<SerenityShardHandle> {
+131        self.0.entry(shard_id).or_default().clone()
+132    }
+133
+134    fn register_shard_handle(&self, shard_id: u32, sender: Sender<ShardRunnerMessage>) {
+135        // Write locks are only used to add new entries to the map.
+136        let handle = self.get_or_insert_shard_handle(shard_id);
+137
+138        handle.register(sender);
+139    }
+140
+141    fn deregister_shard_handle(&self, shard_id: u32) {
+142        // Write locks are only used to add new entries to the map.
+143        let handle = self.get_or_insert_shard_handle(shard_id);
+144
+145        handle.deregister();
+146    }
+147}
+148
+149#[derive(Derivative, Clone)]
+150#[derivative(Debug)]
+151#[non_exhaustive]
+152/// A reference to an individual websocket connection.
+153pub enum Shard {
+154    #[cfg(feature = "serenity")]
+155    /// Handle to one of serenity's shard runners.
+156    Serenity(Arc<SerenityShardHandle>),
+157    #[cfg(feature = "twilight")]
+158    /// Handle to a map of twilight command senders.
+159    Twilight(Arc<TwilightMap>, u32),
+160    /// Handle to a generic shard instance.
+161    Generic(#[derivative(Debug = "ignore")] Arc<dyn VoiceUpdate + Send + Sync>),
+162}
+163
+164#[async_trait]
+165impl VoiceUpdate for Shard {
+166    async fn update_voice_state(
+167        &self,
+168        guild_id: GuildId,
+169        channel_id: Option<ChannelId>,
+170        self_deaf: bool,
+171        self_mute: bool,
+172    ) -> JoinResult<()> {
+173        match self {
+174            #[cfg(feature = "serenity")]
+175            Shard::Serenity(handle) => {
+176                let map = json!({
+177                    "op": 4,
+178                    "d": {
+179                        "channel_id": channel_id.map(|c| c.0),
+180                        "guild_id": guild_id.0,
+181                        "self_deaf": self_deaf,
+182                        "self_mute": self_mute,
+183                    }
+184                });
+185
+186                handle.send(ShardRunnerMessage::Message(map.to_string().into()))?;
+187                Ok(())
+188            },
+189            #[cfg(feature = "twilight")]
+190            Shard::Twilight(map, shard_id) => {
+191                let channel_id = channel_id.map(|c| c.0).map(From::from);
+192                let cmd = TwilightVoiceState::new(guild_id.0, channel_id, self_deaf, self_mute);
+193                let sender = map
+194                    .get(*shard_id)
+195                    .ok_or(crate::error::JoinError::NoSender)?;
+196                sender.command(&cmd)?;
+197                Ok(())
+198            },
+199            Shard::Generic(g) =>
+200                g.update_voice_state(guild_id, channel_id, self_deaf, self_mute)
+201                    .await,
+202        }
+203    }
+204}
+205
+206/// Trait for a generic shard handle to send voice state updates to Discord.
+207///
+208/// This allows any Discord library to be integrated with Songbird, and is intended to
+209/// wrap a message channel to a single shard. Songbird only needs to send `VoiceStateUpdate`s
+210/// to Discord to function.
+211///
+212/// Generic libraries must be sure to call [`Call::update_server`] and [`Call::update_state`]
+213/// in response to their own received messages.
+214///
+215/// [`Call::update_server`]: crate::Call::update_server
+216/// [`Call::update_state`]: crate::Call::update_state
+217#[async_trait]
+218pub trait VoiceUpdate {
+219    /// Send a voice update message to the inner shard handle.
+220    async fn update_voice_state(
+221        &self,
+222        guild_id: GuildId,
+223        channel_id: Option<ChannelId>,
+224        self_deaf: bool,
+225        self_mute: bool,
+226    ) -> JoinResult<()>;
+227}
+228
+229#[cfg(feature = "serenity")]
+230/// Handle to an individual shard designed to buffer unsent messages while
+231/// a reconnect/rebalance is ongoing.
+232#[derive(Debug, Default)]
+233pub struct SerenityShardHandle {
+234    sender: PRwLock<Option<Sender<ShardRunnerMessage>>>,
+235    queue: PMutex<Vec<ShardRunnerMessage>>,
+236}
+237
+238#[cfg(feature = "serenity")]
+239impl SerenityShardHandle {
+240    fn register(&self, sender: Sender<ShardRunnerMessage>) {
+241        debug!("Adding shard handle send channel...");
+242
+243        let mut sender_lock = self.sender.write();
+244        *sender_lock = Some(sender);
+245
+246        debug!("Added shard handle send channel.");
+247
+248        let sender_lock = RwLockWriteGuard::downgrade(sender_lock);
+249        let mut messages_lock = self.queue.lock();
+250
+251        debug!("Clearing queued messages...");
+252
+253        if let Some(sender) = &*sender_lock {
+254            let mut i = 0;
+255            for msg in messages_lock.drain(..) {
+256                if let Err(e) = sender.unbounded_send(msg) {
+257                    error!("Error while clearing gateway message queue: {:?}", e);
+258                    break;
+259                }
+260
+261                i += 1;
+262            }
+263
+264            if i > 0 {
+265                debug!("{} buffered messages sent to Serenity.", i);
+266            }
+267        }
+268
+269        debug!("Cleared queued messages.");
+270    }
+271
+272    fn deregister(&self) {
+273        debug!("Removing shard handle send channel...");
+274
+275        let mut sender_lock = self.sender.write();
+276        *sender_lock = None;
+277
+278        debug!("Removed shard handle send channel.");
+279    }
+280
+281    fn send(
+282        &self,
+283        message: ShardRunnerMessage,
+284    ) -> StdResult<(), Box<TrySendError<ShardRunnerMessage>>> {
+285        let sender_lock = self.sender.read();
+286        if let Some(sender) = &*sender_lock {
+287            sender.unbounded_send(message).map_err(Box::new)
+288        } else {
+289            debug!("Serenity shard temporarily disconnected: buffering message...");
+290            let mut messages_lock = self.queue.lock();
+291            messages_lock.push(message);
+292            debug!("Buffered message.");
+293            Ok(())
+294        }
+295    }
+296}
\ No newline at end of file diff --git a/next/src/songbird/tracks/action.rs.html b/next/src/songbird/tracks/action.rs.html new file mode 100644 index 0000000..bffb9e9 --- /dev/null +++ b/next/src/songbird/tracks/action.rs.html @@ -0,0 +1,43 @@ +action.rs - source

songbird/tracks/
action.rs

1use flume::Sender;
+2use std::time::Duration;
+3
+4use super::{PlayError, SeekRequest};
+5
+6/// Actions for the mixer to take after inspecting track state via
+7/// [`TrackHandle::action`].
+8///
+9/// [`TrackHandle::action`]: super::TrackHandle::action
+10#[derive(Clone, Default)]
+11pub struct Action {
+12    pub(crate) make_playable: Option<Sender<Result<(), PlayError>>>,
+13    pub(crate) seek_point: Option<SeekRequest>,
+14}
+15
+16impl Action {
+17    /// Requests a seek to the given time for this track.
+18    #[must_use]
+19    pub fn seek(mut self, time: Duration) -> Self {
+20        let (callback, _) = flume::bounded(1);
+21        self.seek_point = Some(SeekRequest { time, callback });
+22
+23        self
+24    }
+25
+26    /// Readies the track to be playable, if this is not already the case.
+27    #[must_use]
+28    pub fn make_playable(mut self) -> Self {
+29        let (tx, _) = flume::bounded(1);
+30        self.make_playable = Some(tx);
+31
+32        self
+33    }
+34
+35    pub(crate) fn combine(&mut self, other: Self) {
+36        if other.make_playable.is_some() {
+37            self.make_playable = other.make_playable;
+38        }
+39        if other.seek_point.is_some() {
+40            self.seek_point = other.seek_point;
+41        }
+42    }
+43}
\ No newline at end of file diff --git a/next/src/songbird/tracks/command.rs.html b/next/src/songbird/tracks/command.rs.html new file mode 100644 index 0000000..32ec72d --- /dev/null +++ b/next/src/songbird/tracks/command.rs.html @@ -0,0 +1,62 @@ +command.rs - source

songbird/tracks/
command.rs

1use super::*;
+2use crate::events::EventData;
+3use flume::Sender;
+4use std::fmt::{Debug, Formatter, Result as FmtResult};
+5
+6/// A request from external code using a [`TrackHandle`] to modify
+7/// or act upon an [`Track`] object.
+8///
+9/// [`Track`]: Track
+10/// [`TrackHandle`]: TrackHandle
+11#[non_exhaustive]
+12pub enum TrackCommand {
+13    /// Set the track's play_mode to play/resume.
+14    Play,
+15    /// Set the track's play_mode to pause.
+16    Pause,
+17    /// Stop the target track. This cannot be undone.
+18    Stop,
+19    /// Set the track's volume.
+20    Volume(f32),
+21    /// Seek to the given duration.
+22    ///
+23    /// On unsupported input types, this can be fatal.
+24    Seek(SeekRequest),
+25    /// Register an event on this track.
+26    AddEvent(EventData),
+27    /// Run some closure on this track, with direct access to the core object.
+28    Do(Box<dyn FnOnce(View<'_>) -> Option<Action> + Send + Sync + 'static>),
+29    /// Request a copy of this track's state.
+30    Request(Sender<TrackState>),
+31    /// Change the loop count/strategy of this track.
+32    Loop(LoopState),
+33    /// Prompts a track's input to become live and usable, if it is not already.
+34    MakePlayable(Sender<Result<(), PlayError>>),
+35}
+36
+37impl Debug for TrackCommand {
+38    fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
+39        write!(
+40            f,
+41            "TrackCommand::{}",
+42            match self {
+43                Self::Play => "Play".to_string(),
+44                Self::Pause => "Pause".to_string(),
+45                Self::Stop => "Stop".to_string(),
+46                Self::Volume(vol) => format!("Volume({vol})"),
+47                Self::Seek(s) => format!("Seek({:?})", s.time),
+48                Self::AddEvent(evt) => format!("AddEvent({evt:?})"),
+49                Self::Do(_f) => "Do([function])".to_string(),
+50                Self::Request(tx) => format!("Request({tx:?})"),
+51                Self::Loop(loops) => format!("Loop({loops:?})"),
+52                Self::MakePlayable(_) => "MakePlayable".to_string(),
+53            }
+54        )
+55    }
+56}
+57
+58#[derive(Clone, Debug)]
+59pub struct SeekRequest {
+60    pub time: Duration,
+61    pub callback: Sender<Result<Duration, PlayError>>,
+62}
\ No newline at end of file diff --git a/next/src/songbird/tracks/error.rs.html b/next/src/songbird/tracks/error.rs.html new file mode 100644 index 0000000..83a3b4f --- /dev/null +++ b/next/src/songbird/tracks/error.rs.html @@ -0,0 +1,110 @@ +error.rs - source

songbird/tracks/
error.rs

1use crate::input::AudioStreamError;
+2use flume::RecvError;
+3use std::{
+4    error::Error,
+5    fmt::{Display, Formatter, Result as FmtResult},
+6    sync::Arc,
+7};
+8use symphonia_core::errors::Error as SymphoniaError;
+9
+10/// Errors associated with control and manipulation of tracks.
+11///
+12/// Unless otherwise stated, these don't invalidate an existing track,
+13/// but do advise on valid operations and commands.
+14#[derive(Clone, Debug)]
+15#[non_exhaustive]
+16pub enum ControlError {
+17    /// The operation failed because the track has ended, has been removed
+18    /// due to call closure, or some error within the driver.
+19    Finished,
+20    /// The supplied event listener can never be fired by a track, and should
+21    /// be attached to the driver instead.
+22    InvalidTrackEvent,
+23    /// A command to seek or ready the target track failed when parsing or creating the stream.
+24    ///
+25    /// This is a fatal error, and the track will be removed.
+26    Play(PlayError),
+27    /// Another `seek`/`make_playable` request was made, and so this callback handler was dropped.
+28    Dropped,
+29}
+30
+31impl Display for ControlError {
+32    fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
+33        write!(f, "failed to operate on track (handle): ")?;
+34        match self {
+35            ControlError::Finished => write!(f, "track ended"),
+36            ControlError::InvalidTrackEvent => {
+37                write!(f, "given event listener can't be fired on a track")
+38            },
+39            ControlError::Play(p) => {
+40                write!(f, "i/o request on track failed: {p}")
+41            },
+42            ControlError::Dropped => write!(f, "request was replaced by another of same type"),
+43        }
+44    }
+45}
+46
+47impl Error for ControlError {}
+48
+49impl From<RecvError> for ControlError {
+50    fn from(_: RecvError) -> Self {
+51        ControlError::Dropped
+52    }
+53}
+54
+55/// Alias for most calls to a [`TrackHandle`].
+56///
+57/// [`TrackHandle`]: super::TrackHandle
+58pub type TrackResult<T> = Result<T, ControlError>;
+59
+60/// Errors reported by the mixer while attempting to play (or ready) a [`Track`].
+61///
+62/// [`Track`]: super::Track
+63#[derive(Clone, Debug)]
+64#[non_exhaustive]
+65pub enum PlayError {
+66    /// Failed to create a live bytestream from the lazy [`Compose`].
+67    ///
+68    /// [`Compose`]: crate::input::Compose
+69    Create(Arc<AudioStreamError>),
+70    /// Failed to read headers, codecs, or a valid stream from an [`Input`].
+71    ///
+72    /// [`Input`]: crate::input::Input
+73    Parse(Arc<SymphoniaError>),
+74    /// Failed to decode a frame received from an [`Input`].
+75    ///
+76    /// [`Input`]: crate::input::Input
+77    Decode(Arc<SymphoniaError>),
+78    /// Failed to seek to the requested location.
+79    Seek(Arc<SymphoniaError>),
+80}
+81
+82impl Display for PlayError {
+83    fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
+84        f.write_str("runtime error while playing track: ")?;
+85        match self {
+86            Self::Create(c) => {
+87                f.write_str("input creation [")?;
+88                f.write_fmt(format_args!("{}", &c))?;
+89                f.write_str("]")
+90            },
+91            Self::Parse(p) => {
+92                f.write_str("parsing formats/codecs [")?;
+93                f.write_fmt(format_args!("{}", &p))?;
+94                f.write_str("]")
+95            },
+96            Self::Decode(d) => {
+97                f.write_str("decoding packets [")?;
+98                f.write_fmt(format_args!("{}", &d))?;
+99                f.write_str("]")
+100            },
+101            Self::Seek(s) => {
+102                f.write_str("seeking along input [")?;
+103                f.write_fmt(format_args!("{}", &s))?;
+104                f.write_str("]")
+105            },
+106        }
+107    }
+108}
+109
+110impl Error for PlayError {}
\ No newline at end of file diff --git a/next/src/songbird/tracks/handle.rs.html b/next/src/songbird/tracks/handle.rs.html new file mode 100644 index 0000000..23fc974 --- /dev/null +++ b/next/src/songbird/tracks/handle.rs.html @@ -0,0 +1,301 @@ +handle.rs - source

songbird/tracks/
handle.rs

1use super::*;
+2use crate::events::{Event, EventData, EventHandler};
+3use flume::{Receiver, Sender};
+4use std::{any::Any, sync::Arc, time::Duration};
+5use uuid::Uuid;
+6
+7#[derive(Clone, Debug)]
+8/// Handle for safe control of a [`Track`] from other threads, outside
+9/// of the audio mixing and voice handling context.
+10///
+11/// These are cheap to clone, using `Arc<...>` internally.
+12///
+13/// Many method calls here are fallible; in most cases, this will be because
+14/// the underlying [`Track`] object has been discarded. Those which aren't refer
+15/// to shared data not used by the driver.
+16pub struct TrackHandle {
+17    inner: Arc<InnerHandle>,
+18}
+19
+20#[derive(Debug)]
+21struct InnerHandle {
+22    command_channel: Sender<TrackCommand>,
+23    uuid: Uuid,
+24    data: Arc<dyn Any + Send + Sync + 'static>,
+25}
+26
+27impl TrackHandle {
+28    /// Creates a new handle, using the given command sink.
+29    ///
+30    /// [`Input`]: crate::input::Input
+31    #[must_use]
+32    pub(crate) fn new(
+33        command_channel: Sender<TrackCommand>,
+34        uuid: Uuid,
+35        data: Arc<dyn Any + Send + Sync + 'static>,
+36    ) -> Self {
+37        let inner = Arc::new(InnerHandle {
+38            command_channel,
+39            uuid,
+40            data,
+41        });
+42
+43        Self { inner }
+44    }
+45
+46    /// Unpauses an audio track.
+47    pub fn play(&self) -> TrackResult<()> {
+48        self.send(TrackCommand::Play)
+49    }
+50
+51    /// Pauses an audio track.
+52    pub fn pause(&self) -> TrackResult<()> {
+53        self.send(TrackCommand::Pause)
+54    }
+55
+56    /// Stops an audio track.
+57    ///
+58    /// This is *final*, and will cause the audio context to fire
+59    /// a [`TrackEvent::End`] event.
+60    ///
+61    /// [`TrackEvent::End`]: crate::events::TrackEvent::End
+62    pub fn stop(&self) -> TrackResult<()> {
+63        self.send(TrackCommand::Stop)
+64    }
+65
+66    /// Sets the volume of an audio track.
+67    pub fn set_volume(&self, volume: f32) -> TrackResult<()> {
+68        self.send(TrackCommand::Volume(volume))
+69    }
+70
+71    #[must_use]
+72    /// Ready a track for playing if it is lazily initialised.
+73    ///
+74    /// If a track is already playable, the callback will instantly succeed.
+75    pub fn make_playable(&self) -> TrackCallback<()> {
+76        let (tx, rx) = flume::bounded(1);
+77        let fail = self.send(TrackCommand::MakePlayable(tx)).is_err();
+78
+79        TrackCallback { fail, rx }
+80    }
+81
+82    /// Ready a track for playing if it is lazily initialised.
+83    ///
+84    /// This folds [`Self::make_playable`] into a single `async` result, but must
+85    /// be awaited for the command to be sent.
+86    pub async fn make_playable_async(&self) -> TrackResult<()> {
+87        self.make_playable().result_async().await
+88    }
+89
+90    #[must_use]
+91    /// Seeks along the track to the specified position.
+92    ///
+93    /// If the underlying [`Input`] does not support seeking,
+94    /// forward seeks will succeed. Backward seeks will recreate the
+95    /// track using the lazy [`Compose`] if present. The returned callback
+96    /// will indicate whether the seek succeeded.
+97    ///
+98    /// [`Input`]: crate::input::Input
+99    /// [`Compose`]: crate::input::Compose
+100    pub fn seek(&self, position: Duration) -> TrackCallback<Duration> {
+101        let (tx, rx) = flume::bounded(1);
+102        let fail = self
+103            .send(TrackCommand::Seek(SeekRequest {
+104                time: position,
+105                callback: tx,
+106            }))
+107            .is_err();
+108
+109        TrackCallback { fail, rx }
+110    }
+111
+112    /// Seeks along the track to the specified position.
+113    ///
+114    /// This folds [`Self::seek`] into a single `async` result, but must
+115    /// be awaited for the command to be sent.
+116    pub async fn seek_async(&self, position: Duration) -> TrackResult<Duration> {
+117        self.seek(position).result_async().await
+118    }
+119
+120    /// Attach an event handler to an audio track. These will receive [`EventContext::Track`].
+121    ///
+122    /// Events which can only be fired by the global context return [`ControlError::InvalidTrackEvent`]
+123    ///
+124    /// [`EventContext::Track`]: crate::events::EventContext::Track
+125    pub fn add_event<F: EventHandler + 'static>(&self, event: Event, action: F) -> TrackResult<()> {
+126        let cmd = TrackCommand::AddEvent(EventData::new(event, action));
+127        if event.is_global_only() {
+128            Err(ControlError::InvalidTrackEvent)
+129        } else {
+130            self.send(cmd)
+131        }
+132    }
+133
+134    /// Perform an arbitrary synchronous action on a raw [`Track`] object.
+135    ///
+136    /// This will give access to a [`View`] of the current track state and [`Metadata`],
+137    /// which can be used to take an [`Action`].
+138    ///
+139    /// Users **must** ensure that no costly work or blocking occurs
+140    /// within the supplied function or closure. *Taking excess time could prevent
+141    /// timely sending of packets, causing audio glitches and delays*.
+142    ///
+143    /// [`Metadata`]: crate::input::Metadata
+144    pub fn action<F>(&self, action: F) -> TrackResult<()>
+145    where
+146        F: FnOnce(View<'_>) -> Option<Action> + Send + Sync + 'static,
+147    {
+148        self.send(TrackCommand::Do(Box::new(action)))
+149    }
+150
+151    /// Request playback information and state from the audio context.
+152    pub async fn get_info(&self) -> TrackResult<TrackState> {
+153        let (tx, rx) = flume::bounded(1);
+154        self.send(TrackCommand::Request(tx))?;
+155
+156        rx.recv_async().await.map_err(|_| ControlError::Finished)
+157    }
+158
+159    /// Set an audio track to loop indefinitely.
+160    ///
+161    /// This requires either a [`Compose`] to be present or for the
+162    /// input stream to be seekable.
+163    ///
+164    /// [`Input`]: crate::input::Input
+165    /// [`Compose`]: crate::input::Compose
+166    pub fn enable_loop(&self) -> TrackResult<()> {
+167        self.send(TrackCommand::Loop(LoopState::Infinite))
+168    }
+169
+170    /// Set an audio track to no longer loop.
+171    ///
+172    /// This follows the same rules as [`enable_loop`].
+173    ///
+174    /// [`enable_loop`]: Self::enable_loop
+175    pub fn disable_loop(&self) -> TrackResult<()> {
+176        self.send(TrackCommand::Loop(LoopState::Finite(0)))
+177    }
+178
+179    /// Set an audio track to loop a set number of times.
+180    ///
+181    /// This follows the same rules as [`enable_loop`].
+182    ///
+183    /// [`enable_loop`]: Self::enable_loop
+184    pub fn loop_for(&self, count: usize) -> TrackResult<()> {
+185        self.send(TrackCommand::Loop(LoopState::Finite(count)))
+186    }
+187
+188    /// Returns this handle's (and track's) unique identifier.
+189    #[must_use]
+190    pub fn uuid(&self) -> Uuid {
+191        self.inner.uuid
+192    }
+193
+194    /// Allows access to this track's attached Data.
+195    ///
+196    /// Data allows additional, user-defined data shared by all handles
+197    /// to be attached to any track.
+198    ///
+199    /// # Panics
+200    /// This method will panic if the Data has not been initialised, or the type
+201    /// provided does not equal the type passed to [`Track::new_with_data`].
+202    #[must_use]
+203    pub fn data<Data>(&self) -> Arc<Data>
+204    where
+205        Data: Send + Sync + 'static,
+206    {
+207        Arc::clone(&self.inner.data)
+208            .downcast()
+209            .expect("TrackHandle::data generic does not match type set in TrackHandle::set_data")
+210    }
+211
+212    #[inline]
+213    /// Send a raw command to the [`Track`] object.
+214    ///
+215    /// [`Track`]: Track
+216    pub(crate) fn send(&self, cmd: TrackCommand) -> TrackResult<()> {
+217        // As the send channels are unbounded, we can be reasonably certain
+218        // that send failure == cancellation.
+219        self.inner
+220            .command_channel
+221            .send(cmd)
+222            .map_err(|_e| ControlError::Finished)
+223    }
+224}
+225
+226/// Asynchronous reply for an operation applied to a [`TrackHandle`].
+227///
+228/// This object does not need to be `.await`ed for the driver to perform an action.
+229/// Async threads can then call, e.g., [`TrackHandle::make_playable`], and safely drop
+230/// this callback if the result isn't needed.
+231pub struct TrackCallback<T> {
+232    fail: bool,
+233    rx: Receiver<Result<T, PlayError>>,
+234}
+235
+236impl<T> TrackCallback<T> {
+237    /// Consumes this handle to await a reply from the driver, blocking the current thread.
+238    pub fn result(self) -> TrackResult<T> {
+239        if self.fail {
+240            Err(ControlError::Finished)
+241        } else {
+242            self.rx.recv()?.map_err(ControlError::Play)
+243        }
+244    }
+245
+246    /// Consumes this handle to await a reply from the driver asynchronously.
+247    pub async fn result_async(self) -> TrackResult<T> {
+248        if self.fail {
+249            Err(ControlError::Finished)
+250        } else {
+251            self.rx.recv_async().await?.map_err(ControlError::Play)
+252        }
+253    }
+254
+255    #[must_use]
+256    /// Returns `true` if the operation instantly failed due to the target track being
+257    /// removed.
+258    pub fn is_hung_up(&self) -> bool {
+259        self.fail
+260    }
+261}
+262
+263#[cfg(test)]
+264mod tests {
+265    use super::*;
+266    use crate::{constants::test_data::FILE_WAV_TARGET, driver::Driver, input::File, Config};
+267
+268    #[tokio::test]
+269    #[ntest::timeout(10_000)]
+270    async fn make_playable_callback_fires() {
+271        let (t_handle, config) = Config::test_cfg(true);
+272        let mut driver = Driver::new(config.clone());
+273
+274        let file = File::new(FILE_WAV_TARGET);
+275        let handle = driver.play(Track::from(file).pause());
+276
+277        let callback = handle.make_playable();
+278        t_handle.spawn_ticker();
+279        assert!(callback.result_async().await.is_ok());
+280    }
+281
+282    #[tokio::test]
+283    #[ntest::timeout(10_000)]
+284    async fn seek_callback_fires() {
+285        let (t_handle, config) = Config::test_cfg(true);
+286        let mut driver = Driver::new(config.clone());
+287
+288        let file = File::new(FILE_WAV_TARGET);
+289        let handle = driver.play(Track::from(file).pause());
+290
+291        let target = Duration::from_millis(500);
+292        let callback = handle.seek(target);
+293        t_handle.spawn_ticker();
+294
+295        let answer = callback.result_async().await;
+296        assert!(answer.is_ok());
+297        let answer = answer.unwrap();
+298        let delta = Duration::from_millis(100);
+299        assert!(answer > target - delta && answer < target + delta);
+300    }
+301}
\ No newline at end of file diff --git a/next/src/songbird/tracks/looping.rs.html b/next/src/songbird/tracks/looping.rs.html new file mode 100644 index 0000000..9f166d8 --- /dev/null +++ b/next/src/songbird/tracks/looping.rs.html @@ -0,0 +1,128 @@ +looping.rs - source

songbird/tracks/
looping.rs

1/// Looping behaviour for a [`Track`].
+2///
+3/// [`Track`]: struct.Track.html
+4#[derive(Copy, Clone, Debug, Eq, PartialEq)]
+5pub enum LoopState {
+6    /// Track will loop endlessly until loop state is changed or
+7    /// manually stopped.
+8    Infinite,
+9
+10    /// Track will loop `n` more times.
+11    ///
+12    /// `Finite(0)` is the `Default`, stopping the track once its [`Input`] ends.
+13    ///
+14    /// [`Input`]: crate::input::Input
+15    Finite(usize),
+16}
+17
+18impl Default for LoopState {
+19    fn default() -> Self {
+20        Self::Finite(0)
+21    }
+22}
+23
+24#[cfg(test)]
+25mod tests {
+26    use super::*;
+27    use crate::{
+28        constants::test_data::FILE_WAV_TARGET,
+29        driver::Driver,
+30        input::File,
+31        tracks::{PlayMode, Track, TrackState},
+32        Config,
+33        Event,
+34        EventContext,
+35        EventHandler,
+36        TrackEvent,
+37    };
+38    use flume::Sender;
+39
+40    struct Looper {
+41        tx: Sender<TrackState>,
+42    }
+43
+44    #[async_trait::async_trait]
+45    impl EventHandler for Looper {
+46        async fn act(&self, ctx: &crate::EventContext<'_>) -> Option<Event> {
+47            if let EventContext::Track(&[(state, _)]) = ctx {
+48                drop(self.tx.send(state.clone()));
+49            }
+50
+51            None
+52        }
+53    }
+54
+55    #[tokio::test]
+56    #[ntest::timeout(15_000)]
+57    async fn finite_track_loops_work() {
+58        let (t_handle, config) = Config::test_cfg(true);
+59        let mut driver = Driver::new(config.clone());
+60
+61        let file = File::new(FILE_WAV_TARGET);
+62        let handle = driver.play(Track::from(file).loops(LoopState::Finite(2)));
+63
+64        let (l_tx, l_rx) = flume::unbounded();
+65        let (e_tx, e_rx) = flume::unbounded();
+66        let _ = handle.add_event(Event::Track(TrackEvent::Loop), Looper { tx: l_tx });
+67        let _ = handle.add_event(Event::Track(TrackEvent::End), Looper { tx: e_tx });
+68
+69        t_handle.spawn_ticker();
+70
+71        // CONDITIONS:
+72        // 1) 2 loop events, each changes the loop count.
+73        // 2) Track ends.
+74        // 3) Playtime >> Position
+75        assert_eq!(
+76            l_rx.recv_async().await.map(|v| v.loops),
+77            Ok(LoopState::Finite(1))
+78        );
+79        assert_eq!(
+80            l_rx.recv_async().await.map(|v| v.loops),
+81            Ok(LoopState::Finite(0))
+82        );
+83        let ended = e_rx.recv_async().await;
+84
+85        assert!(ended.is_ok());
+86
+87        let ended = ended.unwrap();
+88        assert!(ended.play_time > 2 * ended.position);
+89    }
+90
+91    #[tokio::test]
+92    #[ntest::timeout(15_000)]
+93    async fn infinite_track_loops_work() {
+94        let (t_handle, config) = Config::test_cfg(true);
+95        let mut driver = Driver::new(config.clone());
+96
+97        let file = File::new(FILE_WAV_TARGET);
+98        let handle = driver.play(Track::from(file).loops(LoopState::Infinite));
+99
+100        let (l_tx, l_rx) = flume::unbounded();
+101        let _ = handle.add_event(Event::Track(TrackEvent::Loop), Looper { tx: l_tx });
+102
+103        t_handle.spawn_ticker();
+104
+105        // CONDITIONS:
+106        // 1) 3 loop events, each does not change the loop count.
+107        // 2) Track still playing at final
+108        // 3) Playtime >> Position
+109        assert_eq!(
+110            l_rx.recv_async().await.map(|v| v.loops),
+111            Ok(LoopState::Infinite)
+112        );
+113        assert_eq!(
+114            l_rx.recv_async().await.map(|v| v.loops),
+115            Ok(LoopState::Infinite)
+116        );
+117
+118        let final_state = l_rx.recv_async().await;
+119        assert_eq!(
+120            final_state.as_ref().map(|v| v.loops),
+121            Ok(LoopState::Infinite)
+122        );
+123        let final_state = final_state.unwrap();
+124
+125        assert_eq!(final_state.playing, PlayMode::Play);
+126        assert!(final_state.play_time > 2 * final_state.position);
+127    }
+128}
\ No newline at end of file diff --git a/next/src/songbird/tracks/mod.rs.html b/next/src/songbird/tracks/mod.rs.html new file mode 100644 index 0000000..a63e849 --- /dev/null +++ b/next/src/songbird/tracks/mod.rs.html @@ -0,0 +1,220 @@ +mod.rs - source

songbird/tracks/
mod.rs

1//! Live, controllable audio instances.
+2//!
+3//! Tracks add control and event data around the bytestreams offered by [`Input`],
+4//! where each represents a live audio source inside of the driver's mixer. This includes
+5//! play state, volume, and looping behaviour.
+6//!
+7//! To configure an audio source as it is created, you can create a [`Track`] to set the
+8//! above playback state [from any `Input` or `T: Into<Input>`](Track#trait-implementations)
+9//! using `Track::from(...)`.
+10//!
+11//! To configure an audio source once it has been given to a [`Driver`], you are given a
+12//! [`TrackHandle`] once you hand the [`Input`] and state over to be played. These handles
+13//! remotely send commands from your bot's (a)sync context to control playback, register events,
+14//! and execute synchronous closures. This design prevents user code from being able to lock
+15//! or stall the audio mixer.
+16//!
+17//! [`Driver`]: crate::driver::Driver
+18
+19mod action;
+20mod command;
+21mod error;
+22mod handle;
+23mod looping;
+24mod mode;
+25mod queue;
+26mod ready;
+27mod state;
+28mod view;
+29
+30pub use self::{
+31    action::*,
+32    error::*,
+33    handle::*,
+34    looping::*,
+35    mode::*,
+36    queue::*,
+37    ready::*,
+38    state::*,
+39    view::*,
+40};
+41pub(crate) use command::*;
+42
+43use crate::{constants::*, driver::tasks::message::*, events::EventStore, input::Input};
+44use std::{any::Any, sync::Arc, time::Duration};
+45use uuid::Uuid;
+46
+47/// Initial state for audio playback.
+48///
+49/// [`Track`]s allow you to configure play modes, volume, event handlers, and other track state
+50/// before you pass an input to the [`Driver`].
+51///
+52/// Live track data is accessed via a [`TrackHandle`], which is returned by [`Driver::play`] and
+53/// related methods.
+54///
+55/// # Example
+56///
+57/// ```rust,no_run
+58/// use songbird::{driver::Driver, input::File, tracks::Track};
+59///
+60/// // A Call is also valid here!
+61/// let mut driver: Driver = Default::default();
+62/// let source = File::new("../audio/my-favourite-song.mp3");
+63///
+64/// let handle = driver.play_only(Track::from(source).volume(0.5));
+65///
+66/// // Future access occurs via audio.
+67/// ```
+68///
+69/// [`Driver`]: crate::driver::Driver
+70/// [`Driver::play`]: crate::driver::Driver::play
+71pub struct Track {
+72    /// Whether or not this sound is currently playing.
+73    ///
+74    /// Defaults to [`PlayMode::Play`].
+75    pub playing: PlayMode,
+76
+77    /// The volume for playback.
+78    ///
+79    /// Sensible values fall between `0.0` and `1.0`. Values outside this range can
+80    /// cause clipping or other audio artefacts.
+81    ///
+82    /// Defaults to `1.0`.
+83    pub volume: f32,
+84
+85    /// The live or lazily-initialised audio stream to be played.
+86    pub input: Input,
+87
+88    /// List of events attached to this audio track.
+89    ///
+90    /// This may be used to add additional events to a track
+91    /// before it is sent to the audio context for playing.
+92    ///
+93    /// Defaults to an empty set.
+94    pub events: EventStore,
+95
+96    /// Count of remaining loops.
+97    ///
+98    /// Defaults to play a track once (i.e., [`LoopState::Finite(0)`]).
+99    ///
+100    /// [`LoopState::Finite(0)`]: LoopState::Finite
+101    pub loops: LoopState,
+102
+103    /// Unique identifier for this track.
+104    ///
+105    /// Defaults to a random 128-bit number.
+106    pub uuid: Uuid,
+107
+108    /// Any data to be associated with the track.
+109    pub user_data: Arc<dyn Any + Send + Sync>,
+110}
+111
+112impl Track {
+113    /// Create a new track directly from an [`Input`] and a random [`Uuid`].
+114    #[must_use]
+115    pub fn new(input: Input) -> Self {
+116        Self::new_with_uuid(input, Uuid::new_v4())
+117    }
+118
+119    /// Create a new track directly from an [`Input`] with a custom [`Uuid`].
+120    #[must_use]
+121    pub fn new_with_uuid(input: Input, uuid: Uuid) -> Self {
+122        Self::new_with_uuid_and_data(input, uuid, Arc::new(()))
+123    }
+124
+125    /// Create a new track directly from an [`Input`], user data to be associated with the track, and a random [`Uuid`].
+126    #[must_use]
+127    pub fn new_with_data(input: Input, user_data: Arc<dyn Any + Send + Sync + 'static>) -> Self {
+128        Self::new_with_uuid_and_data(input, Uuid::new_v4(), user_data)
+129    }
+130
+131    /// Create a new track directly from an [`Input`], user data to be associated with the track, and a custom [`Uuid`].
+132    #[must_use]
+133    pub fn new_with_uuid_and_data(
+134        input: Input,
+135        uuid: Uuid,
+136        user_data: Arc<dyn Any + Send + Sync + 'static>,
+137    ) -> Self {
+138        Self {
+139            playing: PlayMode::default(),
+140            volume: 1.0,
+141            input,
+142            events: EventStore::new_local(),
+143            loops: LoopState::Finite(0),
+144            uuid,
+145            user_data,
+146        }
+147    }
+148
+149    #[must_use]
+150    /// Sets a track to playing if it is paused.
+151    pub fn play(mut self) -> Self {
+152        self.playing = PlayMode::Play;
+153        self
+154    }
+155
+156    #[must_use]
+157    /// Pre-emptively pauses a track, preventing it from being automatically played.
+158    pub fn pause(mut self) -> Self {
+159        self.playing = PlayMode::Pause;
+160        self
+161    }
+162
+163    #[must_use]
+164    /// Manually stops a track.
+165    ///
+166    /// This will cause the audio track to be removed by the driver almost immediately,
+167    /// with any relevant events triggered.
+168    pub fn stop(mut self) -> Self {
+169        self.playing = PlayMode::Stop;
+170        self
+171    }
+172
+173    #[must_use]
+174    /// Sets [`volume`] in a manner that allows method chaining.
+175    ///
+176    /// [`volume`]: Track::volume
+177    pub fn volume(mut self, volume: f32) -> Self {
+178        self.volume = volume;
+179
+180        self
+181    }
+182
+183    #[must_use]
+184    /// Set an audio track to loop a set number of times.
+185    pub fn loops(mut self, loops: LoopState) -> Self {
+186        self.loops = loops;
+187
+188        self
+189    }
+190
+191    #[must_use]
+192    /// Returns this track's unique identifier.
+193    pub fn uuid(mut self, uuid: Uuid) -> Self {
+194        self.uuid = uuid;
+195
+196        self
+197    }
+198
+199    pub(crate) fn into_context(self) -> (TrackHandle, TrackContext) {
+200        let (tx, receiver) = flume::unbounded();
+201        let handle = TrackHandle::new(tx, self.uuid, self.user_data.clone());
+202
+203        let context = TrackContext {
+204            handle: handle.clone(),
+205            track: self,
+206            receiver,
+207        };
+208
+209        (handle, context)
+210    }
+211}
+212
+213/// Any [`Input`] (or struct which can be used as one) can also be made into a [`Track`].
+214impl<T: Into<Input>> From<T> for Track {
+215    // NOTE: this is `Into` to support user-given structs which can
+216    // only `impl Into<Input>`.
+217    fn from(val: T) -> Self {
+218        Track::new(val.into())
+219    }
+220}
\ No newline at end of file diff --git a/next/src/songbird/tracks/mode.rs.html b/next/src/songbird/tracks/mode.rs.html new file mode 100644 index 0000000..f50660f --- /dev/null +++ b/next/src/songbird/tracks/mode.rs.html @@ -0,0 +1,78 @@ +mode.rs - source

songbird/tracks/
mode.rs

1use super::PlayError;
+2use crate::events::TrackEvent;
+3
+4/// Playback status of a track.
+5#[derive(Clone, Debug)]
+6#[non_exhaustive]
+7#[derive(Default)]
+8pub enum PlayMode {
+9    /// The track is currently playing.
+10    #[default]
+11    Play,
+12    /// The track is currently paused, and may be resumed.
+13    Pause,
+14    /// The track has been manually stopped, and cannot be restarted.
+15    Stop,
+16    /// The track has naturally ended, and cannot be restarted.
+17    End,
+18    /// The track has encountered a runtime or initialisation error, and cannot be restarted.
+19    Errored(PlayError),
+20}
+21
+22impl PlayMode {
+23    /// Returns whether the track has irreversibly stopped.
+24    #[must_use]
+25    pub fn is_done(&self) -> bool {
+26        matches!(self, PlayMode::Stop | PlayMode::End | PlayMode::Errored(_))
+27    }
+28
+29    /// Returns whether the track has irreversibly stopped.
+30    #[must_use]
+31    pub(crate) fn is_playing(&self) -> bool {
+32        matches!(self, PlayMode::Play)
+33    }
+34
+35    #[must_use]
+36    pub(crate) fn next_state(self, other: Self) -> Self {
+37        // Idea: a finished track cannot be restarted -- this action is final.
+38        // We may want to change this in future so that seekable tracks can uncancel
+39        // themselves, perhaps, but this requires a bit more machinery to readd...
+40        match self {
+41            Self::Play | Self::Pause => other,
+42            state => state,
+43        }
+44    }
+45
+46    pub(crate) fn change_to(&mut self, other: Self) {
+47        *self = self.clone().next_state(other);
+48    }
+49
+50    #[must_use]
+51    pub(crate) fn as_track_event(&self) -> TrackEvent {
+52        match self {
+53            Self::Play => TrackEvent::Play,
+54            Self::Pause => TrackEvent::Pause,
+55            Self::Stop | Self::End => TrackEvent::End,
+56            Self::Errored(_) => TrackEvent::Error,
+57        }
+58    }
+59
+60    // The above fn COULD just return a Vec, but the below means we only allocate a Vec
+61    // in the rare error case.
+62    // Also, see discussion on bitsets in src/events/track.rs
+63    #[must_use]
+64    pub(crate) fn also_fired_track_events(&self) -> Option<Vec<TrackEvent>> {
+65        match self {
+66            Self::Errored(_) => Some(vec![TrackEvent::End]),
+67            _ => None,
+68        }
+69    }
+70}
+71
+72impl PartialEq for PlayMode {
+73    fn eq(&self, other: &Self) -> bool {
+74        self.as_track_event() == other.as_track_event()
+75    }
+76}
+77
+78impl Eq for PlayMode {}
\ No newline at end of file diff --git a/next/src/songbird/tracks/queue.rs.html b/next/src/songbird/tracks/queue.rs.html new file mode 100644 index 0000000..32158e3 --- /dev/null +++ b/next/src/songbird/tracks/queue.rs.html @@ -0,0 +1,499 @@ +queue.rs - source

songbird/tracks/
queue.rs

1use crate::{
+2    driver::Driver,
+3    events::{Event, EventContext, EventData, EventHandler, TrackEvent},
+4    input::Input,
+5    tracks::{Track, TrackHandle, TrackResult},
+6};
+7use async_trait::async_trait;
+8use parking_lot::Mutex;
+9use std::{collections::VecDeque, ops::Deref, sync::Arc, time::Duration};
+10use tracing::{info, warn};
+11
+12/// A simple queue for several audio sources, designed to
+13/// play in sequence.
+14///
+15/// This makes use of [`TrackEvent`]s to determine when the current
+16/// song or audio file has finished before playing the next entry.
+17///
+18/// One of these is automatically included via [`Driver::queue`] when
+19/// the `"builtin-queue"` feature is enabled.
+20///
+21/// `examples/serenity/voice_events_queue` demonstrates how a user might manage,
+22/// track and use this to run a song queue in many guilds in parallel.
+23/// This code is trivial to extend if extra functionality is needed.
+24///
+25/// # Example
+26///
+27/// ```rust,no_run
+28/// use songbird::{
+29///     driver::Driver,
+30///     id::GuildId,
+31///     input::File,
+32///     tracks::TrackQueue,
+33/// };
+34/// use std::collections::HashMap;
+35/// use std::num::NonZeroU64;
+36///
+37/// # async {
+38/// let guild = GuildId(NonZeroU64::new(1).unwrap());
+39/// // A Call is also valid here!
+40/// let mut driver: Driver = Default::default();
+41///
+42/// let mut queues: HashMap<GuildId, TrackQueue> = Default::default();
+43///
+44/// let source = File::new("../audio/my-favourite-song.mp3");
+45///
+46/// // We need to ensure that this guild has a TrackQueue created for it.
+47/// let queue = queues.entry(guild)
+48///     .or_default();
+49///
+50/// // Queueing a track is this easy!
+51/// queue.add_source(source.into(), &mut driver);
+52/// # };
+53/// ```
+54///
+55/// [`TrackEvent`]: crate::events::TrackEvent
+56/// [`Driver::queue`]: crate::driver::Driver
+57#[derive(Clone, Debug, Default)]
+58pub struct TrackQueue {
+59    // NOTE: the choice of a parking lot mutex is quite deliberate
+60    inner: Arc<Mutex<TrackQueueCore>>,
+61}
+62
+63/// Reference to a track which is known to be part of a queue.
+64///
+65/// Instances *should not* be moved from one queue to another.
+66#[derive(Debug)]
+67pub struct Queued(TrackHandle);
+68
+69impl Deref for Queued {
+70    type Target = TrackHandle;
+71
+72    fn deref(&self) -> &Self::Target {
+73        &self.0
+74    }
+75}
+76
+77impl Queued {
+78    /// Clones the inner handle
+79    #[must_use]
+80    pub fn handle(&self) -> TrackHandle {
+81        self.0.clone()
+82    }
+83}
+84
+85#[derive(Debug, Default)]
+86/// Inner portion of a [`TrackQueue`].
+87///
+88/// This abstracts away thread-safety from the user,
+89/// and offers a convenient location to store further state if required.
+90///
+91/// [`TrackQueue`]: TrackQueue
+92struct TrackQueueCore {
+93    tracks: VecDeque<Queued>,
+94}
+95
+96struct QueueHandler {
+97    remote_lock: Arc<Mutex<TrackQueueCore>>,
+98}
+99
+100#[async_trait]
+101impl EventHandler for QueueHandler {
+102    async fn act(&self, ctx: &EventContext<'_>) -> Option<Event> {
+103        let mut inner = self.remote_lock.lock();
+104
+105        // Due to possibility that users might remove, reorder,
+106        // or dequeue+stop tracks, we need to verify that the FIRST
+107        // track is the one who has ended.
+108        match ctx {
+109            EventContext::Track(ts) => {
+110                // This slice should have exactly one entry.
+111                // If the ended track has same id as the queue head, then
+112                // we can progress the queue.
+113                if inner.tracks.front()?.uuid() != ts.first()?.1.uuid() {
+114                    return None;
+115                }
+116            },
+117            _ => return None,
+118        }
+119
+120        let _old = inner.tracks.pop_front();
+121
+122        info!("Queued track ended: {:?}.", ctx);
+123        info!("{} tracks remain.", inner.tracks.len());
+124
+125        // Keep going until we find one track which works, or we run out.
+126        while let Some(new) = inner.tracks.front() {
+127            if new.play().is_err() {
+128                // Discard files which cannot be used for whatever reason.
+129                warn!("Track in Queue couldn't be played...");
+130                inner.tracks.pop_front();
+131            } else {
+132                break;
+133            }
+134        }
+135
+136        None
+137    }
+138}
+139
+140struct SongPreloader {
+141    remote_lock: Arc<Mutex<TrackQueueCore>>,
+142}
+143
+144#[async_trait]
+145impl EventHandler for SongPreloader {
+146    async fn act(&self, _ctx: &EventContext<'_>) -> Option<Event> {
+147        let inner = self.remote_lock.lock();
+148
+149        if let Some(track) = inner.tracks.get(1) {
+150            // This is the sync-version so that we can fire and ignore
+151            // the request ASAP.
+152            drop(track.0.make_playable());
+153        }
+154
+155        None
+156    }
+157}
+158
+159impl TrackQueue {
+160    /// Create a new, empty, track queue.
+161    #[must_use]
+162    pub fn new() -> Self {
+163        Self {
+164            inner: Arc::new(Mutex::new(TrackQueueCore {
+165                tracks: VecDeque::new(),
+166            })),
+167        }
+168    }
+169
+170    /// Adds an audio source to the queue, to be played in the channel managed by `driver`.
+171    ///
+172    /// This method will preload the next track 5 seconds before the current track ends, if
+173    /// the [`AuxMetadata`] can be successfully queried for a [`Duration`].
+174    ///
+175    /// [`AuxMetadata`]: crate::input::AuxMetadata
+176    pub async fn add_source(&self, input: Input, driver: &mut Driver) -> TrackHandle {
+177        self.add(input.into(), driver).await
+178    }
+179
+180    /// Adds a [`Track`] object to the queue, to be played in the channel managed by `driver`.
+181    ///
+182    /// This allows additional configuration or event handlers to be added
+183    /// before enqueueing the audio track. [`Track`]s will be paused pre-emptively.
+184    ///
+185    /// This method will preload the next track 5 seconds before the current track ends, if
+186    /// the [`AuxMetadata`] can be successfully queried for a [`Duration`].
+187    ///
+188    /// [`AuxMetadata`]: crate::input::AuxMetadata
+189    pub async fn add(&self, mut track: Track, driver: &mut Driver) -> TrackHandle {
+190        let preload_time = Self::get_preload_time(&mut track).await;
+191        self.add_with_preload(track, driver, preload_time)
+192    }
+193
+194    pub(crate) async fn get_preload_time(track: &mut Track) -> Option<Duration> {
+195        let meta = match track.input {
+196            Input::Lazy(ref mut rec) | Input::Live(_, Some(ref mut rec)) =>
+197                rec.aux_metadata().await.ok(),
+198            Input::Live(_, None) => None,
+199        };
+200
+201        meta.and_then(|meta| meta.duration)
+202            .map(|d| d.saturating_sub(Duration::from_secs(5)))
+203    }
+204
+205    /// Add an existing [`Track`] to the queue, using a known time to preload the next track.
+206    ///
+207    /// `preload_time` can be specified to enable gapless playback: this is the
+208    /// playback position *in this track* when the the driver will begin to load the next track.
+209    /// The standard [`Self::add`] method use [`AuxMetadata`] to set this to 5 seconds before
+210    /// a track ends.
+211    ///
+212    /// A `None` value will not ready the next track until this track ends, disabling preload.
+213    ///
+214    /// [`AuxMetadata`]: crate::input::AuxMetadata
+215    #[inline]
+216    pub fn add_with_preload(
+217        &self,
+218        mut track: Track,
+219        driver: &mut Driver,
+220        preload_time: Option<Duration>,
+221    ) -> TrackHandle {
+222        // Attempts to start loading the next track before this one ends.
+223        // Idea is to provide as close to gapless playback as possible,
+224        // while minimising memory use.
+225        info!("Track added to queue.");
+226
+227        let remote_lock = self.inner.clone();
+228        track.events.add_event(
+229            EventData::new(Event::Track(TrackEvent::End), QueueHandler { remote_lock }),
+230            Duration::ZERO,
+231        );
+232
+233        if let Some(time) = preload_time {
+234            let remote_lock = self.inner.clone();
+235            track.events.add_event(
+236                EventData::new(Event::Delayed(time), SongPreloader { remote_lock }),
+237                Duration::ZERO,
+238            );
+239        }
+240
+241        let (should_play, handle) = {
+242            let mut inner = self.inner.lock();
+243
+244            let handle = driver.play(track.pause());
+245            inner.tracks.push_back(Queued(handle.clone()));
+246
+247            (inner.tracks.len() == 1, handle)
+248        };
+249
+250        if should_play {
+251            drop(handle.play());
+252        }
+253
+254        handle
+255    }
+256
+257    /// Returns a handle to the currently playing track.
+258    #[must_use]
+259    pub fn current(&self) -> Option<TrackHandle> {
+260        let inner = self.inner.lock();
+261
+262        inner.tracks.front().map(Queued::handle)
+263    }
+264
+265    /// Attempts to remove a track from the specified index.
+266    ///
+267    /// The returned entry can be readded to *this* queue via [`modify_queue`].
+268    ///
+269    /// [`modify_queue`]: TrackQueue::modify_queue
+270    #[must_use]
+271    pub fn dequeue(&self, index: usize) -> Option<Queued> {
+272        self.modify_queue(|vq| vq.remove(index))
+273    }
+274
+275    /// Returns the number of tracks currently in the queue.
+276    #[must_use]
+277    pub fn len(&self) -> usize {
+278        let inner = self.inner.lock();
+279
+280        inner.tracks.len()
+281    }
+282
+283    /// Returns whether there are no tracks currently in the queue.
+284    #[must_use]
+285    pub fn is_empty(&self) -> bool {
+286        let inner = self.inner.lock();
+287
+288        inner.tracks.is_empty()
+289    }
+290
+291    /// Allows modification of the inner queue (i.e., deletion, reordering).
+292    ///
+293    /// Users must be careful to `stop` removed tracks, so as to prevent
+294    /// resource leaks.
+295    pub fn modify_queue<F, O>(&self, func: F) -> O
+296    where
+297        F: FnOnce(&mut VecDeque<Queued>) -> O,
+298    {
+299        let mut inner = self.inner.lock();
+300        func(&mut inner.tracks)
+301    }
+302
+303    /// Pause the track at the head of the queue.
+304    pub fn pause(&self) -> TrackResult<()> {
+305        let inner = self.inner.lock();
+306
+307        if let Some(handle) = inner.tracks.front() {
+308            handle.pause()
+309        } else {
+310            Ok(())
+311        }
+312    }
+313
+314    /// Resume the track at the head of the queue.
+315    pub fn resume(&self) -> TrackResult<()> {
+316        let inner = self.inner.lock();
+317
+318        if let Some(handle) = inner.tracks.front() {
+319            handle.play()
+320        } else {
+321            Ok(())
+322        }
+323    }
+324
+325    /// Stop the currently playing track, and clears the queue.
+326    pub fn stop(&self) {
+327        let mut inner = self.inner.lock();
+328
+329        for track in inner.tracks.drain(..) {
+330            // Errors when removing tracks don't really make
+331            // a difference: an error just implies it's already gone.
+332            drop(track.stop());
+333        }
+334    }
+335
+336    /// Skip to the next track in the queue, if it exists.
+337    pub fn skip(&self) -> TrackResult<()> {
+338        let inner = self.inner.lock();
+339
+340        inner.stop_current()
+341    }
+342
+343    /// Returns a list of currently queued tracks.
+344    ///
+345    /// Does not allow for modification of the queue, instead returns a snapshot of the queue at the time of calling.
+346    ///
+347    /// Use [`modify_queue`] for direct modification of the queue.
+348    ///
+349    /// [`modify_queue`]: TrackQueue::modify_queue
+350    #[must_use]
+351    pub fn current_queue(&self) -> Vec<TrackHandle> {
+352        let inner = self.inner.lock();
+353
+354        inner.tracks.iter().map(Queued::handle).collect()
+355    }
+356}
+357
+358impl TrackQueueCore {
+359    /// Skip to the next track in the queue, if it exists.
+360    fn stop_current(&self) -> TrackResult<()> {
+361        if let Some(handle) = self.tracks.front() {
+362            handle.stop()
+363        } else {
+364            Ok(())
+365        }
+366    }
+367}
+368
+369#[cfg(all(test, feature = "builtin-queue"))]
+370mod tests {
+371    use crate::{
+372        driver::Driver,
+373        input::{File, HttpRequest},
+374        tracks::PlayMode,
+375        Config,
+376    };
+377    use reqwest::Client;
+378    use std::time::Duration;
+379
+380    #[tokio::test]
+381    #[ntest::timeout(20_000)]
+382    async fn next_track_plays_on_end() {
+383        let (t_handle, config) = Config::test_cfg(true);
+384        let mut driver = Driver::new(config.clone());
+385
+386        let file1 = File::new("resources/ting.wav");
+387        let file2 = file1.clone();
+388
+389        let h1 = driver.enqueue_input(file1.into()).await;
+390        let h2 = driver.enqueue_input(file2.into()).await;
+391
+392        // Get h1 in place, playing. Wait for IO to ready.
+393        // Fast wait here since it's all local I/O, no network.
+394        t_handle
+395            .ready_track(&h1, Some(Duration::from_millis(1)))
+396            .await;
+397        t_handle
+398            .ready_track(&h2, Some(Duration::from_millis(1)))
+399            .await;
+400
+401        // playout
+402        t_handle.tick(1);
+403        t_handle.wait(1);
+404
+405        let h1a = h1.get_info();
+406        let h2a = h2.get_info();
+407
+408        // allow get_info to fire for h2.
+409        t_handle.tick(2);
+410
+411        // post-conditions:
+412        // 1) track 1 is done & dropped (commands fail).
+413        // 2) track 2 is playing.
+414        assert!(h1a.await.is_err());
+415        assert_eq!(h2a.await.unwrap().playing, PlayMode::Play);
+416    }
+417
+418    #[tokio::test]
+419    #[ntest::timeout(15_000)]
+420    async fn next_track_plays_on_skip() {
+421        let (t_handle, config) = Config::test_cfg(true);
+422        let mut driver = Driver::new(config.clone());
+423
+424        let file1 = File::new("resources/ting.wav");
+425        let file2 = file1.clone();
+426
+427        let h1 = driver.enqueue_input(file1.into()).await;
+428        let h2 = driver.enqueue_input(file2.into()).await;
+429
+430        // Get h1 in place, playing. Wait for IO to ready.
+431        // Fast wait here since it's all local I/O, no network.
+432        t_handle
+433            .ready_track(&h1, Some(Duration::from_millis(1)))
+434            .await;
+435
+436        assert!(driver.queue().skip().is_ok());
+437
+438        t_handle
+439            .ready_track(&h2, Some(Duration::from_millis(1)))
+440            .await;
+441
+442        // playout
+443        t_handle.skip(1).await;
+444
+445        let h1a = h1.get_info();
+446        let h2a = h2.get_info();
+447
+448        // allow get_info to fire for h2.
+449        t_handle.tick(2);
+450
+451        // post-conditions:
+452        // 1) track 1 is done & dropped (commands fail).
+453        // 2) track 2 is playing.
+454        assert!(h1a.await.is_err());
+455        assert_eq!(h2a.await.unwrap().playing, PlayMode::Play);
+456    }
+457
+458    #[tokio::test]
+459    #[ntest::timeout(15_000)]
+460    async fn next_track_plays_on_err() {
+461        let (t_handle, config) = Config::test_cfg(true);
+462        let mut driver = Driver::new(config.clone());
+463
+464        // File 1 is HTML with no valid audio -- this will fail to play.
+465        let file1 = HttpRequest::new(
+466            Client::new(),
+467            "http://github.com/serenity-rs/songbird/".into(),
+468        );
+469        let file2 = File::new("resources/ting.wav");
+470
+471        let h1 = driver.enqueue_input(file1.into()).await;
+472        let h2 = driver.enqueue_input(file2.into()).await;
+473
+474        // Get h1 in place, playing. Wait for IO to ready.
+475        // Fast wait here since it's all local I/O, no network.
+476        // t_handle
+477        //     .ready_track(&h1, Some(Duration::from_millis(1)))
+478        //     .await;
+479        t_handle
+480            .ready_track(&h2, Some(Duration::from_millis(1)))
+481            .await;
+482
+483        // playout
+484        t_handle.tick(1);
+485        t_handle.wait(1);
+486
+487        let h1a = h1.get_info();
+488        let h2a = h2.get_info();
+489
+490        // allow get_info to fire for h2.
+491        t_handle.tick(2);
+492
+493        // post-conditions:
+494        // 1) track 1 is done & dropped (commands fail).
+495        // 2) track 2 is playing.
+496        assert!(h1a.await.is_err());
+497        assert_eq!(h2a.await.unwrap().playing, PlayMode::Play);
+498    }
+499}
\ No newline at end of file diff --git a/next/src/songbird/tracks/ready.rs.html b/next/src/songbird/tracks/ready.rs.html new file mode 100644 index 0000000..4e2b67c --- /dev/null +++ b/next/src/songbird/tracks/ready.rs.html @@ -0,0 +1,21 @@ +ready.rs - source

songbird/tracks/
ready.rs

1/// Whether this track has been made live, is being processed, or is
+2/// currently uninitialised.
+3#[derive(Copy, Clone, Debug, Eq, PartialEq)]
+4pub enum ReadyState {
+5    /// This track is still a lazy [`Compose`] object, and hasn't been made playable.
+6    ///
+7    /// [`Compose`]: crate::input::Compose
+8    Uninitialised,
+9
+10    /// The mixer is currently creating and parsing this track's bytestream.
+11    Preparing,
+12
+13    /// This track is fully initialised and usable.
+14    Playable,
+15}
+16
+17impl Default for ReadyState {
+18    fn default() -> Self {
+19        Self::Uninitialised
+20    }
+21}
\ No newline at end of file diff --git a/next/src/songbird/tracks/state.rs.html b/next/src/songbird/tracks/state.rs.html new file mode 100644 index 0000000..642aa2e --- /dev/null +++ b/next/src/songbird/tracks/state.rs.html @@ -0,0 +1,64 @@ +state.rs - source

songbird/tracks/
state.rs

1use super::*;
+2
+3/// State of an [`Track`] object, designed to be passed to event handlers
+4/// and retrieved remotely via [`TrackHandle::get_info`].
+5///
+6/// [`Track`]: Track
+7/// [`TrackHandle::get_info`]: TrackHandle::get_info
+8#[derive(Clone, Debug, Default, PartialEq)]
+9pub struct TrackState {
+10    /// Play status (e.g., active, paused, stopped) of this track.
+11    pub playing: PlayMode,
+12
+13    /// Current volume of this track.
+14    pub volume: f32,
+15
+16    /// Current playback position in the source.
+17    ///
+18    /// This is altered by loops and seeks, and represents this track's
+19    /// position in its underlying input stream.
+20    pub position: Duration,
+21
+22    /// Total playback time, increasing monotonically.
+23    pub play_time: Duration,
+24
+25    /// Remaining loops on this track.
+26    pub loops: LoopState,
+27
+28    /// Whether this track has been made live, is being processed, or is
+29    /// currently uninitialised.
+30    pub ready: ReadyState,
+31}
+32
+33impl TrackState {
+34    pub(crate) fn step_frame(&mut self) {
+35        self.position += TIMESTEP_LENGTH;
+36        self.play_time += TIMESTEP_LENGTH;
+37    }
+38}
+39
+40#[cfg(test)]
+41mod tests {
+42    use super::*;
+43    use crate::{constants::test_data::YTDL_TARGET, driver::Driver, input::YoutubeDl, Config};
+44    use reqwest::Client;
+45
+46    #[tokio::test]
+47    #[ntest::timeout(10_000)]
+48    async fn times_unchanged_while_not_ready() {
+49        let (t_handle, config) = Config::test_cfg(true);
+50        let mut driver = Driver::new(config.clone());
+51
+52        let file = YoutubeDl::new(Client::new(), YTDL_TARGET);
+53        let handle = driver.play(Track::from(file));
+54
+55        let state = t_handle
+56            .ready_track(&handle, Some(Duration::from_millis(5)))
+57            .await;
+58
+59        // As state is `play`, the instant we ready we'll have playout.
+60        // Naturally, fetching a ytdl request takes far longer than this.
+61        assert_eq!(state.position, Duration::from_millis(20));
+62        assert_eq!(state.play_time, Duration::from_millis(20));
+63    }
+64}
\ No newline at end of file diff --git a/next/src/songbird/tracks/view.rs.html b/next/src/songbird/tracks/view.rs.html new file mode 100644 index 0000000..43bc355 --- /dev/null +++ b/next/src/songbird/tracks/view.rs.html @@ -0,0 +1,30 @@ +view.rs - source

songbird/tracks/
view.rs

1use super::*;
+2use crate::input::Metadata;
+3
+4/// Live track and input state exposed during [`TrackHandle::action`].
+5///
+6/// [`TrackHandle::action`]: super::[`TrackHandle::action`]
+7#[non_exhaustive]
+8pub struct View<'a> {
+9    /// The current position within this track.
+10    pub position: &'a Duration,
+11
+12    /// The total time a track has been played for.
+13    pub play_time: &'a Duration,
+14
+15    /// The current mixing volume of this track.
+16    pub volume: &'a mut f32,
+17
+18    /// In-stream metadata for this track, if it is fully readied.
+19    pub meta: Option<Metadata<'a>>,
+20
+21    /// The current play status of this track.
+22    pub playing: &'a mut PlayMode,
+23
+24    /// Whether this track has been made live, is being processed, or is
+25    /// currently uninitialised.
+26    pub ready: ReadyState,
+27
+28    /// The number of remaning loops on this track.
+29    pub loops: &'a mut LoopState,
+30}
\ No newline at end of file diff --git a/next/src/songbird/ws.rs.html b/next/src/songbird/ws.rs.html new file mode 100644 index 0000000..d5a41d3 --- /dev/null +++ b/next/src/songbird/ws.rs.html @@ -0,0 +1,162 @@ +ws.rs - source

songbird/
ws.rs

1use crate::{error::JsonError, model::Event};
+2
+3use bytes::Bytes;
+4use futures::{SinkExt, StreamExt, TryStreamExt};
+5use tokio::{
+6    net::TcpStream,
+7    time::{timeout, Duration},
+8};
+9#[cfg(feature = "tungstenite")]
+10use tokio_tungstenite::{
+11    tungstenite::{
+12        error::Error as TungsteniteError,
+13        protocol::{CloseFrame, WebSocketConfig as Config},
+14        Message,
+15    },
+16    MaybeTlsStream,
+17    WebSocketStream,
+18};
+19#[cfg(feature = "tws")]
+20use tokio_websockets::{
+21    CloseCode,
+22    Error as TwsError,
+23    Limits,
+24    MaybeTlsStream,
+25    Message,
+26    WebSocketStream,
+27};
+28use tracing::{debug, instrument};
+29use url::Url;
+30
+31pub struct WsStream(WebSocketStream<MaybeTlsStream<TcpStream>>);
+32
+33impl WsStream {
+34    #[instrument]
+35    pub(crate) async fn connect(url: Url) -> Result<Self> {
+36        #[cfg(feature = "tungstenite")]
+37        let (stream, _) = tokio_tungstenite::connect_async_with_config::<Url>(
+38            url,
+39            Some(
+40                Config::default()
+41                    .max_message_size(None)
+42                    .max_frame_size(None),
+43            ),
+44            true,
+45        )
+46        .await?;
+47        #[cfg(feature = "tws")]
+48        let (stream, _) = tokio_websockets::ClientBuilder::new()
+49            .limits(Limits::unlimited())
+50            .uri(url.as_str())
+51            .unwrap() // Any valid URL is a valid URI.
+52            .connect()
+53            .await?;
+54
+55        Ok(Self(stream))
+56    }
+57
+58    pub(crate) async fn recv_json(&mut self) -> Result<Option<Event>> {
+59        const TIMEOUT: Duration = Duration::from_millis(500);
+60
+61        let ws_message = match timeout(TIMEOUT, self.0.next()).await {
+62            Ok(Some(Ok(v))) => Some(v),
+63            Ok(Some(Err(e))) => return Err(e.into()),
+64            Ok(None) | Err(_) => None,
+65        };
+66
+67        convert_ws_message(ws_message)
+68    }
+69
+70    pub(crate) async fn recv_json_no_timeout(&mut self) -> Result<Option<Event>> {
+71        convert_ws_message(self.0.try_next().await?)
+72    }
+73
+74    pub(crate) async fn send_json(&mut self, value: &Event) -> Result<()> {
+75        let res = crate::json::to_string(value);
+76        let res = res.map(Message::text);
+77        Ok(res.map_err(Error::from).map(|m| self.0.send(m))?.await?)
+78    }
+79}
+80
+81pub type Result<T> = std::result::Result<T, Error>;
+82
+83#[derive(Debug)]
+84pub enum Error {
+85    Json(JsonError),
+86
+87    /// The discord voice gateway does not support or offer zlib compression.
+88    /// As a result, only text messages are expected.
+89    UnexpectedBinaryMessage(Bytes),
+90
+91    #[cfg(feature = "tungstenite")]
+92    Ws(TungsteniteError),
+93    #[cfg(feature = "tws")]
+94    Ws(TwsError),
+95
+96    #[cfg(feature = "tungstenite")]
+97    WsClosed(Option<CloseFrame>),
+98    #[cfg(feature = "tws")]
+99    WsClosed(Option<CloseCode>),
+100}
+101
+102impl From<JsonError> for Error {
+103    fn from(e: JsonError) -> Error {
+104        Error::Json(e)
+105    }
+106}
+107
+108#[cfg(feature = "tungstenite")]
+109impl From<TungsteniteError> for Error {
+110    fn from(e: TungsteniteError) -> Error {
+111        Error::Ws(e)
+112    }
+113}
+114
+115#[cfg(feature = "tws")]
+116impl From<TwsError> for Error {
+117    fn from(e: TwsError) -> Self {
+118        Error::Ws(e)
+119    }
+120}
+121
+122#[inline]
+123pub(crate) fn convert_ws_message(message: Option<Message>) -> Result<Option<Event>> {
+124    #[cfg(feature = "tungstenite")]
+125    let text = match message {
+126        Some(Message::Text(ref payload)) => payload,
+127        Some(Message::Binary(bytes)) => {
+128            return Err(Error::UnexpectedBinaryMessage(bytes));
+129        },
+130        Some(Message::Close(Some(frame))) => {
+131            return Err(Error::WsClosed(Some(frame)));
+132        },
+133        // Ping/Pong message behaviour is internally handled by tungstenite.
+134        _ => return Ok(None),
+135    };
+136    #[cfg(feature = "tws")]
+137    let text = match message {
+138        Some(ref message) if message.is_text() =>
+139            if let Some(text) = message.as_text() {
+140                text
+141            } else {
+142                return Ok(None);
+143            },
+144        Some(message) if message.is_binary() => {
+145            return Err(Error::UnexpectedBinaryMessage(
+146                message.into_payload().into(),
+147            ));
+148        },
+149        Some(message) if message.is_close() => {
+150            return Err(Error::WsClosed(message.as_close().map(|(c, _)| c)));
+151        },
+152        // ping/pong; will also be internally handled by tokio-websockets.
+153        _ => return Ok(None),
+154    };
+155
+156    Ok(serde_json::from_str(text)
+157        .map_err(|e| {
+158            debug!("Unexpected JSON: {e}. Payload: {text}");
+159            e
+160        })
+161        .ok())
+162}
\ No newline at end of file diff --git a/next/static.files/COPYRIGHT-7fb11f4e.txt b/next/static.files/COPYRIGHT-7fb11f4e.txt new file mode 100644 index 0000000..752dab0 --- /dev/null +++ b/next/static.files/COPYRIGHT-7fb11f4e.txt @@ -0,0 +1,71 @@ +# REUSE-IgnoreStart + +These documentation pages include resources by third parties. This copyright +file applies only to those resources. The following third party resources are +included, and carry their own copyright notices and license terms: + +* Fira Sans (FiraSans-Regular.woff2, FiraSans-Medium.woff2): + + Copyright (c) 2014, Mozilla Foundation https://mozilla.org/ + with Reserved Font Name Fira Sans. + + Copyright (c) 2014, Telefonica S.A. + + Licensed under the SIL Open Font License, Version 1.1. + See FiraSans-LICENSE.txt. + +* rustdoc.css, main.js, and playpen.js: + + Copyright 2015 The Rust Developers. + Licensed under the Apache License, Version 2.0 (see LICENSE-APACHE.txt) or + the MIT license (LICENSE-MIT.txt) at your option. + +* normalize.css: + + Copyright (c) Nicolas Gallagher and Jonathan Neal. + Licensed under the MIT license (see LICENSE-MIT.txt). + +* Source Code Pro (SourceCodePro-Regular.ttf.woff2, + SourceCodePro-Semibold.ttf.woff2, SourceCodePro-It.ttf.woff2): + + Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), + with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark + of Adobe Systems Incorporated in the United States and/or other countries. + + Licensed under the SIL Open Font License, Version 1.1. + See SourceCodePro-LICENSE.txt. + +* Source Serif 4 (SourceSerif4-Regular.ttf.woff2, SourceSerif4-Bold.ttf.woff2, + SourceSerif4-It.ttf.woff2, SourceSerif4-Semibold.ttf.woff2): + + Copyright 2014-2021 Adobe (http://www.adobe.com/), with Reserved Font Name + 'Source'. All Rights Reserved. Source is a trademark of Adobe in the United + States and/or other countries. + + Licensed under the SIL Open Font License, Version 1.1. + See SourceSerif4-LICENSE.md. + +* Nanum Barun Gothic Font (NanumBarunGothic.woff2) + + Copyright 2010, NAVER Corporation (http://www.nhncorp.com) + with Reserved Font Name Nanum, Naver Nanum, NanumGothic, Naver NanumGothic, + NanumMyeongjo, Naver NanumMyeongjo, NanumBrush, Naver NanumBrush, NanumPen, + Naver NanumPen, Naver NanumGothicEco, NanumGothicEco, + Naver NanumMyeongjoEco, NanumMyeongjoEco, Naver NanumGothicLight, + NanumGothicLight, NanumBarunGothic, Naver NanumBarunGothic. + + https://hangeul.naver.com/2017/nanum + https://github.com/hiun/NanumBarunGothic + + Licensed under the SIL Open Font License, Version 1.1. + See NanumBarunGothic-LICENSE.txt. + +* Rust logos (rust-logo.svg, favicon.svg, favicon-32x32.png) + + Copyright 2025 Rust Foundation. + Licensed under the Creative Commons Attribution license (CC-BY). + https://rustfoundation.org/policy/rust-trademark-policy/ + +This copyright file is intended to be distributed with rustdoc output. + +# REUSE-IgnoreEnd diff --git a/next/static.files/FiraMono-Medium-86f75c8c.woff2 b/next/static.files/FiraMono-Medium-86f75c8c.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..610e9b2071ec1d6c47a7815010acb20f0abbdd98 GIT binary patch literal 64572 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ℜ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 literal 0 HcmV?d00001 diff --git a/next/static.files/FiraMono-Regular-87c26294.woff2 b/next/static.files/FiraMono-Regular-87c26294.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9fa44b7cc2d38680bc14df07ddf3f6b320740da5 GIT binary patch literal 64868 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 literal 0 HcmV?d00001 diff --git a/next/static.files/FiraSans-Italic-81dc35de.woff2 b/next/static.files/FiraSans-Italic-81dc35de.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..3f63664fee6ddf221f71a57461a7f4d1de281177 GIT binary patch literal 136300 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≫Z$OHx4eWbW1E?5o%p_ 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 S^KaC%*UN+?Bwk@=U;qHNWc059 literal 0 HcmV?d00001 diff --git a/next/static.files/FiraSans-LICENSE-05ab6dbd.txt b/next/static.files/FiraSans-LICENSE-05ab6dbd.txt new file mode 100644 index 0000000..d7e9c14 --- /dev/null +++ b/next/static.files/FiraSans-LICENSE-05ab6dbd.txt @@ -0,0 +1,98 @@ +// REUSE-IgnoreStart + +Digitized data copyright (c) 2012-2015, The Mozilla Foundation and Telefonica S.A. +with Reserved Font Name < Fira >, + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + +// REUSE-IgnoreEnd diff --git a/next/static.files/FiraSans-Medium-e1aa3f0a.woff2 b/next/static.files/FiraSans-Medium-e1aa3f0a.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..7a1e5fc548ef28137a32150b6aa50a568cd53d02 GIT binary patch literal 132780 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
uw_-ccleOTvRKe~q;A@dVCKH_r8Y@YUT; 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

0bKPVRdWOH@rq&fFb{-5%{$JvcBK_KkW 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%0DFddo!j?Fr6q>A`r>< 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 literal 0 HcmV?d00001 diff --git a/next/static.files/NanumBarunGothic-LICENSE-a37d393b.txt b/next/static.files/NanumBarunGothic-LICENSE-a37d393b.txt new file mode 100644 index 0000000..4b3edc2 --- /dev/null +++ b/next/static.files/NanumBarunGothic-LICENSE-a37d393b.txt @@ -0,0 +1,103 @@ +// REUSE-IgnoreStart + +Copyright (c) 2010, NAVER Corporation (https://www.navercorp.com/), + +with Reserved Font Name Nanum, Naver Nanum, NanumGothic, Naver NanumGothic, +NanumMyeongjo, Naver NanumMyeongjo, NanumBrush, Naver NanumBrush, NanumPen, +Naver NanumPen, Naver NanumGothicEco, NanumGothicEco, Naver NanumMyeongjoEco, +NanumMyeongjoEco, Naver NanumGothicLight, NanumGothicLight, NanumBarunGothic, +Naver NanumBarunGothic, NanumSquareRound, NanumBarunPen, MaruBuri + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + +// REUSE-IgnoreEnd diff --git a/next/static.files/SourceCodePro-It-fc8b9304.ttf.woff2 b/next/static.files/SourceCodePro-It-fc8b9304.ttf.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..462c34efcd9d6b70b42359ca1a1d9476efe43eeb GIT binary patch literal 44896 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

Ft|q|Npdl`S=v8-z47)#r}z2HojaZ zf3H_pt^C#U?CRE8vc)&|3RuY=Kkdg6z^x@_(QHxq^44+_$bd z>)yP*)VgEo(4V3FE*bvmu|K2xIHmtGT`}ibVcTbX+*^DwV%|jFZe5@_n>^sI>E5bv)ER0NAA3L>Vx;Y*jlDN%Rju_@^sPM z9YJend2sM1HRhd?S;2cO=z`PI))(C2xyDX897;uhi!btru&2-L(!RWQ&y4?e-OD<} zo&~ag=b zCUfmhe$;y7@_mc%sY}zvEWSTKGPUsbo5*i7J0mx{e+bul{e@@GLtDn8w}?Sajl zb?I6=zij_y|7}jQNaXRR=!@L9uC4q3)^Nw>e)EsJ?#|d!647KWIAgudykx&?xz`fU z|Gikx$02>TdQ-QJUMGj^5xtnn%tjS+ZdN{8P?opLwDrZ(2`V!rG~|8dxBU*S+nX-K za(Ew;i?y}Hgna*XQ4hXIAG%fAdd1@Wl+6cX-`o^4)_#3)Muo)R^$iJOOdoik9h>&; z*{)a5)Q=ZUSATQz$sdDF%KDpEZ@(LfxQQii*O?WQ+M|WezA`O#m0vM^rs*XEy_L+Cw{{slSkb`vis4)WC)aJo z!rRRAUV5M9`Wj>@wW^uD;GXGiv+@Y%Eqju-cKROj?0OKo>Oz!5oExvn+=L6@o6o*wW9Rjul#~VNWB(Q!Cms6~e#KogI$Lww?X*7P_ z!DCQ*-AUu+3r0uYXEVP%o#%4n?(QS^Ef#3DrQW>P7;xf6XyxvP&;?;n4o>SheW~wW zx!kYZ2dlZ+vmdSgyyfrniPN`x##ugS?!Moqa_QKS{QD1V8!jf;&DnP7W=`N%m9Nd0 zryL15JYyeYcHZey_c>PE&s=6xun5V^{}5-U#j}kg=Yed0m{%F+RJEyAQ>M*YkoQ;m zPix-BAm-aGcgp9pr`oqvpA8G%6wS6S?AQPF{)jLo|L|W2(=BwX4U}&RMGJp9SFH9r zVD{~-3{R7umTjxQR2xXH`>1DWA)I<`V*7?i4-@Vb#XUXr-0M;C?8bAo-a2o6Ts#l( z9^e10c((0onS(Wr#}x&9G?dO%EfK$8qxbEX+vH@;r3ZX9-V~S3jgI3|(AatHLXX_) zBi|p?>EFA*L;qp?%dDjrOAk%4YZlJT&$VES`~ElWa9r$>*~aHOCtK`R{OfbvwE2T-rlZC}>W#S6!ZlUWHSs2)=ZcN}FK+!*pw-dE9CPY= zTbyA9({G-vQ-`@lL!L)0zw&Hn;rx=D5(2yLKbUNq*4Fq zz4_}3rL-rW9`k)!GChJ6QDnsGC^ z9rM~`wBXGqpUB4Ym{llr*xdR1^GUD0`itH> zMekI)OX_ZDckvy#tAD6F;fSQifz+ekE*i5>#y##;(TcULb9W2&K6cgY-@f2!FH0-8 z%#k{^y*NTTK`ckT>671!l$8=@N#%c;XM3eRRX7=-a7EY9L38b*v+t}!cB>Tmc8A{2 zF1K7{R(fjH>#f$Zh77uEY?ZcrR9d8&wblOW)mu$D>&)6x8SiB{=E~>(XHD>Em@3=o zuhp)%Wd;)u_m%3M89B^TPE0s?J96EL(CF$E`HXwP)zezD*Yt0z zQBN)BGO^O|W^LSHe=L7Br@@o!yUTK$TB=*7*sjmt^X>n=-TPv~6rbFY%KT~9$$+#odQ$g76Pnil z`kcAuRn48%EH6%7YFd!XIPcuCz4pJdSkL~x*4=l=UN=$io$2B0uJug2@f+u}_VsQJ?_apc zO6G&%iTCcU$tSn7@bL>@xPE5-a$EBq%ktK}wuva4r6+76=WQ(RqV}ZIIB$_TUsv8L zt4;bGK1I%}8c#?i|H|K=*}i1Qa^_EAxoM#vBANcXeVK5y`%cxq1HaGDteEYP^*Hno z%e{3)XJgf`iN`gw9X`JMY~r^Img}pVzg<}HKmPigM3MJrT#lwHERw%`FIeoz_qPw1 z2N(x+tG`~m(tBsZ=Hpj)c}PjOxmW#~qnPXSQ0mC?cXd}DSL$!veKTq5ugY^82I1Cfl8@f%)OB4+n@gQJ@TsV+;7$RR?~y;tJ(ABPp)C&^F24s z3%av@y{pbg`TV=x>UY#aw!S%V`#;N%Kevl*55L`G%u&1lwnDdQTFB*qZ@D%HMOcB{O%glN20O^ z&;JTOF4H-O)5cMJv()d*?u6Q1XLS4I9@pxo{hVj0srP;5y0|5gu{Q!6b0#YG$N%J8 z9=JnX!7q06Ss4jCvH!N~{>I2`{JCAP5AHvMVi$~gD=u${^s;U5ppgtl#d%yvQbVAq!1?V2Yqa+Yk+Q~9RP z8D6NHxBQmCmdX#SnsX3faow9d9HU~&ah^p2{pLE(Aw54%2E;U;)q<6!8- zJ>^=oCH^T_;Y+z>r$?kB+qQa4QP0%!ka32~1I z$op1bGBNGzq3lUz+6lXpIoCGwi?CK1ZOfVeqkgtrDYIvDWV7`A=~5rn4$Zr_^xrYg zQ-14z|CD&i@+5Gl+JW~4n=_Nz_QqRwm96r2h@G)!=5O^Sded)NTTKf|(c)8CKZo_N z#3VDtzovZ|M;Xcu1rGAo+x;p|Z(_d8;pu*Ib!w*B^jQ-pzB~DMO=Mb_)s7{1jTY+P zHn%=o@eA$GzyogBkmc0^8@DUgEK?XFmU} zqrUg%U2U!QDb}8OU$^>Yk&V0V-LNk=6-2pDxcF%NjSF|mTy^P`04wj!T{YdOrmk%6I6t7la#FsmzkaZ>kE0^=mLaJEZt zBX=jE5t2U0D^GscrS!o^zi&JVSAMz|8?&4gZfsp_0|;-A@K)-84I^YssF=bEivASJKnJEKlaNq&7z zqEgtmNB!T9eD{d4=`K8T++e4~yz^aYj9*tCEU7G9XOqlrD!Jv%ORhK8mK6f8odh-< z(iSZ(o0vQQ^4@Ey?y=0X`Tkyc!~OYB`sOuTC$KMicWUd(Z&7D$s<(d@YCAV!WA^Xn zrsS>{=JPhpip(rN!C21}d-UUlDwX%&*6m`nmgAe?optbWa@-{qxvG2Wo4j^x{``?2LvIkG5dWA1!3B6k#zFfje^4OsY zryFNyyPe7DIV&UhL+a82mg3qY`wOgZmYfvVc{Tt3{@?vh_E&>Uy;GMQt*T#hYksZw z-SCe5xl-AUlLb!I7C1jPOaG(4UHwQ=qcIWltRqQH9_HBMF!f#k+@pF>v_lYGx z*LXbK>JS-W-1>Q5fT3%^ErsmJ5B?cZt9)-Yt($4NAzWHWXG_8D`qxu)vqZm$2-~cg zDSPRcm}6_o%5_&ZZ?}|l;C>oxJMWUl#!31PA50EzelqWwfXUjV`3jfZ@^AD%?9bV- z`IKT;)2-wC)-Bt%$c#G;x=1rdXYb07LQXvt2huso&m?EQvYrf1C}o;R$S^6=gH=>2;Q-!KJD?l(6e%9rfXEuN_Q8{^G#Y+i`ZXhMORx1U8(O- zzi%}4{-W3^m8=D;obpzer3f5s(Y~iwo?h&Cn!{73(d55-b`84&v+Yyu2 zt(P<29lkSBKv|8810Jo3ftkn$#h~NTil7RgXhdP zs#+Rdx%n)1a~$81nc?dXcy@**H~2;U`?XKYN&p3*GOnabF z!LBY+w#`89$#v&ci|{Stfxk4@EuX|4`R&@jefPGM`|f>p%Tq<|f;GEP#r)PD_F#i0 zh5@%HoqW1e{O=C={jrl0GD55-y)#moXLv9EcEG)$pVz{Rn4bQ>RNsx;9>Dr;CG4u2DT*L=H_Q-}ANIp+-y`Oosf9*2_j#8X#BdOli}7NqF8 zvTFkO53Lggd=n>re(F}fo?$_vj(>K>=Ht!U(N_w)41Qi$+3UyleRf8F!u*K5XPX1< zye!%#wztlj^d=qmRynUrl<;c{6!^km0&3w-Qai zC`&Q68MVIAp17p7J1pkopBL|Q*k)9#?R%*=X=$IH^^(3FpT&f3GL`N={Hc2Xhllfb z{OMw{RI2(EUGi#^)QiYzZ71044|(Wh6{S5-Zu_7c^z@Z%|C@cvA7nQjuJzoL7GgAAXTCNWbZX0}OEt3JM(8r=~l`o^q}=bWsx{X~|s>ZQtB zToTJxXWe@pFB7WYd}Kb8U<=oqhk=pT8jtN1oFmM2XSb z&%Ap7W)^q(wMTQb_h*U<3BOjcdEi(3WY%~0$>#q`mYdby^~^eKRk-4EViAYZ)^(ZQ zzsk=%XMVOZdA>N8BV)|>IbKCeGrykp?{r+oG4<8Yw=1+Y11yBQYJYz^8Z-C6>Iuh7 zZmBmFir>AwUGUAb!wCmULPf3L)G{y7U*!9+enTW*kg^;9u4$hIUS%8A&A+G@yWpO5 zai;L2!%TgG^DR%MZM=3XRAA=S)7jnL1*X3Hzo$NlHC#UHS8h4)qxf=`62Hf>`|bvG zu2y>|-yJJ?MoPGz;f>VI{X0%ci!q+beDmeoO;yt=lXtSJIZnv~j|8RR^_hov3%KCrUVdKPkAhRW6cePQzl$+?_qe-mx(g zYPLPUe3SM1SL^TZ7Wvp%WDCFF*{UXz(7HVS$_wEcSu(C~4J4vI*jTUS4pGg0d0^64 z!>*c>>Q*n8X67z1O7#CJu3uEi&9eNy&Zz|loOhMZ*%5iy()_+ApWTw!<9;))%zf}( zeBsvP-zJ1u1@am!UNwbp_V4K_Q=d<1ym$VJ_4Aej-3ePbRxJCgZZjcGGc)kuc|)zz zyT5{ray%d1)Kg6_dzD!JByi``mYKh1$v-=@U%%<~WiHKA*>`@`>6~}@+kNNo*(VFP zC!gki_oU+6y2Dc96OKN=R;nW*k?elje21ssUmvGv+pCQUHXSGTR552?I~Z2~>GYE8 zr3o zr)=KpEX-f6x$4u)N37ctJ3b$_{k?Vz@6l6DbLDJn6%?n&mVS}mYHVRS)4w+IL9Eim z=4JEGtm=64LcV=>yRg243M7JX6hPHa@w2^~8~-i~eu$73vQYUtZ=Z zS|s<+{9(KMg@+xN`8ma^*?+%Hc-t-TO2=B;=5%2tQ+WUWFRs(ht~+;lZ_~ag2Rng_ zh3k9v&i6ga^z5OXSd6LQOT|{TGY6*#v+rALW%yj<(`S)?0WW#k*9FQ&NQ+)y6C1iy zaFg8$&B*LO>RlfheiT@}&|1DqcmLa`<`eYG4yX9a&a?P)MdnA!m8E}H<>q#VI;~?e zpKHV~UA`~Q*w()+FFEq+o`5=yI)Allz23vENlfD37e*QUj<~(DI`#g9Yp0iaczjiy zdN$Wdqj`7oO4c)PvNj1#SFgozrTNXi%-B0aY8U^ioK(Bz zA9gmyf4H^$_w*GTPUOzG{B%=x%%o}UhDu`ML7!%u-kmoq)a=`KopVR{KN}USzgK&~ z^ljz)_jTriJ2rS5^g4rvGiXRn7ATK@6Ni@&K(Yfw;14hw!<{k#8O zX?Rx6D{(UQXVE@2+|Jt;) zwl!6ik-{6j1m-lVR`0)i>eZKptf}u0@BOX#=*Hq&cEN}({G~EhdxiIZS$KJO^5=v1 zHz?*m4B7o)$Fka$_hes38SIU3eDy80>c+aB9Xg+9e18%A*7K~r)!yxM{e|w_Nx5|U z@f%%*gj0)VY}fqkaC@HXm9{iI#dJ#dRK$#_G40KiXvIwIyX{bzXw%QR735D`W3|QIg$sF6@1mL8!0j zt{5JpMi0)%7EFN;r?dZV6WsE3Q}6e>;y+(nn58CJExbMbA!iQX)9tGl%2XcIJG5>y z*Q_&LFIlwAdmK)0yvDk+yL*1;?)>Y2LQXW!V|%e~?!^n<+@9-q^;{_rvv@1H#puqH zwv`6z|6=s^8Fjo?<-c#;eKxrEnbm`%7uijw8_GIlZr3@)$R)k#_>Jz>@0!h&t0&&f z+s@c?GH_e(iYER=1<_w`rXRcWOL&i~;Dj$}d3@KnSzX&y6mD9 zW_$hVeYy{3ryrWkxqi}(Bj4OMp45I^8I-s@OzcBMIj0lvCKrc=7gAHBd=1iUkH6%1 z3wpNhrk>QJnV;`{+}dgG=VthC)%mo1iSOB;7FufVS68;(tj7`ipx#0^|LUcPcV?Am zHyq#jJ#w$l#GDg<`OOoqe=|F4x-6%*Aobc;)3Y-h_OAb3dq~;kl}6>KdW&Zbzc} zZk(kW;5_}r>a$Z1uRC>pz5Mrp()J+6>nElN=2YZxsIK8!-Xt$_Th^_ze9P_)Nnh7b zT+8M=zu2QVKkMX{b9p_dmwS4D-_%^CyU+FM+nJu%Fntp8V35%6GW`{NUy*~Ycw@cx%dp(D@Et9Ei z)d91ai}p@BcJBY@KU}P9Catcu;x#TaJfcxDLH{ne1KX zc(ztk_42N5eeM25agnt}M{PePt?u1E_k`Wu+Fg&>ZxuDF`o`!!_3~~yY|XCp(ebDJ z8Sj;*wT$NFGj;agZ`s;&M)GTM_>m{yB)@&0-1I8+V_^o{re(=proSxQy+3s}7*zFn z-SJ+;m;Ttir)2t?^262t|5{(%(#LhTw)dE5)YTa=f>Smai+?iZD?jz#k!ka_>r1TV zp46rCH_z``rjfmK`P+Q||DWBA`AW|HejrzC7tdFCw4d$gu^mFc|1P!T%U><+Z2U4q z_TAYP(vB0KOpr+7t@*NZ)t>wRq3+%wq`Fa6!&-q)C8i3Mj@^c$#En9sRa zqZQOr@u}hDJHuB?!jG!W-?&^RX@#Cnjq0Sf8(#Bud-(icJ8YMke(i10mZ#<(OP$5n z%3(b2mz~_4OX~h<<fQ6(1iDQq&v$G-~ZOcqB4)KV&`qq)$V)ps_$$+ZZk)=D^%I;#3DYWTML)9 zE(?3DVB@jlz?`kTrS-2i9ci_4%Ddwu<5}kWWY4>M5j^|T=gGdhXdD-`r(B_Ks;}-_ z?dLf+qHly8d*7uaYcPGu!{ck2pV`VpC+Vx}US*exl@u{j+c{Zsp)sObfKXf=N zR%Yn(IW5czKC0TjeBZCn*5|)pzIS3-?b#~VuakJBwnP_+7genH znY;Xxbi#==q2Ft7PFVeGZ>yx%?nN^vWapfk^0n9S%A}x^{GI`4bb_CT2p^rgI)35~ z=68W_7j9X4x$4A>6>3>GGs_C*pWS|D-|=LJ^eMk0jP~y}>g72g^{MLc*IDkuJjYmK zrDk7ykmZ_wpwrbt< zY{h1u$D5^QoH%OW@*>0L$;p2nijkH|!LL|9zCY0Ht|HX!b9L1mja6EC*S1CU=<#>$ ze|$Xf&i0$T;7m4)w(#}s!V&?A1!2eS4P-mALo9gJ2g?zsCj|Ioz9kiM?N8@v=wKWGpy z*)d1`lL*fxR-x~EIUgZtK@Hy?ZAtf9-pk!qQvQA` zQu_TCcEs-}{CrSfUbFQ6DXkf=USH|XyQDcqqV*^5;zydNA2G$RlloDZE^BFST)DhF z{f}9J(ur?x*6(R!cpa=#bEvXW`OuP>`dO;lJM}!)2mUzZH1n8YeqjJd4%ZL4?Vjs9 zkELoYzMXn;<>IrO+%q40`8%5CH?7<)niHKKAIkVkdxp)q-1X*p`xvj8N4#5}zs4~% z^x)*cX;CcR1v}s57FfI&NOjC#0o3@|wV2rbj;W{b$U@5EBk8ccb zcYl%o;322Cx#gf|?OT^Un|0Z3=S)wHU3fcT^Z9h6%I=#_zR&bq@xUwcG)KYR1b+Qn zhZ`d5vp!zAe^p)FzqxWz>UQ(y;Qd$Tb!Tm>TVfi=A@^dx(4A}@nZ7+ztU~-=tc}l4 z^~))IS;|%Rw4~VDWMK|xw@7;QP|Bvebv)r!ie`r)5 zC!sRQdtO#=j^z7-B^Ia6j5}AcFjw>lU4Q*eYQvNH@hSh=PZlIp?-S^-uW%|;y0!kb z--eZwwj?bwR{JyGJ z>cr23vvmC?a_Z}R?TW8^v@+4~e)@*JyXUPh;`Vi0@gbP)mehlewtlM+o((O*oW=L; z=dUxieBSu(cSqhn%Z!$#mixC(UUpGUE^g7SZ$4YUN_PD3NlLbw*5F-warV2U;B%gm zHgnG}n_RqM-@I*`{_SA-`?W8(lSw&9ocZ7N*C$q-zA0hp{bEIY-Lm?`*TUhyHt3!& zf4bRH;evSb{ym4a<5Nph@22f!`1#=H{gZw_RqXG77CZ6RPDp_om^8`etSz2B`b#!f$AmUsK%iC@c{H4@70BDO0z{dQP%`tvVV z_f>XVe#PepzI<78awdPdHh<|Sp&BQpnHh#V`n_$MqCPn6WRWQNr~2Lc;>Z35*IIkm ziLX@mvbJX)+536_=H^SeuT~~RZ8qLp(s+{BMKbJbg~8f;GsCuBXyV9W-W9MsrBzMc zSUXMj0-N=>bEkdJ&%2s=mDr(90EH!;vEUS-8k;XP^TZa0}u-}*OW5$DVM2cs;XEbmHfd6~F) zPSy142TH8X97>zF1Wr|2xLwh2?yktSUa!`!c%1IJ=V)u>uis}lgz^g)FZ&nwc~05C z+ozV*wV9py(yejM$!%%y4+F`UWvceQ&i5P>c7`^a_)Kk8ER>k(q$^c=nJtMiFXh_g zZ%QFIpYLkS`Fmpb#GVC8Yj<&cnPOP9bm0O%Sk4A45rUgb!+c> zAD(|Aes_%0`D2qCt)|{OGQFyBd5T<;jnepQb_OmAgzutTEYGJD9 zJAt2z`&12!LMLBrHPu_~$bTT}SXw}5Tea@9$WFi0?+#s>YSVgnz2dfg0&Wv4x#KQW zbfj80Jt|xBE$M=s@0E0!K(*pmp&wb_PEM?BXgIws)x!Lr{Uyf9)7KZhY1?8}@Y`Fb zzeHYEP%q=&bnrZ78S3mlHoMNMX2l*L3bL7;TEYmAa*Td{94J-bN-aB{RKK{qM)K0NlJ$U;dyEu}6*%S}zv@OP9zruEY!<{JFL-}omNeXC$%UgpeO8WU6h z@8H+he^oB7%w6z2VBWn8cXi4OSJ($~e!lVMdH<%S|L^l(OXQZ@Z;-61S94HW{=U-2 zG5N~o45!0Vo%XGN*3bUnP`}mVXQTP|{=X_E%KM+o2WW8bPuiRIod4?A+FfmSkKY;G zX}C7E+5Q}hhwJ|ZrH!W}&Lw^`RrTuY)=a#-}EmdW$#?gh*|@8l79cCu&XiR%v@I-gtigqiEAcJ!JF zl~1Q+{8Ibz&S%3B1z}qymp|dI0Y7!5eoE%YUGxqp=sWbPafRviWqa=YQx3A$^gVlI zvx!`Dt-7{)ryZ-_>zAxs+Op+bkA>e^asS2(-H&aHWflbe-(|I3hA=iGg1*#p53 ze^{cTy#L6=uU@HI%O;oP^Y`YF?W^2mJI`Asich#|#$Un9uF!E*#k<{vOSC7VXOmCB z=8mG-JzYngq?UHHb-5~iSbYBf*Uhiwy}xePI52BXn1#4t_tGcIV)lFrI*kDuS4@t_ zoU%=Rpg%)6vqF59?;^bnrTcHEE3eIbqWx-G(3xZPFKhVPe->P7cGz`hG1F?1o6Y=- zuFLB>wKg5lO7LxHR)2B+{R8GVTc`g0Rw_05r=4%|n$0G<_MP1@+C)>W9L z)K$Fkopx0yRn5O){sRTB$$$UIPZK>=WmRu|)%|#y+}h1wd-f!=w{Mt#{OV+1&q%<)Em`$kLa-#mC{@><;ON(AdmjyeStY8e@epG~OtNOD( zr6>7)!D{i`4ci*!n-@;lr>YuWcxr!8T!c!I+!FWBqrYz+SstLSwRl!Tw6lPG+nZN8 zK1-LpJ0c?ZJSximgZ_!xYa*R0F1XBOaa2F%wJSo6qiI&IPUol3!r7Ue%M2S9P0*V< z;dF0*(Z}FL@&ZRKw$64|-*$H97Zb*k>W<(aa=odmZB@)?OT7PE{^!>FuX{|D5Aw?L zF7$ga!7hAA7ucJ>orrk)noSK}a`E`NoJyzByD@&H#h{>68qq1N!|HN(Ls>{wM z9af4Hn3JjhrZMt$P4JNi5)~IT`?DY334ax%!}asOUHE}HY~}M7usxMoBV+mC_k>_K ztB&%D&)?pk%wDifw}nY%kN4#zxHfqSB(yTK7U%m+5EA{;mpekpW46lb#~g_ zd;bghPi*CODbmghwe0*p_0QR=Nz*&}{XgD+^wF<4`zh1Dz)z79?@cBKt`R9@KQh1Z z`K?wZ(U1>49a>Y~+rO@}ZTg5-@{_o7t&6md>ogSPU4z+@NLW6TOmPp@|!30 zakRY6`4+XxMInaen83=N3^D(%S?%&`o*_`Gw=Br)o_}_!*37D&xT7VfcGer8OxM5s zzPyLUmE+Klqp8^^9Mx{{WET}~owKVc@8^vAQ?H-)|GagHf6>*iU#5Q1`|7{y&rLm{ zliq(XWcz8(-{)U%zg>*&kjS^o3|R@@5xQSvxaWQ}kvlET%kiUVeT;r(OJ3!26Q5U^ zD;~3Mis@8Z#GuOSH0?EOkbg|HOp~cjzQny-TTia#7ZnopS^8wz;|1#!Gja|-ep~QQ zG9dB5#(z=XUNY;0&bIjDkj>f8Q3Ge56T5qXmx|LxV+*1()= z{p;`D;y+;@v1Q7>RkI4u%z1Au;uQ1n*;3XgFN3f2?JMz{I={qsdGPIN`u$on|38gk zXEA*!X)4;Zdtap&yCd(PNWH|J&({ZN`dvD*xaiieY1(skK3i})@A@*~PvSR}&i;I9 zq-Jqh@ANK#)Jv29=7(%I-RRMua3z0F8t-KBPv=^S<5qMh2A-T>5zlsKzs6PHDX)v~ zxhcP2kfL$%Q@`!>Pke3XcjUb|Uexu~G>NHBC**=fpex(Ew`X3K)~%4ql#UAj` zRzk8)bH}!(wdXIb6*%_Tq$)3>Z<0s+`pR>cU$1C6v_8r%G_;5J%<54HnYe5mxC^yY-j4)5g-U4}~c z6-BB=vNpH87x3J}l`1?#xA?Z<3jVttch>W__3F)>(tqmN{h8WZv!-VBtW(tGRbKbc zeWCC_OR>`vwfB8Z>3@4u=xpTcv&OrkW?G#}b9iB7#GIT_n0j%|!y1;IGcQ=%-pT4( z5!UvrgnNx${tiZ^xwk3=0-K6iw)>0E(pE6=zh{5BUgqVDm-AOmWcBIqeY|M9vQpi; zZ>sFP|4+%?DPVeOan;^gj@8Q|c*mMUM)v3LE45~YmQ_rZaO6o*+TU!~ z?Y}cI^}%r|v4;|`#qR{n_tJOoJ0Ya6b>@(mg5kwT@qYU--HS)fEtHNj&rY4NLeur+ zGA2K@@Av(!15+X&gkPVw*0|PFZ%WB6{$o?Zo?bBPUS4j0zcsEe-S&Cl{`2ea*uSjb zvoR#z?ftV$Rs~;J7SBIDw{pjeiC1f7{kKK>dAEkYV&Amm{bXy4FXzI)8%z^TpJe^+ zUtZ;&;Ejv{ZXsJ7!mBQ>31M71%kllJsTu-;vbU~6I`}hJS;d0Or@Bt*t+DoB zxw5LHpk2qJs69$c@q^8lmxYF3Kjtp{xBco{yO=uGRWs+XE-zU7qpbB$nac@lVS{-y z7c@%Q{QLDOJS6dQ@T0)6ILlQxH7-tBSm}^wv*ulZb5FChFxN$mbrR{fh5o6S860W7 zv&ufaN?L6n18Z2?cAmM*BADN9d%ur8vgxa;-X~Ruk{~O!x`Ur;O7ukjhR6M0uX3t% zThUqV*2q&Tfti`Xc08>2+HF6}P1^swSv)mt`tgTbO15W~D#bN$R}llwc?zdSLWEpvbMoxdU9 z?;f1P5dSB^Z6D7b-PNyorapVsy;|A7R7A4-W3E<>H2bBa72huRFxD8W{V`l^zI@iY z*D*Jw47NzJubO9`Dz&|N&C#6&Wru!gSe+04(WR^KCG}kIx_ci@TA$ABpY~fj_~WVC zYn^u76WFC+#vY1Zz4hw8nv3SyrFSN0ovKa$@?JhIr1HGfJ$tX||5u%v{n2UhRM#y| z9P6H&i|W+hV7OOQzgqFn-wk&T-WK^-7jn?9_|LO5YZq^^?G=3QE|T$2(M0Y0POf`i z|G!kUOBq^}nLPHKp7r>Qo5B2|`s{k{kj8DiTazgbraf#`p=^xefN2)gKraJ6uc^&<$uDW~i8~*<*>y_q2 zF129iWoZ8AzKScuG3m#}4~=)3jkZj>(;xek_vd?UhlKL|B~zL2MVLsk-&k*Fc6Pp< zenn+S-`;53md4a2)z`dZw>|Ov@5bT(E5Yea{FVH;*=8StD?EeGoA~id>1JHNF8;8? zd(NB_e#_gu*LXbs%B$k;ecqhk>({O8#nnLto)z;GMvHk#Lb8AwOtJQ9Cm3PaBo;J$L-*P zj&Hn?1}aPbv1O<~`L8iE_k!Mr4=ouD(_R+;=gjfn+Ozu5&8Zqkmxez*<674JpJCw? zgMir_xaz{-xvt~YgE{3-CX>r)ofB-QgShTXxZ-rX#WOY_jEQ7X({5&Jjb)vqYaAGIx?HlA(K6c$ca zj6JG!h3mKL!hqWM^9+7oP%^jA{l5WLrf6cy}>%blh zb)~7YT{C+QZJlq~cxOv-y@~6VDcd)hZaL95nf0xIP35(1d)ZA&q>6>!#!7$dDpJk* z)PCVet;5XN-WzWM-|?Ngu0Hk5wjB?r_?kV+3S58bnU3?BnR~C6AHT3La!GdZ={kw$==dW1T@<6PEar>`t`SMr&Gx{4Wm2O$hTOW4o(e+a|{?~};6qhUi zI}s*2*)kR|dCl3#4|{$JuPdMA>FOFE_9koc&QC0QxANLneJB!KU==d`LClFitv5F>+8o9{ z#d`j%*cp*Qz0A*zy>CV?D3s`8Nps!YHEjbMga7j#HW!r`cQ_l*^y>6icy{^uL#fA# zYRVDbwx&rwsZw}RrgKb0P=J8gY+H`DGN zH`yoI=blr4aboYvud|oUEzVkL=*O}oaR-0jXY;kzJ2Gwm-TLfEmmR&wM zOSx#Rn$~(3o?cf`g_W-^9OtoNO>dfAd%0?J?kw5lw|Cbt#d&9QKhQYspwXeD^W$NA zjdXCqrFS2$$ed!FxODotFV$-p**WjNWsl|+kgWe<{J*F!SlG(?$Wo~W{iD5HdXBD- zz9mIEzf?UvO}I>J!}MF$`IVd&pYBCeJkDaAl&+PVEd1!zL8DX$Exwhej}&H2)!Kh$ zO<=dPRm0>azlaMT6E1WIH1sM9nsE7g<#{-7IJ6++O6Jjn0&KF1;z^$sJ6rg}8THcY4xuu@%fo~FTy>Hu9?;KZnTKG_2l?9nJF4;x^pdl zy||G6=-c^&Vmg|SZoblXGxIQeaMa@4nv<`eMN8T1zPMSn^^;n*szqP9{XwO2>zA9V zoXRKLR98jsz2QH}@WY22ia}dj?y}NX z9L?7(g{==P`^e#H{H(|7%vROr7%t5lC*Hcha8h)7|J-a+lgL+vmB(aCEe!oPx4wR& z)pdIBK2G-kncu~}uMXO06ZmXvpv8^@?8ge-3g=8bdz+ zQ}x1+M>bY|%Sm>5_2mE?Onf^FJM{pYch+9uX6X;)h3)7IGU z+0S#;WB)Cl8`Iuxnt7aWL5M?EbF@fu|4OAS7Qrq5jqPu#OfqdU#k1H^M2)ocWdLH%{hAUTmPTE z89OJgU2ARg1eN<#0in--_<9zb?OwtM{2MTxKH`o3-I=%5z=a z7^`htHt1!~mNZbD=$pBxC&*p3nHyAop#&4{IOM-%Vq_ss@YO^1^%~vH2x*e zvyW*Hqmo(kIcpuIvkaUUFYm~_AM4qBJy3gs`@n+urr>E8=ZC-8R z%YXLxCjFc~9v2fS(Ii$G|Ih#}-j!P~1q3V#YE#)XAxxLMb;;JwrFS3RWxf28$#*&H z#&7(Q2FDj1z11JFz#_YPt%6_}|30BrPW+a=Y^`tBg>@bF(z#~G^6}B+yQf>TX>t?kzdwuVi?$KP&PI-M_1;xzV zq@ZOPYDv$cytHZWAA7+WeHxVx=4QqU^>;GLE`B zuJ=s&6m*UGL2duZy<(FY?74ZSm)u%uCNO!5blG}V2Mdck;(HX%ua*~#eZjl@`vdLM zcc-4Of65(k_uZbp9fBqQ(oHg1)gG|jH?tDbW{LFJT5&aI(fKmb9+n-qR-QX!+U+c# zmhB?hY`CxO?mGqxc8&tM-$#5xTbzZ1SH3rs+%)B?+mX%BZ%ZawKB{D7e>sQQAWv-F z-6K1z+vkZ*b8~qZva#ry;LS4ObquBtx~?3_p40VdeuYeq<+VL#+3$We+*kd#@NvQ2 z&GGrG1AbY3ynR7CH@DDJ`qbs+1q@cK`fI&>&Shq1A8$OYH2sn)v)_;H+E(+Qub$GI z(yBV=^gF8})&}kACvPR&_Q{ocy!olIaLdH(xd8|KJ+1e*OtSvB{$TTh=Jk~l+D~_Q zy?YTj^Z!CKfmwT&+Ho3i9*J3aRAK*tCwF8XPkq;w)Hv(&#Wn{2{@G7D)X(3zW5(ui zcTIiY<)qYUg*X1ob-Y<4w9#>4SBT%Tb!vkDmHLGFr^Ozx>rprC{JQ?}$)beiht6dw z{C^Z;LXN=`S@UV4Bt02c3JL zv^ldVEK@i6{d!+(+|(2I{(rn3Kl$&a&IHbTTc=M6nZd9#zGK~lLmS*GI{tn&KKm(t zNzU94!TH<#6snS6@duRr`H>yw$M&H7Yj~eAYZG_tX0xQb(|8$b9J51jMtt0}me(X+ zVfTf$=**_+VT}sM%s*-W7kXszEBuA<&J`<9PEdEaD*5)>@bZW-4$JdjOz2Q|l$!lPd%53W22-bo)7Uufh zOn+t-Rg2#ce|Te8*&B_G!WR8iBB3pbJ>^P^CGt6yAC#~D?N`al=JQSO#hU2HrQs9m zw_D%Jba;76X7+)D`xl?SjrRdMkPU&auOKI{xzsuHe zPI*(f`tPM_4m+k?t~BvkYSEx=Z`ApG^X_@vp^dx&)Bm+df8*+1N@i=u z`F-By_1F-EGHJJYsGXMyq73 zmjAxx#pGV!wx;zF`Tj;s+9vwH3h#^WHN3dv&=0#Gv&}6h9(eR})e@fP6N7f=C$4^- zw(b3lgdL{$51G~NTAFU0VN<%+lf_4f8b%PF}wErYNMF>7FX4(=Vk5W zzx8w0UcVr|jbEOZ>MYw+_V&E5UC{iNZI=?4e91LJyzd$zjTT<#MSCOv%eMa@-~@rK;d37oaTv)o?qTK{8ZeQf^6Pn)l@@~zXj zBCT-w@6PqRZ_EzP)cdh=Kaa-US(ER67R`9BeOzhD{pnYJp1NGDcdbOB0TRxWi_UrJ#Nm>o>Yge)Eu-wCKB44!N z?KvT3vChwn1lFBV)L`3cvD4#AkpCyeOpOBD(oGfzANxu*Nvyl0n|Uxcr{U-%?X$(v zp^4isE{r-l{S#Z*J)gg-k$+czY%=~nmwR5^jZFu&v!%ADKE1ik%%Ly1-)c>&jb;1w zi=ENai`VYss_1%jH|qbKhJw|OjjuU<3d~;ZpA_~jo~`G>UjOYoqx~&}qdE66ZD#Ju za*q~#C6wJ76P304{>H4|iOZzJ>el@(;hcQwk8fzq(}VeooZciRtY7@#Z>M?ov*bft z_4dEI-?6Sodc(z5g{=>s*u?);Us`%7!2W^EhN=4=*XRD7_2tg_^OjW?gnd_s3wT`n zV)rBELZaVR8^wcL3U^%=e#&%U$IP?Z?>pG-W^dWKrMcIQuRO9p&ZOw|x@-CzGV^|H zG2&ZL@u0zT{;3!S*JkBM5;@5mMRK++I+yul;@e$LvzM=0ARHB}Xm!=fJyj6Y=U{U!lp$QPA@gXG$XWC=00PYk+({wBY4&3*{nx1(^Wn?*zUW@ zywT53v7j`uPJG=}^W8$-I|2>fs+(xGQ&wWwiyYa(P;kr#FOFHIU&|1Y9e}yM! zY}TUZ^NZMiy_Vd!X8EHZ6IzU? z)mU3zyl8mm!@ap`sm@QIJ(YVoO-i_Pdgk+`@8+2^-dri5^Cu|NYW_*d@5K)cows(l z=PGn6?mTj<)bemtt6Y6g+uD{BS?&q5*o9VkUH*AyZyq!6Vwq2Ga*BNKe}4A4*5B){ zyNmXDu1i_#W^_4upXDy>nxHpd^in5FW$4uqp(&qKzy4*G`hHh#-+y=R$lj$ zCw;1wl9xT2d7%4o*|~H1uBjg;y9tszutdUvCX>S(%0O@n+reO zdhuPP;p0)Y6usEzWgA#n*ci?%V9!eVs+IXzAZ-VKLF&24fh zX-a$k%7#n*Gd%X(twcwmDEvbFrHi?kRHU$QbO|dSlOY zp`O{(UQbT%JF0U0QQ30gvx0F#*Pm>tol;>{d1lU&8}6MZ?=~b%=UBz3XnRV+rS@R< z@jmqkj{8xvnzr#`)-~F%SFQS+btrq=a@YUW&CQ94xu^FWJn-k@qDf3OzKI`~++`Mh zVBqNMHdFWYk+_ZoOW*9DtBTGqZSIGHe6{{}XC=&uoMO8}qE6|r z^;zTGfVb|)Q|@QZ%WKOzH;-K<;pxOXd_TJDubke${v)$KcM<2^+w+;9bnnrzuxre1 zRJGRUV|Z3_vL^rjoAmmZ?RB!Mz1*}CbW)ZRH_dwIeZ$4M7!DE{i%*Cm{?;{^J5a-}!O}zde-A z*W6f8y z_^wTO>y;qyw?Q7qTfCi*eqDX<0l(<^7pvz_&9FMu$}}%HIK<&CL+r1P8ejdaB##Mm z_N9mIpRLlg+h$%wzUrx6CNn*~C%o5LS(Gi{`KItBvevy zMSLCgmC0}dycSn2G&h#&vt}l4EvS@|jtpxQ8?)Iu|CxbaQJ~^3Th( zzU-q5C%@P{;rW_8rR+=%hcir*ce}(j9;uu0VcN|ddn9dL{k>uWUz}omI=86AAo=#& zdenm?C<|UU*?eg|rPMG~bdp+m0qtj+D z5cS`G`OCza>uOuid49NCUU;P?!f=C7U(Iw!{iPfs5lJ0M7rL@$d7Nvo`z4t$!DjJ< zV~tD;3k{mZ(%QG?HT`uGY1?z#Cj7v$3#Tt^KCpe3T9@FUH)z})kNE2S;54%btTUW3uaY@b-lkQ zd%@kFnP<}S100Jde4235@XVtf;wJ01RNN@NQ@ddLLh(j<>CR1^$Qos+_2#FwvTNB^wYXtKAf5x%f>C)dW=Uum-S~Q!aiOo9e)j!So zecT2A1Mf8+m*+EIgxR&kbAhIK+Z~>$8M4=`Ecmtt$mN__c(-`6=8nB@Hst5LV>+T^ zu+#fVZd2nVi+P86&s`R|BGwh;w*R|sPWEA=Rm+lhmNDN>yvVmj_#I2?&-f8oedpN@6cUT>DKnQuGo(&|qF@lPEcdRG|U zShC~Ov-BS(zkB1m8^ZROy{%J!5n=uG=#uUg(EB!J`?BEV9 zR@EQXPXm`u(Rti>mSeGGbNRV_=aoM{a#FX>klUKQ?f&;=Dya60$GOyOGYgM&tKtjtIrJ+4}<-e3+*Gk7P=D{B?m$!>17T z)f~+y75>a+W~?%&IV8;8f-bD^Y^%QVo;BBSMZE0h*+z`BmVdKsb?RMxXI{LzdqVY|N0p}vw_n+H za-v)1;al8)BrZj5{nf;DY0adwYi2WW3*NDv{-(fVR^Z~e1+IOQoy0cs9Pto6HD&ek z1!pEm$#Smo-+iHR?fu^7m$&9edGDBY>0tNzO;Krw8V){+QGA@ZPNj*NU+}|Hv62}R z@T0K%gTbTbBeh>ulAJY7Kthe6jNxl zTXrkWbwWvLfb)elT1C2(UI{3in6OMGaDwO^mX#rS8NOC?n%+#{+#8ee(o-~H9h>ea zImUahH#AOm-mx)2D8k+#t-RzyZsRuX@a0R|ejZsBbe&stpY79|;dMWEyv>;Ue4_aF zL!Sg@&oXjb$$YJLTJ}WF2Hp#WJBuP$X+_RfZpp|`U%(k-x^o{x(0s8AvmdB0beb9T zRb)!y>eYqaQ(hO=F6DpHd+}uF*NV%MQ+LI!*ucD5>)Y$d*o>R1AsUbs4_@;G`7 zOm#aSU0Bz&WM0vh2g2H7j!z!EwlMp0H%e&Pe2=3SS9!I1T{XXQX4eB1=_!_rrbR@? zc||SRkiJleF=@_`+=M4F_1poCp&S>NPnDNWY6+P-Q);41;jExU%~!5D{EGD%;csOv zw=7tgRlAVy)Ycb~ejM*bde#K$i+){rIU}zms`~4l#!Ih{AFrFSSKiS1;qJS)F0XXj zX7En!oZS63m&q~Ziwdg$v%fySY)Zz;l^2p8&%V0<%|Q>dyQ%MLGq~Px$aAYl@_aD4 zVRXW5Yn-{L+MR%va>5EvpQ(K@EmZ92mFj}{tb;XsdJ5-+@ zn|n-U(xR1enj*^uMYqN6ZQ$)~mHDB_w%+i`69u<7_HX6;%@1D-XA`7wgv zc3yCOx#UTS#?#}D{;${Cv`jpbYi}5SJ#LxA@?M!mCq>_Ld2i42F_jI9+AR3D+UfwS zq2DIQ361+%L!};-7ntpj6QGflS-TG-o$oc&F%cX0#T^3gVp;~k9FWZ+e zxAWZp`0BprZGEu%gVaQZ@W)rC?CkeH_J-xV%F0XkwD;@pd7p7uH!{_Fw@u{#MP=vD zb>F}LdCOCl^9Q(oiEWs*Z}P>wgWex__p06CyT9ydgL$`hYDQGLq+x`|q_F7LTeG*V zSTf1%@F9iQIg)u%wa5N8EPv>)F?ZsvxSvOiG;DiqQaUb{I;_~wAym~Z=u)P9I4$tK zLR4qR#wD+(Z(Z@B@2#4zlv^C*NwJ43cLznRbywb<`P1z2iDUNHOj z^>dmx-QK?Ev@&nhEw}uxR=(+a#rv!`8*R(3pER8I;OfF9v%JOAGQUdxs%U-_`R?t% z@26ze6n*iIRbQ|z|3K~Ugzfx05@KfmKWmz;q5C84>fMO`Yqh(t-mcYSZlIA-i$4;-KQx%(`rpB%Z5MG?7RMVr}sa#kC||R;accj-KvaA z(Z}!W3+mUsDO8hTOn9*R-+zXZ;zPZWH5(@#d-L>O?aR3*ZQV}n%QjlKfYJJlQj3_J z^hA&8wia$4&K9wlwE zn%lGc*ftiwP&2kW?UnNzKQ7M+-^2AkaqimymOE8m7hj*;Y~=H>>QHRj3IDXL1)Th^ zYOLybW(oxQNIyFg(BpM%t^U@YoFj{WY@RV^jl(PRCBBmuEnjmkIlC@sT{hv^ao6B}j*F{0_ z%)N56-pO23HA7d1te2Mx-F`a#?IYXVt}81pEjbltrOf^Q+3K)4mygwb`jl{Z-u{|< zYrb|}Pz_yLe=aLTT{39O*GrQB4BP&YuDG4*Iz8(enl#6_2S33LNuo@xKQ1j zHg%?$+T`w--nMJv{4WddU*Y~}IHPb^pOHd9;>%ecXFP54%3mbhFr29HdYRcVzC|q@ z`+c*&e5euK z(!M3ZMKQW+TFdwjsjS%T>vqP-g#>4_TsF# zR9)Vo8&7vEyyp7q=yoPCosiC5%szh2CpkH0{JMDm%�a#*^;HuA9amThQz2(CEmZ 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 TB%f)pzl=#-!7A{Uhk*eA76{#B literal 0 HcmV?d00001 diff --git a/next/static.files/SourceCodePro-LICENSE-67f54ca7.txt b/next/static.files/SourceCodePro-LICENSE-67f54ca7.txt new file mode 100644 index 0000000..0d2941e --- /dev/null +++ b/next/static.files/SourceCodePro-LICENSE-67f54ca7.txt @@ -0,0 +1,97 @@ +// REUSE-IgnoreStart + +Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. + +This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + +// REUSE-IgnoreEnd diff --git a/next/static.files/SourceCodePro-Regular-8badfe75.ttf.woff2 b/next/static.files/SourceCodePro-Regular-8badfe75.ttf.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..10b558e0b69a74b8329766fffbd5f64356c7230d GIT binary patch literal 52228 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 D0=ucW literal 0 HcmV?d00001 diff --git a/next/static.files/SourceSerif4-Bold-6d4fd4c0.ttf.woff2 b/next/static.files/SourceSerif4-Bold-6d4fd4c0.ttf.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..181a07f63bef8f18e42a5a57463e0e60cf8e8035 GIT binary patch literal 81540 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Πywlj)~j=DEuKF}xxI2>fYel$zZW*w=oUFnetB>DqZPj|X|3N7{Bq@)OLmj31sXq5qioe@VO+A#{^?sp7a8U}+k=Khm;?^9zz;$86;=hc+oqtwe zFBKII^8e6MdbmYTBv0I8-kS3w_G_cdJ3ag-9Im=HUClh`>+6Y0r=7gq47N6^m3@1! zA+kPCMr=-!`ISWH6;t?Mt>pe+bY+slB4;z{!PyPtB%2Jg)bN<>vM&VsL zijz}>V4KOdxk4d;9G|lXu&-sVCSMT;zPOiT$a66?*`t`bw3zmo0gl68^Cpyo= zR?qTEtDR_!U+`@yh(tc_KC=lEn6=FOd= zyZ6-gjc+GL-PZV0Yjo9*bu!JvNQJ7g@5ha8eJc?;(S$y8~48FwvlYn-)Cnw zHeKP-Yks;yW$7H3(uA$eQ+98hs(*jN$^I*wBmZyEVSGQ^v%CE5X|?$QaxooGX8r5c zmONtrSF-C+-Fq7`m!5NX_O*L;_;fi4d%0Ad=bgM)#I_#NqEzhPN)i2wwho&aL&weig5& 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%0A}qZhlcf*otJ#V!-rc$}&h@v< zpS~u`t(@;~n(EtntMSfW6Qx&ge(S_CQU8*ePTB5mHfqbe-*Re)Rx798kNNj$wRVKj z6ya)*(#LaJ^1LNH_n(-%H$b3CkgdzGuqkEZ$`|}*47j;(+&#TD`2WpTo9xX=Pd;vNvQj&?>E0jN*Y3$_KUcBr In##Zc03eH|X#fBK literal 0 HcmV?d00001 diff --git a/next/static.files/SourceSerif4-It-ca3b17ed.ttf.woff2 b/next/static.files/SourceSerif4-It-ca3b17ed.ttf.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2ae08a7bedfed08cdfea76039c1bb1fa1d6cdf67 GIT binary patch literal 59716 zcmXT-cQayOWME)mcaf#G5T zSL^YZmhC>=6L}aI&6re}7m2VauuhI(Kf@LMv~Lr;mUG^>s%!PKp0k)dIT>arZ_y33 zG;50L1i!_JmGjBYmewh55QEIM#vBxQ^ zZqIRLI?DXvu@#?rKk2C&G=E7KmEw$l z8RJ@PC-7C%tE+hLb^fDeQ|f|OPZ2+nXSCSNqw4p>rw(`ZQVv?C-g@mN7_dz7g+lV& z`&zQ9uXWUT^PXyjoV~H1aktYY@mR0W;JF{p>}^t6(*D50OzWNd!dYAepAAk`bN016 z%Di2`Kkx5GldweebVjrbK$fHyYi;4 zoGh`#`CG(a6HCwHy9=$?$YlLLxzr^@cY&2FI}nms&{@5|G&P1=+MpIr+e0l=UKAFWq%c%owobUl5Y`7RTi9QTMEC{ zntj!{`_j(huEPcMqwf~&_v$<<`7l4UInVfN?Ul8^H#+=3wD!zo9xJi+T`RQjN&m~= zTrc%iG;e!F~|{ptedKPow#oiFXO1HbP+=3MBvqUQSl>{t66(yfBx zx4oKf=Knc!sa54p|E;?`ZogA@R$caLx5`(!ca!W(s{Mmb{ZXkedi^|DtggS}%2}zv zvj^J`Zku{+UrP9%JdISx%1b#@cGlZFE1UePe)G-hqdcSXaoMK5!nG2JiHk-#w}uG}I+7WyU4^ z(a)>VZI^Lr&N;1O=GDono-qG}z@fFbujIbnP(C{=(;;d$Tm7fpwWt56GqSZlJ3K** z<-KYA<$dqwo-d91!{VXfrg(7E?&~TaZ2hl4Us<(TVAte%kpUl>czkMOI5@Ud{#Vdq zTXBY`t!wHGosz&~TCrifS6oR|`SSmtT!ne{-Rtq!m-%YN$X-%hJ$IG5G9}|kqnJpPK!Af_J$Dl~|KF92J_fV@+!fuiKS}h&_De!pjahdW zcxT__UbIyr{QHI|5j%;^XTz4AyTCg?w@IO=_iNwW&;_g?`i<^#ow_yo_<<{T_?(s; zF$=9z^9tq72=!mr_`o4TMNp&h14qC3`ajn7N9ygr{lA&LzWAl_+1Z>1778ad4hyMn z_IH&~nAzo8*24TI;6See--$m5_0Rak?>^))!TzC;-p}9v{|5ctq9JA4`YL;=mHNCV zKhEF%I9 zDk9q(ISx&En;@a8zHq7V;_Nkf)*B}ly!rqCdgj8r|Kz-$9qy3w?qurpd>y>%^tPh= zyPeJ_2ii23-;8?@{^yjN*^M0+lI9eZz2WrJ6g~Vie#OJELmF3u?o_z6Cclb$&@Pl& zbLQjT*vIm$_fH>tam1^`(^}Ef^VV!nUsoDpwf2od{)`ij_gs5r zZOR&ClYTtt{O0|3&tqT7Z~?*G3x zf7;BoKc<^qIcPPf=Dnl+7w%Zctl&t&Wl|sK`sZpnx$k=B^Mif1#qQhX&bp?ea*8~S z(M}aBt%4VBoE)*|V8oC1T>)pCo}N9)-ZL+{X*TOF%Ly#TqH8>OvzA`^TozR0vMnt% zFH3*v)cze6FWB!t{`9>}z5RmIX}89JKIvaNS$B6I$agbIeDnSP>|5TZRqt=THhNwY z{eOArEkdO?r#Ej^c`vIRauL2bc`_dHBw! zbEiMw>=+Z2tgW`E>$B9+vNM7{x`z_ywAJ66@AKR5LDzntnX0Z8Ywk2P1vRb_V!kN0 z+2pMBlzmbC7kE4bPH;Z>U-;|te)ImVqFG)&4^Hejp>;Crbk!y<<$V`Y)p8^`{o}WP z{N}3L`f2KHHESCOj+r@%6lZE8Tl(hdfx958Ny}#wV^o_;YYfG<1g$4!+3I+xWCifU7-LIa1AhYLs zVo5=nhJQsxo~Ii)xbbaO*gB{$azuzejGw2gU{}I=g6!Dy~vmBhmM;LZ`g$&E1NEW>?Kk9~9};7xkR||9*CLpndhRXF34}o;#gmr)_@gBY(g1sv&2I zt#8AMje=t9Gp6a8ISU&;NvxOu=RNzJcg0lucQsZ<3MRda|EgLFNEApIlt!NXugX>M z;AcXiTQmFpyX<8L%V$nx-lyGB%X(B;l))*f+4j&T7DkQ?o&|eVELAu;R;}{75a>S1 z?$-n!!H=P zr^GCODyID1qB40>dD_o+?!Pae|068N;DQRyFI-#{rEM@EZ zvXs(wdLoa4QyEr93Y&$nn+1ul4Cgnywyun~tgYnNuH!xTW(gjQ+IV+S-+?p#-&eht zh@Qkb|3`c4r1Oc~0ojY{loZySysaB#`6qg@iQw7PFU(du)=jba*0P@^q)OWHor{Uz-8%c@tHP~ch?>fntWGRTx9xbPq9f8!YgzS+5O1wU9sxV7PkL;?p}Xo|IG7j@jvc!8TlVR66)Zz za6;J1j{myL4ovuPJmIr-ce$C`-_D}~u502M-tov3HfzT`;8DM^`G=fP-~6RJB;y?; z=SPZ3Y-(?o`8uO#?~`*|>rS_q=f&?{J!{6nyIM2Ke=TV0xg4-tJLkp~Wftd$2_nZI z`lP#PJt>g?Bk+Iz?~VF*IIdo=a`-3oBwk?M|8wilZ~Bswm3G$bywmE4BHrxi^KE9? z#ou1bGkh1@}h*b z8L`n#+w=Rsm&RKgz1c7~s`UA${_>r(cgm{xu{*x)n)|(a*DK!YyT|u^H+L~yczEZ& z=xw&Cp#gnNJ&BJMFr6Pio$} z;N5Y5pWT{ep0-6xuGZ$;j-N@=x9)R=yLg+q=Gdz%?R@w3kf~?;-eX^0ZQdWp{o(mP z^$knssmgBRPoB7>Doj)TPx@@VcW>9O-mF~xCFhgr->@T*hcX^~Yu@wvh)B()*AC|| z*RAOCQM|MD_aB{H$B>JO9?FNDSHHO`ba2bnSw|wO7Ehfd^lKY`s>h+ugsFL2tB(jS zdAKw-+(k_FmSRtuWbK}~iCMAYX|9WV?ACsAx6l(;WM@8Sx9&sqPbU%Sum2x>VSTz~ z%e4K=UOnRfrt{4rzIj{3@BRwmjz*71o$e8G>?)_23q|Y#4w=Z8Ic|O69yjyC;;L`G zp9ekhDtb5^*kAjO1@ z_vVR9nGYxb*G=lF7QN?j<+j|`?Qi$)%e$?czwfI4nKExFZ^07J|BJT1j(ooFQ3|Jc zaIVi0m26GDHvwxGZ`_p2w31)XY3bP&xwn#kukEp4E448CY~Z5WJrMz6Hco9@nkNWb zmnLu5KfXPz$TU22>Az3wZanlhNOYO(A(ggsmG%VdmVY}tZtgR4U0?j=NY6Y8o73JI zl@Ge+MO@VvuUUG1(ak^SW$#Yw)jyv+>F3AaE7q?JvwE?t-_cDXy(>~IB5iB$w%e~a zJU;j7*~Hb4&ggx9ZvM0{bNS+^{IfNWPlU}s{p@b;l^a!M)(eVOKimBIg<0hB>wNhy zVl3wy9J+Sa|90p1(m#7-umAg6GXG-2TN}In-28jH!jCTftL_oG@2>IF-*V^ghral5 zMBdgd>HO!%rA6=hs{fZ&1#kb%t;6!;lQ-A9R+jm-I(fI0zkCt*{~KrXx%6Y7e7Ap9 ze9hV1Tg&$aD5RJ>eS2thL1Brk>&voh7c}SZP|H3obtwD3&xucy_f0aZV{Ud|Xeqo# zQFxi?W=m_A&$rH}J}ua@|LG~Mf|gaYtb&|_y`@`^B@|XLO>|+?P?+kLZV;Kn7v6qc z{KYHIue?0HJ+d`VxZ{7Fy1wt@UePb5bLQ@utM-z!*EaLe)cS<qT4#;r;|(6%?>P6U|*Hf5Q5dX@}v&{rvoVm+qZS-hZq?y!!O9ib)|_pLI8#y1Fj^vYA4u zpsJ%Q&(r_QK3BHfQBql+T4%L6{J&IHY5o)4%EI-3O85AEIHYc}Qo(hOk6s3Ynw{$2 zSS#s_o&R@C>?w^AmQjf8`*ZL5T>ERs|FX>g{krCMwatb2t*>wYsGGh0t?k|OYE~~< z^{NkU;{9Ets_#-2v?ahhsyxFW{#mj5O1V@&AwiMzUpN>VCCx0YdV&Pnn$FwYs6DRe z$J(?zdAIh8sub({td^IIu53G>*8fT%DA%WJs{R`{0js>EGfPu0pR7{t`jhnef}oPU z>b)2Nx!AXcj|=BL@cheg;aS1g#t)kFKU&6rP>nx%T`-dGcWTq(Bfh%F>$WVICm@)l z;xSRty)kI_r%YjnrUL>iHZkWhshs*^z(|4g)z3`m&=MCu} zqt5TvN-^A<-1&A9L*PXTgQPPpn#KZx#ed!B)c^GVr=KM_XWGGq2@gWpvTjto*E%m6 zx*_iHg+-jIX)rY1PpHW=CcD288QipTU5s&Y661z+9EM1FS2rhdQs z;^aHqL+{+zxUc;Xl9ikjy6tKCH)#dQPCm92fsE3;`s?$`n0<`3?`-b6({wI7`%C4k zezR7OTHPDY(M!3^bM6@KXNnEq_3n?%?>D9sR@5)*pJ1_9P5169-){dHJt2m7H_K=4 zov=s0Td9{*CMo?K@0_*Fk6g~HW>>FxZ|V@dZfYk_c=5MSeq4VJ-3{GUI4fCPCOvP_ zWG}V`Goy=24W&B+Ci61h-2N`7>&8*z@1mX}vN_tR+=VwxqW5f!R){=4-O0sgx#9|r zA}dja0|qWRDNj4+{(GTb_H`fEe2qm*?lv>0#fMp5=2D-~l*8_55fggy)rG9BP1;;9 zPl#Q-iMO)DyD~rlr~c zah08t8vIV_zQDeZ(|gkrYfC-yzs7iJNyMBww5_b^j;V4 zwpXhD_PpPYH=lDRoPM)&rT2#Jk78&2w`BTkU%X+8UD*<&`FWGW0}oY3=(#Mh6R0_N ze|=6{?up_BTj~{BlIE>ZO^%#i#qCzLgTZ2Ndh}-NgJSM1C)C*aM7G3B`@a-&w^Es)@f1ztJZpx341 zAavHi(f?z(vUP|@iq5acLF~(2=kQ!g`n*OuqEK;GvdP83TQYi%Pgqm8{M~KxrZJ0g z_NtcEs@1aLSLWVWyNy$u_fXW%{qH=UsL$c|GhSP=`GmXO!(h9|#rqz3?|YQ(wsF6d zSJ%t4cJ{0PoV{msr^rpBw#V?eRQ27*Ytrw0TsFUO+06dLlBCJ=551{6yZyV?+Lued zl~$#f=~=TcFET9TygEs0>#L0}Jr)@!H$BmEa0puFwpdMP?>33hW@r`19PvMp)qPw!FCiKa0bz&t}ixv(~&} zQP}qB3l*eXe+ot2n1AA-|IS^Nfv&n&S)Xh-u$*PO?#)?+|Jzk>9c%9XY|}DNXtC&r zX{u9um&}%q7h>g2r}j7Jk1T19+pLO@_v|rUy3h9VQJ$hr>{1JstG(J-=WeI> zKlNB7JF_IM`OBGIHxq99>Bmn}T|AY2 z_vbf1o&jidHR`EFR$q>ijFSreSC-Yocf{yJ=J-e zKUiP3h*LV4qPzWf&}oad<_ptTbbl4tSLAqU^1hOo$u}NaPB@#jLQkTq|G#QryRQE3 z&X@=P4s|s$_xsjWPMLJ4_{Tc~%N4u(uIYWad8J&edd6w_Sf#$C#Rr~>>=v4PDYWDC za>?yae%KWyJy^A8)#K{ge^M(S+w`s5n$kIO{>8*x$#PK z<(3)?zqn&$6%ZvZQnvb1b!O+@J!|;HU(Z$jGH+6Ked{j|%i28^@%K^>>2L{(BstHx zbfnNIl`UdQ?Zyi-Ju6jN3KuA_D4tN`nrvY)T}FzCgHjp1J*?b9gMN|Sr}uUvwBnZk1IBNUp;$rD9h`~&Z}Xk zKCfOqK|CxzJ}$=D`12*H(@&n7PCcictv4+G`{wT0 zS7YvJ{Q2*a)K7;~mKs}CZv126`cc03`-d)8AHkn@7&?-kdt#pXxf|J_|Iuq{8^y8Pt7+M*v5WNed;`=59j{PvCI zS@TU!#+us;SIytxJV(Cq+lm+K41Q||#;7j6TCw$*#5&PaRu0k!Z>%|^n~)!T&hJC{ z%!7G6-%nhOlYQU(qQQ&LsmkL#-|CZwGi1%<{%;Zg*R1+~)zbfoHv=};%!mn6^)aMH8+_{3R7mpD_>ew^<jT1IB>O) z%*+=#D&c3}F4*CGU~)+Q(%(gg?;Ck$Ui6)y>HH{ehOb~|$qkV(|At$xh-=|PiLN!(SLsKYtlWNesP@-1$Rqr?-eM2?ls?bCnb2@o6p>z41Q0K zV-H!rh^@=Z@!{`IH=*lQpZPzfuikt3OTzUVYyY{QefA>k`*+=-Wit}yYug69Sqofx z8lw$GpsP)wqCjFxBApR!@OPb zn#U(*Rm<3?>M#~O4&0E)8(uli-*eBOj-JCOFFB`NB_A!%cV{R`ztFx`SNOdq`}hE^^qTInq2S69r~y6VwVZC?}6njwkJDg>8rAe^XBRgWkhX!);(R(D(UQUsBBk7UdQ2Ly=R{u*L%!!Ym(5}H|HI@*3W-u zPOvYUl>NK!>}j{6u)MHp#)m#_t}U}97OtIdYLK)1PlP}+SI^^D4{ej#{4TEj@lQf2 zZ);`x?HB(m+P$~kVQQ68$(CK%p{pLNw(o?@)w2g}jSVMBN6HsJPn=rhUfg04df|Uz zX_3q3Yj1YzCZAwbTF$99wWYeN_+RM9f2z;rBmP<}+?Cl{vpy{D+gYRH(3L+IDE-{g zQxjBWw>o9tih??QU1{xUzM|)!dHI<9JJK|{$D(zD=CPTdyU$)0ef!OIck;(|YXZWj z-i=+ovU=Kuey>;eRm;6KyV(vNWy)rKyzbgu1|OlQmQ@L>X6?v+v(hPKVQ8azU~7cy z-14~-UHl?H^PG}O*);39ui|GOi7BQFg8Nx>61#PkRtbb=gl_O$qjYxnIgg|?(PW`i z-cwR3rspTIwVW|dn8(P>#`{9#N-|^gjihEao>NA?SzcNyTQ99q%I45C&wl8>)};Hm zl;x@2XWXWDsu*?VKbY8cmkWT#UCGD4`)?VvcVlvT1O-g+E9+~c&H%yYbd&F+~&1v*-o$WDE zNnL4Th|nT0o05%+qHTeSO(y(V1|6XdXG6mwHr5cnx!K#^mpDa#&3z-g=8bHx z-?>sr(DYCp%=`!z@4I31qPelA$qR8uDzId)813O>dHI^?8 z&BvLaZ`HZJ%JawViR(_5>2AmliuHam%f{GMF5MvQNYZt0$uw`CX&$OUor^>stl5_{ zEsj%+Ke5pB-J*{fJdLi∨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 + +Copyright 2014-2021 Adobe (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe in the United States and/or other countries. +Copyright 2014 - 2023 Adobe (http://www.adobe.com/), with Reserved Font Name ‘Source’. All Rights Reserved. Source is a trademark of Adobe in the United States and/or other countries. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. + +This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + + diff --git a/next/static.files/SourceSerif4-Regular-6b053e98.ttf.woff2 b/next/static.files/SourceSerif4-Regular-6b053e98.ttf.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..0263fc304226d90e224e53053855ad138303b70b GIT binary patch literal 76260 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 z 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 literal 0 HcmV?d00001 diff --git a/next/static.files/SourceSerif4-Semibold-457a13ac.ttf.woff2 b/next/static.files/SourceSerif4-Semibold-457a13ac.ttf.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..dd55f4e95ec9c29fb566d8617104afca31f0eeef GIT binary patch literal 80732 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 + + + + diff --git a/next/static.files/favicon-32x32-6580c154.png b/next/static.files/favicon-32x32-6580c154.png new file mode 100644 index 0000000000000000000000000000000000000000..69b8613ce1506e1c92b864f91cc46df06348c62b GIT binary patch literal 1125 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4i*LmhMUEk>KPaqSkfJR9T^xl_H+M9WCckk zdj$D1FjT2AFf_Cr6TMf{5NG^&fD@Vp>^w8j}6zpO={xwS}6VP!Nq5b1ixsAsCs5@Y;Ua)7yWuE z+Tnu&$Fg}WYaQ1{u1atX^s;@Tkm7ucmvyq6`R%vodfMln$@}L2f6vY{@4x>$^S$=| z?C&pB7Z+K))+utcZICh6Ub-SH%J=M+Rg0!X9)I_?MuK&rXyb~foNG8lle)!TW^)H@ z*ZL4rR3|%Mb@^+i$d_U5|DNQY*wJ(0;Eli2TuTqPUDe&ix`~e?wMY6Di@lyl!vAMW zVo$7IaU%IZ%l*kEOpoU>8g2YN%{;0=wr~mSTg~Xg4j=2%g|j@Cy!p9%(x0YH9#6Jy zaC~mod74kD{_VY%@3!1>AN%Ip08?VDU@^deGVSJLW>9!qzBxfflra`iHms}dTlzu!CFclD0V z`>s9VSUA)2)QxG255I}OQuDyK|A={imCWmVpGz<2SjwrX%a|(O7InYYvbboK(!{4> zR}&L2<%^bz?_%4rV4YC3D)Um!+sbbzgzru}Gs*LOiF~F>`z!Znt#M`>oUI>-POOyQ z&VMzHnP0N-=&trhpO>+Ehka~uj`PvjlYC-^{hICU86J06*|AqmDfV4kyK&3uZ&})< zYqkY_zk1Dg*6C6&-?LYmb*?YF^StW6{CVv*N3r~QFBupZR7+eVN>UO_QmvAUQWHy3 z8H@~!jC2hQbq$R}42`V}&8-Y9v<(cb3=Fa@!vCUZ$jwj5OsmALK`QmVBLf42B*=!~ z{Irtt#G+J&^73-M%)IR4fLp^cl~mK@7~w+0){getNotDisplayedElem().appendChild(el.firstElementChild);}if(elemToDisplay===null){addClass(el,"hidden");showMain();return;}el.appendChild(elemToDisplay);hideMain();removeClass(el,"hidden");const mainHeading=elemToDisplay.querySelector(".main-heading");if(mainHeading&&window.searchState.rustdocToolbar){if(window.searchState.rustdocToolbar.parentElement){window.searchState.rustdocToolbar.parentElement.removeChild(window.searchState.rustdocToolbar,);}mainHeading.appendChild(window.searchState.rustdocToolbar);}}function browserSupportsHistoryApi(){return window.history&&typeof window.history.pushState==="function";}function preLoadCss(cssUrl){const link=document.createElement("link");link.href=cssUrl;link.rel="preload";link.as="style";document.getElementsByTagName("head")[0].appendChild(link);}(function(){const isHelpPage=window.location.pathname.endsWith("/help.html");function loadScript(url,errorCallback){const script=document.createElement("script");script.src=url;if(errorCallback!==undefined){script.onerror=errorCallback;}document.head.append(script);}onEachLazy(document.querySelectorAll(".settings-menu"),settingsMenu=>{settingsMenu.querySelector("a").onclick=event=>{if(event.ctrlKey||event.altKey||event.metaKey){return;}window.hideAllModals(false);addClass(settingsMenu,"rotate");event.preventDefault();loadScript(getVar("static-root-path")+getVar("settings-js"));setTimeout(()=>{const themes=getVar("themes").split(",");for(const theme of themes){if(theme!==""){preLoadCss(getVar("root-path")+theme+".css");}}},0);};});window.searchState={rustdocToolbar:document.querySelector("rustdoc-toolbar"),loadingText:"Loading search results...",inputElement:()=>{let el=document.getElementsByClassName("search-input")[0];if(!el){const out=nonnull(nonnull(window.searchState.outputElement()).parentElement);const hdr=document.createElement("div");hdr.className="main-heading search-results-main-heading";const params=window.searchState.getQueryStringParams();const autofocusParam=params.search===""?"autofocus":"";hdr.innerHTML=`
`;out.insertBefore(hdr,window.searchState.outputElement());el=document.getElementsByClassName("search-input")[0];}if(el instanceof HTMLInputElement){return el;}return null;},containerElement:()=>{let el=document.getElementById("search");if(!el){el=document.createElement("section");el.id="search";getNotDisplayedElem().appendChild(el);}return el;},outputElement:()=>{const container=window.searchState.containerElement();if(!container){return null;}let el=container.querySelector(".search-out");if(!el){el=document.createElement("div");el.className="search-out";container.appendChild(el);}return el;},title:document.title,titleBeforeSearch:document.title,timeout:null,currentTab:0,focusedByTab:[null,null,null],clearInputTimeout:()=>{if(window.searchState.timeout!==null){clearTimeout(window.searchState.timeout);window.searchState.timeout=null;}},isDisplayed:()=>{const container=window.searchState.containerElement();if(!container){return false;}return!!container.parentElement&&container.parentElement.id===ALTERNATIVE_DISPLAY_ID;},focus:()=>{const inputElement=window.searchState.inputElement();window.searchState.showResults();if(inputElement){inputElement.focus();requestAnimationFrame(()=>inputElement.focus());}},defocus:()=>{nonnull(window.searchState.inputElement()).blur();},toggle:()=>{if(window.searchState.isDisplayed()){window.searchState.defocus();window.searchState.hideResults();}else{window.searchState.focus();}},showResults:()=>{document.title=window.searchState.title;if(window.searchState.isDisplayed()){return;}const search=window.searchState.containerElement();switchDisplayedElement(search);const btn=document.querySelector("#search-button a");if(browserSupportsHistoryApi()&&btn instanceof HTMLAnchorElement&&window.searchState.getQueryStringParams().search===undefined){history.pushState(null,"",btn.href);}const btnLabel=document.querySelector("#search-button a span.label");if(btnLabel){btnLabel.innerHTML="Exit";}},removeQueryParameters:()=>{document.title=window.searchState.titleBeforeSearch;if(browserSupportsHistoryApi()){history.replaceState(null,"",getNakedUrl()+window.location.hash);}},hideResults:()=>{switchDisplayedElement(null);window.searchState.removeQueryParameters();const btnLabel=document.querySelector("#search-button a span.label");if(btnLabel){btnLabel.innerHTML="Search";}},getQueryStringParams:()=>{const params={};window.location.search.substring(1).split("&").map(s=>{const pair=s.split("=").map(x=>x.replace(/\+/g," "));params[decodeURIComponent(pair[0])]=typeof pair[1]==="undefined"?null:decodeURIComponent(pair[1]);});return params;},setup:()=>{let searchLoaded=false;const search_input=window.searchState.inputElement();if(!search_input){return;}function sendSearchForm(){document.getElementsByClassName("search-form")[0].submit();}function loadSearch(){if(!searchLoaded){searchLoaded=true;window.rr_=data=>{window.searchIndex=data;};if(!window.StringdexOnload){window.StringdexOnload=[];}window.StringdexOnload.push(()=>{loadScript(getVar("static-root-path")+getVar("search-js"),sendSearchForm,);});loadScript(getVar("static-root-path")+getVar("stringdex-js"),sendSearchForm);loadScript(resourcePath("search.index/root",".js"),sendSearchForm);}}search_input.addEventListener("focus",()=>{loadSearch();});const btn=document.getElementById("search-button");if(btn){btn.onclick=event=>{if(event.ctrlKey||event.altKey||event.metaKey){return;}event.preventDefault();window.searchState.toggle();loadSearch();};}if(browserSupportsHistoryApi()){const previousTitle=document.title;window.addEventListener("popstate",e=>{const params=window.searchState.getQueryStringParams();document.title=previousTitle;const inputElement=window.searchState.inputElement();if(params.search!==undefined&&inputElement!==null){loadSearch();inputElement.value=params.search;e.preventDefault();window.searchState.showResults();if(params.search===""){window.searchState.focus();}}else{window.searchState.hideResults();}});}window.onpageshow=()=>{const inputElement=window.searchState.inputElement();const qSearch=window.searchState.getQueryStringParams().search;if(qSearch!==undefined&&inputElement!==null){if(inputElement.value===""){inputElement.value=qSearch;}window.searchState.showResults();if(qSearch===""){loadSearch();window.searchState.focus();}}else{window.searchState.hideResults();}};const params=window.searchState.getQueryStringParams();if(params.search!==undefined){window.searchState.setLoadingSearch();loadSearch();}},setLoadingSearch:()=>{const search=window.searchState.outputElement();nonnull(search).innerHTML="

"+window.searchState.loadingText+"

";window.searchState.showResults();},descShards:new Map(),loadDesc:async function({descShard,descIndex}){if(descShard.promise===null){descShard.promise=new Promise((resolve,reject)=>{descShard.resolve=resolve;const ds=descShard;const fname=`${ds.crate}-desc-${ds.shard}-`;const url=resourcePath(`search.desc/${descShard.crate}/${fname}`,".js",);loadScript(url,reject);});}const list=await descShard.promise;return list[descIndex];},loadedDescShard:function(crate,shard,data){this.descShards.get(crate)[shard].resolve(data.split("\n"));},};const toggleAllDocsId="toggle-all-docs";let savedHash="";function handleHashes(ev){if(ev!==null&&window.searchState.isDisplayed()&&ev.newURL){switchDisplayedElement(null);const hash=ev.newURL.slice(ev.newURL.indexOf("#")+1);if(browserSupportsHistoryApi()){history.replaceState(null,"",getNakedUrl()+window.location.search+"#"+hash);}const elem=document.getElementById(hash);if(elem){elem.scrollIntoView();}}const pageId=window.location.hash.replace(/^#/,"");if(savedHash!==pageId){savedHash=pageId;if(pageId!==""){expandSection(pageId);}}if(savedHash.startsWith("impl-")){const splitAt=savedHash.indexOf("/");if(splitAt!==-1){const implId=savedHash.slice(0,splitAt);const assocId=savedHash.slice(splitAt+1);const implElems=document.querySelectorAll(`details > summary > section[id^="${implId}"]`,);onEachLazy(implElems,implElem=>{const numbered=/^(.+?)-([0-9]+)$/.exec(implElem.id);if(implElem.id!==implId&&(!numbered||numbered[1]!==implId)){return false;}return onEachLazy(implElem.parentElement.parentElement.querySelectorAll(`[id^="${assocId}"]`),item=>{const numbered=/^(.+?)-([0-9]+)$/.exec(item.id);if(item.id===assocId||(numbered&&numbered[1]===assocId)){openParentDetails(item);item.scrollIntoView();setTimeout(()=>{window.location.replace("#"+item.id);},0);return true;}},);});}}}function onHashChange(ev){hideSidebar();handleHashes(ev);}function openParentDetails(elem){while(elem){if(elem.tagName==="DETAILS"){elem.open=true;}elem=elem.parentElement;}}function expandSection(id){openParentDetails(document.getElementById(id));}function handleEscape(ev){window.searchState.clearInputTimeout();window.searchState.hideResults();ev.preventDefault();window.searchState.defocus();window.hideAllModals(true);}function handleShortcut(ev){const disableShortcuts=getSettingValue("disable-shortcuts")==="true";if(ev.ctrlKey||ev.altKey||ev.metaKey||disableShortcuts){return;}if(document.activeElement&&document.activeElement.tagName==="INPUT"&&document.activeElement.type!=="checkbox"&&document.activeElement.type!=="radio"){switch(getVirtualKey(ev)){case"Escape":handleEscape(ev);break;}}else{switch(getVirtualKey(ev)){case"Escape":handleEscape(ev);break;case"s":case"S":case"/":ev.preventDefault();window.searchState.focus();break;case"+":ev.preventDefault();expandAllDocs();break;case"-":ev.preventDefault();collapseAllDocs(false);break;case"_":ev.preventDefault();collapseAllDocs(true);break;case"?":showHelp();break;default:break;}}}document.addEventListener("keypress",handleShortcut);document.addEventListener("keydown",handleShortcut);function addSidebarItems(){if(!window.SIDEBAR_ITEMS){return;}const sidebar=document.getElementById("rustdoc-modnav");function block(shortty,id,longty){const filtered=window.SIDEBAR_ITEMS[shortty];if(!filtered){return;}const modpath=hasClass(document.querySelector(".rustdoc"),"mod")?"../":"";const h3=document.createElement("h3");h3.innerHTML=`
${longty}`;const ul=document.createElement("ul");ul.className="block "+shortty;for(const name of filtered){let path;if(shortty==="mod"){path=`${modpath}${name}/index.html`;}else{path=`${modpath}${shortty}.${name}.html`;}let current_page=document.location.href.toString();if(current_page.endsWith("/")){current_page+="index.html";}const link=document.createElement("a");link.href=path;link.textContent=name;const li=document.createElement("li");if(link.href===current_page){li.classList.add("current");}li.appendChild(link);ul.appendChild(li);}sidebar.appendChild(h3);sidebar.appendChild(ul);}if(sidebar){block("primitive","primitives","Primitive Types");block("mod","modules","Modules");block("macro","macros","Macros");block("struct","structs","Structs");block("enum","enums","Enums");block("constant","constants","Constants");block("static","static","Statics");block("trait","traits","Traits");block("fn","functions","Functions");block("type","types","Type Aliases");block("union","unions","Unions");block("foreigntype","foreign-types","Foreign Types");block("keyword","keywords","Keywords");block("attr","attributes","Attribute Macros");block("derive","derives","Derive Macros");block("traitalias","trait-aliases","Trait Aliases");}}window.register_implementors=imp=>{const implementors=document.getElementById("implementors-list");const synthetic_implementors=document.getElementById("synthetic-implementors-list");const inlined_types=new Set();const TEXT_IDX=0;const SYNTHETIC_IDX=1;const TYPES_IDX=2;if(synthetic_implementors){onEachLazy(synthetic_implementors.getElementsByClassName("impl"),el=>{const aliases=el.getAttribute("data-aliases");if(!aliases){return;}aliases.split(",").forEach(alias=>{inlined_types.add(alias);});});}let currentNbImpls=implementors.getElementsByClassName("impl").length;const traitName=document.querySelector(".main-heading h1 > .trait").textContent;const baseIdName="impl-"+traitName+"-";const libs=Object.getOwnPropertyNames(imp);const script=document.querySelector("script[data-ignore-extern-crates]");const ignoreExternCrates=new Set((script?script.getAttribute("data-ignore-extern-crates"):"").split(","),);for(const lib of libs){if(lib===window.currentCrate||ignoreExternCrates.has(lib)){continue;}const structs=imp[lib];struct_loop:for(const struct of structs){const list=struct[SYNTHETIC_IDX]?synthetic_implementors:implementors;if(struct[SYNTHETIC_IDX]){for(const struct_type of struct[TYPES_IDX]){if(inlined_types.has(struct_type)){continue struct_loop;}inlined_types.add(struct_type);}}const code=document.createElement("h3");code.innerHTML=struct[TEXT_IDX];addClass(code,"code-header");onEachLazy(code.getElementsByTagName("a"),elem=>{const href=elem.getAttribute("href");if(href&&!href.startsWith("#")&&!/^(?:[a-z+]+:)?\/\//.test(href)){elem.setAttribute("href",window.rootPath+href);}});const currentId=baseIdName+currentNbImpls;const anchor=document.createElement("a");anchor.href="#"+currentId;addClass(anchor,"anchor");const display=document.createElement("div");display.id=currentId;addClass(display,"impl");display.appendChild(anchor);display.appendChild(code);list.appendChild(display);currentNbImpls+=1;}}};if(window.pending_implementors){window.register_implementors(window.pending_implementors);}window.register_type_impls=imp=>{if(!imp||!imp[window.currentCrate]){return;}window.pending_type_impls=undefined;const idMap=new Map();let implementations=document.getElementById("implementations-list");let trait_implementations=document.getElementById("trait-implementations-list");let trait_implementations_header=document.getElementById("trait-implementations");const script=document.querySelector("script[data-self-path]");const selfPath=script?script.getAttribute("data-self-path"):null;const mainContent=document.querySelector("#main-content");const sidebarSection=document.querySelector(".sidebar section");let methods=document.querySelector(".sidebar .block.method");let associatedTypes=document.querySelector(".sidebar .block.associatedtype");let associatedConstants=document.querySelector(".sidebar .block.associatedconstant");let sidebarTraitList=document.querySelector(".sidebar .block.trait-implementation");for(const impList of imp[window.currentCrate]){const types=impList.slice(2);const text=impList[0];const isTrait=impList[1]!==0;const traitName=impList[1];if(types.indexOf(selfPath)===-1){continue;}let outputList=isTrait?trait_implementations:implementations;if(outputList===null){const outputListName=isTrait?"Trait Implementations":"Implementations";const outputListId=isTrait?"trait-implementations-list":"implementations-list";const outputListHeaderId=isTrait?"trait-implementations":"implementations";const outputListHeader=document.createElement("h2");outputListHeader.id=outputListHeaderId;outputListHeader.innerText=outputListName;outputList=document.createElement("div");outputList.id=outputListId;if(isTrait){const link=document.createElement("a");link.href=`#${outputListHeaderId}`;link.innerText="Trait Implementations";const h=document.createElement("h3");h.appendChild(link);trait_implementations=outputList;trait_implementations_header=outputListHeader;sidebarSection.appendChild(h);sidebarTraitList=document.createElement("ul");sidebarTraitList.className="block trait-implementation";sidebarSection.appendChild(sidebarTraitList);mainContent.appendChild(outputListHeader);mainContent.appendChild(outputList);}else{implementations=outputList;if(trait_implementations){mainContent.insertBefore(outputListHeader,trait_implementations_header);mainContent.insertBefore(outputList,trait_implementations_header);}else{const mainContent=document.querySelector("#main-content");mainContent.appendChild(outputListHeader);mainContent.appendChild(outputList);}}}const template=document.createElement("template");template.innerHTML=text;onEachLazy(template.content.querySelectorAll("a"),elem=>{const href=elem.getAttribute("href");if(href&&!href.startsWith("#")&&!/^(?:[a-z+]+:)?\/\//.test(href)){elem.setAttribute("href",window.rootPath+href);}});onEachLazy(template.content.querySelectorAll("[id]"),el=>{let i=0;if(idMap.has(el.id)){i=idMap.get(el.id);}else if(document.getElementById(el.id)){i=1;while(document.getElementById(`${el.id}-${2 * i}`)){i=2*i;}while(document.getElementById(`${el.id}-${i}`)){i+=1;}}if(i!==0){const oldHref=`#${el.id}`;const newHref=`#${el.id}-${i}`;el.id=`${el.id}-${i}`;onEachLazy(template.content.querySelectorAll("a[href]"),link=>{if(link.getAttribute("href")===oldHref){link.href=newHref;}});}idMap.set(el.id,i+1);});const templateAssocItems=template.content.querySelectorAll("section.tymethod, "+"section.method, section.associatedtype, section.associatedconstant");if(isTrait){const li=document.createElement("li");const a=document.createElement("a");a.href=`#${template.content.querySelector(".impl").id}`;a.textContent=traitName;li.appendChild(a);sidebarTraitList.append(li);}else{onEachLazy(templateAssocItems,item=>{let block=hasClass(item,"associatedtype")?associatedTypes:(hasClass(item,"associatedconstant")?associatedConstants:(methods));if(!block){const blockTitle=hasClass(item,"associatedtype")?"Associated Types":(hasClass(item,"associatedconstant")?"Associated Constants":("Methods"));const blockClass=hasClass(item,"associatedtype")?"associatedtype":(hasClass(item,"associatedconstant")?"associatedconstant":("method"));const blockHeader=document.createElement("h3");const blockLink=document.createElement("a");blockLink.href="#implementations";blockLink.innerText=blockTitle;blockHeader.appendChild(blockLink);block=document.createElement("ul");block.className=`block ${blockClass}`;const insertionReference=methods||sidebarTraitList;if(insertionReference){const insertionReferenceH=insertionReference.previousElementSibling;sidebarSection.insertBefore(blockHeader,insertionReferenceH);sidebarSection.insertBefore(block,insertionReferenceH);}else{sidebarSection.appendChild(blockHeader);sidebarSection.appendChild(block);}if(hasClass(item,"associatedtype")){associatedTypes=block;}else if(hasClass(item,"associatedconstant")){associatedConstants=block;}else{methods=block;}}const li=document.createElement("li");const a=document.createElement("a");a.innerText=item.id.split("-")[0].split(".")[1];a.href=`#${item.id}`;li.appendChild(a);block.appendChild(li);});}outputList.appendChild(template.content);}for(const list of[methods,associatedTypes,associatedConstants,sidebarTraitList]){if(!list){continue;}const newChildren=Array.prototype.slice.call(list.children);newChildren.sort((a,b)=>{const aI=a.innerText;const bI=b.innerText;return aIbI?1:0;});list.replaceChildren(...newChildren);}};if(window.pending_type_impls){window.register_type_impls(window.pending_type_impls);}function addSidebarCrates(){if(!window.ALL_CRATES){return;}const sidebarElems=document.getElementById("rustdoc-modnav");if(!sidebarElems){return;}const h3=document.createElement("h3");h3.innerHTML="Crates";const ul=document.createElement("ul");ul.className="block crate";for(const crate of window.ALL_CRATES){const link=document.createElement("a");link.href=window.rootPath+crate+"/index.html";link.textContent=crate;const li=document.createElement("li");if(window.rootPath!=="./"&&crate===window.currentCrate){li.className="current";}li.appendChild(link);ul.appendChild(li);}sidebarElems.appendChild(h3);sidebarElems.appendChild(ul);}function expandAllDocs(){const innerToggle=document.getElementById(toggleAllDocsId);removeClass(innerToggle,"will-expand");onEachLazy(document.getElementsByClassName("toggle"),e=>{if(!hasClass(e,"type-contents-toggle")&&!hasClass(e,"more-examples-toggle")){e.open=true;}});innerToggle.children[0].innerText="Summary";}function collapseAllDocs(collapseImpls){const innerToggle=document.getElementById(toggleAllDocsId);addClass(innerToggle,"will-expand");onEachLazy(document.getElementsByClassName("toggle"),e=>{if((collapseImpls||e.parentNode.id!=="implementations-list")||(!hasClass(e,"implementors-toggle")&&!hasClass(e,"type-contents-toggle"))){e.open=false;}});innerToggle.children[0].innerText="Show all";}function toggleAllDocs(ev){const innerToggle=document.getElementById(toggleAllDocsId);if(!innerToggle){return;}if(hasClass(innerToggle,"will-expand")){expandAllDocs();}else{collapseAllDocs(ev!==undefined&&ev.shiftKey);}}(function(){const toggles=document.getElementById(toggleAllDocsId);if(toggles){toggles.onclick=toggleAllDocs;}const hideMethodDocs=getSettingValue("auto-hide-method-docs")==="true";const hideImplementations=getSettingValue("auto-hide-trait-implementations")==="true";const hideLargeItemContents=getSettingValue("auto-hide-large-items")!=="false";function setImplementorsTogglesOpen(id,open){const list=document.getElementById(id);if(list!==null){onEachLazy(list.getElementsByClassName("implementors-toggle"),e=>{e.open=open;});}}if(hideImplementations){setImplementorsTogglesOpen("trait-implementations-list",false);setImplementorsTogglesOpen("blanket-implementations-list",false);}onEachLazy(document.getElementsByClassName("toggle"),e=>{if(!hideLargeItemContents&&hasClass(e,"type-contents-toggle")){e.open=true;}if(hideMethodDocs&&hasClass(e,"method-toggle")){e.open=false;}});}());window.rustdoc_add_line_numbers_to_examples=()=>{function generateLine(nb){return`${nb}`;}onEachLazy(document.querySelectorAll(".rustdoc:not(.src) :not(.scraped-example) > .example-wrap > pre > code",),code=>{if(hasClass(code.parentElement.parentElement,"hide-lines")){removeClass(code.parentElement.parentElement,"hide-lines");return;}const lines=code.innerHTML.split("\n");const digits=(lines.length+"").length;code.innerHTML=lines.map((line,index)=>generateLine(index+1)+line).join("\n");addClass(code.parentElement.parentElement,`digits-${digits}`);});};window.rustdoc_remove_line_numbers_from_examples=()=>{onEachLazy(document.querySelectorAll(".rustdoc:not(.src) :not(.scraped-example) > .example-wrap"),x=>addClass(x,"hide-lines"),);};if(getSettingValue("line-numbers")==="true"){window.rustdoc_add_line_numbers_to_examples();}function showSidebar(){window.hideAllModals(false);const sidebar=document.getElementsByClassName("sidebar")[0];addClass(sidebar,"shown");}function hideSidebar(){const sidebar=document.getElementsByClassName("sidebar")[0];removeClass(sidebar,"shown");}window.addEventListener("resize",()=>{if(window.CURRENT_TOOLTIP_ELEMENT){const base=window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE;const force_visible=base.TOOLTIP_FORCE_VISIBLE;hideTooltip(false);if(force_visible){showTooltip(base);base.TOOLTIP_FORCE_VISIBLE=true;}}});const mainElem=document.getElementById(MAIN_ID);if(mainElem){mainElem.addEventListener("click",hideSidebar);}onEachLazy(document.querySelectorAll("a[href^='#']"),el=>{el.addEventListener("click",()=>{expandSection(el.hash.slice(1));hideSidebar();});});onEachLazy(document.querySelectorAll(".toggle > summary:not(.hideme)"),el=>{el.addEventListener("click",e=>{if(!e.target.matches("summary, a, a *")){e.preventDefault();}});});function showTooltip(e){const notable_ty=e.getAttribute("data-notable-ty");if(!window.NOTABLE_TRAITS&¬able_ty){const data=document.getElementById("notable-traits-data");if(data){window.NOTABLE_TRAITS=JSON.parse(data.innerText);}else{throw new Error("showTooltip() called with notable without any notable traits!");}}if(window.CURRENT_TOOLTIP_ELEMENT&&window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE===e){clearTooltipHoverTimeout(window.CURRENT_TOOLTIP_ELEMENT);return;}window.hideAllModals(false);const wrapper=document.createElement("div");if(notable_ty){wrapper.innerHTML="
"+window.NOTABLE_TRAITS[notable_ty]+"
";}else{const ttl=e.getAttribute("title");if(ttl!==null){e.setAttribute("data-title",ttl);e.removeAttribute("title");}const dttl=e.getAttribute("data-title");if(dttl!==null){const titleContent=document.createElement("div");titleContent.className="content";titleContent.appendChild(document.createTextNode(dttl));wrapper.appendChild(titleContent);}}wrapper.className="tooltip popover";const focusCatcher=document.createElement("div");focusCatcher.setAttribute("tabindex","0");focusCatcher.onfocus=hideTooltip;wrapper.appendChild(focusCatcher);const pos=e.getBoundingClientRect();wrapper.style.top=(pos.top+window.scrollY+pos.height)+"px";wrapper.style.left=0;wrapper.style.right="auto";wrapper.style.visibility="hidden";document.body.appendChild(wrapper);const wrapperPos=wrapper.getBoundingClientRect();const finalPos=pos.left+window.scrollX-wrapperPos.width+24;if(finalPos>0){wrapper.style.left=finalPos+"px";}else{wrapper.style.setProperty("--popover-arrow-offset",(wrapperPos.right-pos.right+4)+"px",);}wrapper.style.visibility="";window.CURRENT_TOOLTIP_ELEMENT=wrapper;window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE=e;clearTooltipHoverTimeout(window.CURRENT_TOOLTIP_ELEMENT);wrapper.onpointerenter=ev=>{if(ev.pointerType!=="mouse"){return;}clearTooltipHoverTimeout(e);};wrapper.onpointerleave=ev=>{if(ev.pointerType!=="mouse"||!(ev.relatedTarget instanceof HTMLElement)){return;}if(!e.TOOLTIP_FORCE_VISIBLE&&!e.contains(ev.relatedTarget)){setTooltipHoverTimeout(e,false);addClass(wrapper,"fade-out");}};}function setTooltipHoverTimeout(element,show){clearTooltipHoverTimeout(element);if(!show&&!window.CURRENT_TOOLTIP_ELEMENT){return;}if(show&&window.CURRENT_TOOLTIP_ELEMENT){return;}if(window.CURRENT_TOOLTIP_ELEMENT&&window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE!==element){return;}element.TOOLTIP_HOVER_TIMEOUT=setTimeout(()=>{if(show){showTooltip(element);}else if(!element.TOOLTIP_FORCE_VISIBLE){hideTooltip(false);}},show?window.RUSTDOC_TOOLTIP_HOVER_MS:window.RUSTDOC_TOOLTIP_HOVER_EXIT_MS);}function clearTooltipHoverTimeout(element){if(element.TOOLTIP_HOVER_TIMEOUT!==undefined){removeClass(window.CURRENT_TOOLTIP_ELEMENT,"fade-out");clearTimeout(element.TOOLTIP_HOVER_TIMEOUT);delete element.TOOLTIP_HOVER_TIMEOUT;}}function tooltipBlurHandler(event){if(window.CURRENT_TOOLTIP_ELEMENT&&!window.CURRENT_TOOLTIP_ELEMENT.contains(document.activeElement)&&!window.CURRENT_TOOLTIP_ELEMENT.contains(event.relatedTarget)&&!window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE.contains(document.activeElement)&&!window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE.contains(event.relatedTarget)){setTimeout(()=>hideTooltip(false),0);}}function hideTooltip(focus){if(window.CURRENT_TOOLTIP_ELEMENT){if(window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE.TOOLTIP_FORCE_VISIBLE){if(focus){window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE.focus();}window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE.TOOLTIP_FORCE_VISIBLE=false;}document.body.removeChild(window.CURRENT_TOOLTIP_ELEMENT);clearTooltipHoverTimeout(window.CURRENT_TOOLTIP_ELEMENT);window.CURRENT_TOOLTIP_ELEMENT=null;}}onEachLazy(document.getElementsByClassName("tooltip"),e=>{e.onclick=()=>{e.TOOLTIP_FORCE_VISIBLE=e.TOOLTIP_FORCE_VISIBLE?false:true;if(window.CURRENT_TOOLTIP_ELEMENT&&!e.TOOLTIP_FORCE_VISIBLE){hideTooltip(true);}else{showTooltip(e);window.CURRENT_TOOLTIP_ELEMENT.setAttribute("tabindex","0");window.CURRENT_TOOLTIP_ELEMENT.focus();window.CURRENT_TOOLTIP_ELEMENT.onblur=tooltipBlurHandler;}return false;};e.onpointerenter=ev=>{if(ev.pointerType!=="mouse"){return;}setTooltipHoverTimeout(e,true);};e.onpointermove=ev=>{if(ev.pointerType!=="mouse"){return;}setTooltipHoverTimeout(e,true);};e.onpointerleave=ev=>{if(ev.pointerType!=="mouse"){return;}if(!e.TOOLTIP_FORCE_VISIBLE&&window.CURRENT_TOOLTIP_ELEMENT&&!window.CURRENT_TOOLTIP_ELEMENT.contains(ev.relatedTarget)){setTooltipHoverTimeout(e,false);addClass(window.CURRENT_TOOLTIP_ELEMENT,"fade-out");}};});const sidebar_menu_toggle=document.getElementsByClassName("sidebar-menu-toggle")[0];if(sidebar_menu_toggle){sidebar_menu_toggle.addEventListener("click",()=>{const sidebar=document.getElementsByClassName("sidebar")[0];if(!hasClass(sidebar,"shown")){showSidebar();}else{hideSidebar();}});}function helpBlurHandler(event){const isInPopover=onEachLazy(document.querySelectorAll(".settings-menu, .help-menu"),menu=>{return menu.contains(document.activeElement)||menu.contains(event.relatedTarget);},);if(!isInPopover){window.hidePopoverMenus();}}function buildHelpMenu(){const book_info=document.createElement("span");const drloChannel=`https://doc.rust-lang.org/${getVar("channel")}`;book_info.className="top";book_info.innerHTML=`You can find more information in \ +the rustdoc book.`;const shortcuts=[["?","Show this help dialog"],["S / /","Focus the search field"],["↑","Move up in search results"],["↓","Move down in search results"],["← / →","Switch result tab (when results focused)"],["⏎","Go to active search result"],["+","Expand all sections"],["-","Collapse all sections"],["_","Collapse all sections, including impl blocks"],].map(x=>"

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%0A8W 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 z%0D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

"+x[0].split(" ").map((y,index)=>((index&1)===0?""+y+"":" "+y+" ")).join("")+"
"+x[1]+"
").join("");const div_shortcuts=document.createElement("div");addClass(div_shortcuts,"shortcuts");div_shortcuts.innerHTML="

Keyboard Shortcuts

"+shortcuts+"
";const infos=[`For a full list of all search features, take a look \ + here.`,"Prefix searches with a type followed by a colon (e.g., fn:) to \ + restrict the search to a given item kind.","Accepted kinds are: fn, mod, struct, \ + enum, trait, type, macro, \ + and const.","Search functions by type signature (e.g., vec -> usize or \ + -> vec or String, enum:Cow -> bool)","You can look for items with an exact name by putting double quotes around \ + your request: \"string\"",`Look for functions that accept or return \ + slices and \ + arrays by writing square \ + brackets (e.g., -> [u8] or [] -> Option)`,"Look for items inside another one by searching for a path: vec::Vec",].map(x=>"

"+x+"

").join("");const div_infos=document.createElement("div");addClass(div_infos,"infos");div_infos.innerHTML="

Search Tricks

"+infos;const rustdoc_version=document.createElement("span");rustdoc_version.className="bottom";const rustdoc_version_code=document.createElement("code");rustdoc_version_code.innerText="rustdoc "+getVar("rustdoc-version");rustdoc_version.appendChild(rustdoc_version_code);const container=document.createElement("div");if(!isHelpPage){container.className="popover content";}container.id="help";const side_by_side=document.createElement("div");side_by_side.className="side-by-side";side_by_side.appendChild(div_shortcuts);side_by_side.appendChild(div_infos);container.appendChild(book_info);container.appendChild(side_by_side);container.appendChild(rustdoc_version);if(isHelpPage){const help_section=document.createElement("section");help_section.appendChild(container);document.getElementById("main-content").appendChild(help_section);}else{onEachLazy(document.getElementsByClassName("help-menu"),menu=>{if(menu.offsetWidth!==0){menu.appendChild(container);container.onblur=helpBlurHandler;menu.onblur=helpBlurHandler;menu.children[0].onblur=helpBlurHandler;return true;}});}return container;}window.hideAllModals=switchFocus=>{hideSidebar();window.hidePopoverMenus();hideTooltip(switchFocus);};window.hidePopoverMenus=()=>{onEachLazy(document.querySelectorAll(".settings-menu .popover"),elem=>{elem.style.display="none";});onEachLazy(document.querySelectorAll(".help-menu .popover"),elem=>{elem.parentElement.removeChild(elem);});};function showHelp(){window.hideAllModals(false);onEachLazy(document.querySelectorAll(".help-menu a"),menu=>{if(menu.offsetWidth!==0){menu.focus();return true;}});buildHelpMenu();}if(isHelpPage){buildHelpMenu();}else{onEachLazy(document.querySelectorAll(".help-menu > a"),helpLink=>{helpLink.addEventListener("click",event=>{if(event.ctrlKey||event.altKey||event.metaKey){return;}event.preventDefault();if(document.getElementById("help")){window.hidePopoverMenus();}else{showHelp();}},);});}addSidebarItems();addSidebarCrates();onHashChange(null);window.addEventListener("hashchange",onHashChange);window.searchState.setup();}());(function(){const SIDEBAR_MIN=100;const SIDEBAR_MAX=500;const RUSTDOC_MOBILE_BREAKPOINT=700;const BODY_MIN=400;const SIDEBAR_VANISH_THRESHOLD=SIDEBAR_MIN/2;let sidebarButton=document.getElementById("sidebar-button");const body=document.querySelector(".main-heading");if(!sidebarButton&&body){sidebarButton=document.createElement("div");sidebarButton.id="sidebar-button";const path=`${window.rootPath}${window.currentCrate}/all.html`;sidebarButton.innerHTML=``;body.insertBefore(sidebarButton,body.firstChild);}if(sidebarButton){sidebarButton.addEventListener("click",e=>{removeClass(document.documentElement,"hide-sidebar");updateLocalStorage("hide-sidebar","false");if(document.querySelector(".rustdoc.src")){window.rustdocToggleSrcSidebar();}e.preventDefault();});}let currentPointerId=null;let desiredSidebarSize=null;let pendingSidebarResizingFrame=false;const resizer=document.querySelector(".sidebar-resizer");const sidebar=document.querySelector(".sidebar");if(!resizer||!sidebar){return;}const isSrcPage=hasClass(document.body,"src");const hideSidebar=function(){if(isSrcPage){window.rustdocCloseSourceSidebar();updateLocalStorage("src-sidebar-width",null);document.documentElement.style.removeProperty("--src-sidebar-width");sidebar.style.removeProperty("--src-sidebar-width");resizer.style.removeProperty("--src-sidebar-width");}else{addClass(document.documentElement,"hide-sidebar");updateLocalStorage("hide-sidebar","true");updateLocalStorage("desktop-sidebar-width",null);document.documentElement.style.removeProperty("--desktop-sidebar-width");sidebar.style.removeProperty("--desktop-sidebar-width");resizer.style.removeProperty("--desktop-sidebar-width");}};const showSidebar=function(){if(isSrcPage){window.rustdocShowSourceSidebar();}else{removeClass(document.documentElement,"hide-sidebar");updateLocalStorage("hide-sidebar","false");}};const changeSidebarSize=function(size){if(isSrcPage){updateLocalStorage("src-sidebar-width",size.toString());sidebar.style.setProperty("--src-sidebar-width",size+"px");resizer.style.setProperty("--src-sidebar-width",size+"px");}else{updateLocalStorage("desktop-sidebar-width",size.toString());sidebar.style.setProperty("--desktop-sidebar-width",size+"px");resizer.style.setProperty("--desktop-sidebar-width",size+"px");}};const isSidebarHidden=function(){return isSrcPage?!hasClass(document.documentElement,"src-sidebar-expanded"):hasClass(document.documentElement,"hide-sidebar");};const resize=function(e){if(currentPointerId===null||currentPointerId!==e.pointerId){return;}e.preventDefault();const pos=e.clientX-3;if(pos=SIDEBAR_MIN){if(isSidebarHidden()){showSidebar();}const constrainedPos=Math.min(pos,window.innerWidth-BODY_MIN,SIDEBAR_MAX);changeSidebarSize(constrainedPos);desiredSidebarSize=constrainedPos;if(pendingSidebarResizingFrame!==false){clearTimeout(pendingSidebarResizingFrame);}pendingSidebarResizingFrame=setTimeout(()=>{if(currentPointerId===null||pendingSidebarResizingFrame===false){return;}pendingSidebarResizingFrame=false;document.documentElement.style.setProperty("--resizing-sidebar-width",desiredSidebarSize+"px",);},100);}};window.addEventListener("resize",()=>{if(window.innerWidth=(window.innerWidth-BODY_MIN)){changeSidebarSize(window.innerWidth-BODY_MIN);}else if(desiredSidebarSize!==null&&desiredSidebarSize>SIDEBAR_MIN){changeSidebarSize(desiredSidebarSize);}});const stopResize=function(e){if(currentPointerId===null){return;}if(e){e.preventDefault();}desiredSidebarSize=sidebar.getBoundingClientRect().width;removeClass(resizer,"active");window.removeEventListener("pointermove",resize,false);window.removeEventListener("pointerup",stopResize,false);removeClass(document.documentElement,"sidebar-resizing");document.documentElement.style.removeProperty("--resizing-sidebar-width");if(resizer.releasePointerCapture){resizer.releasePointerCapture(currentPointerId);currentPointerId=null;}};const initResize=function(e){if(currentPointerId!==null||e.altKey||e.ctrlKey||e.metaKey||e.button!==0){return;}if(resizer.setPointerCapture){resizer.setPointerCapture(e.pointerId);if(!resizer.hasPointerCapture(e.pointerId)){resizer.releasePointerCapture(e.pointerId);return;}currentPointerId=e.pointerId;}window.hideAllModals(false);e.preventDefault();window.addEventListener("pointermove",resize,false);window.addEventListener("pointercancel",stopResize,false);window.addEventListener("pointerup",stopResize,false);addClass(resizer,"active");addClass(document.documentElement,"sidebar-resizing");const pos=e.clientX-sidebar.offsetLeft-3;document.documentElement.style.setProperty("--resizing-sidebar-width",pos+"px");desiredSidebarSize=null;};resizer.addEventListener("pointerdown",initResize,false);}());(function(){function copyContentToClipboard(content){if(content===null){return;}const el=document.createElement("textarea");el.value=content;el.setAttribute("readonly","");el.style.position="absolute";el.style.left="-9999px";document.body.appendChild(el);el.select();document.execCommand("copy");document.body.removeChild(el);}function copyButtonAnimation(button){button.classList.add("clicked");if(button.reset_button_timeout!==undefined){clearTimeout(button.reset_button_timeout);}button.reset_button_timeout=setTimeout(()=>{button.reset_button_timeout=undefined;button.classList.remove("clicked");},1000);}const but=document.getElementById("copy-path");if(!but){return;}but.onclick=()=>{const titleElement=document.querySelector("title");const title=titleElement&&titleElement.textContent?titleElement.textContent.replace(" - Rust",""):"";const[item,module]=title.split(" in ");const path=[item];if(module!==undefined){path.unshift(module);}copyContentToClipboard(path.join("::"));copyButtonAnimation(but);};function copyCode(codeElem){if(!codeElem){return;}copyContentToClipboard(codeElem.textContent);}function getExampleWrap(event){const target=event.target;if(target instanceof HTMLElement){let elem=target;while(elem!==null&&!hasClass(elem,"example-wrap")){if(elem===document.body||elem.tagName==="A"||elem.tagName==="BUTTON"||hasClass(elem,"docblock")){return null;}elem=elem.parentElement;}return elem;}else{return null;}}function addCopyButton(event){const elem=getExampleWrap(event);if(elem===null){return;}elem.removeEventListener("mouseover",addCopyButton);const parent=document.createElement("div");parent.className="button-holder";const runButton=elem.querySelector(".test-arrow");if(runButton!==null){parent.appendChild(runButton);}elem.appendChild(parent);const copyButton=document.createElement("button");copyButton.className="copy-button";copyButton.title="Copy code to clipboard";copyButton.addEventListener("click",()=>{copyCode(elem.querySelector("pre > code"));copyButtonAnimation(copyButton);});parent.appendChild(copyButton);if(!elem.parentElement||!elem.parentElement.classList.contains("scraped-example")||!window.updateScrapedExample){return;}const scrapedWrapped=elem.parentElement;window.updateScrapedExample(scrapedWrapped,parent);}function showHideCodeExampleButtons(event){const elem=getExampleWrap(event);if(elem===null){return;}let buttons=elem.querySelector(".button-holder");if(buttons===null){addCopyButton(event);buttons=elem.querySelector(".button-holder");if(buttons===null){return;}}buttons.classList.toggle("keep-visible");}onEachLazy(document.querySelectorAll(".docblock .example-wrap"),elem=>{elem.addEventListener("mouseover",addCopyButton);elem.addEventListener("click",showHideCodeExampleButtons);});}());(function(){document.body.addEventListener("copy",event=>{let target=nonnull(event.target);let isInsideCode=false;while(target&&target!==document.body){if(target.tagName==="CODE"){isInsideCode=true;break;}target=target.parentElement;}if(!isInsideCode){return;}const selection=document.getSelection();nonnull(event.clipboardData).setData("text/plain",selection.toString());event.preventDefault();});}()); \ No newline at end of file diff --git a/next/static.files/normalize-9960930a.css b/next/static.files/normalize-9960930a.css new file mode 100644 index 0000000..469959f --- /dev/null +++ b/next/static.files/normalize-9960930a.css @@ -0,0 +1,2 @@ + /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ +html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:0.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type="button"],[type="reset"],[type="submit"],button{-webkit-appearance:button}[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:0.35em 0.75em 0.625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none} \ No newline at end of file diff --git a/next/static.files/noscript-32bb7600.css b/next/static.files/noscript-32bb7600.css new file mode 100644 index 0000000..c228ec4 --- /dev/null +++ b/next/static.files/noscript-32bb7600.css @@ -0,0 +1 @@ + #main-content .attributes{margin-left:0 !important;}#copy-path,#sidebar-button,.sidebar-resizer{display:none !important;}nav.sub{display:none;}.src .sidebar{display:none;}.notable-traits{display:none;}:root,:root:not([data-theme]){--main-background-color:white;--main-color:black;--settings-input-color:#2196f3;--settings-input-border-color:#717171;--settings-button-color:#000;--settings-button-border-focus:#717171;--sidebar-background-color:#f5f5f5;--sidebar-background-color-hover:#e0e0e0;--sidebar-border-color:#ddd;--code-block-background-color:#f5f5f5;--scrollbar-track-background-color:#dcdcdc;--scrollbar-thumb-background-color:rgba(36,37,39,0.6);--scrollbar-color:rgba(36,37,39,0.6) #d9d9d9;--headings-border-bottom-color:#ddd;--border-color:#e0e0e0;--button-background-color:#fff;--right-side-color:grey;--code-attribute-color:#999;--toggles-color:#999;--toggle-filter:none;--mobile-sidebar-menu-filter:none;--search-input-focused-border-color:#66afe9;--copy-path-button-color:#999;--copy-path-img-filter:invert(50%);--copy-path-img-hover-filter:invert(35%);--code-example-button-color:#7f7f7f;--code-example-button-hover-color:#595959;--settings-menu-filter:invert(50%);--settings-menu-hover-filter:invert(35%);--codeblock-error-hover-color:rgb(255,0,0);--codeblock-error-color:rgba(255,0,0,.5);--codeblock-ignore-hover-color:rgb(255,142,0);--codeblock-ignore-color:rgba(255,142,0,.6);--warning-border-color:#ff8e00;--type-link-color:#ad378a;--trait-link-color:#6e4fc9;--assoc-item-link-color:#3873ad;--function-link-color:#ad7c37;--macro-link-color:#068000;--keyword-link-color:#3873ad;--mod-link-color:#3873ad;--link-color:#3873ad;--sidebar-link-color:#356da4;--sidebar-current-link-background-color:#fff;--search-result-link-focus-background-color:#ccc;--search-result-border-color:#aaa3;--search-color:#000;--search-error-code-background-color:#d0cccc;--search-results-alias-color:#000;--search-results-grey-color:#999;--search-tab-title-count-color:#888;--search-tab-button-not-selected-border-top-color:#e6e6e6;--search-tab-button-not-selected-background:#e6e6e6;--search-tab-button-selected-border-top-color:#0089ff;--search-tab-button-selected-background:#fff;--stab-background-color:#fff5d6;--stab-code-color:#000;--code-highlight-kw-color:#8959a8;--code-highlight-kw-2-color:#4271ae;--code-highlight-lifetime-color:#b76514;--code-highlight-prelude-color:#4271ae;--code-highlight-prelude-val-color:#c82829;--code-highlight-number-color:#718c00;--code-highlight-string-color:#718c00;--code-highlight-literal-color:#c82829;--code-highlight-attribute-color:#c82829;--code-highlight-self-color:#c82829;--code-highlight-macro-color:#3e999f;--code-highlight-question-mark-color:#ff9011;--code-highlight-comment-color:#8e908c;--code-highlight-doc-comment-color:#4d4d4c;--src-line-numbers-span-color:#c67e2d;--src-line-number-highlighted-background-color:#fdffd3;--target-background-color:#fdffd3;--target-border-color:#ad7c37;--kbd-color:#000;--kbd-background:#fafbfc;--kbd-box-shadow-color:#c6cbd1;--rust-logo-filter:initial;--crate-search-div-filter:invert(100%) sepia(0%) saturate(4223%) hue-rotate(289deg) brightness(114%) contrast(76%);--crate-search-div-hover-filter:invert(44%) sepia(18%) saturate(23%) hue-rotate(317deg) brightness(96%) contrast(93%);--crate-search-hover-border:#717171;--src-sidebar-background-selected:#fff;--src-sidebar-background-hover:#e0e0e0;--table-alt-row-background-color:#f5f5f5;--codeblock-link-background:#eee;--scrape-example-toggle-line-background:#ccc;--scrape-example-toggle-line-hover-background:#999;--scrape-example-code-line-highlight:#fcffd6;--scrape-example-code-line-highlight-focus:#f6fdb0;--scrape-example-help-border-color:#555;--scrape-example-help-color:#333;--scrape-example-help-hover-border-color:#000;--scrape-example-help-hover-color:#000;--scrape-example-code-wrapper-background-start:rgba(255,255,255,1);--scrape-example-code-wrapper-background-end:rgba(255,255,255,0);--sidebar-resizer-hover:hsl(207,90%,66%);--sidebar-resizer-active:hsl(207,90%,54%);}@media (prefers-color-scheme:dark){:root,:root:not([data-theme]){--main-background-color:#353535;--main-color:#ddd;--settings-input-color:#2196f3;--settings-input-border-color:#999;--settings-button-color:#000;--settings-button-border-focus:#ffb900;--sidebar-background-color:#505050;--sidebar-background-color-hover:#676767;--sidebar-border-color:#2A2A2A;--code-block-background-color:#2A2A2A;--scrollbar-track-background-color:#717171;--scrollbar-thumb-background-color:rgba(32,34,37,.6);--scrollbar-color:rgba(32,34,37,.6) #5a5a5a;--headings-border-bottom-color:#d2d2d2;--border-color:#e0e0e0;--button-background-color:#f0f0f0;--right-side-color:grey;--code-attribute-color:#999;--toggles-color:#999;--toggle-filter:invert(100%);--mobile-sidebar-menu-filter:invert(100%);--search-input-focused-border-color:#008dfd;--copy-path-button-color:#999;--copy-path-img-filter:invert(50%);--copy-path-img-hover-filter:invert(65%);--code-example-button-color:#7f7f7f;--code-example-button-hover-color:#a5a5a5;--codeblock-error-hover-color:rgb(255,0,0);--codeblock-error-color:rgba(255,0,0,.5);--codeblock-ignore-hover-color:rgb(255,142,0);--codeblock-ignore-color:rgba(255,142,0,.6);--warning-border-color:#ff8e00;--type-link-color:#2dbfb8;--trait-link-color:#b78cf2;--assoc-item-link-color:#d2991d;--function-link-color:#2bab63;--macro-link-color:#09bd00;--keyword-link-color:#d2991d;--mod-link-color:#d2991d;--link-color:#d2991d;--sidebar-link-color:#fdbf35;--sidebar-current-link-background-color:#444;--search-result-link-focus-background-color:#616161;--search-result-border-color:#aaa3;--search-color:#111;--search-error-code-background-color:#484848;--search-results-alias-color:#fff;--search-results-grey-color:#ccc;--search-tab-title-count-color:#888;--search-tab-button-not-selected-border-top-color:#252525;--search-tab-button-not-selected-background:#252525;--search-tab-button-selected-border-top-color:#0089ff;--search-tab-button-selected-background:#353535;--settings-menu-filter:invert(50%);--settings-menu-hover-filter:invert(65%);--stab-background-color:#314559;--stab-code-color:#e6e1cf;--code-highlight-kw-color:#ab8ac1;--code-highlight-kw-2-color:#769acb;--code-highlight-lifetime-color:#d97f26;--code-highlight-prelude-color:#769acb;--code-highlight-prelude-val-color:#ee6868;--code-highlight-number-color:#83a300;--code-highlight-string-color:#83a300;--code-highlight-literal-color:#ee6868;--code-highlight-attribute-color:#ee6868;--code-highlight-self-color:#ee6868;--code-highlight-macro-color:#3e999f;--code-highlight-question-mark-color:#ff9011;--code-highlight-comment-color:#8d8d8b;--code-highlight-doc-comment-color:#8ca375;--src-line-numbers-span-color:#3b91e2;--src-line-number-highlighted-background-color:#0a042f;--target-background-color:#494a3d;--target-border-color:#bb7410;--kbd-color:#000;--kbd-background:#fafbfc;--kbd-box-shadow-color:#c6cbd1;--rust-logo-filter:drop-shadow(1px 0 0px #fff) drop-shadow(0 1px 0 #fff) drop-shadow(-1px 0 0 #fff) drop-shadow(0 -1px 0 #fff);--crate-search-div-filter:invert(94%) sepia(0%) saturate(721%) hue-rotate(255deg) brightness(90%) contrast(90%);--crate-search-div-hover-filter:invert(69%) sepia(60%) saturate(6613%) hue-rotate(184deg) brightness(100%) contrast(91%);--crate-search-hover-border:#2196f3;--src-sidebar-background-selected:#333;--src-sidebar-background-hover:#444;--table-alt-row-background-color:#2a2a2a;--codeblock-link-background:#333;--scrape-example-toggle-line-background:#999;--scrape-example-toggle-line-hover-background:#c5c5c5;--scrape-example-code-line-highlight:#5b3b01;--scrape-example-code-line-highlight-focus:#7c4b0f;--scrape-example-help-border-color:#aaa;--scrape-example-help-color:#eee;--scrape-example-help-hover-border-color:#fff;--scrape-example-help-hover-color:#fff;--scrape-example-code-wrapper-background-start:rgba(53,53,53,1);--scrape-example-code-wrapper-background-end:rgba(53,53,53,0);--sidebar-resizer-hover:hsl(207,30%,54%);--sidebar-resizer-active:hsl(207,90%,54%);}} \ No newline at end of file diff --git a/next/static.files/rust-logo-9a9549ea.svg b/next/static.files/rust-logo-9a9549ea.svg new file mode 100644 index 0000000..62424d8 --- /dev/null +++ b/next/static.files/rust-logo-9a9549ea.svg @@ -0,0 +1,61 @@ + + + diff --git a/next/static.files/rustdoc-528d32ef.css b/next/static.files/rustdoc-528d32ef.css new file mode 100644 index 0000000..0c9a676 --- /dev/null +++ b/next/static.files/rustdoc-528d32ef.css @@ -0,0 +1,76 @@ + :root{--nav-sub-mobile-padding:8px;--search-typename-width:6.75rem;--desktop-sidebar-width:200px;--src-sidebar-width:300px;--desktop-sidebar-z-index:100;--sidebar-elems-left-padding:24px;--clipboard-image:url('data:image/svg+xml,\ +\ +\ +');--copy-path-height:34px;--copy-path-width:33px;--checkmark-image:url('data:image/svg+xml,\ +\ +');--button-left-margin:4px;--button-border-radius:2px;--toolbar-button-border-radius:6px;--code-block-border-radius:6px;--impl-items-indent:0.3em;--docblock-indent:24px;--font-family:"Source Serif 4",NanumBarunGothic,serif;--font-family-code:"Source Code Pro",monospace;--line-number-padding:4px;--line-number-right-margin:20px;--prev-arrow-image:url('data:image/svg+xml,');--next-arrow-image:url('data:image/svg+xml,');--expand-arrow-image:url('data:image/svg+xml,');--collapse-arrow-image:url('data:image/svg+xml,');--hamburger-image:url('data:image/svg+xml,\ + ');}:root.sans-serif{--font-family:"Fira Sans",sans-serif;--font-family-code:"Fira Mono",monospace;}@font-face {font-family:'Fira Sans';font-style:normal;font-weight:400;src:local('Fira Sans'),url("FiraSans-Regular-0fe48ade.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Fira Sans';font-style:italic;font-weight:400;src:local('Fira Sans Italic'),url("FiraSans-Italic-81dc35de.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Fira Sans';font-style:normal;font-weight:500;src:local('Fira Sans Medium'),url("FiraSans-Medium-e1aa3f0a.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Fira Sans';font-style:italic;font-weight:500;src:local('Fira Sans Medium Italic'),url("FiraSans-MediumItalic-ccf7e434.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Fira Mono';font-style:normal;font-weight:400;src:local('Fira Mono'),url("FiraMono-Regular-87c26294.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Fira Mono';font-style:normal;font-weight:500;src:local('Fira Mono Medium'),url("FiraMono-Medium-86f75c8c.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Serif 4';font-style:normal;font-weight:400;src:local('Source Serif 4'),url("SourceSerif4-Regular-6b053e98.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Serif 4';font-style:italic;font-weight:400;src:local('Source Serif 4 Italic'),url("SourceSerif4-It-ca3b17ed.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Serif 4';font-style:normal;font-weight:500;src:local('Source Serif 4 Semibold'),url("SourceSerif4-Semibold-457a13ac.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Serif 4';font-style:normal;font-weight:700;src:local('Source Serif 4 Bold'),url("SourceSerif4-Bold-6d4fd4c0.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Code Pro';font-style:normal;font-weight:400;src:url("SourceCodePro-Regular-8badfe75.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Code Pro';font-style:italic;font-weight:400;src:url("SourceCodePro-It-fc8b9304.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Code Pro';font-style:normal;font-weight:600;src:url("SourceCodePro-Semibold-aa29a496.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'NanumBarunGothic';src:url("NanumBarunGothic-13b3dcba.ttf.woff2") format("woff2");font-display:swap;unicode-range:U+AC00-D7AF,U+1100-11FF,U+3130-318F,U+A960-A97F,U+D7B0-D7FF;}*{box-sizing:border-box;}body{font:1rem/1.5 var(--font-family);margin:0;position:relative;overflow-wrap:break-word;overflow-wrap:anywhere;font-feature-settings:"kern","liga";background-color:var(--main-background-color);color:var(--main-color);}h1{font-size:1.5rem;}h2{font-size:1.375rem;}h3{font-size:1.25rem;}h1,h2,h3,h4,h5,h6{font-weight:500;}h1,h2,h3,h4{margin:25px 0 15px 0;padding-bottom:6px;}.docblock h3,.docblock h4,h5,h6{margin:15px 0 5px 0;}.docblock>h2:first-child,.docblock>h3:first-child,.docblock>h4:first-child,.docblock>h5:first-child,.docblock>h6:first-child{margin-top:0;}.main-heading h1{margin:0;padding:0;grid-area:main-heading-h1;overflow-wrap:break-word;overflow-wrap:anywhere;}.main-heading{position:relative;display:grid;grid-template-areas:"main-heading-breadcrumbs main-heading-breadcrumbs" "main-heading-h1 main-heading-toolbar" "main-heading-sub-heading main-heading-toolbar";grid-template-columns:minmax(105px,1fr) minmax(0,max-content);grid-template-rows:minmax(25px,min-content) min-content min-content;padding-bottom:6px;margin-bottom:15px;}.search-results-main-heading{grid-template-areas:"main-heading-breadcrumbs main-heading-placeholder" "main-heading-breadcrumbs main-heading-toolbar " "main-heading-h1 main-heading-toolbar ";}.search-results-main-heading nav.sub{grid-area:main-heading-h1;align-items:end;margin:4px 0 8px 0;}.rustdoc-breadcrumbs{grid-area:main-heading-breadcrumbs;line-height:1.25;padding-top:5px;position:relative;z-index:1;}.search-switcher{grid-area:main-heading-breadcrumbs;line-height:1.5;display:flex;color:var(--main-color);align-items:baseline;white-space:nowrap;padding-top:8px;min-height:34px;}.rustdoc-breadcrumbs a{padding:5px 0 7px;}.content h2,.top-doc .docblock>h3,.top-doc .docblock>h4{border-bottom:1px solid var(--headings-border-bottom-color);}h1,h2{line-height:1.25;padding-top:3px;padding-bottom:9px;}h3.code-header{font-size:1.125rem;}h4.code-header{font-size:1rem;}.code-header{font-weight:600;margin:0;padding:0;white-space:pre-wrap;}.structfield,.sub-variant-field{margin:0.6em 0;}#crate-search,h1,h2,h3,h4,h5,h6,.sidebar,rustdoc-topbar,.search-input,.search-results .result-name,.item-table dt>a,.out-of-band,.sub-heading,span.since,a.src,rustdoc-toolbar,summary.hideme,.scraped-example-list,.rustdoc-breadcrumbs,.search-switcher,ul.all-items{font-family:"Fira Sans",Arial,NanumBarunGothic,sans-serif;}#toggle-all-docs,a.anchor,.section-header a,#src-sidebar a,.rust a,.sidebar h2 a,.sidebar h3 a,rustdoc-topbar h2 a,h1 a,.search-results a,.search-results li,.stab,.result-name i{color:var(--main-color);}span.enum,a.enum,span.struct,a.struct,span.union,a.union,span.primitive,a.primitive,span.type,a.type,span.foreigntype,a.foreigntype{color:var(--type-link-color);}span.trait,a.trait,span.traitalias,a.traitalias{color:var(--trait-link-color);}span.associatedtype,a.associatedtype,span.constant,a.constant,span.static,a.static{color:var(--assoc-item-link-color);}span.fn,a.fn,span.method,a.method,span.tymethod,a.tymethod{color:var(--function-link-color);}span.attr,a.attr,span.derive,a.derive,span.macro,a.macro{color:var(--macro-link-color);}span.mod,a.mod{color:var(--mod-link-color);}span.keyword,a.keyword{color:var(--keyword-link-color);}a{color:var(--link-color);text-decoration:none;}ol,ul{padding-left:24px;}ul ul,ol ul,ul ol,ol ol{margin-bottom:.625em;}p,.docblock>.warning{margin:0 0 .75em 0;}p:last-child,.docblock>.warning:last-child{margin:0;}button{padding:1px 6px;cursor:pointer;}button#toggle-all-docs{padding:0;background:none;border:none;-webkit-appearance:none;opacity:1;}.rustdoc{display:flex;flex-direction:row;flex-wrap:nowrap;}main{position:relative;flex-grow:1;padding:10px 15px 40px 45px;min-width:0;}.src main{padding:15px;}.width-limiter{max-width:960px;margin-right:auto;}details:not(.toggle) summary{margin-bottom:.6em;}code,pre,.code-header,.type-signature{font-family:var(--font-family-code);}.docblock code,.item-table dd code{border-radius:3px;padding:0 0.125em;}.docblock pre code,.item-table dd pre code{padding:0;}pre{padding:14px;line-height:1.5;}pre.item-decl{overflow-x:auto;}.item-decl .type-contents-toggle{contain:initial;}.src .content pre{padding:20px;padding-left:16px;}img{max-width:100%;}.logo-container{line-height:0;display:block;}.rust-logo{filter:var(--rust-logo-filter);}.sidebar{font-size:0.875rem;flex:0 0 var(--desktop-sidebar-width);width:var(--desktop-sidebar-width);overflow-y:scroll;overscroll-behavior:contain;position:sticky;height:100vh;top:0;left:0;z-index:var(--desktop-sidebar-z-index);border-right:solid 1px var(--sidebar-border-color);}.rustdoc.src .sidebar{flex-basis:50px;width:50px;overflow-x:hidden;overflow-y:hidden;}.hide-sidebar .sidebar,.hide-sidebar .sidebar-resizer{display:none;}.sidebar-resizer{touch-action:none;width:9px;cursor:ew-resize;z-index:calc(var(--desktop-sidebar-z-index) + 1);position:fixed;height:100%;left:var(--desktop-sidebar-width);display:flex;align-items:center;justify-content:flex-start;color:var(--right-side-color);}.sidebar-resizer::before{content:"";border-right:dotted 2px currentColor;width:2px;height:12px;}.sidebar-resizer::after{content:"";border-right:dotted 2px currentColor;width:2px;height:16px;}.rustdoc.src .sidebar-resizer{left:49px;}.src-sidebar-expanded .src .sidebar-resizer{left:var(--src-sidebar-width);}.sidebar-resizing{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;}.sidebar-resizing *{cursor:ew-resize !important;}.sidebar-resizing .sidebar{position:fixed;border-right:solid 2px var(--sidebar-resizer-active);}.sidebar-resizing>body{padding-left:var(--resizing-sidebar-width);}.sidebar-resizer:hover,.sidebar-resizer:active,.sidebar-resizer:focus,.sidebar-resizer.active{width:10px;margin:0;left:calc(var(--desktop-sidebar-width) - 1px);border-left:solid 1px var(--sidebar-resizer-hover);color:var(--sidebar-resizer-hover);}.src-sidebar-expanded .rustdoc.src .sidebar-resizer:hover,.src-sidebar-expanded .rustdoc.src .sidebar-resizer:active,.src-sidebar-expanded .rustdoc.src .sidebar-resizer:focus,.src-sidebar-expanded .rustdoc.src .sidebar-resizer.active{left:calc(var(--src-sidebar-width) - 1px);}@media (pointer:coarse){.sidebar-resizer{display:none !important;}.sidebar{border-right:none;}}.sidebar-resizer.active{padding:0 140px;width:calc(140px + 140px + 9px + 2px);margin-left:-140px;border-left:none;color:var(--sidebar-resizer-active);}.sidebar,rustdoc-topbar,.sidebar-menu-toggle,#src-sidebar{background-color:var(--sidebar-background-color);}.src .sidebar>*{visibility:hidden;}.src-sidebar-expanded .src .sidebar{overflow-y:auto;flex-basis:var(--src-sidebar-width);width:var(--src-sidebar-width);}.src-sidebar-expanded .src .sidebar>*{visibility:visible;}#all-types{margin-top:1em;}*{scrollbar-width:initial;scrollbar-color:var(--scrollbar-color);}.sidebar{scrollbar-width:thin;scrollbar-color:var(--scrollbar-color);}::-webkit-scrollbar{width:12px;}.sidebar::-webkit-scrollbar{width:8px;}::-webkit-scrollbar-track{-webkit-box-shadow:inset 0;background-color:var(--scrollbar-track-background-color);}.sidebar::-webkit-scrollbar-track{background-color:var(--scrollbar-track-background-color);}::-webkit-scrollbar-thumb,.sidebar::-webkit-scrollbar-thumb{background-color:var(--scrollbar-thumb-background-color);}.hidden{display:none !important;}.logo-container>img{height:48px;width:48px;}ul.block,.block li,.block ul{padding:0;margin:0;list-style:none;}.block ul a{padding-left:1rem;}.sidebar-elems a,.sidebar>h2 a{display:block;padding:0.25rem;margin-right:0.25rem;border-left:solid var(--sidebar-elems-left-padding) transparent;margin-left:calc(-0.25rem - var(--sidebar-elems-left-padding));background-clip:border-box;}.hide-toc #rustdoc-toc,.hide-toc .in-crate{display:none;}.hide-modnav #rustdoc-modnav{display:none;}.sidebar h2{text-wrap:balance;overflow-wrap:anywhere;padding:0;margin:0.7rem 0;}.sidebar h3{text-wrap:balance;overflow-wrap:anywhere;font-size:1.125rem;padding:0;margin:0;}.sidebar-elems,.sidebar>.version,.sidebar>h2{padding-left:var(--sidebar-elems-left-padding);}.sidebar a{color:var(--sidebar-link-color);}.sidebar .current,.sidebar .current a,.sidebar-crate a.logo-container:hover+h2 a,.sidebar a:hover:not(.logo-container){background-color:var(--sidebar-current-link-background-color);}.sidebar-elems .block{margin-bottom:2em;}.sidebar-elems .block li a{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;}.sidebar-crate{display:flex;align-items:center;justify-content:center;margin:14px 32px 1rem;row-gap:10px;column-gap:32px;flex-wrap:wrap;}.sidebar-crate h2{flex-grow:1;margin:0 -8px;align-self:start;}.sidebar-crate .logo-container{margin:0 calc(-16px - var(--sidebar-elems-left-padding));padding:0 var(--sidebar-elems-left-padding);text-align:center;}.sidebar-crate .logo-container img{margin-top:-16px;border-top:solid 16px transparent;box-sizing:content-box;position:relative;background-clip:border-box;z-index:1;}.sidebar-crate h2 a{display:block;border-left:solid var(--sidebar-elems-left-padding) transparent;background-clip:border-box;margin:0 calc(-24px + 0.25rem) 0 calc(-0.2rem - var(--sidebar-elems-left-padding));padding:calc((16px - 0.57rem ) / 2 ) 0.25rem;padding-left:0.2rem;}.sidebar-crate h2 .version{display:block;font-weight:normal;font-size:1rem;overflow-wrap:break-word;}.sidebar-crate+.version{margin-top:-1rem;margin-bottom:1rem;}rustdoc-topbar{display:none;}.rustdoc .example-wrap{display:flex;position:relative;margin-bottom:10px;}.rustdoc .example-wrap>pre,.rustdoc .scraped-example .src-line-numbers,.rustdoc .scraped-example .src-line-numbers>pre{border-radius:6px;}.rustdoc .scraped-example{position:relative;}.rustdoc .example-wrap:last-child{margin-bottom:0px;}.rustdoc .example-wrap pre{margin:0;flex-grow:1;}.scraped-example:not(.expanded) .example-wrap{max-height:calc(1.5em * 5 + 10px);}.more-scraped-examples .scraped-example:not(.expanded) .example-wrap{max-height:calc(1.5em * 10 + 10px);}.rustdoc:not(.src) .scraped-example:not(.expanded) .src-line-numbers,.rustdoc:not(.src) .scraped-example:not(.expanded) .src-line-numbers>pre,.rustdoc:not(.src) .scraped-example:not(.expanded) pre.rust{padding-bottom:0;overflow:auto hidden;}.rustdoc:not(.src) .scraped-example .src-line-numbers{padding-top:0;}.rustdoc:not(.src) .scraped-example.expanded .src-line-numbers{padding-bottom:0;}.rustdoc:not(.src) .example-wrap pre{overflow:auto;}.example-wrap code{position:relative;}.example-wrap pre code span{display:inline;}.example-wrap.digits-1{--example-wrap-digits-count:1ch;}.example-wrap.digits-2{--example-wrap-digits-count:2ch;}.example-wrap.digits-3{--example-wrap-digits-count:3ch;}.example-wrap.digits-4{--example-wrap-digits-count:4ch;}.example-wrap.digits-5{--example-wrap-digits-count:5ch;}.example-wrap.digits-6{--example-wrap-digits-count:6ch;}.example-wrap.digits-7{--example-wrap-digits-count:7ch;}.example-wrap.digits-8{--example-wrap-digits-count:8ch;}.example-wrap.digits-9{--example-wrap-digits-count:9ch;}.example-wrap [data-nosnippet]{width:calc(var(--example-wrap-digits-count) + var(--line-number-padding) * 2);}.example-wrap pre>code{padding-left:calc(var(--example-wrap-digits-count) + var(--line-number-padding) * 2 + var(--line-number-right-margin));}.example-wrap [data-nosnippet]{color:var(--src-line-numbers-span-color);text-align:right;display:inline-block;margin-right:var(--line-number-right-margin);-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;padding:0 var(--line-number-padding);position:absolute;left:0;}.example-wrap .line-highlighted[data-nosnippet]{background-color:var(--src-line-number-highlighted-background-color);}.example-wrap pre>code{position:relative;display:block;}:root.word-wrap-source-code .example-wrap pre>code{word-break:break-all;white-space:pre-wrap;}:root.word-wrap-source-code .example-wrap pre>code *{word-break:break-all;}.example-wrap [data-nosnippet]:target{border-right:none;}.example-wrap.hide-lines [data-nosnippet]{display:none;}.search-loading{text-align:center;}.item-table dd{overflow-wrap:break-word;overflow-wrap:anywhere;}.docblock :not(pre)>code,.item-table dd code{white-space:pre-wrap;}.top-doc .docblock h2{font-size:1.375rem;}.top-doc .docblock h3{font-size:1.25rem;}.top-doc .docblock h4,.top-doc .docblock h5{font-size:1.125rem;}.top-doc .docblock h6{font-size:1rem;}.docblock h5{font-size:1rem;}.docblock h6{font-size:0.875rem;}.docblock{margin-left:var(--docblock-indent);position:relative;}.docblock>:not(.more-examples-toggle):not(.example-wrap){max-width:100%;overflow-x:auto;}.sub-heading{font-size:1rem;flex-grow:0;grid-area:main-heading-sub-heading;line-height:1.25;padding-bottom:4px;}.main-heading rustdoc-toolbar,.main-heading .out-of-band{grid-area:main-heading-toolbar;}rustdoc-toolbar{display:flex;flex-direction:row;flex-wrap:nowrap;min-height:60px;}.docblock code,.item-table dd code,pre,.rustdoc.src .example-wrap,.example-wrap .src-line-numbers{background-color:var(--code-block-background-color);border-radius:var(--code-block-border-radius);text-decoration:inherit;}#main-content{position:relative;}.docblock table{margin:.5em 0;border-collapse:collapse;}.docblock table td,.docblock table th{padding:.5em;border:1px solid var(--border-color);}.docblock table tbody tr:nth-child(2n){background:var(--table-alt-row-background-color);}.docblock .stab,.item-table dd .stab,.docblock p code{display:inline-block;}.docblock li{margin-bottom:.4em;}.docblock li p:not(:last-child){margin-bottom:.3em;}div.where{white-space:pre-wrap;font-size:0.875rem;}.item-info{display:block;margin-left:var(--docblock-indent);}.impl-items>.item-info{margin-left:calc(var(--docblock-indent) + var(--impl-items-indent));}.item-info code{font-size:0.875rem;}#main-content>.item-info{margin-left:0;}nav.sub{flex-grow:1;flex-flow:row nowrap;display:flex;align-items:start;margin-top:4px;}.search-form{position:relative;display:flex;height:34px;flex-grow:1;}.src nav.sub{margin:0 0 -10px 0;}.section-header{display:block;position:relative;}.section-header:hover>.anchor,.impl:hover>.anchor,.trait-impl:hover>.anchor,.variant:hover>.anchor{display:initial;}.anchor{display:none;position:absolute;left:-0.5em;background:none !important;}.anchor.field{left:-5px;}.section-header>.anchor{left:-15px;padding-right:8px;}h2.section-header>.anchor{padding-right:6px;}a.doc-anchor{color:var(--main-color);display:none;position:absolute;left:-17px;padding-right:10px;padding-left:3px;}*:hover>.doc-anchor{display:block;}.top-doc>.docblock>*:first-child>.doc-anchor{display:none !important;}.main-heading a:hover,.example-wrap .rust a:hover:not([data-nosnippet]),.all-items a:hover,.docblock a:not(.scrape-help):not(.tooltip):hover:not(.doc-anchor),.item-table dd a:not(.scrape-help):not(.tooltip):hover,.item-info a{text-decoration:underline;}.crate.block li.current a{font-weight:500;}table,.item-table{overflow-wrap:break-word;}.item-table{padding:0;margin:0;width:100%;}.item-table>dt{padding-right:1.25rem;}.item-table>dd{margin-inline-start:0;margin-left:0;}#crate-search-div{position:relative;min-width:0;margin-top:-1px;}#crate-search{padding:0 23px 0 4px;max-width:100%;text-overflow:ellipsis;border:1px solid var(--border-color);border-radius:4px;outline:none;cursor:pointer;-moz-appearance:none;-webkit-appearance:none;text-indent:0.01px;background-color:var(--main-background-color);color:inherit;line-height:1.5;font-weight:500;}#crate-search:hover,#crate-search:focus{border-color:var(--crate-search-hover-border);}#crate-search-div::after{pointer-events:none;width:100%;height:100%;position:absolute;top:0;left:0;content:"";background-repeat:no-repeat;background-size:20px;background-position:calc(100% - 2px) 56%;background-image:url('data:image/svg+xml, \ + ');filter:var(--crate-search-div-filter);}#crate-search-div:hover::after,#crate-search-div:focus-within::after{filter:var(--crate-search-div-hover-filter);}#crate-search>option{font-size:1rem;}.search-input{-webkit-appearance:none;outline:none;border:1px solid var(--border-color);border-radius:2px;padding:8px;font-size:1rem;flex-grow:1;background-color:var(--button-background-color);color:var(--search-color);max-width:100%;}.search-input:focus{border-color:var(--search-input-focused-border-color);}.search-results{display:none;}.search-results.active{display:block;margin:0;padding:0;}.search-results>a{display:grid;grid-template-areas:"search-result-name search-result-desc" "search-result-type-signature search-result-type-signature";grid-template-columns:.6fr .4fr;margin-left:2px;margin-right:2px;border-bottom:1px solid var(--search-result-border-color);column-gap:1em;}.search-results>a>div.desc{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;grid-area:search-result-desc;}.search-results a:hover,.search-results a:focus{background-color:var(--search-result-link-focus-background-color);}.search-results .result-name{display:flex;align-items:center;justify-content:start;grid-area:search-result-name;}.search-results .result-name .alias{color:var(--search-results-alias-color);}.search-results .result-name .grey{color:var(--search-results-grey-color);}.search-results .result-name .typename{color:var(--search-results-grey-color);font-size:0.875rem;width:var(--search-typename-width);}.search-results .result-name .path{word-break:break-all;max-width:calc(100% - var(--search-typename-width));display:inline-block;}.search-results .result-name .path>*{display:inline;}.search-results .type-signature{grid-area:search-result-type-signature;white-space:pre-wrap;}.popover{position:absolute;top:100%;right:0;z-index:calc(var(--desktop-sidebar-z-index) + 1);margin-top:7px;border-radius:3px;border:1px solid var(--border-color);background-color:var(--main-background-color);color:var(--main-color);--popover-arrow-offset:11px;}.popover::before{content:'';position:absolute;right:var(--popover-arrow-offset);border:solid var(--border-color);border-width:1px 1px 0 0;background-color:var(--main-background-color);padding:4px;transform:rotate(-45deg);top:-5px;}.setting-line{margin:1.2em 0.6em;}.setting-radio input,.setting-check input{margin-right:0.3em;height:1.2rem;width:1.2rem;border:2px solid var(--settings-input-border-color);outline:none;-webkit-appearance:none;cursor:pointer;}.setting-radio input{border-radius:50%;}.setting-radio span,.setting-check span{padding-bottom:1px;}.setting-radio{margin-top:0.1em;margin-bottom:0.1em;min-width:3.8em;padding:0.3em;display:inline-flex;align-items:center;cursor:pointer;}.setting-radio+.setting-radio{margin-left:0.5em;}.setting-check{margin-right:20px;display:flex;align-items:center;cursor:pointer;}.setting-check input{flex-shrink:0;}.setting-radio input:checked{box-shadow:inset 0 0 0 3px var(--main-background-color);background-color:var(--settings-input-color);}.setting-check input:checked{background-color:var(--settings-input-color);border-width:1px;content:url('data:image/svg+xml,\ + \ + ');}.setting-radio input:focus,.setting-check input:focus{box-shadow:0 0 1px 1px var(--settings-input-color);}.setting-radio input:checked:focus{box-shadow:inset 0 0 0 3px var(--main-background-color),0 0 2px 2px var(--settings-input-color);}.setting-radio input:hover,.setting-check input:hover{border-color:var(--settings-input-color) !important;}#settings.popover{--popover-arrow-offset:196px;top:calc(100% - 16px);}#help.popover{max-width:600px;--popover-arrow-offset:115px;top:calc(100% - 16px);}#help dt{float:left;clear:left;margin-right:0.5rem;}#help dd{margin-bottom:0.5rem;}#help span.top,#help span.bottom{text-align:center;display:block;font-size:1.125rem;padding:0 0.5rem;text-wrap-style:balance;}#help span.top{margin:10px 0;border-bottom:1px solid var(--border-color);padding-bottom:4px;margin-bottom:6px;}#help span.bottom{clear:both;border-top:1px solid var(--border-color);}.side-by-side{display:flex;margin-bottom:20px;}.side-by-side>div{width:50%;padding:0 20px 0 17px;}.item-info .stab{display:block;padding:3px;margin-bottom:5px;}.item-table dt .stab{margin-left:0.3125em;}.stab{padding:0 2px;font-size:0.875rem;font-weight:normal;color:var(--main-color);background-color:var(--stab-background-color);width:fit-content;white-space:pre-wrap;border-radius:3px;display:inline;vertical-align:baseline;}.stab.portability>code{background:none;color:var(--stab-code-color);}.stab .emoji,.item-info .stab::before{font-size:1.25rem;}.stab .emoji{margin-right:0.3rem;}.item-info .stab::before{content:"\0";width:0;display:inline-block;color:transparent;}.emoji{text-shadow:1px 0 0 black,-1px 0 0 black,0 1px 0 black,0 -1px 0 black;}.since{font-weight:normal;font-size:initial;}.rightside{padding-left:12px;float:right;}.rightside:not(a),.out-of-band,.sub-heading,rustdoc-toolbar{color:var(--right-side-color);}pre.rust{tab-size:4;-moz-tab-size:4;}pre.rust .kw{color:var(--code-highlight-kw-color);}pre.rust .kw-2{color:var(--code-highlight-kw-2-color);}pre.rust .lifetime{color:var(--code-highlight-lifetime-color);}pre.rust .prelude-ty{color:var(--code-highlight-prelude-color);}pre.rust .prelude-val{color:var(--code-highlight-prelude-val-color);}pre.rust .string{color:var(--code-highlight-string-color);}pre.rust .number{color:var(--code-highlight-number-color);}pre.rust .bool-val{color:var(--code-highlight-literal-color);}pre.rust .self{color:var(--code-highlight-self-color);}pre.rust .attr{color:var(--code-highlight-attribute-color);}pre.rust .macro,pre.rust .macro-nonterminal{color:var(--code-highlight-macro-color);}pre.rust .question-mark{font-weight:bold;color:var(--code-highlight-question-mark-color);}pre.rust .comment{color:var(--code-highlight-comment-color);}pre.rust .doccomment{color:var(--code-highlight-doc-comment-color);}.rustdoc.src .example-wrap pre.rust a:not([data-nosnippet]){background:var(--codeblock-link-background);}.example-wrap.compile_fail,.example-wrap.should_panic{border-left:2px solid var(--codeblock-error-color);}.ignore.example-wrap{border-left:2px solid var(--codeblock-ignore-color);}.example-wrap.compile_fail:hover,.example-wrap.should_panic:hover{border-left:2px solid var(--codeblock-error-hover-color);}.example-wrap.ignore:hover{border-left:2px solid var(--codeblock-ignore-hover-color);}.example-wrap.compile_fail .tooltip,.example-wrap.should_panic .tooltip{color:var(--codeblock-error-color);}.example-wrap.ignore .tooltip{color:var(--codeblock-ignore-color);}.example-wrap.compile_fail:hover .tooltip,.example-wrap.should_panic:hover .tooltip{color:var(--codeblock-error-hover-color);}.example-wrap.ignore:hover .tooltip{color:var(--codeblock-ignore-hover-color);}.example-wrap .tooltip{position:absolute;display:block;left:-25px;top:5px;margin:0;line-height:1;}.example-wrap.compile_fail .tooltip,.example-wrap.should_panic .tooltip,.example-wrap.ignore .tooltip{font-weight:bold;font-size:1.25rem;}.content .docblock .warning{border-left:2px solid var(--warning-border-color);padding:14px;position:relative;overflow-x:visible !important;}.content .docblock .warning::before{color:var(--warning-border-color);content:"ⓘ";position:absolute;left:-25px;top:5px;font-weight:bold;font-size:1.25rem;}.top-doc>.docblock>.warning:first-child::before{top:20px;}.example-wrap>a.test-arrow,.example-wrap .button-holder{visibility:hidden;position:absolute;top:4px;right:4px;z-index:1;}a.test-arrow{height:var(--copy-path-height);padding:6px 4px 0 11px;}a.test-arrow::before{content:url('data:image/svg+xml,');}.example-wrap .button-holder{display:flex;}@media not (pointer:coarse){.example-wrap:hover>a.test-arrow,.example-wrap:hover>.button-holder{visibility:visible;}}.example-wrap .button-holder.keep-visible{visibility:visible;}.example-wrap .button-holder>*{background:var(--main-background-color);cursor:pointer;border-radius:var(--button-border-radius);height:var(--copy-path-height);width:var(--copy-path-width);border:0;color:var(--code-example-button-color);}.example-wrap .button-holder>*:hover{color:var(--code-example-button-hover-color);}.example-wrap .button-holder>*:not(:first-child){margin-left:var(--button-left-margin);}.example-wrap .button-holder .copy-button{padding:2px 0 0 4px;}.example-wrap .button-holder .copy-button::before,.example-wrap .test-arrow::before,.example-wrap .button-holder .prev::before,.example-wrap .button-holder .next::before,.example-wrap .button-holder .expand::before{filter:var(--copy-path-img-filter);}.example-wrap .button-holder .copy-button::before{content:var(--clipboard-image);}.example-wrap .button-holder .copy-button:hover::before,.example-wrap .test-arrow:hover::before{filter:var(--copy-path-img-hover-filter);}.example-wrap .button-holder .copy-button.clicked::before{content:var(--checkmark-image);padding-right:5px;}.example-wrap .button-holder .prev,.example-wrap .button-holder .next,.example-wrap .button-holder .expand{line-height:0px;}.example-wrap .button-holder .prev::before{content:var(--prev-arrow-image);}.example-wrap .button-holder .next::before{content:var(--next-arrow-image);}.example-wrap .button-holder .expand::before{content:var(--expand-arrow-image);}.example-wrap .button-holder .expand.collapse::before{content:var(--collapse-arrow-image);}.code-attribute{font-weight:300;color:var(--code-attribute-color);}.item-spacer{width:100%;height:12px;display:block;}.main-heading span.since::before{content:"Since ";}.sub-variant h4{font-size:1rem;font-weight:400;margin-top:0;margin-bottom:0;}.sub-variant{margin-left:24px;margin-bottom:40px;}.sub-variant>.sub-variant-field{margin-left:24px;}@keyframes targetfadein{from{background-color:var(--main-background-color);}10%{background-color:var(--target-border-color);}to{background-color:var(--target-background-color);}}:target:not([data-nosnippet]){background-color:var(--target-background-color);border-right:3px solid var(--target-border-color);}a.tooltip{font-family:var(--font-family);}.code-header a.tooltip{color:inherit;margin-right:15px;position:relative;}.code-header a.tooltip:hover{color:var(--link-color);}a.tooltip:hover::after{position:absolute;top:calc(100% - 10px);left:-15px;right:-15px;height:20px;content:"\00a0";}@media not (prefers-reduced-motion){:target{animation:0.65s cubic-bezier(0,0,0.1,1.0) 0.1s targetfadein;}.fade-out{opacity:0;transition:opacity 0.45s cubic-bezier(0,0,0.1,1.0);}}.popover.tooltip .content{margin:0.25em 0.5em;}.popover.tooltip .content pre,.popover.tooltip .content code{background:transparent;margin:0;padding:0;font-size:1.25rem;white-space:pre-wrap;}.popover.tooltip .content>h3:first-child{margin:0 0 5px 0;}.search-failed{text-align:center;margin-top:20px;display:none;}.search-failed.active{display:block;}.search-failed>ul{text-align:left;max-width:570px;margin-left:auto;margin-right:auto;}#search-tabs{margin-top:0.25rem;display:flex;flex-direction:row;gap:1px;margin-bottom:4px;}#search-tabs button{text-align:center;font-size:1.125rem;border:0;border-top:2px solid;flex:1;line-height:1.5;color:inherit;}#search-tabs button:not(.selected){--search-tab-button-background:var(--search-tab-button-not-selected-background);background-color:var(--search-tab-button-not-selected-background);border-top-color:var(--search-tab-button-not-selected-border-top-color);}#search-tabs button:hover,#search-tabs button.selected{--search-tab-button-background:var(--search-tab-button-selected-background);background-color:var(--search-tab-button-selected-background);border-top-color:var(--search-tab-button-selected-border-top-color);}#search-tabs .count{font-size:1rem;font-variant-numeric:tabular-nums;color:var(--search-tab-title-count-color);position:relative;}#search-tabs .count.loading{color:transparent;}.search-form.loading{--search-tab-button-background:var(--button-background-color);}#search-tabs .count.loading::before,.search-form.loading::before{width:16px;height:16px;border-radius:16px;background:radial-gradient(var(--search-tab-button-background) 0 50%,transparent 50% 100%),conic-gradient(var(--code-highlight-kw-color) 0deg 30deg,var(--code-highlight-prelude-color) 30deg 60deg,var(--code-highlight-number-color) 90deg 120deg,var(--code-highlight-lifetime-color) 120deg 150deg,var(--code-highlight-comment-color) 150deg 180deg,var(--code-highlight-self-color) 180deg 210deg,var(--code-highlight-attribute-color) 210deg 240deg,var(--code-highlight-literal-color) 210deg 240deg,var(--code-highlight-macro-color) 240deg 270deg,var(--code-highlight-question-mark-color) 270deg 300deg,var(--code-highlight-prelude-val-color) 300deg 330deg,var(--code-highlight-doc-comment-color) 330deg 360deg);content:"";position:absolute;left:2px;top:2px;animation:rotating 1.25s linear infinite;}#search-tabs .count.loading::after,.search-form.loading::after{width:18px;height:18px;border-radius:18px;background:conic-gradient(var(--search-tab-button-background) 0deg 180deg,transparent 270deg 360deg);content:"";position:absolute;left:1px;top:1px;animation:rotating 0.66s linear infinite;}.search-form.loading::before{left:auto;right:9px;top:8px;}.search-form.loading::after{left:auto;right:8px;top:8px;}#search .error code{border-radius:3px;background-color:var(--search-error-code-background-color);}.search-corrections{font-weight:normal;}#src-sidebar{width:100%;overflow:auto;}#src-sidebar div.files>a:hover,details.dir-entry summary:hover,#src-sidebar div.files>a:focus,details.dir-entry summary:focus{background-color:var(--src-sidebar-background-hover);}#src-sidebar div.files>a.selected{background-color:var(--src-sidebar-background-selected);}.src-sidebar-title{position:sticky;top:0;display:flex;padding:8px 8px 0 48px;margin-bottom:7px;background:var(--sidebar-background-color);border-bottom:1px solid var(--border-color);}#search-button,.settings-menu,.help-menu,button#toggle-all-docs{margin-left:var(--button-left-margin);display:flex;line-height:1.25;min-width:14px;}#sidebar-button{display:none;line-height:0;}.hide-sidebar #sidebar-button,.src #sidebar-button{display:flex;margin-right:4px;position:fixed;margin-top:25px;left:6px;height:34px;width:34px;z-index:calc(var(--desktop-sidebar-z-index) + 1);}.hide-sidebar #sidebar-button{left:6px;background-color:var(--main-background-color);}.src #sidebar-button{margin-top:0;top:8px;left:8px;border-color:var(--border-color);}.hide-sidebar .src #sidebar-button{position:static;}#search-button>a,.settings-menu>a,.help-menu>a,#sidebar-button>a,button#toggle-all-docs{display:flex;align-items:center;justify-content:center;flex-direction:column;}#search-button>a,.settings-menu>a,.help-menu>a,button#toggle-all-docs{border:1px solid transparent;border-radius:var(--button-border-radius);color:var(--main-color);}#search-button>a,.settings-menu>a,.help-menu>a,button#toggle-all-docs{width:80px;border-radius:var(--toolbar-button-border-radius);}#search-button>a,.settings-menu>a,.help-menu>a{min-width:0;}#sidebar-button>a{border:solid 1px transparent;border-radius:var(--button-border-radius);background-color:var(--button-background-color);width:33px;}.src #sidebar-button>a{background-color:var(--sidebar-background-color);border-color:var(--border-color);}#search-button>a:hover,#search-button>a:focus-visible,.settings-menu>a:hover,.settings-menu>a:focus-visible,.help-menu>a:hover,#help-menu>a:focus-visible,#sidebar-button>a:hover,#sidebar-button>a:focus-visible,#copy-path:hover,#copy-path:focus-visible,button#toggle-all-docs:hover,button#toggle-all-docs:focus-visible{border-color:var(--settings-button-border-focus);text-decoration:none;}#search-button>a::before{content:url('data:image/svg+xml,\ + \ + Search\ + ');width:18px;height:18px;filter:var(--settings-menu-filter);}.settings-menu>a::before{content:url('data:image/svg+xml,\ + \ + ');width:18px;height:18px;filter:var(--settings-menu-filter);}button#toggle-all-docs::before{content:url('data:image/svg+xml,\ + ');width:18px;height:18px;filter:var(--settings-menu-filter);}.help-menu>a::before{content:url('data:image/svg+xml,\ + \ + \ + \ + \ + ');width:18px;height:18px;filter:var(--settings-menu-filter);}.help-menu>a{width:74px;}.help-menu>a>.label{padding-right:1px;}#toggle-all-docs:not(.will-expand)>.label{padding-left:1px;}#search-button>a::before,button#toggle-all-docs::before,.help-menu>a::before,.settings-menu>a::before{filter:var(--settings-menu-filter);margin:8px;}@media not (pointer:coarse){#search-button>a:hover::before,button#toggle-all-docs:hover::before,.help-menu>a:hover::before,.settings-menu>a:hover::before{filter:var(--settings-menu-hover-filter);}}button[disabled]#toggle-all-docs{opacity:0.25;border:solid 1px var(--main-background-color);background-size:cover;}button[disabled]#toggle-all-docs:hover{border:solid 1px var(--main-background-color);cursor:not-allowed;}rustdoc-toolbar span.label{font-size:1rem;flex-grow:1;padding-bottom:4px;}#sidebar-button>a::before{content:url('data:image/svg+xml,\ + \ + \ + ');width:22px;height:22px;}#copy-path{color:var(--copy-path-button-color);background:var(--main-background-color);height:var(--copy-path-height);width:var(--copy-path-width);margin-left:10px;padding:0;padding-left:2px;border:solid 1px transparent;border-radius:var(--button-border-radius);font-size:0;}#copy-path::before{filter:var(--copy-path-img-filter);content:var(--clipboard-image);}#copy-path:hover::before{filter:var(--copy-path-img-hover-filter);}#copy-path.clicked::before{content:var(--checkmark-image);}@keyframes rotating{from{transform:rotate(0deg);}to{transform:rotate(360deg);}}.settings-menu.rotate>a img{animation:rotating 2s linear infinite;}kbd{display:inline-block;padding:3px 5px;font:15px monospace;line-height:10px;vertical-align:middle;border:solid 1px var(--border-color);border-radius:3px;color:var(--kbd-color);background-color:var(--kbd-background);box-shadow:inset 0 -1px 0 var(--kbd-box-shadow-color);}ul.all-items>li{list-style:none;}details.dir-entry{padding-left:4px;}details.dir-entry>summary{margin:0 0 0 -4px;padding:0 0 0 4px;cursor:pointer;}details.dir-entry div.folders,details.dir-entry div.files{padding-left:23px;}details.dir-entry a{display:block;}details.toggle{contain:layout;position:relative;}details.big-toggle{contain:inline-size;}details.toggle>summary.hideme{cursor:pointer;font-size:1rem;}details.toggle>summary{list-style:none;outline:none;}details.toggle>summary::-webkit-details-marker,details.toggle>summary::marker{display:none;}details.toggle>summary.hideme>span{margin-left:9px;}details.toggle>summary::before{background:url('data:image/svg+xml,\ + ');content:"";cursor:pointer;width:16px;height:16px;display:inline-block;vertical-align:middle;opacity:.5;filter:var(--toggle-filter);}details.toggle>summary.hideme>span,.more-examples-toggle summary,.more-examples-toggle .hide-more{color:var(--toggles-color);}details.toggle>summary::after{content:"Expand";overflow:hidden;width:0;height:0;position:absolute;}details.toggle>summary.hideme::after{content:"";}details.toggle>summary:focus::before,details.toggle>summary:hover::before{opacity:1;}details.toggle>summary:focus-visible::before{outline:1px dotted #000;outline-offset:1px;}details.non-exhaustive{margin-bottom:8px;}details.toggle>summary.hideme::before{position:relative;}details.toggle>summary:not(.hideme)::before{position:absolute;left:-24px;top:4px;}.impl-items>details.toggle>summary:not(.hideme)::before,#main-content>.methods>details.toggle>summary:not(.hideme)::before{position:absolute;left:-24px;}.impl-items>*:not(.item-info),.implementors-toggle>.docblock,#main-content>.methods>:not(.item-info),.impl>.item-info,.impl>.docblock,.impl+.docblock{margin-left:var(--impl-items-indent);}details.big-toggle>summary:not(.hideme)::before{left:-34px;top:9px;}details.toggle[open] >summary.hideme{position:absolute;}details.toggle[open] >summary.hideme>span{display:none;}details.toggle[open] >summary::before{background:url('data:image/svg+xml,\ + ');}details.toggle[open] >summary::after{content:"Collapse";}details.toggle:not([open])>summary .docblock{max-height:calc(1.5em + 0.75em);overflow-y:hidden;}details.toggle:not([open])>summary .docblock>:first-child{max-width:100%;overflow:hidden;width:fit-content;white-space:nowrap;position:relative;padding-right:1em;}details.toggle:not([open])>summary .docblock>:first-child::after{content:"…";position:absolute;right:0;top:0;bottom:0;z-index:1;background-color:var(--main-background-color);font:1rem/1.5 "Source Serif 4",NanumBarunGothic,serif;padding-left:0.2em;}details.toggle:not([open])>summary .docblock>div:first-child::after{padding-top:calc(1.5em + 0.75em - 1.2rem);}details.toggle>summary .docblock{margin-top:0.75em;}.docblock summary>*{display:inline-block;}.docblock>.example-wrap:first-child .tooltip{margin-top:16px;}.src #sidebar-button>a::before,.sidebar-menu-toggle::before{content:var(--hamburger-image);opacity:0.75;filter:var(--mobile-sidebar-menu-filter);}.src #sidebar-button>a:hover{background:var(--main-background-color);}.sidebar-menu-toggle:hover::before,.sidebar-menu-toggle:active::before,.sidebar-menu-toggle:focus::before{opacity:1;}@media (max-width:850px){#search-tabs .count{display:block;}.side-by-side{flex-direction:column-reverse;}.side-by-side>div{width:auto;}.main-heading{grid-template-areas:"main-heading-breadcrumbs main-heading-toolbar" "main-heading-h1 main-heading-toolbar" "main-heading-sub-heading main-heading-toolbar";}.search-results-main-heading{display:grid;grid-template-areas:"main-heading-breadcrumbs main-heading-toolbar" "main-heading-breadcrumbs main-heading-toolbar" "main-heading-h1 main-heading-toolbar";}rustdoc-toolbar{margin-top:-10px;display:grid;grid-template-areas:"x settings help" "search summary summary";grid-template-rows:35px 1fr;}.search-results-main-heading rustdoc-toolbar{display:grid;grid-template-areas:"settings help" "search search";}.search-results-main-heading #toggle-all-docs{display:none;}rustdoc-toolbar .settings-menu span.label,rustdoc-toolbar .help-menu span.label{display:none;}rustdoc-toolbar .settings-menu{grid-area:settings;}rustdoc-toolbar .help-menu{grid-area:help;}rustdoc-toolbar .settings-menu{grid-area:settings;}rustdoc-toolbar #search-button{grid-area:search;}rustdoc-toolbar #toggle-all-docs{grid-area:summary;}rustdoc-toolbar .settings-menu,rustdoc-toolbar .help-menu{height:35px;}rustdoc-toolbar .settings-menu>a,rustdoc-toolbar .help-menu>a{border-radius:2px;text-align:center;width:34px;padding:5px 0;}rustdoc-toolbar .settings-menu>a:before,rustdoc-toolbar .help-menu>a:before{margin:0 4px;}#settings.popover{top:16px;--popover-arrow-offset:58px;}#help.popover{top:16px;--popover-arrow-offset:16px;}}@media (max-width:700px){:root{--impl-items-indent:0.7em;}*[id]{scroll-margin-top:45px;}#copy-path{width:0;visibility:hidden;}rustdoc-topbar span.label,html:not(.hide-sidebar) .rustdoc:not(.src) rustdoc-toolbar .settings-menu>a,html:not(.hide-sidebar) .rustdoc:not(.src) rustdoc-toolbar .help-menu>a{display:none;}rustdoc-topbar .settings-menu>a,rustdoc-topbar .help-menu>a{width:33px;line-height:0;}rustdoc-topbar .settings-menu>a:hover,rustdoc-topbar .help-menu>a:hover{border:none;background:var(--main-background-color);border-radius:0;}#settings.popover{top:32px;--popover-arrow-offset:48px;}#help.popover{top:32px;--popover-arrow-offset:12px;}.rustdoc{display:block;}html:not(.hide-sidebar) main{padding-left:15px;padding-top:0px;}.sidebar .logo-container,.sidebar .location,.sidebar-resizer{display:none;}.sidebar{position:fixed;top:45px;left:-1000px;z-index:11;height:calc(100vh - 45px);border-right:none;width:100%;}.sidebar-elems .block li a{white-space:wrap;}.src main,.rustdoc.src .sidebar{top:0;padding:0;height:100vh;border:0;}html .src main{padding:18px 0;}.src .search-form{margin-left:40px;}.src .main-heading{margin-left:8px;}.hide-sidebar .search-form{margin-left:32px;}.hide-sidebar .src .search-form{margin-left:0;}.sidebar.shown,.src-sidebar-expanded .src .sidebar,.rustdoc:not(.src) .sidebar:focus-within{left:0;}rustdoc-topbar>h2{padding-bottom:0;margin:auto;overflow:hidden;font-size:24px;white-space:nowrap;text-overflow:ellipsis;text-align:center;}rustdoc-topbar .logo-container>img{max-width:35px;max-height:35px;margin:5px 0 5px 20px;}rustdoc-topbar{display:flex;flex-direction:row;position:sticky;z-index:10;height:45px;width:100%;left:0;top:0;}.hide-sidebar rustdoc-topbar{display:none;}.sidebar-menu-toggle{width:41px;min-width:41px;border:none;line-height:0;}.hide-sidebar .sidebar-menu-toggle{display:none;}.sidebar-elems{margin-top:1em;}.anchor{display:none !important;}#main-content>details.toggle>summary::before,#main-content>div>details.toggle>summary::before{left:-11px;}#sidebar-button>a::before{content:url('data:image/svg+xml,\ + \ + \ + \ + \ + \ + \ + ');width:22px;height:22px;}.sidebar-menu-toggle:hover{background:var(--main-background-color);}.search-results>a,.search-results>a>div{display:block;}.search-results>a{padding:5px 0px;}.search-results>a>div.desc,.item-table dd{padding-left:2em;}.search-results .result-name{display:block;}.search-results .result-name .typename{width:initial;margin-right:0;}.search-results .result-name .typename,.search-results .result-name .path{display:inline;}.src-sidebar-expanded .src .sidebar{position:fixed;max-width:100vw;width:100vw;}.src .src-sidebar-title{padding-top:0;}details.implementors-toggle:not(.top-doc)>summary{margin-left:10px;}.impl-items>details.toggle>summary:not(.hideme)::before,#main-content>.methods>details.toggle>summary:not(.hideme)::before{left:-20px;}summary>.item-info{margin-left:10px;}.impl-items>.item-info{margin-left:calc(var(--impl-items-indent) + 10px);}.src nav.sub{margin:0 0 -25px 0;padding:var(--nav-sub-mobile-padding);}html:not(.src-sidebar-expanded) .src #sidebar-button>a{background-color:var(--main-background-color);}html:not(.src-sidebar-expanded) .src #sidebar-button>a:hover,html:not(.src-sidebar-expanded) .src #sidebar-button>a:focus-visible{background-color:var(--sidebar-background-color);}}@media (min-width:701px){.scraped-example-title{position:absolute;z-index:10;background:var(--main-background-color);bottom:8px;right:5px;padding:2px 4px;box-shadow:0 0 4px var(--main-background-color);}.item-table:not(.reexports){display:grid;grid-template-columns:33% 67%;}.item-table>dt,.item-table>dd{overflow-wrap:anywhere;}.item-table>dt{grid-column-start:1;}.item-table>dd{grid-column-start:2;}}@media print{:root{--docblock-indent:0;}nav.sidebar,nav.sub,.out-of-band,a.src,#copy-path,details.toggle[open] >summary::before,details.toggle>summary::before,details.toggle.top-doc>summary{display:none;}main{padding:10px;}}@media (max-width:464px){:root{--docblock-indent:12px;}.docblock code{overflow-wrap:break-word;overflow-wrap:anywhere;}nav.sub{flex-direction:column;}.search-form{align-self:stretch;}}.variant,.implementors-toggle>summary,.impl,#implementors-list>.docblock,.impl-items>section,.impl-items>.toggle>summary,.methods>section,.methods>.toggle>summary{margin-bottom:0.75em;}.variants>.docblock,.implementors-toggle>.docblock,.impl-items>.toggle[open]:not(:last-child),.methods>.toggle[open]:not(:last-child),.implementors-toggle[open]:not(:last-child){margin-bottom:2em;}#trait-implementations-list .impl-items>.toggle:not(:last-child),#synthetic-implementations-list .impl-items>.toggle:not(:last-child),#blanket-implementations-list .impl-items>.toggle:not(:last-child){margin-bottom:1em;}.scraped-example-list .scrape-help{margin-left:10px;padding:0 4px;font-weight:normal;font-size:12px;position:relative;bottom:1px;border:1px solid var(--scrape-example-help-border-color);border-radius:50px;color:var(--scrape-example-help-color);}.scraped-example-list .scrape-help:hover{border-color:var(--scrape-example-help-hover-border-color);color:var(--scrape-example-help-hover-color);}.scraped-example:not(.expanded) .example-wrap::before,.scraped-example:not(.expanded) .example-wrap::after{content:" ";width:100%;height:5px;position:absolute;z-index:1;}.scraped-example:not(.expanded) .example-wrap::before{top:0;background:linear-gradient(to bottom,var(--scrape-example-code-wrapper-background-start),var(--scrape-example-code-wrapper-background-end));}.scraped-example:not(.expanded) .example-wrap::after{bottom:0;background:linear-gradient(to top,var(--scrape-example-code-wrapper-background-start),var(--scrape-example-code-wrapper-background-end));}.scraped-example:not(.expanded){width:100%;overflow-y:hidden;margin-bottom:0;}.scraped-example:not(.expanded){overflow-x:hidden;}.scraped-example .rust span.highlight{background:var(--scrape-example-code-line-highlight);}.scraped-example .rust span.highlight.focus{background:var(--scrape-example-code-line-highlight-focus);}.more-examples-toggle{max-width:calc(100% + 25px);margin-top:10px;margin-left:-25px;}.more-examples-toggle .hide-more{margin-left:25px;cursor:pointer;}.more-scraped-examples{margin-left:25px;position:relative;}.toggle-line{position:absolute;top:5px;bottom:0;right:calc(100% + 10px);padding:0 4px;cursor:pointer;}.toggle-line-inner{min-width:2px;height:100%;background:var(--scrape-example-toggle-line-background);}.toggle-line:hover .toggle-line-inner{background:var(--scrape-example-toggle-line-hover-background);}.more-scraped-examples .scraped-example,.example-links{margin-top:20px;}.more-scraped-examples .scraped-example:first-child{margin-top:5px;}.example-links ul{margin-bottom:0;}:root[data-theme="light"],:root:not([data-theme]){--main-background-color:white;--main-color:black;--settings-input-color:#2196f3;--settings-input-border-color:#717171;--settings-button-color:#000;--settings-button-border-focus:#717171;--sidebar-background-color:#f5f5f5;--sidebar-background-color-hover:#e0e0e0;--sidebar-border-color:#ddd;--code-block-background-color:#f5f5f5;--scrollbar-track-background-color:#dcdcdc;--scrollbar-thumb-background-color:rgba(36,37,39,0.6);--scrollbar-color:rgba(36,37,39,0.6) #d9d9d9;--headings-border-bottom-color:#ddd;--border-color:#e0e0e0;--button-background-color:#fff;--right-side-color:grey;--code-attribute-color:#999;--toggles-color:#999;--toggle-filter:none;--mobile-sidebar-menu-filter:none;--search-input-focused-border-color:#66afe9;--copy-path-button-color:#999;--copy-path-img-filter:invert(50%);--copy-path-img-hover-filter:invert(35%);--code-example-button-color:#7f7f7f;--code-example-button-hover-color:#595959;--settings-menu-filter:invert(50%);--settings-menu-hover-filter:invert(35%);--codeblock-error-hover-color:rgb(255,0,0);--codeblock-error-color:rgba(255,0,0,.5);--codeblock-ignore-hover-color:rgb(255,142,0);--codeblock-ignore-color:rgba(255,142,0,.6);--warning-border-color:#ff8e00;--type-link-color:#ad378a;--trait-link-color:#6e4fc9;--assoc-item-link-color:#3873ad;--function-link-color:#ad7c37;--macro-link-color:#068000;--keyword-link-color:#3873ad;--mod-link-color:#3873ad;--link-color:#3873ad;--sidebar-link-color:#356da4;--sidebar-current-link-background-color:#fff;--search-result-link-focus-background-color:#ccc;--search-result-border-color:#aaa3;--search-color:#000;--search-error-code-background-color:#d0cccc;--search-results-alias-color:#000;--search-results-grey-color:#999;--search-tab-title-count-color:#888;--search-tab-button-not-selected-border-top-color:#e6e6e6;--search-tab-button-not-selected-background:#e6e6e6;--search-tab-button-selected-border-top-color:#0089ff;--search-tab-button-selected-background:#fff;--stab-background-color:#fff5d6;--stab-code-color:#000;--code-highlight-kw-color:#8959a8;--code-highlight-kw-2-color:#4271ae;--code-highlight-lifetime-color:#b76514;--code-highlight-prelude-color:#4271ae;--code-highlight-prelude-val-color:#c82829;--code-highlight-number-color:#718c00;--code-highlight-string-color:#718c00;--code-highlight-literal-color:#c82829;--code-highlight-attribute-color:#c82829;--code-highlight-self-color:#c82829;--code-highlight-macro-color:#3e999f;--code-highlight-question-mark-color:#ff9011;--code-highlight-comment-color:#8e908c;--code-highlight-doc-comment-color:#4d4d4c;--src-line-numbers-span-color:#c67e2d;--src-line-number-highlighted-background-color:#fdffd3;--target-background-color:#fdffd3;--target-border-color:#ad7c37;--kbd-color:#000;--kbd-background:#fafbfc;--kbd-box-shadow-color:#c6cbd1;--rust-logo-filter:initial;--crate-search-div-filter:invert(100%) sepia(0%) saturate(4223%) hue-rotate(289deg) brightness(114%) contrast(76%);--crate-search-div-hover-filter:invert(44%) sepia(18%) saturate(23%) hue-rotate(317deg) brightness(96%) contrast(93%);--crate-search-hover-border:#717171;--src-sidebar-background-selected:#fff;--src-sidebar-background-hover:#e0e0e0;--table-alt-row-background-color:#f5f5f5;--codeblock-link-background:#eee;--scrape-example-toggle-line-background:#ccc;--scrape-example-toggle-line-hover-background:#999;--scrape-example-code-line-highlight:#fcffd6;--scrape-example-code-line-highlight-focus:#f6fdb0;--scrape-example-help-border-color:#555;--scrape-example-help-color:#333;--scrape-example-help-hover-border-color:#000;--scrape-example-help-hover-color:#000;--scrape-example-code-wrapper-background-start:rgba(255,255,255,1);--scrape-example-code-wrapper-background-end:rgba(255,255,255,0);--sidebar-resizer-hover:hsl(207,90%,66%);--sidebar-resizer-active:hsl(207,90%,54%);}:root[data-theme="dark"]{--main-background-color:#353535;--main-color:#ddd;--settings-input-color:#2196f3;--settings-input-border-color:#999;--settings-button-color:#000;--settings-button-border-focus:#ffb900;--sidebar-background-color:#505050;--sidebar-background-color-hover:#676767;--sidebar-border-color:#999;--code-block-background-color:#2A2A2A;--scrollbar-track-background-color:#717171;--scrollbar-thumb-background-color:rgba(32,34,37,.6);--scrollbar-color:rgba(32,34,37,.6) #5a5a5a;--headings-border-bottom-color:#d2d2d2;--border-color:#e0e0e0;--button-background-color:#f0f0f0;--right-side-color:grey;--code-attribute-color:#999;--toggles-color:#999;--toggle-filter:invert(100%);--mobile-sidebar-menu-filter:invert(100%);--search-input-focused-border-color:#008dfd;--copy-path-button-color:#999;--copy-path-img-filter:invert(50%);--copy-path-img-hover-filter:invert(65%);--code-example-button-color:#7f7f7f;--code-example-button-hover-color:#a5a5a5;--codeblock-error-hover-color:rgb(255,0,0);--codeblock-error-color:rgba(255,0,0,.5);--codeblock-ignore-hover-color:rgb(255,142,0);--codeblock-ignore-color:rgba(255,142,0,.6);--warning-border-color:#ff8e00;--type-link-color:#2dbfb8;--trait-link-color:#b78cf2;--assoc-item-link-color:#d2991d;--function-link-color:#2bab63;--macro-link-color:#09bd00;--keyword-link-color:#d2991d;--mod-link-color:#d2991d;--link-color:#d2991d;--sidebar-link-color:#fdbf35;--sidebar-current-link-background-color:#444;--search-result-link-focus-background-color:#616161;--search-result-border-color:#aaa3;--search-color:#111;--search-error-code-background-color:#484848;--search-results-alias-color:#fff;--search-results-grey-color:#ccc;--search-tab-title-count-color:#888;--search-tab-button-not-selected-border-top-color:#252525;--search-tab-button-not-selected-background:#252525;--search-tab-button-selected-border-top-color:#0089ff;--search-tab-button-selected-background:#353535;--settings-menu-filter:invert(50%);--settings-menu-hover-filter:invert(65%);--stab-background-color:#314559;--stab-code-color:#e6e1cf;--code-highlight-kw-color:#ab8ac1;--code-highlight-kw-2-color:#769acb;--code-highlight-lifetime-color:#d97f26;--code-highlight-prelude-color:#769acb;--code-highlight-prelude-val-color:#ee6868;--code-highlight-number-color:#83a300;--code-highlight-string-color:#83a300;--code-highlight-literal-color:#ee6868;--code-highlight-attribute-color:#ee6868;--code-highlight-self-color:#ee6868;--code-highlight-macro-color:#3e999f;--code-highlight-question-mark-color:#ff9011;--code-highlight-comment-color:#8d8d8b;--code-highlight-doc-comment-color:#8ca375;--src-line-numbers-span-color:#3b91e2;--src-line-number-highlighted-background-color:#0a042f;--target-background-color:#494a3d;--target-border-color:#bb7410;--kbd-color:#000;--kbd-background:#fafbfc;--kbd-box-shadow-color:#c6cbd1;--rust-logo-filter:drop-shadow(1px 0 0px #fff) drop-shadow(0 1px 0 #fff) drop-shadow(-1px 0 0 #fff) drop-shadow(0 -1px 0 #fff);--crate-search-div-filter:invert(94%) sepia(0%) saturate(721%) hue-rotate(255deg) brightness(90%) contrast(90%);--crate-search-div-hover-filter:invert(69%) sepia(60%) saturate(6613%) hue-rotate(184deg) brightness(100%) contrast(91%);--crate-search-hover-border:#2196f3;--src-sidebar-background-selected:#333;--src-sidebar-background-hover:#444;--table-alt-row-background-color:#2a2a2a;--codeblock-link-background:#333;--scrape-example-toggle-line-background:#999;--scrape-example-toggle-line-hover-background:#c5c5c5;--scrape-example-code-line-highlight:#5b3b01;--scrape-example-code-line-highlight-focus:#7c4b0f;--scrape-example-help-border-color:#aaa;--scrape-example-help-color:#eee;--scrape-example-help-hover-border-color:#fff;--scrape-example-help-hover-color:#fff;--scrape-example-code-wrapper-background-start:rgba(53,53,53,1);--scrape-example-code-wrapper-background-end:rgba(53,53,53,0);--sidebar-resizer-hover:hsl(207,30%,54%);--sidebar-resizer-active:hsl(207,90%,54%);}:root[data-theme="ayu"]{--main-background-color:#0f1419;--main-color:#c5c5c5;--settings-input-color:#ffb454;--settings-input-border-color:#999;--settings-button-color:#fff;--settings-button-border-focus:#e0e0e0;--sidebar-background-color:#14191f;--sidebar-background-color-hover:rgba(70,70,70,0.33);--sidebar-border-color:#5c6773;--code-block-background-color:#191f26;--scrollbar-track-background-color:transparent;--scrollbar-thumb-background-color:#5c6773;--scrollbar-color:#5c6773 #24292f;--headings-border-bottom-color:#5c6773;--border-color:#5c6773;--button-background-color:#141920;--right-side-color:grey;--code-attribute-color:#999;--toggles-color:#999;--toggle-filter:invert(100%);--mobile-sidebar-menu-filter:invert(100%);--search-input-focused-border-color:#5c6773;--copy-path-button-color:#fff;--copy-path-img-filter:invert(70%);--copy-path-img-hover-filter:invert(100%);--code-example-button-color:#b2b2b2;--code-example-button-hover-color:#fff;--codeblock-error-hover-color:rgb(255,0,0);--codeblock-error-color:rgba(255,0,0,.5);--codeblock-ignore-hover-color:rgb(255,142,0);--codeblock-ignore-color:rgba(255,142,0,.6);--warning-border-color:#ff8e00;--type-link-color:#ffa0a5;--trait-link-color:#39afd7;--assoc-item-link-color:#39afd7;--function-link-color:#fdd687;--macro-link-color:#a37acc;--keyword-link-color:#39afd7;--mod-link-color:#39afd7;--link-color:#39afd7;--sidebar-link-color:#53b1db;--sidebar-current-link-background-color:transparent;--search-result-link-focus-background-color:#3c3c3c;--search-result-border-color:#aaa3;--search-color:#fff;--search-error-code-background-color:#4f4c4c;--search-results-alias-color:#c5c5c5;--search-results-grey-color:#999;--search-tab-title-count-color:#888;--search-tab-button-not-selected-border-top-color:none;--search-tab-button-not-selected-background:transparent !important;--search-tab-button-selected-border-top-color:none;--search-tab-button-selected-background:#141920 !important;--settings-menu-filter:invert(70%);--settings-menu-hover-filter:invert(100%);--stab-background-color:#314559;--stab-code-color:#e6e1cf;--code-highlight-kw-color:#ff7733;--code-highlight-kw-2-color:#ff7733;--code-highlight-lifetime-color:#ff7733;--code-highlight-prelude-color:#69f2df;--code-highlight-prelude-val-color:#ff7733;--code-highlight-number-color:#b8cc52;--code-highlight-string-color:#b8cc52;--code-highlight-literal-color:#ff7733;--code-highlight-attribute-color:#e6e1cf;--code-highlight-self-color:#36a3d9;--code-highlight-macro-color:#a37acc;--code-highlight-question-mark-color:#ff9011;--code-highlight-comment-color:#788797;--code-highlight-doc-comment-color:#a1ac88;--src-line-numbers-span-color:#5c6773;--src-line-number-highlighted-background-color:rgba(255,236,164,0.06);--target-background-color:rgba(255,236,164,0.06);--target-border-color:rgba(255,180,76,0.85);--kbd-color:#c5c5c5;--kbd-background:#314559;--kbd-box-shadow-color:#5c6773;--rust-logo-filter:drop-shadow(1px 0 0px #fff) drop-shadow(0 1px 0 #fff) drop-shadow(-1px 0 0 #fff) drop-shadow(0 -1px 0 #fff);--crate-search-div-filter:invert(41%) sepia(12%) saturate(487%) hue-rotate(171deg) brightness(94%) contrast(94%);--crate-search-div-hover-filter:invert(98%) sepia(12%) saturate(81%) hue-rotate(343deg) brightness(113%) contrast(76%);--crate-search-hover-border:#e0e0e0;--src-sidebar-background-selected:#14191f;--src-sidebar-background-hover:#14191f;--table-alt-row-background-color:#191f26;--codeblock-link-background:#333;--scrape-example-toggle-line-background:#999;--scrape-example-toggle-line-hover-background:#c5c5c5;--scrape-example-code-line-highlight:#5b3b01;--scrape-example-code-line-highlight-focus:#7c4b0f;--scrape-example-help-border-color:#aaa;--scrape-example-help-color:#eee;--scrape-example-help-hover-border-color:#fff;--scrape-example-help-hover-color:#fff;--scrape-example-code-wrapper-background-start:rgba(15,20,25,1);--scrape-example-code-wrapper-background-end:rgba(15,20,25,0);--sidebar-resizer-hover:hsl(34,50%,33%);--sidebar-resizer-active:hsl(34,100%,66%);}:root[data-theme="ayu"] h1,:root[data-theme="ayu"] h2,:root[data-theme="ayu"] h3,:root[data-theme="ayu"] h4,:where(:root[data-theme="ayu"]) h1 a,:root[data-theme="ayu"] .sidebar h2 a,:root[data-theme="ayu"] .sidebar h3 a{color:#fff;}:root[data-theme="ayu"] .docblock code{color:#ffb454;}:root[data-theme="ayu"] .docblock a>code{color:#39AFD7 !important;}:root[data-theme="ayu"] .code-header,:root[data-theme="ayu"] .docblock pre>code,:root[data-theme="ayu"] pre,:root[data-theme="ayu"] pre>code,:root[data-theme="ayu"] .item-info code,:root[data-theme="ayu"] .rustdoc.source .example-wrap{color:#e6e1cf;}:root[data-theme="ayu"] .sidebar .current,:root[data-theme="ayu"] .sidebar .current a,:root[data-theme="ayu"] .sidebar a:hover,:root[data-theme="ayu"] #src-sidebar div.files>a:hover,:root[data-theme="ayu"] details.dir-entry summary:hover,:root[data-theme="ayu"] #src-sidebar div.files>a:focus,:root[data-theme="ayu"] details.dir-entry summary:focus,:root[data-theme="ayu"] #src-sidebar div.files>a.selected{color:#ffb44c;}:root[data-theme="ayu"] .sidebar-elems .location{color:#ff7733;}:root[data-theme="ayu"] a[data-nosnippet].line-highlighted{color:#708090;padding-right:7px;border-right:1px solid #ffb44c;}:root[data-theme="ayu"] .search-results a:hover,:root[data-theme="ayu"] .search-results a:focus{color:#fff !important;background-color:#3c3c3c;}:root[data-theme="ayu"] .search-results a{color:#0096cf;}:root[data-theme="ayu"] .search-results a div.desc{color:#c5c5c5;}:root[data-theme="ayu"] .result-name .primitive>i,:root[data-theme="ayu"] .result-name .keyword>i{color:#788797;}:root[data-theme="ayu"] #search-tabs>button.selected{border-bottom:1px solid #ffb44c !important;border-top:none;}:root[data-theme="ayu"] #search-tabs>button:not(.selected){border:none;background-color:transparent !important;}:root[data-theme="ayu"] #search-tabs>button:hover{border-bottom:1px solid rgba(242,151,24,0.3);}:root[data-theme="ayu"] .settings-menu>a img,:root[data-theme="ayu"] #sidebar-button>a::before{filter:invert(100);} \ No newline at end of file diff --git a/next/static.files/scrape-examples-5e967b76.js b/next/static.files/scrape-examples-5e967b76.js new file mode 100644 index 0000000..40dfe84 --- /dev/null +++ b/next/static.files/scrape-examples-5e967b76.js @@ -0,0 +1 @@ +"use strict";(function(){const DEFAULT_MAX_LINES=5;const HIDDEN_MAX_LINES=10;function scrollToLoc(elt,loc,isHidden){const lines=elt.querySelectorAll("[data-nosnippet]");let scrollOffset;const maxLines=isHidden?HIDDEN_MAX_LINES:DEFAULT_MAX_LINES;if(loc[1]-loc[0]>maxLines){const line=Math.max(0,loc[0]-1);scrollOffset=lines[line].offsetTop;}else{const halfHeight=elt.offsetHeight/2;const offsetTop=lines[loc[0]].offsetTop;const lastLine=lines[loc[1]];const offsetBot=lastLine.offsetTop+lastLine.offsetHeight;const offsetMid=(offsetTop+offsetBot)/2;scrollOffset=offsetMid-halfHeight;}lines[0].parentElement.scrollTo(0,scrollOffset);elt.querySelector(".rust").scrollTo(0,scrollOffset);}function createScrapeButton(parent,className,content){const button=document.createElement("button");button.className=className;button.title=content;parent.insertBefore(button,parent.firstChild);return button;}window.updateScrapedExample=(example,buttonHolder)=>{let locIndex=0;const highlights=Array.prototype.slice.call(example.querySelectorAll(".highlight"));const link=example.querySelector(".scraped-example-title a");let expandButton=null;if(!example.classList.contains("expanded")){expandButton=createScrapeButton(buttonHolder,"expand","Show all");}const isHidden=example.parentElement.classList.contains("more-scraped-examples");const locs=example.locs;if(locs.length>1){const next=createScrapeButton(buttonHolder,"next","Next usage");const prev=createScrapeButton(buttonHolder,"prev","Previous usage");const onChangeLoc=changeIndex=>{removeClass(highlights[locIndex],"focus");changeIndex();scrollToLoc(example,locs[locIndex][0],isHidden);addClass(highlights[locIndex],"focus");const url=locs[locIndex][1];const title=locs[locIndex][2];link.href=url;link.innerHTML=title;};prev.addEventListener("click",()=>{onChangeLoc(()=>{locIndex=(locIndex-1+locs.length)%locs.length;});});next.addEventListener("click",()=>{onChangeLoc(()=>{locIndex=(locIndex+1)%locs.length;});});}if(expandButton){expandButton.addEventListener("click",()=>{if(hasClass(example,"expanded")){removeClass(example,"expanded");removeClass(expandButton,"collapse");expandButton.title="Show all";scrollToLoc(example,locs[0][0],isHidden);}else{addClass(example,"expanded");addClass(expandButton,"collapse");expandButton.title="Show single example";}});}};function setupLoc(example,isHidden){example.locs=JSON.parse(example.attributes.getNamedItem("data-locs").textContent);scrollToLoc(example,example.locs[0][0],isHidden);}const firstExamples=document.querySelectorAll(".scraped-example-list > .scraped-example");onEachLazy(firstExamples,el=>setupLoc(el,false));onEachLazy(document.querySelectorAll(".more-examples-toggle"),toggle=>{onEachLazy(toggle.querySelectorAll(".toggle-line, .hide-more"),button=>{button.addEventListener("click",()=>{toggle.open=false;});});const moreExamples=toggle.querySelectorAll(".scraped-example");toggle.querySelector("summary").addEventListener("click",()=>{setTimeout(()=>{onEachLazy(moreExamples,el=>setupLoc(el,true));});},{once:true});});})(); \ No newline at end of file diff --git a/next/static.files/search-5f24b69e.js b/next/static.files/search-5f24b69e.js new file mode 100644 index 0000000..3ce6175 --- /dev/null +++ b/next/static.files/search-5f24b69e.js @@ -0,0 +1,5 @@ +"use strict";const initSearch=async function(Stringdex,RoaringBitmap,hooks){if(!Array.prototype.toSpliced){Array.prototype.toSpliced=function(){const me=this.slice();Array.prototype.splice.apply(me,arguments);return me;};}async function onEachBtwnAsync(arr,func,funcBtwn){let skipped=true;for(const value of arr){if(!skipped){funcBtwn(value);}skipped=await func(value);}}const yieldToBrowser=typeof window!=="undefined"&&window.requestIdleCallback?function(){return new Promise((resolve,_reject)=>{window.requestIdleCallback(resolve);});}:function(){return new Promise((resolve,_reject)=>{setTimeout(resolve,0);});};const timeout=function(ms){return new Promise((resolve,_reject)=>{setTimeout(resolve,ms);});};if(!Promise.withResolvers){Promise.withResolvers=()=>{let resolve,reject;const promise=new Promise((res,rej)=>{resolve=res;reject=rej;});return{promise,resolve,reject};};}const itemTypes=["keyword","primitive","mod","externcrate","import","struct","enum","fn","type","static","trait","impl","tymethod","method","structfield","variant","macro","associatedtype","constant","associatedconstant","union","foreigntype","existential","attr","derive","traitalias","generic",];const TY_PRIMITIVE=1;const TY_GENERIC=26;const TY_IMPORT=4;const TY_TRAIT=10;const TY_FN=7;const TY_METHOD=13;const TY_TYMETHOD=12;const TY_ASSOCTYPE=17;const ROOT_PATH=typeof window!=="undefined"?window.rootPath:"../";const UNBOXING_LIMIT=5;const REGEX_IDENT=/\p{ID_Start}\p{ID_Continue}*|_\p{ID_Continue}+/uy;const REGEX_INVALID_TYPE_FILTER=/[^a-z]/ui;const MAX_RESULTS=200;const NO_TYPE_FILTER=-1;const editDistanceState={current:[],prev:[],prevPrev:[],calculate:function calculate(a,b,limit){if(a.lengthlimit){return limit+1;}while(b.length>0&&b[0]===a[0]){a=a.substring(1);b=b.substring(1);}while(b.length>0&&b[b.length-1]===a[a.length-1]){a=a.substring(0,a.length-1);b=b.substring(0,b.length-1);}if(b.length===0){return minDist;}const aLength=a.length;const bLength=b.length;for(let i=0;i<=bLength;++i){this.current[i]=0;this.prev[i]=i;this.prevPrev[i]=Number.MAX_VALUE;}for(let i=1;i<=aLength;++i){this.current[0]=i;const aIdx=i-1;for(let j=1;j<=bLength;++j){const bIdx=j-1;const substitutionCost=a[aIdx]===b[bIdx]?0:1;this.current[j]=Math.min(this.prev[j]+1,this.current[j-1]+1,this.prev[j-1]+substitutionCost,);if((i>1)&&(j>1)&&(a[aIdx]===b[bIdx-1])&&(a[aIdx-1]===b[bIdx])){this.current[j]=Math.min(this.current[j],this.prevPrev[j-2]+1,);}}const prevPrevTmp=this.prevPrev;this.prevPrev=this.prev;this.prev=this.current;this.current=prevPrevTmp;}const distance=this.prev[bLength];return distance<=limit?distance:(limit+1);},};function editDistance(a,b,limit){return editDistanceState.calculate(a,b,limit);}function isEndCharacter(c){return"=,>-])".indexOf(c)!==-1;}function isFnLikeTy(ty){return ty===TY_FN||ty===TY_METHOD||ty===TY_TYMETHOD;}function isSeparatorCharacter(c){return c===","||c==="=";}function isReturnArrow(parserState){return parserState.userQuery.slice(parserState.pos,parserState.pos+2)==="->";}function skipWhitespace(parserState){while(parserState.pos0){const c=parserState.userQuery[pos-1];if(c===lookingFor){return true;}else if(c!==" "){break;}pos-=1;}return false;}function isLastElemGeneric(elems,parserState){return(elems.length>0&&elems[elems.length-1].generics.length>0)||prevIs(parserState,">");}function getFilteredNextElem(query,parserState,elems,isInGenerics){const start=parserState.pos;if(parserState.userQuery[parserState.pos]===":"&&!isPathStart(parserState)){throw["Expected type filter before ",":"];}getNextElem(query,parserState,elems,isInGenerics);if(parserState.userQuery[parserState.pos]===":"&&!isPathStart(parserState)){if(parserState.typeFilter!==null){throw["Unexpected ",":"," (expected path after type filter ",parserState.typeFilter+":",")",];}if(elems.length===0){throw["Expected type filter before ",":"];}else if(query.literalSearch){throw["Cannot use quotes on type filter"];}const typeFilterElem=elems.pop();checkExtraTypeFilterCharacters(start,parserState);parserState.typeFilter=typeFilterElem.normalizedPathLast;parserState.pos+=1;parserState.totalElems-=1;query.literalSearch=false;getNextElem(query,parserState,elems,isInGenerics);}}function getItemsBefore(query,parserState,elems,endChar){let foundStopChar=true;let foundSeparator=false;const oldTypeFilter=parserState.typeFilter;parserState.typeFilter=null;const oldIsInBinding=parserState.isInBinding;parserState.isInBinding=null;let hofParameters=null;let extra="";if(endChar===">"){extra="<";}else if(endChar==="]"){extra="[";}else if(endChar===")"){extra="(";}else if(endChar===""){extra="->";}else{extra=endChar;}while(parserState.pos"," after ","="];}hofParameters=[...elems];elems.length=0;parserState.pos+=2;foundStopChar=true;foundSeparator=false;continue;}else if(c===" "){parserState.pos+=1;continue;}else if(isSeparatorCharacter(c)){parserState.pos+=1;foundStopChar=true;foundSeparator=true;continue;}else if(c===":"&&isPathStart(parserState)){throw["Unexpected ","::",": paths cannot start with ","::"];}else if(isEndCharacter(c)){throw["Unexpected ",c," after ",extra];}if(!foundStopChar){let extra=[];if(isLastElemGeneric(query.elems,parserState)){extra=[" after ",">"];}else if(prevIs(parserState,"\"")){throw["Cannot have more than one element if you use quotes"];}if(endChar!==""){throw["Expected ",",",", ","=",", or ",endChar,...extra,", found ",c,];}throw["Expected ",","," or ","=",...extra,", found ",c,];}const posBefore=parserState.pos;getFilteredNextElem(query,parserState,elems,endChar!=="");if(endChar!==""&&parserState.pos>=parserState.length){throw["Unclosed ",extra];}if(posBefore===parserState.pos){parserState.pos+=1;}foundStopChar=false;}if(parserState.pos>=parserState.length&&endChar!==""){throw["Unclosed ",extra];}parserState.pos+=1;if(hofParameters){foundSeparator=false;if([...elems,...hofParameters].some(x=>x.bindingName)||parserState.isInBinding){throw["Unexpected ","="," within ","->"];}const hofElem=makePrimitiveElement("->",{generics:hofParameters,bindings:new Map([["output",[...elems]]]),typeFilter:null,});elems.length=0;elems[0]=hofElem;}parserState.typeFilter=oldTypeFilter;parserState.isInBinding=oldIsInBinding;return{foundSeparator};}function getNextElem(query,parserState,elems,isInGenerics){const generics=[];skipWhitespace(parserState);let start=parserState.pos;let end;if("[(".indexOf(parserState.userQuery[parserState.pos])!==-1){let endChar=")";let name="()";let friendlyName="tuple";if(parserState.userQuery[parserState.pos]==="["){endChar="]";name="[]";friendlyName="slice";}parserState.pos+=1;const{foundSeparator}=getItemsBefore(query,parserState,generics,endChar);const typeFilter=parserState.typeFilter;const bindingName=parserState.isInBinding;parserState.typeFilter=null;parserState.isInBinding=null;for(const gen of generics){if(gen.bindingName!==null){throw["Type parameter ","=",` cannot be within ${friendlyName} `,name];}}if(name==="()"&&!foundSeparator&&generics.length===1&&typeFilter===null){elems.push(generics[0]);}else if(name==="()"&&generics.length===1&&generics[0].name==="->"){generics[0].typeFilter=typeFilter;elems.push(generics[0]);}else{if(typeFilter!==null&&typeFilter!=="primitive"){throw["Invalid search type: primitive ",name," and ",typeFilter," both specified",];}parserState.totalElems+=1;if(isInGenerics){parserState.genericsElems+=1;}elems.push(makePrimitiveElement(name,{bindingName,generics}));}}else if(parserState.userQuery[parserState.pos]==="&"){if(parserState.typeFilter!==null&&parserState.typeFilter!=="primitive"){throw["Invalid search type: primitive ","&"," and ",parserState.typeFilter," both specified",];}parserState.typeFilter=null;parserState.pos+=1;let c=parserState.userQuery[parserState.pos];while(c===" "&&parserState.pos=end){throw["Found generics without a path"];}parserState.pos+=1;getItemsBefore(query,parserState,generics,">");}else if(parserState.pos=end){throw["Found generics without a path"];}if(parserState.isInBinding){throw["Unexpected ","("," after ","="];}parserState.pos+=1;const typeFilter=parserState.typeFilter;parserState.typeFilter=null;getItemsBefore(query,parserState,generics,")");skipWhitespace(parserState);if(isReturnArrow(parserState)){parserState.pos+=2;skipWhitespace(parserState);getFilteredNextElem(query,parserState,generics,isInGenerics);generics[generics.length-1].bindingName=makePrimitiveElement("output");}else{generics.push(makePrimitiveElement(null,{bindingName:makePrimitiveElement("output"),typeFilter:null,}));}parserState.typeFilter=typeFilter;}if(isStringElem){skipWhitespace(parserState);}if(start>=end&&generics.length===0){return;}if(parserState.userQuery[parserState.pos]==="="){if(parserState.isInBinding){throw["Cannot write ","="," twice in a binding"];}if(!isInGenerics){throw["Type parameter ","="," must be within generics list"];}const name=parserState.userQuery.slice(start,end).trim();if(name==="!"){throw["Type parameter ","="," key cannot be ","!"," never type"];}if(name.includes("!")){throw["Type parameter ","="," key cannot be ","!"," macro"];}if(name.includes("::")){throw["Type parameter ","="," key cannot contain ","::"," path"];}if(name.includes(":")){throw["Type parameter ","="," key cannot contain ",":"," type"];}parserState.isInBinding={name,generics};}else{elems.push(createQueryElement(query,parserState,parserState.userQuery.slice(start,end),generics,isInGenerics,),);}}}function checkExtraTypeFilterCharacters(start,parserState){const query=parserState.userQuery.slice(start,parserState.pos).trim();const match=query.match(REGEX_INVALID_TYPE_FILTER);if(match){throw["Unexpected ",match[0]," in type filter (before ",":",")",];}}function createQueryElement(query,parserState,name,generics,isInGenerics){const path=name.trim();if(path.length===0&&generics.length===0){throw["Unexpected ",parserState.userQuery[parserState.pos]];}if(query.literalSearch&&parserState.totalElems-parserState.genericsElems>0){throw["Cannot have more than one element if you use quotes"];}const typeFilter=parserState.typeFilter;parserState.typeFilter=null;if(name.trim()==="!"){if(typeFilter!==null&&typeFilter!=="primitive"){throw["Invalid search type: primitive never type ","!"," and ",typeFilter," both specified",];}if(generics.length!==0){throw["Never type ","!"," does not accept generic parameters",];}const bindingName=parserState.isInBinding;parserState.isInBinding=null;return makePrimitiveElement("never",{bindingName});}const quadcolon=/::\s*::/.exec(path);if(path.startsWith("::")){throw["Paths cannot start with ","::"];}else if(quadcolon!==null){throw["Unexpected ",quadcolon[0]];}const pathSegments=path.split(/(?:::\s*)|(?:\s+(?:::\s*)?)/).map(x=>x.toLowerCase());if(pathSegments.length===0||(pathSegments.length===1&&pathSegments[0]==="")){if(generics.length>0||prevIs(parserState,">")){throw["Found generics without a path"];}else{throw["Unexpected ",parserState.userQuery[parserState.pos]];}}for(const[i,pathSegment]of pathSegments.entries()){if(pathSegment==="!"){if(i!==0){throw["Never type ","!"," is not associated item"];}pathSegments[i]="never";}}parserState.totalElems+=1;if(isInGenerics){parserState.genericsElems+=1;}const bindingName=parserState.isInBinding;parserState.isInBinding=null;const bindings=new Map();const pathLast=pathSegments[pathSegments.length-1];return{name:name.trim(),id:null,fullPath:pathSegments,pathWithoutLast:pathSegments.slice(0,pathSegments.length-1),pathLast,normalizedPathLast:pathLast.replace(/_/g,""),generics:generics.filter(gen=>{if(gen.bindingName!==null&&gen.bindingName.name!==null){if(gen.name!==null){gen.bindingName.generics.unshift(gen);}bindings.set(gen.bindingName.name.toLowerCase().replace(/_/g,""),gen.bindingName.generics,);return false;}return true;}),bindings,typeFilter,bindingName,};}function makePrimitiveElement(name,extra){return Object.assign({name,id:null,fullPath:[name],pathWithoutLast:[],pathLast:name,normalizedPathLast:name,generics:[],bindings:new Map(),typeFilter:"primitive",bindingName:null,},extra);}function getStringElem(query,parserState,isInGenerics){if(isInGenerics){throw["Unexpected ","\""," in generics"];}else if(query.literalSearch){throw["Cannot have more than one literal search element"];}else if(parserState.totalElems-parserState.genericsElems>0){throw["Cannot use literal search when there is more than one element"];}parserState.pos+=1;const start=parserState.pos;const end=getIdentEndPosition(parserState);if(parserState.pos>=parserState.length){throw["Unclosed ","\""];}else if(parserState.userQuery[end]!=="\""){throw["Unexpected ",parserState.userQuery[end]," in a string element"];}else if(start===end){throw["Cannot have empty string element"];}parserState.pos+=1;query.literalSearch=true;}function getIdentEndPosition(parserState){let afterIdent=consumeIdent(parserState);let end=parserState.pos;let macroExclamation=-1;while(parserState.pos0){throw["Unexpected ",c," after ",parserState.userQuery[parserState.pos-1]," (not a valid identifier)"];}else{throw["Unexpected ",c," (not a valid identifier)"];}parserState.pos+=1;afterIdent=consumeIdent(parserState);end=parserState.pos;}if(macroExclamation!==-1){if(parserState.typeFilter===null){parserState.typeFilter="macro";}else if(parserState.typeFilter!=="macro"){throw["Invalid search type: macro ","!"," and ",parserState.typeFilter," both specified",];}end=macroExclamation;}return end;}function isSpecialStartCharacter(c){return"<\"".indexOf(c)!==-1;}function isPathStart(parserState){return parserState.userQuery.slice(parserState.pos,parserState.pos+2)==="::";}function consumeIdent(parserState){REGEX_IDENT.lastIndex=parserState.pos;const match=parserState.userQuery.match(REGEX_IDENT);if(match){parserState.pos+=match[0].length;return true;}return false;}function isPathSeparator(c){return c===":"||c===" ";}class VlqHexDecoder{constructor(string,cons){this.string=string;this.cons=cons;this.offset=0;this.elemCount=0;this.backrefQueue=[];}decodeList(){let c=this.string.charCodeAt(this.offset);const ret=[];while(c!==125){ret.push(this.decode());c=this.string.charCodeAt(this.offset);}this.offset+=1;return ret;}decode(){let n=0;let c=this.string.charCodeAt(this.offset);if(c===123){this.offset+=1;return this.decodeList();}while(c<96){n=(n<<4)|(c&0xF);this.offset+=1;c=this.string.charCodeAt(this.offset);}n=(n<<4)|(c&0xF);const[sign,value]=[n&1,n>>1];this.offset+=1;this.elemCount+=1;return sign?-value:value;}next(){const c=this.string.charCodeAt(this.offset);if(c>=48&&c<64){this.offset+=1;return this.backrefQueue[c-48];}if(c===96){this.offset+=1;return this.cons(0);}const result=this.cons(this.decode());this.backrefQueue.unshift(result);if(this.backrefQueue.length>16){this.backrefQueue.pop();}return result;}}const EMPTY_STRING_ARRAY=[];const EMPTY_GENERICS_ARRAY=[];const EMPTY_BINDINGS_ARRAY=[];const EMPTY_BINDINGS_MAP=new Map();function itemTypeFromName(typename){if(typename===null){return NO_TYPE_FILTER;}const index=itemTypes.findIndex(i=>i===typename);if(index<0){throw["Unknown type filter ",typename];}return index;}class DocSearch{constructor(rootPath,database){this.rootPath=rootPath;this.database=database;this.typeNameIdOfOutput=-1;this.typeNameIdOfArray=-1;this.typeNameIdOfSlice=-1;this.typeNameIdOfArrayOrSlice=-1;this.typeNameIdOfTuple=-1;this.typeNameIdOfUnit=-1;this.typeNameIdOfTupleOrUnit=-1;this.typeNameIdOfReference=-1;this.typeNameIdOfHof=-1;this.utf8decoder=new TextDecoder();this.TYPES_POOL=new Map();}async buildIndex(){const nn=this.database.getIndex("normalizedName");if(!nn){return;}const[output,fn,fnMut,fnOnce,hof,array,slice,arrayOrSlice,tuple,unit,tupleOrUnit,reference,never,]=await Promise.all([nn.search("output"),nn.search("fn"),nn.search("fnmut"),nn.search("fnonce"),nn.search("->"),nn.search("array"),nn.search("slice"),nn.search("[]"),nn.search("tuple"),nn.search("unit"),nn.search("()"),nn.search("reference"),nn.search("never"),]);const first=async(trie,ty,modulePath)=>{if(trie){for(const id of trie.matches().entries()){const pathData=await this.getPathData(id);if(pathData&&pathData.ty===ty&&pathData.modulePath===modulePath){return id;}}}return-1;};this.typeNameIdOfOutput=await first(output,TY_ASSOCTYPE,"");this.typeNameIdOfFnPtr=await first(fn,TY_PRIMITIVE,"");this.typeNameIdOfFn=await first(fn,TY_TRAIT,"core::ops");this.typeNameIdOfFnMut=await first(fnMut,TY_TRAIT,"core::ops");this.typeNameIdOfFnOnce=await first(fnOnce,TY_TRAIT,"core::ops");this.typeNameIdOfArray=await first(array,TY_PRIMITIVE,"");this.typeNameIdOfSlice=await first(slice,TY_PRIMITIVE,"");this.typeNameIdOfArrayOrSlice=await first(arrayOrSlice,TY_PRIMITIVE,"");this.typeNameIdOfTuple=await first(tuple,TY_PRIMITIVE,"");this.typeNameIdOfUnit=await first(unit,TY_PRIMITIVE,"");this.typeNameIdOfTupleOrUnit=await first(tupleOrUnit,TY_PRIMITIVE,"");this.typeNameIdOfReference=await first(reference,TY_PRIMITIVE,"");this.typeNameIdOfHof=await first(hof,TY_PRIMITIVE,"");this.typeNameIdOfNever=await first(never,TY_PRIMITIVE,"");}static parseQuery(userQuery){function newParsedQuery(userQuery){return{userQuery,elems:[],returned:[],foundElems:0,totalElems:0,literalSearch:false,hasReturnArrow:false,error:null,correction:null,proposeCorrectionFrom:null,proposeCorrectionTo:null,typeFingerprint:new Uint32Array(4),};}function parseInput(query,parserState){let foundStopChar=true;while(parserState.pos"){if(isReturnArrow(parserState)){query.hasReturnArrow=true;break;}throw["Unexpected ",c," (did you mean ","->","?)"];}else if(parserState.pos>0){throw["Unexpected ",c," after ",parserState.userQuery[parserState.pos-1]];}throw["Unexpected ",c];}else if(c===" "){skipWhitespace(parserState);continue;}if(!foundStopChar){let extra=EMPTY_STRING_ARRAY;if(isLastElemGeneric(query.elems,parserState)){extra=[" after ",">"];}else if(prevIs(parserState,"\"")){throw["Cannot have more than one element if you use quotes"];}if(parserState.typeFilter!==null){throw["Expected ",","," or ","->",...extra,", found ",c,];}throw["Expected ",",",", ",":"," or ","->",...extra,", found ",c,];}const before=query.elems.length;getFilteredNextElem(query,parserState,query.elems,false);if(query.elems.length===before){parserState.pos+=1;}foundStopChar=false;}if(parserState.typeFilter!==null){throw["Unexpected ",":"," (expected path after type filter ",parserState.typeFilter+":",")",];}while(parserState.pos{const ty=itemTypeFromName(elem.typeFilter);if(ty===TY_GENERIC&&elem.generics.length!==0){throw["Generic type parameter ",elem.name," does not accept generic parameters",];}for(const generic of elem.generics){checkTypeFilter(generic);}for(const constraints of elem.bindings.values()){for(const constraint of constraints){checkTypeFilter(constraint);}}};for(const elem of query.elems){checkTypeFilter(elem);}for(const elem of query.returned){checkTypeFilter(elem);}}catch(err){query=newParsedQuery(userQuery);if(Array.isArray(err)&&err.every(elem=>typeof elem==="string")){query.error=err;}else{throw err;}return query;}if(!query.literalSearch){query.literalSearch=parserState.totalElems>1;}query.foundElems=query.elems.length+query.returned.length;query.totalElems=parserState.totalElems;return query;}async getName(id){const ni=this.database.getData("name");if(!ni){return null;}const name=await ni.at(id);return name===undefined||name===null?null:this.utf8decoder.decode(name);}async getDesc(id){const di=this.database.getData("desc");if(!di){return null;}const desc=await di.at(id);return desc===undefined||desc===null?null:this.utf8decoder.decode(desc);}async getAliasTarget(id){const ai=this.database.getData("alias");if(!ai){return null;}const bytes=await ai.at(id);if(bytes===undefined||bytes===null||bytes.length===0){return null;}else{const encoded=this.utf8decoder.decode(bytes);const decoded=JSON.parse(encoded);return decoded;}}async getEntryData(id){const ei=this.database.getData("entry");if(!ei){return null;}const encoded=this.utf8decoder.decode(await ei.at(id));if(encoded===""||encoded===undefined||encoded===null){return null;}const raw=JSON.parse(encoded);return{krate:raw[0],ty:raw[1],modulePath:raw[2]===0?null:raw[2]-1,exactModulePath:raw[3]===0?null:raw[3]-1,parent:raw[4]===0?null:raw[4]-1,deprecated:raw[5]===1?true:false,associatedItemDisambiguator:raw.length===6?null:raw[6],};}async getPathData(id){const pi=this.database.getData("path");if(!pi){return null;}const encoded=this.utf8decoder.decode(await pi.at(id));if(encoded===""||encoded===undefined||encoded===null){return null;}const raw=JSON.parse(encoded);return{ty:raw[0],modulePath:raw[1],exactModulePath:raw[2]===0||raw[2]===undefined?raw[1]:raw[2],};}async getFunctionData(id){const fi=this.database.getData("function");if(!fi){return null;}const encoded=this.utf8decoder.decode(await fi.at(id));if(encoded===""||encoded===undefined||encoded===null){return null;}const raw=JSON.parse(encoded);const parser=new VlqHexDecoder(raw[0],async functionSearchType=>{if(typeof functionSearchType==="number"){return null;}const INPUTS_DATA=0;const OUTPUT_DATA=1;let inputs_;let output_;if(typeof functionSearchType[INPUTS_DATA]==="number"){inputs_=Promise.all([this.buildItemSearchType(functionSearchType[INPUTS_DATA]),]);}else{inputs_=this.buildItemSearchTypeAll(functionSearchType[INPUTS_DATA]);}if(functionSearchType.length>1){if(typeof functionSearchType[OUTPUT_DATA]==="number"){output_=Promise.all([this.buildItemSearchType(functionSearchType[OUTPUT_DATA]),]);}else{output_=this.buildItemSearchTypeAll(functionSearchType[OUTPUT_DATA]);}}else{output_=Promise.resolve(EMPTY_GENERICS_ARRAY);}const where_clause_=[];const l=functionSearchType.length;for(let i=2;i{if(name===undefined){return"";}return this.utf8decoder.decode(name);}));}return Promise.all(names);}async getGenericInvertedIndex(id){const gii=this.database.getData("generic_inverted_index");if(!gii){return[];}const pb=await gii.at(id);if(pb===undefined||pb===null||pb.length===0){return[];}const invertedFunctionSignatureIndex=[];let i=0;const l=pb.length;while(i0?await Promise.all(types.map(type=>this.buildItemSearchType(type))):EMPTY_GENERICS_ARRAY;}async buildItemSearchType(type){const PATH_INDEX_DATA=0;const GENERICS_DATA=1;const BINDINGS_DATA=2;let id,generics;let bindings;if(typeof type==="number"){id=type;generics=EMPTY_GENERICS_ARRAY;bindings=EMPTY_BINDINGS_MAP;}else{id=type[PATH_INDEX_DATA];generics=await this.buildItemSearchTypeAll(type[GENERICS_DATA]);if(type[BINDINGS_DATA]&&type[BINDINGS_DATA].length>0){bindings=new Map((await Promise.all(type[BINDINGS_DATA].map(async binding=>{const[assocType,constraints]=binding;const[k,v]=await Promise.all([this.buildItemSearchType(assocType).then(t=>t.id),this.buildItemSearchTypeAll(constraints),]);return k===null?EMPTY_BINDINGS_ARRAY:[[k,v]];},))).flat());}else{bindings=EMPTY_BINDINGS_MAP;}}let result;if(id<0){result={id,name:"",ty:TY_GENERIC,path:null,exactPath:null,generics,bindings,unboxFlag:true,};}else if(id===0){result={id:null,name:"",ty:TY_GENERIC,path:null,exactPath:null,generics,bindings,unboxFlag:true,};}else{const[name,path,type]=await Promise.all([this.getName(id-1),this.getPathData(id-1),this.getTypeData(id-1),]);if(path===undefined||path===null||type===undefined||type===null){return{id:null,name:"",ty:TY_GENERIC,path:null,exactPath:null,generics,bindings,unboxFlag:true,};}result={id:id-1,name,ty:path.ty,path:path.modulePath,exactPath:path.exactModulePath===null?path.modulePath:path.exactModulePath,generics,bindings,unboxFlag:type.searchUnbox,};}const cr=this.TYPES_POOL.get(result.id);if(cr){if(cr.generics.length===result.generics.length&&cr.generics!==result.generics&&cr.generics.every((x,i)=>result.generics[i]===x)){result.generics=cr.generics;}if(cr.bindings.size===result.bindings.size&&cr.bindings!==result.bindings){let ok=true;for(const[k,v]of cr.bindings.entries()){const v2=result.bindings.get(k);if(!v2){ok=false;break;}if(v!==v2&&v.length===v2.length&&v.every((x,i)=>v2[i]===x)){result.bindings.set(k,v);}else if(v!==v2){ok=false;break;}}if(ok){result.bindings=cr.bindings;}}if(cr.ty===result.ty&&cr.path===result.path&&cr.bindings===result.bindings&&cr.generics===result.generics&&cr.ty===result.ty&&cr.name===result.name&&cr.unboxFlag===result.unboxFlag){return cr;}}this.TYPES_POOL.set(result.id,result);return result;}async execQuery(parsedQuery,filterCrates,currentCrate){const queryLen=parsedQuery.elems.reduce((acc,next)=>acc+next.pathLast.length,0)+parsedQuery.returned.reduce((acc,next)=>acc+next.pathLast.length,0);const maxEditDistance=Math.floor(queryLen/3);const buildHrefAndPath=item=>{let displayPath;let href;const type=itemTypes[item.ty];const name=item.name;let path=item.modulePath;let exactPath=item.exactModulePath;if(type==="mod"){displayPath=path+"::";href=this.rootPath+path.replace(/::/g,"/")+"/"+name+"/index.html";}else if(type==="import"){displayPath=item.modulePath+"::";href=this.rootPath+item.modulePath.replace(/::/g,"/")+"/index.html#reexport."+name;}else if(type==="primitive"||type==="keyword"){displayPath="";exactPath="";href=this.rootPath+path.replace(/::/g,"/")+"/"+type+"."+name+".html";}else if(type==="externcrate"){displayPath="";href=this.rootPath+name+"/index.html";}else if(item.parent){const myparent=item.parent;let anchor=type+"."+name;const parentType=itemTypes[myparent.path.ty];let pageType=parentType;let pageName=myparent.name;exactPath=`${myparent.path.exactModulePath}::${myparent.name}`;if(parentType==="primitive"){displayPath=myparent.name+"::";exactPath=myparent.name;}else if(type==="structfield"&&parentType==="variant"){const enumNameIdx=item.modulePath.lastIndexOf("::");const enumName=item.modulePath.substr(enumNameIdx+2);path=item.modulePath.substr(0,enumNameIdx);displayPath=path+"::"+enumName+"::"+myparent.name+"::";anchor="variant."+myparent.name+".field."+name;pageType="enum";pageName=enumName;}else{displayPath=path+"::"+myparent.name+"::";}if(item.entry&&item.entry.associatedItemDisambiguator!==null){anchor=item.entry.associatedItemDisambiguator+"/"+anchor;}href=this.rootPath+path.replace(/::/g,"/")+"/"+pageType+"."+pageName+".html#"+anchor;}else{displayPath=item.modulePath+"::";href=this.rootPath+item.modulePath.replace(/::/g,"/")+"/"+type+"."+name+".html";}return[displayPath,href,`${exactPath}::${name}`];};function pathSplitter(path){const tmp=""+path.replace(/::/g,"::");if(tmp.endsWith("")){return tmp.slice(0,tmp.length-6);}return tmp;}const formatDisplayTypeSignature=async(obj,typeInfo,elems,returned)=>{const objType=obj.type;if(!objType){return{type:[],mappedNames:new Map(),whereClause:new Map()};}let fnInputs=null;let fnOutput=null;let mgens=null;if(typeInfo!=="elems"&&typeInfo!=="returned"){fnInputs=unifyFunctionTypes(objType.inputs,elems,objType.where_clause,null,mgensScratch=>{fnOutput=unifyFunctionTypes(objType.output,returned,objType.where_clause,mgensScratch,mgensOut=>{mgens=mgensOut;return true;},0,);return!!fnOutput;},0,);}else{const highlighted=unifyFunctionTypes(typeInfo==="elems"?objType.inputs:objType.output,typeInfo==="elems"?elems:returned,objType.where_clause,null,mgensOut=>{mgens=mgensOut;return true;},0,);if(typeInfo==="elems"){fnInputs=highlighted;}else{fnOutput=highlighted;}}if(!fnInputs){fnInputs=objType.inputs;}if(!fnOutput){fnOutput=objType.output;}const mappedNames=new Map();const whereClause=new Map();const fnParamNames=obj.paramNames||[];const queryParamNames=[];const remapQuery=queryElem=>{if(queryElem.id!==null&&queryElem.id<0){queryParamNames[-1-queryElem.id]=queryElem.name;}if(queryElem.generics.length>0){queryElem.generics.forEach(remapQuery);}if(queryElem.bindings.size>0){[...queryElem.bindings.values()].flat().forEach(remapQuery);}};elems.forEach(remapQuery);returned.forEach(remapQuery);const pushText=(fnType,result)=>{if(!!(result.length%2)===!!fnType.highlighted){result.push("");}else if(result.length===0&&!!fnType.highlighted){result.push("");result.push("");}result[result.length-1]+=fnType.name;};const writeHof=async(fnType,result)=>{const hofOutput=fnType.bindings.get(this.typeNameIdOfOutput)||[];const hofInputs=fnType.generics;pushText(fnType,result);pushText({name:" (",highlighted:false},result);let needsComma=false;for(const fnType of hofInputs){if(needsComma){pushText({name:", ",highlighted:false},result);}needsComma=true;await writeFn(fnType,result);}pushText({name:hofOutput.length===0?")":") -> ",highlighted:false,},result);if(hofOutput.length>1){pushText({name:"(",highlighted:false},result);}needsComma=false;for(const fnType of hofOutput){if(needsComma){pushText({name:", ",highlighted:false},result);}needsComma=true;await writeFn(fnType,result);}if(hofOutput.length>1){pushText({name:")",highlighted:false},result);}};const writeSpecialPrimitive=async(fnType,result)=>{if(fnType.id===this.typeNameIdOfArray||fnType.id===this.typeNameIdOfSlice||fnType.id===this.typeNameIdOfTuple||fnType.id===this.typeNameIdOfUnit){const[ob,sb]=fnType.id===this.typeNameIdOfArray||fnType.id===this.typeNameIdOfSlice?["[","]"]:["(",")"];pushText({name:ob,highlighted:fnType.highlighted},result);await onEachBtwnAsync(fnType.generics,nested=>writeFn(nested,result),()=>pushText({name:", ",highlighted:false},result),);pushText({name:sb,highlighted:fnType.highlighted},result);return true;}else if(fnType.id===this.typeNameIdOfReference){pushText({name:"&",highlighted:fnType.highlighted},result);let prevHighlighted=false;await onEachBtwnAsync(fnType.generics,async value=>{prevHighlighted=!!value.highlighted;await writeFn(value,result);},value=>pushText({name:" ",highlighted:prevHighlighted&&value.highlighted,},result),);return true;}else if(fnType.id===this.typeNameIdOfFn||fnType.id===this.typeNameIdOfFnMut||fnType.id===this.typeNameIdOfFnOnce||fnType.id===this.typeNameIdOfFnPtr){await writeHof(fnType,result);return true;}else if(fnType.id===this.typeNameIdOfNever){pushText({name:"!",highlighted:fnType.highlighted},result);return true;}return false;};const writeFn=async(fnType,result)=>{if(fnType.id!==null&&fnType.id<0){if(fnParamNames[-1-fnType.id]===""){const generics=fnType.generics.length>0?fnType.generics:objType.where_clause[-1-fnType.id];for(const nested of generics){await writeFn(nested,result);}return;}else if(mgens){for(const[queryId,fnId]of mgens){if(fnId===fnType.id){mappedNames.set(queryParamNames[-1-queryId],fnParamNames[-1-fnType.id],);}}}pushText({name:fnParamNames[-1-fnType.id],highlighted:!!fnType.highlighted,},result);const where=[];await onEachBtwnAsync(fnType.generics,nested=>writeFn(nested,where),()=>pushText({name:" + ",highlighted:false},where),);if(where.length>0){whereClause.set(fnParamNames[-1-fnType.id],where);}}else{if(fnType.ty===TY_PRIMITIVE){if(await writeSpecialPrimitive(fnType,result)){return;}}else if(fnType.ty===TY_TRAIT&&(fnType.id===this.typeNameIdOfFn||fnType.id===this.typeNameIdOfFnMut||fnType.id===this.typeNameIdOfFnOnce||fnType.id===this.typeNameIdOfFnPtr)){await writeHof(fnType,result);return;}else if(fnType.name===""&&fnType.bindings.size===0&&fnType.generics.length!==0){pushText({name:"impl ",highlighted:false},result);if(fnType.generics.length>1){pushText({name:"(",highlighted:false},result);}await onEachBtwnAsync(fnType.generics,value=>writeFn(value,result),()=>pushText({name:", ",highlighted:false},result),);if(fnType.generics.length>1){pushText({name:")",highlighted:false},result);}return;}pushText(fnType,result);let hasBindings=false;if(fnType.bindings.size>0){await onEachBtwnAsync(await Promise.all([...fnType.bindings.entries()].map(async([key,values])=>[await this.getName(key),values],)),async([name,values])=>{if(values.length===1&&values[0].id<0&&`${fnType.name}::${name}`===fnParamNames[-1-values[0].id]){for(const value of values){await writeFn(value,[]);}return true;}if(!hasBindings){hasBindings=true;pushText({name:"<",highlighted:false},result);}pushText({name,highlighted:false},result);pushText({name:values.length!==1?"=(":"=",highlighted:false,},result);await onEachBtwnAsync(values||[],value=>writeFn(value,result),()=>pushText({name:" + ",highlighted:false},result),);if(values.length!==1){pushText({name:")",highlighted:false},result);}},()=>pushText({name:", ",highlighted:false},result),);}if(fnType.generics.length>0){pushText({name:hasBindings?", ":"<",highlighted:false},result);}await onEachBtwnAsync(fnType.generics,value=>writeFn(value,result),()=>pushText({name:", ",highlighted:false},result),);if(hasBindings||fnType.generics.length>0){pushText({name:">",highlighted:false},result);}}};const type=[];await onEachBtwnAsync(fnInputs,fnType=>writeFn(fnType,type),()=>pushText({name:", ",highlighted:false},type),);pushText({name:" -> ",highlighted:false},type);await onEachBtwnAsync(fnOutput,fnType=>writeFn(fnType,type),()=>pushText({name:", ",highlighted:false},type),);return{type,mappedNames,whereClause};};const transformResults=(results,typeInfo,duplicates)=>{const out=[];for(const[result,item]of results){if(item.id!==-1){const res=buildHrefAndPath(item);const obj=Object.assign({parent:item.parent?{path:item.parent.path.modulePath,exactPath:item.parent.path.exactModulePath||item.parent.path.modulePath,name:item.parent.name,ty:item.parent.path.ty,}:undefined,type:item.type&&item.type.functionSignature?item.type.functionSignature:undefined,paramNames:item.type&&item.type.paramNames?item.type.paramNames:undefined,dist:result.dist,path_dist:result.path_dist,index:result.index,desc:this.getDesc(result.id),item,displayPath:pathSplitter(res[0]),fullPath:"",href:"",displayTypeSignature:null,},result);obj.fullPath=res[2]+"|"+obj.item.ty;if(duplicates.has(obj.fullPath)){continue;}if(obj.item.ty===TY_IMPORT&&duplicates.has(res[2])){continue;}if(duplicates.has(res[2]+"|"+TY_IMPORT)){continue;}duplicates.add(obj.fullPath);duplicates.add(res[2]);if(typeInfo!==null){obj.displayTypeSignature=formatDisplayTypeSignature(obj,typeInfo,result.elems,result.returned,);}obj.href=res[1];out.push(obj);if(out.length>=MAX_RESULTS){break;}}}return out;};const sortAndTransformResults=async function*(results,typeInfo,preferredCrate,duplicates){const userQuery=parsedQuery.userQuery;const normalizedUserQuery=parsedQuery.userQuery.toLowerCase();const isMixedCase=normalizedUserQuery!==userQuery;const result_list=[];for(const result of results.values()){if(!result){continue;}const item=await this.getRow(result.id);if(!item){continue;}if(filterCrates!==null&&item.crate!==filterCrates){continue;}if(item){result_list.push([result,item]);}else{continue;}}result_list.sort(([aaa,aai],[bbb,bbi])=>{let a;let b;if(typeInfo===null){if(isMixedCase){a=Number(aai.name!==userQuery);b=Number(bbi.name!==userQuery);if(a!==b){return a-b;}}a=Number(aai.normalizedName!==normalizedUserQuery);b=Number(bbi.normalizedName!==normalizedUserQuery);if(a!==b){return a-b;}a=Number(aaa.index<0);b=Number(bbb.index<0);if(a!==b){return a-b;}}a=Number(aaa.path_dist);b=Number(bbb.path_dist);if(a!==b){return a-b;}a=Number(aaa.index);b=Number(bbb.index);if(a!==b){return a-b;}a=Number(aaa.dist);b=Number(bbb.dist);if(a!==b){return a-b;}a=Number(aaa.is_alias);b=Number(bbb.is_alias);if(a!==b){return a-b;}a=Number(aai.deprecated);b=Number(bbi.deprecated);if(a!==b){return a-b;}a=Number(aai.crate!==preferredCrate);b=Number(bbi.crate!==preferredCrate);if(a!==b){return a-b;}a=Number(aai.normalizedName.length);b=Number(bbi.normalizedName.length);if(a!==b){return a-b;}let aw=aai.normalizedName;let bw=bbi.normalizedName;if(aw!==bw){return(aw>bw?+1:-1);}const di=this.database.getData("desc");if(di){a=Number(di.isEmpty(aaa.id));b=Number(di.isEmpty(bbb.id));if(a!==b){return a-b;}}a=Number(aai.ty);b=Number(bbi.ty);if(a!==b){return a-b;}const ap=aai.modulePath;const bp=bbi.modulePath;aw=ap===undefined?"":ap;bw=bp===undefined?"":bp;if(aw!==bw){return(aw>bw?+1:-1);}return 0;});const transformed_result_list=transformResults(result_list,typeInfo,duplicates);yield*transformed_result_list;return transformed_result_list.length;}.bind(this);function unifyFunctionTypes(fnTypesIn,queryElems,whereClause,mgensIn,solutionCb,unboxingDepth,){if(unboxingDepth>=UNBOXING_LIMIT){return null;}const mgens=mgensIn===null?null:new Map(mgensIn);if(queryElems.length===0){return solutionCb(mgens)?fnTypesIn:null;}if(!fnTypesIn||fnTypesIn.length===0){return null;}const ql=queryElems.length;const fl=fnTypesIn.length;if(ql===1&&queryElems[0].generics.length===0&&queryElems[0].bindings.size===0){const queryElem=queryElems[0];for(const[i,fnType]of fnTypesIn.entries()){if(!unifyFunctionTypeIsMatchCandidate(fnType,queryElem,mgens)){continue;}if(fnType.id!==null&&fnType.id<0&&queryElem.id!==null&&queryElem.id<0){if(mgens&&mgens.has(queryElem.id)&&mgens.get(queryElem.id)!==fnType.id){continue;}const mgensScratch=new Map(mgens);mgensScratch.set(queryElem.id,fnType.id);if(!solutionCb||solutionCb(mgensScratch)){const highlighted=[...fnTypesIn];highlighted[i]=Object.assign({highlighted:true,},fnType,{generics:whereClause[-1-fnType.id],});return highlighted;}}else if(solutionCb(mgens?new Map(mgens):null)){const highlighted=[...fnTypesIn];highlighted[i]=Object.assign({highlighted:true,},fnType,{generics:unifyGenericTypes(fnType.generics,queryElem.generics,whereClause,mgens?new Map(mgens):null,solutionCb,unboxingDepth,)||fnType.generics,});return highlighted;}}for(const[i,fnType]of fnTypesIn.entries()){if(!unifyFunctionTypeIsUnboxCandidate(fnType,queryElem,whereClause,mgens,unboxingDepth+1,)){continue;}if(fnType.id<0){const highlightedGenerics=unifyFunctionTypes(whereClause[(-fnType.id)-1],queryElems,whereClause,mgens,solutionCb,unboxingDepth+1,);if(highlightedGenerics){const highlighted=[...fnTypesIn];highlighted[i]=Object.assign({highlighted:true,},fnType,{generics:highlightedGenerics,});return highlighted;}}else{const highlightedGenerics=unifyFunctionTypes([...Array.from(fnType.bindings.values()).flat(),...fnType.generics],queryElems,whereClause,mgens?new Map(mgens):null,solutionCb,unboxingDepth+1,);if(highlightedGenerics){const highlighted=[...fnTypesIn];highlighted[i]=Object.assign({},fnType,{generics:highlightedGenerics,bindings:new Map([...fnType.bindings.entries()].map(([k,v])=>{return[k,highlightedGenerics.splice(0,v.length)];})),});return highlighted;}}}return null;}const fnTypes=fnTypesIn.slice();const flast=fl-1;const qlast=ql-1;const queryElem=queryElems[qlast];let queryElemsTmp=null;for(let i=flast;i>=0;i-=1){const fnType=fnTypes[i];if(!unifyFunctionTypeIsMatchCandidate(fnType,queryElem,mgens)){continue;}let mgensScratch;if(fnType.id!==null&&queryElem.id!==null&&fnType.id<0){mgensScratch=new Map(mgens);if(mgensScratch.has(queryElem.id)&&mgensScratch.get(queryElem.id)!==fnType.id){continue;}mgensScratch.set(queryElem.id,fnType.id);}else{mgensScratch=mgens;}fnTypes[i]=fnTypes[flast];fnTypes.length=flast;if(!queryElemsTmp){queryElemsTmp=queryElems.slice(0,qlast);}let unifiedGenerics=[];let unifiedGenericsMgens=null;const passesUnification=unifyFunctionTypes(fnTypes,queryElemsTmp,whereClause,mgensScratch,mgensScratch=>{if(fnType.generics.length===0&&queryElem.generics.length===0&&fnType.bindings.size===0&&queryElem.bindings.size===0){return solutionCb(mgensScratch);}const solution=unifyFunctionTypeCheckBindings(fnType,queryElem,whereClause,mgensScratch,unboxingDepth,);if(!solution){return false;}const simplifiedGenerics=solution.simplifiedGenerics;for(const simplifiedMgens of solution.mgens){unifiedGenerics=unifyGenericTypes(simplifiedGenerics,queryElem.generics,whereClause,simplifiedMgens,solutionCb,unboxingDepth,);if(unifiedGenerics!==null){unifiedGenericsMgens=simplifiedMgens;return true;}}return false;},unboxingDepth,);if(passesUnification){passesUnification.length=fl;passesUnification[flast]=passesUnification[i];passesUnification[i]=Object.assign({},fnType,{highlighted:true,generics:unifiedGenerics,bindings:new Map([...fnType.bindings.entries()].map(([k,v])=>{return[k,queryElem.bindings.has(k)?unifyFunctionTypes(v,queryElem.bindings.get(k),whereClause,unifiedGenericsMgens,solutionCb,unboxingDepth,):unifiedGenerics.splice(0,v.length)];})),});return passesUnification;}fnTypes[flast]=fnTypes[i];fnTypes[i]=fnType;fnTypes.length=fl;}for(let i=flast;i>=0;i-=1){const fnType=fnTypes[i];if(!unifyFunctionTypeIsUnboxCandidate(fnType,queryElem,whereClause,mgens,unboxingDepth+1,)){continue;}const generics=fnType.id!==null&&fnType.id<0?whereClause[(-fnType.id)-1]:fnType.generics;const bindings=fnType.bindings?Array.from(fnType.bindings.values()).flat():[];const passesUnification=unifyFunctionTypes(fnTypes.toSpliced(i,1,...bindings,...generics),queryElems,whereClause,mgens,solutionCb,unboxingDepth+1,);if(passesUnification){const highlightedGenerics=passesUnification.slice(i,i+generics.length+bindings.length,);const highlightedFnType=Object.assign({},fnType,{generics:highlightedGenerics,bindings:new Map([...fnType.bindings.entries()].map(([k,v])=>{return[k,highlightedGenerics.splice(0,v.length)];})),});return passesUnification.toSpliced(i,generics.length+bindings.length,highlightedFnType,);}}return null;}function unifyGenericTypes(fnTypesIn,queryElems,whereClause,mgensIn,solutionCb,unboxingDepth,){if(unboxingDepth>=UNBOXING_LIMIT){return null;}const mgens=mgensIn===null?null:new Map(mgensIn);if(queryElems.length===0){return solutionCb(mgens)?fnTypesIn:null;}if(!fnTypesIn||fnTypesIn.length===0){return null;}const fnType=fnTypesIn[0];const queryElem=queryElems[0];if(unifyFunctionTypeIsMatchCandidate(fnType,queryElem,mgens)){if(fnType.id!==null&&fnType.id<0&&queryElem.id!==null&&queryElem.id<0){if(!mgens||!mgens.has(queryElem.id)||mgens.get(queryElem.id)===fnType.id){const mgensScratch=new Map(mgens);mgensScratch.set(queryElem.id,fnType.id);const fnTypesRemaining=unifyGenericTypes(fnTypesIn.slice(1),queryElems.slice(1),whereClause,mgensScratch,solutionCb,unboxingDepth,);if(fnTypesRemaining){const highlighted=[fnType,...fnTypesRemaining];highlighted[0]=Object.assign({highlighted:true,},fnType,{generics:whereClause[-1-fnType.id],});return highlighted;}}}else{let unifiedGenerics;const fnTypesRemaining=unifyGenericTypes(fnTypesIn.slice(1),queryElems.slice(1),whereClause,mgens,mgensScratch=>{const solution=unifyFunctionTypeCheckBindings(fnType,queryElem,whereClause,mgensScratch,unboxingDepth,);if(!solution){return false;}const simplifiedGenerics=solution.simplifiedGenerics;for(const simplifiedMgens of solution.mgens){unifiedGenerics=unifyGenericTypes(simplifiedGenerics,queryElem.generics,whereClause,simplifiedMgens,solutionCb,unboxingDepth,);if(unifiedGenerics!==null){return true;}}},unboxingDepth,);if(fnTypesRemaining){const highlighted=[fnType,...fnTypesRemaining];highlighted[0]=Object.assign({highlighted:true,},fnType,{generics:unifiedGenerics||fnType.generics,});return highlighted;}}}if(unifyFunctionTypeIsUnboxCandidate(fnType,queryElem,whereClause,mgens,unboxingDepth+1,)){let highlightedRemaining;if(fnType.id!==null&&fnType.id<0){const highlightedGenerics=unifyFunctionTypes(whereClause[(-fnType.id)-1],[queryElem],whereClause,mgens,mgensScratch=>{const hl=unifyGenericTypes(fnTypesIn.slice(1),queryElems.slice(1),whereClause,mgensScratch,solutionCb,unboxingDepth,);if(hl){highlightedRemaining=hl;}return hl;},unboxingDepth+1,);if(highlightedGenerics){return[Object.assign({highlighted:true,},fnType,{generics:highlightedGenerics,}),...highlightedRemaining];}}else{const highlightedGenerics=unifyGenericTypes([...Array.from(fnType.bindings.values()).flat(),...fnType.generics,],[queryElem],whereClause,mgens,mgensScratch=>{const hl=unifyGenericTypes(fnTypesIn.slice(1),queryElems.slice(1),whereClause,mgensScratch,solutionCb,unboxingDepth,);if(hl){highlightedRemaining=hl;}return hl;},unboxingDepth+1,);if(highlightedGenerics){return[Object.assign({},fnType,{generics:highlightedGenerics,bindings:new Map([...fnType.bindings.entries()].map(([k,v])=>{return[k,highlightedGenerics.splice(0,v.length)];})),}),...highlightedRemaining];}}}return null;}const unifyFunctionTypeIsMatchCandidate=(fnType,queryElem,mgensIn)=>{if(!typePassesFilter(queryElem.typeFilter,fnType.ty)){return false;}if(fnType.id!==null&&fnType.id<0&&queryElem.id!==null&&queryElem.id<0){if(mgensIn&&mgensIn.has(queryElem.id)&&mgensIn.get(queryElem.id)!==fnType.id){return false;}return true;}else{if(queryElem.id===this.typeNameIdOfArrayOrSlice&&(fnType.id===this.typeNameIdOfSlice||fnType.id===this.typeNameIdOfArray)){}else if(queryElem.id===this.typeNameIdOfTupleOrUnit&&(fnType.id===this.typeNameIdOfTuple||fnType.id===this.typeNameIdOfUnit)){}else if(queryElem.id===this.typeNameIdOfHof&&(fnType.id===this.typeNameIdOfFn||fnType.id===this.typeNameIdOfFnMut||fnType.id===this.typeNameIdOfFnOnce||fnType.id===this.typeNameIdOfFnPtr)){}else if(fnType.id!==queryElem.id||queryElem.id===null){return false;}if((fnType.generics.length+fnType.bindings.size)===0&&queryElem.generics.length!==0){return false;}if(fnType.bindings.size0){const fnTypePath=fnType.path!==undefined&&fnType.path!==null?fnType.path.split("::"):[];if(queryElemPathLength>fnTypePath.length){return false;}let i=0;for(const path of fnTypePath){if(path===queryElem.pathWithoutLast[i]){i+=1;if(i>=queryElemPathLength){break;}}}if(i0){let mgensSolutionSet=[mgensIn];for(const[name,constraints]of queryElem.bindings.entries()){if(mgensSolutionSet.length===0){return false;}if(!fnType.bindings.has(name)){return false;}const fnTypeBindings=fnType.bindings.get(name);mgensSolutionSet=mgensSolutionSet.flatMap(mgens=>{const newSolutions=[];unifyFunctionTypes(fnTypeBindings,constraints,whereClause,mgens,newMgens=>{newSolutions.push(newMgens);return false;},unboxingDepth,);return newSolutions;});}if(mgensSolutionSet.length===0){return false;}const binds=Array.from(fnType.bindings.entries()).flatMap(entry=>{const[name,constraints]=entry;if(queryElem.bindings.has(name)){return[];}else{return constraints;}});if(simplifiedGenerics.length>0){simplifiedGenerics=[...binds,...simplifiedGenerics];}else{simplifiedGenerics=binds;}return{simplifiedGenerics,mgens:mgensSolutionSet};}return{simplifiedGenerics,mgens:[mgensIn]};}function unifyFunctionTypeIsUnboxCandidate(fnType,queryElem,whereClause,mgens,unboxingDepth,){if(unboxingDepth>=UNBOXING_LIMIT){return false;}if(fnType.id!==null&&fnType.id<0){if(!whereClause){return false;}return checkIfInList(whereClause[(-fnType.id)-1],queryElem,whereClause,mgens,unboxingDepth,);}else if(fnType.unboxFlag&&(fnType.generics.length>0||fnType.bindings.size>0)){const simplifiedGenerics=[...fnType.generics,...Array.from(fnType.bindings.values()).flat(),];return checkIfInList(simplifiedGenerics,queryElem,whereClause,mgens,unboxingDepth,);}return false;}function containsTypeFromQuery(elems,list,where_clause){if(!list)return false;for(const ty of elems){if(ty.id!==null&&ty.id<0){continue;}if(checkIfInList(list,ty,where_clause,null,0)){return true;}}return false;}function checkIfInList(list,elem,whereClause,mgens,unboxingDepth){for(const entry of list){if(checkType(entry,elem,whereClause,mgens,unboxingDepth)){return true;}}return false;}const checkType=(row,elem,whereClause,mgens,unboxingDepth)=>{if(unboxingDepth>=UNBOXING_LIMIT){return false;}if(row.id!==null&&elem.id!==null&&row.id>0&&elem.id>0&&elem.pathWithoutLast.length===0&&row.generics.length===0&&elem.generics.length===0&&row.bindings.size===0&&elem.bindings.size===0&&elem.id!==this.typeNameIdOfArrayOrSlice&&elem.id!==this.typeNameIdOfHof&&elem.id!==this.typeNameIdOfTupleOrUnit){return row.id===elem.id&&typePassesFilter(elem.typeFilter,row.ty);}else{return unifyFunctionTypes([row],[elem],whereClause,mgens,()=>true,unboxingDepth,);}};const checkTypeMgensForConflict=mgens=>{if(!mgens){return true;}const fnTypes=new Set();for(const[_qid,fid]of mgens){if(fnTypes.has(fid)){return false;}fnTypes.add(fid);}return true;};function checkPath(contains,path){if(contains.length===0){return 0;}const maxPathEditDistance=Math.floor(contains.reduce((acc,next)=>acc+next.length,0)/3,);let ret_dist=maxPathEditDistance+1;const length=path.length;const clength=contains.length;pathiter:for(let i=length-clength;i>=0;i-=1){let dist_total=0;for(let x=0;xmaxPathEditDistance){continue pathiter;}dist_total+=dist;}}ret_dist=Math.min(ret_dist,Math.round(dist_total/clength));}return ret_dist>maxPathEditDistance?null:ret_dist;}function checkRowPath(contains,row){if(contains.length===0){return 0;}const path=row.modulePath.split("::");if(row.parent&&row.parent.name){path.push(row.parent.name.toLowerCase());}return checkPath(contains,path);}function typePassesFilter(filter,type){if(filter<=NO_TYPE_FILTER||filter===type)return true;const name=itemTypes[type];switch(itemTypes[filter]){case"constant":return name==="associatedconstant";case"fn":return name==="method"||name==="tymethod";case"type":return name==="primitive"||name==="associatedtype";case"trait":return name==="traitalias";}return false;}const innerRunNameQuery=async function*(currentCrate){const index=this.database.getIndex("normalizedName");if(!index){return;}const idDuplicates=new Set();const pathDuplicates=new Set();let count=0;const prefixResults=[];const normalizedUserQuery=parsedQuery.userQuery.replace(/[_"]/g,"").toLowerCase();const handleAlias=async(name,alias,dist,index)=>{return{id:alias,dist,path_dist:0,index,alias:name,is_alias:true,elems:[],returned:[],original:await this.getRow(alias),};};const flush=async function*(data){const satr=sortAndTransformResults(await Promise.all(data),null,currentCrate,pathDuplicates,);data.length=0;for await(const processed of satr){yield processed;count+=1;if((count&0x7F)===0){await yieldToBrowser();}if(count>=MAX_RESULTS){return true;}}return false;};const aliasResults=await index.search(normalizedUserQuery);if(aliasResults){for(const id of aliasResults.matches().entries()){const[name,alias]=await Promise.all([this.getName(id),this.getAliasTarget(id),]);if(name!==null&&alias!==null&&!idDuplicates.has(id)&&name.replace(/[_"]/g,"").toLowerCase()===normalizedUserQuery){prefixResults.push(handleAlias(name,alias,0,0));idDuplicates.add(id);}}}if(parsedQuery.error!==null||parsedQuery.elems.length===0){yield*flush(prefixResults);return;}const elem=parsedQuery.elems[0];const typeFilter=itemTypeFromName(elem.typeFilter);const handleNameSearch=async id=>{const row=await this.getRow(id);if(!row||!row.entry){return null;}if(!typePassesFilter(typeFilter,row.ty)||(filterCrates!==null&&row.crate!==filterCrates)){return null;}let pathDist=0;if(elem.fullPath.length>1){pathDist=checkRowPath(elem.pathWithoutLast,row);if(pathDist===null){return null;}}if(parsedQuery.literalSearch){return row.name.toLowerCase()===elem.pathLast?{id,dist:0,path_dist:0,index:0,elems:[],returned:[],is_alias:false,}:null;}else{return{id,dist:editDistance(row.normalizedName,elem.normalizedPathLast,maxEditDistance,),path_dist:pathDist,index:row.normalizedName.indexOf(elem.normalizedPathLast),elems:[],returned:[],is_alias:false,};}};if(elem.normalizedPathLast===""){const nameData=this.database.getData("name");const l=nameData?nameData.length:0;for(let id=0;id{let i=0;const l=idx.length;while(i{if(!elem){return empty_postings_list;}const typeFilter=itemTypeFromName(elem.typeFilter);const searchResults=await index.search(elem.normalizedPathLast);const typePromises=[];if(typeFilter!==TY_GENERIC&&searchResults){for(const id of searchResults.matches().entries()){typePromises.push(Promise.all([this.getName(id),this.getTypeData(id),this.getPathData(id),]).then(([name,typeData,pathData])=>[id,name,typeData,pathData]));}}const types=(await Promise.all(typePromises)).filter(([_id,name,ty,path])=>name!==null&&name.toLowerCase()===elem.pathLast&&ty&&!ty.invertedFunctionSignatureIndex.every(bitmap=>{return bitmap.isEmpty();})&&path&&path.ty!==TY_ASSOCTYPE&&(elem.pathWithoutLast.length===0||checkPath(elem.pathWithoutLast,path.modulePath.split("::"),)===0),);if(types.length===0){const areGenericsAllowed=typeFilter===TY_GENERIC||(typeFilter===-1&&(parsedQuery.totalElems>1||parsedQuery.hasReturnArrow)&&elem.pathWithoutLast.length===0&&elem.generics.length===0&&elem.bindings.size===0);if(typeFilter!==TY_GENERIC&&(elem.name.length>=3||!areGenericsAllowed)){let chosenName=null;let chosenType=[];let chosenPath=[];let chosenId=[];let chosenDist=Number.MAX_SAFE_INTEGER;const levResults=index.searchLev(elem.normalizedPathLast);for await(const searchResults of levResults){for(const id of searchResults.matches().entries()){const[name,ty,path]=await Promise.all([this.getName(id),this.getTypeData(id),this.getPathData(id),]);if(name!==null&&ty!==null&&path!==null&&!ty.invertedFunctionSignatureIndex.every(bitmap=>{return bitmap.isEmpty();})&&path.ty!==TY_ASSOCTYPE){let dist=editDistance(name,elem.pathLast,maxEditDistance,);if(elem.pathWithoutLast.length!==0){const pathDist=checkPath(elem.pathWithoutLast,path.modulePath.split("::"),);dist+=pathDist===null?Number.MAX_SAFE_INTEGER:pathDist;}if(name===chosenName){chosenId.push(id);chosenType.push(ty);chosenPath.push(path);}else if(dist{const p1=!pathData1?"":pathData1.modulePath;const p2=!pathData2?"":pathData2.modulePath;const n1=name1===null?"":name1;const n2=name2===null?"":name2;if(p1.length!==p2.length){return p1.length>p2.length?+1:-1;}if(n1.length!==n2.length){return n1.length>n2.length?+1:-1;}if(n1!==n2){return n1>n2?+1:-1;}if(p1!==p2){return p1>p2?+1:-1;}return 0;});const results=[];for(const[id,_name,typeData]of types){if(!typeData||typeData.invertedFunctionSignatureIndex.every(bitmap=>{return bitmap.isEmpty();})){continue;}const upla=await unpackPostingsListAll(elem.generics);const uplb=await unpackPostingsListBindings(elem.bindings);for(const{invertedIndex:genericsIdx,queryElem:generics}of upla){for(const{invertedIndex:bindingsIdx,queryElem:bindings}of uplb){results.push({invertedIndex:intersectInvertedIndexes(typeData.invertedFunctionSignatureIndex,genericsIdx,bindingsIdx,),queryElem:{name:elem.name,id,typeFilter,generics,bindings,fullPath:elem.fullPath,pathLast:elem.pathLast,normalizedPathLast:elem.normalizedPathLast,pathWithoutLast:elem.pathWithoutLast,},});if((results.length&0x7F)===0){await yieldToBrowser();}}}}return results;};const unpackPostingsListAll=async elems=>{if(!elems||elems.length===0){return nested_everything_postings_list;}const[firstPostingsList,remainingAll]=await Promise.all([unpackPostingsList(elems[0]),unpackPostingsListAll(elems.slice(1)),]);const results=[];for(const{invertedIndex:firstIdx,queryElem:firstElem,}of firstPostingsList){for(const{invertedIndex:remainingIdx,queryElem:remainingElems,}of remainingAll){results.push({invertedIndex:intersectInvertedIndexes(firstIdx,remainingIdx),queryElem:[firstElem,...remainingElems],});if((results.length&0x7F)===0){await yieldToBrowser();}}}return results;};const unpackPostingsListBindings=async elems=>{if(!elems){return[{invertedIndex:everything_inverted_index,queryElem:new Map(),}];}const firstKey=elems.keys().next().value;if(firstKey===undefined){return[{invertedIndex:everything_inverted_index,queryElem:new Map(),}];}const firstList=elems.get(firstKey);if(firstList===undefined){return[{invertedIndex:everything_inverted_index,queryElem:new Map(),}];}const firstKeyIds=await index.search(firstKey);if(!firstKeyIds){return[{invertedIndex:empty_inverted_index,queryElem:new Map(),}];}elems.delete(firstKey);const[firstPostingsList,remainingAll]=await Promise.all([unpackPostingsListAll(firstList),unpackPostingsListBindings(elems),]);const results=[];for(const keyId of firstKeyIds.matches().entries()){for(const{invertedIndex:firstIdx,queryElem:firstElem,}of firstPostingsList){for(const{invertedIndex:remainingIdx,queryElem:remainingElems,}of remainingAll){const elems=new Map(remainingElems);elems.set(keyId,firstElem);results.push({invertedIndex:intersectInvertedIndexes(firstIdx,remainingIdx),queryElem:elems,});if((results.length&0x7F)===0){await yieldToBrowser();}}}}elems.set(firstKey,firstList);if(results.length===0){return[{invertedIndex:empty_inverted_index,queryElem:new Map(),}];}return results;};const[allInputs,allOutput]=await Promise.all([unpackPostingsListAll(inputs),unpackPostingsListAll(output),]);let checkCounter=0;const queryPlan=[];for(const{invertedIndex:inputsIdx,queryElem:inputs}of allInputs){for(const{invertedIndex:outputIdx,queryElem:output}of allOutput){const invertedIndex=intersectInvertedIndexes(inputsIdx,outputIdx);for(const[size,bitmap]of invertedIndex.entries()){checkCounter+=1;if((checkCounter&0x7F)===0){await yieldToBrowser();}if(!queryPlan[size]){queryPlan[size]=[];}queryPlan[size].push({bitmap,inputs,output,});}}}const resultPromises=[];const dedup=new Set();let resultCounter=0;const isReturnTypeQuery=inputs.length===0;const pushToBottom=[];plan:for(const queryStep of queryPlan){for(const{bitmap,inputs,output}of queryStep){for(const id of bitmap.entries()){checkCounter+=1;if((checkCounter&0x7F)===0){await yieldToBrowser();}resultPromises.push(this.getFunctionData(id).then(async fnData=>{if(!fnData||!fnData.functionSignature){return null;}checkCounter+=1;if((checkCounter&0x7F)===0){await yieldToBrowser();}const functionSignature=fnData.functionSignature;if(!unifyFunctionTypes(functionSignature.inputs,inputs,functionSignature.where_clause,null,mgens=>{return!!unifyFunctionTypes(functionSignature.output,output,functionSignature.where_clause,mgens,checkTypeMgensForConflict,0,);},0,)){return null;}const result={id,dist:fnData.elemCount,path_dist:0,index:-1,elems:inputs,returned:output,is_alias:false,};const entry=await this.getEntryData(id);if((entry&&!isFnLikeTy(entry.ty))||(isReturnTypeQuery&&functionSignature&&containsTypeFromQuery(output,functionSignature.inputs,functionSignature.where_clause,))){pushToBottom.push(result);return null;}return result;}));}}for await(const result of sortAndTransformResults(await Promise.all(resultPromises),typeInfo,currentCrate,dedup,)){if(resultCounter>=MAX_RESULTS){break plan;}yield result;resultCounter+=1;}resultPromises.length=0;}if(resultCounter>=MAX_RESULTS){return;}for await(const result of sortAndTransformResults(await Promise.all(pushToBottom),typeInfo,currentCrate,dedup,)){if(resultCounter>=MAX_RESULTS){break;}yield result;resultCounter+=1;}}.bind(this);if(parsedQuery.foundElems===1&&!parsedQuery.hasReturnArrow){const{promise:donePromise,resolve:doneResolve,reject:doneReject,}=Promise.withResolvers();const doneTimeout=timeout(250);return{"in_args":(async function*(){await Promise.race([donePromise,doneTimeout]);yield*innerRunTypeQuery(parsedQuery.elems,[],"elems",currentCrate);})(),"returned":(async function*(){await Promise.race([donePromise,doneTimeout]);yield*innerRunTypeQuery([],parsedQuery.elems,"returned",currentCrate);})(),"others":(async function*(){try{yield*innerRunNameQuery(currentCrate);doneResolve(null);}catch(e){doneReject(e);throw e;}})(),"query":parsedQuery,};}else if(parsedQuery.error!==null){return{"in_args":(async function*(){})(),"returned":(async function*(){})(),"others":innerRunNameQuery(currentCrate),"query":parsedQuery,};}else{const typeInfo=parsedQuery.elems.length===0?"returned":(parsedQuery.returned.length===0?"elems":"sig");return{"in_args":(async function*(){})(),"returned":(async function*(){})(),"others":parsedQuery.foundElems===0?(async function*(){})():innerRunTypeQuery(parsedQuery.elems,parsedQuery.returned,typeInfo,currentCrate,),"query":parsedQuery,};}}}let docSearch;const longItemTypes=["keyword","primitive type","module","extern crate","re-export","struct","enum","function","type alias","static","trait","","trait method","method","struct field","enum variant","macro","assoc type","constant","assoc const","union","foreign type","existential type","attribute macro","derive macro","trait alias",];let currentResults;function printTab(nb){let iter=0;let foundCurrentTab=false;let foundCurrentResultSet=false;onEachLazy(document.getElementById("search-tabs").childNodes,elem=>{if(nb===iter){addClass(elem,"selected");foundCurrentTab=true;}else{removeClass(elem,"selected");}iter+=1;});const isTypeSearch=(nb>0||iter===1);iter=0;onEachLazy(document.getElementById("results").childNodes,elem=>{if(nb===iter){addClass(elem,"active");foundCurrentResultSet=true;}else{removeClass(elem,"active");}iter+=1;});if(foundCurrentTab&&foundCurrentResultSet){searchState.currentTab=nb;const correctionsElem=document.getElementsByClassName("search-corrections");if(isTypeSearch){removeClass(correctionsElem[0],"hidden");}else{addClass(correctionsElem[0],"hidden");}}else if(nb!==0){printTab(0);}}function buildUrl(search,filterCrates){let extra="?search="+encodeURIComponent(search);if(filterCrates!==null){extra+="&filter-crate="+encodeURIComponent(filterCrates);}return getNakedUrl()+extra+window.location.hash;}function getFilterCrates(){const elem=document.getElementById("crate-search");if(elem&&elem.value!=="all crates"){return elem.value;}return null;}function nextTab(direction){const next=(searchState.currentTab+direction+3)%searchState.focusedByTab.length;window.searchState.focusedByTab[searchState.currentTab]=document.activeElement;printTab(next);focusSearchResult();}function focusSearchResult(){const target=searchState.focusedByTab[searchState.currentTab]||document.querySelectorAll(".search-results.active a").item(0)||document.querySelectorAll("#search-tabs button").item(searchState.currentTab);searchState.focusedByTab[searchState.currentTab]=null;if(target&&target instanceof HTMLElement){target.focus();}}async function addTab(results,query,display,finishedCallback,isTypeSearch){const extraClass=display?" active":"";let output=document.createElement("ul");output.className="search-results "+extraClass;let count=0;const descList=[];const addNextResultToOutput=async obj=>{count+=1;const name=obj.item.name;const type=itemTypes[obj.item.ty];const longType=longItemTypes[obj.item.ty];const typeName=longType.length!==0?`${longType}`:"?";const link=document.createElement("a");link.className="result-"+type;link.href=obj.href;const resultName=document.createElement("span");resultName.className="result-name";resultName.insertAdjacentHTML("beforeend",`${typeName}`);link.appendChild(resultName);let alias=" ";if(obj.alias!==undefined){alias=`
\ +${obj.alias} - see \ +
`;}resultName.insertAdjacentHTML("beforeend",`
${alias}\ +${obj.displayPath}${name}\ +
`);const description=document.createElement("div");description.className="desc";obj.desc.then(desc=>{if(desc!==null){description.insertAdjacentHTML("beforeend",desc);}});descList.push(obj.desc);if(obj.displayTypeSignature){const{type,mappedNames,whereClause}=await obj.displayTypeSignature;const displayType=document.createElement("div");type.forEach((value,index)=>{if(index%2!==0){const highlight=document.createElement("strong");highlight.appendChild(document.createTextNode(value));displayType.appendChild(highlight);}else{displayType.appendChild(document.createTextNode(value));}});if(mappedNames.size>0||whereClause.size>0){let addWhereLineFn=()=>{const line=document.createElement("div");line.className="where";line.appendChild(document.createTextNode("where"));displayType.appendChild(line);addWhereLineFn=()=>{};};for(const[qname,name]of mappedNames){if(name===qname){continue;}addWhereLineFn();const line=document.createElement("div");line.className="where";line.appendChild(document.createTextNode(` ${qname} matches `));const lineStrong=document.createElement("strong");lineStrong.appendChild(document.createTextNode(name));line.appendChild(lineStrong);displayType.appendChild(line);}for(const[name,innerType]of whereClause){if(innerType.length<=1){continue;}addWhereLineFn();const line=document.createElement("div");line.className="where";line.appendChild(document.createTextNode(` ${name}: `));innerType.forEach((value,index)=>{if(index%2!==0){const highlight=document.createElement("strong");highlight.appendChild(document.createTextNode(value));line.appendChild(highlight);}else{line.appendChild(document.createTextNode(value));}});displayType.appendChild(line);}}displayType.className="type-signature";link.appendChild(displayType);}link.appendChild(description);output.appendChild(link);results.next().then(async nextResult=>{if(nextResult.value){addNextResultToOutput(nextResult.value);}else{await Promise.all(descList);yieldToBrowser().then(()=>finishedCallback(count,output));}});};const firstResult=await results.next();let correctionOutput="";if(query.correction!==null&&isTypeSearch){const orig=query.returned.length>0?query.returned[0].name:query.elems[0].name;correctionOutput="

"+`Type "${orig}" not found. `+"Showing results for closest type name "+`"${query.correction}" instead.

`;}if(query.proposeCorrectionFrom!==null&&isTypeSearch){const orig=query.proposeCorrectionFrom;const targ=query.proposeCorrectionTo;correctionOutput="

"+`Type "${orig}" not found and used as generic parameter. `+`Consider searching for "${targ}" instead.

`;}if(firstResult.value){if(correctionOutput!==""){const h3=document.createElement("h3");h3.innerHTML=correctionOutput;output.appendChild(h3);}await addNextResultToOutput(firstResult.value);}else{output=document.createElement("div");if(correctionOutput!==""){const h3=document.createElement("h3");h3.innerHTML=correctionOutput;output.appendChild(h3);}output.className="search-failed"+extraClass;const dlroChannel=`https://doc.rust-lang.org/${getVar("channel")}`;if(query.userQuery!==""){output.innerHTML+="No results :(
"+"Try on DuckDuckGo?

"+"Or try looking in one of these:";}output.innerHTML+="Example searches:";yieldToBrowser().then(()=>finishedCallback(0,output));}return output;}function makeTab(tabNb,text,results,query,isTypeSearch,goToFirst){const isCurrentTab=window.searchState.currentTab===tabNb;const tabButton=document.createElement("button");tabButton.appendChild(document.createTextNode(text));tabButton.className=isCurrentTab?"selected":"";const tabCount=document.createElement("span");tabCount.className="count loading";tabCount.innerHTML="\u{2007}(\u{2007})\u{2007}\u{2007}";tabButton.appendChild(tabCount);return[tabButton,addTab(results,query,isCurrentTab,(count,output)=>{const search=window.searchState.outputElement();const error=query.error;if(count===0&&error!==null&&search){error.forEach((value,index)=>{value=value.split("<").join("<").split(">").join(">");if(index%2!==0){error[index]=`${value.replaceAll(" ", " ")}`;}else{error[index]=value;}});const errorReport=document.createElement("h3");errorReport.className="error";errorReport.innerHTML=`Query parser error: "${error.join("")}".`;search.insertBefore(errorReport,search.firstElementChild);}else if(goToFirst||(count===1&&getSettingValue("go-to-only-result")==="true")){window.onunload=()=>{};window.searchState.removeQueryParameters();const a=output.querySelector("a");if(a){a.click();return;}}const fmtNbElems=count<10?`\u{2007}(${count})\u{2007}\u{2007}`:count<100?`\u{2007}(${count})\u{2007}`:`\u{2007}(${count})`;tabCount.innerHTML=fmtNbElems;tabCount.className="count";},isTypeSearch),];}async function showResults(docSearch,results,goToFirst,filterCrates){const search=window.searchState.outputElement();if(!search){return;}let crates="";const crateNames=await docSearch.getCrateNameList();if(crateNames.length>1){crates=" in 
"+"
";}nonnull(document.querySelector(".search-switcher")).innerHTML=`Search results${crates}`;const tabs=[];searchState.currentTab=0;if(results.query.error!==null){tabs.push(makeTab(0,"In Names",results.others,results.query,false,goToFirst));}else if(results.query.foundElems<=1&&results.query.returned.length===0&&!results.query.hasReturnArrow){tabs.push(makeTab(0,"In Names",results.others,results.query,false,goToFirst));tabs.push(makeTab(1,"In Parameters",results.in_args,results.query,true,false));tabs.push(makeTab(2,"In Return Types",results.returned,results.query,true,false));}else{const signatureTabTitle=results.query.elems.length===0?"In Function Return Types":results.query.returned.length===0?"In Function Parameters":"In Function Signatures";tabs.push(makeTab(0,signatureTabTitle,results.others,results.query,true,goToFirst));}const tabsElem=document.createElement("div");tabsElem.id="search-tabs";const resultsElem=document.createElement("div");resultsElem.id="results";search.innerHTML="";for(const[tab,output]of tabs){tabsElem.appendChild(tab);const placeholder=document.createElement("div");output.then(output=>{if(placeholder.parentElement){placeholder.parentElement.replaceChild(output,placeholder);}});resultsElem.appendChild(placeholder);}if(window.searchState.rustdocToolbar){nonnull(nonnull(window.searchState.containerElement()).querySelector(".main-heading"),).appendChild(window.searchState.rustdocToolbar);}const crateSearch=document.getElementById("crate-search");if(crateSearch){crateSearch.addEventListener("input",updateCrate);}search.appendChild(tabsElem);search.appendChild(resultsElem);window.searchState.showResults();window.searchState.focusedByTab=[null,null,null];let i=0;for(const elem of tabsElem.childNodes){const j=i;elem.onclick=()=>printTab(j);window.searchState.focusedByTab[i]=null;i+=1;}printTab(0);}function updateSearchHistory(url){const btn=document.querySelector("#search-button a");if(btn instanceof HTMLAnchorElement){btn.href=url;}if(!browserSupportsHistoryApi()){return;}const params=searchState.getQueryStringParams();if(!history.state&¶ms.search===undefined){history.pushState(null,"",url);}else{history.replaceState(null,"",url);}}async function search(forced){const query=DocSearch.parseQuery(nonnull(window.searchState.inputElement()).value.trim());let filterCrates=getFilterCrates();if(!forced&&query.userQuery===currentResults){if(query.userQuery.length>0){putBackSearch();}return;}currentResults=query.userQuery;searchState.setLoadingSearch();const params=searchState.getQueryStringParams();if(filterCrates===null&¶ms["filter-crate"]!==undefined){filterCrates=params["filter-crate"];}if(filterCrates!==null&&(await docSearch.getCrateNameList()).indexOf(filterCrates)===-1){filterCrates=null;}searchState.title="\""+query.userQuery+"\" Search - Rust";updateSearchHistory(buildUrl(query.userQuery,filterCrates));await showResults(docSearch,await docSearch.execQuery(query,filterCrates,window.currentCrate),params.go_to_first,filterCrates);}function onSearchSubmit(e){e.preventDefault();searchState.clearInputTimeout();search();}function putBackSearch(){const search_input=window.searchState.inputElement();if(!search_input){return;}if(search_input.value!==""&&!searchState.isDisplayed()){searchState.showResults();if(browserSupportsHistoryApi()){history.replaceState(null,"",buildUrl(search_input.value,getFilterCrates()));}document.title=searchState.title;}}function registerSearchEvents(){const params=searchState.getQueryStringParams();const inputElement=nonnull(window.searchState.inputElement());if(inputElement.value===""){inputElement.value=params.search||"";}const searchAfter500ms=()=>{searchState.clearInputTimeout();window.searchState.timeout=setTimeout(search,500);};inputElement.onkeyup=searchAfter500ms;inputElement.oninput=searchAfter500ms;if(inputElement.form){inputElement.form.onsubmit=onSearchSubmit;}inputElement.onchange=e=>{if(e.target!==document.activeElement){return;}searchState.clearInputTimeout();setTimeout(search,0);};inputElement.onpaste=inputElement.onchange;searchState.outputElement().addEventListener("keydown",e=>{if(!(e instanceof KeyboardEvent)){return;}if(e.altKey||e.ctrlKey||e.shiftKey||e.metaKey){return;}if(e.which===38){const previous=document.activeElement.previousElementSibling;if(previous){previous.focus();}else{searchState.focus();}e.preventDefault();}else if(e.which===40){const next=document.activeElement.nextElementSibling;if(next){next.focus();}const rect=document.activeElement.getBoundingClientRect();if(window.innerHeight-rect.bottom{if(e.which===40){focusSearchResult();e.preventDefault();}});inputElement.addEventListener("focus",()=>{putBackSearch();});}function updateCrate(ev){if(ev.target.value==="all crates"){const query=nonnull(window.searchState.inputElement()).value.trim();updateSearchHistory(buildUrl(query,null));}currentResults=null;search(true);}const makeUint8ArrayFromBase64=Uint8Array.fromBase64?Uint8Array.fromBase64:(string=>{const bytes_as_string=atob(string);const l=bytes_as_string.length;const bytes=new Uint8Array(l);for(let i=0;i{removeClass(form,"loading");});registerSearchEvents();if(window.searchState.getQueryStringParams().search!==undefined){search();}}else if(typeof exports!=="undefined"){docSearch=new DocSearch(ROOT_PATH,database);await docSearch.buildIndex();return{docSearch,DocSearch};}};if(typeof window!=="undefined"){const ROOT_PATH=window.rootPath;let databaseCallbacks=null;initSearch(window.Stringdex,window.RoaringBitmap,{loadRoot:callbacks=>{for(const key in callbacks){if(Object.hasOwn(callbacks,key)){window[key]=callbacks[key];}}databaseCallbacks=callbacks;if(window.searchIndex){window.rr_(window.searchIndex);}},loadTreeByHash:hashHex=>{const script=document.createElement("script");script.src=`${ROOT_PATH}/search.index/${hashHex}.js`;script.onerror=e=>{if(databaseCallbacks){databaseCallbacks.err_rn_(hashHex,e);}};document.documentElement.appendChild(script);},loadDataByNameAndHash:(name,hashHex)=>{const script=document.createElement("script");script.src=`${ROOT_PATH}/search.index/${name}/${hashHex}.js`;script.onerror=e=>{if(databaseCallbacks){databaseCallbacks.err_rd_(hashHex,e);}};document.documentElement.appendChild(script);},});}else if(typeof exports!=="undefined"){exports.initSearch=initSearch;} \ No newline at end of file diff --git a/next/static.files/settings-c38705f0.js b/next/static.files/settings-c38705f0.js new file mode 100644 index 0000000..7e4939e --- /dev/null +++ b/next/static.files/settings-c38705f0.js @@ -0,0 +1,17 @@ +"use strict";(function(){const isSettingsPage=window.location.pathname.endsWith("/settings.html");function changeSetting(settingName,value){if(settingName==="theme"){const useSystem=value==="system preference"?"true":"false";updateLocalStorage("use-system-theme",useSystem);}updateLocalStorage(settingName,""+value);switch(settingName){case"theme":case"preferred-dark-theme":case"preferred-light-theme":updateTheme();updateLightAndDark();break;case"line-numbers":if(value===true){const f=window.rustdoc_add_line_numbers_to_examples;if(f!==undefined){f();}}else{const f=window.rustdoc_remove_line_numbers_from_examples;if(f!==undefined){f();}}break;case"hide-sidebar":if(value===true){addClass(document.documentElement,"hide-sidebar");}else{removeClass(document.documentElement,"hide-sidebar");}break;case"hide-toc":if(value===true){addClass(document.documentElement,"hide-toc");}else{removeClass(document.documentElement,"hide-toc");}break;case"hide-modnav":if(value===true){addClass(document.documentElement,"hide-modnav");}else{removeClass(document.documentElement,"hide-modnav");}break;case"sans-serif-fonts":if(value===true){addClass(document.documentElement,"sans-serif");}else{removeClass(document.documentElement,"sans-serif");}break;case"word-wrap-source-code":if(value===true){addClass(document.documentElement,"word-wrap-source-code");}else{removeClass(document.documentElement,"word-wrap-source-code");}break;}}function showLightAndDark(){removeClass(document.getElementById("preferred-light-theme"),"hidden");removeClass(document.getElementById("preferred-dark-theme"),"hidden");}function hideLightAndDark(){addClass(document.getElementById("preferred-light-theme"),"hidden");addClass(document.getElementById("preferred-dark-theme"),"hidden");}function updateLightAndDark(){const useSystem=getSettingValue("use-system-theme");if(useSystem==="true"||(useSystem===null&&getSettingValue("theme")===null)){showLightAndDark();}else{hideLightAndDark();}}function setEvents(settingsElement){updateLightAndDark();onEachLazy(settingsElement.querySelectorAll("input[type=\"checkbox\"]"),toggle=>{const settingId=toggle.id;const settingValue=getSettingValue(settingId);if(settingValue!==null){toggle.checked=settingValue==="true";}toggle.onchange=()=>{changeSetting(toggle.id,toggle.checked);};});onEachLazy(settingsElement.querySelectorAll("input[type=\"radio\"]"),elem=>{const settingId=elem.name;let settingValue=getSettingValue(settingId);if(settingId==="theme"){const useSystem=getSettingValue("use-system-theme");if(useSystem==="true"||settingValue===null){settingValue=useSystem==="false"?"light":"system preference";}}if(settingValue!==null&&settingValue!=="null"){elem.checked=settingValue===elem.value;}elem.addEventListener("change",()=>{changeSetting(elem.name,elem.value);});},);}function buildSettingsPageSections(settings){let output="";for(const setting of settings){const js_data_name=setting["js_name"];const setting_name=setting["name"];if(setting["options"]!==undefined){output+=`\ +
+
${setting_name}
+
`;onEach(setting["options"],option=>{const checked=option===setting["default"]?" checked":"";const full=`${js_data_name}-${option.replace(/ /g,"-")}`;output+=`\ + `;});output+=`\ +
+
`;}else{const checked=setting["default"]===true?" checked":"";output+=`\ +
\ + \ +
`;}}return output;}function buildSettingsPage(){const theme_list=getVar("themes");const theme_names=(theme_list===null?"":theme_list).split(",").filter(t=>t);theme_names.push("light","dark","ayu");const settings=[{"name":"Theme","js_name":"theme","default":"system preference","options":theme_names.concat("system preference"),},{"name":"Preferred light theme","js_name":"preferred-light-theme","default":"light","options":theme_names,},{"name":"Preferred dark theme","js_name":"preferred-dark-theme","default":"dark","options":theme_names,},{"name":"Auto-hide item contents for large items","js_name":"auto-hide-large-items","default":true,},{"name":"Auto-hide item methods' documentation","js_name":"auto-hide-method-docs","default":false,},{"name":"Auto-hide trait implementation documentation","js_name":"auto-hide-trait-implementations","default":false,},{"name":"Directly go to item in search if there is only one result","js_name":"go-to-only-result","default":false,},{"name":"Show line numbers on code examples","js_name":"line-numbers","default":false,},{"name":"Hide persistent navigation bar","js_name":"hide-sidebar","default":false,},{"name":"Hide table of contents","js_name":"hide-toc","default":false,},{"name":"Hide module navigation","js_name":"hide-modnav","default":false,},{"name":"Disable keyboard shortcuts","js_name":"disable-shortcuts","default":false,},{"name":"Use sans serif fonts","js_name":"sans-serif-fonts","default":false,},{"name":"Word wrap source code","js_name":"word-wrap-source-code","default":false,},];const elementKind=isSettingsPage?"section":"div";const innerHTML=`
${buildSettingsPageSections(settings)}
`;const el=document.createElement(elementKind);el.id="settings";if(!isSettingsPage){el.className="popover";}el.innerHTML=innerHTML;if(isSettingsPage){const mainElem=document.getElementById(MAIN_ID);if(mainElem!==null){mainElem.appendChild(el);}}else{el.setAttribute("tabindex","-1");onEachLazy(document.querySelectorAll(".settings-menu"),menu=>{if(menu.offsetWidth!==0){menu.appendChild(el);return true;}});}return el;}const settingsMenu=buildSettingsPage();function displaySettings(){settingsMenu.style.display="";onEachLazy(document.querySelectorAll(".settings-menu"),menu=>{if(menu.offsetWidth!==0){if(!menu.contains(settingsMenu)&&settingsMenu.parentElement){settingsMenu.parentElement.removeChild(settingsMenu);menu.appendChild(settingsMenu);}return true;}});onEachLazy(settingsMenu.querySelectorAll("input[type='checkbox']"),el=>{const val=getSettingValue(el.id);const checked=val==="true";if(checked!==el.checked&&val!==null){el.checked=checked;}});}function settingsBlurHandler(event){const isInPopover=onEachLazy(document.querySelectorAll(".settings-menu, .help-menu"),menu=>{return menu.contains(document.activeElement)||menu.contains(event.relatedTarget);},);if(!isInPopover){window.hidePopoverMenus();}}if(!isSettingsPage){const settingsMenu=nonnull(document.getElementById("settings"));onEachLazy(document.querySelectorAll(".settings-menu"),settingsButton=>{settingsButton.querySelector("a").onclick=event=>{if(!(event.target instanceof Element)||settingsMenu.contains(event.target)){return;}event.preventDefault();const shouldDisplaySettings=settingsMenu.style.display==="none";window.hideAllModals(false);if(shouldDisplaySettings){displaySettings();}};settingsButton.onblur=settingsBlurHandler;settingsButton.querySelector("a").onblur=settingsBlurHandler;});onEachLazy(settingsMenu.querySelectorAll("input"),el=>{el.onblur=settingsBlurHandler;});settingsMenu.onblur=settingsBlurHandler;}setTimeout(()=>{setEvents(settingsMenu);if(!isSettingsPage){displaySettings();}onEachLazy(document.querySelectorAll(".settings-menu"),settingsButton=>{removeClass(settingsButton,"rotate");});},0);})(); \ No newline at end of file diff --git a/next/static.files/src-script-813739b1.js b/next/static.files/src-script-813739b1.js new file mode 100644 index 0000000..bf54625 --- /dev/null +++ b/next/static.files/src-script-813739b1.js @@ -0,0 +1 @@ +"use strict";(function(){const rootPath=getVar("root-path");const NAME_OFFSET=0;const DIRS_OFFSET=1;const FILES_OFFSET=2;const RUSTDOC_MOBILE_BREAKPOINT=700;function closeSidebarIfMobile(){if(window.innerWidth{removeClass(document.documentElement,"src-sidebar-expanded");updateLocalStorage("source-sidebar-show","false");};window.rustdocShowSourceSidebar=()=>{addClass(document.documentElement,"src-sidebar-expanded");updateLocalStorage("source-sidebar-show","true");};window.rustdocToggleSrcSidebar=()=>{if(document.documentElement.classList.contains("src-sidebar-expanded")){window.rustdocCloseSourceSidebar();}else{window.rustdocShowSourceSidebar();}};function createSrcSidebar(srcIndexStr){const container=nonnull(document.querySelector("nav.sidebar"));const sidebar=document.createElement("div");sidebar.id="src-sidebar";const srcIndex=new Map(JSON.parse(srcIndexStr));let hasFoundFile=false;for(const[key,source]of srcIndex){source[NAME_OFFSET]=key;hasFoundFile=createDirEntry(source,sidebar,"",hasFoundFile);}container.appendChild(sidebar);const selected_elem=sidebar.getElementsByClassName("selected")[0];if(typeof selected_elem!=="undefined"){selected_elem.focus();}}function highlightSrcLines(){const match=window.location.hash.match(/^#?(\d+)(?:-(\d+))?$/);if(!match){return;}let from=parseInt(match[1],10);let to=from;if(typeof match[2]!=="undefined"){to=parseInt(match[2],10);}if(to{removeClass(e,"line-highlighted");});for(let i=from;i<=to;++i){elem=document.getElementById(""+i);if(!elem){break;}addClass(elem,"line-highlighted");}}const handleSrcHighlight=(function(){let prev_line_id=0;const set_fragment=name=>{const x=window.scrollX,y=window.scrollY;if(browserSupportsHistoryApi()){history.replaceState(null,"","#"+name);highlightSrcLines();}else{location.replace("#"+name);}window.scrollTo(x,y);};return ev=>{let cur_line_id=parseInt(ev.target.id,10);if(isNaN(cur_line_id)||ev.ctrlKey||ev.altKey||ev.metaKey){return;}ev.preventDefault();if(ev.shiftKey&&prev_line_id){if(prev_line_id>cur_line_id){const tmp=prev_line_id;prev_line_id=cur_line_id;cur_line_id=tmp;}set_fragment(prev_line_id+"-"+cur_line_id);}else{prev_line_id=cur_line_id;set_fragment(""+cur_line_id);}};}());window.addEventListener("hashchange",highlightSrcLines);onEachLazy(document.querySelectorAll("a[data-nosnippet]"),el=>{el.addEventListener("click",handleSrcHighlight);});highlightSrcLines();window.createSrcSidebar=createSrcSidebar;})(); \ No newline at end of file diff --git a/next/static.files/storage-1b37d467.js b/next/static.files/storage-1b37d467.js new file mode 100644 index 0000000..fb76ad5 --- /dev/null +++ b/next/static.files/storage-1b37d467.js @@ -0,0 +1,27 @@ +"use strict";const builtinThemes=["light","dark","ayu"];const darkThemes=["dark","ayu"];window.currentTheme=(function(){const currentTheme=document.getElementById("themeStyle");return currentTheme instanceof HTMLLinkElement?currentTheme:null;})();const settingsDataset=(function(){const settingsElement=document.getElementById("default-settings");return settingsElement&&settingsElement.dataset?settingsElement.dataset:null;})();function nonnull(x,msg){if(x===null){throw(msg||"unexpected null value!");}else{return x;}}function nonundef(x,msg){if(x===undefined){throw(msg||"unexpected null value!");}else{return x;}}function getSettingValue(settingName){const current=getCurrentValue(settingName);if(current===null&&settingsDataset!==null){const def=settingsDataset[settingName.replace(/-/g,"_")];if(def!==undefined){return def;}}return current;}const localStoredTheme=getSettingValue("theme");function hasClass(elem,className){return!!elem&&!!elem.classList&&elem.classList.contains(className);}function addClass(elem,className){if(elem&&elem.classList){elem.classList.add(className);}}function removeClass(elem,className){if(elem&&elem.classList){elem.classList.remove(className);}}function onEach(arr,func){for(const elem of arr){if(func(elem)){return true;}}return false;}function onEachLazy(lazyArray,func){return onEach(Array.prototype.slice.call(lazyArray),func);}function updateLocalStorage(name,value){try{if(value===null){window.localStorage.removeItem("rustdoc-"+name);}else{window.localStorage.setItem("rustdoc-"+name,value);}}catch{}}function getCurrentValue(name){try{return window.localStorage.getItem("rustdoc-"+name);}catch{return null;}}function getVar(name){const el=document.querySelector("head > meta[name='rustdoc-vars']");return el?el.getAttribute("data-"+name):null;}function switchTheme(newThemeName,saveTheme){const themeNames=(getVar("themes")||"").split(",").filter(t=>t);themeNames.push(...builtinThemes);if(newThemeName===null||themeNames.indexOf(newThemeName)===-1){return;}if(saveTheme){updateLocalStorage("theme",newThemeName);}document.documentElement.setAttribute("data-theme",newThemeName);if(builtinThemes.indexOf(newThemeName)!==-1){if(window.currentTheme&&window.currentTheme.parentNode){window.currentTheme.parentNode.removeChild(window.currentTheme);window.currentTheme=null;}}else{const newHref=getVar("root-path")+encodeURIComponent(newThemeName)+getVar("resource-suffix")+".css";if(!window.currentTheme){if(document.readyState==="loading"){document.write(``);window.currentTheme=(function(){const currentTheme=document.getElementById("themeStyle");return currentTheme instanceof HTMLLinkElement?currentTheme:null;})();}else{window.currentTheme=document.createElement("link");window.currentTheme.rel="stylesheet";window.currentTheme.id="themeStyle";window.currentTheme.href=newHref;document.documentElement.appendChild(window.currentTheme);}}else if(newHref!==window.currentTheme.href){window.currentTheme.href=newHref;}}}const updateTheme=(function(){const mql=window.matchMedia("(prefers-color-scheme: dark)");function updateTheme(){if(getSettingValue("use-system-theme")!=="false"){const lightTheme=getSettingValue("preferred-light-theme")||"light";const darkTheme=getSettingValue("preferred-dark-theme")||"dark";updateLocalStorage("use-system-theme","true");switchTheme(mql.matches?darkTheme:lightTheme,true);}else{switchTheme(getSettingValue("theme"),false);}}mql.addEventListener("change",updateTheme);return updateTheme;})();if(getSettingValue("use-system-theme")!=="false"&&window.matchMedia){if(getSettingValue("use-system-theme")===null&&getSettingValue("preferred-dark-theme")===null&&localStoredTheme!==null&&darkThemes.indexOf(localStoredTheme)>=0){updateLocalStorage("preferred-dark-theme",localStoredTheme);}}updateTheme();if(getSettingValue("source-sidebar-show")==="true"){addClass(document.documentElement,"src-sidebar-expanded");}if(getSettingValue("hide-sidebar")==="true"){addClass(document.documentElement,"hide-sidebar");}if(getSettingValue("hide-toc")==="true"){addClass(document.documentElement,"hide-toc");}if(getSettingValue("hide-modnav")==="true"){addClass(document.documentElement,"hide-modnav");}if(getSettingValue("sans-serif-fonts")==="true"){addClass(document.documentElement,"sans-serif");}if(getSettingValue("word-wrap-source-code")==="true"){addClass(document.documentElement,"word-wrap-source-code");}function updateSidebarWidth(){const desktopSidebarWidth=getSettingValue("desktop-sidebar-width");if(desktopSidebarWidth&&desktopSidebarWidth!=="null"){document.documentElement.style.setProperty("--desktop-sidebar-width",desktopSidebarWidth+"px",);}const srcSidebarWidth=getSettingValue("src-sidebar-width");if(srcSidebarWidth&&srcSidebarWidth!=="null"){document.documentElement.style.setProperty("--src-sidebar-width",srcSidebarWidth+"px",);}}updateSidebarWidth();window.addEventListener("pageshow",ev=>{if(ev.persisted){setTimeout(updateTheme,0);setTimeout(updateSidebarWidth,0);}});class RustdocToolbarElement extends HTMLElement{constructor(){super();}connectedCallback(){if(this.firstElementChild){return;}const rootPath=getVar("root-path");const currentUrl=window.location.href.split("?")[0].split("#")[0];this.innerHTML=` +
+ Search +
+
+ Settings +
+
+ Help +
+ `;}}window.customElements.define("rustdoc-toolbar",RustdocToolbarElement);class RustdocTopBarElement extends HTMLElement{constructor(){super();}connectedCallback(){const rootPath=getVar("root-path");const tmplt=document.createElement("template");tmplt.innerHTML=` + + + + + `;const shadow=this.attachShadow({mode:"open"});shadow.appendChild(tmplt.content.cloneNode(true));this.innerHTML+=` + +
+ Settings +
+
+ Help +
+ `;}}window.customElements.define("rustdoc-topbar",RustdocTopBarElement); \ No newline at end of file diff --git a/next/static.files/stringdex-0e748618.js b/next/static.files/stringdex-0e748618.js new file mode 100644 index 0000000..33757df --- /dev/null +++ b/next/static.files/stringdex-0e748618.js @@ -0,0 +1,2 @@ +const EMPTY_UINT8=new Uint8Array();class RoaringBitmap{constructor(u8array,startingOffset){const start=startingOffset?startingOffset:0;let i=start;this.keysAndCardinalities=EMPTY_UINT8;this.containers=[];this.consumed_len_bytes=0;if(u8array===null||u8array.length===i||u8array[i]===0){return this;}else if(u8array[i]>0xf0){const lspecial=u8array[i]&0x0f;this.keysAndCardinalities=new Uint8Array(lspecial*4);let pspecial=i+1;let key=u8array[pspecial+2]|(u8array[pspecial+3]<<8);let value=u8array[pspecial]|(u8array[pspecial+1]<<8);let entry=(key<<16)|value;let container;container=new RoaringBitmapArray(1,new Uint8Array(4));container.array[0]=value&0xFF;container.array[1]=(value>>8)&0xFF;this.containers.push(container);this.keysAndCardinalities[0]=key;this.keysAndCardinalities[1]=key>>8;pspecial+=4;for(let ispecial=1;ispecial>16;container=this.addToArrayAt(key);const cardinalityOld=container.cardinality;container.array[cardinalityOld*2]=value&0xFF;container.array[(cardinalityOld*2)+1]=(value>>8)&0xFF;container.cardinality=cardinalityOld+1;pspecial+=2;}this.consumed_len_bytes=pspecial-i;return this;}else if(u8array[i]<0x3a){const lspecial=u8array[i];this.keysAndCardinalities=new Uint8Array(lspecial*4);let pspecial=i+1;for(let ispecial=0;ispecial>8)&0xFF;container.cardinality=cardinalityOld+1;pspecial+=4;}this.consumed_len_bytes=pspecial-i;return this;}const has_runs=u8array[i]===0x3b;if(u8array[i]!==0x3a&&u8array[i]!==0x3b){throw new Error("not a roaring bitmap: "+u8array[i]);}const size=has_runs?((u8array[i+2]|(u8array[i+3]<<8))+1):((u8array[i+4]|(u8array[i+5]<<8)|(u8array[i+6]<<16)|(u8array[i+7]<<24)));i+=has_runs?4:8;let is_run;if(has_runs){const is_run_len=(size+7)>>3;is_run=new Uint8Array(u8array.buffer,i+u8array.byteOffset,is_run_len);i+=is_run_len;}else{is_run=EMPTY_UINT8;}this.keysAndCardinalities=u8array.subarray(i,i+(size*4));i+=size*4;let offsets=null;if(!has_runs||size>=4){offsets=[];for(let j=0;j>3]&(1<<(j&0x7))){const runcount=(u8array[i]|(u8array[i+1]<<8));i+=2;this.containers.push(new RoaringBitmapRun(runcount,new Uint8Array(u8array.buffer,i+u8array.byteOffset,runcount*4),));i+=runcount*4;}else if(cardinality>=4096){this.containers.push(new RoaringBitmapBits(new Uint8Array(u8array.buffer,i+u8array.byteOffset,8192,)));i+=8192;}else{const end=cardinality*2;this.containers.push(new RoaringBitmapArray(cardinality,new Uint8Array(u8array.buffer,i+u8array.byteOffset,end),));i+=end;}}this.consumed_len_bytes=i-start;}static makeSingleton(number){const result=new RoaringBitmap(null,0);result.keysAndCardinalities=Uint8Array.of((number>>16),(number>>24),0,0,);result.containers.push(new RoaringBitmapArray(1,Uint8Array.of(number,number>>8),));return result;}static everything(){if(EVERYTHING_BITMAP.isEmpty()){let i=0;const l=1<<16;const everything_range=new RoaringBitmapRun(1,Uint8Array.of(0,0,0xff,0xff));EVERYTHING_BITMAP.keysAndCardinalities=new Uint8Array(l*4);while(i>8;EVERYTHING_BITMAP.keysAndCardinalities[(i*4)+2]=0xff;EVERYTHING_BITMAP.keysAndCardinalities[(i*4)+3]=0xff;i+=1;}}return EVERYTHING_BITMAP;}static empty(){return EMPTY_BITMAP;}isEmpty(){return this.containers.length===0;}addToArrayAt(key){let mid=this.getContainerId(key);let container;if(mid===-1){container=new RoaringBitmapArray(0,new Uint8Array(2));mid=this.containers.length;this.containers.push(container);if(mid*4>this.keysAndCardinalities.length){const keysAndContainers=new Uint8Array(mid*8);keysAndContainers.set(this.keysAndCardinalities);this.keysAndCardinalities=keysAndContainers;}this.keysAndCardinalities[(mid*4)+0]=key;this.keysAndCardinalities[(mid*4)+1]=key>>8;}else{container=this.containers[mid];const cardinalityOld=this.keysAndCardinalities[(mid*4)+2]|(this.keysAndCardinalities[(mid*4)+3]<<8);const cardinality=cardinalityOld+1;this.keysAndCardinalities[(mid*4)+2]=cardinality;this.keysAndCardinalities[(mid*4)+3]=cardinality>>8;}const cardinalityOld=this.keysAndCardinalities[(mid*4)+2]|(this.keysAndCardinalities[(mid*4)+3]<<8);if(!(container instanceof RoaringBitmapArray)||container.array.byteLength<((cardinalityOld+1)*2)){const newBuf=new Uint8Array((cardinalityOld+1)*4);let idx=0;for(const cvalue of container.values()){newBuf[idx]=cvalue&0xFF;newBuf[idx+1]=(cvalue>>8)&0xFF;idx+=2;}if(container instanceof RoaringBitmapArray){container.cardinality=cardinalityOld;container.array=newBuf;return container;}const newcontainer=new RoaringBitmapArray(cardinalityOld,newBuf);this.containers[mid]=newcontainer;return newcontainer;}else{return container;}}union(that){if(this.isEmpty()){return that;}if(that.isEmpty()){return this;}if(this===RoaringBitmap.everything()||that===RoaringBitmap.everything()){return RoaringBitmap.everything();}let i=0;const il=this.containers.length;let j=0;const jl=that.containers.length;const result=new RoaringBitmap(null,0);result.keysAndCardinalities=new Uint8Array((il+jl)*4);while(i=jl||(i=il||(jthatContainer.array.length?thisContainer.array.length:thatContainer.array.length,);let k=0;const kl=resultArray.length;while(k>8)&0xFF;k+=2;}result.containers.push(new RoaringBitmapArray(resultValues.length,resultArray,));card=resultValues.length;}result.keysAndCardinalities[k+0]=this.keysAndCardinalities[ik+0];result.keysAndCardinalities[k+1]=this.keysAndCardinalities[ik+1];card-=1;result.keysAndCardinalities[k+2]=card;result.keysAndCardinalities[k+3]=card>>8;i+=1;j+=1;}}return result;}intersection(that){if(this.isEmpty()||that.isEmpty()){return EMPTY_BITMAP;}if(this===RoaringBitmap.everything()){return that;}if(that===RoaringBitmap.everything()){return this;}let i=0;const il=this.containers.length;let j=0;const jl=that.containers.length;const result=new RoaringBitmap(null,0);result.keysAndCardinalities=new Uint8Array((il>jl?il:jl)*4);while(i=jl||(i=il||(jthatContainer.array.length?thisContainer.array.length:thatContainer.array.length,);let k=0;const kl=resultArray.length;while(k>8)&0xFF;k+=2;}result.containers.push(new RoaringBitmapArray(resultValues.length,resultArray,));}}if(card!==0){result.keysAndCardinalities[k+0]=this.keysAndCardinalities[ik+0];result.keysAndCardinalities[k+1]=this.keysAndCardinalities[ik+1];card-=1;result.keysAndCardinalities[k+2]=card;result.keysAndCardinalities[k+3]=card>>8;}i+=1;j+=1;}}return result;}contains(keyvalue){const key=keyvalue>>16;const value=keyvalue&0xFFFF;const mid=this.getContainerId(key);return mid===-1?false:this.containers[mid].contains(value);}getContainerId(key){let left=0;let right=this.containers.length-1;while(left<=right){const mid=Math.floor((left+right)/2);const x=this.keysAndCardinalities[(mid*4)]|(this.keysAndCardinalities[(mid*4)+1]<<8);if(xkey){right=mid-1;}else{return mid;}}return-1;}*entries(){const l=this.containers.length;for(let i=0;i>1;const i=mid*4;const start=this.array[i]|(this.array[i+1]<<8);const lenm1=this.array[i+2]|(this.array[i+3]<<8);if((start+lenm1)value){right=mid-1;}else{return true;}}return false;}*values(){let i=0;while(i>1;const i=mid*2;const x=this.array[i]|(this.array[i+1]<<8);if(xvalue){right=mid-1;}else{return true;}}return false;}*values(){let i=0;const l=this.cardinality*2;while(i>3]&(1<<(value&7)));}*values(){let i=0;const l=this.array.length<<3;while(i=this.values.length*9){const keys=this.keys;const values=this.values;const l=values.length;this.capacityClass+=1;const capacity=1<otherDistance){const otherKey=keys.slice(j,j+6);values[slot]=value;value=otherValue;keys[j+0]=key[start+0];keys[j+1]=key[start+1];keys[j+2]=key[start+2];keys[j+3]=key[start+3];keys[j+4]=key[start+4];keys[j+5]=key[start+5];key=otherKey;start=0;distance=otherDistance;}distance+=1;slot=(slot+1)&mask;}}}get(key){if(key.length!==6){throw"invalid key";}return this.getWithOffsetKey(key,0);}getWithOffsetKey(key,start){const mask=~(0xffffffff<otherDistance){break;}}slot=(slot+1)&mask;}return undefined;}}function bitCount(n){n=(~~n)-((n>>1)&0x55555555);n=(n&0x33333333)+((n>>2)&0x33333333);return((n+(n>>4)&0xF0F0F0F)*0x1010101)>>24;}function loadDatabase(hooks){const callbacks={rr_:function(data){const dataObj=JSON.parse(data);for(const colName of Object.keys(dataObj)){if(Object.hasOwn(dataObj[colName],"I")){registry.searchTreeRoots.set(colName,makeSearchTreeFromBase64(dataObj[colName].I)[1],);}if(Object.hasOwn(dataObj[colName],"N")){const counts=[];const countsstring=dataObj[colName]["N"];let i=0;const l=countsstring.length;while(i>4)):EMPTY_UINT8;newPromise=Promise.resolve(new SearchTree(EMPTY_SEARCH_TREE_BRANCHES,EMPTY_SEARCH_TREE_BRANCHES,data,isWhole?leaves:EMPTY_BITMAP,isWhole?EMPTY_BITMAP:leaves,));}else{const hashHex=makeHexFromUint8Array(nodeid);newPromise=new Promise((resolve,reject)=>{const cb=registry.searchTreeLoadPromiseCallbacks.get(nodeid);if(cb){registry.searchTreeLoadPromiseCallbacks.set(nodeid,(err,data)=>{cb(err,data);if(data){resolve(data);}else{reject(err);}});}else{registry.searchTreeLoadPromiseCallbacks.set(nodeid,(err,data)=>{if(data){resolve(data);}else{reject(err);}});hooks.loadTreeByHash(hashHex);}});}registry.searchTreePromises.set(nodeid,newPromise);return newPromise;},dataLoadByNameAndHash:function(name,hash){let dataColumnBuckets=registry.dataColumnsBuckets.get(name);if(dataColumnBuckets===undefined){dataColumnBuckets=new HashTable();registry.dataColumnsBuckets.set(name,dataColumnBuckets);}const existingBucket=dataColumnBuckets.get(hash);if(existingBucket){return existingBucket;}const hashHex=makeHexFromUint8Array(hash);const newBucket=new Promise((resolve,reject)=>{const cb=registry.dataColumnLoadPromiseCallbacks.get(hash);if(cb){registry.dataColumnLoadPromiseCallbacks.set(hash,(err,data)=>{cb(err,data);if(data){resolve(data);}else{reject(err);}});}else{registry.dataColumnLoadPromiseCallbacks.set(hash,(err,data)=>{if(data){resolve(data);}else{reject(err);}});hooks.loadDataByNameAndHash(name,hashHex);}});dataColumnBuckets.set(hash,newBucket);return newBucket;},};class SearchTreeBranches{constructor(length,nodeids){this.nodeids=nodeids;this.subtrees=[];for(let i=0;i=this.keys[i]){throw new Error("HERE");}i+=1;}}*entries(){let i=0;const l=this.keys.length;while(i>1;if(this.keys[mid]k){right=mid-1;}else{return mid;}}return-1;}getKey(i){return this.keys[i];}getKeys(){return this.keys;}}const EMPTY_SEARCH_TREE_BRANCHES=new SearchTreeBranchesArray(EMPTY_UINT8,EMPTY_UINT8,);const SHORT_ALPHABITMAP_CHARS=[];for(let i=0x61;i<=0x7A;++i){if(i===0x76||i===0x71){continue;}SHORT_ALPHABITMAP_CHARS.push(i);}const LONG_ALPHABITMAP_CHARS=[0x31,0x32,0x33,0x34,0x35,0x36];for(let i=0x61;i<=0x7A;++i){LONG_ALPHABITMAP_CHARS.push(i);}function makeSearchTreeBranchesAlphaBitmapClass(alphabitmap_chars,width){const bitwidth=width*8;const cls=class SearchTreeBranchesAlphaBitmap extends SearchTreeBranches{constructor(bitmap,nodeids){super(nodeids.length/6,nodeids);if(nodeids.length/6!==bitCount(bitmap)){throw new Error(`mismatch ${bitmap} ${nodeids}`);}this.bitmap=bitmap;this.nodeids=nodeids;}*entries(){let i=0;let j=0;while(i=this.subtrees.length?-1:result;}getKey(branch_index){let alpha_index=0;while(branch_index>=0){if(this.bitmap&(1<=6?new Lev2TParametricDescription(w):new Lev1TParametricDescription(w);const stack=[[Promise.resolve(this.trie()),0]];const n=levParams.n;while(stack.length!==0){const[triePromise,levState]=stack.pop();const trie=await triePromise;for(const byte of trie.keysExcludeSuffixOnly()){const levPos=levParams.getPosition(levState);const vector=levParams.getVector(name,byte,levPos,Math.min(w,levPos+(2*n)+1),);const newLevState=levParams.transition(levState,levPos,vector,);if(newLevState>=0){const child=trie.child(byte);if(child){stack.push([child,newLevState]);if(levParams.isAccept(newLevState)){yield child;}}}}}}}class Trie{constructor(tree,offset){this.tree=tree;this.offset=offset;}matches(){if(this.offset===this.tree.data.length){return this.tree.leaves_whole;}else{return EMPTY_BITMAP;}}async*substringMatches(){let layer=[Promise.resolve(this.tree)];while(layer.length){const current_layer=layer;layer=[];for await(const tree of current_layer){yield tree.leaves_whole.union(tree.leaves_suffix);}const subnodes=new HashTable();for await(const node of current_layer){const branches=node.branches;const l=branches.subtrees.length;for(let i=0;i0&&backlog[backlogSlot].length>1].length){const parentSlot=(backlogSlot-1)>>1;const parent=backlog[parentSlot];backlog[parentSlot]=backlog[backlogSlot];backlog[backlogSlot]=parent;backlogSlot=parentSlot;}}while(backlog.length!==0){const backlogEntry=backlog[0];if(minLength!==null&&backlogEntry.length>minLength){break;}if(!backlogEntry.bitmap.isEmpty()){yield backlogEntry.bitmap;}backlog[0]=backlog[backlog.length-1];backlog.length-=1;let backlogSlot=0;const backlogLength=backlog.length;while(backlogSlotnode.trie())]);i+=1;}return nodes;}else{const codePoint=data[this.offset];const trie=new Trie(this.tree,this.offset+1);return[[codePoint,Promise.resolve(trie)]];}}keysExcludeSuffixOnly(){const data=this.tree.data;if(this.offset===data.length){return this.tree.might_have_prefix_branches.getKeys();}else{return Uint8Array.of(data[this.offset]);}}childrenExcludeSuffixOnly(){const data=this.tree.data;if(this.offset===data.length){const nodes=[];let i=0;for(const[k,v]of this.tree.might_have_prefix_branches.entries()){let node;if(v){node=v;}else{const newnode=this.tree.might_have_prefix_branches.getNodeID(i);if(!newnode){throw new Error(`malformed tree; no node for key ${k}`);}node=registry.searchTreeLoadByNodeID(newnode);this.tree.might_have_prefix_branches.subtrees[i]=node;this.tree.branches.subtrees[this.tree.branches.getIndex(k)]=node;}nodes.push([k,node.then(node=>node.trie())]);i+=1;}return nodes;}else{const codePoint=data[this.offset];const trie=new Trie(this.tree,this.offset+1);return[[codePoint,Promise.resolve(trie)]];}}child(byte){if(this.offset===this.tree.data.length){const i=this.tree.branches.getIndex(byte);if(i!==-1){let branch=this.tree.branches.subtrees[i];if(branch===null){const newnode=this.tree.branches.getNodeID(i);if(!newnode){throw new Error(`malformed tree; no node for key ${byte}`);}branch=registry.searchTreeLoadByNodeID(newnode);this.tree.branches.subtrees[i]=branch;const mhpI=this.tree.might_have_prefix_branches.getIndex(byte);if(mhpI!==-1){this.tree.might_have_prefix_branches.subtrees[mhpI]=branch;}}return branch.then(branch=>branch.trie());}}else if(this.tree.data[this.offset]===byte){return Promise.resolve(new Trie(this.tree,this.offset+1));}return null;}}class DataColumn{constructor(counts,hashes,emptyset,name){this.hashes=hashes;this.emptyset=emptyset;this.name=name;this.buckets=[];this.bucket_keys=[];const l=counts.length;let k=0;let totalLength=0;for(let i=0;i=this.bucket_keys.length){return Promise.resolve(undefined);}else{const start=this.bucket_keys[idx];const{hash,end}=this.buckets[idx];let data=this.buckets[idx].data;if(data===null){const dataSansEmptyset=await registry.dataLoadByNameAndHash(this.name,hash,);data=this.buckets[idx].data;if(data!==null){return(await data)[id-start];}let dataWithEmptyset=null;let pos=start;let insertCount=0;while(pos=48&&c<=63){dataSansEmptyset.push(backrefs[c-48]);i+=1;}else{let n=0;while(c<96){n=(n<<4)|(c&0xF);i+=1;c=data[i];}n=(n<<4)|(c&0xF);i+=1;const item=data.subarray(i,i+n);dataSansEmptyset.push(item);i+=n;backrefs.unshift(item);if(backrefs.length>16){backrefs.pop();}}}cb(null,dataSansEmptyset);}}function makeSearchTreeFromBase64(inputBase64){const input=makeUint8ArrayFromBase64(inputBase64);let i=0;const l=input.length;const stash=new HashTable();const hash=Uint8Array.of(0,0,0,0,0,0,0,0);const truncatedHash=new Uint8Array(hash.buffer,2,6);const hash_history=[];const data_history=[];let canonical=EMPTY_UINT8;let tree=new SearchTree(EMPTY_SEARCH_TREE_BRANCHES,EMPTY_SEARCH_TREE_BRANCHES,EMPTY_UINT8,EMPTY_BITMAP,EMPTY_BITMAP,);function makeBranchesFromBinaryData(input,i,compression_tag,){const is_pure_suffixes_only_node=(compression_tag&0x01)!==0x00;const is_stack_compressed=(compression_tag&0x02)!==0;const is_long_compressed=(compression_tag&0x04)!==0;const all_children_are_compressed=(compression_tag&0xF0)===0xF0&&!is_long_compressed;const any_children_are_compressed=(compression_tag&0xF0)!==0x00||is_long_compressed;const start_point=i;let cplen;let cslen;let alphabitmap=null;if(is_pure_suffixes_only_node){cplen=0;cslen=input[i];i+=1;if(cslen>=0xc0){alphabitmap=SearchTreeBranchesLongAlphaBitmap;cslen=cslen&0x3F;}else if(cslen>=0x80){alphabitmap=SearchTreeBranchesShortAlphaBitmap;cslen=cslen&0x7F;}}else{cplen=input[i];i+=1;cslen=input[i];i+=1;if(cplen===0xff&&cslen===0xff){cplen=0x100;cslen=0;}else if(cplen>=0xc0&&cslen>=0xc0){alphabitmap=SearchTreeBranchesLongAlphaBitmap;cplen=cplen&0x3F;cslen=cslen&0x3F;}else if(cplen>=0x80&&cslen>=0x80){alphabitmap=SearchTreeBranchesShortAlphaBitmap;cplen=cplen&0x7F;cslen=cslen&0x7F;}}let j=0;let cpnodes;if(any_children_are_compressed){cpnodes=cplen===0?EMPTY_UINT8:new Uint8Array(cplen*6);while(j=cplen||(csicsbranches[csi])){branchset[j]=csbranches[csi];const joff=j*6;const csioff=csi*6;hashes[joff+0]=csnodes[csioff+0];hashes[joff+1]=csnodes[csioff+1];hashes[joff+2]=csnodes[csioff+2];hashes[joff+3]=csnodes[csioff+3];hashes[joff+4]=csnodes[csioff+4];hashes[joff+5]=csnodes[csioff+5];csi+=1;}else{branchset[j]=cpbranches[cpi];const joff=j*6;const cpioff=cpi*6;hashes[joff+0]=cpnodes[cpioff+0];hashes[joff+1]=cpnodes[cpioff+1];hashes[joff+2]=cpnodes[cpioff+2];hashes[joff+3]=cpnodes[cpioff+3];hashes[joff+4]=cpnodes[cpioff+4];hashes[joff+5]=cpnodes[cpioff+5];cpi+=1;}j+=1;}branches=new SearchTreeBranchesArray(branchset,hashes);}i+=cslen;}return{consumed_len_bytes:i-start_point,cpbranches,csbranches,cpnodes,csnodes,branches,might_have_prefix_branches,};}while(i1){const is_long_compressed=(compression_tag&0x04)!==0;const is_data_compressed=(compression_tag&0x08)!==0;i+=1;if(is_long_compressed){compression_tag|=input[i]<<8;i+=1;compression_tag|=input[i]<<16;i+=1;}let dlen=input[i];i+=1;if(is_data_compressed){data=data_history[data_history.length-dlen-1];dlen=data.length;}else{data=dlen===0?EMPTY_UINT8:new Uint8Array(input.buffer,i+input.byteOffset,dlen);i+=dlen;}const coffset=i;const{cpbranches,csbranches,cpnodes,csnodes,consumed_len_bytes:branches_consumed_len_bytes,branches,might_have_prefix_branches,}=makeBranchesFromBinaryData(input,i,compression_tag);i+=branches_consumed_len_bytes;let whole;let suffix;if(is_pure_suffixes_only_node){whole=EMPTY_BITMAP;suffix=input[i]===0?EMPTY_BITMAP1:new RoaringBitmap(input,i);i+=suffix.consumed_len_bytes;}else if(input[i]===0xff){whole=EMPTY_BITMAP;suffix=EMPTY_BITMAP1;i+=1;}else{whole=input[i]===0?EMPTY_BITMAP1:new RoaringBitmap(input,i);i+=whole.consumed_len_bytes;suffix=input[i]===0?EMPTY_BITMAP1:new RoaringBitmap(input,i);i+=suffix.consumed_len_bytes;}tree=new SearchTree(branches,might_have_prefix_branches,data,whole,suffix,);const clen=((is_pure_suffixes_only_node?3:4)+dlen+cpnodes.length+csnodes.length+cpbranches.length+csbranches.length+whole.consumed_len_bytes+suffix.consumed_len_bytes);if(canonical.length{registry.searchTreeRootCallback=(error,data)=>{if(data){resolve(data);}else{reject(error);}};hooks.loadRoot(callbacks);});}if(typeof window!=="undefined"){window.Stringdex={loadDatabase,};window.RoaringBitmap=RoaringBitmap;if(window.StringdexOnload){window.StringdexOnload.forEach(cb=>cb(window.Stringdex));}}else{module.exports.Stringdex={loadDatabase,};module.exports.RoaringBitmap=RoaringBitmap;}const makeUint8ArrayFromBase64=Uint8Array.fromBase64?Uint8Array.fromBase64:(string=>{const bytes_as_string=atob(string);const l=bytes_as_string.length;const bytes=new Uint8Array(l);for(let i=0;i{const alpha={"0":0,"1":1,"2":2,"3":3,"4":4,"5":5,"6":6,"7":7,"8":8,"9":9,"a":10,"b":11,"A":10,"B":11,"c":12,"d":13,"C":12,"D":13,"e":14,"f":15,"E":14,"F":15,};const l=string.length>>1;const bytes=new Uint8Array(l);for(let i=0;iarray.toHex()):(array=>{const alpha=["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f",];const l=array.length;const v=[];for(let i=0;i>4]);v.push(alpha[array[i]&0xf]);}return v.join("");});function siphashOfBytes(input,k0lo,k0hi,k1lo,k1hi,output){let v0lo=k0lo ^ 0x70736575;let v0hi=k0hi ^ 0x736f6d65;let v1lo=k1lo ^ 0x6e646f6d;let v1hi=k1hi ^ 0x646f7261;let v2lo=k0lo ^ 0x6e657261;let v2hi=k0hi ^ 0x6c796765;let v3lo=k1lo ^ 0x79746573;let v3hi=k1hi ^ 0x74656462;const inputLength=input.length;let inputI=0;const left=inputLength&0x7;let milo=0;let mihi=0;while(inputI>>8;output[5]=(v0lo ^ v1lo ^ v2lo ^ v3lo)>>>16;output[4]=(v0lo ^ v1lo ^ v2lo ^ v3lo)>>>24;output[3]=(v0hi ^ v1hi ^ v2hi ^ v3hi)&0xff;output[2]=(v0hi ^ v1hi ^ v2hi ^ v3hi)>>>8;output[1]=(v0hi ^ v1hi ^ v2hi ^ v3hi)>>>16;output[0]=(v0hi ^ v1hi ^ v2hi ^ v3hi)>>>24;function u8ToU64le(offset,length){const n0=offset>>0)+(v1lo>>>0)>0xffffffff)?1:0))|0;v0lo=(v0lo+v1lo)|0;let v1lo_=v1lo;let v1hi_=v1hi;v1lo=(v1lo_<<13)|(v1hi_>>>19);v1hi=(v1hi_<<13)|(v1lo_>>>19);v1lo ^=v0lo;v1hi ^=v0hi;const v0lo_=v0lo;const v0hi_=v0hi;v0lo=v0hi_;v0hi=v0lo_;v2hi=(v2hi+v3hi+(((v2lo>>>0)+(v3lo>>>0)>0xffffffff)?1:0))|0;v2lo=(v2lo+v3lo)|0;let v3lo_=v3lo;let v3hi_=v3hi;v3lo=(v3lo_<<16)|(v3hi_>>>16);v3hi=(v3hi_<<16)|(v3lo_>>>16);v3lo ^=v2lo;v3hi ^=v2hi;v0hi=(v0hi+v3hi+(((v0lo>>>0)+(v3lo>>>0)>0xffffffff)?1:0))|0;v0lo=(v0lo+v3lo)|0;v3lo_=v3lo;v3hi_=v3hi;v3lo=(v3lo_<<21)|(v3hi_>>>11);v3hi=(v3hi_<<21)|(v3lo_>>>11);v3lo ^=v0lo;v3hi ^=v0hi;v2hi=(v2hi+v1hi+(((v2lo>>>0)+(v1lo>>>0)>0xffffffff)?1:0))|0;v2lo=(v2lo+v1lo)|0;v1lo_=v1lo;v1hi_=v1hi;v1lo=(v1lo_<<17)|(v1hi_>>>15);v1hi=(v1hi_<<17)|(v1lo_>>>15);v1lo ^=v2lo;v1hi ^=v2hi;const v2lo_=v2lo;const v2hi_=v2hi;v2lo=v2hi_;v2hi=v2lo_;}}class ParametricDescription{constructor(w,n,minErrors){this.w=w;this.n=n;this.minErrors=minErrors;}isAccept(absState){const state=Math.floor(absState/(this.w+1));const offset=absState%(this.w+1);return this.w-offset+this.minErrors[state]<=this.n;}getPosition(absState){return absState%(this.w+1);}getVector(name,charCode,pos,end){let vector=0;for(let i=pos;i>5;const bitStart=bitLoc&31;if(bitStart+bitsPerValue<=32){return((data[dataLoc]>>bitStart)&this.MASKS[bitsPerValue-1]);}else{const part=32-bitStart;return ~~(((data[dataLoc]>>bitStart)&this.MASKS[part-1])+((data[1+dataLoc]&this.MASKS[bitsPerValue-part-1])<Clone for Channels"],["impl Clone for CryptoMode"],["impl Clone for DecodeMode"],["impl Clone for MixMode"],["impl Clone for SampleRate"],["impl Clone for Mode"],["impl Clone for Strategy"],["impl Clone for DisconnectKind"],["impl Clone for DisconnectReason"],["impl Clone for CoreEvent"],["impl Clone for Event"],["impl Clone for TrackEvent"],["impl Clone for UntimedEvent"],["impl Clone for LengthHint"],["impl Clone for Shard"],["impl Clone for ControlError"],["impl Clone for LoopState"],["impl Clone for PlayError"],["impl Clone for PlayMode"],["impl Clone for ReadyState"],["impl Clone for ExponentialBackoff"],["impl Clone for Retry"],["impl Clone for DecodeConfig"],["impl Clone for DisposalThread"],["impl Clone for Driver"],["impl Clone for Scheduler"],["impl Clone for Config"],["impl Clone for RtcpData"],["impl Clone for RtpData"],["impl Clone for VoiceData"],["impl Clone for VoiceTick"],["impl Clone for ChannelId"],["impl Clone for GuildId"],["impl Clone for UserId"],["impl Clone for Compressed"],["impl Clone for Decompressed"],["impl Clone for Memory"],["impl Clone for AuxMetadata"],["impl Clone for HttpRequest"],["impl Clone for Call"],["impl Clone for Config"],["impl Clone for ConnectionInfo"],["impl Clone for Action"],["impl Clone for TrackHandle"],["impl Clone for TrackQueue"],["impl Clone for TrackState"],["impl<'a> Clone for ConnectData<'a>"],["impl<'a> Clone for YoutubeDl<'a>"],["impl<P: Clone + AsRef<Path>> Clone for File<P>"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[14047]} \ No newline at end of file diff --git a/next/trait.impl/core/cmp/trait.Eq.js b/next/trait.impl/core/cmp/trait.Eq.js new file mode 100644 index 0000000..d050c33 --- /dev/null +++ b/next/trait.impl/core/cmp/trait.Eq.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl Eq for Channels"],["impl Eq for CryptoMode"],["impl Eq for DecodeMode"],["impl Eq for MixMode"],["impl Eq for SampleRate"],["impl Eq for DisconnectKind"],["impl Eq for DisconnectReason"],["impl Eq for CoreEvent"],["impl Eq for Event"],["impl Eq for TrackEvent"],["impl Eq for UntimedEvent"],["impl Eq for LoopState"],["impl Eq for PlayMode"],["impl Eq for ReadyState"],["impl Eq for DecodeConfig"],["impl Eq for RtcpData"],["impl Eq for RtpData"],["impl Eq for VoiceData"],["impl Eq for VoiceTick"],["impl Eq for EventData"],["impl Eq for ChannelId"],["impl Eq for GuildId"],["impl Eq for UserId"],["impl Eq for AuxMetadata"],["impl Eq for ConnectionInfo"],["impl<'a> Eq for ConnectData<'a>"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[6932]} \ No newline at end of file diff --git a/next/trait.impl/core/cmp/trait.Ord.js b/next/trait.impl/core/cmp/trait.Ord.js new file mode 100644 index 0000000..79005d6 --- /dev/null +++ b/next/trait.impl/core/cmp/trait.Ord.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl Ord for EventData"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[278]} \ No newline at end of file diff --git a/next/trait.impl/core/cmp/trait.PartialEq.js b/next/trait.impl/core/cmp/trait.PartialEq.js new file mode 100644 index 0000000..df705ba --- /dev/null +++ b/next/trait.impl/core/cmp/trait.PartialEq.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl PartialEq for Channels"],["impl PartialEq for CryptoMode"],["impl PartialEq for DecodeMode"],["impl PartialEq for MixMode"],["impl PartialEq for SampleRate"],["impl PartialEq for Strategy"],["impl PartialEq for DisconnectKind"],["impl PartialEq for DisconnectReason"],["impl PartialEq for CoreEvent"],["impl PartialEq for Event"],["impl PartialEq for TrackEvent"],["impl PartialEq for UntimedEvent"],["impl PartialEq for LoopState"],["impl PartialEq for PlayMode"],["impl PartialEq for ReadyState"],["impl PartialEq for ExponentialBackoff"],["impl PartialEq for Retry"],["impl PartialEq for DecodeConfig"],["impl PartialEq for RtcpData"],["impl PartialEq for RtpData"],["impl PartialEq for VoiceData"],["impl PartialEq for VoiceTick"],["impl PartialEq for EventData"],["impl PartialEq for ChannelId"],["impl PartialEq for GuildId"],["impl PartialEq for UserId"],["impl PartialEq for AuxMetadata"],["impl PartialEq for ConnectionInfo"],["impl PartialEq for TrackState"],["impl<'a> PartialEq for ConnectData<'a>"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[8654]} \ No newline at end of file diff --git a/next/trait.impl/core/cmp/trait.PartialOrd.js b/next/trait.impl/core/cmp/trait.PartialOrd.js new file mode 100644 index 0000000..ab18e27 --- /dev/null +++ b/next/trait.impl/core/cmp/trait.PartialOrd.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl PartialOrd for EventData"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[299]} \ No newline at end of file diff --git a/next/trait.impl/core/convert/trait.From.js b/next/trait.impl/core/convert/trait.From.js new file mode 100644 index 0000000..06b8a8d --- /dev/null +++ b/next/trait.impl/core/convert/trait.From.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl From<&Error> for DisconnectReason"],["impl From<Channels> for Channels"],["impl From<MixMode> for Channels"],["impl From<MixMode> for Layout"],["impl From<SampleRate> for SampleRate"],["impl From<Error> for JoinError"],["impl From<CoreEvent> for Event"],["impl From<CoreEvent> for UntimedEvent"],["impl From<TrackEvent> for Event"],["impl From<TrackEvent> for UntimedEvent"],["impl From<AudioStreamError> for CodecCacheError"],["impl From<AudioStreamError> for Error"],["impl From<AudioStreamError> for AuxMetadataError"],["impl From<AudioStreamError> for MakePlayableError"],["impl From<usize> for LengthHint"],["impl From<Box<TrySendError<ShardRunnerMessage>>> for JoinError"],["impl From<Vec<Child>> for ChildContainer"],["impl From<NonZero<u64>> for ChannelId"],["impl From<NonZero<u64>> for GuildId"],["impl From<NonZero<u64>> for UserId"],["impl From<Duration> for LengthHint"],["impl From<Error> for Error"],["impl From<Child> for ChildContainer"],["impl From<ChannelId> for ChannelId"],["impl From<GuildId> for GuildId"],["impl From<UserId> for UserId"],["impl From<Error> for Error"],["impl From<Error> for CodecCacheError"],["impl From<GuildId> for GuildId"],["impl From<UserId> for UserId"],["impl From<Compressed> for Input"],["impl From<Decompressed> for Input"],["impl From<Memory> for Input"],["impl From<ChildContainer> for Input"],["impl From<HlsRequest> for Input"],["impl From<HttpRequest> for Input"],["impl From<YoutubeDl<'static>> for Input"],["impl From<CatcherError> for CodecCacheError"],["impl From<CatcherError> for Error"],["impl From<ChannelError> for JoinError"],["impl From<Elapsed> for Error"],["impl From<Error> for Error"],["impl From<Error> for CodecCacheError"],["impl From<Error> for CodecCacheError"],["impl From<Error> for MakePlayableError"],["impl From<Id<ChannelMarker>> for ChannelId"],["impl From<Id<GuildMarker>> for GuildId"],["impl From<Id<UserMarker>> for UserId"],["impl From<JoinError> for CodecCacheError"],["impl From<JoinError> for Error"],["impl From<RecvError> for Error"],["impl From<RecvError> for ControlError"],["impl From<SendError<EventMessage>> for Error"],["impl From<SendError<MixerMessage>> for Error"],["impl From<SendError<WsMessage>> for Error"],["impl<'a> From<&'a mut Parsed> for Metadata<'a>"],["impl<A: MediaSource + Send + Sync + 'static> From<RawAdapter<A>> for Input"],["impl<P: AsRef<Path> + Send + Sync + 'static> From<File<P>> for Input"],["impl<T: AsRef<[u8]> + Send + Sync + 'static> From<T> for Input"],["impl<T: Into<Input>> From<T> for Track"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[24075]} \ No newline at end of file diff --git a/next/trait.impl/core/default/trait.Default.js b/next/trait.impl/core/default/trait.Default.js new file mode 100644 index 0000000..9aaca4b --- /dev/null +++ b/next/trait.impl/core/default/trait.Default.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl Default for Channels"],["impl Default for CryptoMode"],["impl Default for SampleRate"],["impl Default for Mode"],["impl Default for LoopState"],["impl Default for PlayMode"],["impl Default for ReadyState"],["impl Default for ExponentialBackoff"],["impl Default for Retry"],["impl Default for DecodeConfig"],["impl Default for DisposalThread"],["impl Default for Driver"],["impl Default for LiveStatBlock"],["impl Default for Scheduler"],["impl Default for Config"],["impl Default for EventStore"],["impl Default for Config"],["impl Default for AuxMetadata"],["impl Default for SerenityShardHandle"],["impl Default for SerenitySharder"],["impl Default for Config"],["impl Default for Action"],["impl Default for TrackQueue"],["impl Default for TrackState"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[6903]} \ No newline at end of file diff --git a/next/trait.impl/core/error/trait.Error.js b/next/trait.impl/core/error/trait.Error.js new file mode 100644 index 0000000..334c8dc --- /dev/null +++ b/next/trait.impl/core/error/trait.Error.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl Error for Error"],["impl Error for Error"],["impl Error for JoinError"],["impl Error for CodecCacheError"],["impl Error for Error"],["impl Error for AudioStreamError"],["impl Error for AuxMetadataError"],["impl Error for MakePlayableError"],["impl Error for MetadataError"],["impl Error for ControlError"],["impl Error for PlayError"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[3083]} \ No newline at end of file diff --git a/next/trait.impl/core/fmt/trait.Debug.js b/next/trait.impl/core/fmt/trait.Debug.js new file mode 100644 index 0000000..5c8881b --- /dev/null +++ b/next/trait.impl/core/fmt/trait.Debug.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl Debug for Channels"],["impl Debug for CryptoMode"],["impl Debug for DecodeMode"],["impl Debug for MixMode"],["impl Debug for SampleRate"],["impl Debug for Error"],["impl Debug for Mode"],["impl Debug for Strategy"],["impl Debug for Error"],["impl Debug for JoinError"],["impl Debug for DisconnectKind"],["impl Debug for DisconnectReason"],["impl Debug for CoreEvent"],["impl Debug for Event"],["impl Debug for TrackEvent"],["impl Debug for UntimedEvent"],["impl Debug for CodecCacheError"],["impl Debug for Error"],["impl Debug for LengthHint"],["impl Debug for AudioStreamError"],["impl Debug for AuxMetadataError"],["impl Debug for MakePlayableError"],["impl Debug for MetadataError"],["impl Debug for Shard"],["impl Debug for Sharder"],["impl Debug for ControlError"],["impl Debug for LoopState"],["impl Debug for PlayError"],["impl Debug for PlayMode"],["impl Debug for ReadyState"],["impl Debug for ExponentialBackoff"],["impl Debug for Retry"],["impl Debug for DecodeConfig"],["impl Debug for DisposalThread"],["impl Debug for Driver"],["impl Debug for LiveStatBlock"],["impl Debug for Scheduler"],["impl Debug for Config"],["impl Debug for RtcpData"],["impl Debug for RtpData"],["impl Debug for VoiceData"],["impl Debug for VoiceTick"],["impl Debug for EventData"],["impl Debug for EventStore"],["impl Debug for ChannelId"],["impl Debug for GuildId"],["impl Debug for UserId"],["impl Debug for OpusCompressor"],["impl Debug for AuxMetadata"],["impl Debug for ChildContainer"],["impl Debug for HlsRequest"],["impl Debug for HttpRequest"],["impl Debug for SerenityShardHandle"],["impl Debug for SerenitySharder"],["impl Debug for TwilightMap"],["impl Debug for Call"],["impl Debug for Config"],["impl Debug for ConnectionInfo"],["impl Debug for Songbird"],["impl Debug for Queued"],["impl Debug for TrackHandle"],["impl Debug for TrackQueue"],["impl Debug for TrackState"],["impl<'a> Debug for EventContext<'a>"],["impl<'a> Debug for ConnectData<'a>"],["impl<'a> Debug for DisconnectData<'a>"],["impl<'a> Debug for YoutubeDl<'a>"],["impl<P: Debug + AsRef<Path>> Debug for File<P>"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[19159]} \ No newline at end of file diff --git a/next/trait.impl/core/fmt/trait.Display.js b/next/trait.impl/core/fmt/trait.Display.js new file mode 100644 index 0000000..03ae5cb --- /dev/null +++ b/next/trait.impl/core/fmt/trait.Display.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl Display for Error"],["impl Display for Error"],["impl Display for JoinError"],["impl Display for CodecCacheError"],["impl Display for Error"],["impl Display for AudioStreamError"],["impl Display for AuxMetadataError"],["impl Display for MakePlayableError"],["impl Display for MetadataError"],["impl Display for ControlError"],["impl Display for PlayError"],["impl Display for ChannelId"],["impl Display for GuildId"],["impl Display for UserId"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[3894]} \ No newline at end of file diff --git a/next/trait.impl/core/future/future/trait.Future.js b/next/trait.impl/core/future/future/trait.Future.js new file mode 100644 index 0000000..67e04d5 --- /dev/null +++ b/next/trait.impl/core/future/future/trait.Future.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl Future for Connect"],["impl Future for Join"],["impl Future for JoinGateway"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[873]} \ No newline at end of file diff --git a/next/trait.impl/core/hash/trait.Hash.js b/next/trait.impl/core/hash/trait.Hash.js new file mode 100644 index 0000000..46a925d --- /dev/null +++ b/next/trait.impl/core/hash/trait.Hash.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl Hash for Channels"],["impl Hash for CryptoMode"],["impl Hash for DecodeMode"],["impl Hash for SampleRate"],["impl Hash for DisconnectKind"],["impl Hash for CoreEvent"],["impl Hash for Event"],["impl Hash for TrackEvent"],["impl Hash for UntimedEvent"],["impl Hash for DecodeConfig"],["impl Hash for ChannelId"],["impl Hash for GuildId"],["impl Hash for UserId"],["impl Hash for ConnectionInfo"],["impl<'a> Hash for ConnectData<'a>"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[4066]} \ No newline at end of file diff --git a/next/trait.impl/core/iter/traits/collect/trait.IntoIterator.js b/next/trait.impl/core/iter/traits/collect/trait.IntoIterator.js new file mode 100644 index 0000000..d4ea5dd --- /dev/null +++ b/next/trait.impl/core/iter/traits/collect/trait.IntoIterator.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl<'a> IntoIterator for &'a Songbird"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[339]} \ No newline at end of file diff --git a/next/trait.impl/core/iter/traits/iterator/trait.Iterator.js b/next/trait.impl/core/iter/traits/iterator/trait.Iterator.js new file mode 100644 index 0000000..eee4599 --- /dev/null +++ b/next/trait.impl/core/iter/traits/iterator/trait.Iterator.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl Iterator for Iter<'_>"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[309]} \ No newline at end of file diff --git a/next/trait.impl/core/marker/trait.Copy.js b/next/trait.impl/core/marker/trait.Copy.js new file mode 100644 index 0000000..d657c48 --- /dev/null +++ b/next/trait.impl/core/marker/trait.Copy.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl Copy for Channels"],["impl Copy for CryptoMode"],["impl Copy for DecodeMode"],["impl Copy for MixMode"],["impl Copy for SampleRate"],["impl Copy for Strategy"],["impl Copy for DisconnectKind"],["impl Copy for DisconnectReason"],["impl Copy for CoreEvent"],["impl Copy for Event"],["impl Copy for TrackEvent"],["impl Copy for UntimedEvent"],["impl Copy for LengthHint"],["impl Copy for LoopState"],["impl Copy for ReadyState"],["impl Copy for ExponentialBackoff"],["impl Copy for Retry"],["impl Copy for DecodeConfig"],["impl Copy for ChannelId"],["impl Copy for GuildId"],["impl Copy for UserId"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[5787]} \ No newline at end of file diff --git a/next/trait.impl/core/marker/trait.Freeze.js b/next/trait.impl/core/marker/trait.Freeze.js new file mode 100644 index 0000000..97b80e8 --- /dev/null +++ b/next/trait.impl/core/marker/trait.Freeze.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl !Freeze for Error",1,["songbird::driver::connection::error::Error"]],["impl !Freeze for JoinError",1,["songbird::error::JoinError"]],["impl !Freeze for LiveStatBlock",1,["songbird::driver::scheduler::stats::LiveStatBlock"]],["impl !Freeze for RtcpData",1,["songbird::events::context::data::rtcp::RtcpData"]],["impl !Freeze for RtpData",1,["songbird::events::context::data::rtp::RtpData"]],["impl !Freeze for VoiceData",1,["songbird::events::context::data::voice::VoiceData"]],["impl !Freeze for OpusCompressor",1,["songbird::input::adapters::cached::compressed::OpusCompressor"]],["impl !Freeze for AsyncAdapterStream",1,["songbird::input::adapters::async_adapter::AsyncAdapterStream"]],["impl !Freeze for Join",1,["songbird::join::Join"]],["impl !Freeze for JoinGateway",1,["songbird::join::JoinGateway"]],["impl !Freeze for SerenityShardHandle",1,["songbird::shards::SerenityShardHandle"]],["impl !Freeze for Songbird",1,["songbird::manager::Songbird"]],["impl Freeze for Channels",1,["songbird::driver::decode_mode::Channels"]],["impl Freeze for CryptoMode",1,["songbird::driver::crypto::CryptoMode"]],["impl Freeze for DecodeMode",1,["songbird::driver::decode_mode::DecodeMode"]],["impl Freeze for MixMode",1,["songbird::driver::mix_mode::MixMode"]],["impl Freeze for SampleRate",1,["songbird::driver::decode_mode::SampleRate"]],["impl Freeze for Error",1,["songbird::driver::scheduler::Error"]],["impl Freeze for Mode",1,["songbird::driver::scheduler::config::Mode"]],["impl Freeze for Strategy",1,["songbird::driver::retry::strategy::Strategy"]],["impl Freeze for DisconnectKind",1,["songbird::events::context::data::disconnect::DisconnectKind"]],["impl Freeze for DisconnectReason",1,["songbird::events::context::data::disconnect::DisconnectReason"]],["impl Freeze for CoreEvent",1,["songbird::events::core::CoreEvent"]],["impl Freeze for Event",1,["songbird::events::Event"]],["impl Freeze for TrackEvent",1,["songbird::events::track::TrackEvent"]],["impl Freeze for UntimedEvent",1,["songbird::events::untimed::UntimedEvent"]],["impl Freeze for CodecCacheError",1,["songbird::input::adapters::cached::error::CodecCacheError"]],["impl Freeze for Error",1,["songbird::input::adapters::cached::error::Error"]],["impl Freeze for LengthHint",1,["songbird::input::adapters::cached::hint::LengthHint"]],["impl Freeze for AudioStreamError",1,["songbird::input::error::AudioStreamError"]],["impl Freeze for AuxMetadataError",1,["songbird::input::error::AuxMetadataError"]],["impl Freeze for Input",1,["songbird::input::Input"]],["impl Freeze for LiveInput",1,["songbird::input::live_input::LiveInput"]],["impl Freeze for MakePlayableError",1,["songbird::input::error::MakePlayableError"]],["impl Freeze for MetadataError",1,["songbird::input::error::MetadataError"]],["impl Freeze for Shard",1,["songbird::shards::Shard"]],["impl Freeze for Sharder",1,["songbird::shards::Sharder"]],["impl Freeze for ControlError",1,["songbird::tracks::error::ControlError"]],["impl Freeze for LoopState",1,["songbird::tracks::looping::LoopState"]],["impl Freeze for PlayError",1,["songbird::tracks::error::PlayError"]],["impl Freeze for PlayMode",1,["songbird::tracks::mode::PlayMode"]],["impl Freeze for ReadyState",1,["songbird::tracks::ready::ReadyState"]],["impl Freeze for ExponentialBackoff",1,["songbird::driver::retry::strategy::ExponentialBackoff"]],["impl Freeze for Retry",1,["songbird::driver::retry::Retry"]],["impl Freeze for Connect",1,["songbird::driver::Connect"]],["impl Freeze for DecodeConfig",1,["songbird::driver::decode_mode::DecodeConfig"]],["impl Freeze for DisposalThread",1,["songbird::driver::tasks::disposal::DisposalThread"]],["impl Freeze for Driver",1,["songbird::driver::Driver"]],["impl Freeze for Scheduler",1,["songbird::driver::scheduler::Scheduler"]],["impl Freeze for Config",1,["songbird::driver::scheduler::config::Config"]],["impl Freeze for VoiceTick",1,["songbird::events::context::data::voice::VoiceTick"]],["impl Freeze for EventData",1,["songbird::events::data::EventData"]],["impl Freeze for EventStore",1,["songbird::events::store::EventStore"]],["impl Freeze for ChannelId",1,["songbird::id::ChannelId"]],["impl Freeze for GuildId",1,["songbird::id::GuildId"]],["impl Freeze for UserId",1,["songbird::id::UserId"]],["impl Freeze for Compressed",1,["songbird::input::adapters::cached::compressed::Compressed"]],["impl Freeze for Config",1,["songbird::input::adapters::cached::compressed::Config"]],["impl Freeze for Decompressed",1,["songbird::input::adapters::cached::decompressed::Decompressed"]],["impl Freeze for Memory",1,["songbird::input::adapters::cached::memory::Memory"]],["impl Freeze for DcaReader",1,["songbird::input::codecs::dca::DcaReader"]],["impl Freeze for OpusDecoder",1,["songbird::input::codecs::opus::OpusDecoder"]],["impl Freeze for RawReader",1,["songbird::input::codecs::raw::RawReader"]],["impl Freeze for AsyncReadOnlySource",1,["songbird::input::sources::AsyncReadOnlySource"]],["impl Freeze for AuxMetadata",1,["songbird::input::metadata::AuxMetadata"]],["impl Freeze for ChildContainer",1,["songbird::input::adapters::child::ChildContainer"]],["impl Freeze for HlsRequest",1,["songbird::input::sources::hls::HlsRequest"]],["impl Freeze for HttpRequest",1,["songbird::input::sources::http::HttpRequest"]],["impl Freeze for Parsed",1,["songbird::input::parsed::Parsed"]],["impl Freeze for SongbirdKey",1,["songbird::serenity::SongbirdKey"]],["impl Freeze for SerenitySharder",1,["songbird::shards::SerenitySharder"]],["impl Freeze for TwilightMap",1,["songbird::shards::TwilightMap"]],["impl Freeze for Call",1,["songbird::handler::Call"]],["impl Freeze for Config",1,["songbird::config::Config"]],["impl Freeze for ConnectionInfo",1,["songbird::info::ConnectionInfo"]],["impl Freeze for Action",1,["songbird::tracks::action::Action"]],["impl Freeze for Queued",1,["songbird::tracks::queue::Queued"]],["impl Freeze for Track",1,["songbird::tracks::Track"]],["impl Freeze for TrackHandle",1,["songbird::tracks::handle::TrackHandle"]],["impl Freeze for TrackQueue",1,["songbird::tracks::queue::TrackQueue"]],["impl Freeze for TrackState",1,["songbird::tracks::state::TrackState"]],["impl<'a> !Freeze for EventContext<'a>",1,["songbird::events::context::EventContext"]],["impl<'a> Freeze for ConnectData<'a>",1,["songbird::events::context::data::connect::ConnectData"]],["impl<'a> Freeze for DisconnectData<'a>",1,["songbird::events::context::data::disconnect::DisconnectData"]],["impl<'a> Freeze for Metadata<'a>",1,["songbird::input::metadata::Metadata"]],["impl<'a> Freeze for YoutubeDl<'a>",1,["songbird::input::sources::ytdl::YoutubeDl"]],["impl<'a> Freeze for Iter<'a>",1,["songbird::manager::Iter"]],["impl<'a> Freeze for View<'a>",1,["songbird::tracks::view::View"]],["impl<A> Freeze for RawAdapter<A>
where\n A: Freeze,
",1,["songbird::input::adapters::raw_adapter::RawAdapter"]],["impl<P> Freeze for File<P>
where\n P: Freeze,
",1,["songbird::input::sources::file::File"]],["impl<T> Freeze for AudioStream<T>
where\n T: Freeze,
",1,["songbird::input::audiostream::AudioStream"]],["impl<T> Freeze for TrackCallback<T>",1,["songbird::tracks::handle::TrackCallback"]]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[30932]} \ No newline at end of file diff --git a/next/trait.impl/core/marker/trait.Send.js b/next/trait.impl/core/marker/trait.Send.js new file mode 100644 index 0000000..11ef144 --- /dev/null +++ b/next/trait.impl/core/marker/trait.Send.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl Send for Channels",1,["songbird::driver::decode_mode::Channels"]],["impl Send for CryptoMode",1,["songbird::driver::crypto::CryptoMode"]],["impl Send for DecodeMode",1,["songbird::driver::decode_mode::DecodeMode"]],["impl Send for MixMode",1,["songbird::driver::mix_mode::MixMode"]],["impl Send for SampleRate",1,["songbird::driver::decode_mode::SampleRate"]],["impl Send for Error",1,["songbird::driver::scheduler::Error"]],["impl Send for Mode",1,["songbird::driver::scheduler::config::Mode"]],["impl Send for Strategy",1,["songbird::driver::retry::strategy::Strategy"]],["impl Send for Error",1,["songbird::driver::connection::error::Error"]],["impl Send for JoinError",1,["songbird::error::JoinError"]],["impl Send for DisconnectKind",1,["songbird::events::context::data::disconnect::DisconnectKind"]],["impl Send for DisconnectReason",1,["songbird::events::context::data::disconnect::DisconnectReason"]],["impl Send for CoreEvent",1,["songbird::events::core::CoreEvent"]],["impl Send for Event",1,["songbird::events::Event"]],["impl Send for TrackEvent",1,["songbird::events::track::TrackEvent"]],["impl Send for UntimedEvent",1,["songbird::events::untimed::UntimedEvent"]],["impl Send for CodecCacheError",1,["songbird::input::adapters::cached::error::CodecCacheError"]],["impl Send for Error",1,["songbird::input::adapters::cached::error::Error"]],["impl Send for LengthHint",1,["songbird::input::adapters::cached::hint::LengthHint"]],["impl Send for AudioStreamError",1,["songbird::input::error::AudioStreamError"]],["impl Send for AuxMetadataError",1,["songbird::input::error::AuxMetadataError"]],["impl Send for Input",1,["songbird::input::Input"]],["impl Send for LiveInput",1,["songbird::input::live_input::LiveInput"]],["impl Send for MakePlayableError",1,["songbird::input::error::MakePlayableError"]],["impl Send for MetadataError",1,["songbird::input::error::MetadataError"]],["impl Send for Shard",1,["songbird::shards::Shard"]],["impl Send for Sharder",1,["songbird::shards::Sharder"]],["impl Send for ControlError",1,["songbird::tracks::error::ControlError"]],["impl Send for LoopState",1,["songbird::tracks::looping::LoopState"]],["impl Send for PlayError",1,["songbird::tracks::error::PlayError"]],["impl Send for PlayMode",1,["songbird::tracks::mode::PlayMode"]],["impl Send for ReadyState",1,["songbird::tracks::ready::ReadyState"]],["impl Send for ExponentialBackoff",1,["songbird::driver::retry::strategy::ExponentialBackoff"]],["impl Send for Retry",1,["songbird::driver::retry::Retry"]],["impl Send for Connect",1,["songbird::driver::Connect"]],["impl Send for DecodeConfig",1,["songbird::driver::decode_mode::DecodeConfig"]],["impl Send for DisposalThread",1,["songbird::driver::tasks::disposal::DisposalThread"]],["impl Send for Driver",1,["songbird::driver::Driver"]],["impl Send for LiveStatBlock",1,["songbird::driver::scheduler::stats::LiveStatBlock"]],["impl Send for Scheduler",1,["songbird::driver::scheduler::Scheduler"]],["impl Send for Config",1,["songbird::driver::scheduler::config::Config"]],["impl Send for RtcpData",1,["songbird::events::context::data::rtcp::RtcpData"]],["impl Send for RtpData",1,["songbird::events::context::data::rtp::RtpData"]],["impl Send for VoiceData",1,["songbird::events::context::data::voice::VoiceData"]],["impl Send for VoiceTick",1,["songbird::events::context::data::voice::VoiceTick"]],["impl Send for EventData",1,["songbird::events::data::EventData"]],["impl Send for EventStore",1,["songbird::events::store::EventStore"]],["impl Send for ChannelId",1,["songbird::id::ChannelId"]],["impl Send for GuildId",1,["songbird::id::GuildId"]],["impl Send for UserId",1,["songbird::id::UserId"]],["impl Send for Compressed",1,["songbird::input::adapters::cached::compressed::Compressed"]],["impl Send for Config",1,["songbird::input::adapters::cached::compressed::Config"]],["impl Send for Decompressed",1,["songbird::input::adapters::cached::decompressed::Decompressed"]],["impl Send for Memory",1,["songbird::input::adapters::cached::memory::Memory"]],["impl Send for OpusCompressor",1,["songbird::input::adapters::cached::compressed::OpusCompressor"]],["impl Send for DcaReader",1,["songbird::input::codecs::dca::DcaReader"]],["impl Send for OpusDecoder",1,["songbird::input::codecs::opus::OpusDecoder"]],["impl Send for RawReader",1,["songbird::input::codecs::raw::RawReader"]],["impl Send for AsyncAdapterStream",1,["songbird::input::adapters::async_adapter::AsyncAdapterStream"]],["impl Send for AsyncReadOnlySource",1,["songbird::input::sources::AsyncReadOnlySource"]],["impl Send for AuxMetadata",1,["songbird::input::metadata::AuxMetadata"]],["impl Send for ChildContainer",1,["songbird::input::adapters::child::ChildContainer"]],["impl Send for HlsRequest",1,["songbird::input::sources::hls::HlsRequest"]],["impl Send for HttpRequest",1,["songbird::input::sources::http::HttpRequest"]],["impl Send for Parsed",1,["songbird::input::parsed::Parsed"]],["impl Send for Join",1,["songbird::join::Join"]],["impl Send for JoinGateway",1,["songbird::join::JoinGateway"]],["impl Send for SongbirdKey",1,["songbird::serenity::SongbirdKey"]],["impl Send for SerenityShardHandle",1,["songbird::shards::SerenityShardHandle"]],["impl Send for SerenitySharder",1,["songbird::shards::SerenitySharder"]],["impl Send for TwilightMap",1,["songbird::shards::TwilightMap"]],["impl Send for Call",1,["songbird::handler::Call"]],["impl Send for Config",1,["songbird::config::Config"]],["impl Send for ConnectionInfo",1,["songbird::info::ConnectionInfo"]],["impl Send for Songbird",1,["songbird::manager::Songbird"]],["impl Send for Action",1,["songbird::tracks::action::Action"]],["impl Send for Queued",1,["songbird::tracks::queue::Queued"]],["impl Send for Track",1,["songbird::tracks::Track"]],["impl Send for TrackHandle",1,["songbird::tracks::handle::TrackHandle"]],["impl Send for TrackQueue",1,["songbird::tracks::queue::TrackQueue"]],["impl Send for TrackState",1,["songbird::tracks::state::TrackState"]],["impl<'a> Send for EventContext<'a>",1,["songbird::events::context::EventContext"]],["impl<'a> Send for ConnectData<'a>",1,["songbird::events::context::data::connect::ConnectData"]],["impl<'a> Send for DisconnectData<'a>",1,["songbird::events::context::data::disconnect::DisconnectData"]],["impl<'a> Send for Metadata<'a>",1,["songbird::input::metadata::Metadata"]],["impl<'a> Send for YoutubeDl<'a>",1,["songbird::input::sources::ytdl::YoutubeDl"]],["impl<'a> Send for Iter<'a>",1,["songbird::manager::Iter"]],["impl<'a> Send for View<'a>",1,["songbird::tracks::view::View"]],["impl<A> Send for RawAdapter<A>
where\n A: Send,
",1,["songbird::input::adapters::raw_adapter::RawAdapter"]],["impl<P> Send for File<P>
where\n P: Send,
",1,["songbird::input::sources::file::File"]],["impl<T> Send for AudioStream<T>",1,["songbird::input::audiostream::AudioStream"]],["impl<T> Send for TrackCallback<T>
where\n T: Send,
",1,["songbird::tracks::handle::TrackCallback"]]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[30349]} \ No newline at end of file diff --git a/next/trait.impl/core/marker/trait.StructuralPartialEq.js b/next/trait.impl/core/marker/trait.StructuralPartialEq.js new file mode 100644 index 0000000..df04603 --- /dev/null +++ b/next/trait.impl/core/marker/trait.StructuralPartialEq.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl StructuralPartialEq for Channels"],["impl StructuralPartialEq for CryptoMode"],["impl StructuralPartialEq for DecodeMode"],["impl StructuralPartialEq for MixMode"],["impl StructuralPartialEq for SampleRate"],["impl StructuralPartialEq for Strategy"],["impl StructuralPartialEq for DisconnectKind"],["impl StructuralPartialEq for DisconnectReason"],["impl StructuralPartialEq for CoreEvent"],["impl StructuralPartialEq for Event"],["impl StructuralPartialEq for TrackEvent"],["impl StructuralPartialEq for UntimedEvent"],["impl StructuralPartialEq for LoopState"],["impl StructuralPartialEq for ReadyState"],["impl StructuralPartialEq for ExponentialBackoff"],["impl StructuralPartialEq for Retry"],["impl StructuralPartialEq for DecodeConfig"],["impl StructuralPartialEq for RtcpData"],["impl StructuralPartialEq for RtpData"],["impl StructuralPartialEq for VoiceData"],["impl StructuralPartialEq for VoiceTick"],["impl StructuralPartialEq for ChannelId"],["impl StructuralPartialEq for GuildId"],["impl StructuralPartialEq for UserId"],["impl StructuralPartialEq for AuxMetadata"],["impl StructuralPartialEq for ConnectionInfo"],["impl StructuralPartialEq for TrackState"],["impl<'a> StructuralPartialEq for ConnectData<'a>"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[9107]} \ No newline at end of file diff --git a/next/trait.impl/core/marker/trait.Sync.js b/next/trait.impl/core/marker/trait.Sync.js new file mode 100644 index 0000000..d525272 --- /dev/null +++ b/next/trait.impl/core/marker/trait.Sync.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl !Sync for Input",1,["songbird::input::Input"]],["impl !Sync for OpusCompressor",1,["songbird::input::adapters::cached::compressed::OpusCompressor"]],["impl !Sync for Track",1,["songbird::tracks::Track"]],["impl Sync for Channels",1,["songbird::driver::decode_mode::Channels"]],["impl Sync for CryptoMode",1,["songbird::driver::crypto::CryptoMode"]],["impl Sync for DecodeMode",1,["songbird::driver::decode_mode::DecodeMode"]],["impl Sync for MixMode",1,["songbird::driver::mix_mode::MixMode"]],["impl Sync for SampleRate",1,["songbird::driver::decode_mode::SampleRate"]],["impl Sync for Error",1,["songbird::driver::scheduler::Error"]],["impl Sync for Mode",1,["songbird::driver::scheduler::config::Mode"]],["impl Sync for Strategy",1,["songbird::driver::retry::strategy::Strategy"]],["impl Sync for Error",1,["songbird::driver::connection::error::Error"]],["impl Sync for JoinError",1,["songbird::error::JoinError"]],["impl Sync for DisconnectKind",1,["songbird::events::context::data::disconnect::DisconnectKind"]],["impl Sync for DisconnectReason",1,["songbird::events::context::data::disconnect::DisconnectReason"]],["impl Sync for CoreEvent",1,["songbird::events::core::CoreEvent"]],["impl Sync for Event",1,["songbird::events::Event"]],["impl Sync for TrackEvent",1,["songbird::events::track::TrackEvent"]],["impl Sync for UntimedEvent",1,["songbird::events::untimed::UntimedEvent"]],["impl Sync for CodecCacheError",1,["songbird::input::adapters::cached::error::CodecCacheError"]],["impl Sync for Error",1,["songbird::input::adapters::cached::error::Error"]],["impl Sync for LengthHint",1,["songbird::input::adapters::cached::hint::LengthHint"]],["impl Sync for AudioStreamError",1,["songbird::input::error::AudioStreamError"]],["impl Sync for AuxMetadataError",1,["songbird::input::error::AuxMetadataError"]],["impl Sync for LiveInput",1,["songbird::input::live_input::LiveInput"]],["impl Sync for MakePlayableError",1,["songbird::input::error::MakePlayableError"]],["impl Sync for MetadataError",1,["songbird::input::error::MetadataError"]],["impl Sync for Shard",1,["songbird::shards::Shard"]],["impl Sync for Sharder",1,["songbird::shards::Sharder"]],["impl Sync for ControlError",1,["songbird::tracks::error::ControlError"]],["impl Sync for LoopState",1,["songbird::tracks::looping::LoopState"]],["impl Sync for PlayError",1,["songbird::tracks::error::PlayError"]],["impl Sync for PlayMode",1,["songbird::tracks::mode::PlayMode"]],["impl Sync for ReadyState",1,["songbird::tracks::ready::ReadyState"]],["impl Sync for ExponentialBackoff",1,["songbird::driver::retry::strategy::ExponentialBackoff"]],["impl Sync for Retry",1,["songbird::driver::retry::Retry"]],["impl Sync for Connect",1,["songbird::driver::Connect"]],["impl Sync for DecodeConfig",1,["songbird::driver::decode_mode::DecodeConfig"]],["impl Sync for DisposalThread",1,["songbird::driver::tasks::disposal::DisposalThread"]],["impl Sync for Driver",1,["songbird::driver::Driver"]],["impl Sync for LiveStatBlock",1,["songbird::driver::scheduler::stats::LiveStatBlock"]],["impl Sync for Scheduler",1,["songbird::driver::scheduler::Scheduler"]],["impl Sync for Config",1,["songbird::driver::scheduler::config::Config"]],["impl Sync for RtcpData",1,["songbird::events::context::data::rtcp::RtcpData"]],["impl Sync for RtpData",1,["songbird::events::context::data::rtp::RtpData"]],["impl Sync for VoiceData",1,["songbird::events::context::data::voice::VoiceData"]],["impl Sync for VoiceTick",1,["songbird::events::context::data::voice::VoiceTick"]],["impl Sync for EventData",1,["songbird::events::data::EventData"]],["impl Sync for EventStore",1,["songbird::events::store::EventStore"]],["impl Sync for ChannelId",1,["songbird::id::ChannelId"]],["impl Sync for GuildId",1,["songbird::id::GuildId"]],["impl Sync for UserId",1,["songbird::id::UserId"]],["impl Sync for Compressed",1,["songbird::input::adapters::cached::compressed::Compressed"]],["impl Sync for Config",1,["songbird::input::adapters::cached::compressed::Config"]],["impl Sync for Decompressed",1,["songbird::input::adapters::cached::decompressed::Decompressed"]],["impl Sync for Memory",1,["songbird::input::adapters::cached::memory::Memory"]],["impl Sync for DcaReader",1,["songbird::input::codecs::dca::DcaReader"]],["impl Sync for OpusDecoder"],["impl Sync for RawReader",1,["songbird::input::codecs::raw::RawReader"]],["impl Sync for AsyncAdapterStream",1,["songbird::input::adapters::async_adapter::AsyncAdapterStream"]],["impl Sync for AsyncReadOnlySource",1,["songbird::input::sources::AsyncReadOnlySource"]],["impl Sync for AuxMetadata",1,["songbird::input::metadata::AuxMetadata"]],["impl Sync for ChildContainer",1,["songbird::input::adapters::child::ChildContainer"]],["impl Sync for HlsRequest",1,["songbird::input::sources::hls::HlsRequest"]],["impl Sync for HttpRequest",1,["songbird::input::sources::http::HttpRequest"]],["impl Sync for Parsed",1,["songbird::input::parsed::Parsed"]],["impl Sync for Join",1,["songbird::join::Join"]],["impl Sync for JoinGateway",1,["songbird::join::JoinGateway"]],["impl Sync for SongbirdKey",1,["songbird::serenity::SongbirdKey"]],["impl Sync for SerenityShardHandle",1,["songbird::shards::SerenityShardHandle"]],["impl Sync for SerenitySharder",1,["songbird::shards::SerenitySharder"]],["impl Sync for TwilightMap",1,["songbird::shards::TwilightMap"]],["impl Sync for Call",1,["songbird::handler::Call"]],["impl Sync for Config",1,["songbird::config::Config"]],["impl Sync for ConnectionInfo",1,["songbird::info::ConnectionInfo"]],["impl Sync for Songbird",1,["songbird::manager::Songbird"]],["impl Sync for Action",1,["songbird::tracks::action::Action"]],["impl Sync for Queued",1,["songbird::tracks::queue::Queued"]],["impl Sync for TrackHandle",1,["songbird::tracks::handle::TrackHandle"]],["impl Sync for TrackQueue",1,["songbird::tracks::queue::TrackQueue"]],["impl Sync for TrackState",1,["songbird::tracks::state::TrackState"]],["impl<'a> Sync for EventContext<'a>",1,["songbird::events::context::EventContext"]],["impl<'a> Sync for ConnectData<'a>",1,["songbird::events::context::data::connect::ConnectData"]],["impl<'a> Sync for DisconnectData<'a>",1,["songbird::events::context::data::disconnect::DisconnectData"]],["impl<'a> Sync for Metadata<'a>",1,["songbird::input::metadata::Metadata"]],["impl<'a> Sync for YoutubeDl<'a>",1,["songbird::input::sources::ytdl::YoutubeDl"]],["impl<'a> Sync for Iter<'a>",1,["songbird::manager::Iter"]],["impl<'a> Sync for View<'a>",1,["songbird::tracks::view::View"]],["impl<A> Sync for RawAdapter<A>
where\n A: Sync,
",1,["songbird::input::adapters::raw_adapter::RawAdapter"]],["impl<P> Sync for File<P>
where\n P: Sync,
",1,["songbird::input::sources::file::File"]],["impl<T> Sync for AudioStream<T>
where\n T: Sync,
",1,["songbird::input::audiostream::AudioStream"]],["impl<T> Sync for TrackCallback<T>
where\n T: Send,
",1,["songbird::tracks::handle::TrackCallback"]]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[30478]} \ No newline at end of file diff --git a/next/trait.impl/core/marker/trait.Unpin.js b/next/trait.impl/core/marker/trait.Unpin.js new file mode 100644 index 0000000..cacb1de --- /dev/null +++ b/next/trait.impl/core/marker/trait.Unpin.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl Unpin for Channels",1,["songbird::driver::decode_mode::Channels"]],["impl Unpin for CryptoMode",1,["songbird::driver::crypto::CryptoMode"]],["impl Unpin for DecodeMode",1,["songbird::driver::decode_mode::DecodeMode"]],["impl Unpin for MixMode",1,["songbird::driver::mix_mode::MixMode"]],["impl Unpin for SampleRate",1,["songbird::driver::decode_mode::SampleRate"]],["impl Unpin for Error",1,["songbird::driver::scheduler::Error"]],["impl Unpin for Mode",1,["songbird::driver::scheduler::config::Mode"]],["impl Unpin for Strategy",1,["songbird::driver::retry::strategy::Strategy"]],["impl Unpin for Error",1,["songbird::driver::connection::error::Error"]],["impl Unpin for JoinError",1,["songbird::error::JoinError"]],["impl Unpin for DisconnectKind",1,["songbird::events::context::data::disconnect::DisconnectKind"]],["impl Unpin for DisconnectReason",1,["songbird::events::context::data::disconnect::DisconnectReason"]],["impl Unpin for CoreEvent",1,["songbird::events::core::CoreEvent"]],["impl Unpin for Event",1,["songbird::events::Event"]],["impl Unpin for TrackEvent",1,["songbird::events::track::TrackEvent"]],["impl Unpin for UntimedEvent",1,["songbird::events::untimed::UntimedEvent"]],["impl Unpin for CodecCacheError",1,["songbird::input::adapters::cached::error::CodecCacheError"]],["impl Unpin for Error",1,["songbird::input::adapters::cached::error::Error"]],["impl Unpin for LengthHint",1,["songbird::input::adapters::cached::hint::LengthHint"]],["impl Unpin for AudioStreamError",1,["songbird::input::error::AudioStreamError"]],["impl Unpin for AuxMetadataError",1,["songbird::input::error::AuxMetadataError"]],["impl Unpin for Input",1,["songbird::input::Input"]],["impl Unpin for LiveInput",1,["songbird::input::live_input::LiveInput"]],["impl Unpin for MakePlayableError",1,["songbird::input::error::MakePlayableError"]],["impl Unpin for MetadataError",1,["songbird::input::error::MetadataError"]],["impl Unpin for Shard",1,["songbird::shards::Shard"]],["impl Unpin for Sharder",1,["songbird::shards::Sharder"]],["impl Unpin for ControlError",1,["songbird::tracks::error::ControlError"]],["impl Unpin for LoopState",1,["songbird::tracks::looping::LoopState"]],["impl Unpin for PlayError",1,["songbird::tracks::error::PlayError"]],["impl Unpin for PlayMode",1,["songbird::tracks::mode::PlayMode"]],["impl Unpin for ReadyState",1,["songbird::tracks::ready::ReadyState"]],["impl Unpin for ExponentialBackoff",1,["songbird::driver::retry::strategy::ExponentialBackoff"]],["impl Unpin for Retry",1,["songbird::driver::retry::Retry"]],["impl Unpin for Connect",1,["songbird::driver::Connect"]],["impl Unpin for DecodeConfig",1,["songbird::driver::decode_mode::DecodeConfig"]],["impl Unpin for DisposalThread",1,["songbird::driver::tasks::disposal::DisposalThread"]],["impl Unpin for Driver",1,["songbird::driver::Driver"]],["impl Unpin for LiveStatBlock",1,["songbird::driver::scheduler::stats::LiveStatBlock"]],["impl Unpin for Scheduler",1,["songbird::driver::scheduler::Scheduler"]],["impl Unpin for Config",1,["songbird::driver::scheduler::config::Config"]],["impl Unpin for RtcpData",1,["songbird::events::context::data::rtcp::RtcpData"]],["impl Unpin for RtpData",1,["songbird::events::context::data::rtp::RtpData"]],["impl Unpin for VoiceData",1,["songbird::events::context::data::voice::VoiceData"]],["impl Unpin for VoiceTick",1,["songbird::events::context::data::voice::VoiceTick"]],["impl Unpin for EventData",1,["songbird::events::data::EventData"]],["impl Unpin for EventStore",1,["songbird::events::store::EventStore"]],["impl Unpin for ChannelId",1,["songbird::id::ChannelId"]],["impl Unpin for GuildId",1,["songbird::id::GuildId"]],["impl Unpin for UserId",1,["songbird::id::UserId"]],["impl Unpin for Compressed",1,["songbird::input::adapters::cached::compressed::Compressed"]],["impl Unpin for Config",1,["songbird::input::adapters::cached::compressed::Config"]],["impl Unpin for Decompressed",1,["songbird::input::adapters::cached::decompressed::Decompressed"]],["impl Unpin for Memory",1,["songbird::input::adapters::cached::memory::Memory"]],["impl Unpin for OpusCompressor",1,["songbird::input::adapters::cached::compressed::OpusCompressor"]],["impl Unpin for DcaReader",1,["songbird::input::codecs::dca::DcaReader"]],["impl Unpin for OpusDecoder",1,["songbird::input::codecs::opus::OpusDecoder"]],["impl Unpin for RawReader",1,["songbird::input::codecs::raw::RawReader"]],["impl Unpin for AsyncAdapterStream",1,["songbird::input::adapters::async_adapter::AsyncAdapterStream"]],["impl Unpin for AuxMetadata",1,["songbird::input::metadata::AuxMetadata"]],["impl Unpin for ChildContainer",1,["songbird::input::adapters::child::ChildContainer"]],["impl Unpin for HlsRequest",1,["songbird::input::sources::hls::HlsRequest"]],["impl Unpin for HttpRequest",1,["songbird::input::sources::http::HttpRequest"]],["impl Unpin for Parsed",1,["songbird::input::parsed::Parsed"]],["impl Unpin for SongbirdKey",1,["songbird::serenity::SongbirdKey"]],["impl Unpin for SerenityShardHandle",1,["songbird::shards::SerenityShardHandle"]],["impl Unpin for SerenitySharder",1,["songbird::shards::SerenitySharder"]],["impl Unpin for TwilightMap",1,["songbird::shards::TwilightMap"]],["impl Unpin for Call",1,["songbird::handler::Call"]],["impl Unpin for Config",1,["songbird::config::Config"]],["impl Unpin for ConnectionInfo",1,["songbird::info::ConnectionInfo"]],["impl Unpin for Songbird",1,["songbird::manager::Songbird"]],["impl Unpin for Action",1,["songbird::tracks::action::Action"]],["impl Unpin for Queued",1,["songbird::tracks::queue::Queued"]],["impl Unpin for Track",1,["songbird::tracks::Track"]],["impl Unpin for TrackHandle",1,["songbird::tracks::handle::TrackHandle"]],["impl Unpin for TrackQueue",1,["songbird::tracks::queue::TrackQueue"]],["impl Unpin for TrackState",1,["songbird::tracks::state::TrackState"]],["impl<'a> Unpin for EventContext<'a>",1,["songbird::events::context::EventContext"]],["impl<'a> Unpin for ConnectData<'a>",1,["songbird::events::context::data::connect::ConnectData"]],["impl<'a> Unpin for DisconnectData<'a>",1,["songbird::events::context::data::disconnect::DisconnectData"]],["impl<'a> Unpin for Metadata<'a>",1,["songbird::input::metadata::Metadata"]],["impl<'a> Unpin for YoutubeDl<'a>",1,["songbird::input::sources::ytdl::YoutubeDl"]],["impl<'a> Unpin for Iter<'a>",1,["songbird::manager::Iter"]],["impl<'a> Unpin for View<'a>",1,["songbird::tracks::view::View"]],["impl<'pin> Unpin for AsyncReadOnlySource
where\n PinnedFieldsOf<__AsyncReadOnlySource<'pin>>: Unpin,
"],["impl<'pin> Unpin for Join
where\n PinnedFieldsOf<__Join<'pin>>: Unpin,
"],["impl<'pin> Unpin for JoinGateway
where\n PinnedFieldsOf<__JoinGateway<'pin>>: Unpin,
"],["impl<A> Unpin for RawAdapter<A>
where\n A: Unpin,
",1,["songbird::input::adapters::raw_adapter::RawAdapter"]],["impl<P> Unpin for File<P>
where\n P: Unpin,
",1,["songbird::input::sources::file::File"]],["impl<T> Unpin for AudioStream<T>
where\n T: Unpin,
",1,["songbird::input::audiostream::AudioStream"]],["impl<T> Unpin for TrackCallback<T>",1,["songbird::tracks::handle::TrackCallback"]]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[31230]} \ No newline at end of file diff --git a/next/trait.impl/core/marker/trait.UnsafeUnpin.js b/next/trait.impl/core/marker/trait.UnsafeUnpin.js new file mode 100644 index 0000000..80cc1aa --- /dev/null +++ b/next/trait.impl/core/marker/trait.UnsafeUnpin.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl !UnsafeUnpin for Join",1,["songbird::join::Join"]],["impl !UnsafeUnpin for JoinGateway",1,["songbird::join::JoinGateway"]],["impl UnsafeUnpin for Channels",1,["songbird::driver::decode_mode::Channels"]],["impl UnsafeUnpin for CryptoMode",1,["songbird::driver::crypto::CryptoMode"]],["impl UnsafeUnpin for DecodeMode",1,["songbird::driver::decode_mode::DecodeMode"]],["impl UnsafeUnpin for MixMode",1,["songbird::driver::mix_mode::MixMode"]],["impl UnsafeUnpin for SampleRate",1,["songbird::driver::decode_mode::SampleRate"]],["impl UnsafeUnpin for Error",1,["songbird::driver::scheduler::Error"]],["impl UnsafeUnpin for Mode",1,["songbird::driver::scheduler::config::Mode"]],["impl UnsafeUnpin for Strategy",1,["songbird::driver::retry::strategy::Strategy"]],["impl UnsafeUnpin for Error",1,["songbird::driver::connection::error::Error"]],["impl UnsafeUnpin for JoinError",1,["songbird::error::JoinError"]],["impl UnsafeUnpin for DisconnectKind",1,["songbird::events::context::data::disconnect::DisconnectKind"]],["impl UnsafeUnpin for DisconnectReason",1,["songbird::events::context::data::disconnect::DisconnectReason"]],["impl UnsafeUnpin for CoreEvent",1,["songbird::events::core::CoreEvent"]],["impl UnsafeUnpin for Event",1,["songbird::events::Event"]],["impl UnsafeUnpin for TrackEvent",1,["songbird::events::track::TrackEvent"]],["impl UnsafeUnpin for UntimedEvent",1,["songbird::events::untimed::UntimedEvent"]],["impl UnsafeUnpin for CodecCacheError",1,["songbird::input::adapters::cached::error::CodecCacheError"]],["impl UnsafeUnpin for Error",1,["songbird::input::adapters::cached::error::Error"]],["impl UnsafeUnpin for LengthHint",1,["songbird::input::adapters::cached::hint::LengthHint"]],["impl UnsafeUnpin for AudioStreamError",1,["songbird::input::error::AudioStreamError"]],["impl UnsafeUnpin for AuxMetadataError",1,["songbird::input::error::AuxMetadataError"]],["impl UnsafeUnpin for Input",1,["songbird::input::Input"]],["impl UnsafeUnpin for LiveInput",1,["songbird::input::live_input::LiveInput"]],["impl UnsafeUnpin for MakePlayableError",1,["songbird::input::error::MakePlayableError"]],["impl UnsafeUnpin for MetadataError",1,["songbird::input::error::MetadataError"]],["impl UnsafeUnpin for Shard",1,["songbird::shards::Shard"]],["impl UnsafeUnpin for Sharder",1,["songbird::shards::Sharder"]],["impl UnsafeUnpin for ControlError",1,["songbird::tracks::error::ControlError"]],["impl UnsafeUnpin for LoopState",1,["songbird::tracks::looping::LoopState"]],["impl UnsafeUnpin for PlayError",1,["songbird::tracks::error::PlayError"]],["impl UnsafeUnpin for PlayMode",1,["songbird::tracks::mode::PlayMode"]],["impl UnsafeUnpin for ReadyState",1,["songbird::tracks::ready::ReadyState"]],["impl UnsafeUnpin for ExponentialBackoff",1,["songbird::driver::retry::strategy::ExponentialBackoff"]],["impl UnsafeUnpin for Retry",1,["songbird::driver::retry::Retry"]],["impl UnsafeUnpin for Connect",1,["songbird::driver::Connect"]],["impl UnsafeUnpin for DecodeConfig",1,["songbird::driver::decode_mode::DecodeConfig"]],["impl UnsafeUnpin for DisposalThread",1,["songbird::driver::tasks::disposal::DisposalThread"]],["impl UnsafeUnpin for Driver",1,["songbird::driver::Driver"]],["impl UnsafeUnpin for LiveStatBlock",1,["songbird::driver::scheduler::stats::LiveStatBlock"]],["impl UnsafeUnpin for Scheduler",1,["songbird::driver::scheduler::Scheduler"]],["impl UnsafeUnpin for Config",1,["songbird::driver::scheduler::config::Config"]],["impl UnsafeUnpin for RtcpData",1,["songbird::events::context::data::rtcp::RtcpData"]],["impl UnsafeUnpin for RtpData",1,["songbird::events::context::data::rtp::RtpData"]],["impl UnsafeUnpin for VoiceData",1,["songbird::events::context::data::voice::VoiceData"]],["impl UnsafeUnpin for VoiceTick",1,["songbird::events::context::data::voice::VoiceTick"]],["impl UnsafeUnpin for EventData",1,["songbird::events::data::EventData"]],["impl UnsafeUnpin for EventStore",1,["songbird::events::store::EventStore"]],["impl UnsafeUnpin for ChannelId",1,["songbird::id::ChannelId"]],["impl UnsafeUnpin for GuildId",1,["songbird::id::GuildId"]],["impl UnsafeUnpin for UserId",1,["songbird::id::UserId"]],["impl UnsafeUnpin for Compressed",1,["songbird::input::adapters::cached::compressed::Compressed"]],["impl UnsafeUnpin for Config",1,["songbird::input::adapters::cached::compressed::Config"]],["impl UnsafeUnpin for Decompressed",1,["songbird::input::adapters::cached::decompressed::Decompressed"]],["impl UnsafeUnpin for Memory",1,["songbird::input::adapters::cached::memory::Memory"]],["impl UnsafeUnpin for OpusCompressor",1,["songbird::input::adapters::cached::compressed::OpusCompressor"]],["impl UnsafeUnpin for DcaReader",1,["songbird::input::codecs::dca::DcaReader"]],["impl UnsafeUnpin for OpusDecoder",1,["songbird::input::codecs::opus::OpusDecoder"]],["impl UnsafeUnpin for RawReader",1,["songbird::input::codecs::raw::RawReader"]],["impl UnsafeUnpin for AsyncAdapterStream",1,["songbird::input::adapters::async_adapter::AsyncAdapterStream"]],["impl UnsafeUnpin for AsyncReadOnlySource",1,["songbird::input::sources::AsyncReadOnlySource"]],["impl UnsafeUnpin for AuxMetadata",1,["songbird::input::metadata::AuxMetadata"]],["impl UnsafeUnpin for ChildContainer",1,["songbird::input::adapters::child::ChildContainer"]],["impl UnsafeUnpin for HlsRequest",1,["songbird::input::sources::hls::HlsRequest"]],["impl UnsafeUnpin for HttpRequest",1,["songbird::input::sources::http::HttpRequest"]],["impl UnsafeUnpin for Parsed",1,["songbird::input::parsed::Parsed"]],["impl UnsafeUnpin for SongbirdKey",1,["songbird::serenity::SongbirdKey"]],["impl UnsafeUnpin for SerenityShardHandle",1,["songbird::shards::SerenityShardHandle"]],["impl UnsafeUnpin for SerenitySharder",1,["songbird::shards::SerenitySharder"]],["impl UnsafeUnpin for TwilightMap",1,["songbird::shards::TwilightMap"]],["impl UnsafeUnpin for Call",1,["songbird::handler::Call"]],["impl UnsafeUnpin for Config",1,["songbird::config::Config"]],["impl UnsafeUnpin for ConnectionInfo",1,["songbird::info::ConnectionInfo"]],["impl UnsafeUnpin for Songbird",1,["songbird::manager::Songbird"]],["impl UnsafeUnpin for Action",1,["songbird::tracks::action::Action"]],["impl UnsafeUnpin for Queued",1,["songbird::tracks::queue::Queued"]],["impl UnsafeUnpin for Track",1,["songbird::tracks::Track"]],["impl UnsafeUnpin for TrackHandle",1,["songbird::tracks::handle::TrackHandle"]],["impl UnsafeUnpin for TrackQueue",1,["songbird::tracks::queue::TrackQueue"]],["impl UnsafeUnpin for TrackState",1,["songbird::tracks::state::TrackState"]],["impl<'a> UnsafeUnpin for EventContext<'a>",1,["songbird::events::context::EventContext"]],["impl<'a> UnsafeUnpin for ConnectData<'a>",1,["songbird::events::context::data::connect::ConnectData"]],["impl<'a> UnsafeUnpin for DisconnectData<'a>",1,["songbird::events::context::data::disconnect::DisconnectData"]],["impl<'a> UnsafeUnpin for Metadata<'a>",1,["songbird::input::metadata::Metadata"]],["impl<'a> UnsafeUnpin for YoutubeDl<'a>",1,["songbird::input::sources::ytdl::YoutubeDl"]],["impl<'a> UnsafeUnpin for Iter<'a>",1,["songbird::manager::Iter"]],["impl<'a> UnsafeUnpin for View<'a>",1,["songbird::tracks::view::View"]],["impl<A> UnsafeUnpin for RawAdapter<A>
where\n A: UnsafeUnpin,
",1,["songbird::input::adapters::raw_adapter::RawAdapter"]],["impl<P> UnsafeUnpin for File<P>
where\n P: UnsafeUnpin,
",1,["songbird::input::sources::file::File"]],["impl<T> UnsafeUnpin for AudioStream<T>
where\n T: UnsafeUnpin,
",1,["songbird::input::audiostream::AudioStream"]],["impl<T> UnsafeUnpin for TrackCallback<T>",1,["songbird::tracks::handle::TrackCallback"]]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[18761]} \ No newline at end of file diff --git a/next/trait.impl/core/ops/deref/trait.Deref.js b/next/trait.impl/core/ops/deref/trait.Deref.js new file mode 100644 index 0000000..1f5af0a --- /dev/null +++ b/next/trait.impl/core/ops/deref/trait.Deref.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl Deref for Call"],["impl Deref for Queued"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[541]} \ No newline at end of file diff --git a/next/trait.impl/core/ops/deref/trait.DerefMut.js b/next/trait.impl/core/ops/deref/trait.DerefMut.js new file mode 100644 index 0000000..230b2c5 --- /dev/null +++ b/next/trait.impl/core/ops/deref/trait.DerefMut.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl DerefMut for Call"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[276]} \ No newline at end of file diff --git a/next/trait.impl/core/ops/drop/trait.Drop.js b/next/trait.impl/core/ops/drop/trait.Drop.js new file mode 100644 index 0000000..a50d64c --- /dev/null +++ b/next/trait.impl/core/ops/drop/trait.Drop.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl Drop for Driver"],["impl Drop for ChildContainer"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[574]} \ No newline at end of file diff --git a/next/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js b/next/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js new file mode 100644 index 0000000..215b816 --- /dev/null +++ b/next/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl !RefUnwindSafe for Error",1,["songbird::driver::connection::error::Error"]],["impl !RefUnwindSafe for JoinError",1,["songbird::error::JoinError"]],["impl !RefUnwindSafe for CodecCacheError",1,["songbird::input::adapters::cached::error::CodecCacheError"]],["impl !RefUnwindSafe for Error",1,["songbird::input::adapters::cached::error::Error"]],["impl !RefUnwindSafe for AudioStreamError",1,["songbird::input::error::AudioStreamError"]],["impl !RefUnwindSafe for AuxMetadataError",1,["songbird::input::error::AuxMetadataError"]],["impl !RefUnwindSafe for Input",1,["songbird::input::Input"]],["impl !RefUnwindSafe for LiveInput",1,["songbird::input::live_input::LiveInput"]],["impl !RefUnwindSafe for MakePlayableError",1,["songbird::input::error::MakePlayableError"]],["impl !RefUnwindSafe for Shard",1,["songbird::shards::Shard"]],["impl !RefUnwindSafe for Sharder",1,["songbird::shards::Sharder"]],["impl !RefUnwindSafe for ControlError",1,["songbird::tracks::error::ControlError"]],["impl !RefUnwindSafe for PlayError",1,["songbird::tracks::error::PlayError"]],["impl !RefUnwindSafe for PlayMode",1,["songbird::tracks::mode::PlayMode"]],["impl !RefUnwindSafe for Connect",1,["songbird::driver::Connect"]],["impl !RefUnwindSafe for Driver",1,["songbird::driver::Driver"]],["impl !RefUnwindSafe for EventData",1,["songbird::events::data::EventData"]],["impl !RefUnwindSafe for EventStore",1,["songbird::events::store::EventStore"]],["impl !RefUnwindSafe for Compressed",1,["songbird::input::adapters::cached::compressed::Compressed"]],["impl !RefUnwindSafe for Decompressed",1,["songbird::input::adapters::cached::decompressed::Decompressed"]],["impl !RefUnwindSafe for Memory",1,["songbird::input::adapters::cached::memory::Memory"]],["impl !RefUnwindSafe for DcaReader",1,["songbird::input::codecs::dca::DcaReader"]],["impl !RefUnwindSafe for RawReader",1,["songbird::input::codecs::raw::RawReader"]],["impl !RefUnwindSafe for AsyncAdapterStream",1,["songbird::input::adapters::async_adapter::AsyncAdapterStream"]],["impl !RefUnwindSafe for AsyncReadOnlySource",1,["songbird::input::sources::AsyncReadOnlySource"]],["impl !RefUnwindSafe for HlsRequest",1,["songbird::input::sources::hls::HlsRequest"]],["impl !RefUnwindSafe for HttpRequest",1,["songbird::input::sources::http::HttpRequest"]],["impl !RefUnwindSafe for Parsed",1,["songbird::input::parsed::Parsed"]],["impl !RefUnwindSafe for Join",1,["songbird::join::Join"]],["impl !RefUnwindSafe for JoinGateway",1,["songbird::join::JoinGateway"]],["impl !RefUnwindSafe for SerenityShardHandle",1,["songbird::shards::SerenityShardHandle"]],["impl !RefUnwindSafe for SerenitySharder",1,["songbird::shards::SerenitySharder"]],["impl !RefUnwindSafe for Call",1,["songbird::handler::Call"]],["impl !RefUnwindSafe for Songbird",1,["songbird::manager::Songbird"]],["impl !RefUnwindSafe for Queued",1,["songbird::tracks::queue::Queued"]],["impl !RefUnwindSafe for Track",1,["songbird::tracks::Track"]],["impl !RefUnwindSafe for TrackHandle",1,["songbird::tracks::handle::TrackHandle"]],["impl !RefUnwindSafe for TrackQueue",1,["songbird::tracks::queue::TrackQueue"]],["impl !RefUnwindSafe for TrackState",1,["songbird::tracks::state::TrackState"]],["impl RefUnwindSafe for Channels",1,["songbird::driver::decode_mode::Channels"]],["impl RefUnwindSafe for CryptoMode",1,["songbird::driver::crypto::CryptoMode"]],["impl RefUnwindSafe for DecodeMode",1,["songbird::driver::decode_mode::DecodeMode"]],["impl RefUnwindSafe for MixMode",1,["songbird::driver::mix_mode::MixMode"]],["impl RefUnwindSafe for SampleRate",1,["songbird::driver::decode_mode::SampleRate"]],["impl RefUnwindSafe for Error",1,["songbird::driver::scheduler::Error"]],["impl RefUnwindSafe for Mode",1,["songbird::driver::scheduler::config::Mode"]],["impl RefUnwindSafe for Strategy",1,["songbird::driver::retry::strategy::Strategy"]],["impl RefUnwindSafe for DisconnectKind",1,["songbird::events::context::data::disconnect::DisconnectKind"]],["impl RefUnwindSafe for DisconnectReason",1,["songbird::events::context::data::disconnect::DisconnectReason"]],["impl RefUnwindSafe for CoreEvent",1,["songbird::events::core::CoreEvent"]],["impl RefUnwindSafe for Event",1,["songbird::events::Event"]],["impl RefUnwindSafe for TrackEvent",1,["songbird::events::track::TrackEvent"]],["impl RefUnwindSafe for UntimedEvent",1,["songbird::events::untimed::UntimedEvent"]],["impl RefUnwindSafe for LengthHint",1,["songbird::input::adapters::cached::hint::LengthHint"]],["impl RefUnwindSafe for MetadataError",1,["songbird::input::error::MetadataError"]],["impl RefUnwindSafe for LoopState",1,["songbird::tracks::looping::LoopState"]],["impl RefUnwindSafe for ReadyState",1,["songbird::tracks::ready::ReadyState"]],["impl RefUnwindSafe for ExponentialBackoff",1,["songbird::driver::retry::strategy::ExponentialBackoff"]],["impl RefUnwindSafe for Retry",1,["songbird::driver::retry::Retry"]],["impl RefUnwindSafe for DecodeConfig",1,["songbird::driver::decode_mode::DecodeConfig"]],["impl RefUnwindSafe for DisposalThread",1,["songbird::driver::tasks::disposal::DisposalThread"]],["impl RefUnwindSafe for LiveStatBlock",1,["songbird::driver::scheduler::stats::LiveStatBlock"]],["impl RefUnwindSafe for Scheduler",1,["songbird::driver::scheduler::Scheduler"]],["impl RefUnwindSafe for Config",1,["songbird::driver::scheduler::config::Config"]],["impl RefUnwindSafe for RtcpData",1,["songbird::events::context::data::rtcp::RtcpData"]],["impl RefUnwindSafe for RtpData",1,["songbird::events::context::data::rtp::RtpData"]],["impl RefUnwindSafe for VoiceData",1,["songbird::events::context::data::voice::VoiceData"]],["impl RefUnwindSafe for VoiceTick",1,["songbird::events::context::data::voice::VoiceTick"]],["impl RefUnwindSafe for ChannelId",1,["songbird::id::ChannelId"]],["impl RefUnwindSafe for GuildId",1,["songbird::id::GuildId"]],["impl RefUnwindSafe for UserId",1,["songbird::id::UserId"]],["impl RefUnwindSafe for Config",1,["songbird::input::adapters::cached::compressed::Config"]],["impl RefUnwindSafe for OpusCompressor",1,["songbird::input::adapters::cached::compressed::OpusCompressor"]],["impl RefUnwindSafe for OpusDecoder",1,["songbird::input::codecs::opus::OpusDecoder"]],["impl RefUnwindSafe for AuxMetadata",1,["songbird::input::metadata::AuxMetadata"]],["impl RefUnwindSafe for ChildContainer",1,["songbird::input::adapters::child::ChildContainer"]],["impl RefUnwindSafe for SongbirdKey",1,["songbird::serenity::SongbirdKey"]],["impl RefUnwindSafe for TwilightMap",1,["songbird::shards::TwilightMap"]],["impl RefUnwindSafe for Config",1,["songbird::config::Config"]],["impl RefUnwindSafe for ConnectionInfo",1,["songbird::info::ConnectionInfo"]],["impl RefUnwindSafe for Action",1,["songbird::tracks::action::Action"]],["impl<'a> !RefUnwindSafe for EventContext<'a>",1,["songbird::events::context::EventContext"]],["impl<'a> !RefUnwindSafe for YoutubeDl<'a>",1,["songbird::input::sources::ytdl::YoutubeDl"]],["impl<'a> !RefUnwindSafe for Iter<'a>",1,["songbird::manager::Iter"]],["impl<'a> !RefUnwindSafe for View<'a>",1,["songbird::tracks::view::View"]],["impl<'a> RefUnwindSafe for ConnectData<'a>",1,["songbird::events::context::data::connect::ConnectData"]],["impl<'a> RefUnwindSafe for DisconnectData<'a>",1,["songbird::events::context::data::disconnect::DisconnectData"]],["impl<'a> RefUnwindSafe for Metadata<'a>",1,["songbird::input::metadata::Metadata"]],["impl<A> RefUnwindSafe for RawAdapter<A>
where\n A: RefUnwindSafe,
",1,["songbird::input::adapters::raw_adapter::RawAdapter"]],["impl<P> RefUnwindSafe for File<P>
where\n P: RefUnwindSafe,
",1,["songbird::input::sources::file::File"]],["impl<T> RefUnwindSafe for AudioStream<T>
where\n T: RefUnwindSafe,
",1,["songbird::input::audiostream::AudioStream"]],["impl<T> RefUnwindSafe for TrackCallback<T>",1,["songbird::tracks::handle::TrackCallback"]]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[35142]} \ No newline at end of file diff --git a/next/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js b/next/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js new file mode 100644 index 0000000..3d43fd9 --- /dev/null +++ b/next/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl !UnwindSafe for Error",1,["songbird::driver::connection::error::Error"]],["impl !UnwindSafe for JoinError",1,["songbird::error::JoinError"]],["impl !UnwindSafe for CodecCacheError",1,["songbird::input::adapters::cached::error::CodecCacheError"]],["impl !UnwindSafe for Error",1,["songbird::input::adapters::cached::error::Error"]],["impl !UnwindSafe for AudioStreamError",1,["songbird::input::error::AudioStreamError"]],["impl !UnwindSafe for AuxMetadataError",1,["songbird::input::error::AuxMetadataError"]],["impl !UnwindSafe for Input",1,["songbird::input::Input"]],["impl !UnwindSafe for LiveInput",1,["songbird::input::live_input::LiveInput"]],["impl !UnwindSafe for MakePlayableError",1,["songbird::input::error::MakePlayableError"]],["impl !UnwindSafe for Shard",1,["songbird::shards::Shard"]],["impl !UnwindSafe for Sharder",1,["songbird::shards::Sharder"]],["impl !UnwindSafe for ControlError",1,["songbird::tracks::error::ControlError"]],["impl !UnwindSafe for PlayError",1,["songbird::tracks::error::PlayError"]],["impl !UnwindSafe for PlayMode",1,["songbird::tracks::mode::PlayMode"]],["impl !UnwindSafe for Connect",1,["songbird::driver::Connect"]],["impl !UnwindSafe for Driver",1,["songbird::driver::Driver"]],["impl !UnwindSafe for EventData",1,["songbird::events::data::EventData"]],["impl !UnwindSafe for EventStore",1,["songbird::events::store::EventStore"]],["impl !UnwindSafe for Compressed",1,["songbird::input::adapters::cached::compressed::Compressed"]],["impl !UnwindSafe for Decompressed",1,["songbird::input::adapters::cached::decompressed::Decompressed"]],["impl !UnwindSafe for Memory",1,["songbird::input::adapters::cached::memory::Memory"]],["impl !UnwindSafe for DcaReader",1,["songbird::input::codecs::dca::DcaReader"]],["impl !UnwindSafe for RawReader",1,["songbird::input::codecs::raw::RawReader"]],["impl !UnwindSafe for AsyncReadOnlySource",1,["songbird::input::sources::AsyncReadOnlySource"]],["impl !UnwindSafe for HlsRequest",1,["songbird::input::sources::hls::HlsRequest"]],["impl !UnwindSafe for HttpRequest",1,["songbird::input::sources::http::HttpRequest"]],["impl !UnwindSafe for Parsed",1,["songbird::input::parsed::Parsed"]],["impl !UnwindSafe for Join",1,["songbird::join::Join"]],["impl !UnwindSafe for JoinGateway",1,["songbird::join::JoinGateway"]],["impl !UnwindSafe for SerenityShardHandle",1,["songbird::shards::SerenityShardHandle"]],["impl !UnwindSafe for SerenitySharder",1,["songbird::shards::SerenitySharder"]],["impl !UnwindSafe for Call",1,["songbird::handler::Call"]],["impl !UnwindSafe for Songbird",1,["songbird::manager::Songbird"]],["impl !UnwindSafe for Queued",1,["songbird::tracks::queue::Queued"]],["impl !UnwindSafe for Track",1,["songbird::tracks::Track"]],["impl !UnwindSafe for TrackHandle",1,["songbird::tracks::handle::TrackHandle"]],["impl !UnwindSafe for TrackQueue",1,["songbird::tracks::queue::TrackQueue"]],["impl !UnwindSafe for TrackState",1,["songbird::tracks::state::TrackState"]],["impl UnwindSafe for Channels",1,["songbird::driver::decode_mode::Channels"]],["impl UnwindSafe for CryptoMode",1,["songbird::driver::crypto::CryptoMode"]],["impl UnwindSafe for DecodeMode",1,["songbird::driver::decode_mode::DecodeMode"]],["impl UnwindSafe for MixMode",1,["songbird::driver::mix_mode::MixMode"]],["impl UnwindSafe for SampleRate",1,["songbird::driver::decode_mode::SampleRate"]],["impl UnwindSafe for Error",1,["songbird::driver::scheduler::Error"]],["impl UnwindSafe for Mode",1,["songbird::driver::scheduler::config::Mode"]],["impl UnwindSafe for Strategy",1,["songbird::driver::retry::strategy::Strategy"]],["impl UnwindSafe for DisconnectKind",1,["songbird::events::context::data::disconnect::DisconnectKind"]],["impl UnwindSafe for DisconnectReason",1,["songbird::events::context::data::disconnect::DisconnectReason"]],["impl UnwindSafe for CoreEvent",1,["songbird::events::core::CoreEvent"]],["impl UnwindSafe for Event",1,["songbird::events::Event"]],["impl UnwindSafe for TrackEvent",1,["songbird::events::track::TrackEvent"]],["impl UnwindSafe for UntimedEvent",1,["songbird::events::untimed::UntimedEvent"]],["impl UnwindSafe for LengthHint",1,["songbird::input::adapters::cached::hint::LengthHint"]],["impl UnwindSafe for MetadataError",1,["songbird::input::error::MetadataError"]],["impl UnwindSafe for LoopState",1,["songbird::tracks::looping::LoopState"]],["impl UnwindSafe for ReadyState",1,["songbird::tracks::ready::ReadyState"]],["impl UnwindSafe for ExponentialBackoff",1,["songbird::driver::retry::strategy::ExponentialBackoff"]],["impl UnwindSafe for Retry",1,["songbird::driver::retry::Retry"]],["impl UnwindSafe for DecodeConfig",1,["songbird::driver::decode_mode::DecodeConfig"]],["impl UnwindSafe for DisposalThread",1,["songbird::driver::tasks::disposal::DisposalThread"]],["impl UnwindSafe for LiveStatBlock",1,["songbird::driver::scheduler::stats::LiveStatBlock"]],["impl UnwindSafe for Scheduler",1,["songbird::driver::scheduler::Scheduler"]],["impl UnwindSafe for Config",1,["songbird::driver::scheduler::config::Config"]],["impl UnwindSafe for RtcpData",1,["songbird::events::context::data::rtcp::RtcpData"]],["impl UnwindSafe for RtpData",1,["songbird::events::context::data::rtp::RtpData"]],["impl UnwindSafe for VoiceData",1,["songbird::events::context::data::voice::VoiceData"]],["impl UnwindSafe for VoiceTick",1,["songbird::events::context::data::voice::VoiceTick"]],["impl UnwindSafe for ChannelId",1,["songbird::id::ChannelId"]],["impl UnwindSafe for GuildId",1,["songbird::id::GuildId"]],["impl UnwindSafe for UserId",1,["songbird::id::UserId"]],["impl UnwindSafe for Config",1,["songbird::input::adapters::cached::compressed::Config"]],["impl UnwindSafe for OpusCompressor",1,["songbird::input::adapters::cached::compressed::OpusCompressor"]],["impl UnwindSafe for OpusDecoder",1,["songbird::input::codecs::opus::OpusDecoder"]],["impl UnwindSafe for AsyncAdapterStream",1,["songbird::input::adapters::async_adapter::AsyncAdapterStream"]],["impl UnwindSafe for AuxMetadata",1,["songbird::input::metadata::AuxMetadata"]],["impl UnwindSafe for ChildContainer",1,["songbird::input::adapters::child::ChildContainer"]],["impl UnwindSafe for SongbirdKey",1,["songbird::serenity::SongbirdKey"]],["impl UnwindSafe for TwilightMap",1,["songbird::shards::TwilightMap"]],["impl UnwindSafe for Config",1,["songbird::config::Config"]],["impl UnwindSafe for ConnectionInfo",1,["songbird::info::ConnectionInfo"]],["impl UnwindSafe for Action",1,["songbird::tracks::action::Action"]],["impl<'a> !UnwindSafe for EventContext<'a>",1,["songbird::events::context::EventContext"]],["impl<'a> !UnwindSafe for Metadata<'a>",1,["songbird::input::metadata::Metadata"]],["impl<'a> !UnwindSafe for YoutubeDl<'a>",1,["songbird::input::sources::ytdl::YoutubeDl"]],["impl<'a> !UnwindSafe for Iter<'a>",1,["songbird::manager::Iter"]],["impl<'a> !UnwindSafe for View<'a>",1,["songbird::tracks::view::View"]],["impl<'a> UnwindSafe for ConnectData<'a>",1,["songbird::events::context::data::connect::ConnectData"]],["impl<'a> UnwindSafe for DisconnectData<'a>",1,["songbird::events::context::data::disconnect::DisconnectData"]],["impl<A> UnwindSafe for RawAdapter<A>
where\n A: UnwindSafe,
",1,["songbird::input::adapters::raw_adapter::RawAdapter"]],["impl<P> UnwindSafe for File<P>
where\n P: UnwindSafe,
",1,["songbird::input::sources::file::File"]],["impl<T> UnwindSafe for AudioStream<T>
where\n T: UnwindSafe,
",1,["songbird::input::audiostream::AudioStream"]],["impl<T> UnwindSafe for TrackCallback<T>",1,["songbird::tracks::handle::TrackCallback"]]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[34287]} \ No newline at end of file diff --git a/next/trait.impl/core/str/traits/trait.FromStr.js b/next/trait.impl/core/str/traits/trait.FromStr.js new file mode 100644 index 0000000..3e23fc9 --- /dev/null +++ b/next/trait.impl/core/str/traits/trait.FromStr.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl FromStr for CryptoMode"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[302]} \ No newline at end of file diff --git a/next/trait.impl/serenity/gateway/bridge/voice/trait.VoiceGatewayManager.js b/next/trait.impl/serenity/gateway/bridge/voice/trait.VoiceGatewayManager.js new file mode 100644 index 0000000..d03c652 --- /dev/null +++ b/next/trait.impl/serenity/gateway/bridge/voice/trait.VoiceGatewayManager.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl VoiceGatewayManager for Songbird"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[345]} \ No newline at end of file diff --git a/next/trait.impl/songbird/input/adapters/async_adapter/trait.AsyncMediaSource.js b/next/trait.impl/songbird/input/adapters/async_adapter/trait.AsyncMediaSource.js new file mode 100644 index 0000000..fb5c627 --- /dev/null +++ b/next/trait.impl/songbird/input/adapters/async_adapter/trait.AsyncMediaSource.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[15]} \ No newline at end of file diff --git a/next/trait.impl/songbird/input/compose/trait.Compose.js b/next/trait.impl/songbird/input/compose/trait.Compose.js new file mode 100644 index 0000000..fb5c627 --- /dev/null +++ b/next/trait.impl/songbird/input/compose/trait.Compose.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[15]} \ No newline at end of file diff --git a/next/trait.impl/songbird/serenity/trait.SerenityInit.js b/next/trait.impl/songbird/serenity/trait.SerenityInit.js new file mode 100644 index 0000000..fb5c627 --- /dev/null +++ b/next/trait.impl/songbird/serenity/trait.SerenityInit.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[15]} \ No newline at end of file diff --git a/next/trait.impl/songbird/shards/trait.VoiceUpdate.js b/next/trait.impl/songbird/shards/trait.VoiceUpdate.js new file mode 100644 index 0000000..fb5c627 --- /dev/null +++ b/next/trait.impl/songbird/shards/trait.VoiceUpdate.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[15]} \ No newline at end of file diff --git a/next/trait.impl/std/io/trait.Read.js b/next/trait.impl/std/io/trait.Read.js new file mode 100644 index 0000000..c0f5757 --- /dev/null +++ b/next/trait.impl/std/io/trait.Read.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl Read for Compressed"],["impl Read for Decompressed"],["impl Read for Memory"],["impl Read for AsyncAdapterStream"],["impl Read for ChildContainer"],["impl<A: MediaSource> Read for RawAdapter<A>"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[1704]} \ No newline at end of file diff --git a/next/trait.impl/std/io/trait.Seek.js b/next/trait.impl/std/io/trait.Seek.js new file mode 100644 index 0000000..7cc3287 --- /dev/null +++ b/next/trait.impl/std/io/trait.Seek.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl Seek for Compressed"],["impl Seek for Decompressed"],["impl Seek for Memory"],["impl Seek for AsyncAdapterStream"],["impl<A: MediaSource> Seek for RawAdapter<A>"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[1428]} \ No newline at end of file diff --git a/next/trait.impl/streamcatcher/standard/trait.NeedsBytes.js b/next/trait.impl/streamcatcher/standard/trait.NeedsBytes.js new file mode 100644 index 0000000..2105660 --- /dev/null +++ b/next/trait.impl/streamcatcher/standard/trait.NeedsBytes.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl NeedsBytes for OpusCompressor"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[192]} \ No newline at end of file diff --git a/next/trait.impl/streamcatcher/standard/trait.Transform.js b/next/trait.impl/streamcatcher/standard/trait.Transform.js new file mode 100644 index 0000000..4fb7cfa --- /dev/null +++ b/next/trait.impl/streamcatcher/standard/trait.Transform.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl<T> Transform<T> for OpusCompressor
where\n T: Read,
"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[374]} \ No newline at end of file diff --git a/next/trait.impl/streamcatcher/state/trait.Stateful.js b/next/trait.impl/streamcatcher/state/trait.Stateful.js new file mode 100644 index 0000000..c0228e9 --- /dev/null +++ b/next/trait.impl/streamcatcher/state/trait.Stateful.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl Stateful for OpusCompressor"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[190]} \ No newline at end of file diff --git a/next/trait.impl/symphonia_core/codecs/trait.Decoder.js b/next/trait.impl/symphonia_core/codecs/trait.Decoder.js new file mode 100644 index 0000000..1c4f083 --- /dev/null +++ b/next/trait.impl/symphonia_core/codecs/trait.Decoder.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl Decoder for OpusDecoder"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[180]} \ No newline at end of file diff --git a/next/trait.impl/symphonia_core/formats/trait.FormatReader.js b/next/trait.impl/symphonia_core/formats/trait.FormatReader.js new file mode 100644 index 0000000..96e3a8a --- /dev/null +++ b/next/trait.impl/symphonia_core/formats/trait.FormatReader.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl FormatReader for DcaReader"],["impl FormatReader for RawReader"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[344]} \ No newline at end of file diff --git a/next/trait.impl/symphonia_core/io/trait.MediaSource.js b/next/trait.impl/symphonia_core/io/trait.MediaSource.js new file mode 100644 index 0000000..3b36ebe --- /dev/null +++ b/next/trait.impl/symphonia_core/io/trait.MediaSource.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl MediaSource for Compressed"],["impl MediaSource for Decompressed"],["impl MediaSource for Memory"],["impl MediaSource for AsyncAdapterStream"],["impl<A: MediaSource> MediaSource for RawAdapter<A>"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[868]} \ No newline at end of file diff --git a/next/trait.impl/symphonia_core/probe/trait.QueryDescriptor.js b/next/trait.impl/symphonia_core/probe/trait.QueryDescriptor.js new file mode 100644 index 0000000..0d2c159 --- /dev/null +++ b/next/trait.impl/symphonia_core/probe/trait.QueryDescriptor.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl QueryDescriptor for DcaReader"],["impl QueryDescriptor for RawReader"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[350]} \ No newline at end of file diff --git a/next/trait.impl/tokio/io/async_read/trait.AsyncRead.js b/next/trait.impl/tokio/io/async_read/trait.AsyncRead.js new file mode 100644 index 0000000..91f8851 --- /dev/null +++ b/next/trait.impl/tokio/io/async_read/trait.AsyncRead.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl AsyncRead for AsyncReadOnlySource"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[191]} \ No newline at end of file diff --git a/next/trait.impl/tokio/io/async_seek/trait.AsyncSeek.js b/next/trait.impl/tokio/io/async_seek/trait.AsyncSeek.js new file mode 100644 index 0000000..c8dad79 --- /dev/null +++ b/next/trait.impl/tokio/io/async_seek/trait.AsyncSeek.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl AsyncSeek for AsyncReadOnlySource"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[191]} \ No newline at end of file diff --git a/next/trait.impl/typemap_rev/trait.TypeMapKey.js b/next/trait.impl/typemap_rev/trait.TypeMapKey.js new file mode 100644 index 0000000..69e4a32 --- /dev/null +++ b/next/trait.impl/typemap_rev/trait.TypeMapKey.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["songbird",[["impl TypeMapKey for SongbirdKey"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[174]} \ No newline at end of file diff --git a/next/type.impl/core/result/enum.Result.js b/next/type.impl/core/result/enum.Result.js new file mode 100644 index 0000000..59fdda1 --- /dev/null +++ b/next/type.impl/core/result/enum.Result.js @@ -0,0 +1,9 @@ +(function() { + var type_impls = Object.fromEntries([["songbird",[["
1.0.0 · Source§

impl<T, E> Clone for Result<T, E>
where\n T: Clone,\n E: Clone,

Source§

fn clone(&self) -> Result<T, E>

Returns a duplicate of the value. Read more
Source§

fn clone_from(&mut self, source: &Result<T, E>)

Performs copy-assignment from source. Read more
","Clone","songbird::driver::connection::error::Result","songbird::error::JoinResult","songbird::tracks::error::TrackResult"],["
1.0.0 · Source§

impl<T, E> Debug for Result<T, E>
where\n T: Debug,\n E: Debug,

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
","Debug","songbird::driver::connection::error::Result","songbird::error::JoinResult","songbird::tracks::error::TrackResult"],["
Source§

impl<'de, T, E> Deserialize<'de> for Result<T, E>
where\n T: Deserialize<'de>,\n E: Deserialize<'de>,

Source§

fn deserialize<D>(\n deserializer: D,\n) -> Result<Result<T, E>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
","Deserialize<'de>","songbird::driver::connection::error::Result","songbird::error::JoinResult","songbird::tracks::error::TrackResult"],["
Source§

impl<L, R> From<Either<L, R>> for Result<R, L>

Convert from Either to Result with Right => Ok and Left => Err.

\n
Source§

fn from(val: Either<L, R>) -> Result<R, L>

Converts to this type from the input type.
","From>","songbird::driver::connection::error::Result","songbird::error::JoinResult","songbird::tracks::error::TrackResult"],["
1.0.0 · Source§

impl<A, E, V> FromIterator<Result<A, E>> for Result<V, E>
where\n V: FromIterator<A>,

Source§

fn from_iter<I>(iter: I) -> Result<V, E>
where\n I: IntoIterator<Item = Result<A, E>>,

Takes each element in the Iterator: if it is an Err, no further\nelements are taken, and the Err is returned. Should no Err occur, a\ncontainer with the values of each Result is returned.

\n

Here is an example which increments every integer in a vector,\nchecking for overflow:

\n\n
let v = vec![1, 2];\nlet res: Result<Vec<u32>, &'static str> = v.iter().map(|x: &u32|\n    x.checked_add(1).ok_or(\"Overflow!\")\n).collect();\nassert_eq!(res, Ok(vec![2, 3]));
\n

Here is another example that tries to subtract one from another list\nof integers, this time checking for underflow:

\n\n
let v = vec![1, 2, 0];\nlet res: Result<Vec<u32>, &'static str> = v.iter().map(|x: &u32|\n    x.checked_sub(1).ok_or(\"Underflow!\")\n).collect();\nassert_eq!(res, Err(\"Underflow!\"));
\n

Here is a variation on the previous example, showing that no\nfurther elements are taken from iter after the first Err.

\n\n
let v = vec![3, 2, 1, 10];\nlet mut shared = 0;\nlet res: Result<Vec<u32>, &'static str> = v.iter().map(|x: &u32| {\n    shared += x;\n    x.checked_sub(2).ok_or(\"Underflow!\")\n}).collect();\nassert_eq!(res, Err(\"Underflow!\"));\nassert_eq!(shared, 6);
\n

Since the third element caused an underflow, no further elements were taken,\nso the final value of shared is 6 (= 3 + 2 + 1), not 16.

\n
","FromIterator>","songbird::driver::connection::error::Result","songbird::error::JoinResult","songbird::tracks::error::TrackResult"],["
Source§

impl<T, E, F> FromResidual<Result<Infallible, E>> for Result<T, F>
where\n F: From<E>,

Source§

fn from_residual(residual: Result<Infallible, E>) -> Result<T, F>

🔬This is a nightly-only experimental API. (try_trait_v2)
Constructs the type from a compatible Residual type. Read more
","FromResidual>","songbird::driver::connection::error::Result","songbird::error::JoinResult","songbird::tracks::error::TrackResult"],["
Source§

impl<T, E, F> FromResidual<Yeet<E>> for Result<T, F>
where\n F: From<E>,

Source§

fn from_residual(_: Yeet<E>) -> Result<T, F>

🔬This is a nightly-only experimental API. (try_trait_v2)
Constructs the type from a compatible Residual type. Read more
","FromResidual>","songbird::driver::connection::error::Result","songbird::error::JoinResult","songbird::tracks::error::TrackResult"],["
1.0.0 · Source§

impl<T, E> Hash for Result<T, E>
where\n T: Hash,\n E: Hash,

Source§

fn hash<__H>(&self, state: &mut __H)
where\n __H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where\n H: Hasher,\n Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
","Hash","songbird::driver::connection::error::Result","songbird::error::JoinResult","songbird::tracks::error::TrackResult"],["
1.0.0 · Source§

impl<T, E> IntoIterator for Result<T, E>

Source§

fn into_iter(self) -> IntoIter<T>

Returns a consuming iterator over the possibly contained value.

\n

The iterator yields one value if the result is Result::Ok, otherwise none.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(5);\nlet v: Vec<u32> = x.into_iter().collect();\nassert_eq!(v, [5]);\n\nlet x: Result<u32, &str> = Err(\"nothing!\");\nlet v: Vec<u32> = x.into_iter().collect();\nassert_eq!(v, []);
\n
Source§

type Item = T

The type of the elements being iterated over.
Source§

type IntoIter = IntoIter<T>

Which kind of iterator are we turning this into?
","IntoIterator","songbird::driver::connection::error::Result","songbird::error::JoinResult","songbird::tracks::error::TrackResult"],["
§

impl<T, E> NonBlockingResult for Result<T, E>
where\n E: NonBlockingError,

§

type Result = Result<Option<T>, E>

Type of the converted result: Result<Option<T>, E>
§

fn no_block(self) -> <Result<T, E> as NonBlockingResult>::Result

Perform the non-block conversion.
","NonBlockingResult","songbird::driver::connection::error::Result","songbird::error::JoinResult","songbird::tracks::error::TrackResult"],["
§

impl<T, E> NonBlockingResult for Result<T, E>
where\n E: NonBlockingError,

§

type Result = Result<Option<T>, E>

Type of the converted result: Result<Option<T>, E>
§

fn no_block(self) -> <Result<T, E> as NonBlockingResult>::Result

Perform the non-block conversion.
","NonBlockingResult","songbird::driver::connection::error::Result","songbird::error::JoinResult","songbird::tracks::error::TrackResult"],["
1.0.0 · Source§

impl<T, E> Ord for Result<T, E>
where\n T: Ord,\n E: Ord,

Source§

fn cmp(&self, other: &Result<T, E>) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where\n Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where\n Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where\n Self: Sized,

Restrict a value to a certain interval. Read more
","Ord","songbird::driver::connection::error::Result","songbird::error::JoinResult","songbird::tracks::error::TrackResult"],["
1.0.0 · Source§

impl<T, E> PartialEq for Result<T, E>
where\n T: PartialEq,\n E: PartialEq,

Source§

fn eq(&self, other: &Result<T, E>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient,\nand should not be overridden without very good reason.
","PartialEq","songbird::driver::connection::error::Result","songbird::error::JoinResult","songbird::tracks::error::TrackResult"],["
1.0.0 · Source§

impl<T, E> PartialOrd for Result<T, E>
where\n T: PartialOrd,\n E: PartialOrd,

Source§

fn partial_cmp(&self, other: &Result<T, E>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the\n<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the >\noperator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by\nthe >= operator. Read more
","PartialOrd","songbird::driver::connection::error::Result","songbird::error::JoinResult","songbird::tracks::error::TrackResult"],["
§

impl<B, E> Policy<B, E> for Result<Action, E>
where\n E: Clone,

§

fn redirect(&mut self, _: &Attempt<'_>) -> Result<Action, E>

Invoked when the service received a response with a redirection status code (3xx). Read more
§

fn on_request(&mut self, _request: &mut Request<B>)

Invoked right before the service makes a request, regardless of whether it is redirected\nor not. Read more
§

fn clone_body(&self, _body: &B) -> Option<B>

Try to clone a request body before the service makes a redirected request. Read more
","Policy","songbird::driver::connection::error::Result","songbird::error::JoinResult","songbird::tracks::error::TrackResult"],["
1.16.0 · Source§

impl<T, U, E> Product<Result<U, E>> for Result<T, E>
where\n T: Product<U>,

Source§

fn product<I>(iter: I) -> Result<T, E>
where\n I: Iterator<Item = Result<U, E>>,

Takes each element in the Iterator: if it is an Err, no further\nelements are taken, and the Err is returned. Should no Err\noccur, the product of all elements is returned.

\n
§Examples
\n

This multiplies each number in a vector of strings,\nif a string could not be parsed the operation returns Err:

\n\n
let nums = vec![\"5\", \"10\", \"1\", \"2\"];\nlet total: Result<usize, _> = nums.iter().map(|w| w.parse::<usize>()).product();\nassert_eq!(total, Ok(100));\nlet nums = vec![\"5\", \"10\", \"one\", \"2\"];\nlet total: Result<usize, _> = nums.iter().map(|w| w.parse::<usize>()).product();\nassert!(total.is_err());
\n
","Product>","songbird::driver::connection::error::Result","songbird::error::JoinResult","songbird::tracks::error::TrackResult"],["
Source§

impl<T, E> Residual<T> for Result<Infallible, E>

Source§

type TryType = Result<T, E>

🔬This is a nightly-only experimental API. (try_trait_v2_residual)
The “return” type of this meta-function.
","Residual","songbird::driver::connection::error::Result","songbird::error::JoinResult","songbird::tracks::error::TrackResult"],["
Source§

impl<T, E> Result<&T, E>

1.59.0 (const: 1.83.0) · Source

pub const fn copied(self) -> Result<T, E>
where\n T: Copy,

Maps a Result<&T, E> to a Result<T, E> by copying the contents of the\nOk part.

\n
§Examples
\n
let val = 12;\nlet x: Result<&i32, i32> = Ok(&val);\nassert_eq!(x, Ok(&12));\nlet copied = x.copied();\nassert_eq!(copied, Ok(12));
\n
1.59.0 · Source

pub fn cloned(self) -> Result<T, E>
where\n T: Clone,

Maps a Result<&T, E> to a Result<T, E> by cloning the contents of the\nOk part.

\n
§Examples
\n
let val = 12;\nlet x: Result<&i32, i32> = Ok(&val);\nassert_eq!(x, Ok(&12));\nlet cloned = x.cloned();\nassert_eq!(cloned, Ok(12));
\n
",0,"songbird::driver::connection::error::Result","songbird::error::JoinResult","songbird::tracks::error::TrackResult"],["
Source§

impl<T, E> Result<&mut T, E>

1.59.0 (const: 1.83.0) · Source

pub const fn copied(self) -> Result<T, E>
where\n T: Copy,

Maps a Result<&mut T, E> to a Result<T, E> by copying the contents of the\nOk part.

\n
§Examples
\n
let mut val = 12;\nlet x: Result<&mut i32, i32> = Ok(&mut val);\nassert_eq!(x, Ok(&mut 12));\nlet copied = x.copied();\nassert_eq!(copied, Ok(12));
\n
1.59.0 · Source

pub fn cloned(self) -> Result<T, E>
where\n T: Clone,

Maps a Result<&mut T, E> to a Result<T, E> by cloning the contents of the\nOk part.

\n
§Examples
\n
let mut val = 12;\nlet x: Result<&mut i32, i32> = Ok(&mut val);\nassert_eq!(x, Ok(&mut 12));\nlet cloned = x.cloned();\nassert_eq!(cloned, Ok(12));
\n
",0,"songbird::driver::connection::error::Result","songbird::error::JoinResult","songbird::tracks::error::TrackResult"],["
Source§

impl<T, E> Result<Option<T>, E>

1.33.0 (const: 1.83.0) · Source

pub const fn transpose(self) -> Option<Result<T, E>>

Transposes a Result of an Option into an Option of a Result.

\n

Ok(None) will be mapped to None.\nOk(Some(_)) and Err(_) will be mapped to Some(Ok(_)) and Some(Err(_)).

\n
§Examples
\n
#[derive(Debug, Eq, PartialEq)]\nstruct SomeErr;\n\nlet x: Result<Option<i32>, SomeErr> = Ok(Some(5));\nlet y: Option<Result<i32, SomeErr>> = Some(Ok(5));\nassert_eq!(x.transpose(), y);
\n
",0,"songbird::driver::connection::error::Result","songbird::error::JoinResult","songbird::tracks::error::TrackResult"],["
Source§

impl<T, E> Result<Result<T, E>, E>

1.89.0 (const: 1.89.0) · Source

pub const fn flatten(self) -> Result<T, E>

Converts from Result<Result<T, E>, E> to Result<T, E>

\n
§Examples
\n
let x: Result<Result<&'static str, u32>, u32> = Ok(Ok(\"hello\"));\nassert_eq!(Ok(\"hello\"), x.flatten());\n\nlet x: Result<Result<&'static str, u32>, u32> = Ok(Err(6));\nassert_eq!(Err(6), x.flatten());\n\nlet x: Result<Result<&'static str, u32>, u32> = Err(6);\nassert_eq!(Err(6), x.flatten());
\n

Flattening only removes one level of nesting at a time:

\n\n
let x: Result<Result<Result<&'static str, u32>, u32>, u32> = Ok(Ok(Ok(\"hello\")));\nassert_eq!(Ok(Ok(\"hello\")), x.flatten());\nassert_eq!(Ok(\"hello\"), x.flatten().flatten());
\n
",0,"songbird::driver::connection::error::Result","songbird::error::JoinResult","songbird::tracks::error::TrackResult"],["
Source§

impl<T, E> Result<T, E>

1.0.0 (const: 1.48.0) · Source

pub const fn is_ok(&self) -> bool

Returns true if the result is Ok.

\n
§Examples
\n
let x: Result<i32, &str> = Ok(-3);\nassert_eq!(x.is_ok(), true);\n\nlet x: Result<i32, &str> = Err(\"Some error message\");\nassert_eq!(x.is_ok(), false);
\n
1.70.0 (const: unstable) · Source

pub fn is_ok_and<F>(self, f: F) -> bool
where\n F: FnOnce(T) -> bool,

Returns true if the result is Ok and the value inside of it matches a predicate.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(x.is_ok_and(|x| x > 1), true);\n\nlet x: Result<u32, &str> = Ok(0);\nassert_eq!(x.is_ok_and(|x| x > 1), false);\n\nlet x: Result<u32, &str> = Err(\"hey\");\nassert_eq!(x.is_ok_and(|x| x > 1), false);\n\nlet x: Result<String, &str> = Ok(\"ownership\".to_string());\nassert_eq!(x.as_ref().is_ok_and(|x| x.len() > 1), true);\nprintln!(\"still alive {:?}\", x);
\n
1.0.0 (const: 1.48.0) · Source

pub const fn is_err(&self) -> bool

Returns true if the result is Err.

\n
§Examples
\n
let x: Result<i32, &str> = Ok(-3);\nassert_eq!(x.is_err(), false);\n\nlet x: Result<i32, &str> = Err(\"Some error message\");\nassert_eq!(x.is_err(), true);
\n
1.70.0 (const: unstable) · Source

pub fn is_err_and<F>(self, f: F) -> bool
where\n F: FnOnce(E) -> bool,

Returns true if the result is Err and the value inside of it matches a predicate.

\n
§Examples
\n
use std::io::{Error, ErrorKind};\n\nlet x: Result<u32, Error> = Err(Error::new(ErrorKind::NotFound, \"!\"));\nassert_eq!(x.is_err_and(|x| x.kind() == ErrorKind::NotFound), true);\n\nlet x: Result<u32, Error> = Err(Error::new(ErrorKind::PermissionDenied, \"!\"));\nassert_eq!(x.is_err_and(|x| x.kind() == ErrorKind::NotFound), false);\n\nlet x: Result<u32, Error> = Ok(123);\nassert_eq!(x.is_err_and(|x| x.kind() == ErrorKind::NotFound), false);\n\nlet x: Result<u32, String> = Err(\"ownership\".to_string());\nassert_eq!(x.as_ref().is_err_and(|x| x.len() > 1), true);\nprintln!(\"still alive {:?}\", x);
\n
1.0.0 (const: unstable) · Source

pub fn ok(self) -> Option<T>

Converts from Result<T, E> to Option<T>.

\n

Converts self into an Option<T>, consuming self,\nand discarding the error, if any.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(x.ok(), Some(2));\n\nlet x: Result<u32, &str> = Err(\"Nothing here\");\nassert_eq!(x.ok(), None);
\n
1.0.0 (const: unstable) · Source

pub fn err(self) -> Option<E>

Converts from Result<T, E> to Option<E>.

\n

Converts self into an Option<E>, consuming self,\nand discarding the success value, if any.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(x.err(), None);\n\nlet x: Result<u32, &str> = Err(\"Nothing here\");\nassert_eq!(x.err(), Some(\"Nothing here\"));
\n
1.0.0 (const: 1.48.0) · Source

pub const fn as_ref(&self) -> Result<&T, &E>

Converts from &Result<T, E> to Result<&T, &E>.

\n

Produces a new Result, containing a reference\ninto the original, leaving the original in place.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(x.as_ref(), Ok(&2));\n\nlet x: Result<u32, &str> = Err(\"Error\");\nassert_eq!(x.as_ref(), Err(&\"Error\"));
\n
1.0.0 (const: 1.83.0) · Source

pub const fn as_mut(&mut self) -> Result<&mut T, &mut E>

Converts from &mut Result<T, E> to Result<&mut T, &mut E>.

\n
§Examples
\n
fn mutate(r: &mut Result<i32, i32>) {\n    match r.as_mut() {\n        Ok(v) => *v = 42,\n        Err(e) => *e = 0,\n    }\n}\n\nlet mut x: Result<i32, i32> = Ok(2);\nmutate(&mut x);\nassert_eq!(x.unwrap(), 42);\n\nlet mut x: Result<i32, i32> = Err(13);\nmutate(&mut x);\nassert_eq!(x.unwrap_err(), 0);
\n
1.0.0 (const: unstable) · Source

pub fn map<U, F>(self, op: F) -> Result<U, E>
where\n F: FnOnce(T) -> U,

Maps a Result<T, E> to Result<U, E> by applying a function to a\ncontained Ok value, leaving an Err value untouched.

\n

This function can be used to compose the results of two functions.

\n
§Examples
\n

Print the numbers on each line of a string multiplied by two.

\n\n
let line = \"1\\n2\\n3\\n4\\n\";\n\nfor num in line.lines() {\n    match num.parse::<i32>().map(|i| i * 2) {\n        Ok(n) => println!(\"{n}\"),\n        Err(..) => {}\n    }\n}
\n
1.41.0 (const: unstable) · Source

pub fn map_or<U, F>(self, default: U, f: F) -> U
where\n F: FnOnce(T) -> U,

Returns the provided default (if Err), or\napplies a function to the contained value (if Ok).

\n

Arguments passed to map_or are eagerly evaluated; if you are passing\nthe result of a function call, it is recommended to use map_or_else,\nwhich is lazily evaluated.

\n
§Examples
\n
let x: Result<_, &str> = Ok(\"foo\");\nassert_eq!(x.map_or(42, |v| v.len()), 3);\n\nlet x: Result<&str, _> = Err(\"bar\");\nassert_eq!(x.map_or(42, |v| v.len()), 42);
\n
1.41.0 (const: unstable) · Source

pub fn map_or_else<U, D, F>(self, default: D, f: F) -> U
where\n D: FnOnce(E) -> U,\n F: FnOnce(T) -> U,

Maps a Result<T, E> to U by applying fallback function default to\na contained Err value, or function f to a contained Ok value.

\n

This function can be used to unpack a successful result\nwhile handling an error.

\n
§Examples
\n
let k = 21;\n\nlet x : Result<_, &str> = Ok(\"foo\");\nassert_eq!(x.map_or_else(|e| k * 2, |v| v.len()), 3);\n\nlet x : Result<&str, _> = Err(\"bar\");\nassert_eq!(x.map_or_else(|e| k * 2, |v| v.len()), 42);
\n
Source

pub const fn map_or_default<U, F>(self, f: F) -> U
where\n F: FnOnce(T) -> U,\n U: Default,

🔬This is a nightly-only experimental API. (result_option_map_or_default)

Maps a Result<T, E> to a U by applying function f to the contained\nvalue if the result is Ok, otherwise if Err, returns the\ndefault value for the type U.

\n
§Examples
\n
#![feature(result_option_map_or_default)]\n\nlet x: Result<_, &str> = Ok(\"foo\");\nlet y: Result<&str, _> = Err(\"bar\");\n\nassert_eq!(x.map_or_default(|x| x.len()), 3);\nassert_eq!(y.map_or_default(|y| y.len()), 0);
\n
1.0.0 (const: unstable) · Source

pub fn map_err<F, O>(self, op: O) -> Result<T, F>
where\n O: FnOnce(E) -> F,

Maps a Result<T, E> to Result<T, F> by applying a function to a\ncontained Err value, leaving an Ok value untouched.

\n

This function can be used to pass through a successful result while handling\nan error.

\n
§Examples
\n
fn stringify(x: u32) -> String { format!(\"error code: {x}\") }\n\nlet x: Result<u32, u32> = Ok(2);\nassert_eq!(x.map_err(stringify), Ok(2));\n\nlet x: Result<u32, u32> = Err(13);\nassert_eq!(x.map_err(stringify), Err(\"error code: 13\".to_string()));
\n
1.76.0 (const: unstable) · Source

pub fn inspect<F>(self, f: F) -> Result<T, E>
where\n F: FnOnce(&T),

Calls a function with a reference to the contained value if Ok.

\n

Returns the original result.

\n
§Examples
\n
let x: u8 = \"4\"\n    .parse::<u8>()\n    .inspect(|x| println!(\"original: {x}\"))\n    .map(|x| x.pow(3))\n    .expect(\"failed to parse number\");
\n
1.76.0 (const: unstable) · Source

pub fn inspect_err<F>(self, f: F) -> Result<T, E>
where\n F: FnOnce(&E),

Calls a function with a reference to the contained value if Err.

\n

Returns the original result.

\n
§Examples
\n
use std::{fs, io};\n\nfn read() -> io::Result<String> {\n    fs::read_to_string(\"address.txt\")\n        .inspect_err(|e| eprintln!(\"failed to read file: {e}\"))\n}
\n
1.47.0 · Source

pub fn as_deref(&self) -> Result<&<T as Deref>::Target, &E>
where\n T: Deref,

Converts from Result<T, E> (or &Result<T, E>) to Result<&<T as Deref>::Target, &E>.

\n

Coerces the Ok variant of the original Result via Deref\nand returns the new Result.

\n
§Examples
\n
let x: Result<String, u32> = Ok(\"hello\".to_string());\nlet y: Result<&str, &u32> = Ok(\"hello\");\nassert_eq!(x.as_deref(), y);\n\nlet x: Result<String, u32> = Err(42);\nlet y: Result<&str, &u32> = Err(&42);\nassert_eq!(x.as_deref(), y);
\n
1.47.0 · Source

pub fn as_deref_mut(&mut self) -> Result<&mut <T as Deref>::Target, &mut E>
where\n T: DerefMut,

Converts from Result<T, E> (or &mut Result<T, E>) to Result<&mut <T as DerefMut>::Target, &mut E>.

\n

Coerces the Ok variant of the original Result via DerefMut\nand returns the new Result.

\n
§Examples
\n
let mut s = \"HELLO\".to_string();\nlet mut x: Result<String, u32> = Ok(\"hello\".to_string());\nlet y: Result<&mut str, &mut u32> = Ok(&mut s);\nassert_eq!(x.as_deref_mut().map(|x| { x.make_ascii_uppercase(); x }), y);\n\nlet mut i = 42;\nlet mut x: Result<String, u32> = Err(42);\nlet y: Result<&mut str, &mut u32> = Err(&mut i);\nassert_eq!(x.as_deref_mut().map(|x| { x.make_ascii_uppercase(); x }), y);
\n
1.0.0 (const: unstable) · Source

pub fn iter(&self) -> Iter<'_, T>

Returns an iterator over the possibly contained value.

\n

The iterator yields one value if the result is Result::Ok, otherwise none.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(7);\nassert_eq!(x.iter().next(), Some(&7));\n\nlet x: Result<u32, &str> = Err(\"nothing!\");\nassert_eq!(x.iter().next(), None);
\n
1.0.0 (const: unstable) · Source

pub fn iter_mut(&mut self) -> IterMut<'_, T>

Returns a mutable iterator over the possibly contained value.

\n

The iterator yields one value if the result is Result::Ok, otherwise none.

\n
§Examples
\n
let mut x: Result<u32, &str> = Ok(7);\nmatch x.iter_mut().next() {\n    Some(v) => *v = 40,\n    None => {},\n}\nassert_eq!(x, Ok(40));\n\nlet mut x: Result<u32, &str> = Err(\"nothing!\");\nassert_eq!(x.iter_mut().next(), None);
\n
1.4.0 · Source

pub fn expect(self, msg: &str) -> T
where\n E: Debug,

Returns the contained Ok value, consuming the self value.

\n

Because this function may panic, its use is generally discouraged.\nInstead, prefer to use pattern matching and handle the Err\ncase explicitly, or call unwrap_or, unwrap_or_else, or\nunwrap_or_default.

\n
§Panics
\n

Panics if the value is an Err, with a panic message including the\npassed message, and the content of the Err.

\n
§Examples
\n
let x: Result<u32, &str> = Err(\"emergency failure\");\nx.expect(\"Testing expect\"); // panics with `Testing expect: emergency failure`
\n
§Recommended Message Style
\n

We recommend that expect messages are used to describe the reason you\nexpect the Result should be Ok.

\n\n
let path = std::env::var(\"IMPORTANT_PATH\")\n    .expect(\"env variable `IMPORTANT_PATH` should be set by `wrapper_script.sh`\");
\n

Hint: If you’re having trouble remembering how to phrase expect\nerror messages remember to focus on the word “should” as in “env\nvariable should be set by blah” or “the given binary should be available\nand executable by the current user”.

\n

For more detail on expect message styles and the reasoning behind our recommendation please\nrefer to the section on “Common Message\nStyles” in the\nstd::error module docs.

\n
1.0.0 · Source

pub fn unwrap(self) -> T
where\n E: Debug,

Returns the contained Ok value, consuming the self value.

\n

Because this function may panic, its use is generally discouraged.\nPanics are meant for unrecoverable errors, and\nmay abort the entire program.

\n

Instead, prefer to use the ? (try) operator, or pattern matching\nto handle the Err case explicitly, or call unwrap_or,\nunwrap_or_else, or unwrap_or_default.

\n
§Panics
\n

Panics if the value is an Err, with a panic message provided by the\nErr’s value.

\n
§Examples
\n

Basic usage:

\n\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(x.unwrap(), 2);
\n\n
let x: Result<u32, &str> = Err(\"emergency failure\");\nx.unwrap(); // panics with `emergency failure`
\n
1.16.0 (const: unstable) · Source

pub fn unwrap_or_default(self) -> T
where\n T: Default,

Returns the contained Ok value or a default

\n

Consumes the self argument then, if Ok, returns the contained\nvalue, otherwise if Err, returns the default value for that\ntype.

\n
§Examples
\n

Converts a string to an integer, turning poorly-formed strings\ninto 0 (the default value for integers). parse converts\na string to any other type that implements FromStr, returning an\nErr on error.

\n\n
let good_year_from_input = \"1909\";\nlet bad_year_from_input = \"190blarg\";\nlet good_year = good_year_from_input.parse().unwrap_or_default();\nlet bad_year = bad_year_from_input.parse().unwrap_or_default();\n\nassert_eq!(1909, good_year);\nassert_eq!(0, bad_year);
\n
1.17.0 · Source

pub fn expect_err(self, msg: &str) -> E
where\n T: Debug,

Returns the contained Err value, consuming the self value.

\n
§Panics
\n

Panics if the value is an Ok, with a panic message including the\npassed message, and the content of the Ok.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(10);\nx.expect_err(\"Testing expect_err\"); // panics with `Testing expect_err: 10`
\n
1.0.0 · Source

pub fn unwrap_err(self) -> E
where\n T: Debug,

Returns the contained Err value, consuming the self value.

\n
§Panics
\n

Panics if the value is an Ok, with a custom panic message provided\nby the Ok’s value.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nx.unwrap_err(); // panics with `2`
\n\n
let x: Result<u32, &str> = Err(\"emergency failure\");\nassert_eq!(x.unwrap_err(), \"emergency failure\");
\n
Source

pub const fn into_ok(self) -> T
where\n E: Into<!>,

🔬This is a nightly-only experimental API. (unwrap_infallible)

Returns the contained Ok value, but never panics.

\n

Unlike unwrap, this method is known to never panic on the\nresult types it is implemented for. Therefore, it can be used\ninstead of unwrap as a maintainability safeguard that will fail\nto compile if the error type of the Result is later changed\nto an error that can actually occur.

\n
§Examples
\n
\nfn only_good_news() -> Result<String, !> {\n    Ok(\"this is fine\".into())\n}\n\nlet s: String = only_good_news().into_ok();\nprintln!(\"{s}\");
\n
Source

pub const fn into_err(self) -> E
where\n T: Into<!>,

🔬This is a nightly-only experimental API. (unwrap_infallible)

Returns the contained Err value, but never panics.

\n

Unlike unwrap_err, this method is known to never panic on the\nresult types it is implemented for. Therefore, it can be used\ninstead of unwrap_err as a maintainability safeguard that will fail\nto compile if the ok type of the Result is later changed\nto a type that can actually occur.

\n
§Examples
\n
\nfn only_bad_news() -> Result<!, String> {\n    Err(\"Oops, it failed\".into())\n}\n\nlet error: String = only_bad_news().into_err();\nprintln!(\"{error}\");
\n
1.0.0 (const: unstable) · Source

pub fn and<U>(self, res: Result<U, E>) -> Result<U, E>

Returns res if the result is Ok, otherwise returns the Err value of self.

\n

Arguments passed to and are eagerly evaluated; if you are passing the\nresult of a function call, it is recommended to use and_then, which is\nlazily evaluated.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nlet y: Result<&str, &str> = Err(\"late error\");\nassert_eq!(x.and(y), Err(\"late error\"));\n\nlet x: Result<u32, &str> = Err(\"early error\");\nlet y: Result<&str, &str> = Ok(\"foo\");\nassert_eq!(x.and(y), Err(\"early error\"));\n\nlet x: Result<u32, &str> = Err(\"not a 2\");\nlet y: Result<&str, &str> = Err(\"late error\");\nassert_eq!(x.and(y), Err(\"not a 2\"));\n\nlet x: Result<u32, &str> = Ok(2);\nlet y: Result<&str, &str> = Ok(\"different result type\");\nassert_eq!(x.and(y), Ok(\"different result type\"));
\n
1.0.0 (const: unstable) · Source

pub fn and_then<U, F>(self, op: F) -> Result<U, E>
where\n F: FnOnce(T) -> Result<U, E>,

Calls op if the result is Ok, otherwise returns the Err value of self.

\n

This function can be used for control flow based on Result values.

\n
§Examples
\n
fn sq_then_to_string(x: u32) -> Result<String, &'static str> {\n    x.checked_mul(x).map(|sq| sq.to_string()).ok_or(\"overflowed\")\n}\n\nassert_eq!(Ok(2).and_then(sq_then_to_string), Ok(4.to_string()));\nassert_eq!(Ok(1_000_000).and_then(sq_then_to_string), Err(\"overflowed\"));\nassert_eq!(Err(\"not a number\").and_then(sq_then_to_string), Err(\"not a number\"));
\n

Often used to chain fallible operations that may return Err.

\n\n
use std::{io::ErrorKind, path::Path};\n\n// Note: on Windows \"/\" maps to \"C:\\\"\nlet root_modified_time = Path::new(\"/\").metadata().and_then(|md| md.modified());\nassert!(root_modified_time.is_ok());\n\nlet should_fail = Path::new(\"/bad/path\").metadata().and_then(|md| md.modified());\nassert!(should_fail.is_err());\nassert_eq!(should_fail.unwrap_err().kind(), ErrorKind::NotFound);
\n
1.0.0 (const: unstable) · Source

pub fn or<F>(self, res: Result<T, F>) -> Result<T, F>

Returns res if the result is Err, otherwise returns the Ok value of self.

\n

Arguments passed to or are eagerly evaluated; if you are passing the\nresult of a function call, it is recommended to use or_else, which is\nlazily evaluated.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nlet y: Result<u32, &str> = Err(\"late error\");\nassert_eq!(x.or(y), Ok(2));\n\nlet x: Result<u32, &str> = Err(\"early error\");\nlet y: Result<u32, &str> = Ok(2);\nassert_eq!(x.or(y), Ok(2));\n\nlet x: Result<u32, &str> = Err(\"not a 2\");\nlet y: Result<u32, &str> = Err(\"late error\");\nassert_eq!(x.or(y), Err(\"late error\"));\n\nlet x: Result<u32, &str> = Ok(2);\nlet y: Result<u32, &str> = Ok(100);\nassert_eq!(x.or(y), Ok(2));
\n
1.0.0 (const: unstable) · Source

pub fn or_else<F, O>(self, op: O) -> Result<T, F>
where\n O: FnOnce(E) -> Result<T, F>,

Calls op if the result is Err, otherwise returns the Ok value of self.

\n

This function can be used for control flow based on result values.

\n
§Examples
\n
fn sq(x: u32) -> Result<u32, u32> { Ok(x * x) }\nfn err(x: u32) -> Result<u32, u32> { Err(x) }\n\nassert_eq!(Ok(2).or_else(sq).or_else(sq), Ok(2));\nassert_eq!(Ok(2).or_else(err).or_else(sq), Ok(2));\nassert_eq!(Err(3).or_else(sq).or_else(err), Ok(9));\nassert_eq!(Err(3).or_else(err).or_else(err), Err(3));
\n
1.0.0 (const: unstable) · Source

pub fn unwrap_or(self, default: T) -> T

Returns the contained Ok value or a provided default.

\n

Arguments passed to unwrap_or are eagerly evaluated; if you are passing\nthe result of a function call, it is recommended to use unwrap_or_else,\nwhich is lazily evaluated.

\n
§Examples
\n
let default = 2;\nlet x: Result<u32, &str> = Ok(9);\nassert_eq!(x.unwrap_or(default), 9);\n\nlet x: Result<u32, &str> = Err(\"error\");\nassert_eq!(x.unwrap_or(default), default);
\n
1.0.0 (const: unstable) · Source

pub fn unwrap_or_else<F>(self, op: F) -> T
where\n F: FnOnce(E) -> T,

Returns the contained Ok value or computes it from a closure.

\n
§Examples
\n
fn count(x: &str) -> usize { x.len() }\n\nassert_eq!(Ok(2).unwrap_or_else(count), 2);\nassert_eq!(Err(\"foo\").unwrap_or_else(count), 3);
\n
1.58.0 · Source

pub unsafe fn unwrap_unchecked(self) -> T

Returns the contained Ok value, consuming the self value,\nwithout checking that the value is not an Err.

\n
§Safety
\n

Calling this method on an Err is undefined behavior.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(unsafe { x.unwrap_unchecked() }, 2);
\n\n
let x: Result<u32, &str> = Err(\"emergency failure\");\nunsafe { x.unwrap_unchecked() }; // Undefined behavior!
\n
1.58.0 · Source

pub unsafe fn unwrap_err_unchecked(self) -> E

Returns the contained Err value, consuming the self value,\nwithout checking that the value is not an Ok.

\n
§Safety
\n

Calling this method on an Ok is undefined behavior.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nunsafe { x.unwrap_err_unchecked() }; // Undefined behavior!
\n\n
let x: Result<u32, &str> = Err(\"emergency failure\");\nassert_eq!(unsafe { x.unwrap_err_unchecked() }, \"emergency failure\");
\n
",0,"songbird::driver::connection::error::Result","songbird::error::JoinResult","songbird::tracks::error::TrackResult"],["
Source§

impl<T, E> Serialize for Result<T, E>
where\n T: Serialize,\n E: Serialize,

Source§

fn serialize<S>(\n &self,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer. Read more
","Serialize","songbird::driver::connection::error::Result","songbird::error::JoinResult","songbird::tracks::error::TrackResult"],["
1.16.0 · Source§

impl<T, U, E> Sum<Result<U, E>> for Result<T, E>
where\n T: Sum<U>,

Source§

fn sum<I>(iter: I) -> Result<T, E>
where\n I: Iterator<Item = Result<U, E>>,

Takes each element in the Iterator: if it is an Err, no further\nelements are taken, and the Err is returned. Should no Err\noccur, the sum of all elements is returned.

\n
§Examples
\n

This sums up every integer in a vector, rejecting the sum if a negative\nelement is encountered:

\n\n
let f = |&x: &i32| if x < 0 { Err(\"Negative element found\") } else { Ok(x) };\nlet v = vec![1, 2];\nlet res: Result<i32, _> = v.iter().map(f).sum();\nassert_eq!(res, Ok(3));\nlet v = vec![1, -2];\nlet res: Result<i32, _> = v.iter().map(f).sum();\nassert_eq!(res, Err(\"Negative element found\"));
\n
","Sum>","songbird::driver::connection::error::Result","songbird::error::JoinResult","songbird::tracks::error::TrackResult"],["
1.61.0 · Source§

impl<T, E> Termination for Result<T, E>
where\n T: Termination,\n E: Debug,

Source§

fn report(self) -> ExitCode

Is called to get the representation of the value as status code.\nThis status code is returned to the operating system.
","Termination","songbird::driver::connection::error::Result","songbird::error::JoinResult","songbird::tracks::error::TrackResult"],["
Source§

impl<T, E> Try for Result<T, E>

Source§

type Output = T

🔬This is a nightly-only experimental API. (try_trait_v2)
The type of the value produced by ? when not short-circuiting.
Source§

type Residual = Result<Infallible, E>

🔬This is a nightly-only experimental API. (try_trait_v2)
The type of the value passed to FromResidual::from_residual\nas part of ? when short-circuiting. Read more
Source§

fn from_output(output: <Result<T, E> as Try>::Output) -> Result<T, E>

🔬This is a nightly-only experimental API. (try_trait_v2)
Constructs the type from its Output type. Read more
Source§

fn branch(\n self,\n) -> ControlFlow<<Result<T, E> as Try>::Residual, <Result<T, E> as Try>::Output>

🔬This is a nightly-only experimental API. (try_trait_v2)
Used in ? to decide whether the operator should produce a value\n(because this returned ControlFlow::Continue)\nor propagate a value back to the caller\n(because this returned ControlFlow::Break). Read more
","Try","songbird::driver::connection::error::Result","songbird::error::JoinResult","songbird::tracks::error::TrackResult"],["
§

impl<T, E> TryWriteable for Result<T, E>
where\n T: Writeable,\n E: Writeable + Clone,

§

type Error = E

§

fn try_write_to<W>(\n &self,\n sink: &mut W,\n) -> Result<Result<(), <Result<T, E> as TryWriteable>::Error>, Error>
where\n W: Write + ?Sized,

Writes the content of this writeable to a sink. Read more
§

fn try_write_to_parts<S>(\n &self,\n sink: &mut S,\n) -> Result<Result<(), <Result<T, E> as TryWriteable>::Error>, Error>
where\n S: PartsWrite + ?Sized,

Writes the content of this writeable to a sink with parts (annotations). Read more
§

fn writeable_length_hint(&self) -> LengthHint

Returns a hint for the number of UTF-8 bytes that will be written to the sink. Read more
§

fn try_write_to_string(\n &self,\n) -> Result<Cow<'_, str>, (<Result<T, E> as TryWriteable>::Error, Cow<'_, str>)>

Writes the content of this writeable to a string. Read more
","TryWriteable","songbird::driver::connection::error::Result","songbird::error::JoinResult","songbird::tracks::error::TrackResult"],["
1.0.0 · Source§

impl<T, E> Copy for Result<T, E>
where\n T: Copy,\n E: Copy,

","Copy","songbird::driver::connection::error::Result","songbird::error::JoinResult","songbird::tracks::error::TrackResult"],["
1.0.0 · Source§

impl<T, E> Eq for Result<T, E>
where\n T: Eq,\n E: Eq,

","Eq","songbird::driver::connection::error::Result","songbird::error::JoinResult","songbird::tracks::error::TrackResult"],["
1.0.0 · Source§

impl<T, E> StructuralPartialEq for Result<T, E>

","StructuralPartialEq","songbird::driver::connection::error::Result","songbird::error::JoinResult","songbird::tracks::error::TrackResult"],["
Source§

impl<T, E> UseCloned for Result<T, E>
where\n T: UseCloned,\n E: UseCloned,

","UseCloned","songbird::driver::connection::error::Result","songbird::error::JoinResult","songbird::tracks::error::TrackResult"]]]]); + if (window.register_type_impls) { + window.register_type_impls(type_impls); + } else { + window.pending_type_impls = type_impls; + } +})() +//{"start":55,"fragment_lengths":[189242]} \ No newline at end of file

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 U|Bv{{GaLS=zr5yR%fi3_03@G~A^-pY literal 0 HcmV?d00001 diff --git a/next/static.files/FiraSans-MediumItalic-ccf7e434.woff2 b/next/static.files/FiraSans-MediumItalic-ccf7e434.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2d08f9f7d45fda39315519c4d6ffce5b84454d70 GIT binary patch literal 140588 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¨{$-yCTqVw{kyY8 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 literal 0 HcmV?d00001 diff --git a/next/static.files/FiraSans-Regular-0fe48ade.woff2 b/next/static.files/FiraSans-Regular-0fe48ade.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..e766e06ccb0d457fcdc8d4428efb796c7772a497 GIT binary patch literal 129188 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