mciSendString 的两个小坑

刚刚修正了自己用的小闹钟的代码。

坑1:REPEAT 选项的作用范围

原来用得好好的,之后选择 .wav 文件,居然不出声音了……

诶,MCI 肯定支持 .wav 的啊……

仔细想想,我以前都是选 .mp3 作为闹铃,和这个有关系吗?

查看源代码。

strSend = "PLAY " & STRING_SOUND_ALIAS & " REPEAT"
Call mciSendString(strSend, rbuf, 0, 0)

  

为了将我从睡梦中闹醒(一般来说我睡得很死的……),我选用了 REPEAT 选项来循环播放。

嗯,有。记得在哪里读到过,PLAY 指令的 REPEAT 选项只能作用于 MPEGVideo 类型的文件。(时间也这么晚了, 我想记录完直接睡觉,就不找引用来源了。)

那就很简单,打开的时候作为 MPEGVideo 打开就好了。

strSend = "OPEN " & Chr$(34) & FileName & Chr$(34) & " ALIAS " & STRING_SOUND_ALIAS & " TYPE MPEGVIDEO"
Call mciSendString(strSend, rbuf, 0, 0)

  

坑2:文件名长度

应该好了吧……来,试一下。

D:\Music\Themes\Anison Piano ~marasy animation songs cover on piano~ marasy\marasy - Anison Piano ~marasy animation songs cover on piano~.wav

嗯?没有特殊字符啊,为什么还是无法播放呢?(我没写调试输出,所以如果看成一个黑盒的话,我看到的结果只有无法播放。)总长度也明显小于 MAX_PATH,文件夹名称和文件名称长度也正常。

去看 mciSendString() 的返回字符串太麻烦了,推理吧。

你看,MCI 是一个历史久远的东西,那么……历史久远!历史久远的东西,在这种情况下能造成影响的,很大的可能性是8.3文件名(短文件名)。

那也好办。Windows API,GetShortPathName(),不要重复发明轮子。

strShortFilename = String$(MAX_PATH, vbNullChar)
Call GetShortPathName(FileName, strShortFilename, MAX_PATH)
strShortFilename = Strip(strShortFilename)
strSend = "OPEN " & Chr$(34) & strShortFilename & Chr$(34) & " ALIAS " & STRING_SOUND_ALIAS & " TYPE MPEGVIDEO"
Call mciSendString(strSend, rbuf, 0, 0)

  

(注意,上面的代码还有一个小坑。如果不进行字符串“修剪”去掉冗余的 vbNullChar 的话,也是无法播放的。不过我觉得这没必要单独提出来,就放在这括号里了。)

去睡觉

至少刚刚用了几个sample去测试,都通过了。今早应该能醒来吧……设置闹钟然后睡觉吧。

这篇文章就当是备忘录好了……看官别抱太大希望……

最后补充说明,MCI 其实是调用相应的已注册的解码器来工作的,所以其实如果安装了相应的解码器,就能播放相应格式的音频文件。当然,raw PCM 和 waveform 肯定要用 native 的 API 直接解决对不对……如果微软那群人不这么想我也没办法……

时间: 2024-10-29 19:07:08

mciSendString 的两个小坑的相关文章

win2016 配置IIS 和mysql5.7 迁移数据表的两个小坑

今天配置一整天,就IIS都装了一整天,都是没办法安装.net3.5的问题. 最后解决办法:https://help.aliyun.com/knowledge_detail/38203.html?spm=5176.7842557.2.14.3D80U7 1.使用管理员身份打开 PowerShell 2.输入: Set-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU' -Name UseWU

Xcode7 的两个小坑

Xcode7 还在 beta.时不时崩一下什么的倒也是预料之中的事.没料到的是之前用着好好的,今天升完 El Capitan 之后,模拟器竟然不见了,设备倒是在 schema 栏右边里能看到.只是注明不能用. 看了看系统日志是 Simulator 服务不停的崩.查了查.有人已经分析过了: http://stackoverflow.com/questions/31551480/xcode-7-beta-4-ios-simulators-missing-and-not-installable 简单点

支付宝集成的小坑--集成支付宝集成总结(1)

现在很多公司的APP都会有支付环节,特别是现在的O2O项目,我参与过的近两个项目都有集成支付宝对两次集成做一下总结: 第一次集成支付宝,由于我们的做后台的大牛写了十几年代码,而且以前是银行项目的总监,整个支付流程基本上一切听大牛的,我按照做就行.基本上按照支付宝的流程走,支付环节没怎么出问题,总体来说支付流程比较perfect. 第一次集成的小坑: 1)无非就是支付宝里面使用了一些框架如SBJson 等常用的开源框架,而我们项目中也会用到SBJson类似的框架,估计会出现冲突 冲突的解决办法:A

一个关于Windows下SetCursorPos和GetCursorPos的小坑

这两天在做一个编辑特定格式Mesh的小工具,需要检查鼠标的移动,一般来说可以用WM_MOUSEMOVE事件解决的,但是我为了省事用了定时查询+设置的方式,也就是: 1 void Frame(void) 2 { 3 //do something else... 4 5 POINT cursorPos; 6 GetCursorPos(&cursorPos); 7 curMoveX = cursorPos.x - cursorBaseX; 8 curMoveY = cursorPos.y - curs

C#中的Infinity有个小坑

(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 昨天家里有事,上网也不方便,就没有推送文章.今天很累,也不长篇大论了.简单介绍一下最近遇到的一个小坑. 我们知道,在C#中主要有如下几种数值类型:int.long.decimal.float和double.对于前三种,如果除零,那么会提示表达式错误(直接书写数字)或报DivideByZeroException异常(使用变量):对于后面两种,除零会得到正负无穷大,除非你是0.0/0.0那么会得到NaN

bottle的几个小坑

距离我在<web.py应用工具库:webpyext>里说要换用bottle,已经过去快两个月了--事实上在那之前我已经開始着手在换了.眼下那个用于 Backbone.js 介绍的样例程序已经完毕更换,其他一些原来基于web.py的应用也在逐步重写中.期间各种小坑不断,还好至今还没有碰到什么大坑--只是目測应该也不会有大坑. unicode 作为非英文应用的开发人员,unicode是一个绕只是去的坑. web.py 对此是不作处理的,全都按原编码方式处理. bottle 则作了一个有点奇怪的处理

[tf] tensorflow中dropout小坑记录

tensorflow中dropout小坑记录 几天看别人写的代码,有几行总觉得没什么用,自己写了小程序测试了下,果然. 虽然平时这么写的人不多,但是还是记录下吧. 对tensorflow使用时要转变下思维,和平时写的C++不太一样,只是建立了一个静态图. 在list中进行for循环,内部操作是局部变量操作,与原list无关. tf.nn.dropout操作,在随机舍掉部分节点的同时为了保证输出值的平稳会将保留下的节点数据除以keep_prob进行扩大. 赋值操作即使赋值给原数据,也是两个op节点

JavaScript的兼容小坑和调试小技巧

JavaScript作为一种弱类型编程语言,入门简单,只要稍微注意一下IE方面的兼容性,就可以很好的使用它. 本文主要是对IE兼容的小坑和调试的小技巧进行举例分析,并给出解决方法. 1.var str: 与 var str = "":的区别 1 <script> 2 var Str1; 3 for (var i = 0; i < 3; i++) 4 { Str1 += "xxx" } 5 alert(Str1); 6 var Str2 = &quo

用两个小例子来解释单例模式中的“双重锁定”

学习单例模式时,好多人都不太理解双重锁定.学完后突然想到一个很有趣的例子. 单例模式结构图: 代码: Singleton类 class Singleton { private static Singleton instance; private static readonly object syncRoot = new object(); //程序运行时创建一个静态只读的进程辅助对象 private Singleton() { } //用private修饰构造方法,防止外界利用new创建此类实例