C语言如何同时播放多个音乐,如何使用PlaySound函数不被打断

前言

前段时间为了写 贪吃蛇2.0版 程序需要用到背景音乐以及主音乐摸索了半天,在博客以及百度找了好几天,发现很少有人回答了这个答案,有的也只是用多管道多线程控制音乐,本人又不会使用多线程,使用多线程也不方便,所以反复在各大网站摸索之后终于找到了解决办法,该方法不需要建立多管道多进程,不需要C++,C语言就能搞定,并且自定义函数后多出可以随时调用,方便快捷,今天分享出来给大家。

查找这些资料以及写这篇文章都花费了我不少相思,希望您能留下您的点赞,你的点赞是我继续创作的最大动力!!

正言

PlaySound函数在播放音乐时,遇到下一个PlaySound函数时会被打断是不可避免的,所以我们可以同时引用另外一个函数:

BOOL mciSendString(“Command1 FILE Command2”,NULL,0,NULL);

先介绍:

PlaySound函数

PlaySound函数只能播放WAV格式的音频文件,无法播放MP3格式或者其它格式的音频文件,所以在使用的时候记得先行转码在使用

使用PlaySound函数时要包含以下头文件:

#include<windows.h>
#pragma comment(lib,"winmm.lib")

函数原型:

BOOL PlaySound( TEXT(“FILE”) , NULL , DWORD fdwSound );

FILE:

[路径+] 媒体文件名
如:

123.wav

D:\\Download\\123.wav

fdwSound:

用来指定播放模式,常用参数如下:

*SND_ASYNC
用异步方式播放声音,PlaySound函数在开始播放后立即返回。

SND_FILENAME
pszSound参数指定了WAVE文件名。

SND_LOOP
重复播放声音,必须与SND_ASYNC标志一块使用。

代码实例:

//循环播放同目录下的123.wav音频文件
PlaySound(TEXT("123.wav"),NULL,SND_FILENAME | SND_ASYNC | SND_LOOP);

//播放一次绝对目录D:\Download\下的123.wav音频文件
PlaySound(TEXT(D:\\Download\\123.wav),NULL,SND_FILENAME | SND_ASYNC);

//结束播放音频
PlaySound(NULL,NULL,SND_FILENAME);

我们可以写一个控制播放音乐的自定义函数:

void Music(char c[],int n)
{
	switch(n)
	{
		case 2:
			//循环播放音乐,在遇到下一次播放音乐时被打断 
			PlaySound(TEXT(c),NULL,SND_FILENAME | SND_ASYNC | SND_LOOP);
			break;
		
		case 1:
			//播放一次音乐,在遇到下一次播放音乐时被打断 
			PlaySound(TEXT(c),NULL,SND_FILENAME | SND_ASYNC);
			break;
			
		case 0:
			//停止播放背景音乐 
			PlaySound(NULL,NULL,SND_FILENAME);
			break;
	}
}

再介绍:

mciSendString函数

mciSendString函数对大部分媒体文件都适用,包括视频文件、音频文件都适用
在播放音频文件时似乎播放MP3格式有效,无法播放WAV格式的音频(可能是我电脑的问题吧)
mciSendString函数实际上是MCI函数,该函数执行效率比较低
需要引用头文件(实际上跟PlaySound函数一样):

#include<windows.h>
#pragma comment(lib,"winmm.lib")

函数原型:

BOOL mciSendString("Command1 FILE Command2",NULL,0,NULL);

Command1:

对媒体文件的操作方式。

常见的操作方式:

play
开始播放媒体文件

pause
暂停播放媒体文件

stop
结束播放媒体文件

FILE:

[路径+] 媒体文件名
如:

123.mp3

D:\\Download\\123.mp3

Command2:

播放媒体文件的模式
常见的播放模式:

repeat
重复播放

from A to B
从磁道A播放到磁道B结束

wait
等待媒体文件播放结束后命令才返回

不加Command2命令则默认播放一次

实例:

//重复播放同目录下的123.MP3文件
mciSendString("play 123.mp3 repeat",NULL,0,NULL);
//播放一次绝对目录下的D:\\Download\\123.MP3音乐
mciSendString("play D:\\Download\\123.mp3",NULL,0,NULL);
//结束播放
mciSendString("close D:\\Download\\123.mp3",NULL,0,NULL);

所以我们可以写一个自定义播放背景音乐的自定义函数:

//n代表模式,0为停止播放,1为播放一次,2为重复播放
void BGM(char c[],int n)
{
	char File[100];
	
	if(n==1||n==2)
		strcpy(File,"play ");	
	else if(n==0)
		strcpy(File,"close ");
		
	strcat(File,c);
	if(n==2)
		strcat(File," repeat");
		
	mciSendString(File,NULL,0,NULL);
}

以上基本上就是两个函数的基本用法,通过mciSendString函数播放背景音乐,用PlaySound函数播放游戏其他音乐一举两得

接下上代码:

#include<stdio.h>
#include<conio.h>
#include<windows.h>
#pragma comment(lib,"Winmm.lib")

//控制游戏前端音乐 
void Music(char c[],int n)
{
	switch(n)
	{
		case 2:
			//循环播放音乐,在遇到下一次播放音乐时被打断 
			PlaySound(TEXT(c),NULL,SND_FILENAME | SND_ASYNC | SND_LOOP);	break;
		
		case 1:
			//播放一次音乐,在遇到下一次播放音乐时被打断 
			PlaySound(TEXT(c),NULL,SND_FILENAME | SND_ASYNC);				break;
			
		case 0:
			//停止播放背景音乐 
			PlaySound(NULL,NULL,SND_FILENAME);								break;
	}
}

 
//控制背景音乐 
//n代表模式,0为停止播放,1为播放一次,2为重复播放
void BGM(char c[],int n)
{
	char File[100];
	if(n==1||n==2)	strcpy(File,"play ");
	else if(n==0)	strcpy(File,"close ");
	strcat(File,c);
	if(n==2)		strcat(File," repeat");
	mciSendString(File,NULL,0,NULL);
}

int main()
{
	//创建字符用于获取键盘输入
	char c;
	//打开背景音乐
	BGM("Music\\超级玛丽.mp3",2); 
	while(1)
	{
		if(kbhit())
		{
			c=getch();
			//如果按下ESC键则退出循环,ESC键的ASCII码为:27
			if(c==27)	break;
			//否则播放123.WAV媒体文件
			else		Music("123.wav",1);
		}
	}
	//关闭背景音乐
	BGM("Music\\超级玛丽.mp3",0);
	return 0;
}

以上是本次的全部内容。

第一次写博客,修改了一下午,给个点赞不过分吧^ _ ^

  • 80
    点赞
  • 105
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开心一课

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值