Compare commits
7 commits
main
...
rodio-audi
Author | SHA1 | Date | |
---|---|---|---|
![]() |
0a434c5cd4 | ||
![]() |
cef721465f | ||
![]() |
5a4f284e45 | ||
![]() |
efd9edb5ff | ||
![]() |
9521f540fd | ||
![]() |
3a5d02cb7d | ||
![]() |
d76c7e1ba8 |
14 changed files with 506 additions and 80 deletions
|
@ -26,7 +26,7 @@ third-party = [
|
||||||
# build of remote_server should not include scap / its x11 dependency
|
# build of remote_server should not include scap / its x11 dependency
|
||||||
{ name = "scap", git = "https://github.com/zed-industries/scap", rev = "808aa5c45b41e8f44729d02e38fd00a2fe2722e7" },
|
{ name = "scap", git = "https://github.com/zed-industries/scap", rev = "808aa5c45b41e8f44729d02e38fd00a2fe2722e7" },
|
||||||
# build of remote_server should not need to include on libalsa through rodio
|
# build of remote_server should not need to include on libalsa through rodio
|
||||||
{ name = "rodio" },
|
# { name = "rodio" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[final-excludes]
|
[final-excludes]
|
||||||
|
|
139
Cargo.lock
generated
139
Cargo.lock
generated
|
@ -1381,6 +1381,8 @@ dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"collections",
|
"collections",
|
||||||
"gpui",
|
"gpui",
|
||||||
|
"libwebrtc",
|
||||||
|
"parking_lot",
|
||||||
"rodio",
|
"rodio",
|
||||||
"schemars",
|
"schemars",
|
||||||
"serde",
|
"serde",
|
||||||
|
@ -2681,7 +2683,7 @@ dependencies = [
|
||||||
"cap-primitives",
|
"cap-primitives",
|
||||||
"cap-std",
|
"cap-std",
|
||||||
"io-lifetimes",
|
"io-lifetimes",
|
||||||
"windows-sys 0.59.0",
|
"windows-sys 0.52.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -2710,7 +2712,7 @@ dependencies = [
|
||||||
"maybe-owned",
|
"maybe-owned",
|
||||||
"rustix 1.0.7",
|
"rustix 1.0.7",
|
||||||
"rustix-linux-procfs",
|
"rustix-linux-procfs",
|
||||||
"windows-sys 0.59.0",
|
"windows-sys 0.52.0",
|
||||||
"winx",
|
"winx",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -5327,7 +5329,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e"
|
checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
"windows-sys 0.59.0",
|
"windows-sys 0.52.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -5714,7 +5716,7 @@ checksum = "0ce92ff622d6dadf7349484f42c93271a0d49b7cc4d466a936405bacbe10aa78"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"rustix 1.0.7",
|
"rustix 1.0.7",
|
||||||
"windows-sys 0.59.0",
|
"windows-sys 0.52.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -6092,7 +6094,7 @@ checksum = "94e7099f6313ecacbe1256e8ff9d617b75d1bcb16a6fddef94866d225a01a14a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"io-lifetimes",
|
"io-lifetimes",
|
||||||
"rustix 1.0.7",
|
"rustix 1.0.7",
|
||||||
"windows-sys 0.59.0",
|
"windows-sys 0.52.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -8551,7 +8553,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2285ddfe3054097ef4b2fe909ef8c3bcd1ea52a8f0d274416caebeef39f04a65"
|
checksum = "2285ddfe3054097ef4b2fe909ef8c3bcd1ea52a8f0d274416caebeef39f04a65"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"io-lifetimes",
|
"io-lifetimes",
|
||||||
"windows-sys 0.59.0",
|
"windows-sys 0.52.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -8624,7 +8626,7 @@ checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"hermit-abi 0.5.0",
|
"hermit-abi 0.5.0",
|
||||||
"libc",
|
"libc",
|
||||||
"windows-sys 0.59.0",
|
"windows-sys 0.52.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -8706,7 +8708,7 @@ dependencies = [
|
||||||
"portable-atomic",
|
"portable-atomic",
|
||||||
"portable-atomic-util",
|
"portable-atomic-util",
|
||||||
"serde",
|
"serde",
|
||||||
"windows-sys 0.59.0",
|
"windows-sys 0.52.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -9406,7 +9408,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34"
|
checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"windows-targets 0.52.6",
|
"windows-targets 0.48.5",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -9628,6 +9630,7 @@ dependencies = [
|
||||||
"core-video",
|
"core-video",
|
||||||
"coreaudio-rs 0.12.1",
|
"coreaudio-rs 0.12.1",
|
||||||
"cpal",
|
"cpal",
|
||||||
|
"dasp_sample",
|
||||||
"futures 0.3.31",
|
"futures 0.3.31",
|
||||||
"gpui",
|
"gpui",
|
||||||
"gpui_tokio",
|
"gpui_tokio",
|
||||||
|
@ -13061,7 +13064,7 @@ dependencies = [
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"socket2",
|
"socket2",
|
||||||
"tracing",
|
"tracing",
|
||||||
"windows-sys 0.59.0",
|
"windows-sys 0.52.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -13873,14 +13876,15 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rodio"
|
name = "rodio"
|
||||||
version = "0.21.1"
|
version = "0.21.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "git+https://github.com/RustAudio/rodio?branch=microphone#cad73716a363a5ba92fcb73ec37a4b98a7d7de5f"
|
||||||
checksum = "e40ecf59e742e03336be6a3d53755e789fd05a059fa22dfa0ed624722319e183"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cpal",
|
"cpal",
|
||||||
"dasp_sample",
|
"dasp_sample",
|
||||||
"hound",
|
"hound",
|
||||||
"num-rational",
|
"num-rational",
|
||||||
|
"rtrb",
|
||||||
"symphonia",
|
"symphonia",
|
||||||
|
"thiserror 2.0.12",
|
||||||
"tracing",
|
"tracing",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -13955,6 +13959,12 @@ dependencies = [
|
||||||
"zeroize",
|
"zeroize",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rtrb"
|
||||||
|
version = "0.3.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ad8388ea1a9e0ea807e442e8263a699e7edcb320ecbcd21b4fa8ff859acce3ba"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rules_library"
|
name = "rules_library"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
@ -14096,7 +14106,7 @@ dependencies = [
|
||||||
"itoa",
|
"itoa",
|
||||||
"libc",
|
"libc",
|
||||||
"linux-raw-sys 0.4.15",
|
"linux-raw-sys 0.4.15",
|
||||||
"windows-sys 0.59.0",
|
"windows-sys 0.52.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -14109,7 +14119,7 @@ dependencies = [
|
||||||
"errno 0.3.11",
|
"errno 0.3.11",
|
||||||
"libc",
|
"libc",
|
||||||
"linux-raw-sys 0.9.4",
|
"linux-raw-sys 0.9.4",
|
||||||
"windows-sys 0.59.0",
|
"windows-sys 0.52.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -14231,7 +14241,7 @@ dependencies = [
|
||||||
"security-framework 3.2.0",
|
"security-framework 3.2.0",
|
||||||
"security-framework-sys",
|
"security-framework-sys",
|
||||||
"webpki-root-certs",
|
"webpki-root-certs",
|
||||||
"windows-sys 0.59.0",
|
"windows-sys 0.52.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -15583,7 +15593,7 @@ dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"libc",
|
"libc",
|
||||||
"psm",
|
"psm",
|
||||||
"windows-sys 0.59.0",
|
"windows-sys 0.52.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -15954,12 +15964,53 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "815c942ae7ee74737bb00f965fa5b5a2ac2ce7b6c01c0cc169bbeaf7abd5f5a9"
|
checksum = "815c942ae7ee74737bb00f965fa5b5a2ac2ce7b6c01c0cc169bbeaf7abd5f5a9"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
|
"symphonia-bundle-flac",
|
||||||
|
"symphonia-bundle-mp3",
|
||||||
|
"symphonia-codec-aac",
|
||||||
"symphonia-codec-pcm",
|
"symphonia-codec-pcm",
|
||||||
|
"symphonia-codec-vorbis",
|
||||||
"symphonia-core",
|
"symphonia-core",
|
||||||
|
"symphonia-format-isomp4",
|
||||||
|
"symphonia-format-ogg",
|
||||||
"symphonia-format-riff",
|
"symphonia-format-riff",
|
||||||
"symphonia-metadata",
|
"symphonia-metadata",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "symphonia-bundle-flac"
|
||||||
|
version = "0.5.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "72e34f34298a7308d4397a6c7fbf5b84c5d491231ce3dd379707ba673ab3bd97"
|
||||||
|
dependencies = [
|
||||||
|
"log",
|
||||||
|
"symphonia-core",
|
||||||
|
"symphonia-metadata",
|
||||||
|
"symphonia-utils-xiph",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "symphonia-bundle-mp3"
|
||||||
|
version = "0.5.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c01c2aae70f0f1fb096b6f0ff112a930b1fb3626178fba3ae68b09dce71706d4"
|
||||||
|
dependencies = [
|
||||||
|
"lazy_static",
|
||||||
|
"log",
|
||||||
|
"symphonia-core",
|
||||||
|
"symphonia-metadata",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "symphonia-codec-aac"
|
||||||
|
version = "0.5.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "cdbf25b545ad0d3ee3e891ea643ad115aff4ca92f6aec472086b957a58522f70"
|
||||||
|
dependencies = [
|
||||||
|
"lazy_static",
|
||||||
|
"log",
|
||||||
|
"symphonia-core",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "symphonia-codec-pcm"
|
name = "symphonia-codec-pcm"
|
||||||
version = "0.5.4"
|
version = "0.5.4"
|
||||||
|
@ -15970,6 +16021,17 @@ dependencies = [
|
||||||
"symphonia-core",
|
"symphonia-core",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "symphonia-codec-vorbis"
|
||||||
|
version = "0.5.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5a98765fb46a0a6732b007f7e2870c2129b6f78d87db7987e6533c8f164a9f30"
|
||||||
|
dependencies = [
|
||||||
|
"log",
|
||||||
|
"symphonia-core",
|
||||||
|
"symphonia-utils-xiph",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "symphonia-core"
|
name = "symphonia-core"
|
||||||
version = "0.5.4"
|
version = "0.5.4"
|
||||||
|
@ -15983,6 +16045,31 @@ dependencies = [
|
||||||
"log",
|
"log",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "symphonia-format-isomp4"
|
||||||
|
version = "0.5.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "abfdf178d697e50ce1e5d9b982ba1b94c47218e03ec35022d9f0e071a16dc844"
|
||||||
|
dependencies = [
|
||||||
|
"encoding_rs",
|
||||||
|
"log",
|
||||||
|
"symphonia-core",
|
||||||
|
"symphonia-metadata",
|
||||||
|
"symphonia-utils-xiph",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "symphonia-format-ogg"
|
||||||
|
version = "0.5.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ada3505789516bcf00fc1157c67729eded428b455c27ca370e41f4d785bfa931"
|
||||||
|
dependencies = [
|
||||||
|
"log",
|
||||||
|
"symphonia-core",
|
||||||
|
"symphonia-metadata",
|
||||||
|
"symphonia-utils-xiph",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "symphonia-format-riff"
|
name = "symphonia-format-riff"
|
||||||
version = "0.5.4"
|
version = "0.5.4"
|
||||||
|
@ -16007,6 +16094,16 @@ dependencies = [
|
||||||
"symphonia-core",
|
"symphonia-core",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "symphonia-utils-xiph"
|
||||||
|
version = "0.5.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "484472580fa49991afda5f6550ece662237b00c6f562c7d9638d1b086ed010fe"
|
||||||
|
dependencies = [
|
||||||
|
"symphonia-core",
|
||||||
|
"symphonia-metadata",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syn"
|
name = "syn"
|
||||||
version = "1.0.109"
|
version = "1.0.109"
|
||||||
|
@ -16154,7 +16251,7 @@ dependencies = [
|
||||||
"fd-lock",
|
"fd-lock",
|
||||||
"io-lifetimes",
|
"io-lifetimes",
|
||||||
"rustix 0.38.44",
|
"rustix 0.38.44",
|
||||||
"windows-sys 0.59.0",
|
"windows-sys 0.52.0",
|
||||||
"winx",
|
"winx",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -16336,7 +16433,7 @@ dependencies = [
|
||||||
"getrandom 0.3.2",
|
"getrandom 0.3.2",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"rustix 1.0.7",
|
"rustix 1.0.7",
|
||||||
"windows-sys 0.59.0",
|
"windows-sys 0.52.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -18898,7 +18995,7 @@ version = "0.1.9"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
|
checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"windows-sys 0.59.0",
|
"windows-sys 0.48.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -19557,7 +19654,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3f3fd376f71958b862e7afb20cfe5a22830e1963462f3a17f49d82a6c1d1f42d"
|
checksum = "3f3fd376f71958b862e7afb20cfe5a22830e1963462f3a17f49d82a6c1d1f42d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 2.9.0",
|
"bitflags 2.9.0",
|
||||||
"windows-sys 0.59.0",
|
"windows-sys 0.52.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -19934,6 +20031,7 @@ dependencies = [
|
||||||
"libsqlite3-sys",
|
"libsqlite3-sys",
|
||||||
"linux-raw-sys 0.4.15",
|
"linux-raw-sys 0.4.15",
|
||||||
"linux-raw-sys 0.9.4",
|
"linux-raw-sys 0.9.4",
|
||||||
|
"livekit-runtime",
|
||||||
"log",
|
"log",
|
||||||
"lyon",
|
"lyon",
|
||||||
"lyon_path",
|
"lyon_path",
|
||||||
|
@ -19975,6 +20073,7 @@ dependencies = [
|
||||||
"regex-automata 0.4.9",
|
"regex-automata 0.4.9",
|
||||||
"regex-syntax 0.8.5",
|
"regex-syntax 0.8.5",
|
||||||
"ring",
|
"ring",
|
||||||
|
"rodio",
|
||||||
"rust_decimal",
|
"rust_decimal",
|
||||||
"rustc-hash 1.1.0",
|
"rustc-hash 1.1.0",
|
||||||
"rustix 0.38.44",
|
"rustix 0.38.44",
|
||||||
|
|
|
@ -361,7 +361,7 @@ remote_server = { path = "crates/remote_server" }
|
||||||
repl = { path = "crates/repl" }
|
repl = { path = "crates/repl" }
|
||||||
reqwest_client = { path = "crates/reqwest_client" }
|
reqwest_client = { path = "crates/reqwest_client" }
|
||||||
rich_text = { path = "crates/rich_text" }
|
rich_text = { path = "crates/rich_text" }
|
||||||
rodio = { version = "0.21.1", default-features = false }
|
rodio = { git = "https://github.com/RustAudio/rodio", branch = "microphone"}
|
||||||
rope = { path = "crates/rope" }
|
rope = { path = "crates/rope" }
|
||||||
rpc = { path = "crates/rpc" }
|
rpc = { path = "crates/rpc" }
|
||||||
rules_library = { path = "crates/rules_library" }
|
rules_library = { path = "crates/rules_library" }
|
||||||
|
|
68
GLOSSARY.md
Normal file
68
GLOSSARY.md
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
TODO dvdsk copy latest from notes
|
||||||
|
|
||||||
|
These are some terms and structures frequently used throughout the zed codebase. This is a best effort list. PR's are very welcome.
|
||||||
|
|
||||||
|
Questions:
|
||||||
|
|
||||||
|
- Can we generate this list form doc comments throughout zed?
|
||||||
|
|
||||||
|
## GPUI
|
||||||
|
|
||||||
|
- `Context`: A wrapper around the App struct with specialized behavior for a specific Entity
|
||||||
|
- `App`: A singleton which holds the full application state including all the entities.
|
||||||
|
- `AsyncApp`:
|
||||||
|
- `Window`:
|
||||||
|
- `Task`:
|
||||||
|
- `Executor`:
|
||||||
|
- both background and foreground
|
||||||
|
- `Entity`: A strong, well-typed reference to a struct which is managed by gpui. Effectively a pointer into the Context.
|
||||||
|
- `Global`: A singleton type which has only one value
|
||||||
|
- `Event`: A datatype which can be send by an Entity to subscribers
|
||||||
|
- `Action`: An event that represents a user's keyboard input that can be handled by listerners
|
||||||
|
Example: `file finder: toggle`
|
||||||
|
- `Subscription`: An event handler that is used to react to the changes of state in the application.
|
||||||
|
1. Emitted event handling
|
||||||
|
2. Observing {new,release,on notify} of an entity
|
||||||
|
- `Focus`: The place where keystrokes are handled first
|
||||||
|
- `Element`: An type that can be rendered
|
||||||
|
- `AnyElement`: A type erased version of an Element
|
||||||
|
- `element expression`: An expression that builds an element tree, example:
|
||||||
|
```
|
||||||
|
h_flex()
|
||||||
|
.id(text[i])
|
||||||
|
.relative()
|
||||||
|
.when(selected, |this| {
|
||||||
|
this.child(
|
||||||
|
div()
|
||||||
|
.h_4()
|
||||||
|
.absolute()
|
||||||
|
etc etc
|
||||||
|
```
|
||||||
|
|
||||||
|
## Zed
|
||||||
|
|
||||||
|
- `Workspace`: The root of the window <TODO add image>
|
||||||
|
- `Buffer`: The in memory representation of a 'file' together with relevant data such as syntax trees, git status and diagnostics.
|
||||||
|
- `Picker`: A model showing a list of items. When an item is selected you can confirm the item and then something happens. <TODO add image>
|
||||||
|
- `PickerDelegate`: A trait used to specialize behavior for a Picker
|
||||||
|
- `Modal`: todo! <TODO add image>
|
||||||
|
- `Project`: todo! <TODO add image>
|
||||||
|
- `Stores`: todo!
|
||||||
|
|
||||||
|
## Collab
|
||||||
|
|
||||||
|
- `Upstream client`: The zed client which has shared their workspace
|
||||||
|
- `Downstream client`: The zed client joining a shared workspace
|
||||||
|
|
||||||
|
## Debugger
|
||||||
|
|
||||||
|
- `DapStore`: Is an entity that manages debugger sessions
|
||||||
|
- `debugger::Session`: Is an entity that manages the lifecycle of a debug session and communication with DAPS
|
||||||
|
- `BreakpointStore`: Is an entity that manages breakpoints states in local and remote instances of Zed
|
||||||
|
- `DebugSession`: Manages a debug session's UI and running state
|
||||||
|
- `RunningState`: Directily manages all the views of a debug session
|
||||||
|
- `VariableList`: The variable and watch list view of a debug session
|
||||||
|
- `Console`
|
||||||
|
- `Terminal`
|
||||||
|
- `BreakpointList`
|
||||||
|
- `
|
|
@ -19,6 +19,10 @@ gpui.workspace = true
|
||||||
settings.workspace = true
|
settings.workspace = true
|
||||||
schemars.workspace = true
|
schemars.workspace = true
|
||||||
serde.workspace = true
|
serde.workspace = true
|
||||||
|
parking_lot.workspace = true
|
||||||
rodio = { workspace = true, features = [ "wav", "playback", "tracing" ] }
|
rodio = { workspace = true, features = [ "wav", "playback", "tracing" ] }
|
||||||
util.workspace = true
|
util.workspace = true
|
||||||
workspace-hack.workspace = true
|
workspace-hack.workspace = true
|
||||||
|
|
||||||
|
[target.'cfg(not(any(all(target_os = "windows", target_env = "gnu"), target_os = "freebsd")))'.dependencies]
|
||||||
|
libwebrtc = { rev = "5f04705ac3f356350ae31534ffbc476abc9ea83d", git = "https://github.com/zed-industries/livekit-rust-sdks" }
|
||||||
|
|
|
@ -1,12 +1,15 @@
|
||||||
use anyhow::{Context as _, Result, anyhow};
|
use anyhow::{Context as _, Result, anyhow};
|
||||||
use collections::HashMap;
|
use collections::HashMap;
|
||||||
use gpui::{App, BorrowAppContext, Global};
|
use gpui::{App, BorrowAppContext, Global};
|
||||||
use rodio::{Decoder, OutputStream, OutputStreamBuilder, Source, source::Buffered};
|
use libwebrtc::native::apm;
|
||||||
|
use parking_lot::Mutex;
|
||||||
|
use rodio::{Decoder, OutputStream, OutputStreamBuilder, Source, mixer::Mixer, source::Buffered};
|
||||||
use settings::Settings;
|
use settings::Settings;
|
||||||
use std::io::Cursor;
|
use std::{io::Cursor, sync::Arc};
|
||||||
use util::ResultExt;
|
use util::ResultExt;
|
||||||
|
|
||||||
mod audio_settings;
|
mod audio_settings;
|
||||||
|
mod rodio_ext;
|
||||||
pub use audio_settings::AudioSettings;
|
pub use audio_settings::AudioSettings;
|
||||||
|
|
||||||
pub fn init(cx: &mut App) {
|
pub fn init(cx: &mut App) {
|
||||||
|
@ -38,18 +41,46 @@ impl Sound {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default)]
|
|
||||||
pub struct Audio {
|
pub struct Audio {
|
||||||
output_handle: Option<OutputStream>,
|
output_handle: Option<OutputStream>,
|
||||||
|
output_mixer: Option<Mixer>,
|
||||||
|
echo_canceller: Arc<Mutex<apm::AudioProcessingModule>>,
|
||||||
source_cache: HashMap<Sound, Buffered<Decoder<Cursor<Vec<u8>>>>>,
|
source_cache: HashMap<Sound, Buffered<Decoder<Cursor<Vec<u8>>>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Default for Audio {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self {
|
||||||
|
output_handle: Default::default(),
|
||||||
|
output_mixer: Default::default(),
|
||||||
|
echo_canceller: Arc::new(Mutex::new(apm::AudioProcessingModule::new(
|
||||||
|
true, false, false, false,
|
||||||
|
))),
|
||||||
|
source_cache: Default::default(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Global for Audio {}
|
impl Global for Audio {}
|
||||||
|
|
||||||
impl Audio {
|
impl Audio {
|
||||||
fn ensure_output_exists(&mut self) -> Option<&OutputStream> {
|
fn ensure_output_exists(&mut self) -> Option<&OutputStream> {
|
||||||
if self.output_handle.is_none() {
|
if self.output_handle.is_none() {
|
||||||
self.output_handle = OutputStreamBuilder::open_default_stream().log_err();
|
self.output_handle = OutputStreamBuilder::open_default_stream().log_err();
|
||||||
|
if let Some(output_handle) = self.output_handle {
|
||||||
|
let config = output_handle.config();
|
||||||
|
let (mixer, source) =
|
||||||
|
rodio::mixer::mixer(config.channel_count(), config.sample_rate());
|
||||||
|
self.output_mixer = Some(mixer);
|
||||||
|
|
||||||
|
let echo_canceller = Arc::clone(&self.echo_canceller);
|
||||||
|
let source = source.inspect_buffered(
|
||||||
|
|buffer| echo_canceller.lock().process_reverse_stream(&mut buf),
|
||||||
|
config.sample_rate().get() as i32,
|
||||||
|
config.channel_count().get().into(),
|
||||||
|
);
|
||||||
|
output_handle.mixer().add(source);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.output_handle.as_ref()
|
self.output_handle.as_ref()
|
||||||
|
@ -72,6 +103,7 @@ impl Audio {
|
||||||
cx.update_default_global(|this: &mut Self, cx| {
|
cx.update_default_global(|this: &mut Self, cx| {
|
||||||
let source = this.sound_source(sound, cx).log_err()?;
|
let source = this.sound_source(sound, cx).log_err()?;
|
||||||
let output_handle = this.ensure_output_exists()?;
|
let output_handle = this.ensure_output_exists()?;
|
||||||
|
|
||||||
output_handle.mixer().add(source);
|
output_handle.mixer().add(source);
|
||||||
Some(())
|
Some(())
|
||||||
});
|
});
|
||||||
|
|
93
crates/audio/src/rodio_ext.rs
Normal file
93
crates/audio/src/rodio_ext.rs
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
use rodio::Source;
|
||||||
|
|
||||||
|
pub trait RodioExt: Source + Sized {
|
||||||
|
fn process_buffer<const N: usize, F>(self, callback: F) -> ProcessBuffer<N, Self, F>
|
||||||
|
where
|
||||||
|
F: FnMut(&mut [rodio::Sample; N]);
|
||||||
|
fn inspect_buffer<const N: usize, F>(self, callback: F) -> ProcessBuffer<N, Self, F>
|
||||||
|
where
|
||||||
|
F: FnMut(&[rodio::Sample; N]);
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<S: Source> RodioExt for S {
|
||||||
|
fn process_buffer<const N: usize, F>(self, callback: F) -> ProcessBuffer<N, Self, F>
|
||||||
|
where
|
||||||
|
F: FnMut(&mut [rodio::Sample; N]),
|
||||||
|
{
|
||||||
|
ProcessBuffer {
|
||||||
|
inner: self,
|
||||||
|
callback,
|
||||||
|
buffer: [0.0; N],
|
||||||
|
next: N,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fn inspect_buffer<const N: usize, F>(self, callback: F) -> ProcessBuffer<N, Self, F>
|
||||||
|
where
|
||||||
|
F: FnMut(&[rodio::Sample; N]),
|
||||||
|
{
|
||||||
|
InspectBuffer {
|
||||||
|
inner: self,
|
||||||
|
callback,
|
||||||
|
buffer: [0.0; N],
|
||||||
|
next: N,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct ProcessBuffer<const N: usize, S, F>
|
||||||
|
where
|
||||||
|
S: Source + Sized,
|
||||||
|
F: FnMut(&mut [rodio::Sample; N]),
|
||||||
|
{
|
||||||
|
inner: S,
|
||||||
|
callback: F,
|
||||||
|
buffer: [rodio::Sample; N],
|
||||||
|
next: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<const N: usize, S, F> Iterator for ProcessBuffer<N, S, F>
|
||||||
|
where
|
||||||
|
S: Source + Sized,
|
||||||
|
F: FnMut(&mut [rodio::Sample; N]),
|
||||||
|
{
|
||||||
|
type Item = rodio::Sample;
|
||||||
|
|
||||||
|
fn next(&mut self) -> Option<Self::Item> {
|
||||||
|
self.next += 1;
|
||||||
|
if self.next < self.buffer.len() {
|
||||||
|
let sample = self.buffer[self.next];
|
||||||
|
return Some(sample);
|
||||||
|
}
|
||||||
|
|
||||||
|
for sample in &mut self.buffer {
|
||||||
|
*sample = self.inner.next()?
|
||||||
|
}
|
||||||
|
(self.callback)(&mut self.buffer);
|
||||||
|
|
||||||
|
self.next = 0;
|
||||||
|
Some(self.buffer[0])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<const N: usize, S, F> Source for ProcessBuffer<N, S, F>
|
||||||
|
where
|
||||||
|
S: Source + Sized,
|
||||||
|
F: FnMut(&mut [rodio::Sample; N]),
|
||||||
|
{
|
||||||
|
fn current_span_len(&self) -> Option<usize> {
|
||||||
|
// TODO dvdsk this should be a spanless Source
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
|
fn channels(&self) -> rodio::ChannelCount {
|
||||||
|
self.inner.channels()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn sample_rate(&self) -> rodio::SampleRate {
|
||||||
|
self.inner.sample_rate()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn total_duration(&self) -> Option<std::time::Duration> {
|
||||||
|
self.inner.total_duration()
|
||||||
|
}
|
||||||
|
}
|
|
@ -41,7 +41,8 @@ tokio-tungstenite.workspace = true
|
||||||
util.workspace = true
|
util.workspace = true
|
||||||
workspace-hack.workspace = true
|
workspace-hack.workspace = true
|
||||||
|
|
||||||
rodio = { workspace = true, features = ["wav_output"] }
|
rodio = { workspace = true, features = ["wav_output", "recording"] }
|
||||||
|
dasp_sample = "0.11"
|
||||||
|
|
||||||
[target.'cfg(not(any(all(target_os = "windows", target_env = "gnu"), target_os = "freebsd")))'.dependencies]
|
[target.'cfg(not(any(all(target_os = "windows", target_env = "gnu"), target_os = "freebsd")))'.dependencies]
|
||||||
libwebrtc = { rev = "5f04705ac3f356350ae31534ffbc476abc9ea83d", git = "https://github.com/zed-industries/livekit-rust-sdks" }
|
libwebrtc = { rev = "5f04705ac3f356350ae31534ffbc476abc9ea83d", git = "https://github.com/zed-industries/livekit-rust-sdks" }
|
||||||
|
|
|
@ -9,19 +9,19 @@ use rodio::DeviceTrait as _;
|
||||||
mod record;
|
mod record;
|
||||||
pub use record::CaptureInput;
|
pub use record::CaptureInput;
|
||||||
|
|
||||||
#[cfg(not(any(
|
// #[cfg(not(any(
|
||||||
test,
|
// test,
|
||||||
feature = "test-support",
|
// feature = "test-support",
|
||||||
all(target_os = "windows", target_env = "gnu"),
|
// all(target_os = "windows", target_env = "gnu"),
|
||||||
target_os = "freebsd"
|
// target_os = "freebsd"
|
||||||
)))]
|
// )))]
|
||||||
mod livekit_client;
|
mod livekit_client;
|
||||||
#[cfg(not(any(
|
// #[cfg(not(any(
|
||||||
test,
|
// test,
|
||||||
feature = "test-support",
|
// feature = "test-support",
|
||||||
all(target_os = "windows", target_env = "gnu"),
|
// all(target_os = "windows", target_env = "gnu"),
|
||||||
target_os = "freebsd"
|
// target_os = "freebsd"
|
||||||
)))]
|
// )))]
|
||||||
pub use livekit_client::*;
|
pub use livekit_client::*;
|
||||||
|
|
||||||
// If you need proper LSP in livekit_client you've got to comment
|
// If you need proper LSP in livekit_client you've got to comment
|
||||||
|
@ -29,27 +29,27 @@ pub use livekit_client::*;
|
||||||
// - the mods: mock_client & test and their conditional blocks
|
// - the mods: mock_client & test and their conditional blocks
|
||||||
// - the pub use mock_client::* and their conditional blocks
|
// - the pub use mock_client::* and their conditional blocks
|
||||||
|
|
||||||
#[cfg(any(
|
// #[cfg(any(
|
||||||
test,
|
// test,
|
||||||
feature = "test-support",
|
// feature = "test-support",
|
||||||
all(target_os = "windows", target_env = "gnu"),
|
// all(target_os = "windows", target_env = "gnu"),
|
||||||
target_os = "freebsd"
|
// target_os = "freebsd"
|
||||||
))]
|
// ))]
|
||||||
mod mock_client;
|
// mod mock_client;
|
||||||
#[cfg(any(
|
// #[cfg(any(
|
||||||
test,
|
// test,
|
||||||
feature = "test-support",
|
// feature = "test-support",
|
||||||
all(target_os = "windows", target_env = "gnu"),
|
// all(target_os = "windows", target_env = "gnu"),
|
||||||
target_os = "freebsd"
|
// target_os = "freebsd"
|
||||||
))]
|
// ))]
|
||||||
pub mod test;
|
// pub mod test;
|
||||||
#[cfg(any(
|
// #[cfg(any(
|
||||||
test,
|
// test,
|
||||||
feature = "test-support",
|
// feature = "test-support",
|
||||||
all(target_os = "windows", target_env = "gnu"),
|
// all(target_os = "windows", target_env = "gnu"),
|
||||||
target_os = "freebsd"
|
// target_os = "freebsd"
|
||||||
))]
|
// ))]
|
||||||
pub use mock_client::*;
|
// pub use mock_client::*;
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub enum Participant {
|
pub enum Participant {
|
||||||
|
|
|
@ -99,7 +99,7 @@ impl Room {
|
||||||
&self,
|
&self,
|
||||||
cx: &mut AsyncApp,
|
cx: &mut AsyncApp,
|
||||||
) -> Result<(LocalTrackPublication, playback::AudioStream)> {
|
) -> Result<(LocalTrackPublication, playback::AudioStream)> {
|
||||||
let (track, stream) = self.playback.capture_local_microphone_track()?;
|
let (track, stream) = self.playback.capture_local_microphone_track(&cx)?;
|
||||||
let publication = self
|
let publication = self
|
||||||
.local_participant()
|
.local_participant()
|
||||||
.publish_track(
|
.publish_track(
|
||||||
|
|
|
@ -1,10 +1,14 @@
|
||||||
use anyhow::{Context as _, Result};
|
use anyhow::{Context as _, Result};
|
||||||
|
|
||||||
|
use audio::AudioSettings;
|
||||||
|
use cpal::Sample;
|
||||||
use cpal::traits::{DeviceTrait, StreamTrait as _};
|
use cpal::traits::{DeviceTrait, StreamTrait as _};
|
||||||
|
use dasp_sample::ToSample;
|
||||||
use futures::channel::mpsc::UnboundedSender;
|
use futures::channel::mpsc::UnboundedSender;
|
||||||
use futures::{Stream, StreamExt as _};
|
use futures::{Stream, StreamExt as _};
|
||||||
use gpui::{
|
use gpui::{
|
||||||
BackgroundExecutor, ScreenCaptureFrame, ScreenCaptureSource, ScreenCaptureStream, Task,
|
AsyncApp, BackgroundExecutor, ScreenCaptureFrame, ScreenCaptureSource, ScreenCaptureStream,
|
||||||
|
Task,
|
||||||
};
|
};
|
||||||
use libwebrtc::native::{apm, audio_mixer, audio_resampler};
|
use libwebrtc::native::{apm, audio_mixer, audio_resampler};
|
||||||
use livekit::track;
|
use livekit::track;
|
||||||
|
@ -17,14 +21,19 @@ use livekit::webrtc::{
|
||||||
video_source::{RtcVideoSource, VideoResolution, native::NativeVideoSource},
|
video_source::{RtcVideoSource, VideoResolution, native::NativeVideoSource},
|
||||||
video_stream::native::NativeVideoStream,
|
video_stream::native::NativeVideoStream,
|
||||||
};
|
};
|
||||||
|
use log::info;
|
||||||
use parking_lot::Mutex;
|
use parking_lot::Mutex;
|
||||||
use rodio::Source;
|
use rodio::Source;
|
||||||
|
use rodio::source::{LimitSettings, UniformSourceIterator};
|
||||||
|
use settings::Settings;
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
|
use std::num::NonZero;
|
||||||
use std::sync::Weak;
|
use std::sync::Weak;
|
||||||
use std::sync::atomic::{AtomicBool, AtomicI32, Ordering};
|
use std::sync::atomic::{AtomicBool, AtomicI32, Ordering};
|
||||||
|
use std::sync::mpsc::{TryRecvError, channel};
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use std::{borrow::Cow, collections::VecDeque, sync::Arc, thread};
|
use std::{borrow::Cow, collections::VecDeque, sync::Arc, thread};
|
||||||
use util::{ResultExt as _, maybe};
|
use util::{ResultExt as _, debug_panic, maybe};
|
||||||
|
|
||||||
mod source;
|
mod source;
|
||||||
|
|
||||||
|
@ -40,8 +49,8 @@ pub(crate) struct AudioStack {
|
||||||
// 16kHz, 32kHz and 48kHz. As 48 is the most common "next step up"
|
// 16kHz, 32kHz and 48kHz. As 48 is the most common "next step up"
|
||||||
// for audio output devices like speakers/bluetooth, we just hard-code
|
// for audio output devices like speakers/bluetooth, we just hard-code
|
||||||
// this; and downsample when we need to.
|
// this; and downsample when we need to.
|
||||||
const SAMPLE_RATE: u32 = 48000;
|
const SAMPLE_RATE: NonZero<u32> = NonZero::new(48000).expect("not zero");
|
||||||
const NUM_CHANNELS: u32 = 2;
|
const NUM_CHANNELS: NonZero<u16> = NonZero::new(2).expect("not zero");
|
||||||
|
|
||||||
pub(crate) fn play_remote_audio_track(
|
pub(crate) fn play_remote_audio_track(
|
||||||
track: &livekit::track::RemoteAudioTrack,
|
track: &livekit::track::RemoteAudioTrack,
|
||||||
|
@ -50,6 +59,7 @@ pub(crate) fn play_remote_audio_track(
|
||||||
let stop_handle = Arc::new(AtomicBool::new(false));
|
let stop_handle = Arc::new(AtomicBool::new(false));
|
||||||
let stop_handle_clone = stop_handle.clone();
|
let stop_handle_clone = stop_handle.clone();
|
||||||
let stream = source::LiveKitStream::new(cx.background_executor(), track)
|
let stream = source::LiveKitStream::new(cx.background_executor(), track)
|
||||||
|
.process_buffer(|| apm)
|
||||||
.stoppable()
|
.stoppable()
|
||||||
.periodic_access(Duration::from_millis(50), move |s| {
|
.periodic_access(Duration::from_millis(50), move |s| {
|
||||||
if stop_handle.load(Ordering::Relaxed) {
|
if stop_handle.load(Ordering::Relaxed) {
|
||||||
|
@ -90,8 +100,8 @@ impl AudioStack {
|
||||||
let next_ssrc = self.next_ssrc.fetch_add(1, Ordering::Relaxed);
|
let next_ssrc = self.next_ssrc.fetch_add(1, Ordering::Relaxed);
|
||||||
let source = AudioMixerSource {
|
let source = AudioMixerSource {
|
||||||
ssrc: next_ssrc,
|
ssrc: next_ssrc,
|
||||||
sample_rate: SAMPLE_RATE,
|
sample_rate: SAMPLE_RATE.get(),
|
||||||
num_channels: NUM_CHANNELS,
|
num_channels: NUM_CHANNELS.get() as u32,
|
||||||
buffer: Arc::default(),
|
buffer: Arc::default(),
|
||||||
};
|
};
|
||||||
self.mixer.lock().add_source(source.clone());
|
self.mixer.lock().add_source(source.clone());
|
||||||
|
@ -131,7 +141,7 @@ impl AudioStack {
|
||||||
let apm = self.apm.clone();
|
let apm = self.apm.clone();
|
||||||
let mixer = self.mixer.clone();
|
let mixer = self.mixer.clone();
|
||||||
async move {
|
async move {
|
||||||
Self::play_output(apm, mixer, SAMPLE_RATE, NUM_CHANNELS)
|
Self::play_output(apm, mixer, SAMPLE_RATE.get(), NUM_CHANNELS.get().into())
|
||||||
.await
|
.await
|
||||||
.log_err();
|
.log_err();
|
||||||
}
|
}
|
||||||
|
@ -142,12 +152,13 @@ impl AudioStack {
|
||||||
|
|
||||||
pub(crate) fn capture_local_microphone_track(
|
pub(crate) fn capture_local_microphone_track(
|
||||||
&self,
|
&self,
|
||||||
|
cx: &AsyncApp,
|
||||||
) -> Result<(crate::LocalAudioTrack, AudioStream)> {
|
) -> Result<(crate::LocalAudioTrack, AudioStream)> {
|
||||||
let source = NativeAudioSource::new(
|
let source = NativeAudioSource::new(
|
||||||
// n.b. this struct's options are always ignored, noise cancellation is provided by apm.
|
// n.b. this struct's options are always ignored, noise cancellation is provided by apm.
|
||||||
AudioSourceOptions::default(),
|
AudioSourceOptions::default(),
|
||||||
SAMPLE_RATE,
|
SAMPLE_RATE.get(),
|
||||||
NUM_CHANNELS,
|
NUM_CHANNELS.get().into(),
|
||||||
10,
|
10,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -166,8 +177,16 @@ impl AudioStack {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
let rodio_pipeline =
|
||||||
|
AudioSettings::try_read_global(cx, |setting| setting.rodio_audio).unwrap_or(false);
|
||||||
let capture_task = self.executor.spawn(async move {
|
let capture_task = self.executor.spawn(async move {
|
||||||
Self::capture_input(apm, frame_tx, SAMPLE_RATE, NUM_CHANNELS).await
|
if rodio_pipeline {
|
||||||
|
info!("Using experimental.rodio_audio audio pipeline");
|
||||||
|
Self::capture_input_rodio(apm, frame_tx).await
|
||||||
|
} else {
|
||||||
|
Self::capture_input(apm, frame_tx, SAMPLE_RATE.get(), NUM_CHANNELS.get().into())
|
||||||
|
.await
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
let on_drop = util::defer(|| {
|
let on_drop = util::defer(|| {
|
||||||
|
@ -254,6 +273,86 @@ impl AudioStack {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn capture_input_rodio(
|
||||||
|
apm: Arc<Mutex<apm::AudioProcessingModule>>,
|
||||||
|
frame_tx: UnboundedSender<AudioFrame<'static>>,
|
||||||
|
) -> Result<()> {
|
||||||
|
use crate::livekit_client::playback::source::RodioExt;
|
||||||
|
const NUM_CHANNELS: usize = 1;
|
||||||
|
const LIVEKIT_BUFFER_SIZE: usize =
|
||||||
|
(SAMPLE_RATE.get() as usize / 100) * NUM_CHANNELS as usize;
|
||||||
|
|
||||||
|
let (stream_error_tx, stream_error_rx) = channel();
|
||||||
|
|
||||||
|
thread::spawn(move || {
|
||||||
|
let stream = rodio::microphone::MicrophoneBuilder::new()
|
||||||
|
.default_device()?
|
||||||
|
.default_config()?
|
||||||
|
.prefer_sample_rates([
|
||||||
|
SAMPLE_RATE,
|
||||||
|
SAMPLE_RATE.saturating_mul(NonZero::new(2).expect("not zero")),
|
||||||
|
])
|
||||||
|
.prefer_channel_counts([
|
||||||
|
NonZero::new(1).expect("not zero"),
|
||||||
|
NonZero::new(2).expect("not zero"),
|
||||||
|
])
|
||||||
|
.prefer_buffer_sizes(512..)
|
||||||
|
.open_stream()?;
|
||||||
|
let mut stream = UniformSourceIterator::new(
|
||||||
|
stream,
|
||||||
|
NonZero::new(1).expect("1 is not zero"),
|
||||||
|
SAMPLE_RATE,
|
||||||
|
)
|
||||||
|
.limit(LimitSettings::live_performance())
|
||||||
|
.process_buffer::<LIVEKIT_BUFFER_SIZE, _>(|buffer| {
|
||||||
|
let mut int_buffer: [i16; _] = buffer.map(|s| s.to_sample());
|
||||||
|
if let Err(e) = apm
|
||||||
|
.lock()
|
||||||
|
.process_stream(
|
||||||
|
&mut int_buffer,
|
||||||
|
SAMPLE_RATE.get() as i32,
|
||||||
|
NUM_CHANNELS as i32,
|
||||||
|
)
|
||||||
|
.context("livekit audio processor error")
|
||||||
|
{
|
||||||
|
let _ = stream_error_tx.send(e);
|
||||||
|
} else {
|
||||||
|
for (sample, processed) in buffer.iter_mut().zip(&int_buffer) {
|
||||||
|
*sample = (*processed).to_sample_();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.automatic_gain_control(1.0, 4.0, 0.0, 5.0);
|
||||||
|
|
||||||
|
loop {
|
||||||
|
let sampled: Vec<_> = stream
|
||||||
|
.by_ref()
|
||||||
|
.take(LIVEKIT_BUFFER_SIZE)
|
||||||
|
.map(|s| s.to_sample())
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
match stream_error_rx.try_recv() {
|
||||||
|
Ok(apm_error) => return Err::<(), _>(apm_error),
|
||||||
|
Err(TryRecvError::Disconnected) => {
|
||||||
|
debug_panic!("Stream should end on its own without sending an error")
|
||||||
|
}
|
||||||
|
Err(TryRecvError::Empty) => (),
|
||||||
|
}
|
||||||
|
|
||||||
|
frame_tx
|
||||||
|
.unbounded_send(AudioFrame {
|
||||||
|
sample_rate: SAMPLE_RATE.get(),
|
||||||
|
num_channels: NUM_CHANNELS as u32,
|
||||||
|
samples_per_channel: sampled.len() as u32 / NUM_CHANNELS as u32,
|
||||||
|
data: Cow::Owned(sampled),
|
||||||
|
})
|
||||||
|
.context("Failed to send audio frame")?
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
async fn capture_input(
|
async fn capture_input(
|
||||||
apm: Arc<Mutex<apm::AudioProcessingModule>>,
|
apm: Arc<Mutex<apm::AudioProcessingModule>>,
|
||||||
frame_tx: UnboundedSender<AudioFrame<'static>>,
|
frame_tx: UnboundedSender<AudioFrame<'static>>,
|
||||||
|
@ -346,6 +445,8 @@ impl AudioStack {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
use crate::livekit_client::playback::source::RodioExt;
|
||||||
|
|
||||||
use super::LocalVideoTrack;
|
use super::LocalVideoTrack;
|
||||||
|
|
||||||
pub enum AudioStream {
|
pub enum AudioStream {
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
use std::num::NonZero;
|
||||||
|
|
||||||
use futures::StreamExt;
|
use futures::StreamExt;
|
||||||
use libwebrtc::{audio_stream::native::NativeAudioStream, prelude::AudioFrame};
|
use libwebrtc::{audio_stream::native::NativeAudioStream, prelude::AudioFrame};
|
||||||
use livekit::track::RemoteAudioTrack;
|
use livekit::track::RemoteAudioTrack;
|
||||||
|
@ -9,7 +11,11 @@ fn frame_to_samplesbuffer(frame: AudioFrame) -> SamplesBuffer {
|
||||||
let samples = frame.data.iter().copied();
|
let samples = frame.data.iter().copied();
|
||||||
let samples = SampleTypeConverter::<_, _>::new(samples);
|
let samples = SampleTypeConverter::<_, _>::new(samples);
|
||||||
let samples: Vec<f32> = samples.collect();
|
let samples: Vec<f32> = samples.collect();
|
||||||
SamplesBuffer::new(frame.num_channels as u16, frame.sample_rate, samples)
|
SamplesBuffer::new(
|
||||||
|
NonZero::new(frame.num_channels as u16).expect("audio frame channels is nonzero"),
|
||||||
|
NonZero::new(frame.sample_rate).expect("audio frame sample rate is nonzero"),
|
||||||
|
samples,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct LiveKitStream {
|
pub struct LiveKitStream {
|
||||||
|
@ -20,8 +26,11 @@ pub struct LiveKitStream {
|
||||||
|
|
||||||
impl LiveKitStream {
|
impl LiveKitStream {
|
||||||
pub fn new(executor: &gpui::BackgroundExecutor, track: &RemoteAudioTrack) -> Self {
|
pub fn new(executor: &gpui::BackgroundExecutor, track: &RemoteAudioTrack) -> Self {
|
||||||
let mut stream =
|
let mut stream = NativeAudioStream::new(
|
||||||
NativeAudioStream::new(track.rtc_track(), SAMPLE_RATE as i32, NUM_CHANNELS as i32);
|
track.rtc_track(),
|
||||||
|
SAMPLE_RATE.get() as i32,
|
||||||
|
NUM_CHANNELS.get().into(),
|
||||||
|
);
|
||||||
let (queue_input, queue_output) = rodio::queue::queue(true);
|
let (queue_input, queue_output) = rodio::queue::queue(true);
|
||||||
// spawn rtc stream
|
// spawn rtc stream
|
||||||
let receiver_task = executor.spawn({
|
let receiver_task = executor.spawn({
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
use std::{
|
use std::{
|
||||||
env,
|
env,
|
||||||
|
num::NonZero,
|
||||||
path::{Path, PathBuf},
|
path::{Path, PathBuf},
|
||||||
sync::{Arc, Mutex},
|
sync::{Arc, Mutex},
|
||||||
time::Duration,
|
time::Duration,
|
||||||
|
@ -83,7 +84,11 @@ fn write_out(
|
||||||
.expect("Stream has ended, callback cant hold the lock"),
|
.expect("Stream has ended, callback cant hold the lock"),
|
||||||
);
|
);
|
||||||
let samples: Vec<f32> = SampleTypeConverter::<_, f32>::new(samples.into_iter()).collect();
|
let samples: Vec<f32> = SampleTypeConverter::<_, f32>::new(samples.into_iter()).collect();
|
||||||
let mut samples = SamplesBuffer::new(config.channels(), config.sample_rate().0, samples);
|
let mut samples = SamplesBuffer::new(
|
||||||
|
NonZero::new(config.channels()).expect("config channel is never zero"),
|
||||||
|
NonZero::new(config.sample_rate().0).expect("config sample_rate is never zero"),
|
||||||
|
samples,
|
||||||
|
);
|
||||||
match rodio::output_to_wav(&mut samples, path) {
|
match rodio::output_to_wav(&mut samples, path) {
|
||||||
Ok(_) => Ok(()),
|
Ok(_) => Ok(()),
|
||||||
Err(e) => Err(anyhow::anyhow!("Failed to write wav file: {}", e)),
|
Err(e) => Err(anyhow::anyhow!("Failed to write wav file: {}", e)),
|
||||||
|
|
|
@ -103,6 +103,7 @@ regalloc2 = { version = "0.11", features = ["checker", "enable-serde"] }
|
||||||
regex = { version = "1" }
|
regex = { version = "1" }
|
||||||
regex-automata = { version = "0.4" }
|
regex-automata = { version = "0.4" }
|
||||||
regex-syntax = { version = "0.8" }
|
regex-syntax = { version = "0.8" }
|
||||||
|
rodio = { git = "https://github.com/RustAudio/rodio", branch = "microphone", features = ["tracing", "wav_output"] }
|
||||||
rust_decimal = { version = "1", default-features = false, features = ["maths", "serde", "std"] }
|
rust_decimal = { version = "1", default-features = false, features = ["maths", "serde", "std"] }
|
||||||
rustc-hash = { version = "1" }
|
rustc-hash = { version = "1" }
|
||||||
rustix-d585fab2519d2d1 = { package = "rustix", version = "0.38", default-features = false, features = ["fs", "net", "std"] }
|
rustix-d585fab2519d2d1 = { package = "rustix", version = "0.38", default-features = false, features = ["fs", "net", "std"] }
|
||||||
|
@ -237,6 +238,7 @@ regalloc2 = { version = "0.11", features = ["checker", "enable-serde"] }
|
||||||
regex = { version = "1" }
|
regex = { version = "1" }
|
||||||
regex-automata = { version = "0.4" }
|
regex-automata = { version = "0.4" }
|
||||||
regex-syntax = { version = "0.8" }
|
regex-syntax = { version = "0.8" }
|
||||||
|
rodio = { git = "https://github.com/RustAudio/rodio", branch = "microphone", features = ["tracing", "wav_output"] }
|
||||||
rust_decimal = { version = "1", default-features = false, features = ["maths", "serde", "std"] }
|
rust_decimal = { version = "1", default-features = false, features = ["maths", "serde", "std"] }
|
||||||
rustc-hash = { version = "1" }
|
rustc-hash = { version = "1" }
|
||||||
rustix-d585fab2519d2d1 = { package = "rustix", version = "0.38", default-features = false, features = ["fs", "net", "std"] }
|
rustix-d585fab2519d2d1 = { package = "rustix", version = "0.38", default-features = false, features = ["fs", "net", "std"] }
|
||||||
|
@ -291,6 +293,7 @@ getrandom-468e82937335b1c9 = { package = "getrandom", version = "0.3", default-f
|
||||||
gimli = { version = "0.31", default-features = false, features = ["read", "std", "write"] }
|
gimli = { version = "0.31", default-features = false, features = ["read", "std", "write"] }
|
||||||
hyper-rustls = { version = "0.27", default-features = false, features = ["http1", "http2", "native-tokio", "ring", "tls12"] }
|
hyper-rustls = { version = "0.27", default-features = false, features = ["http1", "http2", "native-tokio", "ring", "tls12"] }
|
||||||
itertools-5ef9efb8ec2df382 = { package = "itertools", version = "0.12" }
|
itertools-5ef9efb8ec2df382 = { package = "itertools", version = "0.12" }
|
||||||
|
livekit-runtime = { git = "https://github.com/zed-industries/livekit-rust-sdks", rev = "5f04705ac3f356350ae31534ffbc476abc9ea83d" }
|
||||||
naga = { version = "25", features = ["msl-out", "wgsl-in"] }
|
naga = { version = "25", features = ["msl-out", "wgsl-in"] }
|
||||||
nix-b73a96c0a5f6a7d9 = { package = "nix", version = "0.29", features = ["fs", "pthread", "signal", "user"] }
|
nix-b73a96c0a5f6a7d9 = { package = "nix", version = "0.29", features = ["fs", "pthread", "signal", "user"] }
|
||||||
objc2 = { version = "0.6" }
|
objc2 = { version = "0.6" }
|
||||||
|
@ -319,6 +322,7 @@ getrandom-468e82937335b1c9 = { package = "getrandom", version = "0.3", default-f
|
||||||
gimli = { version = "0.31", default-features = false, features = ["read", "std", "write"] }
|
gimli = { version = "0.31", default-features = false, features = ["read", "std", "write"] }
|
||||||
hyper-rustls = { version = "0.27", default-features = false, features = ["http1", "http2", "native-tokio", "ring", "tls12"] }
|
hyper-rustls = { version = "0.27", default-features = false, features = ["http1", "http2", "native-tokio", "ring", "tls12"] }
|
||||||
itertools-5ef9efb8ec2df382 = { package = "itertools", version = "0.12" }
|
itertools-5ef9efb8ec2df382 = { package = "itertools", version = "0.12" }
|
||||||
|
livekit-runtime = { git = "https://github.com/zed-industries/livekit-rust-sdks", rev = "5f04705ac3f356350ae31534ffbc476abc9ea83d" }
|
||||||
naga = { version = "25", features = ["msl-out", "wgsl-in"] }
|
naga = { version = "25", features = ["msl-out", "wgsl-in"] }
|
||||||
nix-b73a96c0a5f6a7d9 = { package = "nix", version = "0.29", features = ["fs", "pthread", "signal", "user"] }
|
nix-b73a96c0a5f6a7d9 = { package = "nix", version = "0.29", features = ["fs", "pthread", "signal", "user"] }
|
||||||
objc2 = { version = "0.6" }
|
objc2 = { version = "0.6" }
|
||||||
|
@ -348,6 +352,7 @@ getrandom-468e82937335b1c9 = { package = "getrandom", version = "0.3", default-f
|
||||||
gimli = { version = "0.31", default-features = false, features = ["read", "std", "write"] }
|
gimli = { version = "0.31", default-features = false, features = ["read", "std", "write"] }
|
||||||
hyper-rustls = { version = "0.27", default-features = false, features = ["http1", "http2", "native-tokio", "ring", "tls12"] }
|
hyper-rustls = { version = "0.27", default-features = false, features = ["http1", "http2", "native-tokio", "ring", "tls12"] }
|
||||||
itertools-5ef9efb8ec2df382 = { package = "itertools", version = "0.12" }
|
itertools-5ef9efb8ec2df382 = { package = "itertools", version = "0.12" }
|
||||||
|
livekit-runtime = { git = "https://github.com/zed-industries/livekit-rust-sdks", rev = "5f04705ac3f356350ae31534ffbc476abc9ea83d" }
|
||||||
naga = { version = "25", features = ["msl-out", "wgsl-in"] }
|
naga = { version = "25", features = ["msl-out", "wgsl-in"] }
|
||||||
nix-b73a96c0a5f6a7d9 = { package = "nix", version = "0.29", features = ["fs", "pthread", "signal", "user"] }
|
nix-b73a96c0a5f6a7d9 = { package = "nix", version = "0.29", features = ["fs", "pthread", "signal", "user"] }
|
||||||
objc2 = { version = "0.6" }
|
objc2 = { version = "0.6" }
|
||||||
|
@ -376,6 +381,7 @@ getrandom-468e82937335b1c9 = { package = "getrandom", version = "0.3", default-f
|
||||||
gimli = { version = "0.31", default-features = false, features = ["read", "std", "write"] }
|
gimli = { version = "0.31", default-features = false, features = ["read", "std", "write"] }
|
||||||
hyper-rustls = { version = "0.27", default-features = false, features = ["http1", "http2", "native-tokio", "ring", "tls12"] }
|
hyper-rustls = { version = "0.27", default-features = false, features = ["http1", "http2", "native-tokio", "ring", "tls12"] }
|
||||||
itertools-5ef9efb8ec2df382 = { package = "itertools", version = "0.12" }
|
itertools-5ef9efb8ec2df382 = { package = "itertools", version = "0.12" }
|
||||||
|
livekit-runtime = { git = "https://github.com/zed-industries/livekit-rust-sdks", rev = "5f04705ac3f356350ae31534ffbc476abc9ea83d" }
|
||||||
naga = { version = "25", features = ["msl-out", "wgsl-in"] }
|
naga = { version = "25", features = ["msl-out", "wgsl-in"] }
|
||||||
nix-b73a96c0a5f6a7d9 = { package = "nix", version = "0.29", features = ["fs", "pthread", "signal", "user"] }
|
nix-b73a96c0a5f6a7d9 = { package = "nix", version = "0.29", features = ["fs", "pthread", "signal", "user"] }
|
||||||
objc2 = { version = "0.6" }
|
objc2 = { version = "0.6" }
|
||||||
|
@ -414,6 +420,7 @@ inout = { version = "0.1", default-features = false, features = ["block-padding"
|
||||||
itertools-5ef9efb8ec2df382 = { package = "itertools", version = "0.12" }
|
itertools-5ef9efb8ec2df382 = { package = "itertools", version = "0.12" }
|
||||||
linux-raw-sys-274715c4dabd11b0 = { package = "linux-raw-sys", version = "0.9", default-features = false, features = ["elf", "errno", "general", "if_ether", "ioctl", "net", "netlink", "no_std", "prctl", "xdp"] }
|
linux-raw-sys-274715c4dabd11b0 = { package = "linux-raw-sys", version = "0.9", default-features = false, features = ["elf", "errno", "general", "if_ether", "ioctl", "net", "netlink", "no_std", "prctl", "xdp"] }
|
||||||
linux-raw-sys-9fbad63c4bcf4a8f = { package = "linux-raw-sys", version = "0.4", default-features = false, features = ["elf", "errno", "general", "if_ether", "ioctl", "net", "netlink", "no_std", "prctl", "system", "xdp"] }
|
linux-raw-sys-9fbad63c4bcf4a8f = { package = "linux-raw-sys", version = "0.4", default-features = false, features = ["elf", "errno", "general", "if_ether", "ioctl", "net", "netlink", "no_std", "prctl", "system", "xdp"] }
|
||||||
|
livekit-runtime = { git = "https://github.com/zed-industries/livekit-rust-sdks", rev = "5f04705ac3f356350ae31534ffbc476abc9ea83d" }
|
||||||
mio = { version = "1", features = ["net", "os-ext"] }
|
mio = { version = "1", features = ["net", "os-ext"] }
|
||||||
naga = { version = "25", features = ["spv-out", "wgsl-in"] }
|
naga = { version = "25", features = ["spv-out", "wgsl-in"] }
|
||||||
nix-1f5adca70f036a62 = { package = "nix", version = "0.28", features = ["fs", "mman", "ptrace", "signal", "term", "user"] }
|
nix-1f5adca70f036a62 = { package = "nix", version = "0.28", features = ["fs", "mman", "ptrace", "signal", "term", "user"] }
|
||||||
|
@ -455,6 +462,7 @@ inout = { version = "0.1", default-features = false, features = ["block-padding"
|
||||||
itertools-5ef9efb8ec2df382 = { package = "itertools", version = "0.12" }
|
itertools-5ef9efb8ec2df382 = { package = "itertools", version = "0.12" }
|
||||||
linux-raw-sys-274715c4dabd11b0 = { package = "linux-raw-sys", version = "0.9", default-features = false, features = ["elf", "errno", "general", "if_ether", "ioctl", "net", "netlink", "no_std", "prctl", "xdp"] }
|
linux-raw-sys-274715c4dabd11b0 = { package = "linux-raw-sys", version = "0.9", default-features = false, features = ["elf", "errno", "general", "if_ether", "ioctl", "net", "netlink", "no_std", "prctl", "xdp"] }
|
||||||
linux-raw-sys-9fbad63c4bcf4a8f = { package = "linux-raw-sys", version = "0.4", default-features = false, features = ["elf", "errno", "general", "if_ether", "ioctl", "net", "netlink", "no_std", "prctl", "system", "xdp"] }
|
linux-raw-sys-9fbad63c4bcf4a8f = { package = "linux-raw-sys", version = "0.4", default-features = false, features = ["elf", "errno", "general", "if_ether", "ioctl", "net", "netlink", "no_std", "prctl", "system", "xdp"] }
|
||||||
|
livekit-runtime = { git = "https://github.com/zed-industries/livekit-rust-sdks", rev = "5f04705ac3f356350ae31534ffbc476abc9ea83d" }
|
||||||
mio = { version = "1", features = ["net", "os-ext"] }
|
mio = { version = "1", features = ["net", "os-ext"] }
|
||||||
naga = { version = "25", features = ["spv-out", "wgsl-in"] }
|
naga = { version = "25", features = ["spv-out", "wgsl-in"] }
|
||||||
nix-1f5adca70f036a62 = { package = "nix", version = "0.28", features = ["fs", "mman", "ptrace", "signal", "term", "user"] }
|
nix-1f5adca70f036a62 = { package = "nix", version = "0.28", features = ["fs", "mman", "ptrace", "signal", "term", "user"] }
|
||||||
|
@ -494,6 +502,7 @@ inout = { version = "0.1", default-features = false, features = ["block-padding"
|
||||||
itertools-5ef9efb8ec2df382 = { package = "itertools", version = "0.12" }
|
itertools-5ef9efb8ec2df382 = { package = "itertools", version = "0.12" }
|
||||||
linux-raw-sys-274715c4dabd11b0 = { package = "linux-raw-sys", version = "0.9", default-features = false, features = ["elf", "errno", "general", "if_ether", "ioctl", "net", "netlink", "no_std", "prctl", "xdp"] }
|
linux-raw-sys-274715c4dabd11b0 = { package = "linux-raw-sys", version = "0.9", default-features = false, features = ["elf", "errno", "general", "if_ether", "ioctl", "net", "netlink", "no_std", "prctl", "xdp"] }
|
||||||
linux-raw-sys-9fbad63c4bcf4a8f = { package = "linux-raw-sys", version = "0.4", default-features = false, features = ["elf", "errno", "general", "if_ether", "ioctl", "net", "netlink", "no_std", "prctl", "system", "xdp"] }
|
linux-raw-sys-9fbad63c4bcf4a8f = { package = "linux-raw-sys", version = "0.4", default-features = false, features = ["elf", "errno", "general", "if_ether", "ioctl", "net", "netlink", "no_std", "prctl", "system", "xdp"] }
|
||||||
|
livekit-runtime = { git = "https://github.com/zed-industries/livekit-rust-sdks", rev = "5f04705ac3f356350ae31534ffbc476abc9ea83d" }
|
||||||
mio = { version = "1", features = ["net", "os-ext"] }
|
mio = { version = "1", features = ["net", "os-ext"] }
|
||||||
naga = { version = "25", features = ["spv-out", "wgsl-in"] }
|
naga = { version = "25", features = ["spv-out", "wgsl-in"] }
|
||||||
nix-1f5adca70f036a62 = { package = "nix", version = "0.28", features = ["fs", "mman", "ptrace", "signal", "term", "user"] }
|
nix-1f5adca70f036a62 = { package = "nix", version = "0.28", features = ["fs", "mman", "ptrace", "signal", "term", "user"] }
|
||||||
|
@ -535,6 +544,7 @@ inout = { version = "0.1", default-features = false, features = ["block-padding"
|
||||||
itertools-5ef9efb8ec2df382 = { package = "itertools", version = "0.12" }
|
itertools-5ef9efb8ec2df382 = { package = "itertools", version = "0.12" }
|
||||||
linux-raw-sys-274715c4dabd11b0 = { package = "linux-raw-sys", version = "0.9", default-features = false, features = ["elf", "errno", "general", "if_ether", "ioctl", "net", "netlink", "no_std", "prctl", "xdp"] }
|
linux-raw-sys-274715c4dabd11b0 = { package = "linux-raw-sys", version = "0.9", default-features = false, features = ["elf", "errno", "general", "if_ether", "ioctl", "net", "netlink", "no_std", "prctl", "xdp"] }
|
||||||
linux-raw-sys-9fbad63c4bcf4a8f = { package = "linux-raw-sys", version = "0.4", default-features = false, features = ["elf", "errno", "general", "if_ether", "ioctl", "net", "netlink", "no_std", "prctl", "system", "xdp"] }
|
linux-raw-sys-9fbad63c4bcf4a8f = { package = "linux-raw-sys", version = "0.4", default-features = false, features = ["elf", "errno", "general", "if_ether", "ioctl", "net", "netlink", "no_std", "prctl", "system", "xdp"] }
|
||||||
|
livekit-runtime = { git = "https://github.com/zed-industries/livekit-rust-sdks", rev = "5f04705ac3f356350ae31534ffbc476abc9ea83d" }
|
||||||
mio = { version = "1", features = ["net", "os-ext"] }
|
mio = { version = "1", features = ["net", "os-ext"] }
|
||||||
naga = { version = "25", features = ["spv-out", "wgsl-in"] }
|
naga = { version = "25", features = ["spv-out", "wgsl-in"] }
|
||||||
nix-1f5adca70f036a62 = { package = "nix", version = "0.28", features = ["fs", "mman", "ptrace", "signal", "term", "user"] }
|
nix-1f5adca70f036a62 = { package = "nix", version = "0.28", features = ["fs", "mman", "ptrace", "signal", "term", "user"] }
|
||||||
|
@ -564,6 +574,7 @@ getrandom-468e82937335b1c9 = { package = "getrandom", version = "0.3", default-f
|
||||||
getrandom-6f8ce4dd05d13bba = { package = "getrandom", version = "0.2", default-features = false, features = ["js", "rdrand"] }
|
getrandom-6f8ce4dd05d13bba = { package = "getrandom", version = "0.2", default-features = false, features = ["js", "rdrand"] }
|
||||||
hyper-rustls = { version = "0.27", default-features = false, features = ["http1", "http2", "native-tokio", "ring", "tls12"] }
|
hyper-rustls = { version = "0.27", default-features = false, features = ["http1", "http2", "native-tokio", "ring", "tls12"] }
|
||||||
itertools-5ef9efb8ec2df382 = { package = "itertools", version = "0.12" }
|
itertools-5ef9efb8ec2df382 = { package = "itertools", version = "0.12" }
|
||||||
|
livekit-runtime = { git = "https://github.com/zed-industries/livekit-rust-sdks", rev = "5f04705ac3f356350ae31534ffbc476abc9ea83d" }
|
||||||
ring = { version = "0.17", features = ["std"] }
|
ring = { version = "0.17", features = ["std"] }
|
||||||
rustix-d585fab2519d2d1 = { package = "rustix", version = "0.38", features = ["event"] }
|
rustix-d585fab2519d2d1 = { package = "rustix", version = "0.38", features = ["event"] }
|
||||||
scopeguard = { version = "1" }
|
scopeguard = { version = "1" }
|
||||||
|
@ -575,9 +586,9 @@ tower = { version = "0.5", default-features = false, features = ["timeout", "uti
|
||||||
winapi = { version = "0.3", default-features = false, features = ["cfg", "commapi", "consoleapi", "errhandlingapi", "evntrace", "fileapi", "handleapi", "impl-debug", "impl-default", "in6addr", "inaddr", "ioapiset", "knownfolders", "minwinbase", "minwindef", "namedpipeapi", "ntsecapi", "objbase", "processenv", "processthreadsapi", "shlobj", "std", "synchapi", "sysinfoapi", "timezoneapi", "winbase", "windef", "winerror", "winioctl", "winnt", "winreg", "winsock2", "winuser"] }
|
winapi = { version = "0.3", default-features = false, features = ["cfg", "commapi", "consoleapi", "errhandlingapi", "evntrace", "fileapi", "handleapi", "impl-debug", "impl-default", "in6addr", "inaddr", "ioapiset", "knownfolders", "minwinbase", "minwindef", "namedpipeapi", "ntsecapi", "objbase", "processenv", "processthreadsapi", "shlobj", "std", "synchapi", "sysinfoapi", "timezoneapi", "winbase", "windef", "winerror", "winioctl", "winnt", "winreg", "winsock2", "winuser"] }
|
||||||
windows-core = { version = "0.61" }
|
windows-core = { version = "0.61" }
|
||||||
windows-numerics = { version = "0.2" }
|
windows-numerics = { version = "0.2" }
|
||||||
windows-sys-73dcd821b1037cfd = { package = "windows-sys", version = "0.59", features = ["Wdk_Foundation", "Wdk_Storage_FileSystem", "Win32_Globalization", "Win32_NetworkManagement_IpHelper", "Win32_Networking_WinSock", "Win32_Security_Authentication_Identity", "Win32_Security_Credentials", "Win32_Security_Cryptography", "Win32_Storage_FileSystem", "Win32_System_Com", "Win32_System_Console", "Win32_System_Diagnostics_Debug", "Win32_System_IO", "Win32_System_Ioctl", "Win32_System_Kernel", "Win32_System_LibraryLoader", "Win32_System_Memory", "Win32_System_Performance", "Win32_System_Pipes", "Win32_System_Registry", "Win32_System_SystemInformation", "Win32_System_SystemServices", "Win32_System_Threading", "Win32_System_Time", "Win32_System_WindowsProgramming", "Win32_UI_Input_KeyboardAndMouse", "Win32_UI_Shell", "Win32_UI_WindowsAndMessaging"] }
|
windows-sys-73dcd821b1037cfd = { package = "windows-sys", version = "0.59", features = ["Wdk_Foundation", "Wdk_Storage_FileSystem", "Win32_Globalization", "Win32_Networking_WinSock", "Win32_Security_Authentication_Identity", "Win32_Security_Credentials", "Win32_Security_Cryptography", "Win32_Storage_FileSystem", "Win32_System_Com", "Win32_System_Console", "Win32_System_Diagnostics_Debug", "Win32_System_IO", "Win32_System_Kernel", "Win32_System_LibraryLoader", "Win32_System_Memory", "Win32_System_Registry", "Win32_System_SystemInformation", "Win32_System_Threading", "Win32_System_Time", "Win32_System_WindowsProgramming", "Win32_UI_Input_KeyboardAndMouse", "Win32_UI_Shell", "Win32_UI_WindowsAndMessaging"] }
|
||||||
windows-sys-b21d60becc0929df = { package = "windows-sys", version = "0.52", features = ["Wdk_Foundation", "Wdk_Storage_FileSystem", "Wdk_System_IO", "Win32_Foundation", "Win32_Networking_WinSock", "Win32_Security_Authorization", "Win32_Storage_FileSystem", "Win32_System_Console", "Win32_System_IO", "Win32_System_Memory", "Win32_System_Pipes", "Win32_System_SystemServices", "Win32_System_Threading", "Win32_System_WindowsProgramming"] }
|
windows-sys-b21d60becc0929df = { package = "windows-sys", version = "0.52", features = ["Wdk_Foundation", "Wdk_Storage_FileSystem", "Wdk_System_IO", "Win32_Foundation", "Win32_NetworkManagement_IpHelper", "Win32_Networking_WinSock", "Win32_Security_Authorization", "Win32_Security_Cryptography", "Win32_Storage_FileSystem", "Win32_System_Console", "Win32_System_Diagnostics_Debug", "Win32_System_IO", "Win32_System_Ioctl", "Win32_System_Kernel", "Win32_System_LibraryLoader", "Win32_System_Memory", "Win32_System_Performance", "Win32_System_Pipes", "Win32_System_SystemServices", "Win32_System_Threading", "Win32_System_Time", "Win32_System_WindowsProgramming"] }
|
||||||
windows-sys-c8eced492e86ede7 = { package = "windows-sys", version = "0.48", features = ["Win32_Foundation", "Win32_Globalization", "Win32_Networking_WinSock", "Win32_Security", "Win32_Storage_FileSystem", "Win32_System_Com", "Win32_System_Diagnostics_Debug", "Win32_System_IO", "Win32_System_Pipes", "Win32_System_Registry", "Win32_System_Threading", "Win32_System_Time", "Win32_System_WindowsProgramming", "Win32_UI_Shell"] }
|
windows-sys-c8eced492e86ede7 = { package = "windows-sys", version = "0.48", features = ["Win32_Foundation", "Win32_Globalization", "Win32_Networking_WinSock", "Win32_Security", "Win32_Storage_FileSystem", "Win32_System_Com", "Win32_System_Console", "Win32_System_Diagnostics_Debug", "Win32_System_IO", "Win32_System_Pipes", "Win32_System_Registry", "Win32_System_SystemInformation", "Win32_System_Threading", "Win32_System_Time", "Win32_System_WindowsProgramming", "Win32_UI_Shell"] }
|
||||||
|
|
||||||
[target.x86_64-pc-windows-msvc.build-dependencies]
|
[target.x86_64-pc-windows-msvc.build-dependencies]
|
||||||
codespan-reporting = { version = "0.12" }
|
codespan-reporting = { version = "0.12" }
|
||||||
|
@ -587,6 +598,7 @@ getrandom-468e82937335b1c9 = { package = "getrandom", version = "0.3", default-f
|
||||||
getrandom-6f8ce4dd05d13bba = { package = "getrandom", version = "0.2", default-features = false, features = ["js", "rdrand"] }
|
getrandom-6f8ce4dd05d13bba = { package = "getrandom", version = "0.2", default-features = false, features = ["js", "rdrand"] }
|
||||||
hyper-rustls = { version = "0.27", default-features = false, features = ["http1", "http2", "native-tokio", "ring", "tls12"] }
|
hyper-rustls = { version = "0.27", default-features = false, features = ["http1", "http2", "native-tokio", "ring", "tls12"] }
|
||||||
itertools-5ef9efb8ec2df382 = { package = "itertools", version = "0.12" }
|
itertools-5ef9efb8ec2df382 = { package = "itertools", version = "0.12" }
|
||||||
|
livekit-runtime = { git = "https://github.com/zed-industries/livekit-rust-sdks", rev = "5f04705ac3f356350ae31534ffbc476abc9ea83d" }
|
||||||
proc-macro2 = { version = "1", default-features = false, features = ["span-locations"] }
|
proc-macro2 = { version = "1", default-features = false, features = ["span-locations"] }
|
||||||
ring = { version = "0.17", features = ["std"] }
|
ring = { version = "0.17", features = ["std"] }
|
||||||
rustix-d585fab2519d2d1 = { package = "rustix", version = "0.38", features = ["event"] }
|
rustix-d585fab2519d2d1 = { package = "rustix", version = "0.38", features = ["event"] }
|
||||||
|
@ -599,9 +611,9 @@ tower = { version = "0.5", default-features = false, features = ["timeout", "uti
|
||||||
winapi = { version = "0.3", default-features = false, features = ["cfg", "commapi", "consoleapi", "errhandlingapi", "evntrace", "fileapi", "handleapi", "impl-debug", "impl-default", "in6addr", "inaddr", "ioapiset", "knownfolders", "minwinbase", "minwindef", "namedpipeapi", "ntsecapi", "objbase", "processenv", "processthreadsapi", "shlobj", "std", "synchapi", "sysinfoapi", "timezoneapi", "winbase", "windef", "winerror", "winioctl", "winnt", "winreg", "winsock2", "winuser"] }
|
winapi = { version = "0.3", default-features = false, features = ["cfg", "commapi", "consoleapi", "errhandlingapi", "evntrace", "fileapi", "handleapi", "impl-debug", "impl-default", "in6addr", "inaddr", "ioapiset", "knownfolders", "minwinbase", "minwindef", "namedpipeapi", "ntsecapi", "objbase", "processenv", "processthreadsapi", "shlobj", "std", "synchapi", "sysinfoapi", "timezoneapi", "winbase", "windef", "winerror", "winioctl", "winnt", "winreg", "winsock2", "winuser"] }
|
||||||
windows-core = { version = "0.61" }
|
windows-core = { version = "0.61" }
|
||||||
windows-numerics = { version = "0.2" }
|
windows-numerics = { version = "0.2" }
|
||||||
windows-sys-73dcd821b1037cfd = { package = "windows-sys", version = "0.59", features = ["Wdk_Foundation", "Wdk_Storage_FileSystem", "Win32_Globalization", "Win32_NetworkManagement_IpHelper", "Win32_Networking_WinSock", "Win32_Security_Authentication_Identity", "Win32_Security_Credentials", "Win32_Security_Cryptography", "Win32_Storage_FileSystem", "Win32_System_Com", "Win32_System_Console", "Win32_System_Diagnostics_Debug", "Win32_System_IO", "Win32_System_Ioctl", "Win32_System_Kernel", "Win32_System_LibraryLoader", "Win32_System_Memory", "Win32_System_Performance", "Win32_System_Pipes", "Win32_System_Registry", "Win32_System_SystemInformation", "Win32_System_SystemServices", "Win32_System_Threading", "Win32_System_Time", "Win32_System_WindowsProgramming", "Win32_UI_Input_KeyboardAndMouse", "Win32_UI_Shell", "Win32_UI_WindowsAndMessaging"] }
|
windows-sys-73dcd821b1037cfd = { package = "windows-sys", version = "0.59", features = ["Wdk_Foundation", "Wdk_Storage_FileSystem", "Win32_Globalization", "Win32_Networking_WinSock", "Win32_Security_Authentication_Identity", "Win32_Security_Credentials", "Win32_Security_Cryptography", "Win32_Storage_FileSystem", "Win32_System_Com", "Win32_System_Console", "Win32_System_Diagnostics_Debug", "Win32_System_IO", "Win32_System_Kernel", "Win32_System_LibraryLoader", "Win32_System_Memory", "Win32_System_Registry", "Win32_System_SystemInformation", "Win32_System_Threading", "Win32_System_Time", "Win32_System_WindowsProgramming", "Win32_UI_Input_KeyboardAndMouse", "Win32_UI_Shell", "Win32_UI_WindowsAndMessaging"] }
|
||||||
windows-sys-b21d60becc0929df = { package = "windows-sys", version = "0.52", features = ["Wdk_Foundation", "Wdk_Storage_FileSystem", "Wdk_System_IO", "Win32_Foundation", "Win32_Networking_WinSock", "Win32_Security_Authorization", "Win32_Storage_FileSystem", "Win32_System_Console", "Win32_System_IO", "Win32_System_Memory", "Win32_System_Pipes", "Win32_System_SystemServices", "Win32_System_Threading", "Win32_System_WindowsProgramming"] }
|
windows-sys-b21d60becc0929df = { package = "windows-sys", version = "0.52", features = ["Wdk_Foundation", "Wdk_Storage_FileSystem", "Wdk_System_IO", "Win32_Foundation", "Win32_NetworkManagement_IpHelper", "Win32_Networking_WinSock", "Win32_Security_Authorization", "Win32_Security_Cryptography", "Win32_Storage_FileSystem", "Win32_System_Console", "Win32_System_Diagnostics_Debug", "Win32_System_IO", "Win32_System_Ioctl", "Win32_System_Kernel", "Win32_System_LibraryLoader", "Win32_System_Memory", "Win32_System_Performance", "Win32_System_Pipes", "Win32_System_SystemServices", "Win32_System_Threading", "Win32_System_Time", "Win32_System_WindowsProgramming"] }
|
||||||
windows-sys-c8eced492e86ede7 = { package = "windows-sys", version = "0.48", features = ["Win32_Foundation", "Win32_Globalization", "Win32_Networking_WinSock", "Win32_Security", "Win32_Storage_FileSystem", "Win32_System_Com", "Win32_System_Diagnostics_Debug", "Win32_System_IO", "Win32_System_Pipes", "Win32_System_Registry", "Win32_System_Threading", "Win32_System_Time", "Win32_System_WindowsProgramming", "Win32_UI_Shell"] }
|
windows-sys-c8eced492e86ede7 = { package = "windows-sys", version = "0.48", features = ["Win32_Foundation", "Win32_Globalization", "Win32_Networking_WinSock", "Win32_Security", "Win32_Storage_FileSystem", "Win32_System_Com", "Win32_System_Console", "Win32_System_Diagnostics_Debug", "Win32_System_IO", "Win32_System_Pipes", "Win32_System_Registry", "Win32_System_SystemInformation", "Win32_System_Threading", "Win32_System_Time", "Win32_System_WindowsProgramming", "Win32_UI_Shell"] }
|
||||||
|
|
||||||
[target.x86_64-unknown-linux-musl.dependencies]
|
[target.x86_64-unknown-linux-musl.dependencies]
|
||||||
aes = { version = "0.8", default-features = false, features = ["zeroize"] }
|
aes = { version = "0.8", default-features = false, features = ["zeroize"] }
|
||||||
|
@ -621,6 +633,7 @@ inout = { version = "0.1", default-features = false, features = ["block-padding"
|
||||||
itertools-5ef9efb8ec2df382 = { package = "itertools", version = "0.12" }
|
itertools-5ef9efb8ec2df382 = { package = "itertools", version = "0.12" }
|
||||||
linux-raw-sys-274715c4dabd11b0 = { package = "linux-raw-sys", version = "0.9", default-features = false, features = ["elf", "errno", "general", "if_ether", "ioctl", "net", "netlink", "no_std", "prctl", "xdp"] }
|
linux-raw-sys-274715c4dabd11b0 = { package = "linux-raw-sys", version = "0.9", default-features = false, features = ["elf", "errno", "general", "if_ether", "ioctl", "net", "netlink", "no_std", "prctl", "xdp"] }
|
||||||
linux-raw-sys-9fbad63c4bcf4a8f = { package = "linux-raw-sys", version = "0.4", default-features = false, features = ["elf", "errno", "general", "if_ether", "ioctl", "net", "netlink", "no_std", "prctl", "system", "xdp"] }
|
linux-raw-sys-9fbad63c4bcf4a8f = { package = "linux-raw-sys", version = "0.4", default-features = false, features = ["elf", "errno", "general", "if_ether", "ioctl", "net", "netlink", "no_std", "prctl", "system", "xdp"] }
|
||||||
|
livekit-runtime = { git = "https://github.com/zed-industries/livekit-rust-sdks", rev = "5f04705ac3f356350ae31534ffbc476abc9ea83d" }
|
||||||
mio = { version = "1", features = ["net", "os-ext"] }
|
mio = { version = "1", features = ["net", "os-ext"] }
|
||||||
naga = { version = "25", features = ["spv-out", "wgsl-in"] }
|
naga = { version = "25", features = ["spv-out", "wgsl-in"] }
|
||||||
nix-1f5adca70f036a62 = { package = "nix", version = "0.28", features = ["fs", "mman", "ptrace", "signal", "term", "user"] }
|
nix-1f5adca70f036a62 = { package = "nix", version = "0.28", features = ["fs", "mman", "ptrace", "signal", "term", "user"] }
|
||||||
|
@ -662,6 +675,7 @@ inout = { version = "0.1", default-features = false, features = ["block-padding"
|
||||||
itertools-5ef9efb8ec2df382 = { package = "itertools", version = "0.12" }
|
itertools-5ef9efb8ec2df382 = { package = "itertools", version = "0.12" }
|
||||||
linux-raw-sys-274715c4dabd11b0 = { package = "linux-raw-sys", version = "0.9", default-features = false, features = ["elf", "errno", "general", "if_ether", "ioctl", "net", "netlink", "no_std", "prctl", "xdp"] }
|
linux-raw-sys-274715c4dabd11b0 = { package = "linux-raw-sys", version = "0.9", default-features = false, features = ["elf", "errno", "general", "if_ether", "ioctl", "net", "netlink", "no_std", "prctl", "xdp"] }
|
||||||
linux-raw-sys-9fbad63c4bcf4a8f = { package = "linux-raw-sys", version = "0.4", default-features = false, features = ["elf", "errno", "general", "if_ether", "ioctl", "net", "netlink", "no_std", "prctl", "system", "xdp"] }
|
linux-raw-sys-9fbad63c4bcf4a8f = { package = "linux-raw-sys", version = "0.4", default-features = false, features = ["elf", "errno", "general", "if_ether", "ioctl", "net", "netlink", "no_std", "prctl", "system", "xdp"] }
|
||||||
|
livekit-runtime = { git = "https://github.com/zed-industries/livekit-rust-sdks", rev = "5f04705ac3f356350ae31534ffbc476abc9ea83d" }
|
||||||
mio = { version = "1", features = ["net", "os-ext"] }
|
mio = { version = "1", features = ["net", "os-ext"] }
|
||||||
naga = { version = "25", features = ["spv-out", "wgsl-in"] }
|
naga = { version = "25", features = ["spv-out", "wgsl-in"] }
|
||||||
nix-1f5adca70f036a62 = { package = "nix", version = "0.28", features = ["fs", "mman", "ptrace", "signal", "term", "user"] }
|
nix-1f5adca70f036a62 = { package = "nix", version = "0.28", features = ["fs", "mman", "ptrace", "signal", "term", "user"] }
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue