flac_bound/encoder/
callbacks.rs

1#[cfg(feature = "flac")]
2use flac_sys::{FLAC__StreamEncoder, FLAC__StreamEncoderWriteStatus, FLAC__StreamEncoderWriteStatus_FLAC__STREAM_ENCODER_WRITE_STATUS_OK,
3               FLAC__StreamEncoderWriteStatus_FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR};
4
5#[cfg(feature = "libflac-nobuild")]
6use libflac_sys::{FLAC__StreamEncoder, FLAC__StreamEncoderWriteStatus,
7                  FLAC__STREAM_ENCODER_WRITE_STATUS_OK as FLAC__StreamEncoderWriteStatus_FLAC__STREAM_ENCODER_WRITE_STATUS_OK,
8                  FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR as FLAC__StreamEncoderWriteStatus_FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR};
9
10use std::os::raw::{c_uint, c_void};
11use std::io::Write;
12use std::slice;
13
14
15/// This wrapper is necessary due to [fat pointers](https://chat.stackoverflow.com/transcript/message/47940937#47940937).
16///
17/// # Examples
18///
19/// ```
20/// # use flac_bound::{WriteWrapper, FlacEncoder};
21/// # use std::fs::File;
22/// let mut outf = File::create("ЦшЦ.flac").unwrap();
23/// let mut outw = WriteWrapper(&mut outf);
24/// let mut outs = FlacEncoder::new().unwrap().init_write(&mut outw).unwrap();
25///
26/// outs.process_interleaved(&[0xA1, 0xF3], 1).unwrap();
27/// ```
28pub struct WriteWrapper<'out>(pub &'out mut dyn Write);
29
30
31pub unsafe extern "C" fn flac_encoder_write_write_callback(_: *const FLAC__StreamEncoder, buffer: *const u8, bytes: usize, _: c_uint, _: c_uint,
32                                                           client_data: *mut c_void)
33                                                           -> FLAC__StreamEncoderWriteStatus {
34    let out = &mut (*(client_data as *mut WriteWrapper<'static>)).0;
35
36    match out.write_all(slice::from_raw_parts(buffer, bytes)) {
37        Ok(_) => FLAC__StreamEncoderWriteStatus_FLAC__STREAM_ENCODER_WRITE_STATUS_OK,
38        Err(_) => FLAC__StreamEncoderWriteStatus_FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR,
39    }
40}