SoundPlayer.PlaySync останавливается преждевременно
-
11-10-2019 - |
Вопрос
Я хочу воспроизводить файл wav синхронно в потоке графического интерфейса, но мой призыв к Playsync возвращается рано (и преждевременно останавливает воспроизведение). Файл WAV составляет 2-3 минуты.
Вот как выглядит мой код:
//in gui code (event handler)
//play first audio file
JE_SP.playSound("example1.wav");
//do a few other statements
doSomethingUnrelated();
//play another audio file
JE_SP.playSound("example2.wav");
//library method written by me, called in gui code, but located in another assembly
public static int playSound(string wavFile, bool synchronous = true,
bool debug = true, string logFile = "", int loadTimeout = FIVE_MINUTES_IN_MS)
{
SoundPlayer sp = new SoundPlayer();
sp.LoadTimeout = loadTimeout;
sp.SoundLocation = wavFile;
sp.Load();
switch (synchronous)
{
case true:
sp.PlaySync();
break;
case false:
sp.Play();
break;
}
if (debug)
{
string writeMe = "JE_SP: \r\n\tSoundLocation = " + sp.SoundLocation
+ "\r\n\t" + "Synchronous = " + synchronous.ToString();
JE_Log.logMessage(writeMe);
}
sp.Dispose();
sp = null;
return 0;
}
Некоторые вещи, о которых я подумал, - это тайм -аут загрузки, и воспроизведение звука в другой ветке, а затем вручную «заморозить» графический интерфейс, заставив потоку графического интерфейса ждать продолжительности звукового файла. Я попытался удлинить тайм -аут нагрузки, но это ничего не сделало.
Я не совсем уверен, какой лучший способ получить продолжительность файла WAV без использования кода, написанного кем -то, кто не я/Microsoft. Я полагаю, что это можно рассчитать, так как я знаю размер файла, и все свойства кодирования (битрейт, скорость дискретизации, размер выборки и т. Д.) Постоянны во всех файлах, которые я собираюсь воспроизводить. Может ли кто -нибудь уточнить, как вычислить продолжительность файла WAV, используя эту информацию? То есть, если ни у кого нет представления о том, почему PlaySync возвращается рано.
Редакты:
Следует отметить: я столкнулся с аналогичной проблемой в VB 6 некоторое время назад, но это было вызвано тайм -аутом, что я не подозреваю, что здесь проблема. Более короткие (<1 мин) файлы, кажется, играют нормально, поэтому я могу решить вручную отредактировать более длинные файлы, а затем воспроизвести их отдельно с несколькими вызовами.
Дополнительная информация: я заметил, что тот же файл останавливается последовательно одновременно. Файлы были созданы с использованием смелости. Было бы возможно, что PlaySync ожидает определенного кодирования файлов, которые отличаются от того, что у меня было смелость?
Решение
На случай, если кто -то еще сталкивается с проблемами с синхронным воспроизведением файлов WAV, вот метод, который я написал, который использует WMP в качестве альтернативы:
public static int playSoundWMP(string soundFile, bool synchronous = true)
{
Stopwatch sw = new Stopwatch();
sw.Start();
wmp.URL = soundFile;
wmp.controls.play();
Thread.Yield();
while (wmp.playState == WMPLib.WMPPlayState.wmppsTransitioning)
{
Application.DoEvents();
Thread.Yield();
}
int duration = Convert.ToInt32(wmp.currentMedia.duration * 1000);
double waitTime = wmp.currentMedia.duration;
if (synchronous)
{
Thread.Sleep(duration);
}
long elapsed = sw.ElapsedMilliseconds;
sw.Stop();
sw = null;
return (int) wmp.currentMedia.duration * 1000;
}
Этот метод использует WMP для воспроизведения аудиофайла вместо класса SoundPlayer, поэтому он может воспроизводить более крупные файлы WAV более надежно ...