love5an: (R)
Такое написал: https://github.com/Lovesan/SimpleAudioPlayer

Вобщем, библиотечка, основанная на DirectShow, которая позволяет проигрывать аудио. В т.ч. не только из файлов, а скажем и по http.

Библиотечка имеет COM-интерфейс, соответственно, ее можно использовать из разных языков - включены, в частности, CLI-интерфейс на чистом Си, интерфейсы для .NET и для Common Lisp.


(defvar *player* (make-instance 'cl-sap:simple-audio-player
                                :autoplay t))

(setf (cl-sap:sap-source *player*) *url*)

COM и C++

Oct. 30th, 2012 03:19 am
love5an: (Default)
COM - очень хорошая штука. Очень.

На C++ невозможно писать без lightweight-вариации COM(т.е. IUnknown и все дела) или его аналога.

Управление памятью, ABI, инкапсуляция, динамические приведения типов. Очень удобно.

Я лично все свои проекты на C++ стараюсь завернуть в lightweight COM.

Но проблемы есть даже с ним, и проблемы эти в первую очередь всплывают в управлении памятью. Например, это проблемы циклических ссылок. Что бы там не думали C++фанбои, циклические ссылки встречаются в программировании очень, очень часто, и в любом проекте, уровнем выше хелловорлда с переворачиванием матриц на стеке.

Как пример - отношение объектов родитель <-> ребенок(или часть <-> целое) - так как обе стороны отношения хранят ссылки друг на друга, и ни один умный указатель проблемы циклических ссылок не решает, за такими делами надо очень пристально следить и тестировать. Тут кстати надо заметить, что в реальной практике циклические ссылки очень часто встречаются опосредственно. Т.е. например один объект хранит указатель на второй объект, второй хранит указатель на третий, третий хранит на четвертый, четвертый на пятый, а пятый на первый. Ну и пиздец, стоит не продумать мельчайшую подробность в отношениях, и всё, целый граф объектов утекает. Это, кстати, по-моему, основная причина утечек памяти в современных веб-браузерах.

Проблемы эти неискоренимы покуда мы используем C++, вообще никаким образом. Потому что, да, GC нет.

Другой род проблем(который кстати затрагивает вышеупомянутое), как я уже, вроде бы, писал в juick - обработка событий. С lightweight COM я делаю outgoing-интерфейсы(конечно не с таким количеством boilerplate, как в ядре COM, а просто тупо позволяю объекту принимать интерфейсы, методы которых он вызывает при возникновении события). Это, кстати, и проще, и даже удобнее, чем Qt-шные сигналы и слоты(я их лично не перевариваю - они и выглядят угребско, и в использовании не особо удобны, и, опять же, с управлением памятью не все так гладко).

Короче, вердикт - C++ это пиздец говно. Не используйте C++. Ну, на крайний случай используйте C++/CX
love5an: (Default)
Когда у меня случается депрессия, или случается очередной запой, я отвлекаюсь тем, что пишу код. В этот раз мне почему-то приспичило написать какой-нибудь свой COM-компонент, и подумав, я решил его в деталях разобрать.

http://habrahabr.ru/post/149277
love5an: (Default)
https://github.com/Lovesan/D3DU

Добавил новый пример - кубик с фракталом Мандельброта на гранях, который рисуется пиксельными шейдерами(если поставить сильно большой MAX_ITERS в шейдерах, дико тормозит -- но, все-равно, отрисовка на порядки быстрее, чем на процессоре(даже если использовать SSE) -- на моей не сильно новой видеокарте например при 80 итерациях вполне себе живое и двигающееся изображение -- а если ту же фигню рисовать например через GDI+, то оно будет тормозить просто невозможно. Современные GPU таки великая вещь.).
https://github.com/Lovesan/D3DU/tree/master/MandelbrotCube
картинка )

Также, добавил полезный интерфейс ID3DUFloatAnimation (сигнатуру практически украл из WPF, угу)
Read more... )

Также, добавил три функции-обертки над D3DCompile:
Read more... )

Так как у всего этого, как я уже говорил, lightweight-COM API, то использовать можно из любого языка, который способен вызывать сишный код.

Вообще, я это для стартапа пишу, но почему бы не поделиться - все-таки это не рокет сайнс, и не так уж сложно в реализации, чтобы скрывать сорцы.

D3DU

Feb. 16th, 2012 10:43 pm
love5an: (Default)
Кстати, я тут начал писать небольшую библиотеку-обертку над Direct3D 10/11

На плюсцах, но с COM-интерфейсом(т.е. использовать можно хоть из лиспа).

Может, кому еще полезно будет. Сорцы вот тут:
https://github.com/Lovesan/D3DU
Там есть и пример - в директории Triangle.
love5an: (Default)
Продолжаем серию постингов "C++ - говно". На этот раз у нас в гостях C#, а тема - написание COM-компонентов.

В интернете, да и не только в интернете, я много раз слышал, что COM - крайне неудобная в использовании технология, громоздкая и переусложненная. А теперь еще к этому добавляются реплики о том, что и устаревшая.

На самом деле это не так. COM в своей основе крайне прост, и является одной из самых удобных технологий для интероперабельности между различными платформами, рантаймами языков программирования и программами. Для случая RPC же, COM вообще является чуть ли не самой простой и удобной из всех таких технологий, и одной из наименее затратных по памяти и производительности(особенно в сравнении со всякими XML-RPC).
Read more... )

GC и COM

Mar. 10th, 2011 07:36 pm
love5an: (Default)
Все-таки я решил все проблемы с GC и апартаментами COM в Doors.

Да, все именно так, как вы думаете - теперь время жизни COM-интерфейсов и COM-wrapper'ов полностью управляется сборщиком мусора, причем управляется, вне зависимости от типов апартаментов, правильно и без глюков.

Естественно, бывают ситуации, когда COM-объекты должны иметь строго определенное время жизни, и поэтому я оставил возможность вызова Release. Но, doors.com:release ведет себя не совсем как обычный IUnknown->Release(), и почему - будет понятно ниже.

Вкратце - doors.com:release примерно аналогичен IDisposable.Dispose из .NET - в том плане, что COM объекты освобождаются либо им, либо сборщиком мусора.
Ну и, сразу стоит упомянуть про два "with-" макроса, связанных с этим методом:


(defmacro with-interface ((var interface) &body body)
`(let ((,var ,interface))
(unwind-protect
(locally ,@body)
(release ,var))))

(defmacro with-interfaces ((&rest specs) &body body)
(if (null specs)
`(locally ,@body)
`(with-interface ,(car specs)
(with-interfaces ,(rest specs)
,@body))))

Что они делают - думаю, понятно.

А теперь подробнее.
Read more... )
love5an: (Default)
Я тут закоммитил в Doors большой патч - имеет смысл посмотреть, кому интересно.
user32 пока не допилил, но придумал что делать с "apartments" из COM.
Вернее, как это дело привязать к сборщику мусора.

Ситуация такая:
COM Lisp environment

То есть, все состояние лисп-системы, поддерживающей мультитрединг - в MTA.
Какие-то треды могут инициализироваться в STA, но вне их - MTA.

Еще, как видно, есть такая штука как post-mortem тред. Что это такое?
Дальше подробно и с картинками )
love5an: (Default)
Вчера тут игрался с COM, опять.

Удалось запустить local(out-of-process) COM-сервер на лиспе - см. картинку ниже(кликабельно).
SBCL на заднем плане это сервер, а на переднем, соответственно - клиент, который к нему коннектится.
Local COM server example

Вот полный код examples/com.lisppaste.lisp.org/display/120048
Я это дело пока не закоммитил, добавлю на github когда вот на днях допилю user32.

Понятное дело, что out-of-process COM-сервер обязательно регистрируется в реестре, вот .reg файл:
github.com/downloads/Lovesan/doors/helloworld.reg

Ну и понятно, естественно, что аргументы между процессами надо как-то маршалить. Я тут это делаю очень просто, через OLE automation, т.е. через TypeLib, как видно из .reg-файла, без всяких там proxy/stub приблуд и кастомных IMarshal.
Но пока что я в Doors до OLE и OLE automation не добрался, поэтому все это надо делать ручками, через midl-файлы.
Хотя я и планирую потом сделать lisp-friendly интерфейс к typelib.

Вот .midl файл, в котором описывается интерфейс, класс и сама typelib:
github.com/downloads/Lovesan/doors/helloworld.midl
И вот, соответственно, .tlb файл, на случай если у кого из желающих попробовать пример не будет под рукой midl-компилятора:
github.com/downloads/Lovesan/doors/helloworld.tlb (в .reg путь к ней надо, естественно, заменить на свой)

Profile

love5an: (Default)
Dmitry Ignatiev

December 2016

S M T W T F S
    123
45678910
11121314 151617
18192021222324
25262728293031

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 20th, 2017 12:50 pm
Powered by Dreamwidth Studios