最近拿到一個需求,需要調整一下現有的語音播放邏輯,因為有的語音需要循環播放,有的不需要
我們以前的邏輯是都不循環的,所以采用了SpVoice (引入SpeechLib.dll)的異步播放,我拿到了之后發現異步和同步其實應該是都可以實現的,但是異步我認為有一個問題就是不知道什么時候能讓循環停止,
搜了很多也沒有解決我的問題,於是我嘗試了用同步來解決這個問題
以下是我改進的代碼:
/// <summary>
/// 同步播放語音
/// </summary>
/// <param name="voiceContent">語音內容</param>
/// <param name="isLoop">是否循環播放</param>
/// <param name="isSelectOver">查詢是否結束</param>
public void playSoundAsync(string voiceContent, bool isLoop, bool isSelectOver = false)
{
VoiceContent = voiceContent;
int i = 1;
//是否循環播放
if (isLoop)
{
//最多循環10次
while (i <= 10)
{
//如果查詢結束
if (isSelectOver)
{
//關閉當前語音
voice.Speak(string.Empty, SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak);
break;
}
else
{
//播放語音
voice.Speak(voiceContent, SpeechVoiceSpeakFlags.SVSFIsXML | SpeechVoiceSpeakFlags.SVSFlagsAsync);
i++;
}
}
/// 同步播放語音
/// </summary>
/// <param name="voiceContent">語音內容</param>
/// <param name="isLoop">是否循環播放</param>
/// <param name="isSelectOver">查詢是否結束</param>
public void playSoundAsync(string voiceContent, bool isLoop, bool isSelectOver = false)
{
VoiceContent = voiceContent;
int i = 1;
//是否循環播放
if (isLoop)
{
//最多循環10次
while (i <= 10)
{
//如果查詢結束
if (isSelectOver)
{
//關閉當前語音
voice.Speak(string.Empty, SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak);
break;
}
else
{
//播放語音
voice.Speak(voiceContent, SpeechVoiceSpeakFlags.SVSFIsXML | SpeechVoiceSpeakFlags.SVSFlagsAsync);
i++;
}
}
}
else
{
//如果查詢結束
if (isSelectOver)
{
//關閉語音
voice.Speak(string.Empty, SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak);
}
else
{
//播放語音
voice.Speak(voiceContent, SpeechVoiceSpeakFlags.SVSFIsXML | SpeechVoiceSpeakFlags.SVSFlagsAsync);
}
}
else
{
//如果查詢結束
if (isSelectOver)
{
//關閉語音
voice.Speak(string.Empty, SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak);
}
else
{
//播放語音
voice.Speak(voiceContent, SpeechVoiceSpeakFlags.SVSFIsXML | SpeechVoiceSpeakFlags.SVSFlagsAsync);
}
}
}
此時還有一個問題,循環的時候第二個參數傳true ,但是后續還有要播放的內容時,需要先停止上一個循環,也就是第三個參數需要傳true(默認false)
而后還要再調用以下方法來播放新的語音,我認為這里其實可能會有更好的辦法,目前我還沒有想到,如果有哪位大神有好的意見,歡迎一起頭腦風暴。