zoukankan      html  css  js  c++  java
  • 【转】windows播放函数PlaySound

    http://blog.csdn.net/qiuchenl/article/details/7774641

    在编写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);停止播放另一线程的同步播放模式,不会得到想要的结果

  • 相关阅读:
    Spring Boot实战二:集成Mybatis
    Spring Boot实战一:搭建Spring Boot开发环境
    Oracle 11g安装和PL/SQL连接完全解读(连接本地数据库)
    Spring事务详解
    RabbitMQ学习笔记六:RabbitMQ之消息确认
    RabbitMQ学习笔记五:RabbitMQ之优先级消息队列
    RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决)
    RabbitMQ学习笔记三:Java实现RabbitMQ之与Spring集成
    RabbitMQ学习笔记二:Java实现RabbitMQ
    Spark 读 Hive(不在一个 yarn 集群)
  • 原文地址:https://www.cnblogs.com/Lthis/p/4461010.html
Copyright © 2011-2022 走看看