Переписываю свой старый видеоплеер. Использую библиотеку DirectShowLib. Знаю, что для этого есть более удобные библиотеки, но я использую именно эту.
Собственно, видео-файл удалось запустить с первой же попытки, а проблема вот в чём. В интернете нашел, что фильтр можно создать так:
public static IBaseFilter CreateFilter(Guid guid)
{
Type type = Type.GetTypeFromCLSID(guid);
return (IBaseFilter)Activator.CreateInstance(type);
}
Я добиваюсь того, чтобы методы просто возвращали коды ошибок как в WinAPI. Ведь так логичнее, чем ловить исключение на верхнем уровне. Зачем мне исключение на верхнем уровне, если это приведёт к прекращению работы нижнего? Или не приведёт?
Объясняю на примере плеера. Есть класс Player и код в главной форме:
player = new Player();
player.OutputWindow = panel1;
player.FileName = @"D:\video.avi";
try
{
player.Play();
}
catch ().....
Если плеер не сможет загрузить какой-нибудь фильтр, то произойдёт ошибка и выкинет экскепшен, и финита ля комедия, верно?
А если, допустим, видео-дорожку он не сможет отрендерить, а аудио-дорожку сможет (или наоборот), тогда не будет экскепшена и воспроизведется что-то одно? Они же по отдельности рендерятся. Как try верхнего уровня узнает, что именно не отрендерилось - видео или аудио?
Если видео не отрендерилось, то забиваем болт на видео и переходим к аудио (или наоборот). А если ловить экскепшен на верхнем уровне, то так уже не сделаешь (ведь метод рендеринга умрёт от любой ошибки), правильно я понял?
Ну даже если отдельными, и что? Ошибка же может в разных местах произойти (при загрузке каждого объекта). А как верхний уровень узнает, где именно она произошла?
А как узнать, на каком объекте произошла ошибка, чтобы вывести её код и имя объекта?
И как тогда перебрать по очереди все кодеки из заранее вбитого списка, если загрузка или подключение одного провалилась?
Но мне не нужен полный стектрейс в логе, а нужен лог вот такого вида:
Это легко делается без ловли экскепшена верхнем уровне. А с его ловлей я вообще не пойму, как вы предполагаете это сделать
Тут, конечно, не допилено. Но смысл не в этом.
Если вообще не кидать экскепшен на верхний уровень, а делать все проверки в методе построения Графа (и тут же писать лог). А на верхний уровень возвращать только общий код ошибки, типа успешно / не успешно (ну или какую-нибудь структуру). Единственная проблема, которую я вижу, это то что каждый создаваемый объект надо проверять через try catch.
Так это ж ничем не отличается от ловли экскепшена. Можно вывести только одну ошибку, что бы в ней ни было. И тогда придется писать отдельный метод рендеринга для каждого кодека. Ну или я опять ничего не понял.
Я о том, что можно выводить разные свойства конкретных типов исключений.
Так а без исключений чем отличается?)
Точно так же if + log + return. С исключениями наоборот проще, перекинуть исключение (если надо добавить детали типа имени фильтра), в цикле обхода кодеков поймать и вывести.
Я не пойму, как должен выглядеть такой цикл. Там же есть разные режимы (с ручным поиском пинов и без). В каждом режиме своя логика соединения фильтров. Я не пойму, как можно перебирать кодеки вне метода, где они соединяются. Возможно, в процессе написания кода я бы это понял, но сейчас пока не доходит.