rodio.rs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. use super::{Open, Sink};
  2. extern crate rodio;
  3. use std::io;
  4. use std::process::exit;
  5. pub struct RodioSink {
  6. rodio_sink: rodio::Sink,
  7. }
  8. fn list_outputs() {
  9. println!("Default Audio Device:\n {:?}", rodio::default_output_device().map(|e| e.name()));
  10. println!("Available Audio Devices:");
  11. for device in rodio::output_devices() {
  12. println!("- {}", device.name());
  13. // Output formats
  14. if let Ok(fmt) = device.default_output_format() {
  15. println!(" Default format:\n {:?}", fmt);
  16. }
  17. let mut output_formats = match device.supported_output_formats() {
  18. Ok(f) => f.peekable(),
  19. Err(e) => {
  20. println!("Error: {:?}", e);
  21. continue;
  22. },
  23. };
  24. if output_formats.peek().is_some() {
  25. println!(" All formats:");
  26. for format in output_formats {
  27. println!(" {:?}", format);
  28. }
  29. }
  30. }
  31. }
  32. impl Open for RodioSink {
  33. fn open(device: Option<String>) -> RodioSink {
  34. info!("Using rodio sink");
  35. let mut rodio_device = rodio::default_output_device().expect("no output device available");
  36. if device.is_some() {
  37. let device_name = device.unwrap();
  38. if device_name == "?".to_string() {
  39. list_outputs();
  40. exit(0)
  41. }
  42. let mut found = false;
  43. for d in rodio::output_devices() {
  44. if d.name() == device_name {
  45. rodio_device = d;
  46. found = true;
  47. break;
  48. }
  49. }
  50. if !found {
  51. println!("No output sink matching '{}' found.", device_name);
  52. exit(0)
  53. }
  54. }
  55. let sink = rodio::Sink::new(&rodio_device);
  56. RodioSink {
  57. rodio_sink: sink,
  58. }
  59. }
  60. }
  61. impl Sink for RodioSink {
  62. fn start(&mut self) -> io::Result<()> {
  63. self.rodio_sink.play();
  64. Ok(())
  65. }
  66. fn stop(&mut self) -> io::Result<()> {
  67. self.rodio_sink.stop();
  68. Ok(())
  69. }
  70. fn write(&mut self, data: &[i16]) -> io::Result<()> {
  71. let source = rodio::buffer::SamplesBuffer::new(2, 44100, data);
  72. self.rodio_sink.append(source);
  73. Ok(())
  74. }
  75. }