diff --git a/Cargo.lock b/Cargo.lock index c149460..e8ae0ee 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -56,12 +56,6 @@ dependencies = [ "serde", ] -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" - [[package]] name = "async-stream" version = "0.3.6" @@ -2050,6 +2044,12 @@ dependencies = [ "regex-syntax 0.8.5", ] +[[package]] +name = "regex-lite" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" + [[package]] name = "regex-syntax" version = "0.6.29" @@ -2483,8 +2483,7 @@ dependencies = [ [[package]] name = "symphonia" version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "815c942ae7ee74737bb00f965fa5b5a2ac2ce7b6c01c0cc169bbeaf7abd5f5a9" +source = "git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6#c7efbcb05dde274d13a50b4f7aac9db4c773f602" dependencies = [ "lazy_static", "symphonia-bundle-flac", @@ -2506,32 +2505,28 @@ dependencies = [ [[package]] name = "symphonia-bundle-flac" version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72e34f34298a7308d4397a6c7fbf5b84c5d491231ce3dd379707ba673ab3bd97" +source = "git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6#c7efbcb05dde274d13a50b4f7aac9db4c773f602" dependencies = [ "log", + "symphonia-common", "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" +source = "git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6#c7efbcb05dde274d13a50b4f7aac9db4c773f602" 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" +source = "git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6#c7efbcb05dde274d13a50b4f7aac9db4c773f602" dependencies = [ "lazy_static", "log", @@ -2541,8 +2536,7 @@ dependencies = [ [[package]] name = "symphonia-codec-adpcm" version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c94e1feac3327cd616e973d5be69ad36b3945f16b06f19c6773fc3ac0b426a0f" +source = "git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6#c7efbcb05dde274d13a50b4f7aac9db4c773f602" dependencies = [ "log", "symphonia-core", @@ -2551,8 +2545,7 @@ dependencies = [ [[package]] name = "symphonia-codec-alac" version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d8a6666649a08412906476a8b0efd9b9733e241180189e9f92b09c08d0e38f3" +source = "git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6#c7efbcb05dde274d13a50b4f7aac9db4c773f602" dependencies = [ "log", "symphonia-core", @@ -2561,8 +2554,7 @@ dependencies = [ [[package]] name = "symphonia-codec-pcm" version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f395a67057c2ebc5e84d7bb1be71cce1a7ba99f64e0f0f0e303a03f79116f89b" +source = "git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6#c7efbcb05dde274d13a50b4f7aac9db4c773f602" dependencies = [ "log", "symphonia-core", @@ -2571,81 +2563,81 @@ dependencies = [ [[package]] name = "symphonia-codec-vorbis" version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a98765fb46a0a6732b007f7e2870c2129b6f78d87db7987e6533c8f164a9f30" +source = "git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6#c7efbcb05dde274d13a50b4f7aac9db4c773f602" dependencies = [ "log", + "symphonia-common", + "symphonia-core", +] + +[[package]] +name = "symphonia-common" +version = "0.5.4" +source = "git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6#c7efbcb05dde274d13a50b4f7aac9db4c773f602" +dependencies = [ "symphonia-core", - "symphonia-utils-xiph", + "symphonia-metadata", ] [[package]] name = "symphonia-core" version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "798306779e3dc7d5231bd5691f5a813496dc79d3f56bf82e25789f2094e022c3" +source = "git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6#c7efbcb05dde274d13a50b4f7aac9db4c773f602" dependencies = [ - "arrayvec", - "bitflags 1.3.2", + "bitflags 2.8.0", "bytemuck", "lazy_static", "log", + "num-complex", + "smallvec", ] [[package]] name = "symphonia-format-caf" version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e43c99c696a388295a29fe71b133079f5d8b18041cf734c5459c35ad9097af50" +source = "git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6#c7efbcb05dde274d13a50b4f7aac9db4c773f602" dependencies = [ "log", "symphonia-core", - "symphonia-metadata", ] [[package]] name = "symphonia-format-isomp4" version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abfdf178d697e50ce1e5d9b982ba1b94c47218e03ec35022d9f0e071a16dc844" +source = "git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6#c7efbcb05dde274d13a50b4f7aac9db4c773f602" dependencies = [ - "encoding_rs", "log", + "symphonia-common", "symphonia-core", "symphonia-metadata", - "symphonia-utils-xiph", ] [[package]] name = "symphonia-format-mkv" version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bb43471a100f7882dc9937395bd5ebee8329298e766250b15b3875652fe3d6f" +source = "git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6#c7efbcb05dde274d13a50b4f7aac9db4c773f602" dependencies = [ "lazy_static", "log", + "symphonia-common", "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" +source = "git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6#c7efbcb05dde274d13a50b4f7aac9db4c773f602" dependencies = [ "log", + "symphonia-common", "symphonia-core", "symphonia-metadata", - "symphonia-utils-xiph", ] [[package]] name = "symphonia-format-riff" version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f7be232f962f937f4b7115cbe62c330929345434c834359425e043bfd15f50" +source = "git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6#c7efbcb05dde274d13a50b4f7aac9db4c773f602" dependencies = [ "extended", "log", @@ -2656,25 +2648,15 @@ dependencies = [ [[package]] name = "symphonia-metadata" version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc622b9841a10089c5b18e99eb904f4341615d5aa55bbf4eedde1be721a4023c" +source = "git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6#c7efbcb05dde274d13a50b4f7aac9db4c773f602" dependencies = [ - "encoding_rs", "lazy_static", "log", + "regex-lite", + "smallvec", "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]] name = "syn" version = "2.0.98" diff --git a/mania-codec/Cargo.toml b/mania-codec/Cargo.toml index 7bd5418..6f68e9d 100644 --- a/mania-codec/Cargo.toml +++ b/mania-codec/Cargo.toml @@ -8,7 +8,9 @@ license-file.workspace = true num-traits = "0.2.19" rubato = "0.16.1" silk-sys = "0.1.0" -symphonia = { version = "0.5.4", features = ["all"] } +symphonia = { git = "https://github.com/pdeljanov/Symphonia.git", branch = "dev-0.6", features = [ + "all", +] } thiserror.workspace = true num_enum.workspace = true bytes.workspace = true diff --git a/mania-codec/src/audio.rs b/mania-codec/src/audio.rs index a816833..796e6d8 100644 --- a/mania-codec/src/audio.rs +++ b/mania-codec/src/audio.rs @@ -5,8 +5,8 @@ use num_traits::FromPrimitive; use std::io; use std::io::{Read, Seek}; use std::marker::PhantomData; -use symphonia::core::conv::{FromSample, IntoSample}; -use symphonia::core::sample::{i24, u24}; +use symphonia::core::audio::conv::{FromSample, IntoSample}; +use symphonia::core::audio::sample::{i24, u24}; use thiserror::Error; pub mod decoder; diff --git a/mania-codec/src/audio/decoder.rs b/mania-codec/src/audio/decoder.rs index 5faac77..dd9a23f 100644 --- a/mania-codec/src/audio/decoder.rs +++ b/mania-codec/src/audio/decoder.rs @@ -6,7 +6,9 @@ use thiserror::Error; #[derive(Debug, Error)] pub enum AudioCodecDecoderError { #[error("Symphonia decoder error: {0}")] - SymphoniaError(#[from] symphonia::core::errors::Error), + SymphoniaKnownError(#[from] symphonia::core::errors::Error), + #[error("Unknown Symphonia decoder error: {0}")] + SymphoniaUnknownError(String), } pub trait AudioDecoder { diff --git a/mania-codec/src/audio/decoder/symphonia_decoder.rs b/mania-codec/src/audio/decoder/symphonia_decoder.rs index 3b8082d..ccf613f 100644 --- a/mania-codec/src/audio/decoder/symphonia_decoder.rs +++ b/mania-codec/src/audio/decoder/symphonia_decoder.rs @@ -2,12 +2,12 @@ use crate::audio::decoder::{AudioCodecDecoderError, AudioDecoder}; use crate::audio::{AudioInfo, AudioResampleStream, AudioRwStream, DecodeSample, RSStream}; use std::io::{Read, Seek, SeekFrom}; use std::marker::PhantomData; -use symphonia::core::audio::{AudioBufferRef, Signal}; -use symphonia::core::codecs::CODEC_TYPE_NULL; -use symphonia::core::formats::FormatOptions; +use symphonia::core::audio::{Audio, GenericAudioBufferRef}; +use symphonia::core::codecs::audio::AudioDecoderOptions; +use symphonia::core::formats::probe::Hint; +use symphonia::core::formats::{FormatOptions, TrackType}; use symphonia::core::io::{MediaSource, MediaSourceStream}; use symphonia::core::meta::MetadataOptions; -use symphonia::core::probe::Hint; struct RSStreamAdapter { inner: Box, @@ -66,12 +66,17 @@ impl Default for SymphoniaDecoder { } // FIXME: It is now just a rigid conversion to mono (in the form of [0])! -fn conv(samples: &mut Vec, data: std::borrow::Cow>) +fn conv(samples: &mut Vec, data: &symphonia::core::audio::AudioBuffer) where - T: symphonia::core::sample::Sample, - S: symphonia::core::conv::FromSample, + T: symphonia::core::audio::sample::Sample, + S: symphonia::core::audio::conv::FromSample, { - samples.extend(data.chan(0).iter().map(|v| S::from_sample(*v))); + samples.extend( + data.plane(0) + .unwrap_or(&[]) // TODO: avoid unwrap_or (? + .iter() + .map(|v| S::from_sample(*v)), + ); } // ref: https://github.com/kyutai-labs/hibiki/blob/main/hibiki-rs/src/audio_io.rs @@ -90,22 +95,43 @@ impl AudioDecoder for SymphoniaDecoder { }; let mss = MediaSourceStream::new(Box::new(adapter), Default::default()); let hint = Hint::new(); - let meta_opts: MetadataOptions = Default::default(); let fmt_opts: FormatOptions = Default::default(); - let probed = symphonia::default::get_probe().format(&hint, mss, &fmt_opts, &meta_opts)?; - let mut format = probed.format; - let track = format - .tracks() - .iter() - .find(|t| t.codec_params.codec != CODEC_TYPE_NULL) - .expect("no supported audio tracks"); - let mut decoder = symphonia::default::get_codecs() - .make(&track.codec_params, &Default::default()) - .expect("unsupported codec"); + let meta_opts: MetadataOptions = Default::default(); + let dec_opts: AudioDecoderOptions = Default::default(); + let mut format = symphonia::default::get_probe().probe(&hint, mss, fmt_opts, meta_opts)?; + let track = format.default_track(TrackType::Audio).ok_or( + AudioCodecDecoderError::SymphoniaUnknownError("no audio track".to_string()), + )?; + let mut decoder = symphonia::default::get_codecs().make_audio_decoder( + track + .codec_params + .as_ref() + .ok_or(AudioCodecDecoderError::SymphoniaUnknownError( + "codec parameters missing".to_string(), + ))? + .audio() + .ok_or(AudioCodecDecoderError::SymphoniaUnknownError( + "audio parameters missing".to_string(), + ))?, + &dec_opts, + )?; let track_id = track.id; - let sample_rate = track.codec_params.sample_rate.unwrap_or(0); + let sample_rate = track + .codec_params + .as_ref() + .ok_or(AudioCodecDecoderError::SymphoniaUnknownError( + "codec parameters missing".to_string(), + ))? + .audio() + .ok_or(AudioCodecDecoderError::SymphoniaUnknownError( + "audio parameters missing".to_string(), + ))? + .sample_rate + .ok_or(AudioCodecDecoderError::SymphoniaUnknownError( + "sample rate missing".to_string(), + ))?; let mut pcm_data = Vec::new(); - while let Ok(packet) = format.next_packet() { + while let Ok(Some(packet)) = format.next_packet() { while !format.metadata().is_latest() { format.metadata().pop(); } @@ -113,16 +139,17 @@ impl AudioDecoder for SymphoniaDecoder { continue; } match decoder.decode(&packet)? { - AudioBufferRef::F32(data) => conv(&mut pcm_data, data), - AudioBufferRef::U8(data) => conv(&mut pcm_data, data), - AudioBufferRef::U16(data) => conv(&mut pcm_data, data), - AudioBufferRef::U24(data) => conv(&mut pcm_data, data), - AudioBufferRef::U32(data) => conv(&mut pcm_data, data), - AudioBufferRef::S8(data) => conv(&mut pcm_data, data), - AudioBufferRef::S16(data) => conv(&mut pcm_data, data), - AudioBufferRef::S24(data) => conv(&mut pcm_data, data), - AudioBufferRef::S32(data) => conv(&mut pcm_data, data), - AudioBufferRef::F64(data) => conv(&mut pcm_data, data), + // TODO: samples.resize(audio_buf.samples_interleaved(), f32::MID); + GenericAudioBufferRef::F32(data) => conv(&mut pcm_data, data), + GenericAudioBufferRef::U8(data) => conv(&mut pcm_data, data), + GenericAudioBufferRef::U16(data) => conv(&mut pcm_data, data), + GenericAudioBufferRef::U24(data) => conv(&mut pcm_data, data), + GenericAudioBufferRef::U32(data) => conv(&mut pcm_data, data), + GenericAudioBufferRef::S8(data) => conv(&mut pcm_data, data), + GenericAudioBufferRef::S16(data) => conv(&mut pcm_data, data), + GenericAudioBufferRef::S24(data) => conv(&mut pcm_data, data), + GenericAudioBufferRef::S32(data) => conv(&mut pcm_data, data), + GenericAudioBufferRef::F64(data) => conv(&mut pcm_data, data), } } Ok(AudioResampleStream {