1

我使用以下播放 MP3 声音mciSendString

mciSendString("play \"mysound.mp3\"", NULL, 0, 0);

以上工作正常。但从我在网上看到的情况来看,人们对上述代码使用了各种包装器。一些先发送open命令play,然后等待通知,然后发送close命令,他们还使用文件别名等。

我的问题是——这一切有必要吗?我的主要兴趣只是播放文件并以异步方式进行。上面的命令似乎完成了所有的清理工作,所以我的问题是 - 是否真的需要在播放声音时使用openclose命令和通知以正确释放内存和解除分配声音,这样做有好处吗?

从我在调试器中可以看到,在执行上述命令时,系统会加载所需的 DLL,然后启动一些线程,一旦播放结束,线程就会退出并且 DLL 会被卸载。所以我的猜测是打开/关闭是可选的,因为系统会自动执行所有分配/解除分配,但我可能错了。如果我只调用上面的行而不是别的,我是否会泄漏一些内存或资源?

这是调试日志显示的内容 - 我可以从这个日志中得出结论,线程已关闭并且 DLL 文件已卸载:

Module Load: MCIQTZ32.dll. No Debug Info. Base Address: $61D80000. Process Project1.exe (368)
Thread Start: Thread ID: 492. Process Project1.exe (368)
Module Load: SETUPAPI.dll. No Debug Info. Base Address: $77920000. Process Project1.exe (368)
Module Unload: SETUPAPI.dll. Process Project1.exe (368)
Thread Start: Thread ID: 1344. Process Project1.exe (368)
Thread Start: Thread ID: 640. Process Project1.exe (368)
Thread Exit: Thread ID: 1344. Process Project1.exe (368)
Thread Exit: Thread ID: 640. Process Project1.exe (368)
Thread Start: Thread ID: 468. Process Project1.exe (368)
Thread Start: Thread ID: 1120. Process Project1.exe (368)
Module Load: SETUPAPI.dll. No Debug Info. Base Address: $77920000. Process Project1.exe (368)
Module Unload: SETUPAPI.dll. Process Project1.exe (368)
Thread Start: Thread ID: 1692. Process Project1.exe (368)
Thread Start: Thread ID: 1384. Process Project1.exe (368)
Thread Start: Thread ID: 204. Process Project1.exe (368)
Thread Start: Thread ID: 1572. Process Project1.exe (368)
Thread Exit: Thread ID: 1692. Process Project1.exe (368)
Thread Exit: Thread ID: 1384. Process Project1.exe (368)
Thread Exit: Thread ID: 1572. Process Project1.exe (368)
Thread Exit: Thread ID: 204. Process Project1.exe (368)
Thread Exit: Thread ID: 1120. Process Project1.exe (368)
Thread Exit: Thread ID: 468. Process Project1.exe (368)
Module Unload: MCIQTZ32.dll. Process Project1.exe (368)
Thread Exit: Thread ID: 492. Process Project1.exe (368)
4

1 回答 1

2

我在其他地方找到了答案,所以我分享它。

看来该play命令本身是完全有效的。

所以这里有几种方法来调用它:

// (a)
mciSendString("open waveaudio!MyFile.wav alias MyFile",NULL,0,0);
mciSendString("play MyFile wait",NULL,0,0);
mciSendString("close MyFile",NULL,0,0);

// (b)
mciSendString("open MyFile.wav alias MyFile",NULL,0,0);
mciSendString("play MyFile wait",NULL,0,0);
mciSendString("close MyFile",NULL,0,0);

// (c)
mciSendString("play MyFile.wav wait",NULL,0,0); // no open or alias used

在MSDN 论坛上找到答案。

值得注意的是,mciSendString如果您在路径中提供带有空格的文件名(例如 C:\Program Files...),它将惨遭失败。即使您将其括在引号中,也无济于事。解决方案是使用GetShortPathNameWindows 函数从 NTFS 路径名中获取类似 DOS 的路径,并且其中没有空格。

于 2014-01-26T19:05:05.350 回答