use super::{
errors::AcceptWaveformError,
results::{result_from_json_c_str, Word},
};
use crate::models::BatchModel;
use vosk_sys::*;
use std::ptr::NonNull;
pub struct BatchRecognizer(std::ptr::NonNull<VoskBatchRecognizer>);
impl BatchRecognizer {
#[must_use]
pub fn new(model: &BatchModel, sample_rate: f32) -> Option<Self> {
let recognizer_ptr = unsafe { vosk_batch_recognizer_new(model.0.as_ptr(), sample_rate) };
Some(Self(NonNull::new(recognizer_ptr)?))
}
pub fn set_nlsml(&mut self, enable: bool) {
unsafe { vosk_batch_recognizer_set_nlsml(self.0.as_ptr(), i32::from(enable)) }
}
pub fn accept_waveform(&mut self, data: &[i8]) -> Result<(), AcceptWaveformError> {
let len = data.len();
unsafe {
vosk_batch_recognizer_accept_waveform(
self.0.as_ptr(),
data.as_ptr(),
i32::try_from(len).map_err(|_| AcceptWaveformError::BufferTooLong(len))?,
)
};
Ok(())
}
pub fn finish_stream(&mut self) {
unsafe { vosk_batch_recognizer_finish_stream(self.0.as_ptr()) };
}
pub fn front_result(&mut self) -> Word {
unsafe { result_from_json_c_str(vosk_batch_recognizer_front_result(self.0.as_ptr())) }
}
pub fn pop(&mut self) {
unsafe { vosk_batch_recognizer_pop(self.0.as_ptr()) }
}
pub fn get_pending_chunks(&mut self) -> u32 {
u32::try_from(unsafe { vosk_batch_recognizer_get_pending_chunks(self.0.as_ptr()) }).unwrap()
}
}
unsafe impl Send for BatchRecognizer {}
unsafe impl Sync for BatchRecognizer {}
impl Drop for BatchRecognizer {
fn drop(&mut self) {
unsafe { vosk_batch_recognizer_free(self.0.as_ptr()) }
}
}