Skip to content

Commit a905fbd

Browse files
committed
feat: working audio over network, and lots more :3
1 parent 3cedca0 commit a905fbd

4 files changed

Lines changed: 344 additions & 122 deletions

File tree

player/src/audio.rs

Lines changed: 50 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,17 @@ impl Track {
132132
})
133133
}
134134

135-
pub fn encode_frame(&mut self) -> AudioFrame {
135+
pub fn encode_frame(&mut self) -> Result<AudioFrame, ()> {
136136
const pcm_length: usize = 960;
137+
138+
if pcm_length * (self.position + 1) >= self.samples.len() {
139+
println!(
140+
"encode_frame was about to run out of samples at pos {}",
141+
self.position
142+
);
143+
return Err(());
144+
}
145+
137146
let mut pcm = [0.0; pcm_length];
138147

139148
for i in 0..pcm_length {
@@ -143,10 +152,10 @@ impl Track {
143152
let x = self.encoder.encode_vec_float(&pcm, 256).unwrap();
144153
self.position += 1;
145154

146-
AudioFrame {
155+
Ok(AudioFrame {
147156
frame: self.position as u32,
148157
data: x,
149-
}
158+
})
150159
}
151160
}
152161

@@ -172,8 +181,14 @@ impl Player {
172181
let mut pcm = vec![0.0; 960];
173182
self.decoder.decode_float(&frame, &mut pcm, false).unwrap();
174183

175-
// copy to ringbuffer
176-
self.buffer.lock().unwrap().push_slice(&pcm);
184+
let mut buffer = self.buffer.lock().unwrap();
185+
if buffer.len() < buffer.free_len() {
186+
// copy to ringbuffer
187+
buffer.push_slice(&pcm);
188+
} else {
189+
// otherwise just discard i guess
190+
println!("player buffer full... discarding :/")
191+
}
177192
}
178193

179194
pub fn play(&mut self) {
@@ -214,13 +229,41 @@ impl Player {
214229
// dont let it be dropped
215230
self.stream = Some(stream);
216231
}
232+
233+
pub fn pause(&mut self) {
234+
assert!(self.stream.is_some());
235+
self.stream.as_mut().unwrap().pause().unwrap();
236+
}
237+
238+
pub fn resume(&mut self) {
239+
assert!(self.stream.is_some());
240+
self.stream.as_mut().unwrap().play().unwrap();
241+
}
242+
243+
pub fn clear(&mut self) {
244+
self.buffer.lock().unwrap().clear();
245+
}
246+
247+
pub fn ready(&self) -> bool {
248+
let buffer = self.buffer.lock().unwrap();
249+
buffer.len() > 48000 * 2 // 2s...
250+
}
217251
}
218252

219253
// callback when the audio output needs more data
220254
fn write_audio<T: Sample>(
221255
out_data: &mut [f32],
222256
_: &cpal::OutputCallbackInfo,
223-
buffer: &Arc<Mutex<Ringbuf>>,
257+
buffer_mutex: &Arc<Mutex<Ringbuf>>,
224258
) {
225-
buffer.lock().unwrap().pop_slice(out_data);
259+
let mut buffer = buffer_mutex.lock().unwrap();
260+
if out_data.len() < buffer.len() {
261+
buffer.pop_slice(out_data);
262+
} else {
263+
// uhhhh
264+
println!("write_audio: buffer underrun!! (but no panic)");
265+
}
266+
if buffer.len() < 48000 * 2 - 1000 {
267+
println!("write_audio: buffer has {} left", buffer.len());
268+
}
226269
}

0 commit comments

Comments
 (0)