blob: 77c5056e30276b018f87a919bcdf3f70c2f48056 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/*!
Provides an asynchronous wrapper around the StreamProcessor API to encode/decode audio packets.
The main object to use is the StreamProcessor with either the `create_encoder` or `create_decoder` methods which are passed the input audio parameters and the
encoder settings to provide to the StreamProcessor for the encoder case. The `input_domain`
can be found as `fidl_fuchsia_media::DomainFormat` and it must be one of the Audio formats. The
`encoder_settings` is found as `fidl_fuchsia_media::EncoderSettings`.
After creating the encoder/decoder, audio input data can be provided either by using the StreamProcessor as an
`AsyncWrite` provider. The resulting audio is provided via the output stream which can
be acquired via the `StreamProcessor::take_output_stream` call.
# Example
```rust
let pcm_format = PcmFormat {
pcm_mode: AudioPcmMode::Linear,
bits_per_sample: 16,
frames_per_second: 44100,
channel_map: vec![AudioChannelId::Cf],
};
// Some sample SBC encoder settings.
let sbc_encoder_settings = EncoderSettings::Sbc(SbcEncoderSettings {
sub_bands,
block_count,
allocation: SbcAllocation::AllocLoudness,
channel_mode: SbcChannelMode::Mono,
bit_pool: 59,
});
// Read a WAV file into memory.
let mut raw_audio = Vec::new();
File::open("sample.wav")?.read_to_end(&mut raw_audio)?;
let encoder = StreamProcessor::create_encoder(pcm_format, sbc_encoder_settings);
// 44 bytes offset skips the RIFF header in the wav file.
// Delivering 16 audio frames at once that are 2 bytes each
for audio_frames in raw_audio[44..].chunks(2 * 16) {
encoder.write(&audio_frames).await?;
}
encoder.close()?;
let mut encoded_stream = encoder.take_encoded_stream();
let mut output_file = File::create("sample.sbc")?;
while let Some(data) = encoded_stream.try_next().await? {
output_file.write(&data)?;
}
output_file.close()?;
```
The output stream will begin producing data as soon as the StreamProcessor starts providing it -
the writing of the uncompressed data and the reading of the output stream can happen on separate
tasks.
*/
/// Interface to CodecFactory
pub mod stream_processor;
pub use stream_processor::{StreamProcessor, StreamProcessorOutputStream};
mod buffer_collection_constraints;
pub mod sysmem_allocator;