前言:
由于之前发的exe版是使用exe4j将jar包转换成的,运行时仍需要jdk环境(1.6/1.8,32/64位),感觉很不方便,因此准备开发一个windows可以直接使用的版本。
经过一段时间的开发(踩坑),终于使用C语言(初步)完成了这个txt音乐播放器。
本次仍会将下载链接发布在下方,与之前不同的是,本次会将C语言源码连同exe文件一起发布,欢迎有需要的朋友下载,欢迎大佬继续进行优化。
免费下载链接:
https://github.com/BlackHoleSeventh/
积分下载链接(最开始是0积分免费,后来CSDN自己就把积分改了):
https://download.csdn.net/download/BHSZZY/12435440
技术要点(踩过的坑):
在开发过程中遇到的坑总结如下:
1.C-Free使用PlaySound找不到方法与连接库的问题
本人用C-Free开发时,为了播放音乐,用到了PlaySound方法;按照网上的说明添加了相关语句:
#include <mmsystem.h>
pragma comment (lib , "winmm.lib")
结果在使用 PlaySound(url, NULL, SND_FILENAME | SND_ASYNC | SND_NOWAIT); 方法时,报错:
[Error] C: xtmusic m.c:174: undefined reference to `PlaySoundA@12'
百度发现,需要手动添加链接库,但是都是VC、VS中的添加方法,好不容易找到C-Free的添加方法了,如下(构建-构建选项-连接):
结果添加之后,还是报错:
[Error] E:C-Free5mingwinld.exe: cannot find -lE:C-Free5mingwliblibwinmm.a
继续百度,发现上方错误信息中多了一个"-l",是C-Free编译时自己给添加了个参数,就导致找不到这个链接库了;(cannot find -lE: ,E盘之前的-l,大佬没写明白,我还找了半天)
解决方法呢?大佬说在Linker(CUI)里面的 -l(Libs) 去掉-l后就能通过编译(好像是C-Free设置菜单附近);但是我愣是没找到(现在也没找到)
那咋办?难道得手动输命令编译?
还好又找到一个大佬的文章,说配置参数就行了:
还是老地方,在下方参数写上"-lwinmm"就行了;不用加pragma comment (lib , "winmm.lib"),你加了C-Free也识别不了;也不用添加连接(没找到在哪里设置去掉-l)
这个参数的意思是,由于我需要的是winmm.lib的连接库,但是在C-Free中用的是libwinmm.a,其实基本是一个东西,只是C-Free中用lib+winmm+.a这个文件,发现这两个文件的中间命名相同就行了(都是winmm);然后编译时,增加参数“-lwinmm”,就可以把这个文件编译到程序中了(个人感觉相当于jar包),其中"-l"指lib,"winmm"指连接库。如果需要其它连接库也按照格式添加参数即可。
2.PlaySound播放多个音乐的问题
终于能使用PlaySound方法播放音乐了,然而又遇到一个问题,PlaySound只能一次播放一个音乐,如果再次调用该方法播放其它音乐,上一个音乐就会被中断。
联系到本人的txt音乐播放器,如果播放每个音符间隔时间长的音乐的话,还凑付能听;如果播放时间间隔短的、节奏快的音乐,听起来就磕磕绊绊的,很不连贯 。
通过各种百度,发现并没有参数能解决这个问题,异步参数SND_ASYNC也不行(本来就得加,不加还会完整播完一个音符再播下一个音符,更难受)。(还有人说加SND_NOWAIT,加了和没加一样,感觉就没有这个参数)
在此先吐槽一句,这也太菜了!本人写java版的就没遇到这个问题!
好吧,看看有没有其它方法。
有人说可以开多线程、多进程、多对象来让PlaySound同时播放多个音乐,但是研究了半天,感觉不太行,不符合要求(好吧,也许是没看懂);而且多对象,如果可以的话我也想啊,但是C语言怎么给PlaySound创建对象?还是多个?也许C++可以?
有人说可以先将多个wav混音成一个,然后用PlaySound方法播放;在此感觉大佬666,然而本人并不会代码混音,还得确定混音开始时间结束时间、插入空白间隔;根据txt简谱的不同,每次执行都要现场混音,总觉得耗时也是个问题,而且不方便;
还有人说可以用MciSendString()方法播放音乐,再次研究了半天,测试了几波,发现还是不行,听起来就像跳音播放一样,总会漏几个音没有播(总是有节奏快的音乐的,跳着播可还行)
继续百度,难道C语言就这两个播放音乐的方法吗?
嗯……还真没找见其余方法,这个问题目前还没有解决。
PS:在某些情况下,运行本软件播放节奏快的音乐时,还能凑付听;在某些情况下就基本不能听了,有些乱。代码和参数都没动,很奇怪。
3.总结
还是之前用exe4j将jar包转成的txt音乐播放器.exe感觉好用一点,音乐播放也连贯;这个C语言开发的txt音乐播放器还有很多需要完善的地方,关键的是播放快节奏音乐时音符切换导致的停顿很明显,不连贯。还请大家帮忙提提建议与修改方法,在此提前谢过大家了!
资源免费,代码免费;原创代码,欢迎分享,但是分享后请勿收费,谢谢!