2014-05-12 54 views
1

PlaySound完美地工作,如果我需要一个嘟嘟声。下面举例说明我的代码片段:如何多次使用播放功能?

PlaySound(TEXT("C:\\Test1.wav"), NULL, SND_ASYNC); 

我的问题是,如何使用这个函数两次或两次以上,因为它只能播放一次,不管我放在一起的重复量。我也试过这个:

PlaySound(TEXT("C:\\Test1.wav"), NULL,SND_FILENAME|SND_LOOP|SND_ASYNC); 

它在连续循环中发出嘟嘟声。如何玩这个两次或三次等?

使用循环无助于

+0

当你在(外部)循环中使用它时,是否尝试将'SND_ASYNC'更改为'SND_SYNC'?即使这种变化起作用,但它并不理想,因为它会阻止。 – jedwards

+0

@timCastelijns我刚刚尝试过。它仍然只玩一次。 – user133442

回答

0

问题是SND_ASYNC标志。它表示您希望立即返回此通话并在后台播放声音。

如果你在循环中这样做,因为它会在声音仍在播放的情况下返回,它将与下一个呼叫重叠并且什么也不做,因为IIRC,应用程序只能同时对PlaySound进行一次呼叫。

解决的方法是用SND_SYNC替换SND_ASYNC(或将其删除,因为它是默认值)。如果你需要这个呼叫是异步的,你可以创建一个线程并发出你想要播放的声音。该线程将同步播放,但您的其他线程不会注意到。

+0

和tim Casterlijins,它工作。之后,我也不得不删除getch()命令,而在上面的代码中我没有提到。多谢你们 – user133442

1

该API有两个选项。播放同步或异步。

如果您玩同步,那么您的线程将阻塞,直到声音播放完毕。你可以把它放在一个循环中并随意多次调用,但是当你播放声音时你的线程会被阻塞。

如果你玩异步,那么你的线程不会阻塞,但你没有任何可靠的方法来控制重复次数。

我看到两种解决方案:从原始创建一个新的声音,添加正确的重复次数并播放一次,或创建后台线程播放指定次数的声音 - 在此背景下线程可以安全地使用上面描述的同步播放方法。