Управление форвардом из Си++

Здесь обсуждаются любые продукты компании СофтЛаб-НСК для телевизионного вещания (Форвард Т, Форвард ТС, Форвард Голкипер, Форвард Рефери, Форвард Офис, Форвард Инжест)

Модераторы: ElenVR, Людмила, PR

Ответить
AntonChik
Сообщения: 83
Зарегистрирован: 16 фев 2010 15:32
Откуда: г. Красноярск

Сообщение AntonChik »

Со скоростью разобрался, добавил тэг <Speed value=5/> , работает.
Теперь столкнулся с тем, что вопреки документации, не могу передать в GetTaskInfo/GetTaskInfoNew последний параметр &pDuration, компилятор ругается, что этот параметр лишний.
function does not take 3 arguments
function does not take 5 arguments
работает только вот так:

Код: Выделить всё

pIObject->GetTaskInfo&#40;bstrTaskFile,&pLoop&#41;;
pIObject->GetTaskInfoNew&#40;bstrTaskFile,&pLoop,&hres,&errorMsg&#41;;
Даниленко Сергей
Сообщения: 7093
Зарегистрирован: 26 фев 2004 09:53
Откуда: Techsupport SoftLab-NSK

Сообщение Даниленко Сергей »

Со скоростью разобрался, добавил тэг <Speed value=5/> , работает.
По поводу свойств в файле SLTitleTsk. Есть значения свойств титровальных элементов "по умолчанию", они подсвечиваются жирным шрифтом в листе свойств. Такие значения в файл не сохраняются. Если вам нужно узнать как называется то или иное свойство, следует изменить его в FDTitleDesigner и пересохранить файл. После этого название (и значение) этого свойства появится в файле.
AntonChik
Сообщения: 83
Зарегистрирован: 16 фев 2010 15:32
Откуда: г. Красноярск

Сообщение AntonChik »

Сергей, я думал об этом, и даже проверял. Там получается наоборот, жирным подсвечиваются измененные значения. Тем не менее как я ни менял различные свойства, в файл ничего кроме того, что я привел пару постов выше не сохранялось, к моему сожалению.

Но на данный момент мне более актуально получить информацию по GetTaskInfo/GetTaskInfoNew
Даниленко Сергей
Сообщения: 7093
Зарегистрирован: 26 фев 2004 09:53
Откуда: Techsupport SoftLab-NSK

Сообщение Даниленко Сергей »

Я был не прав. В файле SLTitleTsk сохраняются только задания для титровальных элементов из титровального объекта. Именно только задания. Свойства сохраняются в самом проекте.
Сейчас поговорю с разработчиками как можно вывернуться из этой ситуации.
shish07
Сообщения: 13
Зарегистрирован: 28 мар 2011 17:04

Сообщение shish07 »

Добрый день!
AntonChik писал(а):Со скоростью разобрался, добавил тэг <Speed value=5/> , работает.
Действительно, в файл .SLTitleTsk сохраняются только задания, но восстанавливаются всё, что там есть.
Свойства сохраняются в проект (.SLTitleProj) и только не совпадающие с дефолтными. Изменённые значения свойств выделяются чёрным.
AntonChik писал(а):Теперь столкнулся с тем, что вопреки документации, не могу передать в GetTaskInfo/GetTaskInfoNew последний параметр &pDuration, компилятор ругается, что этот параметр лишний.
function does not take 3 arguments
function does not take 5 arguments
работает только вот так:

Код: Выделить всё

pIObject->GetTaskInfo&#40;bstrTaskFile,&pLoop&#41;;
pIObject->GetTaskInfoNew&#40;bstrTaskFile,&pLoop,&hres,&errorMsg&#41;;
Вы, очевидно, импортировали объекты с помощью директивы:

Код: Выделить всё

#import "SLTMTitleRunTime.tlb"
или что-то похожее.
Эта директива преобразует сигнатуры методов, учитывая атрибуты, заданные при описании методов.
Данные методы описаны так:

Код: Выделить всё

HRESULT GetTaskInfo &#40;&#91;in&#93; BSTR fileName, &#91;out&#93; long * loop, &#91;out,retval&#93;double * pRetVal &#41;;
HRESULT GetTaskInfoNew&#40;
                    &#91;in&#93; BSTR fileName, 
                    &#91;out&#93; long* loop, 
                    &#91;out&#93; HRESULT* hr, 
                    &#91;out&#93; BSTR* errorMsg, 
                    &#91;out, retval&#93; double* pRetVal&#41;;
Это приводит к тому, что сигнатуры методов выглядят так:

Код: Выделить всё

    double GetTaskInfo &#40;_bstr_t fileName, long * loop &#41;;
    double GetTaskInfoNew &#40;_bstr_t fileName, long * loop, HRESULT * hr, BSTR * errorMsg &#41;;
Т.е. нужные вам значения возвращаются в качестве результата.
Можно вызывать их примерно так:

Код: Выделить всё

try &#123;
 double duration = pIObject->GetTaskInfo&#40;bstrTaskFile,&loop&#41;;
 double duration1 = pIObject->GetTaskInfoNew&#40;bstrTaskFile,&loop,&hres,&errorMsg&#41;;
&#125;
catch &#40;_com_error& err&#41; &#123;
// ошибка 
&#125;
Нужно помнить, что изменённые методы бросаются исключениями типа

Код: Выделить всё

_com_error
в случае если исходный метод вернул код ошибки (HRESULT), с установленным старшим битом.

Кстати, директива #import, добавляет и методы с неизменённой сигнатурой, только в названиях приставляется приставка raw_.
Например:

Код: Выделить всё

HRESULT __stdcall raw_GetTaskInfoNew &#40;BSTR fileName, long * loop, HRESULT * hr, BSTR * errorMsg, double * pRetVal &#41;
всё это можно увидеть с сгенерённых компилятором файлах sltmtitleruntime.tlh и
sltmtitleruntime.tli
эти файлы появляются в подпапках Debug/Release

ну и на последок - компилятору можно запретить преобразовывать сигнатуры методов с помощью атрибута raw_interfaces_only
Например:

Код: Выделить всё

#import "SLTMTitleRunTime.tlb" raw_interfaces_only
тогда никаких оболочек для методов генерироваться не будет, все сигнатуры сохранятся, но ошибки надо будет проверять самостоятельно

Код: Выделить всё

 double duration;
 HRESULT hr = pIObject->GetTaskInfo&#40;bstrTaskFile,&loop, &duration&#41;;
 if &#40;FAILED&#40;hr&#41;&#41; &#123;
   // ошибка 
 &#125;
Примерно так.
Извиняюсь за много буковок :roll:
Удачи!
AntonChik
Сообщения: 83
Зарегистрирован: 16 фев 2010 15:32
Откуда: г. Красноярск

Сообщение AntonChik »

shish07, спасибо за подробный ответ, теперь все понятно.
AntonChik
Сообщения: 83
Зарегистрирован: 16 фев 2010 15:32
Откуда: г. Красноярск

Сообщение AntonChik »

Игорь Таранцев писал(а):В SDK в файле SLDSTitleCLSID.txt указаны другие GUID-ы, например, для плат FD322, FD422, FD842.
  • extern "C" const GUID CLSID_SLDirectShowTitleEngine
    extern "C" const GUID CLSID_SLTMTitleServerTargetMgr
    extern "C" const GUID CLSID_SLTMTitleNoPremultServerTargetMgr
    extern "C" const GUID CLSID_SLTMTitleArtServerTargetMgr
    extern "C" const GUID CLSID_SLTMTitleBackServerTargetMgr
    extern "C" const GUID CLSID_SLTMTitleCTV1ServerTargetMgr
    extern "C" const GUID CLSID_SLTMTitleCTV2ServerTargetMgr
    extern "C" const GUID CLSID_DVMTitleTargetMgr
    extern "C" const GUID CLSID_FDExtTitleFilterMgr
подскажите, пожалуйста, какой из них для FD422 ?
Игорь Таранцев
Сообщения: 493
Зарегистрирован: 04 янв 2004 12:45
Откуда: СофтЛаб-НСК

Сообщение Игорь Таранцев »

CLSID_FDExtTitleFilterMgr - для плат FD322, FD422, FD842 и для виртуальных плат, настраиваемых в FDConfig2.
AntonChik
Сообщения: 83
Зарегистрирован: 16 фев 2010 15:32
Откуда: г. Красноярск

Сообщение AntonChik »

Игорь Таранцев, спасибо.
Правильно ли я понимаю, что не смогу как-то адаптировать и прикрутить к плате FD422 программу, написанную с использованием SLTMTitleRunTime SDK?
Т.е. SLTMTitleRunTime SDK написан исключительно под возможности FD300?
Игорь Таранцев
Сообщения: 493
Зарегистрирован: 04 янв 2004 12:45
Откуда: СофтЛаб-НСК

Сообщение Игорь Таранцев »

AntonChik писал(а):Игорь Таранцев, спасибо.
Правильно ли я понимаю, что не смогу как-то адаптировать и прикрутить к плате FD422 программу, написанную с использованием SLTMTitleRunTime SDK?
Т.е. SLTMTitleRunTime SDK написан исключительно под возможности FD300?
Нет, не правильно. SLTMTitleRunTime SDK работает на новых платах без проблем. При открытии титровального проекта надо по другому выбирать работающую плату (CLSID_FDExtTitleFilterMgr + индекс устройства обычно гораздо больше номера платы). Для начала можно просто перебрать опытным путем индексы от 0 до 9.
AntonChik
Сообщения: 83
Зарегистрирован: 16 фев 2010 15:32
Откуда: г. Красноярск

Сообщение AntonChik »

О, спасибо, что обнадежили. Я прикрутил CLSID_FDExtTitleFilterMgr, ошибки при запуске не получил, но и на выходе не получил картинки.
Полез вчитываться в доки, а там только FD300 упоминается.
Правда индексы еще не перебирал. Попробую чуть позже.
Игорь Таранцев
Сообщения: 493
Зарегистрирован: 04 янв 2004 12:45
Откуда: СофтЛаб-НСК

Сообщение Игорь Таранцев »

Для плат FD322/FD422/FD842 очень важно выбрать правильный индекс. С вероятностью 50% индекс "0" работать не будет.
Чтобы понять, какой индекс Вам нужен есть новый интерфейс - ISLTitleServerTargetMgrExt, у которого есть метод:

Код: Выделить всё

get_TargetInfoByIndex&#40;&#91;in&#93; long TargetNumber, &#91;out&#93; BSTR* pTargetName, &#91;out&#93; char* pValid&#41;
Этот метод возвращает имя титровального ядра и его "валидность". Если *pValid равен TRUE(1), то титровальное ядро с указанным индексом можно использовать для работы.
Например, у платы FD422 доступно 7 титровальных ядер, из которых валидными будут одно или два (в зависимости от выбранной конфигурации платы).
Рекомендуемое поведение - показать пользователю список имен всех валидных титровальных ядер, доступных в системе, а когда он выберет имя, по имени получить индекс ядра с помощью метода get_TargetIndexByName (или просто заранее запомнить индексы всех ядер, которые Вы нашли в системе).
AntonChik
Сообщения: 83
Зарегистрирован: 16 фев 2010 15:32
Откуда: г. Красноярск

Сообщение AntonChik »

Спасибо за пояснение, возьму на заметку. Пока что так подобрал, все заработало.
int
Сообщения: 21
Зарегистрирован: 03 июн 2013 14:12

Сообщение int »

Здравствуйте!

Вы были правы, действительно regasm есть в нужной версии .NET. И она действительно стоит. Не правы вы были только в том, что если стоит .NET 3.5, то regasm отработает. Помогли исправить эту проблему ваши же рекомендации по установке Forward с сайта.

Итак, суть проблемы:
1) Чистая Window 7 32 битная установка (не 8!!!)
2) Установка Forward
3) При запуске Forward OnAIR получаем ошибку, что класс не зарегистрирован. Мой софт, ест-но, тоже не работает.

На сайте написано вот что:
The Windows 8.1 (32/64-bit) OS requires package activation only.

Залезли, посмотрели - действительно отключены опции в настройках .Net

UPDATE:
Переставили Forward снова. Перегрузили машину. Снова не работает. Теперь уже и regsvr32 не помогает (в реестре все прописано как надо).
Изображение

Что-то мне везет с этой ошибкой. Правда на этот раз Windows и Forward ставил не я. И компьютер даже другой. Так что на мои кривые руки сослаться не получается. :(
UPDATE:
Снесли 4-ой Framework, перегрузили машину. Все нормально. Я уже боюсь делать какие-то предположения. Только я их делаю, и они оказываются неверны.
Даниленко Сергей
Сообщения: 7093
Зарегистрирован: 26 фев 2004 09:53
Откуда: Techsupport SoftLab-NSK

Сообщение Даниленко Сергей »

Честно говоря даже не знаю что и ответить: "...смешались в кучу кони, люди..."

Не правы вы были только в том, что если стоит .NET 3.5, то regasm отработает.
Почему?
2) Установка Forward
Какую версию ПО ставили?
Залезли, посмотрели - действительно отключены опции в настройках .Net
Это про Win 7 или Win 8?

Теперь уже и regsvr32 не помогает (в реестре все прописано как надо).
Чему не помогает?
Что в реестре прописано как надо?
Снесли 4-ой Framework, перегрузили машину.
Зачем его ставили? Он не содержит 3.5 и в данный момент нам не нужен.
Ответить