diff --git a/.gitignore b/.gitignore index 3d5cb63..0222fdc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,67 @@ /target .idea -.DS_Store \ No newline at end of file +.DS_Store + +## User settings +xcuserdata/ + +## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) +*.xcscmblueprint +*.xccheckout + +## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) +build/ +DerivedData/ +*.moved-aside +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 + +## Obj-C/Swift specific +*.hmap + +## App packaging +*.ipa +*.dSYM.zip +*.dSYM + +## Playgrounds +timeline.xctimeline +playground.xcworkspace + +.build/ + +# fastlane +# It is recommended to not store the screenshots in the git repo. +# Instead, use fastlane to re-generate the screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://docs.fastlane.tools/best-practices/source-control/#source-control + +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots/**/*.png +fastlane/test_output + +### SwiftPackageManager ### +Packages +xcuserdata +*.xcodeproj + +### Xcode ### +# Xcode +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## Gcc Patch +/*.gcno + +### Xcode Patch ### +*.xcodeproj/* +!*.xcodeproj/project.pbxproj +!*.xcodeproj/xcshareddata/ +!*.xcworkspace/contents.xcworkspacedata +**/xcshareddata/WorkspaceSettings.xcsettings diff --git a/Cargo.lock b/Cargo.lock index 0590845..4b78b41 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -635,6 +635,14 @@ dependencies = [ "rodio", ] +[[package]] +name = "monolib" +version = "0.1.0" +dependencies = [ + "byteorder", + "rodio", +] + [[package]] name = "ndk" version = "0.7.0" diff --git a/Cargo.toml b/Cargo.toml index 8be46ab..745d13e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = ["monoclient"] +members = ["monoclient", "platform/swiftui/monolib"] [package] name = "lonelyradio" diff --git a/README.md b/README.md index 5d35d31..6747120 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ cargo build -r lonelyradio [-a ] [-p] [-w] ``` -All files (recursively) will be shuffled and played back. Public log will be displayed to stderr, private to stdout. +All files (recursively) will be shuffled and played back. Public log will be displayed to stdout, private to stderr. ### Clients @@ -40,6 +40,10 @@ MPV nc | mpv --audio-channels=stereo --audio-samplerate=44100 --demuxer-rawaudio-format=s16le --demuxer=rawaudio - ``` +### Other clients + +SwiftUI client is availible in [platform](./platform) directory. + ## License lonelyradio and monoclient are licensed under the terms of the [MIT license](./LICENSE). diff --git a/platform/README.md b/platform/README.md new file mode 100644 index 0000000..313c80e --- /dev/null +++ b/platform/README.md @@ -0,0 +1,23 @@ +# Platform-specific player realizations + +## Rust + SwiftUI (iOS/iPadOS/macOS (iOS mode)) + +### Build `monolib` + +Run in `monolib` directory + +``` +cargo lipo --release --targets aarch64-apple-ios +``` + +For running in simulator + +``` +cargo lipo --release --targets aarch64-apple-ios-sim,x86_64-apple-ios +``` + +### Build and run app + +Open Xcode and run. + +[Screenshots](./screenshots/swiftui) diff --git a/platform/screenshots/swiftui/iphone1.png b/platform/screenshots/swiftui/iphone1.png new file mode 100644 index 0000000..c1e4c41 Binary files /dev/null and b/platform/screenshots/swiftui/iphone1.png differ diff --git a/platform/screenshots/swiftui/iphone2.png b/platform/screenshots/swiftui/iphone2.png new file mode 100644 index 0000000..5f2ec61 Binary files /dev/null and b/platform/screenshots/swiftui/iphone2.png differ diff --git a/platform/screenshots/swiftui/macos_dark.png b/platform/screenshots/swiftui/macos_dark.png new file mode 100644 index 0000000..4e99b84 Binary files /dev/null and b/platform/screenshots/swiftui/macos_dark.png differ diff --git a/platform/screenshots/swiftui/macos_light.png b/platform/screenshots/swiftui/macos_light.png new file mode 100644 index 0000000..92d64da Binary files /dev/null and b/platform/screenshots/swiftui/macos_light.png differ diff --git a/platform/swiftui/MonoLib-Bridging-Header.h b/platform/swiftui/MonoLib-Bridging-Header.h new file mode 100644 index 0000000..9ae8bb1 --- /dev/null +++ b/platform/swiftui/MonoLib-Bridging-Header.h @@ -0,0 +1,14 @@ +// +// MonoLib-Bridging-Header.h +// monoclient +// +// Created by ivabus on 03.03.2024. +// + +#ifndef MonoLib_Bridging_Header_h +#define MonoLib_Bridging_Header_h + + +#import "monolib.h" + +#endif /* MonoLib_Bridging_Header_h */ diff --git a/platform/swiftui/monoclient/Assets.xcassets/AccentColor.colorset/Contents.json b/platform/swiftui/monoclient/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..2c9cdaf --- /dev/null +++ b/platform/swiftui/monoclient/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,15 @@ +{ + "colors" : [ + { + "color" : { + "platform" : "ios", + "reference" : "systemPinkColor" + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/platform/swiftui/monoclient/Assets.xcassets/AppIcon.appiconset/Contents.json b/platform/swiftui/monoclient/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..a1e9135 --- /dev/null +++ b/platform/swiftui/monoclient/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,74 @@ +{ + "images" : [ + { + "filename" : "icon-1024@1x.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "filename" : "icon-16@1x.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "16x16" + }, + { + "filename" : "icon-16@2x.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "16x16" + }, + { + "filename" : "icon-32@1x.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "32x32" + }, + { + "filename" : "icon-32@2x.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "32x32" + }, + { + "filename" : "icon-128@1x.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "128x128" + }, + { + "filename" : "icon-128@2x.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "128x128" + }, + { + "filename" : "icon-256@1x.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "256x256" + }, + { + "filename" : "icon-256@2x.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "256x256" + }, + { + "filename" : "icon-512@1x.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "512x512" + }, + { + "filename" : "icon-512@2x.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "512x512" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/platform/swiftui/monoclient/Assets.xcassets/AppIcon.appiconset/icon-1024@1x.png b/platform/swiftui/monoclient/Assets.xcassets/AppIcon.appiconset/icon-1024@1x.png new file mode 100644 index 0000000..69da806 Binary files /dev/null and b/platform/swiftui/monoclient/Assets.xcassets/AppIcon.appiconset/icon-1024@1x.png differ diff --git a/platform/swiftui/monoclient/Assets.xcassets/AppIcon.appiconset/icon-128@1x.png b/platform/swiftui/monoclient/Assets.xcassets/AppIcon.appiconset/icon-128@1x.png new file mode 100644 index 0000000..e111ebb Binary files /dev/null and b/platform/swiftui/monoclient/Assets.xcassets/AppIcon.appiconset/icon-128@1x.png differ diff --git a/platform/swiftui/monoclient/Assets.xcassets/AppIcon.appiconset/icon-128@2x.png b/platform/swiftui/monoclient/Assets.xcassets/AppIcon.appiconset/icon-128@2x.png new file mode 100644 index 0000000..8b3dc2b Binary files /dev/null and b/platform/swiftui/monoclient/Assets.xcassets/AppIcon.appiconset/icon-128@2x.png differ diff --git a/platform/swiftui/monoclient/Assets.xcassets/AppIcon.appiconset/icon-16@1x.png b/platform/swiftui/monoclient/Assets.xcassets/AppIcon.appiconset/icon-16@1x.png new file mode 100644 index 0000000..755d55a Binary files /dev/null and b/platform/swiftui/monoclient/Assets.xcassets/AppIcon.appiconset/icon-16@1x.png differ diff --git a/platform/swiftui/monoclient/Assets.xcassets/AppIcon.appiconset/icon-16@2x.png b/platform/swiftui/monoclient/Assets.xcassets/AppIcon.appiconset/icon-16@2x.png new file mode 100644 index 0000000..d4c5813 Binary files /dev/null and b/platform/swiftui/monoclient/Assets.xcassets/AppIcon.appiconset/icon-16@2x.png differ diff --git a/platform/swiftui/monoclient/Assets.xcassets/AppIcon.appiconset/icon-256@1x.png b/platform/swiftui/monoclient/Assets.xcassets/AppIcon.appiconset/icon-256@1x.png new file mode 100644 index 0000000..8b3dc2b Binary files /dev/null and b/platform/swiftui/monoclient/Assets.xcassets/AppIcon.appiconset/icon-256@1x.png differ diff --git a/platform/swiftui/monoclient/Assets.xcassets/AppIcon.appiconset/icon-256@2x.png b/platform/swiftui/monoclient/Assets.xcassets/AppIcon.appiconset/icon-256@2x.png new file mode 100644 index 0000000..246e82b Binary files /dev/null and b/platform/swiftui/monoclient/Assets.xcassets/AppIcon.appiconset/icon-256@2x.png differ diff --git a/platform/swiftui/monoclient/Assets.xcassets/AppIcon.appiconset/icon-32@1x.png b/platform/swiftui/monoclient/Assets.xcassets/AppIcon.appiconset/icon-32@1x.png new file mode 100644 index 0000000..d4c5813 Binary files /dev/null and b/platform/swiftui/monoclient/Assets.xcassets/AppIcon.appiconset/icon-32@1x.png differ diff --git a/platform/swiftui/monoclient/Assets.xcassets/AppIcon.appiconset/icon-32@2x.png b/platform/swiftui/monoclient/Assets.xcassets/AppIcon.appiconset/icon-32@2x.png new file mode 100644 index 0000000..01edb8b Binary files /dev/null and b/platform/swiftui/monoclient/Assets.xcassets/AppIcon.appiconset/icon-32@2x.png differ diff --git a/platform/swiftui/monoclient/Assets.xcassets/AppIcon.appiconset/icon-512@1x.png b/platform/swiftui/monoclient/Assets.xcassets/AppIcon.appiconset/icon-512@1x.png new file mode 100644 index 0000000..246e82b Binary files /dev/null and b/platform/swiftui/monoclient/Assets.xcassets/AppIcon.appiconset/icon-512@1x.png differ diff --git a/platform/swiftui/monoclient/Assets.xcassets/AppIcon.appiconset/icon-512@2x.png b/platform/swiftui/monoclient/Assets.xcassets/AppIcon.appiconset/icon-512@2x.png new file mode 100644 index 0000000..69da806 Binary files /dev/null and b/platform/swiftui/monoclient/Assets.xcassets/AppIcon.appiconset/icon-512@2x.png differ diff --git a/platform/swiftui/monoclient/Assets.xcassets/Contents.json b/platform/swiftui/monoclient/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/platform/swiftui/monoclient/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/platform/swiftui/monoclient/ContentView.swift b/platform/swiftui/monoclient/ContentView.swift new file mode 100644 index 0000000..4efde8d --- /dev/null +++ b/platform/swiftui/monoclient/ContentView.swift @@ -0,0 +1,90 @@ +// +// ContentView.swift +// monoclient +// +// Created by ivabus on 03.03.2024. +// + +import AVFAudio +import SwiftUI + +class MonoLib { + func run(server: String) async { + let audioSession = AVAudioSession.sharedInstance() + do { + try audioSession.setCategory( + .playback, mode: .default, + policy: .longFormAudio) + try audioSession.setActive(true) + + } catch { + print("Failed to set the audio session configuration") + } + start(server) + } +} + +struct ContentView: View { + @State private var server: String = "" + @State private var port: String = "" + @State private var playing: Bool = true + @State private var running: Bool = false + + var body: some View { + VStack { + Text("Monoclient").font(.largeTitle).fontWidth(.expanded).bold() //.padding(.top, 25) + VStack(alignment: .center) { + HStack { + Text("Server").frame(minWidth: 50, idealWidth: 60) + TextField( + "Required", + text: $server + ) + .disableAutocorrection(true) + + } + .textFieldStyle(.roundedBorder) + HStack { + Text("Port").frame(minWidth: 50, idealWidth: 60) + TextField( + "Required", + text: $port + ) + .disableAutocorrection(true).keyboardType(.numberPad).keyboardShortcut(.escape) + } + .textFieldStyle(.roundedBorder) + + Button(action: { + if running { + playing = !playing + toggle() + } + running = true + let a = MonoLib() + Task.init { + await a.run(server: server + ":" + port) + } + }) { + Image( + systemName: running + ? (playing ? "pause.circle.fill" : "play.circle") : "infinity.circle" + ).font(.largeTitle) + }.buttonStyle( + .borderedProminent) + Button(action: { + reset() + running = false + playing = true + }) { Image(systemName: "stop").font(.title3) }.buttonStyle( + .bordered + ).disabled(!running) + }.frame(width: 300) + + }.padding() + + } +} + +#Preview { + ContentView() +} diff --git a/platform/swiftui/monoclient/Info.plist b/platform/swiftui/monoclient/Info.plist new file mode 100644 index 0000000..fde3c78 --- /dev/null +++ b/platform/swiftui/monoclient/Info.plist @@ -0,0 +1,12 @@ + + + + + UIBackgroundModes + + audio + fetch + processing + + + diff --git a/platform/swiftui/monoclient/Preview Content/Preview Assets.xcassets/Contents.json b/platform/swiftui/monoclient/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/platform/swiftui/monoclient/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/platform/swiftui/monoclient/monoclient.entitlements b/platform/swiftui/monoclient/monoclient.entitlements new file mode 100644 index 0000000..f2ef3ae --- /dev/null +++ b/platform/swiftui/monoclient/monoclient.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.files.user-selected.read-only + + + diff --git a/platform/swiftui/monoclient/monoclientApp.swift b/platform/swiftui/monoclient/monoclientApp.swift new file mode 100644 index 0000000..d69f3ca --- /dev/null +++ b/platform/swiftui/monoclient/monoclientApp.swift @@ -0,0 +1,17 @@ +// +// monoclientApp.swift +// monoclient +// +// Created by ivabus on 03.03.2024. +// + +import SwiftUI + +@main +struct monoclientApp: App { + var body: some Scene { + WindowGroup { + ContentView() + } + } +} diff --git a/platform/swiftui/monolib/Cargo.lock b/platform/swiftui/monolib/Cargo.lock new file mode 100644 index 0000000..42c32ad --- /dev/null +++ b/platform/swiftui/monolib/Cargo.lock @@ -0,0 +1,944 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "aho-corasick" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +dependencies = [ + "memchr", +] + +[[package]] +name = "alsa" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2562ad8dcf0f789f65c6fdaad8a8a9708ed6b488e649da28c01656ad66b8b47" +dependencies = [ + "alsa-sys", + "bitflags 1.3.2", + "libc", + "nix", +] + +[[package]] +name = "alsa-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db8fee663d06c4e303404ef5f40488a53e062f89ba8bfed81f42325aafad1527" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "bindgen" +version = "0.69.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c69fae65a523209d34240b60abe0c42d33d1045d445c0839d8a4894a736e2d" +dependencies = [ + "bitflags 2.4.2", + "cexpr", + "clang-sys", + "lazy_static", + "lazycell", + "peeking_take_while", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.48", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" + +[[package]] +name = "bumpalo" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" + +[[package]] +name = "cc" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "jobserver", + "libc", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "clang-sys" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "combine" +version = "4.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "coreaudio-rs" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "321077172d79c662f64f5071a03120748d5bb652f5231570141be24cfcd2bace" +dependencies = [ + "bitflags 1.3.2", + "core-foundation-sys", + "coreaudio-sys", +] + +[[package]] +name = "coreaudio-sys" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f01585027057ff5f0a5bf276174ae4c1594a2c5bde93d5f46a016d76270f5a9" +dependencies = [ + "bindgen", +] + +[[package]] +name = "cpal" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d959d90e938c5493000514b446987c07aed46c668faaa7d34d6c7a67b1a578c" +dependencies = [ + "alsa", + "core-foundation-sys", + "coreaudio-rs", + "dasp_sample", + "jni 0.19.0", + "js-sys", + "libc", + "mach2", + "ndk", + "ndk-context", + "oboe", + "once_cell", + "parking_lot", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows", +] + +[[package]] +name = "dasp_sample" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f" + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" + +[[package]] +name = "indexmap" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824b2ae422412366ba479e8111fd301f7b5faece8149317bb81925979a53f520" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "jni" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" +dependencies = [ + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", +] + +[[package]] +name = "jni" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c" +dependencies = [ + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a1d36f1235bc969acba30b7f5990b864423a6068a10f7c90ae8f0112e3a59d1" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + +[[package]] +name = "libc" +version = "0.2.153" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" + +[[package]] +name = "libloading" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c571b676ddfc9a8c12f1f3d3085a7b163966a8fd8098a90640953ce5f6170161" +dependencies = [ + "cfg-if", + "windows-sys", +] + +[[package]] +name = "lock_api" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" + +[[package]] +name = "mach2" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" +dependencies = [ + "libc", +] + +[[package]] +name = "memchr" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "monolib" +version = "0.1.0" +dependencies = [ + "byteorder", + "rodio", +] + +[[package]] +name = "ndk" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "451422b7e4718271c8b5b3aadf5adedba43dc76312454b387e98fae0fc951aa0" +dependencies = [ + "bitflags 1.3.2", + "jni-sys", + "ndk-sys", + "num_enum", + "raw-window-handle", + "thiserror", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.4.1+23.1.7779620" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cf2aae958bd232cac5069850591667ad422d263686d75b52a065f9badeee5a3" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "nix" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "num-derive" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "num-traits" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "oboe" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8868cc237ee02e2d9618539a23a8d228b9bb3fc2e7a5b11eed3831de77c395d0" +dependencies = [ + "jni 0.20.0", + "ndk", + "ndk-context", + "num-derive", + "num-traits", + "oboe-sys", +] + +[[package]] +name = "oboe-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f44155e7fb718d3cfddcf70690b2b51ac4412f347cd9e4fbe511abe9cd7b5f2" +dependencies = [ + "cc", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.48.5", +] + +[[package]] +name = "peeking_take_while" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" + +[[package]] +name = "pkg-config" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb" + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "raw-window-handle" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "regex" +version = "1.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" + +[[package]] +name = "rodio" +version = "0.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b1bb7b48ee48471f55da122c0044fcc7600cfcc85db88240b89cb832935e611" +dependencies = [ + "cpal", +] + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "smallvec" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "toml_datetime" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "walkdir" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1223296a201415c7fad14792dbefaace9bd52b62d33453ade1c5b5f07555406" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcdc935b63408d58a32f8cc9738a0bffd8f05cc7c002086c6ef20b7312ad9dcd" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.48", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bde2032aeb86bdfaecc8b261eef3cba735cc426c1f3a3416d1e0791be95fc461" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e4c238561b2d428924c49815533a8b9121c664599558a5d9ec51f8a1740a999" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bae1abb6806dc1ad9e560ed242107c0f6c84335f1749dd4e8ddb012ebd5e25a7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b" + +[[package]] +name = "web-sys" +version = "0.3.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58cd2333b6e0be7a39605f0e255892fd7418a682d8da8fe042fe25128794d2ed" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdacb41e6a96a052c6cb63a144f24900236121c6f63f4f8219fef5977ecb0c25" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "winnow" +version = "0.5.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7cad8365489051ae9f054164e459304af2e7e9bb407c958076c8bf4aef52da5" +dependencies = [ + "memchr", +] diff --git a/platform/swiftui/monolib/Cargo.toml b/platform/swiftui/monolib/Cargo.toml new file mode 100644 index 0000000..4b4d132 --- /dev/null +++ b/platform/swiftui/monolib/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "monolib" +version = "0.1.0" +edition = "2021" +license = "MIT" + +[dependencies] +rodio = { version = "0.17.3", default-features = false } +byteorder = "1.5.0" + +[lib] +name = "monolib" +crate-type = ["staticlib", "cdylib"] diff --git a/platform/swiftui/monolib/src/lib.rs b/platform/swiftui/monolib/src/lib.rs new file mode 100644 index 0000000..7130d71 --- /dev/null +++ b/platform/swiftui/monolib/src/lib.rs @@ -0,0 +1,126 @@ +use byteorder::ByteOrder; +use rodio::buffer::SamplesBuffer; +use rodio::{OutputStream, Sink}; +use std::ffi::CStr; +use std::io::Read; +use std::net::TcpStream; +use std::os::raw::c_char; + +// How many samples to cache before playing in samples (both channels) SHOULD BE EVEN +const BUFFER_SIZE: usize = 2400; +// How many buffers to cache +const CACHE_SIZE: usize = 40; + +static mut SINK: Option> = None; +static mut RUNNING: bool = false; +static mut STOPPED: bool = false; +static mut RESET: bool = false; + +#[no_mangle] +pub extern "C" fn start(server: *const c_char) { + let serv = unsafe { CStr::from_ptr(server) }; + unsafe { + run(match serv.to_str() { + Ok(s) => s, + _ => "", + }) + } +} + +#[no_mangle] +pub extern "C" fn toggle() { + unsafe { + if !STOPPED { + STOPPED = true; + if let Some(sink) = &SINK { + sink.pause(); + } + } else { + STOPPED = false; + if let Some(sink) = &SINK { + sink.play(); + } + } + } +} + +#[no_mangle] +pub extern "C" fn reset() { + unsafe { + RESET = true; + // Blocking main thread + while RESET { + std::thread::sleep(std::time::Duration::from_secs_f32(0.02)) + } + } +} + +unsafe fn run(server: &str) { + if RUNNING { + return; + } + RUNNING = true; + let mut stream = TcpStream::connect(server).unwrap(); + println!("Connected to {} from {}", stream.peer_addr().unwrap(), stream.local_addr().unwrap()); + let (_stream, stream_handle) = OutputStream::try_default().unwrap(); + match &SINK { + None => { + let sink = Sink::try_new(&stream_handle).unwrap(); + SINK = Some(Box::new(sink)); + } + Some(s) => { + if s.is_paused() { + s.play() + } + } + } + let mut buffer = [0u8; 4]; + let mut samples = [0f32; BUFFER_SIZE]; + let mut index = 0usize; + while stream.read_exact(&mut buffer).is_ok() { + while STOPPED { + std::thread::sleep(std::time::Duration::from_secs_f32(0.5)) + } + if RESET { + RUNNING = false; + STOPPED = false; + + if let Some(sink) = &SINK { + sink.pause(); + sink.clear(); + } + SINK = None; + RESET = false; + return; + } + let sample_l = byteorder::LittleEndian::read_i16(&buffer[..2]) as f32 / 32768.0; + let sample_r = byteorder::LittleEndian::read_i16(&buffer[2..]) as f32 / 32768.0; + // Left channel + samples[index] = sample_l; + index += 1; + // Right channel + samples[index] = sample_r; + index += 1; + if index == BUFFER_SIZE { + // Sink's thread is detached from main thread, so we need to synchronize with it + // Why we should synchronize with it? + // Let's say, that if we don't synchronize with it, we would have + // a lot (no upper limit, actualy) of buffered sound, waiting for playing in sink + if let Some(sink) = &SINK { + while sink.len() >= CACHE_SIZE { + // Sleeping exactly one buffer + std::thread::sleep(std::time::Duration::from_secs_f32( + (if sink.len() >= 2 { + sink.len() - 2 + } else { + 1 + } as f32) * BUFFER_SIZE as f32 + / 44100.0 / 2.0, + )) + } + sink.append(SamplesBuffer::new(2, 44100, samples.as_slice())); + index = 0; + } + } + } +} diff --git a/platform/swiftui/monolib/src/monolib.h b/platform/swiftui/monolib/src/monolib.h new file mode 100644 index 0000000..7e49ae3 --- /dev/null +++ b/platform/swiftui/monolib/src/monolib.h @@ -0,0 +1,7 @@ +#include + +void start(const char *server); + +void toggle(); + +void reset();