首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >铁锈Rodio获得OutputDevices列表

铁锈Rodio获得OutputDevices列表
EN

Stack Overflow用户
提问于 2022-03-14 13:58:01
回答 1查看 337关注 0票数 1

我是生锈新手,我一直在玩音频库。我可以在默认的音频输出设备上播放音频文件,如下所示:

代码语言:javascript
复制
use std::fs::File;
use std::io::BufReader;
use rodio::{OutputStream, Sink};
fn main() {
   let (_stream, stream_handle) = OutputStream::try_default().unwrap();
   let sink = Sink::try_new(&stream_handle).unwrap();
   let file = File::open("m.mp3").unwrap();
   let source = rodio::Decoder::new(BufReader::new(file)).unwrap();
   sink.append(source);
   loop {}
}

我可以看到,Rodio提供了一种为流设备(&设备)设置音频输出设备的方法,但我不知道如何获得可用音频输出设备的列表,并为该函数提供任意的音频输出设备。

-更新-

基于Enet4的回答,我做了两个简单的函数,列出主机设备并为特定设备创建一个OutputStream,然后在需要在该设备上播放音频文件的任何地方使用它,如下所示:

代码语言:javascript
复制
use std::fs::File;
use std::io::BufReader;
use rodio::*;
use rodio::cpal::traits::{HostTrait,DeviceTrait};

fn listHostDevices(){
   let host = cpal::default_host();
   let devices = host.output_devices().unwrap();
   for device in devices{ 
      let dev:rodio::Device = device.into();
      let devName:String=dev.name().unwrap();
      println!(" # Device : {}", devName);
   }
}

fn getOutputStream(device_name:&str) -> (OutputStream,OutputStreamHandle) {
   let host = cpal::default_host();
   let devices = host.output_devices().unwrap();
   let ( mut _stream, mut stream_handle) = OutputStream::try_default().unwrap();
   for device in devices{ 
      let dev:rodio::Device = device.into();
      let devName:String=dev.name().unwrap();
      if devName==device_name {
         println!("Device found: {}", devName);
         ( _stream, stream_handle) = OutputStream::try_from_device(&dev).unwrap();
      }
   }
   return (_stream,stream_handle);
}

然后我使用这样的函数:

代码语言:javascript
复制
fn main() {
   listHostDevices();
   let (_stream, stream_handle) = getOutputStream("Speakers (Realtek(R) Audio)");
   let sink = Sink::try_new(&stream_handle).unwrap();
   let file = File::open("m.mp3").unwrap();
   let source = rodio::Decoder::new(BufReader::new(file)).unwrap();
   sink.append(source);
   
   loop {}
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-14 15:17:53

rodio使用cpal作为底层音频库。这就是主机和设备的概念来源。使用从cpal重新导出的rodio模块获取系统主机,并获得输出设备的列表。

代码语言:javascript
复制
use rodio::cpal;

let host = cpal::default_host();
let devices = host.output_devices()?;

for device in devices {
   // use device
}

获得的设备值将实现DeviceTrait,但rodio使用动态多态类型rodio::Device。幸运的是,我们可以轻松地使用Into

代码语言:javascript
复制
let device: rodio::Device = device.into();

// ...

stream.try_from_device(&device)?;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71468954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档