Я хочу играть в wav-файл синхронно по потоку gui, но мой звонок в PlaySync возвращается раньше (и преждевременно останавливает воспроизведение). Файл wav составляет 2-3 минуты.SoundPlayer.PlaySync останавливается преждевременно
Вот что мой код выглядит следующим образом:
//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 некоторое время назад, но это было вызвано тайм-аут, который я не подозреваю, что проблема здесь. Короче (< 1min) файлы кажутся прекрасными, поэтому я могу решить вручную отредактировать более длинные файлы, а затем воспроизвести их отдельно с несколькими вызовами.
Дополнительная информация: Я заметил, что один и тот же файл одновременно останавливается. Файлы были созданы с использованием Audacity. Возможно ли, что PlaySync ожидает некоторую кодировку файлов, отличающихся от того, что я создал Audacity?
Почему вы хотите использовать 'PlaySync' вместо' Play'? Не было бы лучше не блокировать поток пользовательского интерфейса? – AShelly
Если вы просматриваете свой код в отладчике, выполняется ли фактически выполнение на 'PlaySync'? –
@ В самом деле, в моем случае действительно желательно блокировать поток gui. (Я знаю, странно.) – JeffE