【发布时间】:2011-04-01 22:35:45
【问题描述】:
我需要能够将我的应用程序的声音输出定向到系统的所有音频输出 - 特别是笔记本电脑的内置扬声器和耳机。我在 Windows Vista/7 和最新版本的 .NET Framework 上使用 C#,并且不需要支持较旧的(即 Windows XP)操作系统。
我能够成功地使用Core Audio API 更改活动扬声器的音量,并且能够枚举并专门操作各个音频设备,但无法实际更改设备的状态以启用它们。
private MMDeviceEnumerator devEnum = new MMDeviceEnumerator();
private MMDeviceCollection audioDevices = null;
public Form1()
{
InitializeComponent();
this.defaultDevice = this.devEnum.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia);
AudioEndpointVolumeNotificationDelegate(AudioEndpointVolume_OnVolumeNotification);
this.audioDevices = this.devEnum.EnumerateAudioEndPoints(EDataFlow.eRender, EDeviceState.DEVICE_STATEMASK_ALL);
for (int i = 1; i < this.audioDevices.Count; i++)
{
// Doesn't work - throws exception because property is read-only:
// this.audioDevices[i].State = EDeviceState.DEVICE_STATE_ACTIVE
}
}
基本上,我正在寻找一种启用音频设备的方法,而不仅仅是调整它们的音量。有人知道这样做的方法吗?我一直在查看IMMDevice Interface 的 MSDN 文档,但发现它很困难,因为它不是作为托管代码提供的,而且我使用的 .NET 包装器没有完全实现它。我也愿意接受采用完全不同方法的建议,只要我仍然可以使用 C# 来做到这一点。谢谢!
【问题讨论】:
-
即使您可以启用不同的设备,例如蓝牙耳机和内置扬声器,插入耳机时您也不太可能通过扬声器播放声音——这通常是纯电动的-- 机械插入耳机插孔将音频路由到插入的设备而不是扬声器。就计算机而言,它就是一台设备。
-
在不知道您使用什么 API 来呈现音频的情况下,很难知道如何回答这个问题。
标签: c# .net windows-7 audio core-audio