问题标签 [winmm]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1732 浏览

.net - WinMM 库问题

我编写了一个 WinMM 库包装库,它公开 WaveOut 和 WaveIn 类,用于录制和播放原始音频流。

一切都很好,但是为了遵循操作系统规范关于如何处理完成的缓冲区,我添加了一个线程来取消准备缓冲区并释放内存。我也把所有的同步都关闭了,这样这些类是可靠的和线程安全的。

但是,似乎有一个罕见的问题,即我向 WaveOut 设备添加缓冲区并且操作系统返回成功代码,但如果设备随后立即重置,操作系统不会将缓冲区标记为已完成并将其返回给应用。

似乎它正在失去缓冲区。所以,问题是,我正在跟踪发送到设备的单个缓冲区的计数,并阻止将 Close() 函数连接到清理它们的线程。

有什么想法或已知的错误吗?

PS:这似乎不会发生在 Vista 的四核上,但发生在我的 XP pro 的双核上。

EDIT1:我完全愿意公开完整的源代码,一旦我上传它并在codeplex上获得适当的许可,如果这对任何人都有帮助的话。

EDIT2:将库发布到 CodePlex:http ://winmm.codeplex.com/

这是导致问题的原因的想法:

0 投票
4 回答
4597 浏览

c# - 使用 winmm.dll 时,什么决定了 windows 中声音设备的顺序?

我正在尝试使用 NAudio 创建多声音输出应用程序。我们安装了 8 个 USB 声卡。NAudio 让我可以使用全部 8 个,但我无法找出确定哪个设备索引是哪个卡的模式。

这些卡将连接到不同的硬件,因此确保您知道您使用的是哪张卡非常重要。

我一直在尝试使用 WMI 来轮询信息,但我似乎无法找到任何决定声音设备顺序的信息。

更新: 我忘记包含有关此问题的一些信息。声卡都是通过 12 端口集线器连接的 USB 声卡。

0 投票
1 回答
5442 浏览

audio - 是否在每个 Windows 安装中都可以找到声音库 WINMM.DLL?

我正在制作一个小的开源 mp3 播放器,供人们查看代码等。适当的评论、示例等等。

不过我想知道,是否在每个 Windows 安装中都找到了 winmm.dll 库?

0 投票
3 回答
3595 浏览

c# - 如何将 WAVE_MAPPER 音频线与其音频设备相关联

我正在开发一个应用程序,除其他外,枚举所有输入音频设备(使用SetupAPI),然后对于每个音频设备,它列出所有输入音频线(使用winmm.dll)。

基本上,我将两者联系起来的方式是从音频设备获取设备路径,然后waveInMessage用于比较音频线的设备路径。

现在,我希望能够对 Windows 默认的 [input] 音频线 ( WAVE_MAPPER) 执行相同的操作。

问题是使用waveInGetDevCapsforWAVE_MAPPER返回“Microsoft Sound Mapper”,使用waveInMessagewithDRV_QUERYDEVICEINTERFACE返回一个空字符串。

关于如何找出 Microsoft Mapper 映射到哪个设备的任何建议?

0 投票
2 回答
3528 浏览

c# - 是否可以在不同的 API 中关联相同的音频设备?

我正在使用 winmm api 来处理音频。我正在使用waveInGetDeviceCapswaveInMessage唯一标识一条“音频线路”。一切正常,除了在 Vista 中,设备名称由WaveInCaps结构限制为 32 个字符。

为了解决这个问题,我设想在操作系统版本 >= Vista 时使用核心 api。我正在使用IMMDeviceEnumerator.GetDeviceandIMMDeviceEnumerator.EnumAudioEndpoints来收集音频线路信息,但我不确定如何判断 core api 下的一个设备与 waveXx api 下的一个条目相关。

我想我可以比较两者的设备路径,但这会违背 MS 将设备路径字符串视为“不透明”的建议。

你打算说什么?

0 投票
1 回答
557 浏览

c# - 对 Windows 如何获取音频线路名称感到困惑

我对如何在 windows (vista) 中命名音频设备/线路/端点感到非常困惑。

  • 首先我去控制面板小程序“声音”。其中,我发现一根输入线实际位于 USB 音频设备上。小程序中“录音设备”的名称为:
    Microphone
    3- USB Audio Device Working

  • 从 waveInGetDeviceCaps 我得到
    麦克风(3- USB 音频设备 ,请注意缺少右括号

  • 从 IMMDevice.IPropertyStore,我看到两个可以提取名称的属性。其中一个说
    麦克风
    ,另一个说USB 音频设备

那个“3-”是从哪里来的?

0 投票
1 回答
1032 浏览

c# - 有什么方法可以仅使用 waveIn API 获取音频设备的 GUID?

我问这个的原因是因为我想关联一个给定的 winmm 音频设备,比如你使用 waveInOpen 打开的那些设备和一个 directSound 设备。

0 投票
1 回答
701 浏览

c# - DRV_QUERYFUNCTIONINSTANCEID 在哪里声明?

这个问题与这个有关。

我需要使用上面提到的常量来使用 winmm 函数 waveInMessage 。DRV_QUERYDEVICEINTERFACE我可以在 mmddk.h 中找到一堆类似的定义(例如 ),DRV_QUERYFUNCTIONINSTANCEID但不是DRV_QUERYFUNCTIONINSTANCEIDSIZE。它们在名为“Device Roles for Legacy Windows Multimedia Applications”的 MSDN 文档中被提及,该文档没有提及示例中使用的头文件。

0 投票
1 回答
3035 浏览

vb.net - waveout 有时会出现内存问题

此代码通过平台调用服务使用 winmm.dll 输出钢琴音 2 秒,它似乎在 XP 上工作正常,但在 windows 7 rc 中 waveoutopen 失败

根据 John Knoeller 的反馈更新

导入 System.Runtime.InteropServices 公共类 AudioStream

结束类

0 投票
3 回答
2866 浏览

c# - 编组到 C# 中的本机库

我无法从托管 C# 代码中调用本机库的函数。我正在为 3.5 紧凑型框架(Windows Mobile 6.x)开发,以防万一这会有所不同。

我正在使用 coredll.dll 中的 waveIn* 函数(我相信这些在普通 Windows 中的 winmm.dll 中)。这就是我想出的:

最近几天我读了很多关于编组的文章,但是我没有让这段代码工作。当缓冲区已满时调用我的回调函数 (waveIn) 时,在 wavehdr 中传回的 hdr 结构显然已损坏。以下是当时结构的示例:

这显然不是我期望通过的。我显然很关心视图中字段的顺序。我不知道 Visual Studio .NET 在“本地”视图中显示记录时是否关心实际内存顺序,但它们显然没有按照我在结构中指定的顺序显示。

然后没有数据指针并且bufferLength字段远高。有趣的是,bytesRecorded 字段正好是 64000 - bufferLength 和 bytesRecorded 我希望两者都是 64000。我不知道到底出了什么问题,也许有人可以帮助我解决这个问题。我是托管代码编程和编组的绝对菜鸟,所以请不要对我可能做过的所有愚蠢的事情太苛刻。

哦,这是我在这里找到的 WAVEHDR 的 C 代码定义,我相信我可能在 C# 结构定义中做错了:

如果您习惯于使用所有那些低级工具,如指针算术、强制转换等,开始编写托管代码是一件很痛苦的事情。这就像试图学习如何将双手绑在背上游泳。我尝试了一些事情(没有效果):.NET 紧凑框架似乎不支持 [StructLayout] 中的 Pack = 2^x 指令。我尝试了 [StructLayout(LayoutKind.Explicit)] 并使用了 4 字节和 8 字节对齐。4 字节对齐给了我与上述代码相同的结果,而 8 字节对齐只会让事情变得更糟——但这正是我所期望的。 有趣的是,如果我将代码从 setupBuffer 移动到 setupWaveIn 并且不在类的上下文中声明 GCHandle 但在 setupWaveIn 的本地上下文中,回调函数返回的结构似乎没有损坏。但是,我不确定为什么会这样,以及如何使用这些知识来修复我的代码。忘记那个。我把东西和我用过的旧代码混在一起了。

我非常感谢有关编组、从 C# 调用非托管代码等方面的任何好的链接。如果有人能指出我的错误,我会非常高兴。我究竟做错了什么?为什么我没有得到我所期望的。