Playing music
With the MP3 decoder done, we're now ready to play some music. We'll create a new module, called player, which we will add at the top of main.rs
:
mod player;
We'll start this module by creating a new player.rs
file with the following import statements:
use std::fs::File; use std::io::BufReader; use std::path::{Path, PathBuf}; use std::sync::{Arc, Condvar, Mutex}; use std::thread; use crossbeam::sync::SegQueue; use pulse_simple::Playback; use mp3::Mp3Decoder; use self::Action::*;
We'll also create some constants:
const BUFFER_SIZE: usize = 1000;
const DEFAULT_RATE: u32 = 44100;
The buffer size is the number of samples we'll decode and play to avoid having slowdowns when playing the song and also to avoid using 100% of the CPU by constantly reading and decoding the data at the same time as playing. The default rate will be used when we cannot find one in the MP3 file.
Event loop
To simplify the development of our playing engine, we'll use the concept of an event loop. Some actions...