我有一个较旧的实现,使用NAudio 1.6播放铃声,表示应用程序中的来电。一旦用户接受呼叫,我就会停止播放。
基本上完成了以下操作:
1.一旦我收到必须发出呼叫信号的事件,就会启动计时器
2.在播放器上的此计时器Play()
内
3.当计时器再次启动时,如果通过CurrentTime
属性TotalTime
对WaveStream
属性Stop()
进行检查,则会执行检查
4.当用户接受呼叫时,在播放器上调用BufferedWaveProvider
并停止计时器
关键是,我们有时会在播放仍然重复的情况下运行,尽管计时器已停止并且播放器上已调用Stop()。
在以下链接中,我读到代码中使用的类WaveChannel32
和BufferedWaveProvider
始终用0填充缓冲区。
http://mark-dot-net.blogspot.com/2011/05/naudio-and-playbackstopped-problem.html
不停止播放是否可能是由于使用了课程WaveChannel32
和AudioFileReader
?
在NAudio 1.7中,PadWithZeroes
类就在那里。这个类也用零填充吗?我没有在这个课程中找到像AudioFileReader
这样的属性。在这种循环播放的情况下是否可以使用TimerElapsed
?
在 void TimerElapsed(object sender, ElapsedEventArgs e)
{
try
{
WaveStream stream = _audioStream as WaveStream;
if (stream != null && stream.CurrentTime >= stream.TotalTime )
{
StartPlayback();
}
}
catch (Exception ex)
{
//do some actions here
}
}
private WaveStream CreateWavInputStream(string path)
{
WaveStream readerStream = new WaveFileReader(path);
if (readerStream.WaveFormat.Encoding != WaveFormatEncoding.Pcm)
{
readerStream = WaveFormatConversionStream.CreatePcmStream(readerStream);
readerStream = new BlockAlignReductionStream(readerStream);
}
if (readerStream.WaveFormat.BitsPerSample != 16)
{
var format = new WaveFormat(readerStream.WaveFormat.SampleRate, 16, readerStream.WaveFormat.Channels);
readerStream = new WaveFormatConversionStream(format, readerStream);
}
WaveChannel32 inputStream = new WaveChannel32(readerStream);
return inputStream;
}
以下代码创建输入流:
$this->db->where("column_name = 'Click on the Event or Booking Code you would like to use.'", NULL, FALSE);