X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=mandelwow.rs;h=e2de8b3490cdc1e701571558f6c2479e757cbe42;hb=5a3d91b5cfa87ea798ec1d103bf3129551cc8e7e;hp=3c4da07d4f6064c4ba538416be0ebf9fc8c45bdf;hpb=a351d13b67d0dab55fa1ab1378a7f9554e06a231;p=mandelwow.git diff --git a/mandelwow.rs b/mandelwow.rs index 3c4da07..e2de8b3 100644 --- a/mandelwow.rs +++ b/mandelwow.rs @@ -4,12 +4,18 @@ extern crate glium; extern crate glutin; +extern crate libxm; +extern crate sdl2; use glium::{DisplayBuild, Surface}; use glium::index::{IndexBuffer, PrimitiveType}; use glutin::ElementState::Pressed; use glutin::Event::KeyboardInput; use glutin::VirtualKeyCode; +use libxm::XMContext; +use sdl2::audio::{AudioCallback, AudioDevice, AudioSpecDesired}; +use std::fs::File; +use std::io::Read; mod support; @@ -154,10 +160,10 @@ fn bounding_box(display: &glium::Display, depth: glium::Depth { test: glium::draw_parameters::DepthTest::IfLess, write: true, - .. Default::default() + ..Default::default() }, blend: glium::Blend::alpha_blending(), - .. Default::default() + ..Default::default() }; let front_indices = IndexBuffer::new(display, PrimitiveType::LineLoop, @@ -232,10 +238,10 @@ fn mandel(display: &glium::Display, depth: glium::Depth { test: glium::draw_parameters::DepthTest::IfLess, write: true, - .. Default::default() + ..Default::default() }, blend: glium::Blend::alpha_blending(), - .. Default::default() + ..Default::default() }; frame.draw(&vb, &indices, program, uniforms, ¶ms).unwrap(); @@ -269,7 +275,52 @@ fn mandelwow(display: &glium::Display, } } +struct XmCallback { + xm: XMContext, +} + +impl AudioCallback for XmCallback { + type Channel = f32; + + fn callback(&mut self, out: &mut [f32]) { + self.xm.generate_samples(out); + } +} + +struct SoundPlayer { + _device: AudioDevice, +} + +fn play_xm(raw_xm: &[u8]) -> SoundPlayer { + let sdl_context = sdl2::init().unwrap(); + let sdl_audio = sdl_context.audio().unwrap(); + + let sample_rate = 48000u32; + let desired_spec = AudioSpecDesired { + freq: Some(sample_rate as i32), + channels: Some(2u8), + samples: None, + }; + let device = sdl_audio.open_playback(None, &desired_spec, |actual_spec| { + let xm = XMContext::new(&raw_xm, actual_spec.freq as u32).unwrap(); + + XmCallback { + xm: xm, + } + }).unwrap(); + + device.resume(); + + SoundPlayer { + _device: device, + } +} + fn main() { + let mut xm = Vec::new(); + File::open("flora.xm").unwrap().read_to_end(&mut xm).unwrap(); + let _sound_player = play_xm(&xm); + let display = glium::glutin::WindowBuilder::new() //.with_dimensions(1024, 768) .with_fullscreen(glutin::get_primary_monitor())