API 之 playsound

7 篇文章 0 订阅
3 篇文章 0 订阅

=========================================================

原文

函数定义是:
BOOL sndPlaySound(LPCSTR lpszSound, UINT fuSound);

其中,lpszSound一般是wav文件的文件名,fuSound是参数。常见的fuSound参数有:
SND_ASYNC 异步播放,即程序不等播放结束就继续执行,播放背景声。
SND_SYNC 同步播放,即播放结束才继续执行
SND_LOOP 循环播放
SND_NODEFAULT 如果找不到指定文件,保持安静。如不指定此参数,则播放系统默认警告音。如没有默认警告音,则为失败。

执行成功返回TRUE,失败返回FALSE。

要停止播放只需再执行一遍lpszSound参数为NULL的sndPlaySound函数。

要求:
程序要加入Mmsystem.h或Windows.h头文件,编译时链入Winmm.lib库。

限制:
sndPlaySound只能播放wav文件。
wav文件在播放前将被装入内存,所以不能太大。
只能同时播放一个声音。后一个声音会关闭前一个声音。

函数PlaySound是sndPlaySound的增强版,支持更多声音类型和fuSound参数,并可以播放内存和资源中的声音。

================================================================

原文

在编写windows程序时,很多时候要用到播放音乐的函数,而windows下就提供了一个函数PlaySound

首先说下这个函数的使用范围,PlaySound函数用于播放一个音频文件,且这个文件时wav格式(且只能是wav格式),如果你需要混音,比如同时播放两首音乐,那就超出了Playsound的能力,你需要用directsound的库

下面看一下百度百科中PlaySound函数的原型(http://baike.baidu.com/view/1014003.htm):

  BOOL PlaySound(LPCSTR pszSound, HMODULE hmod,DWORD fdwSound);

pszSound就是你要播放的文件路径,fdwSound就是你要选择的播放模式

(1) PlaySound("ring.wav",NULL,SND_FILENAME|SND_SYNC);

(2) PlaySound("ring.wav",NULL,SND_FILENAME|SND_ASYNC |SND_LOOP);

以上是常用的两种播放形式,

(1)中是播放目录下的ring.wav文件,但是该函数阻塞,当ring.wav播放完毕才返回

(2)中的函数是循环播放,函数执行完立刻返回,也就是非阻塞式。

由上面可以看出SND_SYNC参数表示同步播放,也就是阻塞型。SND_ASYNC 表示异步播放,非阻塞。SND_LOOP表示循环播放但是它必须和SND_ASYNC参数同时使用,如果是循环播放必然是异步的。

在播放音频时,你可能会停止播放,PlaySound停止播放的办法就是播放另一音频,如果播放的音频为空,就会停止原来音频。如下:

PlaySound(0,0,SND_FILENAME);

这个方法很明显可以停止异步播放模式,形如(2),但是(1)中是阻塞式,如果在不影响其他其他工作时,使用(1)播放就要新开一个线程。这时如果你想在住线程中用PlaySound(0,0,SND_FILENAME);停止播放音频,就不会得到想要的结果。

主线程()                                                              播放线程()

{                                                                        {

       PlaySound(0,0,SND_FILENAME);                     PlaySound("ring.wav",NULL,SND_FILENAME|SND_SYNC);

}                                                                       }

这时主线程调用PlaySound(0,0,SND_FILENAME);不会停止播放而是阻塞在PlaySound函数,当播放线程中音频播放完毕,主线程函数才会继续执行。

所以如果想用PlaySound(0,0,SND_FILENAME);停止播放另一线程的同步播放模式,不会得到想要的结果

=======================================



C++ 播放声音 
一、播放系统的消息声音
   BOOL WINAPI MessageBeep( __in  UINT uType);
   MSDN 中对这个函数的说明是:播放一个波形文件(也就是wav格式),每一个声音类型的波形声音在注册表中有一个条目(entry)指定.
MessageBeep(MB_OK);  
Sleep(3000);  
MessageBeep(MB_ICONWARNING);  
Sleep(3000);  
MessageBeep(MB_ICONSTOP);  
Sleep(3000);  
MessageBeep(MB_ICONERROR);  
Sleep(3000);  
MessageBeep(MB_ICONEXCLAMATION);  
 
二、播放mav格式声音
    BOOL PlaySound(LPCTSTR pszSound,HMODULE hmod,DWORD fdwSound);


    具体的函数详情参照MSDN吧


    一个简单实例如下


 
PlaySound("C:/love.wav",AfxGetInstanceHandle(), SND_FILENAME|SND_ASYNC );  
 


三、利用MCI 接口实现播放任意格式声音
#include <mmsystem.h> //导入声音头文件库   
#pragma comment(lib,"winmm.lib")//导入声音的链接库  
 
然后直接用mciSendString函数即可  
mciSendString("open C:/123.mp3" , NULL, 0, 0);  
mciSendString("play C:/123.mp3 ", NULL, 0, 0);   
 
上面两条 便可以播放 C盘下的123.mp3 了
具体的mci 编程,有待进一步的学习
四、利用强悍的MCIWndCreate()函数
HWND m_hwndMCI;  
if(m_hwndMCI!=NULL) //建立一个MCIWND 窗口   
{  
   MCIWndDestroy(m_hwndMCI);  
}  
int type=0; //隐藏默认工具栏0 表显示   
CString filename="C:/123.mp3"; //要播放的文件文件名   
m_hwndMCI=MCIWndCreate(m_hWnd,AfxGetInstanceHandle(),type,filename);  
MCIWndPlay(m_hwndMCI);  
 
五、利用Windows Media Player 控件
通过project--->add to project--->Components and Controls -->Registered ActiveX Controls--->Windows Media Player
Insert这个控件后,我们project中会自动添加17个类,这些都是Windows Media Player 控制相关的,同时我们的UI设计时的tools bar 中会多
出一个控件,那就 Windows Media Player ,拖到窗口上就能使用。
我们可以把这个控件关联成Control 类型的变量,这样,程序中就利用这个变量来设置WMPlayer。
如我们添加成变量名为:m_ctlWMPlayer,则利用,m_ctrWMPlayer.SetUrl("C:/123.mp3"),就可以播放我们c盘下的名为123.MP3的文件了
更深入的运用,有待更进一步的学习

#include <iostream>
#include <AFX.H>
#include <WININET.H>
#include <WINDOWS.H>
#include <MMSYSTEM.H>


using namespace std;

int main()
{
	cout<<"HELLO11"<<endl;
	PlaySound("37907.wav",NULL,SND_ASYNC |SND_LOOP);
	//mciSendCommand("open C:/high.mp3",0,0,0);
	//mciSendCommand("play high.mp3",NULL,0,0);
	mciSendString("open high.mp3" , NULL, 0, 0);  
	mciSendString("play high.mp3 ", NULL, 0, 0);  
	MessageBeep(-1);
	Sleep(1200);
	MessageBeep(MB_ICONWARNING);	
	Sleep(1200);
	MessageBeep(MB_ICONSTOP);
	Sleep(1200);
	MessageBeep(MB_ICONERROR);
	Sleep(1200);
	MessageBeep(MB_ICONEXCLAMATION);
	Sleep(200000);
	return 0;
}

mciSendString这个函数需要引入 Winmm.lib 这个库
引入方法有两种
1、直接在 CPP 文件中这么写 #pragma   comment(lib, "Winmm.lib ") 
2、在   project-> settings-> link-> 对象库模块 中加 Winmm.lib
打开和关闭光驱的命令
	mciSendString("set cdaudio door open",NULL,NULL,NULL);
	Sleep(2000);
	mciSendString("set cdaudio door closed",NULL,NULL,NULL);



360个人图书馆上的博客感觉写的还挺全面的大笑

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值