1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#![deny(missing_docs)]
extern crate rodio;
use rodio::{Endpoint, Sink};
use rodio::Source;
use std::collections::HashMap;
use std::io::{BufReader, SeekFrom, Seek, Cursor};
use std::fs::File;
enum AudioType {
Packed(Vec<u8>),
Loose(File),
}
pub struct Audio {
endpoint: Endpoint,
audio: HashMap<&'static str, AudioType>,
channels: HashMap<&'static str, Sink>,
}
impl Audio {
pub fn new() -> Audio {
Audio {
endpoint: rodio::default_endpoint().unwrap(),
audio: HashMap::new(),
channels: HashMap::new(),
}
}
pub fn add_audio(&mut self, name: &'static str, path: &'static str) {
let file = File::open(path).unwrap();
self.audio.insert(name, AudioType::Loose(file));
self.channels.insert(name, Sink::new(&self.endpoint));
}
pub fn add_packed_audio(&mut self, name: &'static str, bytes: Vec<u8>) {
self.audio.insert(name, AudioType::Packed(bytes));
self.channels.insert(name, Sink::new(&self.endpoint));
}
pub fn play(&mut self, name: &'static str) {
let audio = self.audio.get(name).unwrap();
match *audio {
AudioType::Packed(ref audio) => {
let audio = audio.clone();
let cursor = Cursor::new(audio);
self.channels.get(name).unwrap().append(
rodio::Decoder::new(
BufReader::new(cursor),
).unwrap(),
);
}
AudioType::Loose(ref audio) => {
let mut audio = audio.try_clone().unwrap();
audio.seek(SeekFrom::Start(0u64)).unwrap();
self.channels.get(name).unwrap().append(
rodio::Decoder::new(
BufReader::new(audio),
).unwrap(),
);
}
}
}
pub fn repeat(&mut self, name: &'static str) {
let audio = self.audio.get(name).unwrap();
match *audio {
AudioType::Packed(ref audio) => {
let audio = audio.clone();
let cursor = Cursor::new(audio);
let decoder = rodio::Decoder::new(BufReader::new(cursor)).unwrap();
self.channels.get(name).unwrap().append(
decoder.repeat_infinite(),
);
}
AudioType::Loose(ref audio) => {
let mut audio = audio.try_clone().unwrap();
audio.seek(SeekFrom::Start(0u64)).unwrap();
let decoder = rodio::Decoder::new(BufReader::new(audio)).unwrap();
self.channels.get(name).unwrap().append(
decoder.repeat_infinite(),
);
}
}
}
}