首页
论坛
课程
招聘
[原创]在VC6的工程中加入播放xm音乐的功能(详细操作过程)
2005-12-4 02:45 15186

[原创]在VC6的工程中加入播放xm音乐的功能(详细操作过程)

2005-12-4 02:45
15186
1、下载minifmod播放组件,地址是http://www.fmod.org/files/minifmod170.zip,其中关键就是两个文件,minifmod.lib和minifmod.h。
2、将上两个文件复制到你的工程目录中,并在源码中添加#include "minifmod.h"。
3、找一个.xm的音乐,添加到资源中,资源类别名为"BGM",资源ID任意,通常是MUSIC。
4、因为用到了minifmod.lib,所以在工程属性中link项里要加上minifmod.lib。如果原先没有winmm.lib,也加上,因为fmod里会调用。
5、将下面的代码复制到你的工程的任一源文件中,通常是main.cpp。该段代码来自minifmod压缩包的main.cpp,主要实现播放资源中的xm音乐。我给出的是经过修改的,省去了定义#define USEMEMLOADRESOURCE
typedef struct 
{
       int length;
       int pos;
       void *data;
} MEMFILE;


unsigned int memopen(char *name)
{
       MEMFILE *memfile;

       memfile = (MEMFILE *)calloc(sizeof(MEMFILE),1);
       {       
              HRSRC              rec;
              HGLOBAL              handle;

              rec = FindResource(NULL, name, "BGM");
              handle = LoadResource(NULL, rec);
              
              memfile->data = LockResource(handle);
              memfile->length = SizeofResource(NULL, rec);
              memfile->pos = 0;
       }
       return (unsigned int)memfile;
}

void memclose(unsigned int handle)
{
       MEMFILE *memfile = (MEMFILE *)handle;
       free(memfile);
}

int memread(void *buffer, int size, unsigned int handle)
{
       MEMFILE *memfile = (MEMFILE *)handle;

       if (memfile->pos + size >= memfile->length)
              size = memfile->length - memfile->pos;

       memcpy(buffer, (char *)memfile->data+memfile->pos, size);
       memfile->pos += size;
       
       return size;
}

void memseek(unsigned int handle, int pos, signed char mode)
{
       MEMFILE *memfile = (MEMFILE *)handle;

       if (mode == SEEK_SET) 
              memfile->pos = pos;
       else if (mode == SEEK_CUR) 
              memfile->pos += pos;
       else if (mode == SEEK_END)
              memfile->pos = memfile->length + pos;

       if (memfile->pos > memfile->length)
              memfile->pos = memfile->length;
}

int memtell(unsigned int handle)
{
       MEMFILE *memfile = (MEMFILE *)handle;

       return memfile->pos;
}


6、准备工作做完了,现在就是在你需要的地方添加播放音乐的代码了。
FMUSIC_MODULE *mod;//定义变量
FSOUND_File_SetCallbacks(memopen, memclose, memread, memseek, memtell);//将播放功能设置为内存(资源)音乐播放
mod=FMUSIC_LoadSong(MAKEINTRESOURCE(MUSIC), NULL);//打开资源
FMUSIC_PlaySong(mod);开始播放
FMUSIC_StopSong(mod);//停止播放
FMUSIC_FreeSong(mod);//释放资源,在我的机器上一执行就死,干脆不用

7、如果link时遇到莫名的错误,说是MSVCRT.lib中什么函数重复定义了,就在工程属性的link里将MSVCRT.lib忽略掉。

就这么多了,够详细吧!大家都来在注册机里加一个酷酷的背景音乐吧!

看雪招聘平台创建简历并且简历完整度达到90%及以上可获得500看雪币~

收藏
点赞0
打赏
分享
最新回复 (18)
雪    币: 114
活跃值: 活跃值 (10)
能力值: ( LV9,RANK:530 )
在线值:
发帖
回帖
粉丝
lnn1123 活跃值 13 2005-12-4 07:59
2
0
雪    币: 201
活跃值: 活跃值 (34)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
dwing 活跃值 1 2005-12-4 11:48
3
0
fmod的库设计的很好,据说魔兽世界的声音部分用的就是fmod库.
minifmod开源不错,可惜只支持xm.

我重新精简优化过这个库,使用下面简单的接口就可以用了:
extern "C" void __stdcall zXM_play(unsigned char *data);
extern "C" void __stdcall zXM_stop();
extern "C" long __stdcall zXM_getms();
附件:zxm.rar
雪    币: 454
活跃值: 活跃值 (22)
能力值: ( LV12,RANK:660 )
在线值:
发帖
回帖
粉丝
prince 活跃值 16 2005-12-4 19:55
4
0
好极了,呵呵!
雪    币: 199
活跃值: 活跃值 (160)
能力值: ( LV12,RANK:2670 )
在线值:
发帖
回帖
粉丝
KuNgBiM 活跃值 66 2005-12-4 21:58
5
0
最初由 dwing 发布
fmod的库设计的很好,据说魔兽世界的声音部分用的就是fmod库.
minifmod开源不错,可惜只支持xm.

我重新精简优化过这个库,使用下面简单的接口就可以用了:
extern "C" void __stdcall zXM_play(unsigned char *data);
........


音乐不错!!能否共享一下大大您的XM音乐集合?
雪    币: 5002
活跃值: 活跃值 (169)
能力值: (RANK:1170 )
在线值:
发帖
回帖
粉丝
tankaiha 活跃值 29 2005-12-4 23:44
6
0
老林那天在工具版发了个网址,xm音乐大全啊。
有时也可以自己转,比如我N年前最喜欢玩的无悔的十字军战士的背景音乐,做注册机就很爽啊,转之。不过那个是amf格式的,要用转换工具。再发上两个小工具,amf2mod,mod2xm附件:amf2mod.rar 附件:mod2xm.zip

btw:dwing的库做的好,用起来更简单了。要是就是方便!
雪    币: 454
活跃值: 活跃值 (22)
能力值: ( LV12,RANK:660 )
在线值:
发帖
回帖
粉丝
prince 活跃值 16 2005-12-5 09:03
7
0
再顶一下,欢迎更多资源!
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jjwangjun 活跃值 2005-12-6 17:43
8
0
学习中:
雪    币: 192
活跃值: 活跃值 (69)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9494 活跃值 2005-12-11 22:01
9
0
终于在BCB下搞定了,楼上的.lib不能用在BCB中,没办法,摸索半天,不容易
雪    币: 201
活跃值: 活跃值 (10)
能力值: ( LV9,RANK:770 )
在线值:
发帖
回帖
粉丝
kyc 活跃值 19 2006-1-6 19:02
10
0
雪    币: 201
活跃值: 活跃值 (10)
能力值: ( LV9,RANK:770 )
在线值:
发帖
回帖
粉丝
kyc 活跃值 19 2006-1-6 19:11
11
0
学会了,谢谢.
再请问有没有MIDI 转XM 的软件.
雪    币: 201
活跃值: 活跃值 (10)
能力值: ( LV9,RANK:770 )
在线值:
发帖
回帖
粉丝
kyc 活跃值 19 2006-1-6 19:12
12
0
谢谢dwing tankaiha
雪    币: 201
活跃值: 活跃值 (34)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
dwing 活跃值 1 2006-1-7 10:58
13
0
最初由 kyc 发布
学会了,谢谢.
再请问有没有MIDI 转XM 的软件.


由于midi的标准问题,现在还没有很好的MIDI转XM软件。
如果确实需要,可以试试Modplug Tracker,它有自带的midi音色库,可以导入MIDI,保存成XM。
http://www.skycn.com/soft/1897.html

由于目前系统都自带或安装了DirectX,直接播放MIDI也可以,代码量更少.
http://bbs1.pediy.com:8081/showthread.php?s=&threadid=19415
http://bbs.pediy.com/showthread.php?s=&threadid=19415
雪    币: 201
活跃值: 活跃值 (10)
能力值: ( LV9,RANK:770 )
在线值:
发帖
回帖
粉丝
kyc 活跃值 19 2006-1-8 10:06
14
0
谢谢dwing ,可惜DirectXSDK太大了.
雪    币: 201
活跃值: 活跃值 (34)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
dwing 活跃值 1 2006-1-8 17:46
15
0
最初由 kyc 发布
谢谢dwing ,可惜DirectXSDK太大了.


网上有DirectX 8.0SDK的精简版,只有include和lib。
另外VC7.1(VS2003)自带了DX8.1SDK.
雪    币: 201
活跃值: 活跃值 (10)
能力值: ( LV9,RANK:770 )
在线值:
发帖
回帖
粉丝
kyc 活跃值 19 2006-1-8 20:47
16
0
我装了VC.NET VS2003
能否给我原代码.
THX!
雪    币: 201
活跃值: 活跃值 (34)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
dwing 活跃值 1 2006-1-9 15:24
17
0
最初由 kyc 发布
我装了VC.NET VS2003
能否给我原代码.
THX!

我指的是MIDI的播放可以直接用DirectMusic播放.
XM格式很不流行,微软是不会直接支持的。
雪    币: 450
活跃值: 活跃值 (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cnnets 活跃值 2006-4-28 15:18
18
0
最初由 dwing 发布
fmod的库设计的很好,据说魔兽世界的声音部分用的就是fmod库.
minifmod开源不错,可惜只支持xm.

我重新精简优化过这个库,使用下面简单的接口就可以用了:
extern "C" void __stdcall zXM_play(unsigned char *data);
........


抱歉,论坛发不了信息,所以回了几个月前的老贴。见谅。

dwing大大,我在RadASM 2.2.0.7 cao_cong汉化增强版中用你的库在连接时出现:
zXM.h(6) : error C2059: syntax error : 'string'
zXM.h(7) : error C2059: syntax error : 'string'
zXM.h(8) : error C2059: syntax error : 'string'

不知何故,能帮一下忙吗?

后来处理一下zXM.h如下:
#ifdef __cplusplus
#if __cplusplus
extern "C"{
 #endif
 #endif /* __cplusplus */
#pragma once
////////////////////////////////////////////////////////////////////////
extern  "C" void __stdcall zXM_play(unsigned char *data);
extern  "C" void __stdcall zXM_stop();
extern  "C" long __stdcall zXM_getms();
////////////////////////////////////////////////////////////////////////
 #ifdef __cplusplus
 #if __cplusplus
}
#endif
#endif /* __cplusplus */

却出现这问题:
tt.obj : error LNK2001: unresolved external symbol _zXM_stop
tt.obj : error LNK2001: unresolved external symbol _zXM_play
tt.exe : fatal error LNK1120: 2 unresolved externals

刚学C++,希望帮一下,谢了。

源码见附件,使用环境为RadASM2.2.0.7汉化增强版 完全安装。
上传的附件:
雪    币: 201
活跃值: 活跃值 (30)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
kangaroo 活跃值 6 2006-8-26 14:18
19
0
把音乐数据放在一个数组里面,请问有没有自动将xm文件转换成C++标准数组的软件,这样就方便多了
游客
登录 | 注册 方可回帖
返回