返回首页

{A}{S0}简介
Windows Vista的功能完全一套新的用户模式音频组件,提供每个应用程序的音量控制。这些新组件的顶部,无需更改任何代码,使所有的'老'的应用程序支持这个新的音频API的全部遗产,如waveXxx和mixerXxx功能和DirectSound API已经被重建。这是一个伟大的事情,因为突然之间,你不再是控制主音量的操作系统,但只有你自己的应用程序,当您的应用程序读取或查询操作系统的主音量设置时除外。核心音频API
新的API是基于COM,并分裂成大致做了以下四个子的API: - 这个API允许系统中可用的音频设备的枚举和实例。{A3} - 这个API允许播放和录制音频流。{A4} - 这个API允许访问硬件的功能,如低音,高音和自动增益控制。{A5} - 这个API允许访问量与峰米。
MMDevice和EndpointVolume API的需要来控制主音量和静音设置,而API的本身就是一个巨大的进步,传统功能,因为缺乏一个很好的管理接口,使得与他​​们不知何故不愉快的经历在C#。编写COM互操作代码是新手,很容易出错,因此创建一个包装做的所有管道,对我们来说似乎是一个好主意。使用代码
你总是开始创建枚举类,让您找到您想要的设备,或者只是解决的默认设备。
你有一个到一个MMDevice对象的引用后,切换静音是那么容易,因为:{C}
或获取左声道的音量:

Console.WriteLine("Left Volume : {0}", 

      defaultDevice.AudioEndpointVolume.Channels[0].VolumeLevelScalar);

由于包装实现了完整的EndpointVolume API,我们也可以得到更先进的东西,如所有通道的峰值米:
Console.WriteLine("Master Peak : {0}", 

      defaultDevice.AudioMeterInformation.MasterPeakValue);

Console.WriteLine("Left   Peak : {0}", 

      defaultDevice.AudioMeterInformation.PeakValues[0]);

Console.WriteLine("Right  Peak : {0}", 

      defaultDevice.AudioMeterInformation.PeakValues[1]);

,如果你只是想被告知,当有人改变音量设置,您可以订阅像这样的OnVolumeNotification事件:
defaultDevice.AudioEndpointVolume.OnVolumeNotification += new 

    AudioEndpointVolumeNotificationDelegate(

       AudioEndpointVolume_OnVolumeNotification);

.

.

void AudioEndpointVolume_OnVolumeNotification(AudioVolumeNotificationData data)

{

    Console.WriteLine("New Volume {0}", data.MasterVolume);

    Console.WriteLine("Muted      {0}", data.Muted);

}
兴趣点
卷的通知文件的国家,它必须是无阻塞。客户端不应该等待一个同步对象在事件回调。请记住,当编写事件处理程序。
虽然Vista的每个应用程序的音频设置,微软还没有开放API来枚举会话。所以不会有可能使一个类似sndvol.exe -的应用程序。
现在,只有MMDevice和EndpointVolume API的实现,我希望在未来的更新添加WASAPI。历史2007.04.23 - 最初的文章2010.05.17 - 更新源和样品

回答

评论会员:狮子座的空白 时间:2011/12/14
玩用VB和CSHARP我discoverd在MMDeviceCollection

如果在Visual Basic(2010)你有作为CoreAudioApi.MMDevice CoreAudioApi.MMDeviceCollection.Item(整数),所以你可以找到您的设备。
但与C夏普(2010)相同MMDeviceCollection不包含Item属性。它仅包含
这[整数]。
如何使用相同的方式下VB的?其他的事情,我揣摩的是如何选择声卡,同时在C尖锐或VB项目中使用的嵌入式媒体播放器。搜索所有网站上的净,但没有得到答案。
我用也没有运气n音讯DLL,甚至bassapi。
有的人可以点我在正确的方向。所以我有一个应用程序,谁的作品与MediaPlayer和需要meterinfo。我想选择的声卡上播放的文件,我在开始播放之前选择。
任何帮助,将高度赞赏,因为我几个星期,我是完全地失去了。
非常感谢。
狮子座 - 空白
修改于2011年9月12日(星期一),1:00 PM
评论会员:狮子座DE空白 时间:2011/12/14
说实话,我从来没有尝试用VB。我怀疑VB只是让周围C#的瘦包装这个[整数]。所包含的示例代码应足以让你在C#中开始。

在播放声音,我不能提供任何帮助,这个库只有音量控制
评论会员:狮子座的空白 时间:2011/12/14
感谢雷答案。 我用你的精彩库meterinfo在我的项目。它看起来确实VB使用项目:

公共MMDevice [指数]
{
& #160; 得到
{
IMMDevice结果;
_MMDeviceCollection.Item(指数(UINT),出来的结果);
 0; 返回新的MMDevice(结果);
  ; }
}
因为C#是新的我,你能不能给我一些建议,如何使用MMDevice [指数]
我的设备枚举在C#代码。



狮子座 - 空白
评论会员:JanJankovsky 时间:2011/12/14
如果你的VB SomeVar.Item(1)你会使用SomeVar [1]在C#。我相当肯定有更好的C#和VB虽然
之间的差异教育的地方
评论会员:雷杰普塔伊GUVEN 时间:2011/12/14
THX雷,
SomeVar []的伎俩。



利奥DE空白
评论会员:会员8096760 时间:2011/12/14
!很多这个项目
我怎样才能改变左/右声道的音量separatly?
我想加控制,以改变左/右卷
评论会员:billiam904 时间:2011/12/14
代码工程完美。感谢
评论会员:!斯科特Meesseman 时间:2011/12/14
一些详细的文档,将大大有帮助,但除此之外,我没有抱怨。写得很好的文章和代码工作完美。
感谢
评论会员:会员7662580 时间:2011/12/14
我一直试图找出了3个小时的一级返回一个问题是只有0.0和0.2之间,即使我知道这是多响亮... ...我只是从我的笔记本电脑拔出了我的耳机和突然,它开始正常工作,给我一个范围为0.0至0.9 ...奇怪的。

我使用与Win7 x.64一个戴尔Latitude D830(SigmaTel音频card_)...

任何想法,为什么水平会如此之低,当我插上耳机?
条例草案"丹尼斯
佛罗里达州奥兰多市
评论会员:cadselfs 时间:2011/12/14
您好,我打算实施的DeviceTopology API,我mosos写出来的接口,可以找到如何使用GUID来?例如IMMDevice使用GUID("D666063F - 1587 - 4E43 - 81F1 - B948E807363F")。我不能FINS任何任何地方!我可以给你我的代码时,我用它做,你可以帮我在这?感谢
评论会员:!jpcodeproject20 时间:2011/12/14
您好雷,

首先,好这方面的工作。
其被巨大的帮助。
想想我发现并固定在AudioEndpointVolume内存泄漏。相信您与Windows注册的回调函数是保持被GC'd AudioEndpoint
固定添加拆解AudioEndpointVolume和手动调用Dispose()。

!再次感谢
评论会员:jpcodeproject20 时间:2011/12/14
您好,
首先感谢这个职位,我仍然可以有很大的帮助,
我做了什么你上面说的,只有沉默的录音音量和不打,还有什么可以做呢?
Ouvir
LER foneticamente
Dicionário - 版dicionário detalhado
评论会员:jpcodeproject20 时间:2011/12/14
大家好,

我有一个COMException当代码调用下面的行。

私人IMMDeviceEnumerator _realEnumerator =新_MMDeviceEnumerator(如IMMDeviceEnumerator);

异常消息为:
检索COM类工厂中CLSID为{5C654BC5 - 3DF5 - 4874 - 834A - 72450836E271}的组件失败,原因是以下错误:80040154

我发现了这个错误代码的含义"REGDB_E_CLASSNOTREG:类没有注册"。根据这种情况,我注册的CoreAudioApi.dll来避免这种异常,但它仍然发生。注册它,我使财产"为COM Interop注册"CoreAudioApi属性,标签生成。

我在Visual Studio 2008创建一个新的解决方案。NET 3.5。该解决方案包括项目CoreAudioApi和项目的形式(类型Windows窗体应用程序)。第二个项目,以CodeAudioApi参考。
下面的代码将引发COMException。
public Form1()

{

           InitializeComponent();

 

            try

            {

                devEnumerator = new MMDeviceEnumerator();

            }

            catch (Exception ex)

            {

                // ...

            }

}


我试图注释行[ComImport,GUID("BCDE0395 - E52F - 467C - 8E3D - C4579291692E")] MMDeviceEnumerator.cs,然后运行。然而,_realEnumerator总是空。

你能给予一定的帮助,这样我就可以运行这个?

在此先感谢
评论会员:jpcodeproject20 时间:2011/12/14
你在XP上运行的任何机会
评论会员:lologadvanced 时间:2011/12/14
感谢您的快速答复

其实,我在Windows Server 2003上运行,但它只是开发操作系统。理想的情况下,我需要它工作在Windows Vista和Windows 7和XP上也编译。在32位和64位运行也很重要。

你能告诉我,如果你的样品是能够得到和控制每一个连接的音频设备,如USB耳机,?基本上,我需要获取/设置耳机的音频音量(包括麦克风)和静音。从您提供接口,并从我写的代码,似乎这是可用的。然而,没有先运行应用程序,我可以证实,
评论会员:poltex 时间:2011/12/14
这里的东西,他们完全大修在Vista的音频子系统,所以它无法创建你的2003服务器上的音频子系统的原因是它根本就不存在。它会编译任何东西,但它需要至少有以下运行根据MSDN文档

最低支持的客户端
Windows Vista的

最低支持的服务器
Windows Server 2008的
评论会员:poltex 时间:2011/12/14
好吧,我也不会想到,在我的Server 2003的工作,因为主要版本低于6。认识到这一点,我在Windows 7上运行相同的应用程序和相同的COMException被抛出。所以此特定问题尚未涉及到操作系统,但别的东西。

这个问题似乎是相关类_MMDeviceEnumerator或它的GUID,但我没有一个线索,下一步该怎么做。基于这些信息是有什么我可以尝试吗?

谢谢
评论会员:。 时间:2011/12/14