cpal.rs 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. use super::{Open, Sink};
  2. extern crate cpal;
  3. use std::io;
  4. use std::thread;
  5. use std::collections::VecDeque;
  6. pub struct CpalSink {
  7. event_loop: cpal::EventLoop,
  8. buffer: mut VecDeque<i16>,
  9. stream_id: Option<cpal::StreamId>,
  10. }
  11. impl Open for CpalSink {
  12. fn open(device: Option<String>) -> CpalSink {
  13. info!("Using cpal sink");
  14. if device.is_some() {
  15. // N.B. This is perfectly possible to support.
  16. // TODO: First need to enable listing of devices.
  17. // Remember to filter to those which support Stereo 16bit 44100Hz
  18. // TODO: Choose cpal sink by name.
  19. panic!("cpal sink does not support specifying a device name");
  20. }
  21. let event_loop = cpal::EventLoop::new();
  22. CpalSink {
  23. // Allow an (arbitrary) 2 second buffer before resizing.
  24. buffer: VecDeque::with_capacity(44100 * 2 * 2),
  25. event_loop: event_loop,
  26. }
  27. }
  28. }
  29. impl Sink for CpalSink {
  30. fn start(&mut self) -> io::Result<()> {
  31. if self.stream_id.is_none() {
  32. let device = cpal::default_output_device().expect("no output device available");
  33. // TODO: Support more formats.
  34. let format = cpal::Format(2, 44100, cpal::SampleFormat::I16);
  35. self.stream_id = self.event_loop.build_output_stream(&device, &format)?;
  36. self.event_loop.play_stream(self.stream_id.clone());
  37. }
  38. if self.thread.is_none() {
  39. let event_loop = self.event_loop;
  40. let source = self.buffer;
  41. thread::spawn(move |event_loop, source| {
  42. event_loop.run(move |_stream_id, mut stream_data| {
  43. match data {
  44. cpal::StreamData::Output { buffer: cpal::UnknownTypeOutputBuffer::I16(mut buffer) } => {
  45. let sl = source.len();
  46. if (sl > buffer.len()) {
  47. sl = buffer.len();
  48. }
  49. // let u: Vec<_> = source.drain(..sl).collect();
  50. // buffer[..s1].copy_from_slice(u[..s1]);
  51. for (sample, data) in buffer.iter_mut().zip(source.drain(..sl)) {
  52. *sample = data;
  53. }
  54. },
  55. _ => (),
  56. }
  57. });
  58. })
  59. }
  60. Ok(())
  61. }
  62. fn stop(&mut self) -> io::Result<()> {
  63. if !self.stream_id.is_none() {
  64. self.event_loop.destroy_stream(self.stream_id);
  65. self.stream_id = None;
  66. self.buffer.clear();
  67. }
  68. Ok(())
  69. }
  70. fn write(&mut self, data: &[i16]) -> io::Result<()> {
  71. // self.0.as_mut().unwrap().write_interleaved(&data).unwrap();
  72. // self.buffer.reserve(data.len()); // Unneccessary?
  73. // self.buffer.extend_from_slice(data);
  74. self.buffer.extend(data);
  75. Ok(())
  76. }
  77. }