|
|
<!-- <?xml version="1.0" ?>
|
|
|
<!DOCTYPE chapter PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant
|
|
|
V1.1//EN" "dtd/kdex.dtd">
|
|
|
To validate or process this file as a standalone document, uncomment
|
|
|
this prolog. Be sure to comment it out again when you are done -->
|
|
|
|
|
|
<chapter id="future-work">
|
|
|
<title
|
|
|
>Дальнейшая работа</title>
|
|
|
|
|
|
<para
|
|
|
>В этом разделе описывается то, над чем мы сейчас работаем. А так как разработка ведётся быстро, информация может быть устаревшей. Чтобы узнать о последних планах, проверяйте список файла TODO и <link linkend="mailing-lists"
|
|
|
>список рассылки</link
|
|
|
>. Не забывайте о том, что вы тоже можете принять участие в разработке. </para>
|
|
|
|
|
|
<para
|
|
|
>Это черновик, в котором описано, как новые технологии внедряются в &arts;. Вот какие темы здесь упомянуты: </para>
|
|
|
|
|
|
<itemizedlist>
|
|
|
<listitem
|
|
|
><para
|
|
|
>Как работает интерфейс.</para
|
|
|
></listitem>
|
|
|
<listitem
|
|
|
><para
|
|
|
>Кодеки - декодирование потоков mp3 или wav для того, чтобы использовать их как данные.</para
|
|
|
></listitem>
|
|
|
<listitem
|
|
|
><para
|
|
|
>Видео.</para
|
|
|
></listitem>
|
|
|
<listitem
|
|
|
><para
|
|
|
>Многопоточность.</para
|
|
|
></listitem>
|
|
|
<listitem
|
|
|
><para
|
|
|
>Синхронизация.</para
|
|
|
></listitem>
|
|
|
<listitem
|
|
|
><para
|
|
|
>Динамическое расширение.</para
|
|
|
></listitem>
|
|
|
<listitem
|
|
|
><para
|
|
|
>Динамическое построение.</para
|
|
|
></listitem>
|
|
|
<listitem
|
|
|
><para
|
|
|
>&GUI;</para
|
|
|
></listitem>
|
|
|
<listitem
|
|
|
><para
|
|
|
>&MIDI;</para
|
|
|
></listitem>
|
|
|
</itemizedlist>
|
|
|
|
|
|
<para
|
|
|
>Над этим мы сейчас работаем. Если вы хотите увидеть технологию в &arts;, начните с этого. Вы получите общее представление о решающихся проблемах. Вы можете и исправить эту информацию. </para>
|
|
|
|
|
|
<para
|
|
|
>То, что будет использоваться совместно с &arts; (поэтому координируйте свои действия, пожалуйста): </para>
|
|
|
|
|
|
<itemizedlist>
|
|
|
<listitem>
|
|
|
<para
|
|
|
><application
|
|
|
>KPhone</application
|
|
|
> (передача речи по протоколу <acronym
|
|
|
>IP</acronym
|
|
|
>) </para>
|
|
|
</listitem>
|
|
|
|
|
|
<listitem>
|
|
|
<para
|
|
|
>&noatun; (видео- и аудиопроигрыватель) </para>
|
|
|
</listitem>
|
|
|
|
|
|
<listitem>
|
|
|
<para
|
|
|
>&artscontrol; (программа управления звуковым сервером, для осциллографов) </para>
|
|
|
</listitem>
|
|
|
|
|
|
<listitem>
|
|
|
<para
|
|
|
><application
|
|
|
>Brahms</application
|
|
|
> (музыкальный синтезатор) </para>
|
|
|
</listitem>
|
|
|
|
|
|
<listitem>
|
|
|
<para
|
|
|
><application
|
|
|
>Kaiman</application
|
|
|
> (&kde;2 медиа-проигрыватель, совместим с kmedia2) </para>
|
|
|
</listitem>
|
|
|
|
|
|
<listitem>
|
|
|
<para
|
|
|
><application
|
|
|
>mpglib</application
|
|
|
>/<application
|
|
|
>kmpg</application
|
|
|
> (<acronym
|
|
|
>mpg</acronym
|
|
|
> - технология воспроизведения аудио и видео) </para>
|
|
|
</listitem>
|
|
|
|
|
|
<listitem>
|
|
|
<para
|
|
|
><application
|
|
|
>SDL</application
|
|
|
> (обращение к мульитмедиа-данным напрямую, для игр, ещё не реализовано) </para>
|
|
|
</listitem>
|
|
|
|
|
|
<listitem>
|
|
|
<para
|
|
|
><application
|
|
|
>electric ears</application
|
|
|
> (автор со мной связался - статус неизвестен) </para>
|
|
|
</listitem>
|
|
|
</itemizedlist>
|
|
|
|
|
|
<sect1 id="interfaces-how">
|
|
|
<title
|
|
|
>Как работает интерфейс</title>
|
|
|
|
|
|
<!-- I think this is now obsolete and documented elsewhere ? -->
|
|
|
|
|
|
<para
|
|
|
>Интерфейсы &MCOP; - основа идеи &arts;. Они эквивалентны классам в C++. Когда возможно, ориентируйтесь на интерфейсы. Они состоят из четырёх частей: </para>
|
|
|
|
|
|
<itemizedlist>
|
|
|
<listitem
|
|
|
><para
|
|
|
>Синхронные потоки</para
|
|
|
></listitem>
|
|
|
<listitem
|
|
|
><para
|
|
|
>Асинхронные потоки</para
|
|
|
></listitem>
|
|
|
<listitem
|
|
|
><para
|
|
|
>Методы</para
|
|
|
></listitem>
|
|
|
<listitem
|
|
|
><para
|
|
|
>Атрибуты</para
|
|
|
></listitem>
|
|
|
</itemizedlist>
|
|
|
|
|
|
<para
|
|
|
>Их можно смешивать как угодно. Новые технологии должны быть определены в терминах интерфейсов. Прочитайте разделы о синхронных и асинхронных потоках, а также об интерфейсах KMedia2, которые являются замечательными примерами работы интерфейсов. </para>
|
|
|
|
|
|
<para
|
|
|
>Интерфейсы определены в коде <literal role="extension"
|
|
|
>.idl</literal
|
|
|
> и компилируются <command
|
|
|
>mcopidl</command
|
|
|
>. Вы создаёте производный класс <classname
|
|
|
><replaceable
|
|
|
>Interfacename</replaceable
|
|
|
>_impl</classname
|
|
|
> и используете функцию <function
|
|
|
>REGISTER_IMPLEMENTATION(Interfacename_impl)</function
|
|
|
>, чтобы встроить ваши объктные реализации в систему объектов &MCOP;. </para>
|
|
|
|
|
|
</sect1>
|
|
|
|
|
|
<sect1 id="codecs">
|
|
|
<title
|
|
|
>Кодеки - Декодирование данных</title>
|
|
|
|
|
|
<para
|
|
|
>Интерфейсы kmedia2 позволяют игнорировать файлы wav, mp3 и всё, что состоит из потоков данных. Вместо этого вы описываете методы их воспроизведения. </para>
|
|
|
|
|
|
<para
|
|
|
>Поэтому вы можете написать программу загрузки файлов wave таким образом, чтобы она пригрывала их (как PlayObject), но никто другой, кроме вас, не сможет использовать код. </para>
|
|
|
|
|
|
<para
|
|
|
>Альтернативой являются асинхронные потоки. Вы определяете интерфейс, который позволяет передавать блоки данных. В &MCOP; это выглядит так: </para>
|
|
|
|
|
|
<programlisting
|
|
|
>interface Codec {
|
|
|
in async byte stream indata;
|
|
|
out async byte stream outdata;
|
|
|
};
|
|
|
</programlisting>
|
|
|
|
|
|
|
|
|
<para
|
|
|
>Конечно, кодеки могут снабжаться атрибутами для получения дополнительной информации, к примеру, о формате. </para>
|
|
|
|
|
|
<programlisting
|
|
|
>interface ByteAudioCodec {
|
|
|
in async byte stream indata;
|
|
|
out async byte stream outdata;
|
|
|
readonly attribute samplingRate, bits, channels;
|
|
|
};
|
|
|
</programlisting>
|
|
|
|
|
|
<para
|
|
|
>Этот <interfacename
|
|
|
>ByteAudioCodec</interfacename
|
|
|
>, например, может быть подключен к объекту <interfacename
|
|
|
>ByteStreamToAudio</interfacename
|
|
|
> для создания настоящего аудио потока. </para>
|
|
|
|
|
|
<para
|
|
|
>Конечно, в других типах кодеков видео воспроизводится напрямую, например </para>
|
|
|
|
|
|
<programlisting
|
|
|
>interface VideoCodec {
|
|
|
in async byte stream indata;
|
|
|
out video stream outdata; /* note: видеопотоки ещё не используются */
|
|
|
};
|
|
|
</programlisting>
|
|
|
|
|
|
<para
|
|
|
>Кодек не должен разрабатываться по принципу <quote
|
|
|
>вы знаете, как воспроизводить, а я - нет</quote
|
|
|
>, как, например, <interfacename
|
|
|
>WavPlayObject</interfacename
|
|
|
>. И всё же кто-то должен сидеть и тестировать его до завершения <acronym
|
|
|
>API</acronym
|
|
|
>. </para>
|
|
|
|
|
|
</sect1>
|
|
|
|
|
|
<sect1 id="video">
|
|
|
<title
|
|
|
>Видео</title>
|
|
|
|
|
|
<para
|
|
|
>Я хочу сделать видео асинхронными потоками некоторых встроенных типов данных &MCOP;, содержащих изображения. Сейчас идёт работа над этим типом данных. Тогдга модули, работающие с видео изображениями могут быть подключены так же, как и модули, работающие со звуком. </para>
|
|
|
|
|
|
<para
|
|
|
>Есть ещё несколько вещей, которые обязательно нужно иметь в виду: </para>
|
|
|
|
|
|
<itemizedlist>
|
|
|
<listitem>
|
|
|
<para
|
|
|
>Цветовые пространства <acronym
|
|
|
>RGB</acronym
|
|
|
> и <acronym
|
|
|
>YUV</acronym
|
|
|
> </para>
|
|
|
</listitem>
|
|
|
<listitem>
|
|
|
<para
|
|
|
>Формат должен каким-то образом добавляться к потоку. </para>
|
|
|
</listitem>
|
|
|
<listitem>
|
|
|
<para
|
|
|
>Очень важна синхронизация. </para>
|
|
|
</listitem>
|
|
|
</itemizedlist>
|
|
|
|
|
|
<para
|
|
|
>Также я хочу оставить возможность переопределить класс <classname
|
|
|
>VideoFrame</classname
|
|
|
>, чтобы он мог хранить данные в разделённой памяти. Тогда будут возможны видео потоки между различными процессами без особых проблем. </para>
|
|
|
|
|
|
<para
|
|
|
>Как обычно, вся обработка видео, от декодирования до отображения на экране, должна производиться в одном процессе. </para>
|
|
|
|
|
|
<para
|
|
|
>Я сделал прототип реализации видеопотоков, который вы можете скачать <ulink url="http://space.twc.de/~stefan/kde/download/video-quickdraw.tar.gz"
|
|
|
>отсюда</ulink
|
|
|
>. Его нужно будет интегрировать в &MCOP; после тестирования. </para>
|
|
|
|
|
|
<para
|
|
|
>Компонент визуализации должен поддерживать XMITSHM (с <acronym
|
|
|
>RGB</acronym
|
|
|
> и <acronym
|
|
|
>YUV</acronym
|
|
|
>), Мартин Вогт (Martin Vogt) сказал, что работает над этим. </para>
|
|
|
|
|
|
</sect1>
|
|
|
|
|
|
<sect1 id="threading">
|
|
|
<title
|
|
|
>Многопоточность</title>
|
|
|
|
|
|
<para
|
|
|
>Сейчас &MCOP; не поддерживает работу с несколькими потоками обработки данных. Возможно, мы не сможем избежать многопоточности при работе с видео. Но есть вещи, с которыми нужно обращаться аккуратно: </para>
|
|
|
|
|
|
|
|
|
<itemizedlist>
|
|
|
<listitem
|
|
|
><para
|
|
|
>SmartWrappers - их использование с многопоточностью небезопасно из-за незащищенного механизма подсчета ссылок и т. д. </para>
|
|
|
</listitem>
|
|
|
<listitem>
|
|
|
<para
|
|
|
>Диспетчер ввода-вывода тоже небезопасен. </para>
|
|
|
</listitem>
|
|
|
</itemizedlist>
|
|
|
|
|
|
<para
|
|
|
>Однако я мечтаю сделать эти модули безопасными для синхронных и асинхронных потоков. Тогда можно будет посылать сигнал на несколько процессоров. Кроме того, это можно использовать при воспроизведении аудио на многопроцессорных системах. </para>
|
|
|
|
|
|
<para
|
|
|
>Как это будет работать: </para>
|
|
|
|
|
|
|
|
|
<itemizedlist>
|
|
|
<listitem>
|
|
|
<para
|
|
|
>Система управления потоками решает, что должны обрабатывать модули (и какие), т. е.: </para>
|
|
|
<itemizedlist>
|
|
|
<listitem
|
|
|
><para
|
|
|
>видеокадры (метод process_indata)</para
|
|
|
></listitem>
|
|
|
<listitem
|
|
|
><para
|
|
|
>синхронные аудиопотоки (calculateBlock)</para
|
|
|
></listitem>
|
|
|
<listitem
|
|
|
><para
|
|
|
>другие асинхронные потоки, в основном байтовые</para
|
|
|
></listitem>
|
|
|
</itemizedlist>
|
|
|
</listitem>
|
|
|
<listitem>
|
|
|
<para
|
|
|
>Модули могут обрабатывать эти вещи и в собственных потоках. В аудио можно использовать потоки повторно (т. е. использование 4 потоков на 4 процессорах, даже если запущено 100 модулей). Для видео и декомпрессии будет удобно использование блокирующего средства во внутреннем потоке, которое синхронизировано с остальной частью &MCOP; системой управления потоками. </para>
|
|
|
</listitem>
|
|
|
|
|
|
<listitem>
|
|
|
<para
|
|
|
>Модули могут не использовать средства &MCOP; (такие, как удалённый вызов) во время работы в потоке. </para>
|
|
|
</listitem>
|
|
|
</itemizedlist>
|
|
|
|
|
|
</sect1>
|
|
|
|
|
|
<sect1 id="synchronization">
|
|
|
<title
|
|
|
>Синхронизация</title>
|
|
|
|
|
|
<para
|
|
|
>Видео и &MIDI; (и аудио) могут требовать синхронизации. Это могут быть маркеры времени. Я хочу использовать их в асинхронным потокам, добавляя эти маркеры к каждому пакету. Если вы посылаете два видеокадра, сделайте их пвкетами (всё равно они большие), чтобы у вас были два разных маркера. </para>
|
|
|
|
|
|
<para
|
|
|
>Т. к. аудио - синхронный поток, временные метки здесь тоже подразумеваются. </para>
|
|
|
|
|
|
</sect1>
|
|
|
|
|
|
<sect1 id="dynamic-composition">
|
|
|
<title
|
|
|
>Динамическое построение</title>
|
|
|
|
|
|
<para
|
|
|
>Нужно сделать так, чтобы можно было сказать: эффект FX состоит из этих простых модулей. FX должен выглядеть как обычный модуль &MCOP;, но состоять из других модулей. </para>
|
|
|
|
|
|
<para
|
|
|
>Это необходимо для &arts-builder;. </para>
|
|
|
|
|
|
</sect1>
|
|
|
|
|
|
<sect1 id="gui">
|
|
|
<title
|
|
|
>&GUI;</title>
|
|
|
|
|
|
<para
|
|
|
>Все компоненты &GUI; будут модулями &MCOP;. У них должны быть такие атрибуты, как размер, метка, цвет, ... &arts-builder; должен уметь составлять их визуально. </para>
|
|
|
|
|
|
<para
|
|
|
>Должна быть возможность сохранять графический интерфейс, сохраняя атрибуты. </para>
|
|
|
|
|
|
</sect1>
|
|
|
|
|
|
<sect1 id="midi-stuff">
|
|
|
<title
|
|
|
>&MIDI;</title>
|
|
|
|
|
|
<para
|
|
|
>&MIDI; будет реализован с помощью асинхронных потоков. Есть два варианта: использовать обычные структуры &MCOP; для описания типа или вводить новые стандартные типы. </para>
|
|
|
|
|
|
<para
|
|
|
>Думаю, обычных структур будет достаточно: </para>
|
|
|
|
|
|
<programlisting
|
|
|
>struct MidiEvent {
|
|
|
byte b1,b2,b3;
|
|
|
sequence<byte> sysex;
|
|
|
}
|
|
|
</programlisting>
|
|
|
|
|
|
<para
|
|
|
>Асинхронные потоки должны поддерживать обычные типы потоков. </para>
|
|
|
|
|
|
</sect1>
|
|
|
|
|
|
</chapter>
|
|
|
|
|
|
|