From c7f4c7ee420157560e5ef3fa0e59648dff04515b Mon Sep 17 00:00:00 2001 From: james7132 Date: Fri, 3 Jun 2022 20:45:06 -0700 Subject: [PATCH 1/2] Switch to using smallvec --- Cargo.lock | 25 ++++++++----------------- Cargo.toml | 2 +- src/audio.rs | 6 +++--- src/lib.rs | 2 +- 4 files changed, 13 insertions(+), 22 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5db74c1..98ff11c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -159,7 +159,7 @@ dependencies = [ "byteorder", "futures", "ogg", - "tinyvec", + "smallvec 1.8.0", "tokio-io", ] @@ -275,7 +275,7 @@ checksum = "4db1a8ccf734a7bce794cc19b3df06ed87ab2f3907036b693c68f56b4d4537fa" dependencies = [ "libc", "rand 0.4.6", - "smallvec", + "smallvec 0.6.13", "winapi", ] @@ -405,6 +405,12 @@ dependencies = [ "maybe-uninit", ] +[[package]] +name = "smallvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" + [[package]] name = "socket2" version = "0.3.19" @@ -443,21 +449,6 @@ dependencies = [ "sha2", ] -[[package]] -name = "tinyvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b78a366903f506d2ad52ca8dc552102ffdd3e937ba8a227f024dc1d1eae28575" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" - [[package]] name = "tokio-io" version = "0.1.12" diff --git a/Cargo.toml b/Cargo.toml index 2aef838..9c55832 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,7 +30,7 @@ required-features = ["ogg"] [dependencies] byteorder = "1.0" -tinyvec = { version = "1.0", features = ["alloc"] } +smallvec= { version = "1.0" } ogg = { version = "0.8", optional = true } tokio-io = { version = "0.1", optional = true } futures = { version = "0.1", optional = true } diff --git a/src/audio.rs b/src/audio.rs index 525ceb0..777e60b 100644 --- a/src/audio.rs +++ b/src/audio.rs @@ -16,7 +16,7 @@ use std::error; use std::fmt; use std::cmp::min; use std::iter; -use tinyvec::TinyVec; +use smallvec::SmallVec; use crate::ilog; use bitpacking::BitpackCursor; use header::{Codebook, Floor, FloorTypeZero, FloorTypeOne, @@ -940,7 +940,7 @@ pub fn read_audio_packet_generic(ident :&IdentHeader, setup :&SetupH &setup.codebooks, &setup.floors)); // Now calculate the no_residue vector - let mut no_residue = TinyVec::<[bool; 32]>::new(); + let mut no_residue = SmallVec::<[bool; 32]>::new(); for fl in &decoded_floor_infos { no_residue.push(fl.is_unused()); } @@ -958,7 +958,7 @@ pub fn read_audio_packet_generic(ident :&IdentHeader, setup :&SetupH // Helper variable let resid_vec_len = (n / 2) as usize; for (i, &residue_number) in mapping.mapping_submap_residues.iter().enumerate() { - let mut do_not_decode_flag = TinyVec::<[bool; 32]>::new(); + let mut do_not_decode_flag = SmallVec::<[bool; 32]>::new(); for (j, &mapping_mux_j) in mapping.mapping_mux.iter().enumerate() { if mapping_mux_j as usize == i { do_not_decode_flag.push(no_residue[j]); diff --git a/src/lib.rs b/src/lib.rs index 85a43c7..2ae4a69 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -22,7 +22,7 @@ modules. */ extern crate byteorder; -extern crate tinyvec; +extern crate smallvec; #[cfg(feature = "ogg")] extern crate ogg; #[cfg(feature = "async_ogg")] From 2b3fca264ae76e259a296c4d0f889f959ca07026 Mon Sep 17 00:00:00 2001 From: james7132 Date: Fri, 3 Oct 2025 23:24:12 -0700 Subject: [PATCH 2/2] Change to not use the stack at all if possible. --- Cargo.lock | 321 ++++++++++++++++++++++++++++++++++++++++++++++---- Cargo.toml | 5 +- src/audio.rs | 15 +-- src/header.rs | 10 +- src/lib.rs | 1 - 5 files changed, 315 insertions(+), 37 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 98ff11c..190ca4f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,21 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addr2line" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + [[package]] name = "al-sys" version = "0.6.1" @@ -30,6 +45,27 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" +[[package]] +name = "backtrace" +version = "0.3.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" +dependencies = [ + "addr2line", + "cfg-if 1.0.0", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-link", +] + +[[package]] +name = "bitflags" +version = "2.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" + [[package]] name = "byteorder" version = "1.3.2" @@ -46,6 +82,12 @@ dependencies = [ "iovec", ] +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + [[package]] name = "cc" version = "1.0.50" @@ -124,12 +166,47 @@ version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b980f2816d6ee8673b6517b52cb0e808a180efc92e5c19d02cdda79066703ef" +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + [[package]] name = "gcc" version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" +[[package]] +name = "gimli" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" + +[[package]] +name = "io-uring" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" +dependencies = [ + "bitflags", + "cfg-if 1.0.0", + "libc", +] + [[package]] name = "iovec" version = "0.1.4" @@ -159,15 +236,14 @@ dependencies = [ "byteorder", "futures", "ogg", - "smallvec 1.8.0", "tokio-io", ] [[package]] name = "libc" -version = "0.2.66" +version = "0.2.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558" +checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" [[package]] name = "libloading" @@ -206,16 +282,54 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +dependencies = [ + "libc", + "wasi", + "windows-sys", +] + +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +dependencies = [ + "memchr", +] + [[package]] name = "ogg" -version = "0.8.0" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6951b4e8bf21c8193da321bcce9c9dd2e13c858fe078bf9054a288b419ae5d6e" +checksum = "fdab8dcd8d4052eaacaf8fb07a3ccd9a6e26efadb42878a413c68fc4af1dee2b" dependencies = [ "byteorder", - "bytes", - "futures", - "tokio-io", + "bytes 1.10.1", + "futures-core", + "futures-io", + "pin-project", + "tokio", + "tokio-util", ] [[package]] @@ -275,10 +389,36 @@ checksum = "4db1a8ccf734a7bce794cc19b3df06ed87ab2f3907036b693c68f56b4d4537fa" dependencies = [ "libc", "rand 0.4.6", - "smallvec 0.6.13", + "smallvec", "winapi", ] +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + [[package]] name = "pkg-config" version = "0.3.17" @@ -287,18 +427,18 @@ checksum = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677" [[package]] name = "proc-macro2" -version = "1.0.8" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acb317c6ff86a4e579dfa00fc5e6cca91ecbb4e7eb2df0468805b674eb88548" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] name = "quote" -version = "1.0.2" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" dependencies = [ "proc-macro2", ] @@ -368,9 +508,15 @@ checksum = "475e68978dc5b743f2f40d8e0a8fdc83f1c5e78cbf4b8fa5e74e73beebc340de" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.14", ] +[[package]] +name = "rustc-demangle" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" + [[package]] name = "rustc-serialize" version = "0.3.24" @@ -396,6 +542,12 @@ dependencies = [ "rustc-serialize", ] +[[package]] +name = "slab" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + [[package]] name = "smallvec" version = "0.6.13" @@ -405,12 +557,6 @@ dependencies = [ "maybe-uninit", ] -[[package]] -name = "smallvec" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" - [[package]] name = "socket2" version = "0.3.19" @@ -439,6 +585,17 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "syn" +version = "2.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "test-assets" version = "0.2.0" @@ -449,17 +606,52 @@ dependencies = [ "sha2", ] +[[package]] +name = "tokio" +version = "1.47.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" +dependencies = [ + "backtrace", + "io-uring", + "libc", + "mio", + "pin-project-lite", + "slab", +] + [[package]] name = "tokio-io" version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5090db468dad16e1a7a54c8c67280c5e4b544f3d3e018f0b913b400261f85926" dependencies = [ - "bytes", + "bytes 0.4.12", "futures", "log", ] +[[package]] +name = "tokio-util" +version = "0.6.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" +dependencies = [ + "bytes 1.10.1", + "futures-core", + "futures-io", + "futures-sink", + "log", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "unicode-ident" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" + [[package]] name = "unicode-xid" version = "0.2.0" @@ -524,6 +716,12 @@ dependencies = [ "vorbis-sys", ] +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + [[package]] name = "winapi" version = "0.3.8" @@ -545,3 +743,82 @@ 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-link" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" diff --git a/Cargo.toml b/Cargo.toml index 9c55832..b88296c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,13 +30,12 @@ required-features = ["ogg"] [dependencies] byteorder = "1.0" -smallvec= { version = "1.0" } -ogg = { version = "0.8", optional = true } +ogg = { version = "0.9", optional = true } tokio-io = { version = "0.1", optional = true } futures = { version = "0.1", optional = true } [dev-dependencies] -ogg = "0.8" +ogg = "0.9" alto = "3" [package.metadata.docs.rs] diff --git a/src/audio.rs b/src/audio.rs index 777e60b..4d639f9 100644 --- a/src/audio.rs +++ b/src/audio.rs @@ -16,7 +16,6 @@ use std::error; use std::fmt; use std::cmp::min; use std::iter; -use smallvec::SmallVec; use crate::ilog; use bitpacking::BitpackCursor; use header::{Codebook, Floor, FloorTypeZero, FloorTypeOne, @@ -940,9 +939,9 @@ pub fn read_audio_packet_generic(ident :&IdentHeader, setup :&SetupH &setup.codebooks, &setup.floors)); // Now calculate the no_residue vector - let mut no_residue = SmallVec::<[bool; 32]>::new(); - for fl in &decoded_floor_infos { - no_residue.push(fl.is_unused()); + let mut no_residue = [false; 256]; + for (i, fl) in decoded_floor_infos.iter().enumerate() { + no_residue[i] = fl.is_unused(); } // and also propagate for (&mag, &angle) in @@ -958,15 +957,17 @@ pub fn read_audio_packet_generic(ident :&IdentHeader, setup :&SetupH // Helper variable let resid_vec_len = (n / 2) as usize; for (i, &residue_number) in mapping.mapping_submap_residues.iter().enumerate() { - let mut do_not_decode_flag = SmallVec::<[bool; 32]>::new(); + let mut do_not_decode_flag = [false; 256]; + let mut dnd_i = 0; for (j, &mapping_mux_j) in mapping.mapping_mux.iter().enumerate() { if mapping_mux_j as usize == i { - do_not_decode_flag.push(no_residue[j]); + do_not_decode_flag[dnd_i] = no_residue[j]; + dnd_i += 1; } } let cur_residue = &setup.residues[residue_number as usize]; let vectors = match residue_packet_decode(&mut rdr, n, - &do_not_decode_flag, cur_residue, &setup.codebooks) { + &do_not_decode_flag[..dnd_i], cur_residue, &setup.codebooks) { Ok(v) => v, Err(_) => return Err(AudioReadError::AudioBadFormat), }; diff --git a/src/header.rs b/src/header.rs index 4431321..c777879 100644 --- a/src/header.rs +++ b/src/header.rs @@ -380,7 +380,7 @@ pub(crate) struct Residue { pub(crate) struct Mapping { pub mapping_magnitudes :Vec, pub mapping_angles :Vec, - pub mapping_mux :Vec, + pub mapping_mux : [u8; 256], pub mapping_submap_floors :Vec, pub mapping_submap_residues :Vec, } @@ -1008,18 +1008,20 @@ fn read_mapping(rdr :&mut BitpackCursor, try!(Err(HeaderReadError::HeaderBadFormat)); } let mapping_mux = if mapping_submaps > 1 { - let mut m = Vec::with_capacity(audio_channels as usize); + let mut m = [0; 256]; + let mut m_i = 0; for _ in 0 .. audio_channels { let val = try!(rdr.read_u4()); if val >= mapping_submaps { // Undecodable per spec try!(Err(HeaderReadError::HeaderBadFormat)); } - m.push(val); + m[m_i] = val; + m_i += 1; }; m } else { - vec![0; audio_channels as usize] + [0; 256] }; let mut mapping_submap_floors = Vec::with_capacity(mapping_submaps as usize); let mut mapping_submap_residues = Vec::with_capacity(mapping_submaps as usize); diff --git a/src/lib.rs b/src/lib.rs index 2ae4a69..8f864fc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -22,7 +22,6 @@ modules. */ extern crate byteorder; -extern crate smallvec; #[cfg(feature = "ogg")] extern crate ogg; #[cfg(feature = "async_ogg")]