Skip to content

Commit

Permalink
Cleaning of output manager
Browse files Browse the repository at this point in the history
  • Loading branch information
PolyMeilex committed Dec 2, 2020
1 parent fec4fe0 commit 96e9967
Show file tree
Hide file tree
Showing 5 changed files with 19 additions and 28 deletions.
2 changes: 0 additions & 2 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@ use scene::{Scene, SceneEvent, SceneType};
mod time_manager;
use time_manager::Fps;

mod audio;
mod midi_device;
mod output_manager;
pub use output_manager::OutputManager;

Expand Down
4 changes: 0 additions & 4 deletions src/midi_device/mod.rs

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,14 @@ use crate::output_manager::{OutputConnection, OutputDescriptor};

use midir::{MidiOutput, MidiOutputConnection, MidiOutputPort};

pub struct MidiDevicesManager {
pub struct MidiBackend {
midi_out: MidiOutput,
// midi_out_c: Option<MidiOutputConnection>,
pub outs: Vec<MidiPortInfo>,
}

impl MidiDevicesManager {
impl MidiBackend {
pub fn new() -> Result<Self, midir::InitError> {
let midi_out = MidiOutput::new("midi_out")?;
Ok(Self {
midi_out,
// midi_out_c: None,
outs: Vec::new(),
})
Ok(Self { midi_out })
}

pub fn get_outputs(&self) -> Vec<OutputDescriptor> {
Expand Down
17 changes: 10 additions & 7 deletions src/output_manager.rs → src/output_manager/mod.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
use crate::audio::Synth;
use crate::midi_device::{MidiDevicesManager, MidiPortInfo};
mod midi_backend;
mod synth_backend;

use midi_backend::{MidiBackend, MidiPortInfo};
use synth_backend::SynthBackend;

use std::{
fmt::{self, Display, Formatter},
Expand Down Expand Up @@ -32,22 +35,22 @@ struct DummyOutput {}
impl OutputConnection for DummyOutput {}

pub struct OutputManager {
synth_backend: Option<Synth>,
midi_backend: Option<MidiDevicesManager>,
synth_backend: Option<SynthBackend>,
midi_backend: Option<MidiBackend>,

output_connection: Box<dyn OutputConnection>,
}

impl OutputManager {
pub fn new() -> Self {
let synth_backend = if Path::new("./font.sf2").exists() {
Some(Synth::new())
Some(SynthBackend::new())
} else {
log::info!("./font.sf2 not found");
None
};

let midi_backend = match MidiDevicesManager::new() {
let midi_backend = match MidiBackend::new() {
Ok(midi_device_manager) => Some(midi_device_manager),
Err(e) => {
log::error!("{:?}", e);
Expand Down Expand Up @@ -86,7 +89,7 @@ impl OutputManager {
}
}
OutputDescriptor::MidiOut(info) => {
if let Some(conn) = MidiDevicesManager::new_output_connection(info) {
if let Some(conn) = MidiBackend::new_output_connection(info) {
self.output_connection = Box::new(conn);
}
}
Expand Down
12 changes: 6 additions & 6 deletions src/audio/mod.rs → src/output_manager/synth_backend.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,15 @@ enum MidiEvent {
NoteOff { ch: u8, key: u8 },
}

pub struct Synth {
pub struct SynthBackend {
_host: cpal::Host,
device: cpal::Device,

stream_config: cpal::StreamConfig,
sample_format: cpal::SampleFormat,
}

impl Synth {
impl SynthBackend {
pub fn new() -> Self {
let host = cpal::default_host();

Expand Down Expand Up @@ -112,28 +112,28 @@ impl Synth {
stream
}

pub fn new_output_connection(&mut self) -> SynthOutConnection {
pub fn new_output_connection(&mut self) -> SynthOutputConnection {
let (tx, rx) = std::sync::mpsc::channel::<MidiEvent>();
let _stream = match self.sample_format {
cpal::SampleFormat::F32 => self.run::<f32>(rx),
cpal::SampleFormat::I16 => self.run::<i16>(rx),
cpal::SampleFormat::U16 => self.run::<u16>(rx),
};

SynthOutConnection { _stream, tx }
SynthOutputConnection { _stream, tx }
}

pub fn get_outputs(&self) -> Vec<OutputDescriptor> {
vec![OutputDescriptor::Synth]
}
}

pub struct SynthOutConnection {
pub struct SynthOutputConnection {
_stream: cpal::Stream,
tx: std::sync::mpsc::Sender<MidiEvent>,
}

impl OutputConnection for SynthOutConnection {
impl OutputConnection for SynthOutputConnection {
fn note_on(&mut self, ch: u8, key: u8, vel: u8) {
self.tx.send(MidiEvent::NoteOn { ch, key, vel }).ok();
}
Expand Down

0 comments on commit 96e9967

Please sign in to comment.