48 lines
1.2 KiB
Rust
48 lines
1.2 KiB
Rust
extern crate cpal;
|
|
extern crate vorbis;
|
|
|
|
use std::io::Cursor;
|
|
|
|
fn main() {
|
|
let mut channel = cpal::Voice::new();
|
|
channel.play();
|
|
|
|
let mut decoder = vorbis::Decoder::new(Cursor::new(&include_bytes!("music.ogg")[..]))
|
|
.unwrap();
|
|
|
|
'main: for packet in decoder.packets() {
|
|
let packet = packet.unwrap();
|
|
let vorbis::Packet { channels, rate, data, .. } = packet;
|
|
|
|
let mut data = &data[..];
|
|
|
|
loop {
|
|
if data.len() == 0 {
|
|
continue 'main;
|
|
}
|
|
|
|
{
|
|
let mut buffer = channel.append_data(channels, cpal::SamplesRate(rate as u32),
|
|
data.len());
|
|
let mut buffer = buffer.iter_mut();
|
|
|
|
loop {
|
|
let next_sample = match data.get(0) {
|
|
Some(s) => *s,
|
|
None => continue 'main
|
|
};
|
|
|
|
if let Some(output) = buffer.next() {
|
|
*output = next_sample;
|
|
data = &data[1..];
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
channel.play();
|
|
}
|
|
}
|
|
}
|