1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
# The third-party graph, as one manifest for reindeer to vendor and generate
# BUCK targets from. Every external crate the workspace's four members depend
# on appears here once, with the union of the features they ask for; first-party
# crates keep their own BUCK files and depend on `//third-party/rust:<name>`.
#
# Android-only dependencies are at the bottom, in a target section, so their
# features are resolved for the device and unified into nothing else.
[package]
name = "jolt-native-third-party"
version = "0.0.0"
edition = "2021"
publish = false
# Its own workspace: reindeer resolves this graph on its own, and the root
# workspace must not try to make it a member.
[workspace]
# Nothing is compiled from here; the manifest exists to pin a graph.
[lib]
path = "lib.rs"
[dependencies]
anyhow = "1"
# cpal's cross-platform sample trait; see the note above the patch table.
dasp_sample = "0.11"
# `image-data` is the clipboard path for a pasted picture; egui does not deliver
# one. Desktop only — arboard has no Android backend.
arboard = { version = "3", default-features = false, features = ["image-data"] }
# Without cpal's `pipewire` feature, which is on by default under cargo: it
# builds libspa-sys, which wants pkg-config and PipeWire's headers on the build
# machine — the one system dependency the zig toolchain cannot stand in for.
# The buck2 build is therefore `--no-default-features` shaped for now: ALSA PCM
# names only, everything else equal.
cpal = { path = "cpal" }
# `default_fonts` because a shared library has no host app to install a font set
# for it. vidya-core turns egui's defaults off; the union is what gets built.
egui = { version = "0.31", features = ["default_fonts"] }
egui-winit = "0.31"
egui_glow = "0.31"
env_logger = "0.11"
glow = "0.16"
glutin = "0.32"
glutin-winit = "0.5"
# JPEG only — the V4L2 path converts MJPEG frames, and nothing here reads or
# writes a picture file.
image = { version = "0.25", default-features = false, features = ["jpeg"] }
iroh-live = { git = "https://github.com/n0-computer/iroh-live", rev = "edd9bcc530a615f3ab3a6919e96790a077905376", default-features = false, features = [
"opus",
"h264",
"capture-camera",
] }
libc = "0.2"
log = "0.4"
moq-lite = { git = "https://github.com/Frando/moq", branch = "deps/iroh-main" }
moq-native = { git = "https://github.com/Frando/moq", branch = "deps/iroh-main", default-features = false, features = [
"noq",
"websocket",
"aws-lc-rs",
] }
mp4 = "0.14"
n0-future = "0.3"
# C++, which is why the toolchain needs both halves of zig.
openh264 = { version = "0.9", default-features = false, features = ["source"] }
png = "0.17"
rand = "0.8"
# aws-lc-rs rather than ring, to match what moq-native and iroh already pull in.
rustls = { version = "0.23", default-features = false, features = ["aws-lc-rs"] }
tokio = { version = "1", features = ["rt-multi-thread", "macros", "sync", "time"] }
# One query parameter (`inst=`) needs escaping. That is the whole use.
urlencoding = "2"
url = "2"
# V4L2 capture: the fallback path for cameras rusty-capture mishandles.
v4l2r = "0.0.7"
winit = "0.30"
zip = { version = "2", default-features = false, features = ["deflate"] }
# Carried over from the workspace root verbatim: iroh-live wants an unreleased
# iroh 0.97, and the revs are the ones freeq locks. They travel together and are
# not independently bumpable.
# cpal's own dependencies, named here so reindeer gives them public aliases:
# the hand-written target in cpal/BUCK lives in a different package, and
# reindeer only makes top-level deps visible outside its own.
[target.'cfg(any(target_os = "linux", target_os = "dragonfly", target_os = "freebsd", target_os = "netbsd"))'.dependencies]
alsa = "0.11"
[target.'cfg(target_vendor = "apple")'.dependencies]
coreaudio-rs = { version = "0.14", default-features = false, features = ["core_audio", "audio_toolbox"] }
mach2 = "0.5"
objc2 = "0.6"
objc2-audio-toolbox = { version = "0.3", default-features = false, features = ["std", "AUComponent", "AudioUnitProperties"] }
objc2-core-audio = { version = "0.3", default-features = false, features = ["std", "AudioHardware", "AudioHardwareDeprecated", "objc2", "objc2-foundation"] }
objc2-core-audio-types = { version = "0.3", default-features = false, features = ["std", "CoreAudioBaseTypes"] }
objc2-core-foundation = "0.3"
objc2-foundation = "0.3"
# The device. libjoltmoq does not cross — the media plane is V4L2 and PipeWire —
# so this is libvidya's half of the graph and nothing else.
[target.'cfg(target_os = "android")'.dependencies]
# `vidya_open_url` is an ACTION_VIEW intent there, which is a JNI call against
# the activity the glue holds.
#
# Renamed because cpal wants jni 0.21 on the same platform, and cpal is a path
# dependency above — so reindeer gives its deps public aliases too, and two
# crates called `jni` cannot both have one. The consumer says `named_deps`.
jni-0-22 = { package = "jni", version = "0.22" }
# The feature is what pulls in android-activity, and android-activity is what
# owns the event loop: the APK's NativeActivity has no Java main to call into,
# so the glue is the entry point. Without it the crate compiles to a backend of
# no platform at all and fails on its own imports.
winit = { version = "0.30", features = ["android-native-activity"] }
[patch.crates-io]
iroh = { git = "https://github.com/n0-computer/iroh", rev = "8af8370b" }
iroh-base = { git = "https://github.com/n0-computer/iroh", rev = "8af8370b" }
iroh-relay = { git = "https://github.com/n0-computer/iroh", rev = "8af8370b" }
iroh-gossip = { git = "https://github.com/n0-computer/iroh-gossip", rev = "1038f721" }
noq = { git = "https://github.com/n0-computer/noq", rev = "ab042ea7e3f7bae1e43eaba2ac9dba47ddb52e69" }
noq-proto = { git = "https://github.com/n0-computer/noq", rev = "ab042ea7e3f7bae1e43eaba2ac9dba47ddb52e69" }
noq-udp = { git = "https://github.com/n0-computer/noq", rev = "ab042ea7e3f7bae1e43eaba2ac9dba47ddb52e69" }
web-transport-iroh = { git = "https://github.com/Frando/web-transport", rev = "f7a523f1" }
web-transport-noq = { git = "https://github.com/Frando/web-transport", rev = "f7a523f1" }
web-transport-proto = { git = "https://github.com/Frando/web-transport", rev = "f7a523f1" }
web-transport-trait = { git = "https://github.com/Frando/web-transport", rev = "f7a523f1" }
# moq-media (inside iroh-live) asks for cpal on `branch = "master"`, which
# floats, and master no longer compiles against the iroh-live rev pinned above.
# The vendored copy is the last commit that does — 63ea9ff upstream, per its
# .cargo_vcs_info.json. It has to be a path rather than that rev: cargo
# canonicalises the URL, so naming the same repo without `.git` is still "the
# same source", which a patch may not retarget.
[patch."https://github.com/RustAudio/cpal.git"]
cpal = { path = "cpal" }
|