问题标签 [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.
windows - DirectSound 和 WinMM 是基于 WASAPI 的吗?
我在这张幻灯片中看到 vista 中的 winmm 和 directsound 基于 wasapi。
这是否意味着 winmm 和 directsound 实际上是通过调用 WASAPI 中的函数来完成它们的工作的?
经过一些谷歌搜索后,我无法找到此信息,希望这里有人知道。
c# - 在 C# 中使用多媒体键盘进行多媒体控制
我有键盘,以及笔记本电脑内置的键盘,它有多媒体键。其中一个多媒体键当然是暂停/播放,它是键盘驱动程序的一项功能,可以分配给其他键。当它被推送时,它将暂停/播放 iTunes、Windows Media Player 等,具体取决于我的“最后一次活动”媒体应用程序是什么。
我的问题是,在 C# 中,我如何复制此功能以暂停/播放系统声音。我查看了 API,唯一看起来很接近的是 winmm.dll waveOutPause 和 midiOutPause 函数
c# - 如何使编译器接受十六进制值?
我正在尝试使用http://www.pinvoke.net/default.aspx/coredll/playsound.html上的代码
但是,它会导致几个错误消息,即:“意外字符'×'” 26 次。
所以,我尝试将 vals 更改为逐字字符串,如下所示:
SND_SYNC = @"0×0000",
...但现在我得到“无法将类型'string'隐式转换为'int'
我意识到我可以将这些字符串转换为整数,但这真的是这样吗?恐怕我可以让它以这种方式编译,但它仍然无法工作(或更糟)。将这些十六进制值标记为这样的适当方法是什么,以便编译器接受它们?
这是代码的第一部分:
[DllImport("winmm.dll", SetLastError = true)] static extern bool PlaySound(string pszSound, UIntPtr hmod, uint fdwSound);
c++ - WaveOutWrite 回调创建断断续续的音频
我有四个缓冲区用于在合成器中播放音频。我最初提交两个缓冲区,然后在回调例程中将数据写入下一个缓冲区,然后提交该缓冲区。
当我生成每个缓冲区时,我只是将一个正弦波放入其中,其周期是缓冲区长度的倍数。
当我执行时,我听到每个缓冲区之间的短暂停顿。我已将缓冲区大小增加到 44100 Hz 的 16K 样本,因此我可以清楚地听到整个缓冲区正在播放,但每个缓冲区之间都有中断。
我认为正在发生的是,只有在所有已写入的缓冲区都完成时才会调用回调函数。我需要合成保持领先于播放,所以当每个缓冲区完成时我需要一个回调。
人们通常如何解决这个问题?
更新:我被要求添加代码。这是我所拥有的:
首先我连接到 WaveOut 设备:
我初始化了我将使用的四个帧:
这是 SubmitBuffer 代码:
这是我的回调代码:
RenderQueue 代码非常简单 - 只需将模板缓冲区的一部分复制到输出缓冲区中:
更新:主要解决了这个问题。我需要增加 _nextFrame 和 _curFrame (不是有条件的)。播放缓冲区领先于写入缓冲区。
但是,当我将播放缓冲区减少到 1024 个样本时,它再次变得不稳定。在 2048 个样本中很明显。Debug 和 Release 版本都会发生这种情况。
.net - 是否有任何 .NET 替代 timeBeginPeriod 和 timeEndPeriod 方法?
我一直在研究一个在 SerialPort 上进行通信的程序并且遇到了问题。它的通信率低于 50% 或更少。如果没有,它大部分时间都会超时。
通过对这个问题的研究,我发现默认情况下全局或系统计时器分辨率至少为 10 毫秒或更大。
因此,如果您在通信中使用 Thread.Sleep 暂停 X 毫秒,它可以做的最好的事情是 10 毫秒或更长的无操作或暂停。
就我而言,这对于我的程序与外部设备通信来说太长了。设备收到我的程序的请求后会在 10 毫秒内回复。如果我的程序还没有准备好接收回复,那么我的程序将超时。
解决此问题的唯一方法是调整或更改系统计时器分辨率。为此,我被告知使用来自 winmm.dll 的 Windows 方法 timeBeginPeriod 和 timeEndPeriod。虽然我能够为我的程序的 Windows .NET 版本导入这些方法,但我想知道在 .NET 框架中是否有这些方法的替代品。
c - 在 C 中使用 winmm 库
我正在尝试制作一个可以播放音乐的程序,即 mp3 文件。我正在尝试通过使用 winmm 库来做到这一点。起初,当我尝试链接它时,编译器给出了错误,我从中意识到该程序没有与库正确链接,但后来我在链接器设置中添加了库文件,现在程序执行良好(没有错误 - 表明它已正确链接)但没有播放音乐。我不知道问题是什么。我目前正在使用代码块,它使用 gcc 编译器。谁能解释问题是什么以及为什么音乐没有播放?如果有人可以帮助我,我将不胜感激!:)
我的代码(它只是打印文本但不播放音乐):
excel - 通过 Midi 控制器控制 Excel
我有其中之一(来源:netdna-cdn.com)
并想使用它上面的滑块来控制 Excel,就像 Excel 表单控件滚动条之一一样。
我已经设法为 VBA 修改了这段代码,但它非常不稳定。谁能帮我稳定一下?我认为如果 MidiIn_Event 函数返回的速度不够快,它可能会崩溃,但我可能错了。
提前致谢。
c# - 在 Windows 7 中录制时获取麦克风音量
我正在实现一个简单的录制、播放应用程序,它可以播放和录制 WAV 文件。
要求如下:
1) Windows 7、Visual Studio 2010(或 2012)、C#
2) 录制、播放带有规格信息的 Wav 文件:samplerate 22050、mono、bitspersample 16
3) 录制时可以显示微声级
使用 1) 和 2),我可以使用 lib (winmm.dll) 和 mciSendString(),如下所示
对于 3),我还想使用 mciSendString。我找到了以下命令(状态):
但我不知道从上面的命令中获取音量,谁能告诉我方法?
参考:来自 mciSendString() 的状态命令可在 Microsoft 文档中找到:http:
//msdn.microsoft.com/en-us/library/windows/desktop/dd798683%28v=vs.85%29.aspx
它说:级别:返回当前 PCM 音频样本值。
wpf - WPF MediaElement 和 WinMM
我已经了解了有关 WinMM 的所有知识(打开/关闭混音器、枚举控件等)。让我感到困惑的是,似乎 WPF 的 MediaElement 通过 WinMM 忽略了我的设置,但 Window 的音量混合器显示我正在正确更改设置.
所以我基本上可以用我的控制来静音音量,看到它在音量混合器中静音,播放声音并听到它,然后双击音量混合器中的静音按钮,播放声音而不听到它。
通过 Window 的 Volume Mixer 完成的操作不仅仅是 WinMM api 调用,而是显示使用 WinMM 设置。
有什么我想念的吗?
我用过每一行,只有 Speaker/WaveOut 工作。我从线路中获得了音量和静音控件,两者具有相同的效果。
这只是导致此问题的 MediaElement。如果我通过 WinMM 播放声音,或者如果我嵌入了本机控件或资源管理器,我可以使用音量控制将其静音。
我的第一个理论是,因为我在 Windows7 中进行测试,所以 MediaElement 被分配给一个单独的会话,而不是应用程序的默认会话,并且不知何故,音量混合器会影响应用程序中的所有会话。在这一点上,我必须根据操作系统选择是使用 WinMM 还是 WASAPI。如果这是真的,那么 WinMM 确实不像 Windows 声称的那样不受支持(为了向后兼容),但也许它们适用于较旧的技术(如 Winforms 和 AFX/MFC)。
编辑:我在这个答案中使用代码: https ://stackoverflow.com/a/294525/491837
c++ - c线程-为什么mmsystem(使用mciSendString)不播放声音文件?
我想让我的游戏播放一些音效。一开始,我打开一些 mp3 文件mciSendString("open Muzle.mp3 alias Muzle");
。
我的问题是mciSendString("play Muzle from 0");
仍然会导致一点延迟,并且游戏必须经常播放声音。
在另一个问题中,我读到使用线程可以解决问题。我对使用线程完全陌生。现在的问题是声音不播放 :p 。我通过在最后给出一个 cout 来验证线程是否正常运行。
我现在有这个功能:
(我也尝试过不使用 Sleep。我想知道是否需要它,因为如果线程到达末尾,它可能会被删除并且声音终止......我不确定线程或 mmsystem 是如何工作的)
如果我简单地调用这个Shout()
函数,它将播放声音,执行 Sleep(2000),然后 cout。一切正常。但我必须使用线程,所以我尝试:
我得到了错误: abort() 已被调用。我发现我可能需要分离线程:
有了这个,一切看起来都正常(2秒后,我看到控制台上打印了“Test woi”),但没有播放任何声音。
嗯,所以感谢您阅读所有内容^.^。你知道如何解决这个问题吗?