C 语言:能不能用C语言编写程序来播放音频文件?

C 语言:能不能用C语言编写程序来播放音频文件?,第1张

一.在程序中直接播放声音文件

在VC++ 中的多媒体动态连接库中提供了一组与音频设备有关的函数。利用这些函数可以方便地播放声音。最简单的播放声音方法就是直接调用VC++中提供的声音播放函茄芦数BOOL sndPlaySound ( LPCSTR lpszSound,UINT fuSound )或BOOL PlaySound( LPCSTR lpszSound, HMODULE hmod, DWORD fuSound )其中参数lpszSound是需要播放声音的.W***文件的路径和文件名, hmod在这里为NULL,fuSound是播放声音的标志,详细说明请参考VC++中的帮助。 例如播放C:soundmusic.wav可以用sndPlaySound ("c:\sound\music.wav",SND_ASYNC)或PlaySound("颤尺带c:\sound\music.wav",NULL, SND_ASYNC|SND_NODEFAULT )如果没有找到music.wav文件,第一种格式将播放系统默认的声音,第二种格式不会播放系统默认的声音。

二.将声音文件加入到程序中

在VC++的程序设计中,可以利用各种标准的资源,如位图,菜单,对话框等。同时VC++也允许用户自定义资源,因此我们可以将声音文件作为用户自定义资源加入程序资源文件中,经过编译连接生成EXE文件,实现无.W***文件的声音播放。要实现作为资源的声困正音文件的播放,首先要在资源管理器中加入待播放的声音文件。

具体步骤入下:

1.获得包含资源的模块句柄:

HMODULE hmod=AfxGetResourceHandle()

2.检索资源块信息:

HRSRC hSndResource=FindResource(hmod,MAKEINTRESOURCE(IDR_W***E1),_T("W***E"))

3. 装载资源数据并加锁:

HGLOBAL hGlobalMem=LoadResource(hmod,hSndResource)

LPCTSTR lpMemSound=(LPCSTR)LockResource(hGlobalMem)

4.播放声音文件:

sndPlaySound(lpMemSound,SND_MEMORY));

5.释放资源句柄:

FreeResource(hGlobalMem)

/************************************************************************

[文件名] C51音乐程序(八月桂花)

[功能]通过单片机演奏音乐

注意:通过了74HC14控制ULN2003 驱动芯片驱动蜂鸣器 *

/**********************************************************************/

#include <REG52.H>

#include <INTRINS.H>绝中

//本例采用89C52, 晶振为11.0592MHZ

//关于如何编制音乐代码, 其实十分简单,各位可以看以下代码.

//频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少散冲拍

//所以拿出谱子, 试探编吧!

sbit Beep = P1^5

unsigned char n=0 //n为节拍常数变量

unsigned char code music_tab[] ={

0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率冲宏歼常数, 节拍常数,

0x20, 0x40, 0x1C , 0x10,

0x18, 0x10, 0x20 , 0x10,

0x1C, 0x10, 0x18 , 0x40,

0x1C, 0x20, 0x20 , 0x20,

0x1C, 0x20, 0x18 , 0x20,

0x20, 0x80, 0xFF , 0x20,

0x30, 0x1C, 0x10 , 0x18,

0x20, 0x15, 0x20 , 0x1C,

0x20, 0x20, 0x20 , 0x26,

0x40, 0x20, 0x20 , 0x2B,

0x20, 0x26, 0x20 , 0x20,

0x20, 0x30, 0x80 , 0xFF,

0x20, 0x20, 0x1C , 0x10,

0x18, 0x10, 0x20 , 0x20,

0x26, 0x20, 0x2B , 0x20,

0x30, 0x20, 0x2B , 0x40,

0x20, 0x20, 0x1C , 0x10,

0x18, 0x10, 0x20 , 0x20,

0x26, 0x20, 0x2B , 0x20,

0x30, 0x20, 0x2B , 0x40,

0x20, 0x30, 0x1C , 0x10,

0x18, 0x20, 0x15 , 0x20,

0x1C, 0x20, 0x20 , 0x20,

0x26, 0x40, 0x20 , 0x20,

0x2B, 0x20, 0x26 , 0x20,

0x20, 0x20, 0x30 , 0x80,

0x20, 0x30, 0x1C , 0x10,

0x20, 0x10, 0x1C , 0x10,

0x20, 0x20, 0x26 , 0x20,

0x2B, 0x20, 0x30 , 0x20,

0x2B, 0x40, 0x20 , 0x15,

0x1F, 0x05, 0x20 , 0x10,

0x1C, 0x10, 0x20 , 0x20,

0x26, 0x20, 0x2B , 0x20,

0x30, 0x20, 0x2B , 0x40,

0x20, 0x30, 0x1C , 0x10,

0x18, 0x20, 0x15 , 0x20,

0x1C, 0x20, 0x20 , 0x20,

0x26, 0x40, 0x20 , 0x20,

0x2B, 0x20, 0x26 , 0x20,

0x20, 0x20, 0x30 , 0x30,

0x20, 0x30, 0x1C , 0x10,

0x18, 0x40, 0x1C , 0x20,

0x20, 0x20, 0x26 , 0x40,

0x13, 0x60, 0x18 , 0x20,

0x15, 0x40, 0x13 , 0x40,

0x18, 0x80, 0x00

}

void int0() interrupt 1 //采用中断0 控制节拍

{ TH0=0xd8

TL0=0xef

n--

}

void delay (unsigned char m) //控制频率延时

{

unsigned i=3*m

while(--i)

}

void delayms(unsigned char a) //豪秒延时子程序

{

while(--a) //采用while(--a) 不要采用while(a--)各位可编译一下看看汇编结果就知道了!

}

void main()

{ unsigned char p,m //m为频率常数变量

unsigned char i=0

TMOD&=0x0f

TMOD|=0x01

TH0=0xd8TL0=0xef

IE=0x82

play:

while(1)

{

a: p=music_tab[i]

if(p==0x00) { i=0, delayms(1000)goto play} //如果碰到结束符,延时1秒,回到开始再来一遍

else if(p==0xff) { i=i+1delayms(100),TR0=0goto a} //若碰到休止符,延时100ms,继续取下一音符

else {m=music_tab[i++], n=music_tab[i++]} //取频率常数 和 节拍常数

TR0=1//开定时器1

while(n!=0) Beep=~Beep,delay(m)//等待节拍完成, 通过P1口输出音频(可多声道哦!)

TR0=0//关定时器1

}

}

其实实现这个稿巧禅功能也不是很难,但是你一定要选择一款合适的语音芯片,我前两天刚做了一个这方面的东东,51上的控制很简单,只有几条语句,控制一下语音芯片的时序就可以宽闷了。下面是控制代码:

//TG2 、TG1 分别语音芯片键尘的两个控制管脚

TG2 = 0

for(i=0i<250i++) // 延时750us

TG2 = 1

for(i=0i<250i++) // 延时750us

TG1 = 1

for(j=0j<360j++) // 延时 2 ms

TG1 = 0

就这几条语句,就可以发音了。希望对你有所帮助。

并且不同的语音芯片,控制方法也不一样,你应该把你的语音芯片的型号告诉我们,也许正好有人用过呢,或者正在用,大家可以一起交流一下的,


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12452585.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存