katyo / aubio-rs

Rust bindings for Aubio library
37 stars 7 forks source link

Segmentation fault(core dumped) #21

Open dataO1 opened 2 years ago

dataO1 commented 2 years ago

I am trying to do tempo detection on a mp3 file decoded by symphonia, but everythime I do let tempo = tempo.do_result(samples).unwrap(); I get a segfault.

I tried to properly handling the result, which didn't help. I also tried the builtin for a standalone solution and pkg-config flags with aubio installed as a library package, which also didn't help. I guess the error is coming from the underlying C code? Maybe the formatting of the samples is wrong or something?

Example Code ``` pub fn get_tempo(file_path: &str) -> f32 { // let mut reader = WavReader::open("./test.wav").unwrap(); let mut reader = Player::new_reader(file_path); let track = reader.default_track().unwrap(); let num_samples = track.codec_params.n_frames.unwrap(); let sample_rate = track.codec_params.sample_rate.unwrap(); // let sample_format = track.codec_params.sample_format.unwrap(); let dec_opts: DecoderOptions = DecoderOptions { verify: true, ..Default::default() }; let mut decoder = symphonia::default::get_codecs() .make(&track.codec_params, &dec_opts) .unwrap(); let mut samples = vec![0 as f32; num_samples as usize]; let mut tempo = Tempo::new(aubio::OnsetMode::Hfc, 1024, 512, sample_rate).unwrap(); let mut sample_buf: Option> = None; while let Ok(p) = reader.next_packet() { let audio_buf = decoder.decode(&p).unwrap(); // let num_samples = audio_buf.frames(); // Copy the decoded audio buffer into the sample buffer in an interleaved format. match &mut sample_buf { Some(buf) => { buf.copy_interleaved_ref(audio_buf); let packet_samples = buf.samples(); // println!("{:#?}", packet_samples); samples.extend_from_slice(packet_samples); } None => { println!("init sample buffer!"); let spec = *audio_buf.spec(); // Get the capacity of the decoded buffer. Note: This is capacity, not length! let duration = audio_buf.capacity() as u64; // Create the f32 sample buffer. sample_buf = Some(SampleBuffer::::new(duration, spec)); } } } println!("starting analysis"); let tempo = match tempo.do_result(samples) { Ok(x) => x, Err(err) => { println!("{:#?}", err); 0 as f32 } }; tempo } ```
RUGMJ commented 1 year ago

Having the same error with pitch detection, did you find a solution?