- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
多年来,我一直使用 Windows 中的高级 MIDI 接口(interface)来播放 MIDI 文件作为游戏中的背景音乐。现在我从几个升级到Windows 10的人那里听说背景音乐将第一次播放(启动程序后),但是一旦完成,它就无法再次启动(或开始播放下一个MIDI文件) 。我自己还没有安装 Windows 10,但我已经组合了几个调试程序,当程序第二次尝试启动 MIDI 文件播放时,在 PlayMusic() 中调用:
mciSendCommand(MCIwDeviceID, MCI_PLAY, MCI_NOTIFY, (DWORD)(LPVOID) &mciPlayParms);
返回值 343 (MCIERR_SEQ_NOMIDIPRESENT)。但如果退出程序并再次启动,则可以使后台MIDI再次播放。
我有两个函数:PlayMusic(char *fname) 和 StopMusic(),它们用于启动和停止 MIDI 文件的播放,还有一个全局变量 MusicPlaying,用于跟踪音乐文件当前是否正在播放。然后,主窗口处理程序处理 MM_MCINOTIFY 消息,当收到 MCI_NOTIFY_SUCCESSFUL 时,它会向我的主代码排队通知音乐已完成,然后该主代码最终将再次调用(如果需要)PlayMusic()再次开始播放文件。以下是代码块(MusicPlaying 是知道 MIDI 文件是否处于事件状态的全局变量):
//*********************************************************
void StopMusic() {
if( MusicPlaying ) {
mciSendCommand(MCIwDeviceID, MCI_STOP, MCI_WAIT, 0);
mciSendCommand(MCIwDeviceID, MCI_CLOSE, MCI_WAIT, 0);
MusicPlaying = 0;
}
}
//**********************************************************************
void PlayMusic(char *pMem) {
MCIERROR dwReturn;
StopMusic(); // stop any previously playing music
// BuildPath() just adds the appropriate folder info for the file
BuildPath(pMem, DIR_MUSIC, FALSE);
// Open the device by specifying the device name and device element.
// MCI will attempt to choose the MIDI Mapper as the output port.
mciOpenParms.dwCallback = 0;
mciOpenParms.wDeviceID = 0;
mciOpenParms.lpstrDeviceType = "sequencer";//NULL;
mciOpenParms.lpstrElementName = (TCHAR *)TmpPath;
mciOpenParms.lpstrAlias = NULL;
dwReturn = mciSendCommand(0, MCI_OPEN, MCI_OPEN_TYPE | MCI_WAIT | MCI_OPEN_ELEMENT, (DWORD)(LPVOID) &mciOpenParms);
if( dwReturn ) return; // Failed to open device, bail out
// Begin playback. The window procedure function for the parent window
// will be notified with an MM_MCINOTIFY message when playback is
// complete. At that time, the window procedure closes the device.
MCIwDeviceID = mciOpenParms.wDeviceID;
mciPlayParms.dwCallback = (DWORD)(hWndMain);
dwReturn = mciSendCommand(MCIwDeviceID, MCI_PLAY, MCI_NOTIFY, (DWORD)(LPVOID) &mciPlayParms);
if( dwReturn ) { // if error
mciSendCommand(MCIwDeviceID, MCI_CLOSE, 0, 0); // close MCI device
return; // and bail out
}
MusicPlaying = 1;
}
在主窗口消息处理器中,当 MIDI 文件播放完毕时:
case MM_MCINOTIFY:
//***** SEE "NOTE" BELOW FOR DEBUG CODE INSERTED HERE *****
// various MIDI messages, we only care about termination
switch( wParam ) {
case MCI_NOTIFY_ABORTED: // value of 4
case MCI_NOTIFY_FAILURE:
case MCI_NOTIFY_SUPERSEDED:
break;
case MCI_NOTIFY_SUCCESSFUL: // value of 1
mciSendCommand(MCIwDeviceID, MCI_CLOSE, 0, 0);
MusicPlaying = 0;
AddMsg(KHDR_MUSIC_DONE, 0, 0, 0); // Queue msg that music finished
break;
default:
break;
}
return 0;
正常的事件顺序是:
Main game code calls PlayMusic() to start a MIDI playing
(Nothing in StopMusic() since nothing's playing first time)
MCI_OPEN
MCI_PLAY
MusicPlaying = 1;
MainWnd MM_MCINOTIFY MCI_NOTIFY_SUCCESSFUL when MIDI finished
MCI_CLOSE
MusicPlaying = 0;
queue KHDR_MUSIC_DONE msg to main game code
Main game code eventually sends another PlayMusic() command
如果某些原因导致主游戏代码过早停止音乐,那么它将调用 StopMusic() ,这将:
MCI_STOP
MCI_CLOSE
MusicPlaying = 0;
注意:(参见上面 MM_MCINOTIFY 中的“**** SEE 'NOTE'...”行)作为调试的一部分,我在此时插入了一个 MessageBox 调用以显示正在接收的通知。使用 Win 10 的用户看到的消息与我使用早期版本的 Windows 时看到的消息完全相同:发生 SUCCESSFUL 时 wParam=1 和 lParam=1,发生 ABORTED 时 wParam=4 和 lParam=1。但更关键的是:此时发生了 MessageBox,然后当用户在 MessageBox 上单击“确定”时,MIDI 文件就重新启动了!我的第一个想法是,消息框出现和被点击的时间延迟给了 MIDI 系统“重置”的时间。但进一步的测试,插入代码以将“MUSIC_DONE”消息的排队延迟 2 秒到我的主代码,对问题没有任何影响。所以看起来这可能与从我的主窗口到 MessageBox 窗口并返回的上下文切换有关,而不是任何时间延迟。
我发现一个网页讨论了 Windows 8 上 MIDI 系统发生的变化,这可能与它有关,除了我的 MIDI 播放代码似乎在播放第一个文件时没有遇到任何问题,它只是拒绝播放任何后续内容。该页面位于:
http://coolsoft.altervista.org/en/blog/2013/03/what-happened-midi-mapper-windows-8
我还听说另一个开发者的另一个游戏程序也有同样的问题:它会播放一次背景音乐,然后 MIDI 系统似乎打嗝。
那么,大问题:有谁知道需要做什么才能让 Windows 10 顺利播放连续的 MIDI 文件?
最佳答案
首先,我强烈建议您使用 Win 10 系统进行调试,即使它是在虚拟机中。由于Win 10是免费升级,所以这应该不成问题。
当您调用 mciSendCommand(..., MCI_CLOSE, ...) 时,请在第三个参数中指定 MCI_WAIT。 0 在这里无效。也许在 Win 10 上,这会导致您的代码不等待关闭完成。
关于c - 为什么 MIDI 音序器在 Windows 10 上无法第二次播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31797304/
我通过 spring ioc 编写了一些 Rest 应用程序。但我无法解决这个问题。这是我的异常(exception): org.springframework.beans.factory.BeanC
我对 TestNG、Spring 框架等完全陌生,我正在尝试使用注释 @Value通过 @Configuration 访问配置文件注释。 我在这里想要实现的目标是让控制台从配置文件中写出“hi”,通过
为此工作了几个小时。我完全被难住了。 这是 CS113 的实验室。 如果用户在程序(二进制计算器)结束时选择继续,我们需要使用 goto 语句来到达程序的顶部。 但是,我们还需要释放所有分配的内存。
我正在尝试使用 ffmpeg 库构建一个小的 C 程序。但是我什至无法使用 avformat_open_input() 打开音频文件设置检查错误代码的函数后,我得到以下输出: Error code:
使用 Spring Initializer 创建一个简单的 Spring boot。我只在可用选项下选择 DevTools。 创建项目后,无需对其进行任何更改,即可正常运行程序。 现在,当我尝试在项目
所以我只是在 Mac OS X 中通过 brew 安装了 qt。但是它无法链接它。当我尝试运行 brew link qt 或 brew link --overwrite qt 我得到以下信息: ton
我在提交和 pull 时遇到了问题:在提交的 IDE 中,我看到: warning not all local changes may be shown due to an error: unable
我跑 man gcc | grep "-L" 我明白了 Usage: grep [OPTION]... PATTERN [FILE]... Try `grep --help' for more inf
我有一段代码,旨在接收任何 URL 并将其从网络上撕下来。到目前为止,它运行良好,直到有人给了它这个 URL: http://www.aspensurgical.com/static/images/a
在过去的 5 个小时里,我一直在尝试在我的服务器上设置 WireGuard,但在完成所有设置后,我无法 ping IP 或解析域。 下面是服务器配置 [Interface] Address = 10.
我正在尝试在 GitLab 中 fork 我的一个私有(private)项目,但是当我按下 fork 按钮时,我会收到以下信息: No available namespaces to fork the
我这里遇到了一些问题。我是 node.js 和 Rest API 的新手,但我正在尝试自学。我制作了 REST API,使用 MongoDB 与我的数据库进行通信,我使用 Postman 来测试我的路
下面的代码在控制台中给出以下消息: Uncaught DOMException: Failed to execute 'appendChild' on 'Node': The new child el
我正在尝试调用一个新端点来显示数据,我意识到在上一组有效的数据中,它在数据周围用一对额外的“[]”括号进行控制台,我认为这就是问题是,而新端点不会以我使用数据的方式产生它! 这是 NgFor 失败的原
我正在尝试将我的 Symfony2 应用程序部署到我的 Azure Web 应用程序,但遇到了一些麻烦。 推送到远程时,我在终端中收到以下消息 remote: Updating branch 'mas
Minikube已启动并正在运行,没有任何错误,但是我无法 curl IP。我在这里遵循:https://docs.traefik.io/user-guide/kubernetes/,似乎没有提到关闭
每当我尝试docker组成任何项目时,都会出现以下错误。 我尝试过有和没有sudo 我在这台机器上只有这个问题。我可以在Mac和Amazon WorkSpace上运行相同的容器。 (myslabs)
我正在尝试 pip install stanza 并收到此消息: ERROR: No matching distribution found for torch>=1.3.0 (from stanza
DNS 解析看起来不错,但我无法 ping 我的服务。可能是什么原因? 来自集群中的另一个 Pod: $ ping backend PING backend.default.svc.cluster.l
我正在使用Hibernate 4 + Spring MVC 4当我开始 Apache Tomcat Server 8我收到此错误: Error creating bean with name 'wel
我是一名优秀的程序员,十分优秀!