From 9b58d35185905f8334142bf4988cb784e993aea7 Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Mon, 21 Nov 2011 02:23:03 -0600 Subject: Initial import of extracted KDE i18n tarballs --- .../docs/kdemultimedia/artsbuilder/Makefile.am | 4 + .../docs/kdemultimedia/artsbuilder/Makefile.in | 635 +++++++ .../docs/kdemultimedia/artsbuilder/apis.docbook | 434 +++++ .../kdemultimedia/artsbuilder/artsbuilder.docbook | 917 +++++++++ .../docs/kdemultimedia/artsbuilder/detail.docbook | 1365 ++++++++++++++ .../kdemultimedia/artsbuilder/digitalaudio.docbook | 16 + .../docs/kdemultimedia/artsbuilder/faq.docbook | 1296 +++++++++++++ .../docs/kdemultimedia/artsbuilder/future.docbook | 399 ++++ .../kdemultimedia/artsbuilder/glossary.docbook | 173 ++ .../docs/kdemultimedia/artsbuilder/gui.docbook | 29 + .../docs/kdemultimedia/artsbuilder/helping.docbook | 239 +++ .../docs/kdemultimedia/artsbuilder/index.cache.bz2 | Bin 0 -> 78369 bytes .../docs/kdemultimedia/artsbuilder/index.docbook | 417 +++++ .../docs/kdemultimedia/artsbuilder/mcop.docbook | 1958 ++++++++++++++++++++ .../docs/kdemultimedia/artsbuilder/midi.docbook | 526 ++++++ .../kdemultimedia/artsbuilder/midiintro.docbook | 16 + .../docs/kdemultimedia/artsbuilder/modules.docbook | 1321 +++++++++++++ .../docs/kdemultimedia/artsbuilder/porting.docbook | 52 + .../kdemultimedia/artsbuilder/references.docbook | 61 + .../docs/kdemultimedia/artsbuilder/tools.docbook | 1003 ++++++++++ 20 files changed, 10861 insertions(+) create mode 100644 tde-i18n-ru/docs/kdemultimedia/artsbuilder/Makefile.am create mode 100644 tde-i18n-ru/docs/kdemultimedia/artsbuilder/Makefile.in create mode 100644 tde-i18n-ru/docs/kdemultimedia/artsbuilder/apis.docbook create mode 100644 tde-i18n-ru/docs/kdemultimedia/artsbuilder/artsbuilder.docbook create mode 100644 tde-i18n-ru/docs/kdemultimedia/artsbuilder/detail.docbook create mode 100644 tde-i18n-ru/docs/kdemultimedia/artsbuilder/digitalaudio.docbook create mode 100644 tde-i18n-ru/docs/kdemultimedia/artsbuilder/faq.docbook create mode 100644 tde-i18n-ru/docs/kdemultimedia/artsbuilder/future.docbook create mode 100644 tde-i18n-ru/docs/kdemultimedia/artsbuilder/glossary.docbook create mode 100644 tde-i18n-ru/docs/kdemultimedia/artsbuilder/gui.docbook create mode 100644 tde-i18n-ru/docs/kdemultimedia/artsbuilder/helping.docbook create mode 100644 tde-i18n-ru/docs/kdemultimedia/artsbuilder/index.cache.bz2 create mode 100644 tde-i18n-ru/docs/kdemultimedia/artsbuilder/index.docbook create mode 100644 tde-i18n-ru/docs/kdemultimedia/artsbuilder/mcop.docbook create mode 100644 tde-i18n-ru/docs/kdemultimedia/artsbuilder/midi.docbook create mode 100644 tde-i18n-ru/docs/kdemultimedia/artsbuilder/midiintro.docbook create mode 100644 tde-i18n-ru/docs/kdemultimedia/artsbuilder/modules.docbook create mode 100644 tde-i18n-ru/docs/kdemultimedia/artsbuilder/porting.docbook create mode 100644 tde-i18n-ru/docs/kdemultimedia/artsbuilder/references.docbook create mode 100644 tde-i18n-ru/docs/kdemultimedia/artsbuilder/tools.docbook (limited to 'tde-i18n-ru/docs/kdemultimedia/artsbuilder') diff --git a/tde-i18n-ru/docs/kdemultimedia/artsbuilder/Makefile.am b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/Makefile.am new file mode 100644 index 00000000000..e8ff7c7b1b8 --- /dev/null +++ b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/Makefile.am @@ -0,0 +1,4 @@ +KDE_LANG = ru +SUBDIRS = $(AUTODIRS) +KDE_DOCS = AUTO +KDE_MANS = AUTO diff --git a/tde-i18n-ru/docs/kdemultimedia/artsbuilder/Makefile.in b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/Makefile.in new file mode 100644 index 00000000000..10402c814b9 --- /dev/null +++ b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/Makefile.in @@ -0,0 +1,635 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# KDE tags expanded automatically by am_edit - $Revision: 483858 $ +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +subdir = docs/kdemultimedia/artsbuilder +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +#>- RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ +#>- html-recursive info-recursive install-data-recursive \ +#>- install-dvi-recursive install-exec-recursive \ +#>- install-html-recursive install-info-recursive \ +#>- install-pdf-recursive install-ps-recursive install-recursive \ +#>- installcheck-recursive installdirs-recursive pdf-recursive \ +#>- ps-recursive uninstall-recursive +#>+ 7 +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive nmcheck-recursive bcheck-recursive +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +#>- DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +#>+ 1 +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +ARTSCCONFIG = @ARTSCCONFIG@ +AUTOCONF = @AUTOCONF@ +AUTODIRS = @AUTODIRS@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CONF_FILES = @CONF_FILES@ +CYGPATH_W = @CYGPATH_W@ +DCOPIDL = @DCOPIDL@ +DCOPIDL2CPP = @DCOPIDL2CPP@ +DCOPIDLNG = @DCOPIDLNG@ +DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@ +DEFS = @DEFS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +GMSGFMT = @GMSGFMT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCFG_DEPENDENCIES = @KCFG_DEPENDENCIES@ +KCONFIG_COMPILER = @KCONFIG_COMPILER@ +KDECONFIG = @KDECONFIG@ +KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@ +KDE_RPATH = @KDE_RPATH@ +KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MAKEKDEWIDGETS = @MAKEKDEWIDGETS@ +MCOPIDL = @MCOPIDL@ +MEINPROC = @MEINPROC@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TOPSUBDIRS = @TOPSUBDIRS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XMLLINT = @XMLLINT@ +X_RPATH = @X_RPATH@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +am__leading_dot = @am__leading_dot@ +am__tar = @am__tar@ +am__untar = @am__untar@ +#>- bindir = @bindir@ +#>+ 2 +DEPDIR = .deps +bindir = @bindir@ +build_alias = @build_alias@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host_alias = @host_alias@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +kde_appsdir = @kde_appsdir@ +kde_bindir = @kde_bindir@ +kde_confdir = @kde_confdir@ +kde_datadir = @kde_datadir@ +kde_htmldir = @kde_htmldir@ +kde_icondir = @kde_icondir@ +kde_kcfgdir = @kde_kcfgdir@ +kde_libs_htmldir = @kde_libs_htmldir@ +kde_libs_prefix = @kde_libs_prefix@ +kde_locale = @kde_locale@ +kde_mimedir = @kde_mimedir@ +kde_moduledir = @kde_moduledir@ +kde_servicesdir = @kde_servicesdir@ +kde_servicetypesdir = @kde_servicetypesdir@ +kde_sounddir = @kde_sounddir@ +kde_styledir = @kde_styledir@ +kde_templatesdir = @kde_templatesdir@ +kde_wallpaperdir = @kde_wallpaperdir@ +kde_widgetdir = @kde_widgetdir@ +kdeinitdir = @kdeinitdir@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +xdg_appsdir = @xdg_appsdir@ +xdg_directorydir = @xdg_directorydir@ +xdg_menudir = @xdg_menudir@ +KDE_LANG = ru +#>- SUBDIRS = $(AUTODIRS) +#>+ 1 +SUBDIRS =. +KDE_DOCS = AUTO +KDE_MANS = AUTO +#>- all: all-recursive +#>+ 1 +all: docs-am all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) +#>- @for dep in $?; do \ +#>- case '$(am__configure_deps)' in \ +#>- *$$dep*) \ +#>- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ +#>- && exit 0; \ +#>- exit 1;; \ +#>- esac; \ +#>- done; \ +#>- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu docs/kdemultimedia/artsbuilder/Makefile'; \ +#>- cd $(top_srcdir) && \ +#>- $(AUTOMAKE) --gnu docs/kdemultimedia/artsbuilder/Makefile +#>+ 12 + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu docs/kdemultimedia/artsbuilder/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu docs/kdemultimedia/artsbuilder/Makefile + cd $(top_srcdir) && perl ../scripts/admin/am_edit -p../scripts/admin docs/kdemultimedia/artsbuilder/Makefile.in +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +#>- distdir: $(DISTFILES) +#>+ 1 +distdir: distdir-nls $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +#>- uninstall: uninstall-recursive +#>+ 1 +uninstall: uninstall-docs uninstall-nls uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +#>- clean: clean-recursive +#>+ 1 +clean: kde-rpo-clean clean-recursive + +#>- clean-am: clean-generic mostlyclean-am +#>+ 1 +clean-am: clean-docs clean-bcheck clean-generic mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +#>- install-data-am: +#>+ 1 +install-data-am: install-docs install-nls + +install-dvi: install-dvi-recursive + +install-exec-am: + +install-html: install-html-recursive + +install-info: install-info-recursive + +install-man: + +install-pdf: install-pdf-recursive + +install-ps: install-ps-recursive + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ + install-strip + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic ctags \ + ctags-recursive distclean distclean-generic distclean-tags \ + distdir dvi dvi-am html html-am info info-am install \ + install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \ + tags-recursive uninstall uninstall-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: + +#>+ 2 +KDE_DIST=future.docbook index.docbook porting.docbook glossary.docbook helping.docbook artsbuilder.docbook detail.docbook midiintro.docbook modules.docbook mcop.docbook gui.docbook faq.docbook index.cache.bz2 midi.docbook tools.docbook Makefile.in digitalaudio.docbook references.docbook apis.docbook Makefile.am + +#>+ 24 +index.cache.bz2: $(srcdir)/index.docbook $(KDE_XSL_STYLESHEET) glossary.docbook porting.docbook apis.docbook gui.docbook references.docbook mcop.docbook index.docbook detail.docbook future.docbook artsbuilder.docbook digitalaudio.docbook faq.docbook modules.docbook tools.docbook midi.docbook helping.docbook midiintro.docbook + @if test -n "$(MEINPROC)"; then echo $(MEINPROC) --check --cache index.cache.bz2 $(srcdir)/index.docbook; $(MEINPROC) --check --cache index.cache.bz2 $(srcdir)/index.docbook; fi + +docs-am: index.cache.bz2 + +install-docs: docs-am install-nls + $(mkinstalldirs) $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/artsbuilder + @if test -f index.cache.bz2; then \ + echo $(INSTALL_DATA) index.cache.bz2 $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/artsbuilder/; \ + $(INSTALL_DATA) index.cache.bz2 $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/artsbuilder/; \ + elif test -f $(srcdir)/index.cache.bz2; then \ + echo $(INSTALL_DATA) $(srcdir)/index.cache.bz2 $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/artsbuilder/; \ + $(INSTALL_DATA) $(srcdir)/index.cache.bz2 $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/artsbuilder/; \ + fi + -rm -f $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/artsbuilder/common + $(LN_S) $(kde_libs_htmldir)/$(KDE_LANG)/common $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/artsbuilder/common + +uninstall-docs: + -rm -rf $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/artsbuilder + +clean-docs: + -rm -f index.cache.bz2 + + +#>+ 13 +install-nls: + $(mkinstalldirs) $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/artsbuilder + @for base in glossary.docbook porting.docbook apis.docbook gui.docbook references.docbook mcop.docbook index.docbook detail.docbook future.docbook artsbuilder.docbook digitalaudio.docbook faq.docbook modules.docbook tools.docbook midi.docbook helping.docbook midiintro.docbook ; do \ + echo $(INSTALL_DATA) $$base $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/artsbuilder/$$base ;\ + $(INSTALL_DATA) $(srcdir)/$$base $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/artsbuilder/$$base ;\ + done + +uninstall-nls: + for base in glossary.docbook porting.docbook apis.docbook gui.docbook references.docbook mcop.docbook index.docbook detail.docbook future.docbook artsbuilder.docbook digitalaudio.docbook faq.docbook modules.docbook tools.docbook midi.docbook helping.docbook midiintro.docbook ; do \ + rm -f $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/artsbuilder/$$base ;\ + done + + +#>+ 5 +distdir-nls: + for file in glossary.docbook porting.docbook apis.docbook gui.docbook references.docbook mcop.docbook index.docbook detail.docbook future.docbook artsbuilder.docbook digitalaudio.docbook faq.docbook modules.docbook tools.docbook midi.docbook helping.docbook midiintro.docbook ; do \ + cp $(srcdir)/$$file $(distdir); \ + done + +#>+ 15 +force-reedit: + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu docs/kdemultimedia/artsbuilder/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu docs/kdemultimedia/artsbuilder/Makefile + cd $(top_srcdir) && perl ../scripts/admin/am_edit -p../scripts/admin docs/kdemultimedia/artsbuilder/Makefile.in + + +#>+ 21 +clean-bcheck: + rm -f *.bchecktest.cc *.bchecktest.cc.class a.out + +bcheck: bcheck-recursive + +bcheck-am: + @for i in ; do \ + if test $(srcdir)/$$i -nt $$i.bchecktest.cc; then \ + echo "int main() {return 0;}" > $$i.bchecktest.cc ; \ + echo "#include \"$$i\"" >> $$i.bchecktest.cc ; \ + echo "$$i"; \ + if ! $(CXX) $(DEFS) -I. -I$(srcdir) -I$(top_builddir) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) --dump-class-hierarchy -c $$i.bchecktest.cc; then \ + rm -f $$i.bchecktest.cc; exit 1; \ + fi ; \ + echo "" >> $$i.bchecktest.cc.class; \ + perl $(top_srcdir)/admin/bcheck.pl $$i.bchecktest.cc.class || { rm -f $$i.bchecktest.cc; exit 1; }; \ + rm -f a.out; \ + fi ; \ + done + + +#>+ 3 +final: + $(MAKE) all-am + +#>+ 3 +final-install: + $(MAKE) install-am + +#>+ 3 +no-final: + $(MAKE) all-am + +#>+ 3 +no-final-install: + $(MAKE) install-am + +#>+ 3 +kde-rpo-clean: + -rm -f *.rpo + +#>+ 3 +nmcheck: +nmcheck-am: nmcheck diff --git a/tde-i18n-ru/docs/kdemultimedia/artsbuilder/apis.docbook b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/apis.docbook new file mode 100644 index 00000000000..7ace646f48a --- /dev/null +++ b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/apis.docbook @@ -0,0 +1,434 @@ + + + +API интерфейс &arts; + + +Обзор +aRts - это не просто какая-то программа, в нём поддерживается API для выполнения самых разных задач. В этом разделе будет рассказано о возможностях взаимодействия aRts с другими программами с помощью API. + +Надо сразу отметить, что большинство возможностей API не зависят, от языка реализации и места вызова, поскольку они описаны на mcopidl. Вы можете использовать сервисы, которые они предлагают, на любом языке программирования, и не волноваться, работаете ли вы с локальным или с удалённым объектом. Вот список основных объектов: + + + + +core.idl + Основные определения из MCOP, например протокол, определения объектов, трейдер, менеджер потоков и т.д. + + + + +artsflow.idl + + Содержит менеджер, управляющий соединениями аудио потоков, определение Arts::SynthModule, базы любого интерфейса с потоками, а также несколько полезных аудио объектов. + + + + +kmedia2.idl + + + Здесь определен объект, который может проигрывать звук, Arts::PlayObject. Медиаплееры, наподобие noatun, смогут воспроизводить любой формат, для которого определён PlayObject. На этой базе уже реализованы форматы mp3, mpg video, midi, wav... + + + + +soundserver.idl + + Интерфейс с звуковым сервером artsd. Он называется Arts::SoundServer. Он позволяет получать потоки из сети, воспроизводить звук, создавать новые объекты aRts и т.д. Поддержка сети осуществляется прозрачным образом благодаря использованию MCOP (как и для всего прочего здесь). + + + + +artsbuilder.idl + Этот модуль определяет основные функции управления синтезом звука, совмещая простые и более сложные объекты, за счёт составления из них структур. Это определяет основной интерфейс Arts::StructureDesc, Arts::ModuleDesc и Arts::PortDesc, которые содержат описания структур, модулей и портов. Также есть возможность получить "живую сеть объектов" из этих описаний соединений и значений, используя factory. + + + + +artsmidi.idl + + Этот модуль определяет основные функции midi, например объекты, которые создают события midi, описание события midi и Arts::MidiManager для связи "производителей" и "потребителей" событий midi и т. д. Также поддерживается прозрачная работа в сети. + + + + +artsmodules.idl + Дополнительные фильтры, эффекты, задержки и т.д. Все они требуются для построения сложных инструментов и объектов обработки звука, которые выстраиваются из более простых объектов как из кирпичиков. + + + + +artsgui.idl + + Базовые типы для визуальных объектов. Из базового типа Arts::Widget происходят все модули графического интерфейса. Это позволяет создавать визуальные редакторы, независимые от конкретного набора библиотек. Также визуальные объекты могут служить для установки параметров напрямую через конкретный сигнал. (например значение ползунка соединено с фильтром обрезания частот). Также поддерживается прозрачная работа в сети. + + + + +aRts написан на IDL везде, где это только возможно. С другой стороны есть некоторые языкозависимые API на C++ или C. Желательно использовать только интерфейсы IDL, а другие API только при необходимости. Вот список языкозависимых API: + + + + +KNotify, KAudioPlayer (включено в libkdecore) + + Это API из KDE для случая, когда просто нужно проиграть звуковой буфер. Эта функция на C++ оптимизирована под Qt/KDE и очень простая. + + + + +libartsc + Интерфейс C для звукового сервера. Используется для портирования программ. + + + + +libmcop + + Вот где проявляется магия MCOP. Библиотека содержит основные вещи для написания приложения MCOP, диспетчер, таймеры, а также внутренние классы для обеспечения протокола MCOP. + + + + +libartsflow + Вместе с определением artsflow.idl, есть некоторые утилиты, например конвертация частоты дискретизации. + + + + +libqiomanager + + Интеграция MCOP в цикл событий Qt, нужно при написании приложений Qt с использованием MCOP. + + + + + + + + + +knotify +В процессе написания + + + +kaudioplayer +В процессе написания + + + +libkmid +В процессе написания + + + +kmedia2 +В процессе написания + + + +sound server +В процессе написания + + + +artsflow +В процессе написания + + + +<acronym +>API</acronym +> для языка С + + +Введение + +C API &arts; создано для упрощения написания и портирования приложений C в интерфейс звукового сервера &arts;. Это содержит функции потоков (отправка потоков в artsd), как блокирующих (синхронных), так и асинхронных.Для многих приложений вы должны просто заменить несколько системных вызовов, совместимых с вашим звуковым устройством, на соответствующие вызовы &arts;. + +Для пробы я портировал две программы - mpg123 и quake. Патчи для них можно взять здесь. Вы можете также отправлять ваши собственные патчи создателям &arts; или мультимедиа программ, чтобы они могли бы встроить поддержку &arts; в код их программ. + + + + +Краткое обозрение + +Отправка звука серверу через API делается очень просто: + +подключите заголовочный файл: #include <artsc.h> +инициализируйте API функцией arts_init() +создайте поток arts_play_stream() +укажите требуемые параметры с помощью arts_stream_set() +отправьте аудио данные в поток функцией arts_write() +закройте поток: arts_close_stream() +освободите память, выделенную для API: arts_free() + + +Вот иллюстрация: + +#include <stdio.h> +#include <artsc.h> +int main() +{ + arts_stream_t stream; + char buffer[8192]; + int bytes; + int errorcode; + + errorcode = arts_init(); + if (errorcode < 0) + { + fprintf(stderr, "arts_init error: %s\n", arts_error_text(errorcode)); + return 1; + } + + stream = arts_play_stream(44100, 16, 2, "artsctest"); + + while((bytes = fread(buffer, 1, 8192, stdin)) > 0) + { + errorcode = arts_write(stream, buffer, bytes); + if(errorcode < 0) + { + fprintf(stderr, "arts_write error: %s\n", arts_error_text(errorcode)); + return 1; + } + } + + arts_close_stream(stream); + arts_free(); + + return 0; +} + + + + +Компиляция и сборка: <application +>artsc-config</application +> + +Для упрощения сборки программ, использующих C API &arts;, используется утилита artsc-config, которая самостоятельно определяет, функции каких библиотек вам нужно импортировать, где находятся заголовочные файлы. Она вызывается так: + +artsc-config + + +для нахождения библиотек и так: + +artsc-config + + +для нахождения дополнительных флагов компилятора C. Так, пример, описанный выше, можно скомпилировать из командной строки: + +cc + +cc + + + + + +Библиотеки + +Ещё не готово (см. информацию в artsc.h) + + + + + diff --git a/tde-i18n-ru/docs/kdemultimedia/artsbuilder/artsbuilder.docbook b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/artsbuilder.docbook new file mode 100644 index 00000000000..0098a4d12f4 --- /dev/null +++ b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/artsbuilder.docbook @@ -0,0 +1,917 @@ + +&arts-builder; + + +Описание + +Перед запуском &arts-builder; вам нужно запустить звуковой сервер (&artsd;). Обычно, если используется &kde; 2.1, это должно быть уже сделано. Если нет, вы можете настроить автоматический запуск звукового сервера в Центре управления в ЗвукЗвуковой сервер. + +Когда вы запускаете &arts;, программа всегда запускает небольшие модули. &arts-builder; - это инструмент для создания новых структур из небольших связанных модулей. Вы просто выбираете модули внутри решётки. Для этого выбирайте их из меню Модули и затем укажите место на серо-зелёном фоне. + +Модули обычно имеют порты (куда обычно аудио сигналы входят или выходят).Для связывания двух портов, укажите на первый, который становится оранжевым, и затем укажите на второй. Связывать вы можете только входные порты (верхняя часть модуля) с выходными (нижняя часть модуля). Если вы желаете установить постоянный сигнал в порт (или отключить его), тогда сделайте двойной щелчок мышью над портом. + + + + +Руководство + + +1-й шаг + +Запуск &arts-builder;. + +Вам нужен модуль Synth_AMAN_PLAY для прослушивания результата вашего творчества. Для установки модуля Synth_AMAN_PLAY выберите Модули Синтез Звуковой ввод/вывод Synth_AMAN_PLAY и указать на свободное место для модуля. Расположите его ниже пятой линии, потому как мы добавим ещё что-нибудь выше. + +Модуль имеет параметр title (крайний левый порт), и autoRestoreID (рядом с крайним левым портом) для поиска. Для заполнения их, сделайте двойной щелчок над этими портами, выберите значение и тип tutorial в поле ввода. Нажмите OK для завершения. + +Выберите ФайлВыполнить структуру . Вы абсолютно ничего не услышите.Модулю воспроизведения нужно что-нибудь ещё передать на вход. Если вы слышали некоторое время тишину, нажмите на Да и переходите ко второму шагу. + + + +2-й шаг + +Создайте модуль Synth_WAVE_SIN (из меню Модули Синтез Волновые ) и установите его выше модуля Synth_AMAN_PLAY. (Оставьте одну строку между ними). + +Как вы видите, этот модуль что-то выдаёт, но требует pos в качестве входа. Сначала давайте установим выход на колонки.Нажмите на порт out в модуле Synth_WAVE_SIN и затем на порт left в модуле Synth_AMAN_PLAY.Теперь у нас соединены два модуля. + +Все осцилляторы в &arts; не требуют частоту на входе, нужна позиция в волне. Позиция должна быть между 0 и 1, которые отображаются для стандартного объекта Synth_WAVE_SIN на область 0..2*пи. Для получения значений осцилляций из частоты используются модули Synth_FREQUENCY. + +Установите модуль Synth_FREQUENCY (с помощью Модули Синтез Oscillation & Modulation ) и соедините его вывод pos со входом pos вашего Synth_WAVE_SIN. Выставите частотному генератору значение 440. + + +Выберите ФайлИсполнить структуру. Вы услышите частоту 440 Гц на одной из ваших колонок. Если вы услышали, то нажимайте на кнопку Да и переходите к 3-ему шагу. + + + + +3-й шаг + +Было бы хорошо услышать частоту в обеих колонках. Для этого подключите правый канал Synth_PLAY к выходу Synth_WAVE_SIN. + +Создайте объект Synth_SEQUENCE (из МодулиСинтезMidi & Sequencing). Он должен быть сверху. Если вам нужно больше места вы можете переместить другие модули выделяя их (для выделения нескольких модулей используйте &Shift;), и перетаскивая их в сторону. + +Снова соедините выход частоты Synth_SEQUENCE ко входу модуля Synth_FREQUENCY. Затем установите значение скорости последовательности в 0.13 (скорость крайний левый порт). + +Сейчас перейдите крайнему правому порту (последовательности) Synth_SEQUENCE и установите последовательность, написав A-3;C-4;E-4;C-4;. За дополнительной информацией обращайтесь к описанию модулей. + + +Synth_SEQUENCE в действительности нуждается в установке последовательности и скорости. Без этого вы можете получить сбой программы. + + +Выберите ФайлИсполнить структуру. Вы услышите проигрывание последовательности. Если вам понравилось, то нажимайте Да и переходите к четвёртому шагу. + + + +4-й шаг + +Создайте модуль Synth_PSCALE (из Модули Синтез Оболочки ). Отключите выход синусоидальной волны двойным щелчком и выберите не подключён. Подключите + + +Выход модуля SIN ко входу модуля PSCALE + + +Выход PSCALE ко левому входу модуля AMAN_PLAY + + +Выход PSCALE ко правому входу модуля AMAN_PLAY + + +SEQUENCE pos к PSCALE pos + + + +Наконец, установите параметр top модуля PSCALE в некоторое значение, для примера 0.1 + +Как это работает: Synth_SEQUENCE берёт дополнительную информацию о позиции ноты,которую сейчас проигрывает, пока 0 означает запущен и 1 завершён. Модуль Synth_PSCALE усиливает пропускаемый аудио поток от значения громкости 0 (тихо) до 1 (оригинальная громкость) и обратно до 0 (тихо). В соответствии с позицией. Позиция пика может быть получена как значение pos.0.1 означает, что после проигрывания 10% ноты, громкость увеличивается до максимума и потом начинает уменьшаться. + + +Выберите ФайлВыполнить Структуру. Вы услышите воспроизведение прекрасной последовательности.Если вам понравилось, то нажмите OK и переходите к пятому шагу. + + + + +5-й шаг: Начало распространения данных вокруг ;) + +Запустите ещё одну программу &arts-builder; + +Установите там Synth__AMAN_PLAY и нормально настройте его. Добавьте туда Synth_BUS_DOWNLINK и: + + + +Установите параметр bus модуля Synth_BUS_DOWNLINK в audio (это просто название, можно написать fred, если вам так нравится) + + +Свяжите параметр left Synth_BUS_DOWNLINK с параметром left Synth_AMAN_PLAY + + +Свяжите параметр right Synth_BUS_DOWNLINK с параметром right Synth_AMAN_PLAY + + + +Запустите выполнение структуры. Подождав немного, вы так ничего и не услышите. + +Вернёмся назад к структуре с Synth_WAVE_SIN, заменим Synth_AMAN_PLAY на Synth_BUS_UPLINK и настроим его название на audio (или fred, если так удобнее). Удаляем модули, выделяя их и выбирая в меню ПравкаУдалить (или нажимая клавишу Del). + +Запустим ещё раз структуру Файл выполнить структуру. Вы услышите последовательность нот, переданных через шину. + +Если вам нужно выяснить, почему что-то подобное этому может быть действительно удобным, нажмите Да (в &arts-builder;, который выполняет Synth_SEQUENCE, вы можете всё оставить запущенным) и перейдите к 6-ому шагу. + + + +6-й шаг: Обмен данными для опытных пользователей + +Выберите ФайлПереименовать структуру из меню artsbuilder, который содержит Synth_SEQUENCE, и назовите её tutorial. Нажмите Да. + +Выберите Файл Сохранить + +Запустите ещё один &arts-builder;, выберите ФайлЗагрузить и загрузите tutorial снова. + +Сейчас вы можете выбрать ФайлВыполнить структуру в обеих копиях &arts-builder; с этой структурой. Вы можете услышать двойное воспроизведение одного и того же. В зависимости от времени, когда вы запускаете выполнение структуры, звук может изменяться. + +Ещё можно сделать следующее: запустите &noatun; и начните проигрывание какого-нибудь mp3. Запустите &artscontrol;. Перейдите в ВидУправление звуком.Вы увидите &noatun; и вашу tutorial структуру воспроизводящую что-то. Ещё лучше, если вы сделаете следующее: дважды нажмите на &noatun;, и вы сможете просмотреть список доступных шин. Вы также можете указать &noatun; выводить данные на шину audio, предоставляемую структурой tutorial. + + + +Шаг 7: Синтез midi + +Наконец, сейчас вы сможете сделать из вашей синусоидальной волны настоящий инструмент. Это ощутимо, только если у вас есть что-то передающее события &MIDI; в &arts;. Я хотел бы описать здесь, как вы сможете использовать некоторые внешние клавиатуры, midi-шина подобная &brahms; прекрасно подходит. + +Во-первых, очистим рабочий стол от лишнего, вам понадобится только один &arts-builder;, выполняющий структуру с синусоидальной волной. Затем, трижды сделайте Порты Создать входящий сигнал, и три раза Порты Создать выходной сигнал. Разместите порты где-нибудь. + +Выберите Порты Изменить позиции и имена и назовите порты frequency (частота), velocity (скорость), pressed (нажато), left (левый), right (правый), done (завершено). + +Наконец, вы можете удалить модуль Synth_SEQUENCE и соединить входящий порт frequency структуры с портом frequence модуля Synth_FREQUENCY. Но как же позиция? Мы её не имеем, потому как нет алгоритма, по которому вы могли бы предсказать, когда пользователь отпустит ноту, которую он только что нажал на midi клавиатуре. Так что мы имеем параметр pressed, который показывает когда пользователь держит нажатой клавишу. (pressed = 1: клавиша остаётся нажатой, pressed = 0: клавиша отпущена) + +Это означает, что объект Synth_PSCALE также должен замещён. Установите вместо него Synth_ENVELOPE_ADSR (из МодулиСинтез Оболочки ).Соедините: + + + +Вход структуры pressed с параметром active ADSR + + +Выход SIN с invalue ADSR + + +Outvalue ADSR с выходом структуры left + +Outvalue ADSR с выходом структуры right + + + +Установите параметры attack в 0.1, decay в 0.2, sustain в 0.7, release в 0.1. + +Ещё нам нужно обдумать, как структура должна узнать, когда нужно начать и остановить воспроизведение, потому что иначе никогда оно не остановится, если нота была отпущена. Но оболочка ADSR знает, когда уже ничего не должно быть слышно, начиная с уменьшения сигнала к нулю с момента отпускания ноты. + +Завершение показывается установкой 1 на выходе порта done. Так что связываем это с выходом done. Структура будет удалена, как только done установится в 1. + +Переименуем нашу структуру в instrument_tutorial (из ФайлПереименовать структуру. Затем сохраним его, используя сохранить как.Запустим artscontrol, и перейдём в ВидУправление MIDI, и выберем ДобавитьВыход MIDI синтеза aRts. Наконец, вы здесь можете выбрать ваш инструмент (tutorial). + +Откройте терминал и наберите midisend. Вы можете заметить, что midisend и инструмент присутствуют в окне управления &MIDI; &arts;. После выбора обоих элементов и нажатия Соединить, мы всё завершим. Возьмите вашу клавиатуру и начните играть (конечно же она должна быть соединена с вашим компьютером). + + + +Предложения + +Вам снова понадобилось по работать с &arts;. Имеются несколько советов, которые вы могли бы попробовать для улучшения вашей структуры: + + + +Попробуйте использовать что-нибудь другое, чем синусоидальную волну. Когда вы подключите треугольную волну, вы скорее всего предположите что звук не слишком хорош. Но попробуйте добавить фильтр SHELVE_CUTOFF сразу же после модуля треугольной волны для вырезания частот выше основной (попробуйте например 1000 Гц или лучше в два раза выше чем входная частота или входная частота + 200 Гц или что-то похожее на это). + + +Попробуйте использовать больше чем один генератор. Synth_XFADE может быть использован для смешения двух сигналов, Synth_ADD для сложения их. + + +Попробуйте установить для генераторов не совпадающие частоты, что даст несколько лучшие характеристики. + + +По экспериментируйте с более чем одной оболочкой. + + +Попробуйте создать инструменты с различными левым и правым выходом. + + +Также попробуйте дополнительно обработать сигнал после того как он попадёт на выходную шину.Вы можете, к примеру, смешать задержанные версии сигнала с оригинальным для создания эффекта эха. + + +Попробуйте использовать настройку скорости (это сила, с которой нота будет сжата, вы можете также говорить о громкости). Специальный эффект всегда есть не только когда изменяется громкость результирующего сигнала, но также и звучание инструмента (для примера вырезание частот). + + +... + + + +Если вы создали что-то замечательное, пожалуйста подумайте над возможностью предоставить это для интернет страницы &arts;. Или над включением в следующую версию. + + + + + +Примеры + +&arts-builder; распространяется с несколькими примерами, которые могут быть открыты из ФайлОткрыть пример... . Некоторые из них есть в директории, другие, которые по каким-то причинам не работают с данной версией, находятся в директории todo. +Примеры разделяются на несколько категорий: + + + +Независимые примеры иллюстрируют как нужно использовать каждый из встроенных модулей arts (названы example_*.arts). Обычно они выводятся что-то на звуковую карту. + + + +Инструменты созданные из низкоуровневых модулей arts (названы instrument_*.arts).Они удовлетворяют соглашению о входных и выходных портах так что они могут быть использованы менеджером &MIDI; в &artscontrol;. + + + +Шаблоны для создания новых модулей (названия template_*.arts). + + + +Эффекты, которые могут быть использованы для создания ваших структур. (названы effect_*.arts) [все в директории todo ] + + + +Элементы для смешивания сигналов включая и графические управляющие элементы (названы mixer_element_*.arts). [ все в директории todo ] + + + +Различные модули что не подходят не к одной из выше названных категорий. + + + + +Детальное описание каждого из модулей: + +example_stereo_beep.arts + +Создаёт 440 Гц синусоидальную волну в левом канале и 880 Гц синусоидальную волну в правом канале, и выдаёт это на звуковую карту. Это описано в документации по &arts;. + + + + +example_sine.arts + +Создаёт 440 Гц синусоидальную волну. + + + + +example_pulse.arts + +Создаёт 440 Гц импульсную волну с 20% рабочим сигналом. + + + + +example_softsaw.arts + +Создаёт 440 Гц пилообразную волну + + + + +example_square.arts + +Создаёт 440 Гц меандр. + + + + +example_tri.arts + +Создаёт 440 Гц треугольную волну. + + + + +example_noise.arts + +Создаёт белый шум. + + + + +example_dtmf1.arts + +Создаёт двух тоновую волну из 697 Гц и 1209 Гц синусоидальных волн, усиливая их на 0.5 и складывая их вместе. Это DTMF тон для числа "1" на клавиатуре телефона. + + + + +example_atan_saturate.arts + +Пропускает треугольную волну через фильтр насыщения на функции atan. + + + + +example_autopanner.arts + +Используя авторазбиение 400 Гц синусной волны между левой и правой колонкой с частотой 2 Гц. + + + + +example_brickwall.arts + +Увеличивает синусоидальную волну с коэффициентом 5 и затем пропускает через фильтр brickwall. + + + + +example_bus.arts + +Исходящий канал из шины названной Bus и входящий канал в шину out_soundcard с зарезервированным левым и правым каналом. + + + + +example_cdelay.arts + +Исходящий канал из шины названной Delay и входящий правый канал через задержку в 0.5 секунд, и левый канал не изменяется.Вы можете использовать &artscontrol; для соединения эффекта с проигрывателем и пронаблюдать результат. + + + + +example_delay.arts + +Всё тоже самое как и в example_cdelay.arts, но используется эффект задержки. + + + + +example_capture_wav.arts + +Этот пример использует модуль Synth_CAPTURE_WAV для сохранения 400 Гц волну как wav файл. Модуль запускается на несколько секунд и затем проверяет создание файла в /tmp. Вы можете воспроизвести файл в таком проигрывателе как kaiman. + + + + +example_data.arts + +Этот пример использует модуль Data для создания постоянного потока со значением 3 и пересылает его в модуль Debug для периодического показа. Также есть модуль Nil, иллюстрирующий как он может быть использован для ничего не делания. + + + + +example_adsr.arts + +Показывает как создавать простые инструменты используя модуль Envelope Adsr, переключающийся меандром. + + + + +example_fm.arts + +Используется модуль FM Source для создания 440 Гц синусоидальной волны с модулируемой частотой 5 Гц. + + + + +example_freeverb.arts + +Данный пример соединяет эффект Freeverb исходящего канала с выходом. Вы можете использовать Artscontrol для подключения эффекта к проигрывателю и пронаблюдать результат. + + + + +example_flanger.arts + +Данный пример реализует простой краевой(flanger) эффект (это может ещё не работать). + + + + +example_moog.arts + +Данная структура комбинирует два канала из шины в один, пропуская через Moog VCF-фильтр и посылает на шину звуковой платы. + + + + +example_pitch_shift.arts + +Данная структура прогоняет данные левого канала через фильтр-смещения (pitch shift).С помощью установки различной скорости вы можете изменять эффект. + + + + +example_rc.arts + +Данная структура пропускает белый шум через RC-фильтр и выводит сигнал на звуковую плату.На индикаторе БПФ(FFT) в artscontrol вы можете увидеть как изменяется форма сигнала из не фильтрованного шума. + + + + +example_sequence.arts + +Демонстрация модуля Sequence с помощью проигрывания последовательности нот. + + + + +example_shelve_cutoff.arts + +Эта структура пропускает белый шум через фильтр Shelve-Cutoff и выводит на звуковую плату.На индикаторе БПФ(FFT) в artscontrol вы можете увидеть как изменяется форма сигнала из не фильтрованного шума. + + + + +example_equalizer.arts + +Демонстрация модуля Std_Equalizer. Повышает нижние и высокие частоты на 6 Дб. + + + + +example_tremolo.arts + +Демонстрация эффекта Тремоло. Левый и правый канал модулируются 10 Гц Тремоло. + + + + +example_xfade.arts + +В приведенном примере смешиваются частоты 440 Гц и 880 Гц синусоидальных волн с использованием cross fader. Последний может иметь значение от -1 до 1. + + + + +example_pscale.arts + +Демонстрация работы модуля Pscale (Я не уверен что это подходящий пример). + + + + +example_play_wav.arts + +Иллюстрирует модуль Play Wave. Вам нужно ввести полный путь до файла .wav в параметр имя файла. + + + + +example_multi_add.arts + +Модуль Multi Add может обрабатывать любой набор входных каналов. В примере суммируются три выхода Data-модулей и показывает результат 6. + + + + + + diff --git a/tde-i18n-ru/docs/kdemultimedia/artsbuilder/detail.docbook b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/detail.docbook new file mode 100644 index 00000000000..7fa900aba00 --- /dev/null +++ b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/detail.docbook @@ -0,0 +1,1365 @@ + + + +&arts; в деталях + + +Архитектура + + + + + +Структура &arts;. + + + + +Модули и порты + +Основная идея &arts; - это синтез звука при помощи небольших модулей, которые предназначены только для этой цели, и комбинирования из них различных структур. Модули обычно имеют входы, на которые поступают различные сигналы или параметры, и выходы, на которых вырабатываются некоторые сигналы. + +В случае одного модуля (Synth_ADD) берутся два сигнала с входа и складываются вместе. Результатом является сигнал на выходе. Места, где модуль предоставляет свои входные/выходные сигналы, называются портами. + + + + +Структуры + +Структура - это набор связанных модулей, некоторые из которых могут иметь параметры, кодируемые непосредственно в их входные порты, другие могут быть связаны с остальными или вообще ни с чем не связаны. + +С помощью &arts-builder; вы можете описать структуры. Вы описываете, какие модули вы хотели бы соединить. Завершив описание, вы можете сохранить полученную структуру в файле или создать описанную структуру, запустив Execute. + +Вы услышите звук, если всё сделали правильно. + + + + + +Задержки + + +Что такое задержки? + +Предположим, у вас есть программа mousepling, которая издает звук, если вы нажимаете на кнопку. Задержка - это время между нажатием кнопки и тем, когда вы слышите звук. Задержка в данном случае составляется из других задержек, имеющих различные причины. + + + + +Задержка в простых программах + +В этой простой программе задержки происходят в следующих местах: + + + + +Время, пока ядро операционной системы не оповестит сервер X11, что кнопка мыши была нажата. + + + +Время, пока сервер X11 не оповестит вашу программу, что кнопка мыши была нажата. + + + +Время, пока ваша программа не решит, что нужно проиграть звук. + + + +Время указания программой звуковому серверу, что сервер должен проиграть звук. + + + +Время прохода звукового фрагмента через буфер данных (когда звуковой сервер начинает микшировать другие потоки в один), пока он действительно не достигнет места для проигрывания звуковой картой. + + + +Время прохождения звука от колонок до вашего уха. + + + +Первые три причины задержки не относятся к &arts;. Они интересны, но выходят за область этого документа. Тем не менее нужно осознавать, что они существуют, так что даже если вы всё оптимизировали до действительно низких значений, вы можете не получить в точности расчетный результат. + +Указание серверу проиграть что-нибудь обычно включает один вызов &MCOP;. Имеются тесты, которые подтверждают, что на одном и том же компьютере с unix-сокетами проигрывание сервером чего-нибудь возможно около 9000 раз в секунду в текущей реализации. Я предполагаю, что большая часть этой задержки создается ядром ОС при переключении между процессами. Конечно, это значение зависит от типа параметров. Если вы передаёте целый образ за один вызов, то это будет медленнее, чем если вы передадите только одно длинное значение. Это справедливо и для кода возврата. Конечно, для обычных строк (таких как имя воспроизводимого wav файла) это не должно быть проблемой. + +Мы можем оценить это время как 1/9000 с, что меньше 0,15 мс. Мы увидим, что это не так важно. + +Следующая задержка - это время между началом проигрывания сервером и временем прихода фрагмента на звуковую плату. Серверу необходима буферизация, так что когда запущены другие программы, как ваш сервер X11 или программа mousepling, звук не прерывается. Под &Linux; создаются фрагменты определенного размера. Сервер постоянно заполняет фрагменты и отдаёт их звуковой плате для воспроизведения. + +Предположим, есть три фрагмента. Сервер заполняет первый, звуковая плата начинает проигрывать его. Сервер заполняет второй. Сервер заполняет третий. Сервер завершает работу, другие программы могут начинать что-нибудь делать. + +Как только звуковая плата проиграет первый фрагмент, она начинает проигрывать второй, и сервер начинает заполнять первый фрагмент. И так далее. + +Максимальная задержка при этом равна (число фрагментов)*(размер каждого фрагмента)/((частота дискретизации)*(размер одного отсчета)). С параметрами 44 Кгц стерео и 7 фрагментов размером по 1024 байта (настройки aRts по умолчанию), мы получим 40 мс. + +Данное значение может быть настроено соответственно вашим нуждам. Конечно, загрузка CPU увеличивается с уменьшением задержки, так как звуковому серверу нужно заполнять буфера более часто, и в меньших размерах. Почти невозможно получить хорошие значения без предоставления звуковому серверу приоритета реального времени, иначе вы часто будете слышать прерывание звучания. + +Конечно, вполне реально сделать что-нибудь вроде 3-х фрагментов, каждый размером 256 байтов, которые дали бы задержку в 4.4 мс. С 4.4 мс задержки и загрузка CPU &arts; будет около 7.5%. С 40 мс задержкой она составит около 3% (на PII-350, и данное значение может зависеть от вашей звуковой карты, версии ядра и т.д.). + +Затем есть время, необходимое для прохода звука от колонок до ваших ушей. Предполагается что от вас до колонок 2 метра. Звук перемещается со скоростью 330 метров в секунду. Мы можем округлить данное время до 6 мс. + + + + +Задержка в потоковых программах + +Потоковые программы производят звук самостоятельно. Рассмотрим игру, которая создает постоянный поток отсчетов, и должна быть адаптирована для &arts;. Например, когда я нажимаю кнопку, фигура, которой я играю, прыгает, и раздаётся звук. + +Сначала вам нужно знать, как &arts; работает с потоковым звуком. Это очень похоже на ввод/вывод со звуковой платой. Игра посылает некоторые пакеты с отсчетами звуковому серверу. Например, три пакета. Как только звуковой сервер закончит с первым пакетом, он посылает подтверждение игре, что этот пакет обработан. + +Игра создаёт другой звуковой пакет и посылает его серверу. Тем временем сервер начинает поглощать второй пакет, и так далее. Задержка здесь схожа с простым случаем: + + + +Время, пока ядро не оповестит сервер X11, что клавиша была нажата. + + + +Время, пока сервер X11 не оповестит игру, что кнопка была нажата. + + + +Время, пока игра не определит, что по этой кнопке стоит проиграть звук. + + + +Время, пока звуковой пакет, который игра начала передавать серверу, не достигнет звукового сервера. + + + +Время, необходимое для прохождения звука, который звуковой сервер смешивает с другим выводимым звуком в один, через буфер данных, пока тот действительно не достигнет места, где звуковая плата проигрывает звук. + + + +Время, нужное для достижения звука из колонок вашего уха. + + + + +Внешние задержки, как и ранее, вне рамок этого документа. + +Очевидно, что задержка потокового звука зависит от времени, необходимого для воспроизведения всех пакетов потока. Итак, это (число пакетов)*(размер пакета)/((частота образцов)*(размер отсчета)). + +Как вы видите, эта же формула применяется для фрагментов. Конечно, для игр это несущественно из-за такой же небольшой задержки, как и раньше. Я бы посоветовал использовать конфигурацию для игр 2048 байт на пакет и использование 3 пакетов. Результирующая задержка составит 35 мс. + +Это основано на следующей оценке. Допустим, игра идёт с частотой 25 кадров в секунду. Возможно, вы не заметите различий вывода звука в пределах одного кадра. Итак, задержка в 1/25 с при потоковом воспроизведении приемлема, что составляет 40 мс. + +Большинство не запускает игры с приоритетом реального времени, и опасностью перерывов в звуке нельзя пренебрегать. Потоковый звук с 3 пакетами по 256 возможен - я проверял - но сильно загружает процессор. + +Задержки сервера вы можете расчитать точно также. + + + + +О загрузке процессора + +Имеется масса факторов, которые влияют на загрузку процессора в сложных случаях, с потоковыми и прочими приложениями и модулями сервера. Назовём несколько: + + + +Загрузка процессора необходимыми вычислениями. + + + +Накладные расходы внутреннего планирования &arts; - &arts; решает когда,какой модуль и что должен вычислить. + + + +Накладные расходы преобразования целых чисел в числа с плавающей запятой. + + + +Накладные расходы протокола &MCOP;. + + + +Ядро: переключение процессов/контекстов + + + +Ядро: накладные расходы связи + + + +Если запущены два потока, то их загрузка процессора суммируется. Если вы применяете фильтр, то требуются некоторые вычисления. Упрощённо, сложение двух потоков может использовать четыре цикла CPU на сложение, для 350Мгц процессора это 44100*2*4/350000000 = 0.1% использования CPU. + +Внутреннее планирование &arts;: &arts; должен решить, какой модуль, когда и что вычисляет. Это требует времени. Вам нужен профилировщик, если вы заинтересованы в этом. Чем меньше требуется обработки в реальном времени, (например, за счет обработки больших буферов), тем меньше накладные расходы планирования. Если обрабатывать блоки по 128 отсчетов (с использованием фрагментов размером по 512 байт), то на накладные расходы планирования можно не обращать внимания. + +Накладные расходы преобразования целых чисел в числа с плавающей точкой: внутри &arts; используются данные в формате с плавающей точкой. Это упрощает обработку и на последних процессорах не медленнее, чем целочисленные операции. Конечно, если клиент использует целочисленные данные, (подобно игре, которая выводит звук через &arts;), то требуется их преобразовать. Также и звуковая карта принимает целочисленные данные, так что их нужно преобразовывать. + +Вот данные для процессора Celeron, такты процессора на обработку одного отсчета, с опцией -O2 egcs 2.91.66 (получены Евгением Смитом hamster@null.ru). Конечно, это сильно зависит от процессора: + +convert_mono_8_float: 14 +convert_stereo_i8_2float: 28 +convert_mono_16le_float: 40 +interpolate_mono_16le_float: 200 +convert_stereo_i16le_2float: 80 +convert_mono_float_16le: 80 + + +Итак загрузка составляет в среднем 1% для преобразования и 5% для интерполяции на 350 МГц процессоре. + +Накладные расходы &MCOP; протокола, по приблизительным подсчётам, 9000 обращений в секунду. Многое из этого не является недостатком &MCOP;, но относится к двум моментам из ядра операционной системы, описанным ниже.Это даёт основу для вычислений стоимости затрат потоковой обработки. + +Каждый пакет данных, передаваемый через потоки, может рассматриваться как одно &MCOP; обращение. Конечно же, большие пакеты медленнее, чем 9000 пакетов/с, но это только прикидки. + +Предполагается, что вы используете пакеты размером 1024 байт. Таким образом, для передачи потока с 44 КГц стерео вам необходимо передать 44100*4/1024 = 172 пакета в секунду. Предполагается, что вы можете при 100% загрузке процессора передать 9000 пакетов, тогда получите (172*100)/9000 = 2% использования CPU для потока с пакетами в 1024 байт. + +Это округлённые расчеты. Однако, они показывают, что намного лучше было бы, если время задержки вас устраивает, использовать к примеру пакеты по 4096 байт. Тогда мы имеем формулу вычисления размера пакета, который приводит к 100% загрузке CPU, 44100*4/9000 = 19.6 отсчета, и таким образом получаем формулу для оценок: + +использование CPU потоком в процентах = 1960/(ваш размер пакета) + +которая даёт нам 0.5% использования CPU потоками с размером пакета в 4096 байт. + +Переключение ядром процессов/контекстов: это часть накладных расходов &MCOP; протокола. Переключение между двумя процессами требует времени - отображение новой памяти, непопадание в кэш, или что-то ещё (если это читает эксперт по ядру - дайте мне знать, что точно является причиной). Это забирает время. + +Я не знаю, как с какой частотой &Linux; может переключать контексты, но это число не бесконечно. Таким образом, накладные расходы &MCOP; протокола, как я полагаю, в немалой степени вызваны переключением контекстов. В начале разработки &MCOP; я протестировал использование такого взаимодействия внутри одного процесса, и это было намного быстрее (в четыре раза быстрее или около того). + +Ядро: накладные расходы взаимодействия: Это часть накладных расходов протокола &MCOP;. Передача данных между процессами сейчас сделана через сокеты. Это удобно, так как для определения прихода данных могут быть использованы обычные методы select(). И это может также сочетаться с другими источниками ввода-вывода, такими как звуковой ввод-вывод, сервер X11 или любыми другими. + +Тем не менее, вызовы чтения и записи стоят процессорных тактов. Для небольших обращений (таких как передача одного midi события) это и не так плохо, но для больших обращений (как передача одного видеокадра размером в несколько мегабайт) это уже точно проблема. + +Использование общей разделяемой памяти для &MCOP; там, где это возможно, было бы лучшим решением. Однако это должно быть сделано прозрачно для программиста приложения. + +Возьмите профилировщик или сделайте другие тесты для выяснения, в какой степени на обработку текущего аудио потока влияет неиспользование общей памяти. Совсем не плохо, когда обработка аудио потока (проигрывание mp3) с помощью &artsd; и artscat с загружает процессор на 6% (на 5% с помощью только mp3-декодера). Конечно, это включает всё от выполнения необходимых вычислений до издержек работы с сокетами, таким образом я бы сказал, что возможно сэкономить 1%, используя общую память. + + + + +Некоторые сложные случаи + +Это сделано в текущем разрабатываемом варианте. Я также хотел проверить по-настоящему сложные случаи, и это не то, что должны использовать обычные приложения. + +Я написал приложение, названное streamsound, которое посылает потоковые данные &arts;. Оно работает с приоритетом реального времени (без проблем), и с одним небольшим модулем сервера (масштабирование и ограничение громкости): + +4974 stefan 20 0 2360 2360 1784 S 0 17.7 1.8 0:21 artsd + 5016 stefan 20 0 2208 2208 1684 S 0 7.2 1.7 0:02 streamsound + 5002 stefan 20 0 2208 2208 1684 S 0 6.8 1.7 0:07 streamsound + 4997 stefan 20 0 2208 2208 1684 S 0 6.6 1.7 0:07 streamsound + + +Каждый из этих процессов - обработка потока с 3 фрагментами по 1024 байта (18мс). Имеется три таких клиента, работающих одновременно. Я знаю, что это выглядит немного излишне, но как я сказал: возьмите профилировщик и выясните, на что тратится время, и если вы сочтёте необходимым, то исправьте. + +Конечно, я не думаю, что в реальной жизни понадобится такая потоковая обработка. Для тестов я пробовал то, что уменьшаеит задержку до минимума. Результат: вы можете обрабатывать потоки без прерываний с одним клиентским приложением, если вы взяли 2 фрагмента по 128 байт между aRts и звуковой картой, и между клиентским приложением и aRts. Это означает, что вы имеете общую максимальную задержку в 128*4/44100*4 = 3 мс, где 1.5 мс происходят из-за ввода/вывода звуковой карты и 1.5 мс из-за взаимодействия с &arts;. Оба приложения нужно запускать с приоритетом реального времени. + +Конечно, это сильно загружает процессор. Данный пример загружает мой P-II/350 приблизительно на 45%. Также будут слышны щелчки, если вы запустите top, начнёте перемещать окна на вашем дисплее X11 или выполнять операции дискового ввода/вывода. Всё это - проблемы ядра. Проблема планирования двух или большего числа приложений с приоритетом реального времени очень сложна, и ещё сложнее, если они взаимодействуют, оповещая друг друга и т. д. + +Наконец, более жизненный пример. Это &arts; с artsd и одним artscat (один клиент обработки потока) запустивший 16 фрагментов по 4096 байт: + +5548 stefan 12 0 2364 2364 1752 R 0 4.9 1.8 0:03 artsd + 5554 stefan 3 0 752 752 572 R 0 0.7 0.5 0:00 top + 5550 stefan 2 0 2280 2280 1696 S 0 0.5 1.7 0:00 artscat + + + + + + + + +Шины + +Шины - это динамически созданные соединения, которые передают аудио. В основном, это некоторые входные и выходные связи. Все сигналы из входных связей складываются и посылаются на выходные связи. + +Шины сейчас реализованы для операций со стерео, итак вы можете передавать через шины только стерео данные. Если вы хотите моно, хорошо, передавайте их только по одному каналу и установите другой в ноль или что-нибудь иное. Что же вам нужно сделать для этого, создать один или несколько Synth_BUS_UPLINK объектов и указать им имя шины, по которой они должны общаться ( например аудио или барабаны. Просто направляйте данные туда. + +Затем, вам нужно создать один или несколько Synth_BUS_DOWNLINK объектов выходных связей, и указать им имя шины (аудио или барабаны ... если это подходит для передачи данных через них), и обработанные данные будут на выходе. + +Входные и выходные связи могут находиться внутри различных структур, вы можете даже иметь несколько запущенных копий &arts-builder; и начать передавать в одной и принимать данные в другой. + +Шины хороши тем, что они полностью динамические. Клиенты могут подключаться и отключаться во время работы, не будет прерываний потока или шума. + +Конечно, вы не должны отключать клиента, проигрывающего сигнал, после отключения от шины возможно сигнал не будет нулевым, и тогда поток прервётся. + + + + +Трейдинг + +&arts;/&MCOP; основан на распределении задач по небольшим компонентам. Благодаря этому система становится более гибкой, тогда можно расширять систему, просто добавляя новые компоненты, реализующие новые эффекты, форматы файлов, генераторы, элементы пользовательского интерфейса, ... Поскольку почти все элементы - это компоненты, всё можно расширять очень просто, без изменения существующих исходников. Новые компоненты могут быть просто динамически загружены для улучшения уже существующих приложений. + +Для этого необходимы две вещи: + + + + +Компоненты должны извещать о себе сами - они должны описывать собственную функциональность так, чтобы другие приложения могли бы использовать их. + + + +Приложения должны активно просматривать наличие компонентов, которые они могут использовать, вместо использования одних и тех же способов выполнения задач. + + + + +Обобщенно: компоненты, которые говорят: здесь я, я то что нужно, используй меня, и приложения (или если вам нужно, другие компоненты), которые выходят и смотрят, какой компонент они могут использовать для выполнения задачи. Это называется трейдинг. + +В &arts;, компоненты описывают сами себя, указывая значения, которые они поддерживают как свойства. Типичным свойством для компонента загрузки файлов может быть расширение обрабатываемых файлов. Типичные значения могут быть wav, aiff или mp3. + +Фактически каждый компонент может предлагать несколько различных значений для одного свойства. Так, один компонент может предлагать прочитать оба, wav и aiff файла, указав что поддерживает эти значения для свойства Расширение. + +Для этого компонент должен поместить в соответствующее место файл .mcopclass, содержащий поддерживаемые свойства. Для нашего примера это может выглядеть подобно так (и установлено в componentdir/Arts/WavPlayObject.mcopclass): + +Interface=Arts::WavPlayObject,Arts::PlayObject,Arts::SynthModule,Arts::Object +Author="Stefan Westerfeld <stefan@space.twc.de>" +URL="http://www.arts-project.org" +Extension=wav,aiff +MimeType=audio/x-wav,audio/x-aiff + + +Важно, чтобы имя .mcopclass-файла также было содержательным. Трейдер не просматривает содержание всего файла, если файл (как здесь) назван Arts/WavPlayObject.mcopclass, а интерфейс компонента назван Arts::WavPlayObject (модули отображаются на каталоги). + +Для просмотра компонентов имеется два интерфейса (которые определены в core.idl, так что вы имеете их в каждом приложении), названные Arts::TraderQuery и Arts::TraderOffer. Вы ищете нужные компоненты следующим образом: + + + +Создаёте объект запроса: +Arts::TraderQuery запрос; + + + + +Укажите, что вам нужно. Как вы видели выше, компоненты описывают сами себя, используя свойства, для которых они устанавливают определённые значения. Так что можно указать, что вам нужно, выбрав компоненты, которые поддерживают определённые значения для свойств. Это делается с помощью методов TraderQuery: + +query.supports("Interface","Arts::PlayObject"); + query.supports("Extension","wav"); + + + + +Наконец, делаем запрос, используя метод запроса. Затем (как надеемся) получаем некоторые предложения: + +vector<Arts::TraderOffer> *offers = query.query(); + + + + +Сейчас вы можете проверить то, что нашли. Важен метод interfaceName интерфейса TraderOffer, который вернёт вам имя компонента, подходящего запросу. Вы также можете узнать дополнительные свойства, используя getProperty. Следующий код просто проходит по всем компонентам, выводит их имена интерфейсов (которые могли быть использованы для создания) и удаляет результаты запроса: +vector<Arts::TraderOffer>::iterator i; + for(i = offers->begin(); i != offers->end(); i++) + cout << i->interfaceName() << endl; + delete offers; + + + + +Чтобы служба трейдинга была полезна, важно прийти к согласию, каковы могут быть свойства компонентов. Существенно, чтобы практически все компоненты в определённой области использовали одинаковый набор свойств для описания самих себя (и по возможности одинаковый набор значений), так что приложения или другие компоненты могли бы найти их. + +Author (строковый тип, необязательный): Это может быть использовано для того, чтобы показать миру, что вы это написали. Вы можете написать здесь всё, что угодно, конечно желателен адрес электронной почты. + +Buildable (булевый тип, рекомендуется): говорит о возможности использования компонента инструментами RAD (такими как &arts-builder;), которые используют компоненты, устанавливая соответствие свойствам и соединяя порты. Рекомендуется устанавливать данное значение в истинное для большинства компонент обработки сигналов (таких как фильтры, эффекты, осцилляторы и т. д.), и для всех других, которые могут быть использованы в RAD, но не для внутренней работы как, например, Arts::InterfaceRepo. + +Extension (строковый тип, используется, когда это уместно): вcё, что связано с файлами, должно задавать это. Вы можете указать расширение файла в нижнем регистре без ., поэтому что-то типа wav подходит. + +Interface (строковый тип, необходим): должно включать полный список поддерживаемых (полезных) интерфейсов вашими компонентами, возможно включая Arts::Object и, если это возможно, Arts::SynthModule. + +Language (строковый тип, рекомендуется): если вы хотите загружать компонент динамически, то нужно указать здесь язык написания компонента. Сейчас допускается только значение C++, которое означает, что компонент был написан с использованием нормального API C++. Если вы сделали так, то вам ещё нужно установить свойство Library, описанное ниже. + +Library (строковый тип, используется, когда это уместно): компоненты, написанные на C++, могут быть динамически загружены. Для этого вам нужно скомпилировать их в динамически загружаемые .la модули, используя libtool. Здесь вы можете указать имя .la-файла, который содержит ваш компонент. Не забудьте использовать REGISTER_IMPLEMENTATION (всегда). + +MimeType (строковый тип, используется, когда это уместно): вcё, что связано с файлами, должно задавать это. Здесь вы можете установить стандартный mimetype в нижнем регистре, для примера audio/x-wav. + +&URL; (строковый тип, используется по усмотрению автора): если вы хотите указать людям, где они могут найти последнюю версию компонента (или домашнюю страницу или что-нибудь другое), вы можете сделать это. Это может быть стандартным адресом &HTTP; или &FTP;. + + + + + + +Пространства имен в &arts; + + +Введение + +Каждое пространство имен соответствует модулю, объявленному в &IDL; &MCOP;. + +// mcop idl + +module M { + interface A + { + } +}; + +interface B; + + +В этом случае, созданный С++ код для &IDL; выглядел бы так: + +// C++ header + +namespace M { + /* объявление A_base/A_skel/A_stub и подобных */ + class A { // описание класса + /* [...] */ + }; +} + +/* объявление B_base/B_skel/B_stub и подобных */ +class B { + /* [...] */ +}; + + +Итак, когда вы ссылаетесь на классы из примера выше в вашем С++ коде, вы должны написать M::A, но просто B. Конечно, вы можете использовать using M где-нибудь - как с любыми другими пространствами имён в С++. + + + + +Как &arts; использует пространства имён + +Есть одно глобальное пространство имён, названное Arts, которое используют все программы и библиотеки, относящиеся к &arts;, для объявления своих интерфейсов. Это означает, что когда пишется С++ код, который зависит от &arts;, вы обычно должны добавлять префикс Arts:: для каждого используемого класса, как в данном примере: + +int main(int argc, char **argv) +{ + Arts::Dispatcher dispatcher; + Arts::SimpleSoundServer server(Arts::Reference("global:Arts_SimpleSoundServer")); + + server.play("/var/foo/somefile.wav"); + + +Другая альтернатива - описать использование пространства имён Arts только один раз, подобно: + +using namespace Arts; + +int main(int argc, char **argv) +{ + Dispatcher dispatcher; + SimpleSoundServer server(Reference("global:Arts_SimpleSoundServer")); + + server.play("/var/foo/somefile.wav"); + [...] + + +В &IDL; файлах у вас нет выбора. Если вы пишете код, который относится к &arts;, то вы должны заключить его в конструкцию module &arts;. + +// IDL файл для aRts: +#include <artsflow.idl> +module Arts { // поместить это в пространство имён Arts + interface Synth_TWEAK : SynthModule + { + in audio stream invalue; + out audio stream outvalue; + attribute float tweakFactor; + }; +}; + + +Если вы пишете код, который не относится к &arts;, то не обязаны помещать его в пространство имён Arts. Конечно, вы можете сделать собственное пространство имён, если вам это нужно. В любом случае, вы должны устанавливать соответствующий префикс для классов из &arts;. + +// IDL файл для кода, не относящегося к &arts;: +#include <artsflow.idl> + +// написав без объявления модуля указываем, что созданные классы не используют +// пространства имён: +interface Synth_TWEAK2 : Arts::SynthModule +{ + in audio stream invalue; + out audio stream outvalue; + attribute float tweakFactor; +}; + +// конечно, вы можете ещё выбрать собственное пространство имён, если вам нужно, +// так что, если вы пишете приложение "PowerRadio", вы могли, например, сделать так: +module PowerRadio { + struct Station { + string name; + float frequency; + }; + + interface Tuner : Arts::SynthModule { + attribute Station station; // нет необходимости в префиксе Station, так как модуль тот же + out audio stream left, right; + }; +}; + + + + + +Подробности: как работает реализация класса + +Часто, в интерфейсах, преобразованиях, методах и пр. &MCOP; нуждается в описании имён типов или интерфейсов. Они представляются в виде строк в общей &MCOP; структуре данных, в то время как пространство имён написано на С++. Это означает, что строки содержат M::A и B, из примера выше. + +Заметим, что это применяется, даже если внутри текста &IDL; не было квалификаторов пространства имён, поскольку из контекста ясно, в каком пространстве имён используется интерфейс A. + + + + + +Многопоточность в &arts; + + +Основы + +Многопоточность доступна не на всех платформах. Вот почему &arts; был изначально написан без использования потоков. Для всех задач может быть написано как многопоточное, так и однопоточное решение, которое делает то же самое. + +Так, вместо аудиовывода в отдельном блокирующем потоке &arts; использует аудиовывод без блокировок, и узнаёт, когда нужно записывать следующий фрагмент данных с помощью функции select(). + +Конечно, &arts; (в последних версиях) предоставляет поддержку для использования в объектах многопоточности. К примеру, если вы уже имеете код для проигрывателя mp3, и код предполагает запуск декодера mp3 в отдельном потоке, то это проще всего сделать с использованием многопоточности. + +Реализация &arts;/&MCOP; опирается на разделение состояний между различными объектами в явном и неявном виде. Список объектов в разделяемой области включает в себя: + + +Объект диспетчера, который осуществляет взаимодействие &MCOP;. + + + +Подсчёт ссылок, связей (Smartwrappers). + + + +Диспетчер ввода-вывода, который реализует таймер и следит за дескрипторами файлов. + + + +Менеджер объектов, который создаёт объекты и динамично загружает модули. + + + +Объект контроля потока, который вызывает calculateBlock в подходящих ситуациях. + + + +Ни один из предыдущих объектов не предполагает одновременного использования (например, вызова из различных потоков одновременно). В общем, имеются два подхода к разрешению этой проблемы: + + + +для вызова функций этих объектов требуется создать блокировку перед использованием. + + + +написание кода этих объектов действительно безопасным с точки зрения многопоточности и/или создание для каждой потока своей копии. + + + +&arts; следует первому пути: вам нужна блокировка всякий раз, когда вы используете любой из этих объектов. Второй путь сложнее. Попытка реализовать его доступна на момент написания по ссылке http://space.twc.de/~stefan/kde/download/arts-mt.tar.gz. На настоящий момент простой подход, возможно, работает лучше и создаёт меньше проблем с существующими приложениями. + + + +Когда и как задавать блокировку? + +Можно установить или освободить блокировку двумя функциями: + + + + +Arts::Dispatcher::lock() + + + + +Arts::Dispatcher::unlock() + + + + +Обычно вам не нужна явная блокировка (и вы не должны пробовать делать это), если это уже сделано. Список условий, когда блокировка уже есть: + + + +Вы получаете обратный вызов из диспетчера ввода-вывода (по таймеру или через дескриптор файлов). + + + +Вы получаете вызов какого-то &MCOP; запроса. + + + +Вы получаете вызов менеджера оповещения. + + + +Вы получаете вызов системы контроля потока (calculateBlock) + + + +Имеются также некоторые функции, которые вы можете вызывать только в основном потоке, и для них вам никогда не нужно получать блокировку: + + + +Конструктор/деструктор диспетчера объектов или ввода-вывода. + + + +Dispatcher::run() / IOManager::run() + + + +IOManager::processOneEvent() + + + +И всё. Для всего остального, что хоть как-то взаимодействует с &arts;, вам нужно получить блокировку и освободить её сразу после завершения. Всегда. Вот простой пример: + +class SuspendTimeThread : Arts::Thread { +public: + void run() { + /* + * Вам нужна здесь блокировка, потому что: + * - создание ссылки нуждается в блокировке (глобальной: управление передаётся + * менеджеру объектов, который может нуждаться в объекте GlobalComm + * для поиска, куда нужно соединиться) + * - подключение smartwrapper нуждается в блокировке + * - создание объекта из ссылки нуждается в блокировке (потому что это + * может требоваться для подключения к серверу) + */ + Arts::Dispatcher::lock(); + Arts::SoundServer server = Arts::Reference("global:Arts_SoundServer"); + Arts::Dispatcher::unlock(); + + for(;;) { /* + * здесь вам нужна блокировка, так как + * - отключение smartwrapper нуждается в блокировке (может + * потребоваться создать что-то) + * - оповещения MCOP нуждаются в блокировке + */ + Arts::Dispatcher::lock(); + long seconds = server.secondsUntilSuspend(); + Arts::Dispatcher::unlock(); + + printf("seconds until suspend = %d",seconds); + sleep(1); + } + } +} + + + + + + +Классы для работы с многопоточностью + +Доступны следующие классы: + + + + Arts::Thread - интерфейс к потокам. + + + + Arts::Mutex - интерфейс к мьютексам. + + + + Arts::ThreadCondition - интерфейс к возобновлению условно приостановленных потоков. + + + +Arts::SystemThreads - интерфейс к потокам самой операционной системы (несколько полезных функций для прикладных программистов). + + + +См. ссылки на документацию. + + + + + +Ссылки и обработка ошибок + +Ссылки &MCOP; - одна из основных концепций в программировании &MCOP;. В этой части описано, как используются ссылки, и даётся попытка осветить случаи отказов (сбоев работы сервера). + + +Основные свойства ссылок + + + +Ссылка &MCOP; не является объектом, но ссылается на объект: даже если следующее объявление, + Arts::Synth_PLAY p; + выглядит похожим на определение объекта, оно только объявляет ссылку на объект. Как С++ программист, вы можете воспринимать это как Synth_PLAY *, указатель на объект Synth_PLAY. Главным образом это означает, что p подобно указателю на NULL. + + + +Вы можете создать ссылку на NULL явно. +Arts::Synth_PLAY p = Arts::Synth_PLAY::null(); + + + + +Вызов функций с использованием ссылки на NULL приводит к сбою в core +Arts::Synth_PLAY p = Arts::Synth_PLAY::null(); + string s = p.toString(); + +приводит к сбою. Сравним с указателями, по существу это похоже на + QWindow* w = 0; + w->show(); +. Каждый программист С++ знает, как избегать таких ситуаций. + + + +Неинициализированные объекты кое-как пытаются создать себя сами при первом использовании + +Arts::Synth_PLAY p; + string s = p.toString(); + +это несколько отличается от разыменования указателя на NULL. Вы вообще не указали объекту, чем он является, и пытаетесь использовать его. Вообразим здесь, что вы хотели иметь новую локальную копию объекта Arts::Synth_PLAY. Конечно вы могли хотеть что-то ещё (вроде создания объекта где-то ещё или использования существующего внешнего объекта. Так или иначе, объект будет как-то создан, но созданный подобным образом объект не будет работать до тех пор пока вы не присвоите ему какое-то значение (также как и нулевая ссылка). + +Эквивалент в терминах С++ + QWidget* w; + w->show(); + что в C++ безусловно приводит к ошибке обращения к памяти. Итак, есть отличия. Такое создание объекта может быть ошибочным потому, что необязательно существует реализация вашего интерфейса. + +Для примера, рассмотрим абстрактную конструкцию, подобную Arts::PlayObject. Имеются вполне определённые объекты для воспроизведения mp3 или wav, но + Arts::PlayObject po; + po.play(); + точно не будет работать. Проблема в том, что хотя код пытается как-то создать объект PlayObject, это не работает, так как имеются только реализации, подобные Arts::WavPlayObject. Так что создавать объекты вы можете только тогда, когда существует реализация. + + + +Ссылки могут указывать на один и тот же объект + +Arts::SimpleSoundServer s = Arts::Reference("global:Arts_SimpleSoundServer"); + Arts::SimpleSoundServer s2 = s; + + +создаст две ссылки на один и тот же объект. Это не копирование значений и не создание двух объектов. + + + +Все ссылки на объекты подсчитываются. Так что объект, на который нет ссылок, удаляется. Нет специальных методов для удаления объектов, однако, вы можете использовать что-то похожее на это + Arts::Synth_PLAY p; + p.start(); + [...] + p = Arts::Synth_PLAY::null(); + для удаления объекта Synth_PLAY в конце. В особенности, никогда не требуется использовать new и delete вместе со ссылками. + + + + + + +Случаи сбоев + +Ссылки могут указывать на внешние объекты, а серверы, содержащие такие объекты, могут упасть. Что тогда происходит? + + + + +Сбой сервера не изменяет ссылку, если это нулевая ссылка. Это означает, что если foo.isNull() была true до падения сервера, тогда она также вернёт true и после падения сервера. Это также означает, что, если foo.isNull() была false до падения сервера (ссылка foo ссылалась на объект), тогда она также вернёт false и после падения сервера. + + + +Вызовы методов действительной ссылки безопасны. Предположим, что сервер содержащий объект calc, упал. Подобный вызов + int k = calc.subtract(i,j) +безопасен. Явно subtract вернёт что-то неверное, потому что внешний объект уже не существует. В этом случае (k == 0) может быть верным. В основном, операции возвращают в качестве результата что-нибудь нейтральное, как 0.0, нулевые ссылки на объекты или пустые строки, когда объект более не существует. + + + +Существует функция error() для проверки того, как что-то отработало. + +В предыдущем случае, + int k = calc.subtract(i,j) + if(k.error()) { + printf("k is not i-j!\n"); + } + может вывести k is not i-j, если внешний вызов не работает. Иначе k будет действительным результатом выполнения операции subtract, выполненной внешним объектом (сервер не разрушен). Однако для методов, выполняющих операции подобные удалению файлов, вы не можете знать, что произошло в действительности. Конечно, это произошло, если .error() вернула false. Однако, если .error() вернула true, существуют две возможности: + + + +Файл удалён и сервер упал сразу после удаления, но до передачи результата. + + + +Сервер упал до удаления файла. + + + + + +Использование вложенных вызовов опасно в отказоустойчивых программах + +Использование кода + window.titlebar().setTitle("foo"); + - плохая идея. Предположим, вы знаете, что ссылка на Window действительна. Предположим, вы вы знаете, что функция window.titlebar() возвратит ссылку на Titlebar, так как объект Window реализован верно. Однако этот код остаётся небезопасным. + +Что может случится, когда сервер, содержащий объект Window, падает? Невзирая на то, как хорошо реализован объект Window, операция window.titlebar() вернёт вам нулевую ссылку. И затем вызов setTitle приводит к сбою. + +Итак, безопасный вариант может быть таким: + Titlebar titlebar = window.titlebar(); + if(!window.error()) + titlebar.setTitle("foo"); +. Добавьте подходящую обработку ошибок, если вам нужно. Если вы не доверяете реализации Window, используйте код + Titlebar titlebar = window.titlebar(); + if(!titlebar.isNull()) + titlebar.setTitle("foo"); +, который безопаснее. + + + +Имеются другие условия для сбоев, такие как нарушение сетевого соединения (предположим вы удалили кабель между сервером и клиентом, пока ваше приложение работает). Однако, такой эффект подобен сбою сервера. + +В целом, это ваш подход к тому, насколько строго вы пробуете отследить ошибки взаимодействия внутри вашего приложения. Можно следовать методу если сервер падает, нужно отлаживать сервер, пока он совсем не перестанет падать, который означает, что вам не нужно беспокоиться обо всех этих проблемах. + + + + +Подробности: Распределённый подсчёт ссылок + +Объект может существовать только, когда им владеет кто-то. Если это не так, то он немедленно прекращает существовать. Владелец указывается с помощью счётчика ссылок на объект, который увеличивается при вызове функции _copy() и уменьшается при вызове функции _release(). Как только счётчик ссылок установится в ноль, объект удаляется. + +Как вариант, удалённое (внешнее) использование устанавливается функцией _useRemote(), и аннулируется функцией _releaseRemote(). Эти функции ведут список серверов, из вызвавших (и поэтому владеющих объектами). Это используется в случае отключения сервера (например при его падении или сбое сети), для удаления оставшихся ссылок на объекты, с использованием функции _disconnectRemote(). + +Снова проблема. Рассмотрим возвращаемое значение. Обычно возвращаемое значение-объект не принадлежит вызывающей функцией. Оно, однако, также не принадлежит вызывающему объекту, до тех пор пока сообщение, содержащее объект, не будет получено. Итак, какое-то время объекты остаются беспризорными. + +Теперь, когда посылается объект, можно быть уверенным, что как только он будет получен, то его владельцем будет кто-нибудь снова, если только принимающий объект сам не успел уничтожиться. Тем не менее, это означает, что объект нужно поддерживать особо по крайней мере в течение его отправки, а возможно также и в течение приёма, чтобы он - объект - не исчез мгновенно. + +&MCOP; делает это с помощью меток объектов, которые находятся в процессе копирования. До начала копирования, вызывается функция _copyRemote. Это защищает объект от освобождения в течение 5 секунд. Когда принимающая сторона вызывает _useRemote(), метка снова сбрасывается. Итак все объекты, которые пересылаются, помечаются перед отправкой по сети. + +Если принимающая сторона принимает объект, который находится на том же сервере, то для этого, конечно же, не используется функция _useRemote(). Для специального случая существует функция _cancelCopyRemote() для удаления метки вручную. Имеются также способы удаления метки, основанные на таймере, но принимающая сторона в действительности может не получить объект (из-за падения сервера, сбоя сети). Тогда удаление меток выполняется с помощью специального класса ReferenceClean. + + + + + + +Элементы графического пользовательского интерфейса + +Элементы графического пользовательского интерфейса сейчас в стадии разработки. Эта глава описывает то, что будет воплощено, так что если вы разработчик, то сможете понять как &arts; будет работать с графическим пользовательским интерфейсом в будущем. Уже есть некоторый готовый код. + +Элементы графического интерфейса могут быть использованы для создания структур, взаимодействующих с пользователем. В простейшем случае пользователь мог бы непосредственно изменять некоторые параметры структуры (такие как уровень усиления, который используется в конце, перед воспроизводящим модулем). + +В более сложных настройках пользователь мог бы измененять параметры группы структур и/или ещё не работающих структур, таких как изменение группы ADSR активного инструмента &MIDI;, или установка имени файла для некоторых инструментов. + +Также пользователю мог бы понадобиться монитор состояния синтезатора. Может представить себе осциллограф, спектроанализатор, измеритель уровня громкости и другие устройства для экспериментирования, которые рисовали бы кривую передаточной функции выбранного фильтра. + +Наконец, элементы интерфейса должны уметь управлять всеми структурами, того что запущено внутри &arts;. Пользователь должны уметь устанавливать инструменты для каналов midi, запуская новые эффекты, конфигурируя основной микшер, который встроен в структуру &arts;, для усиления какого-либо канала и использования другой стратегии для эквалайзеров. + +Вы видите - элементы пользовательского графического интерфейса, должны воспроизвести все возможности виртуальной студии &arts; для пользователя. Конечно, они также должны элегантно взаимодействовать со входами midi (бегунки должны перемещаться, если они управляют входами &MIDI;, которые также изменяются как параметры), и возможно создавать события, предоставлять пользователю возможность записывать звук на секвенсер. + +Если говорить техническим языком, речь идёт о базовом классе на &IDL; для всех графических элементов (Arts::Widget), и наследовании из него (например Arts::Poti, Arts::Panel, Arts::Window, ...). + +Тогда можно было бы реализовать эти графические примитивы, используя инструментарий, к примеру &Qt; или Gtk. Наконец, эффекты должны строить свой интерфейс на базе существующих элементов. Скажем, эффект freeverb может построить свой интерфейс с помощью пяти Arts::Poti и одного Arts::Window. Итак, если есть реализация таких окон на &Qt;, то эффекты могут отображать себя, используя &Qt;. Если имеется реализация на Gtk, то также можно работать с Gtk (что должно более или менее выглядеть и работать схожим образом). + +Наконец, поскольку мы здесь используем &IDL;, &arts-builder; (или другой инструмент) может визуально встраивать элементы интерфейса или автоматически создавать их из подсказок для параметров, основываясь только на интерфейсах. Совсем несложно написать класс создания элементов интерфейса по их описанию, который использует описание &GUI; и создаёт живой объект элемент интерфейса. + +Опираясь на &IDL; и компонентную модель &arts;/&MCOP;, будет легко расширять объекты, которые могут быть использованы для построения пользовательского интерфейса, также как это сделано для добавления отдельных модулей, реализующих новые фильтры для &arts;. + + + + diff --git a/tde-i18n-ru/docs/kdemultimedia/artsbuilder/digitalaudio.docbook b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/digitalaudio.docbook new file mode 100644 index 00000000000..93998e657b5 --- /dev/null +++ b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/digitalaudio.docbook @@ -0,0 +1,16 @@ + + + +Введение в цифровое аудио + +оцифровка, фильтры, эффекты и т. д. + + + + + diff --git a/tde-i18n-ru/docs/kdemultimedia/artsbuilder/faq.docbook b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/faq.docbook new file mode 100644 index 00000000000..daca57d885a --- /dev/null +++ b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/faq.docbook @@ -0,0 +1,1296 @@ + + +Вопросы и ответы + +В этом разделы вы найдёте ответы на часто задаваемые вопросы об &arts;. + + +Общие вопросы + + + +Поддерживает ли &kde; мою звуковую карту? + + + +Для воспроизведения звуков &kde; использует &arts;, а &arts; - драйверы ядра &Linux;: OSS или ALSA (с эмуляцией OSS). Всё будет работать, если они поддерживают вашу звуковую карту и она правильно настроена (т.е. другие приложения &Linux; могут производить звуки). Однако, с конкретным оборудованием могут возникнуть проблемы, об этом можно прочитать в разделе о проблемах с оборудованием . +Кроме того, мы постоянно расширяем список поддерживаемых платформ. Это список для последней версии, если вашей там не оказалось, попробуйте портировать &arts; на нее. + + + + + +Ввод и вывод звука в &arts; +Комментарий + + + + + +paud +Поддержка AIX Personal Audio Device + + + +alsa +Драйверы ALSA-0.5 и ALSA-0.9 для Linux + + + +libaudioio +Поддержка библиотеки LibAudioIO для Solaris + + + +nas +Поддержка звукового сервера NAS, используется для X-терминалов с NAS + + + +null +Нулевое аудиоустройство, стирает данные о звуке + + + +oss +Поддержка OSS (Open Sound System), работает под Linux, различными BSD и другими платформами с установленными драйверами OSS + + + +toss +Расширенная поддержка OSS, исполльзуется тогда, когда стандартная система не работает. + + + +sgi +Поддержка SGI Direct Media для IRIX + + + +sun +Поддержка Solaris + + + + + + + + + + +&artsd; не может воспроизводить файлы wav! + + + +Проверьте, собрано ли приложение &artsd; с поддержкой libaudiofile (ldd artsd). Если нет, скачайте пакет kdesupport и скомпилируйте всё ещё раз. Будет работать. + + + + + +Я могу слышать звук только когда вхожу в систему как пользователь root, у остальных звука нет! + + + +На то, могут ли пользователи включать звук, влияют права в файле /dev/dsp. Чтобы дать права всем пользователям , сделайте следущее: + + + +Войдите в систему как пользователь root. + + + +Откройте окно &konqueror;. + + + +Перейдите в каталог /dev. + + + +Нажмите правую кнопку мыши на файле dsp и откройте свойства. + + + +Откройте вкладку Права. + + + +Выделите Чтение и Запись во всех строках. + + + +Нажмите кнопку OK. + + + +Или вы можете открыть окно терминала и набрать команду chmod /dev/dsp. + +Для ограничения прав доступа конкретных пользователей используйте права групп. В некоторых дистрибутивах &Linux;, к примеру, в Debian/Potato, право доступа к /dev/dsp имеет группа audio, вам остаётся только добавить в эту группу пользователей. + + + + + +Это помогло для &artsd;, а что делать с &kmix;, &kmid;, &kscd; и т. д.? + + + +Есть и другие устройства для воспроизведения звука, к которым обращаются мультимедиа-приложения. Настраивать их можно так же, т. е. давать право доступа всем пользователям или группе. Этот список может быть и неполным (к тому же, есть устройства вроде midi0, midi1, ...: здесь перечислены только имена с 0). + + + + +/dev/admmidi0 + + + + +/dev/adsp0 + + + + +/dev/amidi0 + + + + +/dev/amixer0 + + + + +/dev/audio + + + + +/dev/audio0 + + + + +/dev/cdrom + + + + +/dev/dmfm0 + + + + +/dev/dmmidi0 + + + + +/dev/dsp + + + + +/dev/dsp0 + + + + +/dev/midi0 + + + + +/dev/midi0 + + + + +/dev/midi00 + + + + +/dev/midi00 + + + + +/dev/mixer + + + + +/dev/mixer0 + + + + +/dev/mpu401data + + + + +/dev/mpu401stat + + + + +/dev/music + + + + +/dev/rmidi0 + + + + +/dev/rtc + + + + +/dev/sequencer + + + + +/dev/smpte0 + + + + +/dev/sndstat + + + + + + + + +Что делать, если artsd не запускается или работает с ошибками? + + + +Прежде всего, попробуйте установить параметры по умолчанию в &kcontrol; (или, если вы начинаете работу в ручном режиме, не задавайте дополнительных параметров, кроме 10 4096 для задержки). Наиболее высокая вероятность ошибки в двустороннем режиме, поэтому постарайтесь его отключить. + +Хороший способ понять, почему &artsd; не запускается (или работает с ошибками) - это запустить его вручную. Откройте окно &konsole; и сделайте следущее: + +% artsd 10 4096 + +Вы можете добавить параметр , который выведет больше информации о том, что происходит: +% artsd 10 4096 + +Вы, возможно, получите объяснение того, почему &artsd; не запускается. Или, если во время работы возникают ошибки, вы увидите, где они. Если хотите сообщить об ошибке, вложите лог с gdb и/или strace. + + + + + +Могу ли я переместить &artsd; (перенести скомпилированные файлы в другой каталог)? + + + +Вы не сможете переместить &arts; без проблем. Дело в том, что информация о расположении скомпилированного &artsd; хранится в &artswrapper; (это необходимо для обеспечения безопасности). Однако вы можете заставить перемещённый &artsd; хотя бы находить компоненты, для этого используйте файл .mcoprc (TraderPath/ExtensionPath entries). Подробности - в главе о файле .mcoprc. + + + + + +Могу ли я скомпилировать &arts; gcc-3.0? + + + +Если коротко, нет. скомпилированный gcc-3.0 &arts; не будет работать. + +В официальной версии содержатся две ошибки, влияющие на &arts;. Первая - gcc-3.0 bug c++/2733 относительно безобидна (и должна справляться с проблемами инструкций ассемблера). Она прерывает компиляцию convert.cc и исправлена в gcc-3.0 CVS. Ее не должно быть в gcc-3.0.1 и выше. Также была доработана CVS-версия KDE/aRts. +Вторая - gcc-3.0 bug, c++/3145 (генерация неправильного кода для некоторых случаев множественного виртуального наследования) гораздо важнее. Такие приложения, как &artsd;, не будут запускаться после компиляции с gcc-3.0. Даже если в gcc-3.0 что-то исправили за время написания этого FAQ, &artsd; всё равно очень часто и непредсказуемо прекращает работу. + + + + +Какие приложения работают с &arts;? + + + +Вообще, все приложения &kde; работают с &arts;: + + +&noatun; +&arts-builder; +&aktion; +&kmid; +&kmidi; +&kmix; +&kscd; +такие игры &kde;, как &kpoker; и &ktuberling; + + +Некоторые приложения, пока не включённые в &kde; (к примеру, в kdenonbeta), всё же поддерживают &arts;: + + +&brahms; +Kaboodle +Kdao + + +С &arts; работают и следущие приложения (не для &kde;): + + +xmms (с модулем &arts;) +Real Networks RealPlayer 8.0 (работает с &artsdsp;, полная поддержка &arts; в разработке) + + +Следущие приложения не работают с &arts;: + + +нет + + +См. также ответы на вопросы о приложениях не для &arts;. + +Этот раздел ещё не закончен. Если вы знаете, какие приложения работают (или не работают) с &arts;, напишите автору, чтобы дополнить списки. + + + + + + +Приложения не для &arts; + + + +Как только запускается &kde;, ни одно приложение не может получить доступ к звуковой карте! + + +Так как звуковой сервер &arts; запускается вместе с &kde;, он использует звуковую карту. Если сервер бездействует 60 секунд, он автоматически прекращает работу и освобождает устройство. + + + + + +Вы сказали, что сервер ждёт 60 секунд, а у меня не так! + + +Если вы запускаете artsd с панели управления KDE время ожидания по умолчанию будет 60 секунд. Если же из командной строки, нужно указывать его с помощью параметра -s. +При использовании двустороннего режима сервер не отключается. Выключите его в &kcontrol;. Это вообще хорошая мысль, если вы используете &arts; только для прослушивания музыки, а не для записи. + + + + + +Могу ли я запускать старые приложения, не поддерживающие &arts;? + + + +Запускайте их с помощью &artsdsp;. К примеру, если обычно вы запускаете их так: + +% mpg123 + +теперь набирайте следущее: + +% artsdsp + +Звуковой выход будет перенаправляться в &arts;. Так вы не внесёте каких-либо изменений в ваши приложения. Вообще говоря, это уловка, и некоторые приложения могут не работать, или не будут использоваться все возможности звуковой карты. + + + + + +Я не могу запустить &artsdsp; никаким приложением, всё время выскакивают ошибки! + + +Вам нужна последняя версия библиотеки glibc; &artsdsp; не работает на более ранних дистрибутивах &Linux;. К примеру, в Debian 2.1 (основанный на glibc 2.0) он не работает, а в Debian 2.2 (основанный на glibc 2.1.3) работает. + + + + + +Есть ли какие-нибудь теоретические ограничения работы некоторых приложений с &artsdsp;? + + +Нет. Использование &artsdsp; может вылиться в большую задержку и более активное использовании процессора, чем при использовании &arts; API. Если всё-таки какое-то приложение не работает, это ошибка в &artsdsp;. Техника, применяемая в &artsdsp;, если она правильно реализована, должна позволять каждому приложению работать (включая такие объёмные приложения, как Quake 3). + + + + + +Что мне делать, если приложение не работает с &artsdsp;? + + +Вы можете подождать, пока отключится &artsd;, или отключить его самостоятельно. Для этого наберите в командной строке artsshell . Если в данный момент не работают никакие приложения &arts;, сервер отключится (и вы не сможете их запустить). + +Если сервер занят, попробуйте грубый, но эффективный метод: + + +% killall ; killall +Теперь запустите своё приложение. +% kcminit + + +Работающие приложения &arts; завершатся с ошибками, если вы отключите сервер. + + + + +Что насчет приложений, написанных под &kde; 1.x? + + +Если вы работаете с приложениями &kde; 1.x, которые воспроизводят звук через звуковой сервер &kde; 1, запустите kaudioserver. Это делается так же, как и для не-&arts; приложений. + +% artsdsp + + +Вам нужно установить kaudioserver (взятый из того же источника, что и ваши приложения для &kde; 1.x), он принадлежит &kde; 1.x, а не &kde; 2. + + + + + +Как насчёт приложений, использующих облегчённый звуковой сервис ESD? + + +Выход такой же, как и с приложениями kaudioserver. Вам нужно запустить сервер esd (это можно сделать с помощью &artsdsp;), тогда все приложения, поддерживающие ESD, будут работать: +% artsdsp + +Свежие версии aRts ( +>= 1.2.0) могут также работать с ESD (enlightened sound daemon). Укажите в командной строке параметр -a, например: +% artsd + +для глобальной поддержки ESD в KDE, настройте artsd на работу с esd в разделе Центра управления Звук -> Звуковой сервер -> Ввод-вывод звука. + + + + + + +Задержка + + + +Во время прослушивания иногда слышны короткие паузы. Это ошибка? + + +Скорее всего, это не ошибка, но паузы говорят о том, что ядро &Linux; не справляется с работой в режиме реального времени. Могут возникнуть ситуации, когда &arts; не сможет продолжать воспроизведение. Вы, однако, можете дать права реального времени (в &kcontrol;) и уменьшить задержку (250ms или не важно), чтобы улучшить ситуацию. + + + + + +Какой эффект у параметра времени ответа? + + +Статья помощи по этому параметру в &kcontrol;, возможно, введёт вас в заблуждение. Чем меньше значение, тем меньше времени требуется &arts;, чтобы ответить на внешние события (т.е. время после закрытия окна и до воспроизведения звука), тем больше требуется ресурсов процессора и тем больше вероятность выпаданий. + + + + + +Есть ли ещё какие-нибудь способы убрать паузы? + + +Если вы пользуетесь драйвером IDE, напишите команду hdparm для переключения IDE в режим DMA. Это работает не для всех устройств и, возможно, будет трудно вернуться в начальное сотояние или, в очень редких случаях, будут потеряны данные. Чтобы узнать подробности, прочтите документацию по команде hdparm. У меня всё получилось с командой: + +% hdparm /dev/hda + + +Вам нужно будет проделывать это при каждом запуске системы. Возможно, вы захотите добавить её в сценарий запуска системы (это зависит от дистрибутива, в Debian &Linux; он обычно находится в /etc/rc.boot). + + + + + +Приоритет реального времени на меня совсем не влияет? + + +Убедитесь в том, что artswrapper действительно установлен suid root, как это должно быть. Во многих дистрибутивах (SuSE7.x, к примеру) это не делается. Проверить это можно так: ls -l $(which artswrapper). Хорошо: +% ls $(which artswrapper) +-rwsr-xr-x 1 root root 4556 Sep 24 18:05 /opt/kde2/bin/artswrapper + Плохо: +% ls $(which artswrapper) +-rwxr-xr-x 1 root root 4556 Sep 24 18:05 /opt/kde2/bin/artswrapper + Если у вас нет s, его можно получить с помощью: % chown $(which artswrapper) +% chmod $(which artswrapper) + + + +Если вы сделаете &artswrapper; SUID root, это, скорее всего, улучшит качество воспроизведения, удаляя паузы. Однако риск того, что ошибка в коде или злобный пользователь вызовут прерывание программы (или что-нибудь поломают), увеличится. К тому же, в машинах, на которых работают несколько пользователей, приоритет хорошего качества звука может привести к ухудшению работы компьютера, если кто-то будет пытаться его использовать продуктивно. + + + + + + + +Почему &artsd; использует так много процессорного времени? + + +Проверьте настройки времени ответа. Хотя текущая версия ещё не оптимизирована. Мы работаем над этим, но сказать, насколько быстрее будет &artsd;, не можем. + + + + + +Прозрачность сети + + + +Зачем нужна прозрачность сети? + + +Включите её в &kcontrol; настройках Звуковая подсистема (Обмениваться информацией о безопасности и идентификации через сервер X11 и Принимать сетевые запросы). Скопируйте .mcoprc на все машины, на которых сервер должен принимать запросы из сети. Зайдите в систему ещё раз. Убедитесь в том, что узлы обращаются друг к другу по имени (т.е. у них есть разрешимые имена или они находятся в /etc/hosts). + +Это всё, что надо сделать. Если всё-таки не работает, вот несколько замечаний. &arts; и &artsd; должны быть запущены только на узле со звуковой картой (где и будет воспроизводиться звук). Они могут запускаться при входе в &kde; (если вы это указали в &kcontrol;) или вручную: + +% artsd 5 8192 + + +Параметр нужен для разрешения сетевых запросов, тогда как остальные используются для настройки задержки. + +В файле .mcoprc должна содержаться запись: + +GlobalComm=Arts::X11GlobalComm + + +на всех машинах для поддержки работы в сети. Это включается при установке флажка Обмениваться информацией о безопасности и идентификации через сервер X11 на панели управления. + +Наконец, в любой версии &kde; серии 2.0.x есть ошибка, возникающая, если вы не указали имя домена. Клиенты &artsd; пытаются найти, куда можно подключиться, используя комбинацию имя узла.имя домена. Если имя домена пустое, они будут подключаться к имени узла. (заметьте, дополнительная точка). Добавление такой записи в /etc/hosts (т.е. orion., если имя узла orion) решит проблему. + + + + + + +Как мне настроить сети, если она не работает? + + +Если у вас есть исходный код &kde;, зайдите в kdelibs/arts/examples, и запустите make , чтобы скомпилировать некоторые программы, включая referenceinfo. После этого запустите + +% ./referenceinfo + + +Будут выведены имя узла и используемый &arts;. К примеру, tcp:orion:1698 значит, что любой клиент, пытающийся использовать прозрачность сети, должен знать, как подключиться к узлу orion. + + + + + + +Вопросы, связанные с аппаратным обеспечением + + + +С каким оборудованием artsd не работает? + + +Не все звуковые драйверы Linux хорошо работают с aRts в некоторых версиях ядра. Ознакомьтесь с этим списком, прежде чем сообщать об ошибке. Если же вы встретились с чем-либо, отсутствующим в списке, сразу же сообщите об этом. + + +Дравер и звуковая плата Linux +Не работает в +Работает в +Примечания + + + + + +Драйвер i810 (Intel 810 + AC97 Audio) +2.4.9 +2.4.18, 2.2.20, коммерческий драйвер oss, alsa-0.5.12a с эмуляцией OSS +драйвер вызывает перегрузку процессора (см. ниже) + + + +maestro 3/4 chipset +2.4.9 +? +драйвер иногда вызывает перегрузку процессора (см. ниже) + + + +драйверы aureal8820, aureal8830 с sourceforge +2.4.17 +? +Драйвер не проходит проверку или вызывает перегрузку процессора (см. ниже) + + + +Коммерческий драйвер OSS 3.9.4g с Aureal Vortex +? +? +системный сбой + + + +ymfpci +2.4.0, 2.4.12 +2.4.17 +Драйвер не проходит проверку (см. ниже) + + + + + + + + + + + + + + + +Почему возникают проблемы с оборудованием и как мне о них узнать? + + +Обычная поблема - драйвер не предоставляет достаточно информации aRts (или даёт неправильную) о том, когда нужно писать звуковые данные. Большинство драйверов OSS предоставляют правильные данные, но не все. +Вы, возможно, заметили, что не всем приложениям (как xmms) нужна эта информация, поэтому они работают нормально даже с вашей звуковой картой. Но для &arts; она необходима, поэтому artsd выполняется с ошибками. Это ошибка в драйвере, а не в &arts;. +Есть два варианта поведения artsd при запуске с некорректным драйвером. Во-первых, он постоянно пытается передать новые данные, но безуспешно. В результате потребляются все ресурсы процессора, выводится отчёт о перегрузке cpu, и приложение закрывается. Другое дело, когда artsd получает неправильную информацию о том, какой объем данных нужно записать. Тогда он прекращает работать на примерно такой проверке: artsd: audiosubsys.cc:458: void Arts::AudioSubSystem::handleIO(int): +Assertion `len == can_write'. +Aborted + + + + + + + +Что не так с драйвером, если выдаётся ошибка о пререгрузке процессора? + + +Обычно artsd узнаёт, когда надо записывать новые данные, с помощью функции select(). Потом используется ioctl(...GETOSPACE...) для поиска объема данных для записи. И, наконец, данные записываются. +Проблемы возникают тогда, когда artsd постоянно работает или объём данных для записи слишком мал. В документации OSS указано, то select() только запускает процесс, если есть хоть что-то для записи, к примеру, один байт. Тогда запись данных продолжается небольшими частями, что очень трудоёмко, и в результате процессор перегружается. +Чтобы такого не происходило, драйвер должен вызывать artsd только тогда, когда есть целый фрагмент информации для записи. + + + + + +Что не так с драйвером, если мне выдаётся сообщение об ошибке при проверке? + + +Обычно artsd узнаёт, когда надо записывать новые данные, с помощью функции select(). Потом используется ioctl(...GETOSPACE...) для поиска объема данных для записи. И, наконец, данные записываются. +Если artsd не может записать тот объём информации, которы указан в ioctl, будет выдаваться эта ошибка. Чтобы исправить ситуацию, драйвер должен предоставлять правильную информацию. + + + + + +Другие проблемы + + + +Я не могу работать с &arts-builder;. Во время работы модуля возникают ошибки! + + +Обычно так получается при использовании старых структур или модулей, которые не поддерживаются версией &kde; 2. К сожалению, информация об &arts;-0.3.4.1 устарела. Самой распространённой ошибкой является выполнение структуры &arts-builder;, приводящей к ошибке [artsd] Synth_PLAY: audio subsystem is already used. + +Следует использовать модуль Synth_AMAN_PLAY вместо Synth_PLAY. Прочитайте файл помощи &arts-builder; (нажмите F1 в &arts-builder;). + +В последних версиях &arts-builder; (&kde; 2.1 beta 1 и позднее) есть примеры, которые вы можете использовать. + + + + + + diff --git a/tde-i18n-ru/docs/kdemultimedia/artsbuilder/future.docbook b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/future.docbook new file mode 100644 index 00000000000..6d94bf0535e --- /dev/null +++ b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/future.docbook @@ -0,0 +1,399 @@ + + + +Дальнейшая работа + +В этом разделе описывается то, над чем мы сейчас работаем. А так как разработка ведётся быстро, информация может быть устаревшей. Чтобы узнать о последних планах, проверяйте список файла TODO и список рассылки. Не забывайте о том, что вы тоже можете принять участие в разработке. + +Это черновик, в котором описано, как новые технологии внедряются в &arts;. Вот какие темы здесь упомянуты: + + +Как работает интерфейс. +Кодеки - декодирование потоков mp3 или wav для того, чтобы использовать их как данные. +Видео. +Многопоточность. +Синхронизация. +Динамическое расширение. +Динамическое построение. +&GUI; +&MIDI; + + +Над этим мы сейчас работаем. Если вы хотите увидеть технологию в &arts;, начните с этого. Вы получите общее представление о решающихся проблемах. Вы можете и исправить эту информацию. + +То, что будет использоваться совместно с &arts; (поэтому координируйте свои действия, пожалуйста): + + + +KPhone (передача речи по протоколу IP) + + + +&noatun; (видео- и аудиопроигрыватель) + + + +&artscontrol; (программа управления звуковым сервером, для осциллографов) + + + +Brahms (музыкальный синтезатор) + + + +Kaiman (&kde;2 медиа-проигрыватель, совместим с kmedia2) + + + +mpglib/kmpg (mpg - технология воспроизведения аудио и видео) + + + +SDL (обращение к мульитмедиа-данным напрямую, для игр, ещё не реализовано) + + + +electric ears (автор со мной связался - статус неизвестен) + + + + +Как работает интерфейс + + + +Интерфейсы &MCOP; - основа идеи &arts;. Они эквивалентны классам в C++. Когда возможно, ориентируйтесь на интерфейсы. Они состоят из четырёх частей: + + +Синхронные потоки +Асинхронные потоки +Методы +Атрибуты + + +Их можно смешивать как угодно. Новые технологии должны быть определены в терминах интерфейсов. Прочитайте разделы о синхронных и асинхронных потоках, а также об интерфейсах KMedia2, которые являются замечательными примерами работы интерфейсов. + +Интерфейсы определены в коде .idl и компилируются mcopidl. Вы создаёте производный класс Interfacename_impl и используете функцию REGISTER_IMPLEMENTATION(Interfacename_impl), чтобы встроить ваши объктные реализации в систему объектов &MCOP;. + + + + +Кодеки - Декодирование данных + +Интерфейсы kmedia2 позволяют игнорировать файлы wav, mp3 и всё, что состоит из потоков данных. Вместо этого вы описываете методы их воспроизведения. + +Поэтому вы можете написать программу загрузки файлов wave таким образом, чтобы она пригрывала их (как PlayObject), но никто другой, кроме вас, не сможет использовать код. + +Альтернативой являются асинхронные потоки. Вы определяете интерфейс, который позволяет передавать блоки данных. В &MCOP; это выглядит так: + +interface Codec { + in async byte stream indata; + out async byte stream outdata; +}; + + + +Конечно, кодеки могут снабжаться атрибутами для получения дополнительной информации, к примеру, о формате. + +interface ByteAudioCodec { + in async byte stream indata; + out async byte stream outdata; + readonly attribute samplingRate, bits, channels; +}; + + +Этот ByteAudioCodec, например, может быть подключен к объекту ByteStreamToAudio для создания настоящего аудио потока. + +Конечно, в других типах кодеков видео воспроизводится напрямую, например + +interface VideoCodec { + in async byte stream indata; + out video stream outdata; /* note: видеопотоки ещё не используются */ +}; + + +Кодек не должен разрабатываться по принципу вы знаете, как воспроизводить, а я - нет, как, например, WavPlayObject. И всё же кто-то должен сидеть и тестировать его до завершения API. + + + + +Видео + +Я хочу сделать видео асинхронными потоками некоторых встроенных типов данных &MCOP;, содержащих изображения. Сейчас идёт работа над этим типом данных. Тогдга модули, работающие с видео изображениями могут быть подключены так же, как и модули, работающие со звуком. + +Есть ещё несколько вещей, которые обязательно нужно иметь в виду: + + + +Цветовые пространства RGB и YUV + + +Формат должен каким-то образом добавляться к потоку. + + +Очень важна синхронизация. + + + +Также я хочу оставить возможность переопределить класс VideoFrame, чтобы он мог хранить данные в разделённой памяти. Тогда будут возможны видео потоки между различными процессами без особых проблем. + +Как обычно, вся обработка видео, от декодирования до отображения на экране, должна производиться в одном процессе. + +Я сделал прототип реализации видеопотоков, который вы можете скачать отсюда. Его нужно будет интегрировать в &MCOP; после тестирования. + +Компонент визуализации должен поддерживать XMITSHM (с RGB и YUV), Мартин Вогт (Martin Vogt) сказал, что работает над этим. + + + + +Многопоточность + +Сейчас &MCOP; не поддерживает работу с несколькими потоками обработки данных. Возможно, мы не сможем избежать многопоточности при работе с видео. Но есть вещи, с которыми нужно обращаться аккуратно: + + + +SmartWrappers - их использование с многопоточностью небезопасно из-за незащищенного механизма подсчета ссылок и т. д. + + +Диспетчер ввода-вывода тоже небезопасен. + + + +Однако я мечтаю сделать эти модули безопасными для синхронных и асинхронных потоков. Тогда можно будет посылать сигнал на несколько процессоров. Кроме того, это можно использовать при воспроизведении аудио на многопроцессорных системах. + +Как это будет работать: + + + + +Система управления потоками решает, что должны обрабатывать модули (и какие), т. е.: + + видеокадры (метод process_indata) + синхронные аудиопотоки (calculateBlock) + другие асинхронные потоки, в основном байтовые + + + +Модули могут обрабатывать эти вещи и в собственных потоках. В аудио можно использовать потоки повторно (т. е. использование 4 потоков на 4 процессорах, даже если запущено 100 модулей). Для видео и декомпрессии будет удобно использование блокирующего средства во внутреннем потоке, которое синхронизировано с остальной частью &MCOP; системой управления потоками. + + + +Модули могут не использовать средства &MCOP; (такие, как удалённый вызов) во время работы в потоке. + + + + + + +Синхронизация + +Видео и &MIDI; (и аудио) могут требовать синхронизации. Это могут быть маркеры времени. Я хочу использовать их в асинхронным потокам, добавляя эти маркеры к каждому пакету. Если вы посылаете два видеокадра, сделайте их пвкетами (всё равно они большие), чтобы у вас были два разных маркера. + +Т. к. аудио - синхронный поток, временные метки здесь тоже подразумеваются. + + + + +Динамическое построение + +Нужно сделать так, чтобы можно было сказать: эффект FX состоит из этих простых модулей. FX должен выглядеть как обычный модуль &MCOP;, но состоять из других модулей. + +Это необходимо для &arts-builder;. + + + + +&GUI; + +Все компоненты &GUI; будут модулями &MCOP;. У них должны быть такие атрибуты, как размер, метка, цвет, ... &arts-builder; должен уметь составлять их визуально. + +Должна быть возможность сохранять графический интерфейс, сохраняя атрибуты. + + + + +&MIDI; + +&MIDI; будет реализован с помощью асинхронных потоков. Есть два варианта: использовать обычные структуры &MCOP; для описания типа или вводить новые стандартные типы. + +Думаю, обычных структур будет достаточно: + +struct MidiEvent { + byte b1,b2,b3; + sequence<byte> sysex; +} + + +Асинхронные потоки должны поддерживать обычные типы потоков. + + + + + + diff --git a/tde-i18n-ru/docs/kdemultimedia/artsbuilder/glossary.docbook b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/glossary.docbook new file mode 100644 index 00000000000..45250e529aa --- /dev/null +++ b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/glossary.docbook @@ -0,0 +1,173 @@ + + + + + +ALSA + +Advanced &Linux; Sound Architecture (современная звуковая архитектура &Linux;), драйвер звуковой карты для &Linux;, ещё не включенный в исходный код стандартного ядра. + + + + +&arts; + +Analog Real-Time Synthesizer (аналоговый синтезатор, работающий в реального времени), название мультимедиа-архитектуры/библиотеки/набора инструментов, использующихся в проекте &kde;. + + + + +BSD + +Berkeley Software Distribution (дистрибутив ПО Беркли), здесь относится к нескольким свободным &UNIX;-совместимым ОС, созданным на основе BSD &UNIX;. + + + + +CORBA + +Common Object Request Broker Architecture (обобщённая архитектура посредника объектных запросов), стандартна для реализации объектно-ориентированного удалённого выполнения. + + + + +CVS + +Concurrent Versions System (система управления параллельными версиями), система управления исходными кодами ПО различных версий, использующаяся во многих проектах, включая &kde; и &arts;. + + + + +FFT + +Fast Fourier Transform (быстрое преобразование Фурье), алгоритм для перевода временных данных в домен частот, обычно используется при обработке сигналов. + + + + +Двусторонний режим работы + +Возможность звуковой карты одновременно записывать и воспроизводить аудио. + + + + +GPL + +GNU General Public License (Стандартная общественная лицензия GNU), лицензия для ПО, разработанная Free Software Foundation с целью определить условия выпуска свободного ПО. + + + + +&GUI; + +Graphical User Interface (графический интерфейс пользователя). + + + + +IDL + +Interface Definition Language (язык определения интерфейсов), формат описания интерфейсов (методов и данных), не зависящий от языка программирования. + + + + +&kde; + +K Desktop Environment (графическая среда K), графическая среда для &UNIX;-совместимых систем и одноименный проект по разработке этой среды. + + + + +LGPL + +GNU Lesser General Public License (Стандартная общественная лицензия ограниченного применения GNU), лицензия для ПО, разработанная Free Software Foundation с целью определить условия выпуска свободного ПО, эта лицензия менее строга, чем GPL и обычно используется при распространении библиотек. + + + + +&MCOP; + +Multimedia COmmunication Protocol (протокол передачи мультимедиа), протокол передачи данных между модулями &arts;, похожий на CORBA, но проще и оптимизированный для работы с мультимедиа. + + + + +&MIDI; + +Musical Instrument Digital Interface (цифровой интерфейс музыкальных инструментов), стандартный протокол для обмена данными между электронными музыкальными инструментами, используется для обозначения формата файлов, хранящих команды &MIDI;. + + + + +OSS + +Open Sound System (открытая звуковая система), драйверы для звуковых карт, включённые в ядро &Linux; (иногда называются OSS/Free), так же называется и их коммерческая версия от 4Front Technologies. + + + + diff --git a/tde-i18n-ru/docs/kdemultimedia/artsbuilder/gui.docbook b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/gui.docbook new file mode 100644 index 00000000000..b769c161b6b --- /dev/null +++ b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/gui.docbook @@ -0,0 +1,29 @@ + + + diff --git a/tde-i18n-ru/docs/kdemultimedia/artsbuilder/helping.docbook b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/helping.docbook new file mode 100644 index 00000000000..3b9375b5a73 --- /dev/null +++ b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/helping.docbook @@ -0,0 +1,239 @@ + + + +Сотрудничество с &arts; + + +Как вы можете помочь + +Помощь разработчикам заключается в адаптации существующих мультимедиа-приложений для работы с &arts;, создании новых приложений и расширении возможностей &arts;. Однако вам совсем необязательно быть разработчиком, чтобы помочь &arts;. Нам нужна помощь в тестировании (и написании отчётов об ошибках), переводе текстов и документации на различные языки, создании дизайна (особенно для модулей artsbuilder), музыканты могут написать примеры для модулей &arts;, а писатели - документацию. + + + +Списки рассылок + +Большинство дискуссий разработчиков &arts; ведутся в двух рассылках. В этой обсуждаются новые функции, делятся мыслями и просят о помощи, если возникли проблемы. + +Рассылка &kde; Multimedia предназначена для обсуждения общих мультимедиа-приложений для &kde;, в том числе и &arts;, наряду с &noatun; и &aktion;. Вы можете подписаться на нее с сайта http://www.kde.org/mailinglists.html или послать сообщение с темой subscribe ваш-email-адрес на kde-multimedia-request@kde.org. Архив рассылки можно найти по адресу http://lists.kde.org. + +Рассылка для обсуждения вопросов об &arts;, в том числе и об использовании &arts; не в &kde;. Чтобы подписаться, пошлите сообщение с текстомsubscribe ваш-email-адрес на arts-request@space.twc.de. Архив рассылки можно найти по адресу http://space.twc.de/~stefan/arts-archive. + + + + +Стандарты кодирования + +Чтобы можно было без лишних проблем читать разные исходные файлы, в них нужно использовать один стиль написания кода. Если вы просто пишете модуль, пожалуйста, постарайтесь писать код соответственно (или отформатируйте его), тогда разные люди смогут его дополнять или копировать его части. + + + +Именование функций-членов + +Стиль &Qt;/&Java;. То есть каждое новое слово должно начинаться с заглавной буквы, но первое слово начинается со строчной, подчеркивания между словами не используются. +Это значит, к примеру: + +createStructureDesc() + updateWidget(); + start(); + + + + + +Члены класса + +Имена членов классов пишутся со строчной буквы: menubar, button. + +Если необходима функция доступа, лучше всего её писать в соответствии с &MCOP;, т. е. если есть функция-член foo типа long, которая не должна быть всегда видимой, вы пишете: + +foo(long new_value); + long foo(); + +функции получения и задания какого-либо значения. В этом случае, значение foo должно храниться в _foo. + + + + +Имена классов + +В именах классов все слова должны начинаться с заглавной буквы, например, ModuleView, SynthModule. Все классы должны принадлежать библиотекам и использовать пространство имён &arts;, к примеру, Arts::Soundserver. +Классы &MCOP; должны называться так:Class_impl, например, SoundServer_impl. + + + + +Параметры + +Параметры всегда пишутся строчными буквами. + + + + +Локальные переменные + +Локальные переменные всегда пишутся строчными буквами и могут называться i, p, x и т. д., если это не делает код трудночитаемым. + + + + +Размер табуляции (отступы) + +Один уровень отступа равен 4 пробелам. + + + + +Пробелы в выражениях + +Обычно вам не нужно использовать пробелы в выражениях. Хотя вы можете их вставлять между операторами и операндами. Однако, если вы набрали пробел перед оператором (например, +), нужно поставить его и после оператора. Единственное исключение - выражения с ",", в которых пробел нужно ставить после "," или вообще его опустить. +Вот примеры правильного использования пробелов: +{ + int a,b; + int c, d, e; + int f = 4; + + a=b=c=d+e+f; + a = b = c = d + e + f; + + if(a == 4) { + a = b = c = (d+e)/2; + } + + while(b<3) + c--; + + arts_debug("%d\n", c); +} + +А вот пример того, как не нужно ставить пробелы. В вызовах функций, после if, while, for, switch и т. д. пробелы не пишутся. +{ + // ПЛОХО: в списке пробел ставится только после "," + int a , b , c , d , e , f; + + // ПЛОХО: несимметричное использование пробела в операторе = + a= 5; + + // ПЛОХО: if считается функцией, пробел не ставится + if (a == 5) { + } + + // ПЛОХО: не пишите пробел после while + while (a--) + b++; + + // ПЛОХО: после имён функций не надо ставить пробелы + arts_debug ("%d\n", c); + + // ПЛОХО: не являются именами членов + Arts::Object o = Arts::Object::null (); +} + + + + + + +Имена сходных файлов + +В названиях исходных файлов не должно быть заглавных букв. Они должны называться по имени реализуемого класса, если в них описывается только он один. Если файл содержит код, не зависящий от &Qt;/&GUI;, его расширением должно быть .cc, иначе - .cpp. Файлы, в которых реализуются интерфейсы, должны называться так: foo_impl, если именем реализуемого интерфейса является Foo. + +Имена файлов &IDL; должны в достаточной мере описывать содержимое этих файлов и также не должны содержать заглавных букв. Не стоит называть файл по имени класса, так как информация о трейдере и типе в .mcopclass может перемешаться. + + + + + + diff --git a/tde-i18n-ru/docs/kdemultimedia/artsbuilder/index.cache.bz2 b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/index.cache.bz2 new file mode 100644 index 00000000000..18478e26226 Binary files /dev/null and b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/index.cache.bz2 differ diff --git a/tde-i18n-ru/docs/kdemultimedia/artsbuilder/index.docbook b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/index.docbook new file mode 100644 index 00000000000..4c3bfc822c8 --- /dev/null +++ b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/index.docbook @@ -0,0 +1,417 @@ + + + + + + + + + + + + + + + + + + + + MCOP"> + DCOP"> + MIDI"> + mcopidl"> + IDL"> + + +]> + + + +Справочное руководство по &arts;. + + +Stefan Westerfeld
stefan@space.twc.de
+
+
+ +Jeff Tranter
tranter@kde.org
+
+
+ +СергейПачков
spigel@mail.ru
Перевод на русский
+
+ + +1999-2001 +Stefan Westerfeld & Jeff Tranter + +&FDLNotice; + +2001-06-10 +1.00.09 + +Руководство описывает &arts;,- Аналоговый синтезатор в реальном времени + + + + +aRts +artsbuilder +синтезатор +мультимедиа +структура +музыка +звук +KDE + +
+ + +Введение + + +Что такое &arts;? + +Аналоговый синтезатор в реальном времени, или &arts;, - это модульная система для синтезирования звука и музыки на цифровом компьютере. Используя небольшие блоки, называемые модулями, пользователь может просто строить различные инструменты аудио обработки. Модули обычно предоставляют такие функции, как генераторы звука, фильтры, аудио эффекты, микширование и воспроизведение цифрового аудио в различных форматах + +&artsd; - сервер, смешивающий звук из различных источников в реальном времени, благодаря чему сразу несколько программ могут иметь доступ к звуковой плате. + +При использовании &MCOP;, - мультимедийного протокола взаимодействия, мультимедиа программы могут быть сетевыми, защищенными и кросс-платформенными с интерфейсами, описанными на независимом языке &IDL;. Поддержка также распространяется для не &arts; - программ. Как компонент ядра &kde; 2, &arts; представляет базис мультимедийной архитектуры &kde; и в будущем будет поддерживать больше типов мультимедиа, включая и видео. Подобно &kde;, &arts; может работать в различных операционных системах, например &Linux; и вариантах BSD. Также &arts; можно использовать независимо от &kde;. + + + + +Использование данного руководства + +Руководство служит для предоставления всесторонней документации по &arts; для пользователей всех уровней подготовки. Если вы пользователь или разработчик мультимедиа программ, вы можете использовать разные части документации. + +Рекомендуется сначала прочитать Получение и сборка &arts;, если вам нужно установить и запустить &arts;. Если вы уже имеете рабочую систему, например установленную вместе с дистрибутивом операционной системы, можете пропустить эту часть. + +Вам следовало бы прочесть &arts; инструменты, в особенности &artsd;, &artscontrol;, &artsshell;, и &artsdsp;. Это может помочь более эффективно использовать &arts;. + +Если вам интересно, что можно сделать при помощи &arts;, то прочитайте раздел &arts-builder; и обратитесь к учебному руководству. Вы сможете оценить всю мощь &arts; и то, что предоставляемые модули могут использоваться и не программистами. + +Если вы хотите узнать больше об внутреннем устройстве &arts;, также для разработки мультимедиа программ или расширения самого &arts;, прочтите что-нибудь или всё из &arts; в деталях. Это даст вам понимание всех концепций, предпосылок разработки &arts;. + +Если вам интересна совместимость &arts; с MIDI, прочтите раздел о &MIDI;. + + + +Если вы желаете разрабатывать &arts;-программы, тогда в разделе Разработка &arts;-программ, вы сможете ознакомиться с различными APIs. + +Если вы хотите расширить &arts;, создав новые модули, прочитайте раздел &arts; модули + +Если вы хотите модифицировать существующее приложение для работы с &arts;, читайте Перенос программ в &arts;. + +Вы можете узнать о том, как внести вклад в проект &arts;, в статье Как помочь проекту &arts;, читайте об текущей разработке &arts; в статье Дальнейшая разработка. Ссылки на дополнительную информацию см. в разделе Ссылки. + +Руководство завершается несколькими дополнительными материалами, включающими Ответы на часто задаваемые вопросы, список разработчиков,сведения об авторских правах на &arts; и лицензировании, и некоторые вспомогательные материалы Цифровой звук и &MIDI;. Термины включены в Глоссарий. + + +Это руководство находится в разработке. Вы можете принять участие в написании части его. Если вы желаете это сделать, то сообщите Jeff Tranter tranter@kde.org или Stefan Westerfeld stefan@space.twc.de для избежания повторов. + + + + + +История + +В конце 1997 Stefan Westerfeld начал работать над модульной системой синтезирования звука в реальном времени. Первоначально код работал на PowerPC с &AIX;. Эта первая реализация была проста, но поддерживала полнофункциональную поточную систему, что позволило реализовать проигрывание MP3 файлов и каналы аудио потоков через модули эффектов. + + +Следующим шагом была реализация &GUI;, чтобы можно было управлять модулями в графическом интерфейсе. Stefan имел хороший опыт использования &kde;, который и был выбран в качестве инструмента разработки &GUI;, (причем понятна была необходимость создания также и GNOME/Gtk+ версии). Поэтому в дальнейшем разработка велась на &Linux; как основной платформе. Первоначально названный ksynth, проект был переименован в &arts; и темп разработки увеличился. Эта стадия проекта была завершена и включала протокол, основанный на CORBA, множество модулей, графический редактор модулей, C и C++ API, документацию, утилиты, список рассылки и веб-сервер с небольшой группой разработчиков. Проект прошёл большой путь после чуть более года разработки. + +Как только команда &kde; начала планировать &kde; 2.0, появилась необходимость в более мощной инфраструктуре для звука и других потоковых мультимедиа. Было решено использовать &arts; в качестве основы для мультимедийных приложений, это был хороший шаг в направлении испытанной архитектуры. Благодаря усилиям разработчиков в новой версии &arts; код CORBA был полностью заменен на совершенно новую подсистему &MCOP;, оптимизированную для мультимедиа. Версия 0.4 &arts; была включена в &kde; 2.0. + +Работа над &arts; продолжалась: улучшение производительности и добавление новой функциональности. Хотя &arts; - это компонент ядра &kde;, он может использоваться без &kde;, а также для программ далеко за пределами традиционного мультимедиа. Проект привлек интерес команды GNOME, тем самым открылась возможность, что когда нибудь он станет стандартом мультимедиа архитектуры для настольных систем &UNIX;. + + + + + +&tools; +&artsbuilder-doc; +&detail; +&arts-midi; +&gui; +&mcop-ref; +&apis; +&modules; +&porting; +&helping; +&future; +&references; +&arts-faq; + + + +&arts; Авторские права и лицензирование + +&arts; авторские права 1998-2001 Stefan Westerfeld stefan@space.twc.de + + Авторские права на документацию 1999-2001 Stefan Westerfeld stefan@space.twc.de и Jeff Tranter tranter@kde.org. +Перевод на русский - Сергей Пачков spigel@mail.ru +&underFDL; Все библиотеки в &arts; имеют лицензию GNU Lesser General Public license. Большинство основного кода &arts; находится в библиотеках, целиком включая MCOP и ArtsFlow. Это позволяет использовать библиотеки в не свободно распространяемых программах или в программах, не поддерживающих Open Source. + +Имеются несколько программ (таких как artsd), выпущенных под лицензией GNU General Public License. Поскольку легальность сборки GPL программ с &Qt; часто вызывает недопонимание, я также добавил подробные замечания, которые разрешают это, в добавление к GPL: это также разрешает сборку программ с библиотекой &Qt;. &Qt; как библиотека обычно сопровождает ядро операционной системы, так это или не так. + + + + +Установка &arts; + +Для использования &arts; вам, естественно, нужно уже установить и запустить его в вашей системе. Существует два способа, которые описываются в следующих разделах. + + +Установка из готового скомпилированного пакета + +Наиболее быстрый и простой путь получения работающего &arts; - это установка бинарного пакета для вашей системы. Самый последние дистрибутивы &Linux; имеют &kde;, и если это &kde; 2.0 или более поздний, то там есть и &arts;. Если &kde; нет на установочном диске (или другом носителе), то его можно скачать у производителя операционной системы. Иначе же его можно получить из других источников. Убедитесь, что вы используете пакет, совместимый с вашей операционной системой. + +По умолчанию &kde; содержит в себе звуковой сервер, и большинство программ использует его для воспроизведения звука. Если вы хотите полный набор мультимедиа инструментов и программ, то вам необходимо установить дополнительные пакеты. + +Неудобством использования бинарного пакета может быть то, что это не самая последняя версия &arts;. Это особенно вероятно, если пакет распространяется на компакт диске, темп разработки &arts; и &kde; такой, что выпуски на компакт дисках обычно за ним не успевают. Может также получиться, что если у вас нестандартная архитектура или дистрибутив операционной системы, то бинарные пакеты могут быть недоступны и вам нужно будет использовать второй метод. + + + + +Сборка из исходников + +Самым гибким способом собрать &arts; является компиляция из исходного кода. Это гарантирует получение версии, оптимально скомпилированной для вашей конфигурации системы и позволит вам собрать самую последнюю версию. + +Здесь вы можете выбрать из двух вариантов - вы можете установить последнюю стабильную версию, включенную в &kde; или вы самую последнюю версию (но возможно нестабильную) прямо из CVS архива проекта &kde;. Большинство пользователей, которые не разрабатывают программы для &arts;, используют стабильную версию. Вы можете получить ее с ftp://ftp.kde.org или с одного из зеркал. Если вы активно разрабатываете приложения для &arts;, вам лучше использовать CVS версию. Если вы хотите использовать aRts без KDE, можете скачать отдельный вариант с http://space.twc.de/~stefan/kde/arts-snapshot-doc.html. + +Заметьте, что если вы собираете из CVS, то некоторые компоненты &arts; (например, компоненты ядра, включая звуковой сервер) находятся в CVS модуле kdelibs, в то время как дополнительные компоненты (в том числе artsbuilder) находятся в модуле kdemultimedia/arts. В будущем это может изменится. Вы можете найти версию в модуле kmusic, но это уже старая (pre-&kde; 2.0) версия. + +Требования для сборки &arts; такие же, как и для сборки &kde;. Конфигурационный скрипт определит параметры вашей системы и проинформирует, если необходимые компоненты будут отсутствовать. Убедитесь, что у вас работает драйвер звуковой карты (один из OSS/Free драйверов в ядре операционной системы, OSS драйвер от 4Front Technologies, или ALSA драйвер с OSS эмуляцией). + +Подробнее о том, как получить и установить &kde; (включая &arts;), можно узнать в &kde; &FAQ;. + + + + + +&digitalaudio; +&midiintro; +&arts-glossary; + +
+ diff --git a/tde-i18n-ru/docs/kdemultimedia/artsbuilder/mcop.docbook b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/mcop.docbook new file mode 100644 index 00000000000..de98515a945 --- /dev/null +++ b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/mcop.docbook @@ -0,0 +1,1958 @@ + + + +&MCOP;: Потоки и объектные модели + + + +Описание + +&MCOP; используется в &arts; для: + + + +Связи между объектами. + + + +Прозрачности работы в сети. + + + +Описания интерфейсов объектов. + + + +Независимости от языка. + + + +Важным составляющим &MCOP; является язык описания интерфейса &IDL;, с помощью которого описано большинство интерфейсов &arts; и API. + +Чтобы использовать &IDL;, интерфейсы из C++ компилируются &IDL;-компилятором вместе с кодом C++. При реализации интерфейса вы наследуете от базового класса &IDL;, созданного компилятором. При использовании интерфейсов это можно сделать с помощью надстраивания функциональности. Таким образом, &MCOP; может пользоваться своим протоколом, даже если объект нелокален. Так вы получаете прозраночть работы в сети. + +В этой главе описываются основные черты объектной модели, получаемой при использовании &MCOP;, сам протокол и его использование в C++ (связывание языков) и т.д. + + + + + +Интерфейсы и &IDL; + +Большинство сервисов &arts; (к примеру, модули и звуковой сервер) определены в терминах интерфейсов. А интерфейсы описаны в формате, не зависящем от языка: &IDL;. + +Таким образом, многие детали вроде формата потоков медиаданных, прозрачность сети и зависимости от языка программирования можно скрыть в описании интерфейса. Инструмент &mcopidl; преобразовывает определение интерфейса для конкретного языка программирования (сейчас поддерживается только C++). + +Инструмент генерирует каркасный класс с основными функциями. Ваши собственные классы будут от него наследовать. + +&IDL; использующийся в &arts; похож на язык, использующийся в CORBA and DCOM. + +Файлы &IDL; могут содержать: + + + +Директивы #include для других файлов &IDL;. + + + +Объявления перечисляемых типов и структур, как в C/C++. + + + +Объявления интерфейсов. + + + +Интерфейсы в &IDL; - это почти то же самое, что класс в C++ или структура в C, но с некоторыми ограничениями. Как и в C++, интерфейсы наследовать от других интерфейсов. В определение интерфейса можно включать: потоки, атрибуты и методы. + + + +Потоки + +Потоки определяют медиаданные, они являются важнейшими компонентами модуля. Формат потока: + +[ async ] in|out [ multi ] тип stream имя [ , имя ] ; + +Направленность потоков зависит от квалификатора (выход или вход). Аргумент типа определяет тип данных (один из перечисленных ниже типов атрибутов), однако поддерживаются ещё не все типы. Во многих модулях типом потока ставится аудио, это внутренний формат данных. Несколько потоков одного типа могут быть объявлены через запятую. + +По умолчанию потоки синхронны, т.е. передача данных идёт постоянно и на определённой частоте, как PCM-аудио. Если вы установите параметр async, поток будет асинхронным, т.е. данные будут передаваться с перерывами. Примером асинхронных потоков могут служить &MIDI;-сообщения. + +Ключевое слово multi, допустимое только для входных потоков, указывает на то, что поток может принимать переменное количество входов. Это удобно при создании таких устройств, как микшеры, которые могут принимать любое количество входных потоков. + + + + +Атрибуты + +Атрибуты - это данные, ассоциирующиеся с объектом интерфейса. Они определяются как переменные-члены классов в C++ и могут быть одного из простейших типов данных: boolean, byte, long, string или float - а такжеструктурами, определёнными пользователем, перечисляемого типа (enum) или последовательностью с переменной длиной (используется <type>). Лучше всего атрибуты помечать как доступные только для чтения. + + + + +Методы + +Как и в C++, методы могут определяться в интерфейсах. Тип параметров метода может быть таким же, у атрибута. Ключевое слово oneway показывает, что метод возвращает какое-то значение сразу и выполняется асинхронно. + + + + + +Стандартные интерфейсы + +В &arts; уже определены несколько стандартных модульных интерфейсов, например, StereoEffect и SimpleSoundServer. + + + + +Пример + +Простым примером модуля &arts; может служить модуль постоянных задержек из файла kdemultimedia/arts/modules/artsmodules.idl. Определение интерфейса приведено ниже. + +interface Synth_CDELAY : SynthModule { + attribute float time; + in audio stream invalue; + out audio stream outvalue; +}; + + +Модуль наследует от SynthModule. Этот интерфейс, описанный в artsflow.idl, определяет методы, использующиеся во всех модулях-синтезаторах. + +Эффект CDELAY задерживает звуковой стереопоток на время, указанное как параметр с плавающей точкой. В определении интерфейса есть атрибут типа float для хранения длительности задержки. Он определяет два входных аудиопотока и два выходных. Никаких других методов, кроме тех, от которых он наследует, не требуется. + + + + + + +Подробнее о потоках + +В этом разделе вы найдёте дополнительную информацию о потоках. + + +Типы потоков + +Есть несколько вариантов реализации потоков в модуле. Вот несколько примеров: + + + +Увеличение сигнала в два раза. + + + +Выборочное изменение частоты. + + + +Декодирование сигналов. + + + +Чтение &MIDI;-событий из /dev/midi00 и добавление их в поток. + + + +Первый случай очень прост: получив 200 сэмплов на входе, модуль воспроизводит 200 сэмплов на выходе. Т.е. выходные данные производятся только после получения входных. + +Во втором случае при 200 входных сэмплов производится другое число выходных. Это зависит от выполненного преобразования, но их количество известно заранее. + +В третьем случае всё ещё сложнее. Нельзя угадать заранее, сколько байтов будет сгенерировано из 200 сэмплов (возможно, гораздо больше, но...). + +В последнем случае модуль активизируется сам по себе и иногда генерирует данные. + +В &arts;-0.3.4 поддерживались потоки только первого типа, и большинство задач выполнялись. Возможно, это и требуется при написании модулей обработки аудиоданных. Со сложными типами потоков возникают проблемы, т.к. их очень сложно программировать и большая часть функций часто не нужна. Поэтому мы решили использовать два типа потоков: синхронные и асинхронные. + +Характеристики синхронных потоков: + + + +Модули должны обрабатывать входные данные любой длины (при условии, что их достаточно). + + + +У всех потоков одна частота модуляции. + + + +Функция calculateBlock() будет вызываться в том случае, если есть достаточное количество входных данных и указатели содержат ссылки на данные. + + + +Резервирование и освобождение не выполняются. + + + +Асинхронные потоки работают по-другому: + + + +Модули могут формировать данные время от времени, с меняющейся частотой модуляции или только если они не ограничены правилом на запрос любой длины нужно отвечать. + + + +В асинхронных потоках частоты модуляции могут быть совершенно разными. + + + +Исходящие потоки: содержат открытые функции для размещения пакетов, пересылки и учёта данных (используя этот механизм, вы будете знать, когда следует передать очередную порцию данных). + + + +Входящие потоки: вызов происходит при получении нового пакета, вам нужно послать ответ, когда он будет обработан (вы можете послать сообщение об этом позже, если пакет кем-нибудь обработан, он будет освобождён/использовано заново). + + + +В определении потоков используется ключевое слово async для указания асинхронного потока. Если вы, к примеру, решили преобразовать ваш асинхронный поток байтов в синхронный поток сэмплов, интерфейс должен выглядеть так: + +interface ByteStreamToAudio : SynthModule { + async in byte stream indata; // the asynchronous input sample stream + + out audio stream left,right; // the synchronous output sample streams +}; + + + + + +Использование асинхронных потоков + +Предположим, вам нужно написать модуль, воспроизводящий звук асинхронно. Его интерфейс будет выглядеть следущим образом: + +interface SomeModule : SynthModule +{ + async out byte stream outdata; +}; + + +Как посылать данные? Первый способ называется принудительная доставка. В асинхронных потоках данные посылаются пакетами. Это значит, что вы посылаете отдельные пакеты байтов, как в примере выше. Вся процедура состоит в том, чтобы разместить пакет, заполнить его и послать. + +Вот пример кода. Сначала пакет размещается: + +DataPacket<mcopbyte> *packet = outdata.allocPacket(100); + + +Потом он заполняется: + +//для fgets необходим указатель (char *) +char *data = (char *)packet->contents; + +//как видите, размер пакета можно уменьшить после размещения +if(fgets(data,100,stdin)) + packet->size = strlen(data); +else + packet->size = 0; + + +И теперь посылаем: + +packet->send(); + + +Как видите, это достаточно просто. Но если пакеты нужно посылать с такой скоростью, чтобы получатель успевал их обрабатывать, нужен другой подход - доставка с задержкой. Сначала вы посылаете какое-то количество пакетов, в то время, когда получатель по очереди их обрабатывает, формируете новые и опять посылаете их. + +Вызов производится командой setPull. Например: + +outdata.setPull(8, 1024); + + +Это значит, что вы хотите посылать пакеты через outdata и начать с 8, а когда получатель обработает несколько, восполнить их. + +После этого нужно указать метод заполнения пакетов. Он может выглядеть так: + +void request_outdata(DataPacket<mcopbyte> *packet) +{ + packet->size = 1024; //не больше 1024 + for(int i = 0;i < 1024; i++) + packet->contents[i] = (mcopbyte)'A'; + packet->send(); +} + + +Вот и всё. Когда закончатся пакеты, установите размер пакетов в ноль, что предотвратит их дальнейшую отправку. + +Заметьте, что очень важно называть метод определённым образом: request_имя потока. + +Мы обсудили, как отправлять данные. Получать их намного проще. Предположим, есть простой фильтр ToLower, который преобразовывает все буквы в нижний регистр: + +interface ToLower { + async in byte stream indata; + async out byte stream outdata; +}; + + +Очень простое использование: + +class ToLower_impl : public ToLower_skel { +public: + void process_indata(DataPacket<mcopbyte> *inpacket) + { + DataPacket<mcopbyte> *outpacket = outdata.allocPacket(inpacket->size); + + //преобразование в нижние регистр + char *instring = (char *)inpacket->contents; + char *outstring = (char *)outpacket->contents; + + for(int i=0;i<inpacket->size;i++) + outstring[i] = tolower(instring[i]); + + inpacket->processed(); + outpacket->send(); + } +}; + +REGISTER_IMPLEMENTATION(ToLower_impl); + + +И опять обратите внимание на имя метода process_имя потока. + +Как видите, при получении пакета вызывается функция (в нашем случае это process_indata). А чтобы показать, что пакет обработан, нужно вызвать метод processed(). + +Совет по использованию: если обработка проходит медленно (к примеру, если нужно ждать вывода данных звуковой картой), не вызывайте processed() сразу же, а только после того, как пакет будет действительно обработан. Тогда отправитель будет знать, сколько времени требуется на самом деле. + +Т.к. асинхронные потоки синхронизируются не очень хорошо, старайтесь использовать синхронные, а асинхронные только в крайнем случае. + + + + +Стандартные потоки + +Предположим, есть 2 объекта, например, AudioProducer и AudioConsumer. У AudioProducer есть выходной поток, а у AudioConsumer - входной. Соединяя их, вы будете использовать эти потоки. С помощью стандартных потоков соединение упрощается: не нужно указывать порты. + +Пусть теперь у нас есть объекты стререозвука, у каждого есть левый и правый порт. Очень хочется, чтобы подключение было как можно проще. Но как система узнает, какие порты соединять? Тут опять помогут стандартные потоки: можно указать несколько потоков по порядку. Поэтому, когда вы будете подключать два выходных стандартных потока к двум входным, не нужно будет указывать порты, а соответствие будет правильным. + +Конечно, это не ограничено стреозвуком. Любое количество потоков можно сделать стандартным при необходимости, а функция связи будет проверять совпадение количества стандартных потоков двух объектов (в необходимом направлении), если вы не укажете порты. + +Ключевое слово default в &IDL; может указывать в описании потока или в отдельной строке. Например: + +interface TwoToOneMixer { + default in audio stream input1, input2; + out audio stream output; +}; + + +В этом примере у объекта два входных порта будут соединены по умолчанию. Порядок определяется по строке со словом default. Поэтому у такого объекта: + +interface DualNoiseGenerator { + out audio stream bzzt, couic; + default couic, bzzt; +}; + + +Соединение couic с input1 и bzzt с input2 будет установлено автоматически. Заметьте, что в этом случае единственный выходной порт будет стандартным (смотрите ниже). Синтаксис генератора шума удобен для описания другого порядка или выбора только некоторых портов по умолчанию. Направления портов будет назначать &mcopidl;, поэтому не указывайте их. Входные и выходные порты можно записать в одной строке, важен лишь порядок. + +Есть несколько правил наследования: + + + +Если в &IDL; указан стандартный список, пользуйтесь им. В него могут быть добавлены родительские порты, независимо от того, были ли они стандартными. + + + +Иначе наследоваться будут родительские порты по умолчанию в таком порядке: родитель1 порт1, родитель1 порт2, ..., родитель2 порт1, ... Если есть общий предок с двумя родительскими ветвями, по умолчанию использоваться будет первый попавшийся в списке порт. + + + +Если порта по умолчанию нет, но есть одночный поток в каком-то направлении, используйте его как стандартый для этого направления. + + + + + + + +Флаги смены атрибута + + + +Флаги смены атрибута - это способ показать, что атрибут изменился. Они похожи на сигналы и функции внешнего вызова в &Qt; или Gtk. Например, если есть элемент &GUI; ползунок, отмечающий значение от 0 до 100, то должен быть объект, работающий с этим значением (к примеру, он может управлять громкостью сигнала). Будет удобно, если объект будет знать, изменился ли уровень громкости. Связь между отправителем и получателем. + +В &MCOP; есть возможность контролировать изменения атрибутов. Независимо от того, что объявлено в &IDL;, атрибут может (и должен) изменяться, а также получать сообщения об изменении. Например, если у вас было два &IDL;-интерфейса: + +interface Slider { + attribute long min,max; + attribute long position; + }; + interface VolumeControl : Arts::StereoEffect { + attribute long volume; // 0..100 + }; + + +Вы можете их связать с помощью флагов изменения. В этом случае связь будет выглядеть так (код на C++): + +#include <connect.h> +using namespace Arts; +[...] +connect(slider,"position_changed",volumeControl,"volume"); + + +Как видите, у каждого атрибута есть два разных потока: для отправки извещений об изменении вызывается имя атрибута _changed и для получения — attributename. + +Важно знать, что флаги изменения совместимы с асинхронными потоками. А также они "прозрачны", поэтому вы можете связать атрибут типа float элемента &GUI; с асинхронным потоком модуля синтезатора на другом компьютере. Естественно, изменение флага не будет синхронным , т. к. на передачу уходит некоторое время. + + + +Отправка извещений об изменении + +Если вы используете объекты с атрибутами, извещение об изменении нужно посылать каждый раз, когда атрибут меняется. Код выглядит приблизительно так: + +void KPoti_impl::value(float newValue) + { + if(newValue != _value) + { + _value = newValue; + value_changed(newValue); // <- послать извещение + } + } + + +Мы рекомендуем такой код для всех создаваемых объектов, чтобы флаги изменения могли использовать другие люди. Однако не стоит посылать извещения слишком часто, поэтому если вы обрабатываете сигнал, будет удобно записывать, когда было послано последнее извещение, чтобы не посылать его с каждым сэмплом. + + + + +Приложения для изменения флага + +Будет особенно полезно менять флаг вместе с оболочками (которые, к примеру, визуализируют аудио данные), элементами gui, контроля и мониторинга. Такой код находится в kdelibs/arts/tests а экспериментальая реализация artsgui - в kdemultimedia/arts/gui. + + + + + + + + + + +Файл <literal role="extension" +>.mcoprc</literal +> + +Файл .mcoprc (в каталоге home каждого пользователя) может быть использован для настройки &MCOP;. Сейчас возможно следущее: + + + + +GlobalComm + +Имя интерфейса для глобальной связи. Глобальная связь необходима для того, чтобы находить другие объекты и получать личные данные пользователя. Для разных &MCOP;-клиентов/серверов, которые должны быть как-то связаны, нужен общий объект GlobalComm для разделения информации между ними. Возможные значения: Arts::TmpGlobalComm для связи посредством каталога /tmp/mcop-имя пользователя (который будет только на локальном компьютере) и Arts::X11GlobalComm для связи через свойства корневого окна сервера X11. + + + + +TraderPath + + +Указывает, в каком каталоге хранится информация о трейдере. Вы можете перечислить несколько, разделив их запятой. + + + + + +ExtensionPath + + +Указывает, из каких каталогов загружаются расширения (в форме общих библиотек). Несколько значений разделяются запятой. + + + + + +Вот пример использования: + +# $HOME/.mcoprc file +GlobalComm=Arts::X11GlobalComm + +#если вы разработчик, будет удобно добавлять путь к каталогу трейдера +#т.е. вы сможете использовать добавлять компоненты, не устанавливая их +TraderPath="/opt/kde2/lib/mcop","/home/joe/mcopdevel/mcop" +ExtensionPath="/opt/kde2/lib","/home/joe/mcopdevel/lib" + + + + + +&MCOP; для пользователей <acronym +>CORBA</acronym +> + +Если вы пользовались CORBA раньше, вы заметите, что &MCOP; очень похож на эту технологию. Вообще-то до версии 0.4 &arts; использовал CORBA. + +Основная идея CORBA такая же: вы создаёте объекты (компоненты). В &MCOP; ваши объекты доступны как обычные классы, в том числе и для удалённого сервера. Для этого нужно определить интерфейс объектов в файле &IDL;, так же, как и в CORBA. Однако есть несколько различий. + + +Функции <acronym +>CORBA</acronym +>, которые отсутствуют в &MCOP; + +В &MCOP; нет параметров вход и выход вызова методов. Параматры всегда входящие, а возвращаемый код всегда исходящий. Это значит, что интерфейс: + +// CORBA idl +interface Account { + void deposit( in long amount ); + void withdraw( in long amount ); + long balance(); +}; + + +пишется как + +// MCOP idl +interface Account { + void deposit( long amount ); + void withdraw( long amount ); + long balance(); +}; + + +в &MCOP;. + +Нет обработки исключений. В &MCOP; есть другие способы для обхода ошибок. + +Здесь нет типа union и typedef. Не знаю, большой ли это недостаток... + +Нет поддержки передачи интерфейсов и обращения к объектам + + + + +Функции <acronym +>CORBA</acronym +>, отличающиеся в &MCOP; + +В &MCOP; последовательности определяются так: последовательностьтип. Нет необходимости писать typedef. Например, вместо + +// CORBA idl +struct Line { + long x1,y1,x2,y2; +}; +typedef sequence<Line> LineSeq; +interface Plotter { + void draw(in LineSeq lines); +}; + + +вы напишете + +// MCOP idl +struct Line { + long x1,y1,x2,y2; +}; +interface Plotter { + void draw(sequence<Line> lines); +}; + + + + + +Функции &MCOP;, которых нет в <acronym +>CORBA</acronym +> + +Вы можете объявить потоки, которые будут обрабатываться платформой &arts;. Объявление потоков похоже на объявление атрибутов. Например: + +// MCOP idl +interface Synth_ADD : SynthModule { + in audio stream signal1,signal2; + out audio stream outvalue; +}; + + +Это значит, что ваш объект будет принимать два входящих синхронных аудиопотока signal1 и signal2. "Синхронный" значит, что эти потоки обязательно будут выдавать определённое количество данных. Т. е. если вызывается ваш объект и ему передаётся 200 сэмплов (signal1 + signal2), он выдаст 200 сэмплов. + + + + +Связь &MCOP; с C++ + +Основные отличия от CORBA: + + + +Для работы со строками используется класс C++ STL string. Если они хранятся в последовательности, они хранятся просто тпе, т.е. они считаются простым типом. Поэтому им необходимо копирование. + + + +long - обычный тип long (32 бита). + + + +Последовательности используют класс C++ STL vector. + + + +Все структуры созданы из класса &MCOP; Type и сгенерированы компилятором &IDL;. Если они хранятся в массиве, для того, чтобы избежать копирования, хранятся только ссылки. + + + + + +Создание объектов &MCOP; + +После компиляции их нужно извлечь из класса _skel. Например, если вы определили ваш интерфейс так: + +// MCOP idl: hello.idl +interface Hello { + void hello(string s); + string concat(string s1, string s2); + long sum2(long a, long b); +}; + + +Вы компилируете его, вызвав mcopidl hello.idl, при этом сгенерируется hello.cc и hello.h. Чтобы эти файлы использовать, нужно определить C++ класс, который будет наследовать каркас: + +//заголовочный файл C++ - hello.h - включается ранее +class Hello_impl : virtual public Hello_skel { +public: + void hello(const string& s); + string concat(const string& s1, const string& s2); + long sum2(long a, long b); +}; + + +И, наконец, можете пользоваться методами как в обычном C++ + +// файл, использующий C++ + +// как видите, строки передаются указателями +void Hello_impl::hello(const string& s) +{ + printf("Hello '%s'!\n",s.c_str()); +} + +// а если это возвращаемое значение, всё как с "обычной" строкой +string Hello_impl::concat(const string& s1, const string& s2) +{ + return s1+s2; +} + +long Hello_impl::sum2(long a, long b) +{ + return a+b; +} + + +После этого вы получите объекты, которые могут "общаться" с помощью &MCOP;. Теперь осталось их создать (это делается так же, как в C++): + +Hello_impl server; + + +И как только вы добавите ссылку + +string reference = server._toString(); + printf("%s\n",reference.c_str()); + + +и перейдете в цикл ожидания + +Dispatcher::the()->run(); + + +Люди смогут обращаться к нему + +// этот код может содержаться где угодно +// (даже на другом компьютере с другой архитектурой) + + Hello *h = Hello::_fromString([the object reference printed above]); + + +и вызывать методы: + +if(h) + h->hello("test"); + else + printf("Access failed?\n"); + + + + + + +Безопасность в &MCOP; + +Так как передача данных между серверами &MCOP; идёт по протоколу TCP, любой (если вы подключены к Интернету) может попробовать подключиться к сервисам &MCOP;. Поэтому рекомендуется использовать аутентификацию клиентов. В &MCOP; используется протокол md5-auth + +В md5-auth отбор клиентов, которые могут подключиться, происходит так: + + + +Предполагается, что любой может получить ваш секретный пароль. + + + +При каждом подключении клиента проверяется, знает ли он секретный пароль, при этом пароль не пересылается по сети, чтобы любой, прослушивающий сеть, не мог его получить. + + + + +Чтобы назначить каждому клиенту свой секретный пароль, &MCOP; запишет его в каталоге mcop (/tmp/mcop-USER/secret-cookie). Конечно, вы можете его скопировать на другой компьютер. Однако в этом случае нужен безопасный способ копирования, например, scp (из ssh). + +Шаги аутентификации: + + + +[Сервер] генерирует новый (случайный) пароль R + + + +[Сервер] посылает его клиенту + + + +[Клиент] читает "секретный пароль" S из файла + + + +[Клиент] с помощью алгоритма MD5 преобразует пароли R и S и формирует пароль M + + + +[Клиент] посылает M серверу + + + +[Сервер] проверяет, действительно ли преобразование R и S даёт пароль M, полученный от клиента. Если да, аутентификация прошла успешно. + + + + +Этот алгоритм обеспечивает безопасность при условии, что + + + +Секретный и случайный пароли достаточно случайны и + + + +Алгоритм искажения MD5 не позволяет восстановить исходный текст, т.е. секретный S и случайный R пароли (который все знают) из преобразованного пароля M. + + + +Каждое новое подключение по протоколу &MCOP; начинается с аутентификации. Это выглядит так: + + + + +Сервер посылает сообщение ServerHello, в котором описываются все известные протоколы аутентификации. + + + +Клиент посылает сообщение ClientHello с информацией об аутентификации. + + + +Сервер посылает сообщение AuthAccept. + + + +Чтобы понять, как действительно работает система безопасности, нужно посмотреть, как обрабатываются сообщения во время аутентификации: + + + +Пока не завершится этап аутентификации, никаких других сообщений сервер принимать не будет. Например, если он ожидает сообщение ClientHello, а получает mcopInvocation, связь разрывается. + + + +Если клиент вообще не посылает допустимых сообщений &MCOP; во время аутентификации, связь разрывается. + + + +Если клиент пытается послать слишком большое сообщение (4096 байтов во время аутентификации), оно обрезается до 0 байтов, и сервер считает, что сообщение не было послано. Это необходимо, чтобы неаутентифицированный пользователь не мог послать сообщение в 100 мегабайт и израсходовал всю память сервера. + + + +Если клиент присылает искажённое сообщение ClientHello, соединение разрывается. + + + +Кроме того, нужно указать время ожидания на случай, если клиент вообще ничего не посылает. + + + + + + +Описание потокола &MCOP; + + +Введение + +Протокол очень похож на CORBA, но он был расширен, чтобы выполнять все необходимые операции в реальном времени. + +Вы можете создать объектную мультимедиа-модель, которую можно будет использовать для связи между компонентами в одном адресном пространстве (в одной задаче), а также между компонентами в различных потоках, задачах и на разных узлах. + +Он будет доработан, чтобы выполнение проходило очень быстро и подходило "общительным" приложениям. Например, потоки видео - одно из приложений &MCOP;, где большая часть реализаций CORBA явно проигрывает. + +Определения интерфейсов полностью реализуют следующую функуиональность: + + + +Непрерывные потоки данных (например, аудиоданные). + + + +Потоки событий (например, &MIDI;-события). + + + +Счётчик ссылок. + + + +и наиболее важные особенности CORBA , например: + + + +Вызовы синхронных методов. + + + +Вызовы асинхронных методов. + + + +Создание определённых пользователем типов. + + + +Множественное наследование. + + + +Передача ссылок на объекты. + + + + + + +Упаковка сообщений &MCOP; + +Идеи/цели дизайна: + + + + +Упаковка объектов должна быть проста в использовании. + + + +При распаковке получатель должен знать, сообщение какого типа он собирается распаковывать. + + + +Получатель должен использовать всю информацию, поэтому пропуски информации обычно бывают только в таких случаях: + + + +Если вы знаете, что получите блок байтов, вам не нужно проверять каждый из них на наличие маркера конца передачи. + + + +Если вы собираетесь получить строку, не нужно читать её до нулевого байта, чтобы вычислить длину, но + + + +При получении массива строк нужно отслеживать длину каждой строки, чтобы узнать, когда закончится массив. Хотя если вы используете строки для чего-то важного, это нужно делать в любом случае. + + + + + + +Снижение непроизводительных издержек. + + + + + +Упаковка сообщений различных типов показана в таблице ниже: + + + + + +Тип +Процедура упаковки +Результат + + + + + +void +в поток ничего не записывается + + + + +long +занимает четыре байта, и самый важный из них - первый; например, число 10001025 (0x989a81) будет упаковано так: +0x00 0x98 0x9a 0x81 + + + +enum +см. long + + + + +byte +занимает один байт; например, число 0x42 будет упаковано так: +0x42 + + + +string +см. long; отличия: содержит длину строки и последовательность символов, которая обязательно оканчивается нулевым байтом (он включён в длину) + +длина строки должна включать последний нулевой байт! + +например, hello упаковывается так: +0x00 0x00 0x00 0x06 0x68 0x65 0x6c 0x6c 0x6f 0x00 + + + +boolean +см. байт; содержит 0, если false, и 1 если true; значение true выглядит так: +0x01 + + + +float +упаковывается в соответствии с четырёхбайтовым представлением IEEE754 -подробнее об этом можно узнать здесь: http://twister.ou.edu/workshop.docs/common-tools/numerical_comp_guide/ncg_math.doc.html и здесь: http://java.sun.com/docs/books/vmspec/2nd-edition/html/Overview.doc.html; например, значение 2.15 будет выглядеть так: +0x9a 0x99 0x09 0x40 + + + +struct +используется содержимое структуры; для этого не нужны дополнительные префиксы или суффиксы; например, структура +struct test { + string name; // это "hello" + long value; // это 10001025 (0x989a81) +}; + +будет упакована так: + +0x00 0x00 0x00 0x06 0x68 0x65 0x6c 0x6c +0x6f 0x00 0x00 0x98 0x9a 0x81 + + + + +последовательность +последовательность располагается так: количество элементов и сами элементы друг за другом +поэтому последовательность а из 3 элементов типа long, с a[0] = 0x12345678, a[1] = 0x01 и [2] = 0x42 будет упакована так: + +0x00 0x00 0x00 0x03 0x12 0x34 0x56 0x78 +0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x42 + + + + + + + +При обращении к простому типу используется его имя. У структур и перечисляемых типов есть собственные имена. Последовательности являются указателями на *обычные типы, поэтому обращение к последовательности элементов типа long будет таким: *long, а к последовательности структур Header: *Header. + + + + +Сообщения + +Формат заголовка сообщения &MCOP; определяется такой структурой: + +struct Header { + long magic; // значение 0x4d434f50: MCOP + long messageLength; + long messageType; +}; + + +Возможные типы сообщений: + +mcopServerHello = 1 + mcopClientHello = 2 + mcopAuthAccept = 3 + mcopInvocation = 4 + mcopReturn = 5 + mcopOnewayInvocation = 6 + + +Несколько замечаний о сообщениях &MCOP;: + + + + +Каждое сообщение начинается с заголовка. + + + +Некоторые сообщения должны отбрасываться сервером, если процесс аутентификации ещё не пройден. + + + +После получения заголовка, можно получать всё сообщение целиком без просмотра его содержимого. + + + +Значение messageLength в заголовке в некоторых случаях бывает лишним. + +Однако это простой (и быстрый) способ обработки неблокового сообщения. С его помощью сообщения могут быть получены в фоновом режиме. Если одновременно установлено несколько соединений, они будут параллельными. Вам не нужно будет проверять содержимое всего сообщения (чтобы узнать, когда оно закончится), нужен только заголовок. Это упрощает кодирование. + +После получения сообщения оно может быть распаковано и обработано за один проход, без рассматривания случаев, когда получены не все данные (это гарантирует messageLength). + + + + +Вызовы + +Для вызова удалённого метода нужно послать структуру, приведённую ниже, в теле сообщения &MCOP; с messageType = 1 (mcopInvocation): + +struct Invocation { + long objectID; + long methodID; + long requestID; +}; + + +после этого параметры передаются как структура, т.е. если вы вызываете string concat(string s1, string s2), отправьте такую структуру: + +struct InvocationBody { + string s1; + string s2; +}; + + + +Если нужен метод однонаправленный - т.е. асинхронный без возвращения значения - это был он. Иначе вы получите сообщение с messageType = 2 (mcopReturn) + +struct ReturnCode { + long requestID; + <resulttype> result; +}; + + + +где <resulttype> - это тип результата. Вы можете написать только requestID, если тип метода был void. + +Таким образом, concat(string s1, string s2) вернёт код + +struct ReturnCode { + long requestID; + string result; +}; + + + + + +Изучение интерфейсов + +Чтобы вызвать объект, нужно знать, какие методы можно использовать во время работы с ним. Значения 0, 1, 2, и 3 methodID определены для конкретных задач: + +long _lookupMethod(MethodDef methodDef); // methodID всегда 0 +string _interfaceName(); // methodID всегда 1 +InterfaceDef _queryInterface(string name); // methodID всегда 2 +TypeDef _queryType(string name); // methodID всегда 3 + + +чтобы это прочесть, необходима сруктура + +struct MethodDef { + string methodName; + string type; + long flags; // установить в 0 (необходимо для потоков) + sequence<ParamDef> signature; +}; + +struct ParamDef { + string name; + long typeCode; +}; + + +в полях параметров содержатся компоненты, определяющие типы параметров. Тип возвращаемого значения зависит от типа MethodDef. + +Строго говоря, только методы _lookupMethod() и _interfaceName() разные для всех объектов, а _queryInterface() и _queryType() всегда одинаковы. + +Что же такое methodID? Если вы вызываете метод, нужно передавать его номер, т.к. цифры в запросе &MCOP; обрабатываются гораздо быстрее строк. + +Итак, как же получить номер метода? Зная его подпись - MethodDef (в которой содержится имя, тип и информация о параметрах) - вы можете передать её в _lookupMethod объекта, вызывающего метод. Так как _lookupMethod настроен на methodID 0, проблем с этим не будет. + +Если же вы не знаете подписи, с помощью _interfaceName, _queryInterface и _queryType можно узнать, какие методы поддерживаются. + + + +Определения типов + +Определённые пользователем типы данных описаны с помощью структуры TypeDef: + +struct TypeComponent { + string type; + string name; +}; + +struct TypeDef { + string name; + + sequence<TypeComponent> contents; +}; + + + + + + +Почему &arts; не использует &DCOP; + +В связи с тем, что в &kde; отказались от CORBA полностью и используют вместо него &DCOP;, обычно возникает вопрос, почему это не делается в &arts;. Тем не менее в KApplication есть хорошая поддержка &DCOP; для интеграции с libICE. + +Возможно, многие захотят спросить, зачем нужен &MCOP;, если есть &DCOP;, поэтому скажу сразу. Поймите меня правильно, я не хочу сказать, что &DCOP; - это плохо. Я просто хочу сказать, что &DCOP; не подходит &arts; (хотя это хорошее решение для других задач). + +Во-первых, нужно понять, для чего был написан &DCOP;. Созданный за два дня на встрече &kde;-2, он должен был быть как можно более простым, легковесным протоколом связи. При разработке были упущены все сколько-нибудь сложные вопросы, например, подробное описание, как упаковывать типы данных. + +Хотя в &DCOP; не важны некоторые вещи (например, как нужно посылать строку, чтобы обеспечить прозрачность сети?) - они необходимы. Поэтому всё, чего не может делать &DCOP;, добавлено в &Qt;. В основном, это управление типами (с помощью оператора сериализации &Qt;). + +&DCOP; замечательно работает, позволяя приложениям &kde; отправлять простые сообщения вроде открыть в окне http://www.kde.org или данные о конфигурации изменились. Однако в &arts; важно другое. + +Идея заключается в том, что небольшие модули &arts; должны общаться с помощью таких структур данных, как события midi иуказатели на позицию в песне. + +Это сложные типы данных, которые должны пересылаться различными объектами как потоки или параметры. В &MCOP; есть возможность определить сложные типы через простые (похожие на структуры или массивы в C++). В &DCOP; программист должен сам писать, например, классы и проверять, что они правильно сериализуются (к примеру, поддержка потокового оператора в &Qt;). + +Но в этом случае они будут доступны только для C++, так как нельзя разработать язык, который будет распознавать все типы модулей (которые не будут самоописывающимися). + +Почти та же проблема с интерфейсами. В объектах &DCOP; информация о связях, иерархии наследования и т. д. закрыта. И если вам нужно написать приложение, которое должно показывать, какие атрибуты есть у этого объекта, у вас ничего не получится. + + +Матиас (Matthias) рассказал, что есть специальная функция functions для каждого объекта, которая определяет, какие методы поддерживает объект. Она пропускает информацию об атрибутах (параметрах), потоках и наследовании. + +Это серьёзно нарушает целостность таких приложений, как &arts-builder;. Но не следует забывать, что &DCOP; разрабатывался не как объектная модель (как &Qt; с moc и подобными), не как что-то вроде CORBA, а только для обеспечения связи между приложениями. + +Отличие &MCOP; состоит в том, что он должен работать с потоками, которые являются основным способом сообщения между объектами. В CORBA-версии &arts; приходилось разделять объекты SynthModule, которые создавали потоки, и интерфейс CORBA. + +Основную часть кода занимала реализация взаимодействия объектов SynthModule и интерфейсов CORBA , она должна быть органичной, но не была, т.к. в CORBA не было даже понятия "поток". Взгляните на этот код (что-то вроде simplesoundserver_impl.cc ). Он выглядит намного лучше! Потоки можно объявлять в интерфейсах модулей, а их использование выглядит естественно. + +Этого нельзя отрицать. Одной из причин написания &MCOP;, была скорость. Вот несколько объяснений, почему &MCOP; будет работать быстрее &DCOP;. + + +Вызов в &MCOP; содержит заголовок из 6 чисел типа long: + + +magic MCOP; +тип сообщения (вызов); +размер запроса в байтах; +идентификатор запроса; +идентификатор цели; +илентификатор метода. + + +После этого последуют параметры. Заметьте, что распаковка при этом очень быстра. Вы можете использовать стандартные функции для распаковки объекта или метода, что сводит сложность кодирования к минимуму. + +Сравним этот вариант с &DCOP;. В нём будет по крайней мере: + + +строка целевого объекта вроде myCalculator; +строка addNumber(int,int), указывающая метод; +информация о протоколе, добавленная libICE, а также другие дополнительные данные, которых я не знаю. + + +Распаковывать все это гораздо сложнее, ведь вам придется обрабатывать строки, искать функции и т. д. + +В &DCOP; все запросы проходят через сервер (DCOPServer). Это значит, что синхронный вызов выглядит так: + + + +Задача-клиент посылает вызов. + + + +DCOPserver (посредник) получает его, решает, куда нужно отправить запрос, и отправляет его настоящему серверу. + + + +Этот сервер получает вызов, выполняет запрос и отправляет результат. + + + +DCOPserver (посредник) получает результат и... посылает его клиенту. + + + +Клиент декодирует ответ. + + + +В &MCOP; тот же вызов выглядит по-другому: + + + +Задача-клиент посылает вызов. + + + +Этот сервер получает вызов, выполняет запрос и отправляет результат. + + + +Клиент декодирует ответ. + + + +Если и то, и другое было выполнено правильно, всё равно передача запроса через &MCOP; в два раза быстрее. И всё же есть причины выбрать&DCOP;: если запущено 20 приложений, все они связаны друг с другом, в &DCOP; нужно 20 соединения, а в &MCOP; 200. Однако в работе с мультимедиа это не распространено. + +Я пробовал сравнивать &MCOP; и &DCOP;, делая вызов как сложение двух чисел, подправив testdcop. Но не смог получить точные результаты для &DCOP;. Метод вызывался в том же процессе, где был вызов &DCOP;, и я не знал, как избавиться от одного сообщения об отладке, пришлось перенаправить выход. + +В тесте использовлись один объект и одна функция. С увеличением количества объектов и функций результаты &DCOP; ухудшаются, а у &MCOP; остаются прежними. Кроме того, задача dcopserver не была подключена к другим приложениям. Возможно, в этом случае, работа маршрутизатора была бы медленнее. + +Наконец, полученный результат: чуть больше 2000 вызовов в секунду у &DCOP; и чуть больше 8000 вызовов в секунду у &MCOP;. В четыре раза. И я знаю, что это не предел &MCOP; (для сравнения: mico в CORBA совершает 1000-1500 вызовов в секунду). + +Если вы хотите более точных данных, напишите небольшие приложения для сравнения с &DCOP; и пришлите их мне. + +В CORBA была возможность использовать однажды вызванный объект как отдельный серверный процесс или как библиотеку. Можно было использовать один и тот же код, а CORBA уже сам решала, что делать. Насколько я знаю, в &DCOP; такое невозможно. + +С другой стороны, в &MCOP; это обязательно должно быть. Поэтому вы можете прослушивать какой-то эффект в &artsd;, а при этом редактор звуковых файлов использует его в своем пространстве задачи. + +Если &DCOP; - это способ передачи данных между приложениями, то &MCOP; - связь внутри приложений. Это особенно важно для потоков мультимедиа, т.к. можно запускать несколько объектов параллельно. + +Хотя &MCOP; ещё этого не поддерживает, возможность помечать приоритет остаётся. Например, так: это событие &MIDI; намного важнее этого вызова. Или так: должно быть получено вовремя. + +С другой стороны, в &MCOP; может быть интергрирована передача потоков, объединённая с QoS. Если это будет сделано, &MCOP; не будет работать медленнее, чем TCP, но будет проще в использовании. + +Нет необходимости писать связующее ПО для мультимедиа в &Qt;, иначе оно станет &Qt;-зависимым. + +Насколько я знаю, тип пересылаемых по &DCOP; данных не важен, поэтому &DCOP; может использоваться отдельно от &Qt;. Вот пример повседневного использования в &kde;: пользователи посылают типы QString, QRect, QPixmap, QCString, ... Они используют сериализацию &Qt;. Поэтому если кто-то решит включить поддержку &DCOP;, например, в GNOME, он не сможет использовать типы QString и др. и ему придётся эмулировать работу &Qt; с потоками или посылать строку, пиксельные изображения и типы rect, что, конечно, никуда не годится. + +&arts; не привязан к &kde;, он может работать как с &Qt; и X11, так и без них, и даже без &Linux; (я знаю людей, у которых он нормально работает в распространённых коммерческих ОС). + +Я считаю, что компоненты, написанные не для &GUI;, не должны от него зависеть, чтобы была возможность более широкого их распространения среди разработчиков. + +Я понимаю, что использование двух протоколов IPC неудобно, однако переход на &DCOP; я не считаю выходом. При желании можно попытаться объединить два протокола. Можно даже научить &MCOP; говорить на IIOP, получится CORBA ORB ;). + +Мы разговаривали с Матиасом Этрихом (Matthias Ettrich) о будущем двух протоколов и нашли множество путей их развития. Например, &MCOP; мог бы осуществлять передачу сообщений в &DCOP;, это бы сблизило протоколы. + +Поэтому возможными решениями могли бы быть: + + + +Создание шлюза &MCOP; - &DCOP;, который осуществлял бы взаимодействие этих протоколов. Если вы заинтересовались, спешу сообщить, что рабочий прототип уже существует. + + + +Интеграция в &MCOP; всего, чего пользователи ожидают от &DCOP;. Попытаться работать только с ним. Кто-нибудь может добавить в &MCOP;сервер-посредник :) + + + +Сделать основой &DCOP; не libICE, а &MCOP; и постепенно их объединять. + + + +А можно использовать протоколы по их предназначению (оно ведь разное у каждого) и не пытаться их объединить. + + + diff --git a/tde-i18n-ru/docs/kdemultimedia/artsbuilder/midi.docbook b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/midi.docbook new file mode 100644 index 00000000000..651330d574e --- /dev/null +++ b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/midi.docbook @@ -0,0 +1,526 @@ + + + +&MIDI; + + +Обзор + + + +Поддержка &MIDI; в &arts; обширна. Она разрешает обмен данными между приложениями, генерирующими &MIDI;-события, и получателями этих событий. К примеру, если вы используете синтезатор и сэмплер, поддерживающие &arts;, вы можете посылать &MIDI;-события от синтезатора сэмплеру. + +С другой стороны, &arts; позволяет приложениям взаимодействовать с оборудованием. Если какое-то приложение (сэмплер, к примеру) работает с &arts;, оно сможет получать &MIDI;-события со внешней &MIDI;-клавиатуры. + +Наконец, &arts; - это замечательный модульный синтезатор. Он был разработан именно для использования в таком качестве. То есть вы можете создавать инструменты из небольших модулей, используя artsbuilder. В &arts; есть и модули-сэмплеры. Таким образом, &arts; - это мощный сэмплер и синтезатор, он состоит из отдельных модулей, поэтому его легко расширять. + + + +Менеджер &MIDI; + + +Главный компонент &arts; - это Менеджер &MIDI;, он знает, как связаны приложения и как должна пересылаться информация. Чтобы посмотреть, что он делает или настроить его, выберите ВидПоказать midi-менеджера в меню &artscontrol;. + +Слева вы видите Входные каналы MIDI. Там перечислены все объекты, которые могут производить &MIDI;-события: внешний &MIDI;-порт, к которому подключена &MIDI;-клавиатура, синтезатор и т. д. Справа - Выходные каналы MIDI. Это, к примеру, приложение-сэмплер или внешний &MIDI;-порт, к которому подключен сэмплер. Новые приложения, например, синтезатор, регистрируются сами, поэтому список будет меняться. + +Входные и выходные каналы можно соединить, щелкнув по соответствующим объектам и нажав на кнопку Соединиться внизу. Аналогично работает кнопка Разъединиться. Если два устройства подключены, между ними будет нарисована линия. Заметьте, что к одному входу можно подключить несколько выходов и наборот. + +Приложения (вроде синтезатора Brahms) будут автоматически добавляться в список при запуске и удаляться при выходе. Однако вы можете самостоятельно добавить их в меню Добавить: + + + +Порт MIDI на эту систему (OSS) + +Создаст новый объект &arts;, который будет посылать данные на внешний MIDI-порт. + +Внешние MIDI-порты могут как получать, так и посылать данные. Эта операция позволяет создаьт входной и выходной каналы MIDI. Для работы вам необходима OSS (или OSS/Free, она идёт с ядром &Linux;) или драйвер звуковой карты ALSA. Имя устройства обычно такое: /dev/midi или /dev/midi00. + +Однако, если у вас более одного MIDI-устройства или установлен драйвер, имитирующий MIDI-устройство, выбор становится шире. Чтобы получить дополнительную информацию о ваших портах MIDI, запустите &kcontrolcenter; и зайдите в Информация Звук. + + + + +Синтезированный вывод MIDI aRts + +Будет создан новый &MIDI;-выход синтезатора &arts;. Если вы выберете соответствующий пункт в меню, откроется диалоговое окно, в котором можно будет указать инструмент. Вы можете создавать новые инструменты, используя artsbuilder. Все файлы с расширением .arts и именем, начинающимся с instrument_, будут отображены здесь. + + + + + + + +Использование &arts; и Brahms + +Запустить &brahms; достаточно просто, вам нужна версия &brahms; для &kde; 2.1,которую можно найти в модуле kmusicCVS. Также есть информация о том, где взять &brahms; на Домашней странице aRts в разделе Download. + +При запуске вызывается Менеджер &MIDI;. Если вы хотите получить синтезатор, просто добавьте &MIDI;-инструмент в ДобавитьСинтезированный вывод MIDI aRts. + +Выберите инструмент (к примеру, organ2). Подключите его, нажав на кнопку Соединиться. Теперь вы можете писать музыку в &brahms;, а играть её будет &arts;. + +Очень удобно держать открытым окно &artscontrol;, чтобы контролировать громкость (качество звука теряется, когда уровень звука выше определённых границ). Сейчас вы можете начать работу над новой композицией в &arts;, а когда закончите, сможете опубликовать её на aRts-project.org ;-). + + + + + + +midisend + +midisend - это небольшое приложение, позволяющее отправлять &MIDI;-события из оболочки. Оно регистрирует себя как клиента. Самый простой способ использования: % midisend /dev/midi00 , результат будет почти таким же, как если бы вы добавили &MIDI;-порт в &artscontrol; (почти потому, что midisend только отправляет события). Разница в том, что midisend гораздо проще запустить на разных компьютерах. + +Также есть возможность с помощью midisend посылать данные из stdin, которые могут использоваться для переноса данных из приложений, не поддерживающих &arts;, в &arts;. К примеру: % applicationwhichproducesmidieventsonstdout | midisend + + + + + + +Создание инструментов + +В &arts; синтезатор работает следующим образом: со входных портов структур получаются данные о частоте, громкости и устанавливается параметр нажатия клавиши. Затем структура синтезирует необходимую ноту заданной громкости, а также считывает параметр нажатия (где 1 значит, что клавиша ещё нажата, а 0 - отпущена). + +Когда &MIDI;-событие получено, &arts; создаёт новую структуру для необходимых нот и передаёт ей параметры. После завершения процесса структура удаляется. + +Чтобы создать и использовать структуру, необходимо сделать следущее: + + + +Самый удобный способ запуска: открыть template_Instrument.arts в &arts-builder;. + +Это может быть сделано так: ФайлОткрыть пример и выбрать template_Instrument. Таким образом будет создана пустая структура с необходимыми параметрами, которую вам нужно только заполнить. + + + +Для обработки параметра нажатия удобно использовать Synth_ENVELOPE_ADSR или, если идёт воспроизведение wav с ударными, просто игнорируйте его. + + + +Структура должна отображать, нужна ли она. Если done содержит значение 1, &arts; удаляет структуру. Для удобства оболочка ADSR предоставляет такой параметр, вам нужно только подключить его к выходу структуры. + + + +Вам нужно переименовать структуру, начиная имя файла с instrument_, к примеру, instrument_piano.arts, и сохранить её в каталоге $HOME/arts/structures (это стандартный каталог для сохранения файлов). + + + +Теперь, когда вы её сохранили, вы сможете использовать её в &artscontrol; в Менеджере &MIDI;. + + + +И, конечно, ваша структура должна уметь проигрывать сгенерированные аудиоданные, которые будут потом воспроизводиться Менеджером аудио (это можно увидеть в &artscontrol;) и которые вы сможете обработать с помощью эффектов. + + + +Хороший способ поучиться созданию инструментов - это открыть уже существующие в ФайлОткрыть пример и посмотреть, как они работают ;) + + + +Карты инструментов + +Карты инструментов - это такие инструменты, звучание которых меняется в зависимости от высоты, программы, канала или скорости. К примеру, вы можете создать пианино с пятью октавами, и оно будет звучать намного лучше, чем просто один сэмпл. + +Также вы можете создать карту ударных инструментов, тогда при нажатии на определённую клавишу будет проигрываться соответствующий сэмпл. + +Очень удобно помещать разные звуки на одну карту, но с разными программами. В этом случае вы сможете использовать синтезатор, внешнюю &MIDI;-клавиатуру или что-нибудь ещё для переключения звуков. + +Хороший пример этого инструмента - arts_all, в котором собраны все инструменты &arts; на одной карте. С ним вам нужно только настроить его в &artscontrol; на использование инструмента, а потом писать музыку на синтезаторе, не думая об &arts;. Понадобился другой звук? Поменяйте программу синтезатора. + +Создать такую карту очень просто. Нужно создать текстовый файл и записать туда правила, которые выглядят примерно так: + +ON [ условия ...] DO structure=какая-то структура.arts + + +Условий может быть и более одного: + + + + + + + +Высота проигрываемой ноты. Это нужно, если вы хотите создать зависящий от высоты инструмент. В одном из наших примеров для разных октав пианино используются разные сэмплы с этим условием. Вы можете задать одну высоту: =62 или диапазон: =60-72. Допустимый диапазон: от 0 до 127. + + + + + + +Если на канал, который использует какая-то программа, посылается нота, программа становится активной. Обычно инструмент можно указать в настройках программы, которых может быть и несколько: =3 или =3-6 . Диапазон номеров программ: от 0 до 127. + + + + + + +Канал, на который посылается нота. Возможен выбор одного или нескольких каналов: =0 или =0-8. Допустимые каналы: от 0 до 15. + + + + + + +Это скорость (громкость) ноты. Вы можете выбрать одну (кому она только нужна?) или диапазон: =127 или =64-127. Диапазон: от 0 до 127. + + + + +Законченный пример карты (взят из текущего instrument_arts_all.arts-map): + +ON program=0 DO structure=instrument_tri.arts +ON program=1 DO structure=instrument_organ2.arts +ON program=2 DO structure=instrument_slide1.arts +ON program=3 DO structure=instrument_square.arts +ON program=4 DO structure=instrument_neworgan.arts +ON program=5 DO structure=instrument_nokind.arts +ON program=6 DO structure=instrument_full_square.arts +ON program=7 DO structure=instrument_simple_sin.arts +ON program=8 DO structure=instrument_simple_square.arts +ON program=9 DO structure=instrument_simple_tri.arts +ON program=10 DO structure=instrument_slide.arts +ON program=11 pitch=60 DO structure=instrument_deepdrum.arts +ON program=11 pitch=61 DO structure=instrument_chirpdrum.arts + + +Как вы видите, структура выбирается в зависимости от программы. В программе 11 задана карта ударных (с двумя входами), которая будет играть deepdrum C-5 (высота=60) и chirpdrum C#5 (высота=61). + +Чтобы карты появлялись в &artscontrol; как вариант инструмента, их нужно вызвать так: instrument_что-то.arts-map и перенести в домашний каталог $HOME/arts/structuresили в каталог &kde; $KDEDIR/usr/local/kde/share/apps/artsbuilder/examples. Используемые картами структуры могут иметь как полный путь, так и путь до каталога карты. + +Расширение карты arts_all или даже создание законченной общей &MIDI;-карты для &arts; поможет сделать &arts; проще. Подумайте над опубликованием своих интересных инструментов, которые мы можем включить в следущую версию &arts;. + + + + + diff --git a/tde-i18n-ru/docs/kdemultimedia/artsbuilder/midiintro.docbook b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/midiintro.docbook new file mode 100644 index 00000000000..d04b17d15b8 --- /dev/null +++ b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/midiintro.docbook @@ -0,0 +1,16 @@ + + + + +Введение в <acronym +>MIDI</acronym +> + +В процессе написания + + diff --git a/tde-i18n-ru/docs/kdemultimedia/artsbuilder/modules.docbook b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/modules.docbook new file mode 100644 index 00000000000..91ca8d9a3e8 --- /dev/null +++ b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/modules.docbook @@ -0,0 +1,1321 @@ + + + +Модули &arts; + + +Введение + +В этой главе рассказывается обо всех стандартных модулях &arts;. Это, пожалуй, самое мощное средство &arts;. Модули можно объединять в структуры, получая эффекты и инструменты. + +Есть два вида модулей. Модули-синтезаторы используются для создания различных эффектов, инструментов, микшеров и приложений с помощью потоков мультимедиа-данных. С помощью визуальных модулей вы сможете создать графический интерфейс управления встроенными в синтезаторы звуковыми структурами. + + + + +Описание модулей-синтезаторов + + + +Арифметика + Микширование + + + + +Synth_ADD + + + + + +Synth_ADD + + +Добавляет два сигнала. + + + + +Synth_MUL + + + + + +Synth_MUL + + +Умножает сигнал на коэффициент. Его можно использовать для понижения сигнала (0 < коэффициент < 1), повышения (коэффициент> 1) или инвертирования (коэффициент < 0). Заметьте, что коэффициентом может быть не только константа, но и сигнал (например, оболочка или настоящий сигнал). + + + + +Synth_DIV + + + + + +Synth_DIV + + +Делит значение сигнала на какую-либо величину, например, на другой сигнал. Зайдайте invalue1 равным 1, и получите обратную величину для invalue2 в outvalue. Конечно, значение invalue2 не должно обращаться в 0, иначе возникнет ошибка деления на ноль. + + + + +Synth_MULTI_ADD + + + + + +Synth_MULTI_ADD + + +Добавляет случайное количество сигналов. Если вам нужно объединить сигналы четырёх осцилляторов, можете подключить их выходы к одному модулю Synth_MULTI_ADD. Это будет эффективнее использования трёх модулей Synth_ADD. + + + + +Synth_XFADE + + + + + +Synth_XFADE + + +Приглушает два сигнала. Если входное значение -1, будет слышен только левый сигнал, 1 - правый, 0 - оба сигнала слышны с одинаковой громкостью. + +С помощью этого модуля вы сможете убедиться, что сигнал находится в определённом диапазоне. Если у вас было два сигнала из диапазона -1..1, после обработки этим модулем они будут такими же. + + + +Synth_AUTOPANNER + + +Эфект, обратный crossfader. Преобразовывает моносигнал в стерео. Используется автоматически для разделения между правым и левым выходами. Стандартным приложением может быть гитара или другой сольный инструмент. + +Соедините генератор низких частот, источник синусоидального или пилообразного сигнала с inlfo и задайте частоту между 0,1 и 5 Гц для создания обычного эффекта или больше, если хотите создать особый. + + + + + + +Шины + + +Synth_BUS_UPLINK + + + + + +Synth_BUS_UPLINK + + +Входная связь шины. Передает сигналы левого и правого каналов, также имя шины, куда передаются данные. Комбинированный сигнал со всех входных связей с таким именем будет появляться на выходной связи этой шины. + + + +Synth_BUS_DOWNLINK + + + + + +Synth_BUS_DOWNLINK + + +Получает (суммирует) все данные с конкретной шины (с именем, указанным в портешины). + + + + + + + +Задержки + + + + +Synth_DELAY + + + + + +Задерживает входящий сигнал на определённое время. Оно задаётся в секундах и не должно превышать максимальное значние задержки. + +Этот тип задержек не следует использовать в структурах обратной связи, т. к. это непостоянная задержка: вы можете изменить её длительность во время исполнения программы и даже дать ей значение 0. Но в структурах обратной связи собственный вывод используется для вычисления следующих сэмплов, поэтому задержка, которую можно свести к 0 во время синтеза, может привести к нежелательным последствиям. + +Используйте CDELAY в этих настройках. Можно сочетать небольшую постоянную задержку (0,001 секунд) с переменной. + +Также вы можете комбинировать CDELAY и DELAY, чтобы получить переменную длину задержки с минимальным значением в петле обратной связи. Просто убедитесь, что используете CDELAY. + + + + +Synth_CDELAY + + + + +Synth_CDELAY + + +Задерживает входной сигнал на определённое время. Значение должно быть больше 0 для задержки в 0 секунд и дольше. Оно постоянно во время выполнения программы, т.е. не может быть изменено. + +Сокращает время обработки засчёт того, что не выполняет интерполяцию. Полезен в рекурсивных структурах. Описание смотрите ниже (Synth_DELAY). + + + + + + +Оболочки + + + + +Synth_ENVELOPE_ADSR + + + + +Synth_ENVELOPE_ADSR + + +Это классическая ADSR-оболочка; подразумевается, что вы укажете следущее: + + + +active + +Нажата ли нота в данный момент. + + + + +invalue + +Входной сигнал. + + + + +attack + +Время между нажатием клавиши и достижением максимальной амплитуды сигнала (в секундах). + + + + +decay + +Время, необходимое для того, чтобы сигнал с максимальной амплитудой вернулся к некоторому постоянному уровню (в секундах). + + + + +sustain + +Уровень сигнала до того, как пользователь отпустит клавишу. + + + + +release + +Время (в секундах) до полного затухания сигнала после того, как пользователь отпустил клавишу. + + + + +На выходе получится сигнал с заданными параметрами. Если оболочка ASDR закончила работу, установится значение 1. Этоможно ипользовать для обеспечения готовых выходных данных инструмента (при этом после завершения фазы &MIDI; маршрутизатор разрушит объект). + + + + +Synth_PSCALE + + + + +Synth_PSCALE + + +Модуль Synth_PSCALE управляет уровнем громкости пропускаемого сигнала: от 0 (тихо) до 1 (исходная громкость) и опять до 0. Точка наивысшего уровня громкости может меняться в зависимости от pos (получается из Synth_SEQUENCE). + +Пример: установка пика в 0,1 приведёт к тому, что после проигрыша 10% ноты звук достигнет максимума и начнет затухать. + + + + + +Эффекты + + +Synth_FREEVERB + + + + +Synth_FREEVERB + + +Это эффект реверберации. В этой реализации сигнал проходит через модуль и к нему будет добавлен его же эхо. + + +Это значит, что им можно пользоваться и в StereoEffectStack. + + +Входной сигнал должен быть подключен к (inleft, inright), а выходной будет (outleft, outright). + +Параметры: + + + +roomsize + +Размер помещения, в котором эмулируется эхо (диапазон: 0..1, где 1 - самый большой размер помещения). + + + + +damp + +Настраивает фильтр поглощения высоких частот (диапазон: 0..1, при значении 1 частоты сильно поглощаются). + + + + +wet + +Величина сигнала эха (часть исходного сигнала, которая должна быть преобразована фильтрами). + + + + +dry + +Количество звука, для которого создается обычное эхо (или задержка) вместо реверберации (диапазон: 0..1). + + + + + +width + +Величина, добавляемая алгоритмом, чтобы сделать звук более широким в пространстве (диапазон: 0..1). + + + + +mode + +В значении 0 происходит обычная обработка. + + + + + + + +Synth_TREMOLO + + + +Synth_TREMOLO + + +Тремоло модулирует амплитуду в соответствии с волной генератора нихких частот. Вы, наверное, использовали бы синусоидальную волну, но... Зачем же ограничивать себя? Вы получите сильный эффект, пробивающийся сквозь все остальные звуки из-за его широкого динамического диапазона. Тремоло - один из любимых эффектов гитаристов, хотя сейчас он не столь популярен, как это было в 1960-х. + +Сейчас вычисляется как invalue + abs(inlfo). Возможно, будет лучше использовать такую формулу: invalue * (1+inlfo*depth), где depth - параметр со значением из диапазона 0..1. + + + +Synth_FX_CFLANGER + + + +Synth_FX_CFLANGER + + +Эффект задержки, непостоянной во времени, флэнджер. + +Порты модуля: + + + +invalue + +Обрабатываемый сигнал. + + + + +lfo + +Предпочтительно синусоидальная волна, определяющая время задержки: (-1 .. 1). + + + + +mintime + +Минимальное значение задержки внутри модуля (в миллисекундах). Рекомендуемые значения: попробуйте 1 мс. Используйте значения < 1000 мс. + + + + +maxtime + +Максимальное значение задержки внутри модуля (в миллисекундах). Рекомендуемые значения: попробуйте 5 мс. Используйте значения < 1000 мс. + + + + +outvalue + +Полученный сигнал. Для достижения эффекта нужно его смешать с исходным сигналом. + + + + + +Вы можете сделать это основой эффекта хора. + + + + + + + +Фильтры + + +Synth_PITCH_SHIFT + + + +Synth_PITCH_SHIFT + + +Этот эффект сдвига высоты звука меняет частоту входного сигнала, оставляя скорость прежней. Примером приложения,. использующего этот эффект, может быть такое, которое меняет высоту голоса при записи (и проигрывании). + +Параметр speed - это относительная скорость проигрывания сигнала. Поэтому если дать ему значение 2, звук будет выше в два раза (например, входная частота 440 Hz, а на выходе будет 880 Hz). + +Параметр frequency используется для внутреннего переключения между разными частями сигнала. В зависимости от настроек звук будет боле или менее реалистичным. Советую начать со значений 5 или 10. + + + + +Synth_SHELVE_CUTOFF + + + +Synth_SHELVE_CUTOFF + + +Фильтрует все частоты выше заданного порога. + + + + +Synth_BRICKWALL_LIMITER + + + +Synth_BRICKWALL_LIMITER + + +Этот модуль обрезает сигнал таким образом, чтобы он попадал в диапазон [-1;1]. Но он не предотвращает искажение, возникающее при обрезании громкого сигнала. Его можно использовать как эффект (например, чтобы получить слегка обрезанную синусоидальную волну). Звук будет не таким резким, если пропустить сигнал через фильтр низких частот. + + + +Synth_STD_EQUALIZER + + + +Synth_STD_EQUALIZER + + +Это неплохой эквалайзер. Его параметры: + + + +invalue, outvalue + +Сигнал, который фильтрует эквалайзер. + + + + +low + +Как следует менять низкие частоты. Значение задаётся в децибелах. 0 значит, что их не нужно менять, -6 - понижены на 6 дб, +6 - повышены. + + + + +mid + +Как следует менять средние частоты. Значение задаётся в децибелах. (см. low). + + + + +high + +Как следует менять высокие частоты. Значение задаётся в децибелах. (см. low). + + + + +frequency + +Это средняя частота эквалайзера в Гц, средние частоты находятся вокруг этого спктра, нижние - ниже, верхние - выше. Заметьте, что частота не может быть выше половины частоты дискретизации, обычно это 22050 Гц, и ниже 1 Гц. + + + + +q + +Показывает, насколько широк спектр средних частот. Это должно быть положительное число > 0. Значение 1 вполне приемлемо. С увеличением значения спектр становится уже, а с уменьшением - шире. + + + + + + + +Synth_RC + + + +Synth_RC + + +Фильтр всех частот вокруг некоторого пикового значения. Не рекомендуется указывать среднуюю частоту (она все равно не будет обрезана). Этот код довольно старый и, возможно, будет заменен новым фильтром, который будет принимать в качестве параметров понятные значения, а не странные f и b. + +Попробуйте b=5, f=5 или b=10, f=10 или b=15, f=15. + + + + +Synth_MOOG_VCF + + + +Synth_MOOG_VCF + + +Отфильтровывает все частоты, выходящие за предел (фильтр четырехполюсника 24 дб, который фильтрует -24db в октаве выше пороговой частоты), есть возможность настроить резонанс фильтрации, 0 - без резонанса, 4 - собственные колебания. + + + + + + +Midi + Синтезирование + + +Synth_MIDI_TEST + + + +Synth_MIDI_TEST + + +Загружает структуру инструмента из файла и регистрирует себя как midi-выход с &arts; &MIDI;-менеджером. Ноты, посланные на выход, будут создавать звучание инструмента. + + +Настраивать это в &artscontrol; удобнее, чем вручную в &arts-builder;. + + + + + +Synth_SEQUENCE + + + + +Будет циклически проигрывать последовательность нот. Ноты разделены точками с запятой. Например: A-3;C-4;E-4;C-4;. Скорость дана в секундах на ноту, поэтому если вы хотите получить 120 уд./мин., нужно будет указать 0,5 секунд/нота, т. к. 60 секунд/0,5 секунд на ноту = 120 уд./мин. + +Вы можете задать относительную длительность ноты, поставив двоеточие после ноты и записав длительность. A-3:2;C-4:0.5;D-4:0.5;E-4;. + +С помощью модуля Synth_SEQUENCE можно получить дополнительную информацию о проигрываемой ноте. 0 значит, что она только что началась, 1 - закончилась. Эту информацию использует Synth_PSCALE (см. ниже). + + + +Synth_SEQUENCE_FREQ + + + + +Этот модуль работает как Synth_SEQUENCE, только вам нужно указывать не имена нот, а частоты. + + + + + + +Сэмплы + + +Synth_PLAY_WAV + + + + +Synth_PLAY_WAV + + +Проигрывает файлы wav., если у вас есть libaudiofile. Как только модуль будет создан, воспроизведение файла начнётся. + +И остановится, как только он закончится. Параметр скорости может использоваться, чтобы задать скорость воспроизведения, 1,0 - обычная скорость (записи). + + + + + + +Ввод и вывод звука + + +Synth_PLAY + + + + +Synth_PLAY + + + +Вам, скорее всего, не понадобится этот модуль, если, конечно, вы не пишете отдельное приложение. В &artsd; уже включен такой модуль, а создать ещё один Synth_PLAY не удастся. + + +Модуль Synth_PLAY передаст сигнал на звуковую карту. Левый и правый каналы должны содержать нормализованный выход для каналов. Если он не будет помещаться в диапазон -1..1, он будет обрезан. + +Как уже говорилось, может быть только один Synth_PLAY, который будет обращаться к звуковой карте напрямую. Смешивать аудиопотоки перед воспроизведением можно с помощью шин. Модуль Synth_AMAN_PLAY может использоваться для получения выходного сигнала в &artsd;. + +Заметьте, что Synth_PLAY осуществляет синхронизацию всей структуры. Это значит, что: нет Synth_PLAY = нет синхронизации = нет звука. Один объект Synth_PLAY нужен обязательно. + + + + +Synth_RECORD + + + +Synth_RECORD + + + +Вам, скорее всего, не понадобится этот модуль, если, конечно, вы не пишете отдельное приложение. В &artsd; уже включен такой модуль, а создать ещё один Synth_RECORD не удастся. + + +Synth_RECORD записывает сигнал, поступающий со звуковой карты. Левый и правый каналы содержат вход для каналов (между -1 и 1). + +Как уже говорилось, может быть только один модуль Synth_RECORD, который будет иметь прямой доступ к звуковой карте. Для записи сигнала в нескольких местах используются шины. Synth_AMAN_RECORD получает что-то вроде входа в artsd. Чтобы это работало, &artsd; должен быть запущен со использованием двустороннего режима. + + + +Synth_AMAN_PLAY + + + +Synth_AMAN_PLAY + + +Модуль Synth_AMAN_PLAY выводит сигнал. Очень хорошо, если сигнал нормализован (между -1 и 1), но это необязательно. + +С помощью аудиоменеджера модуль определяет, где должен проигрываться сигнал. Управлять аудиоменеджером можно в &artscontrol;. Чтобы управление тало понятнее, назовите как-нибудь сигнал. Это можно сделать, задав title. Ещё одна удобная черта: аудиоменеджер хранит информацию о том, где был воспроизведён сигнал в прошлый раз. Конечно, для этого нужно как-то различать сигналы. Поэтому autoRestoreID должен иметь уникальное значение. + + + +Synth_AMAN_RECORD + + + +Synth_AMAN_RECORD + + +Synth_AMAN_RECORD записывает сигнал со внешнего источника (напрмер, микрофона) в &artsd;. Выходной сигнал будет нормальзован (между -1 и 1). + +С помощью аудиоменеджера модуль определяет, где должен проигрываться сигнал. Управлять аудиоменеджером можно в &artscontrol;. Чтобы управление тало понятнее, назовите как-нибудь сигнал. Это можно сделать, задав title. Ещё одна удобная черта: аудиоменеджер хранит информацию о том, где был воспроизведён сигнал в прошлый раз. Конечно, для этого нужно как-то различать сигналы. Поэтому autoRestoreID должен иметь уникальное значение. + + + +Synth_CAPTURE + + + +Synth_CAPTURE + + +Synth_CAPTURE запишет аудио сигнал в файл .wav на диск. Именем файла всегда будет /tmp/mcop-имя_пользователя/capture.wav + + + + + +Тесты + + +Synth_NIL + + + +Synth_NIL + + +Ничего не делает, но нужен в тестах. + + + + +Synth_DEBUG + + + +Synth_DEBUG + + +Можно использовать для устранения ошибок. Выводит значение сигнала (invalue) через определённый интервал (1 секунда) и указанный вами комментарий. Таким образом вы сможете отследить сигналы и их диапазоны. + + + +Synth_MIDI_DEBUG + + + +Synth_MIDI_DEBUG + + +Нужен, чтобы посмотреть, как действительно события &MIDI; попадают в &arts;. + +Во время работы MIDI_DEBUG &artsserver; будет печатать такие строки: + +201 100753.837585 on 0 42 127 + +202 101323.128355 off 0 42 + +В первой строке говорится, что прошло 00753 мс (это 100 секунд) с момента запуска MIDI_DEBUG, на канал 0 поступило событие &MIDI;. Его громкость 127 (максимально возможная). В следущей строке событие освобождается. + + + +Synth_DATA + + + +Synth_DATA + + +Создаёт сигнал с постоянным числом. + + + + + +Осцилляция и модуляция + + +Synth_FREQUENCY + + + +Synth_FREQUENCY + + +Осцилляторам &arts; нужна не частота как входной параметр, а положение в волне. Она должна быть между 0 и 1 для отображения стандартного объекта Synth_WAVE_SIN в диапазон 0..2*Пи. Synth_FREQUENCY используется для генерации колебательных значений из частоты. + + + +Synth_FM_SOURCE + + + +Synth_FM_SOURCE + + +Используется для модуляции частоты. Укажите частоту ввода; на ввод модулятора подайте сигнал. Уровень модуляции задайте как, скажем, 0.3. Частота будет модулироваться. Просто попробуйте. + +Замечательно работает вместе с осцилляорами Synth_WAVE_SIN. + + + + + +Формы сигналов + + +Synth_WAVE_SIN + + + +Synth_WAVE_SIN + + +Синусоидальный сигнал. На вход ставится pos signal из Synth_FREQUENCY или Synth_FM_SOURCE, а на выходе получается синусоидальный сигнал. Pos signal указывает на позицию в волне, а диапазон 0..1 отображается в 0..2*Пи. + + + + +Synth_WAVE_TRI + + + +Synth_WAVE_TRI + + +Треугольный сигнал. На вход подается pos signal из Synth_FREQUENCY или Synth_FM_SOURCE, а на выходе получаются треугольные колебания. Pos signal указывает на позицию в волне, а диапазон 0..1 отображается в 0..2*Пи. Будьте внимательны, входной сигнал долженбыть в диапазоне 0..1, чтобы получить какой-нибудь результат. + + + +Synth_NOISE + + + +Synth_NOISE + + +Генератор шумов. Генерирует случайный сигнал в пределах -1 и 1. + + + + +Synth_WAVE_SQUARE + + + +Synth_WAVE_SQUARE + + +Прямоугольный сигнал. На вход ставится pos signal из Synth_FREQUENCY или Synth_FM_SOURCE, а на выходе получаются прямоугольные колебания. Pos signal указывает на позицию в волне, а диапазон 0..1 отображается в 0..2*Пи. Будьте внимательны, входной сигнал должен быть в диапазоне 0..1, чтобы получить какой-нибудь результат. + + + +Synth_WAVE_SOFTSAW + + + +Synth_WAVE_SOFTSAW + + +Пилообразный сигнал, похожий на сигнал Synth_WAVE_TRI. На вход ставится pos signal из Synth_FREQUENCY или Synth_FM_SOURCE, а на выходе получаются зубчатые колебания. Pos signal указывает на позицию в волне, а диапазон 0..1 отображается в 0..2*Пи. Будьте внимательны, входной сигнал должен быть в диапазоне 0..1, чтобы получить какой-нибудь результат. + + + +Synth_WAVE_PULSE + + + +Synth_WAVE_PULSE + + +Импульсные колебания. Очень похожи на прямоугольные сигналы (Synth_WAVE_RECT), но для них можно задать соотношение dutycycle. На вход дается pos signal из Synth_FREQUENCY или Synth_FM_SOURCE, а на выходе получаются импульсы. Pos signal указывает на позицию в волне, а диапазон 0..1 отображается в 0..2*Пи. Будьте внимательны, входной сигнал должен быть в диапазоне 0..1, чтобы получить какой-нибудь результат. + + + +Прочее + + +Synth_COMPRESSOR + + + + + +Сокращает динамический диапазон сигнала. Компрессоры полезны, например, для нормализации громкости микрофона. + +Как только входной сигнал достигает определённого уровня (порога), сигнал сжимается. Это достигается умножением всего, что выше порога на коэффициент - число от 0 до 1. И весь сигнал умножается на выходной коэффициент. + +Параметры attack и release задерживают начало и конец сжатия. Используйте их, если хотите, например, слышать громкое вступление ударных. Значения параметров задаются в миллисекундах. Со значением 0 может усилиться шум. + + + + + + +Описание визуальных модулей + +Их описание пока не готово. + + + diff --git a/tde-i18n-ru/docs/kdemultimedia/artsbuilder/porting.docbook b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/porting.docbook new file mode 100644 index 00000000000..b133390838f --- /dev/null +++ b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/porting.docbook @@ -0,0 +1,52 @@ + + + +Доработка приложений для их использования с &arts; + + +Использование &artsdsp; + +Программа &artsdsp;, описанная выше, позволяет большинству звуковых приложений, работающих с устройствами напрямую,работать и с &arts;. Приложения, использующие Enlightenment Sound Daemon (esd), в большинстве случаев будут работать, если запускать esd через &artsdsp;. + +Это неплохой способ адаптации уже существующих приложений в &kde;. Однако такие приложения не могут использовать все ресурсы &arts;, например, модули или потоки мультимедиа (кроме цифрового звука). Если приложение не просто проигрывает звуковые файлы, есть смысл добавить в приложение поддержку &arts;. + +Использование &arts; подразумевает, что само приложение может быть не обременено функциональностью: можно использовать &arts;, например, для работы с кодеками разных форматов мультимедиа и управления звуковым оборудованием. + + + + +Добавление полной поддержки &arts; + +В &arts; есть множество различных программынх интерфейсов (API). Вы можете выбрать любой, в зависимости от типа используемого потока (звук, &MIDI;, &CD; и т. д.), особенностей API и языка, на котором написано приложение. В большинстве случаев основным фактором явлются особенности API. + +Для обеспечения переносимости на другие платформы приложениям, которые должны работать не только в &kde;, недостаточно &arts;. Использование парадигмы модулей - неплохой способ поддержки различных сред мультимедиа. Документирование (важно особенно для закрытых программ) и открытость API для модулей поможет разработчикам добавлять поддержку модулей &arts;. + + + + + diff --git a/tde-i18n-ru/docs/kdemultimedia/artsbuilder/references.docbook b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/references.docbook new file mode 100644 index 00000000000..8d93e9fca2c --- /dev/null +++ b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/references.docbook @@ -0,0 +1,61 @@ + + + +Ссылки + + + + +http://multimedia.kde.org + +Самый важный сайт, содержащий информацию о работе с мультимедиа в &kde;. + + + + +http://www.arts-project.org + +Это домашняя страница проекта &arts;. + + + + +&kde; 2.0 Разработка + +14 глава этой книги посвящена мультимедиа, в том числе &arts;. Прочесть книгу вы можете в напечатанном виде или в интернете с примечаниями на сайте http://www.andamooka.org. + + + + + +http://sound.condorow.net + +На этом сайте вы найдёте много хороших приложений для прослушивания звуковых файлов, в том числе &MIDI;, для &Linux;. + + + + + + diff --git a/tde-i18n-ru/docs/kdemultimedia/artsbuilder/tools.docbook b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/tools.docbook new file mode 100644 index 00000000000..2cdda978057 --- /dev/null +++ b/tde-i18n-ru/docs/kdemultimedia/artsbuilder/tools.docbook @@ -0,0 +1,1003 @@ + + + +Инструменты &arts; + +Это набор управляющих &arts; модулей. Чтобы пользоваться &arts; эффективно, нужно уметь ими пользоваться. В этом разделе описывается каждый из модулей и параметры их команд. + + +&kcontrol; + +Если &arts; запущен в &kde;, &kcontrolcenter; размещает его настройками в категории Звук. Вы можете связать звуки с различными событиями менеджера окон и &kde; в категории ЗвукСистемные оповещения. О настройках панели управления читайте в справочнике по &kcontrol;. + + + + +&artsd; + +&artsd; управляет доступом к звуковому оборудованию, это один из сервисов &arts;. Он позволяет разным приложениям одновременно посылать запросы серверу, где они будут накладываться друг на друга и воспроизводиться. Без единого звукового сервера одно приложение, использующее звуковое устройство, будет блокировать запросы остальных. + +Для работы &arts; нужно, чтобы была запущена только одна копия модуля &artsd;. Если это указано в панели &kcontrol; Звуковая подсистема, &artsd; будет запускаться автоматически при входе в систему. + +Аргументами программы могут быть: + + + +artsd + + + + +Задайте используемую частоту дискретизации. + + + + + + +Справка по использованию команды. + + + + + + +Использовать работу в сети. + + + + + + + +Задать TCP порт (подразумевает указание и ). + + + + + + +Открытый доступ без аутентификации (опасно). + + + + + + +Включить режим двустороннего ввода-вывода. + + + + + +Укажите аудиоустройство (обычно /dev/dsp). + + + + + + +Установите количество блоков. + + + + + + +Установите размер блока в байтах. + + + + + + +Установите время отключения сервера при бездействии в секундах. Значение ноль отменяет автоматическое отключение. + + + + + + +Укажите имя приложения, которое будет использоваться для сообщений об ошибках, предостережениях и отображения информации. Если вы используете KDE, это может делать artsmessage. + + + + + + +Увеличивает размер сетевого буфера до значения, подходящего при использовании локальной сети 10 мбит/. То же самое, что и параметр -w 5 (смотрите ниже). + + + + + +При использовании artsd в сети обычно стоит использовать сетевой буфер большего размера, чтобы избежать пропадания звука. ARts предоставляет минимальный буфер для приложений. Без указания данного параметра за минимальный размер буфера берется размер блока, умноженный на число блоков (см. выше). Данный же параметр позволяет увеличить стандартный размер с коэффициентом число. + + + + + + +Установите уровень вывода служебной информации: - 3 (нет), 2 (предупреждения), 1 (информация), 0 (отладка). + + + + + + +Показать версию. + + + + + +В большинстве случаев достаточно просто запустить &artsd;. + + + +&artswrapper; + +Чтобы добиться хорошего времени отклика, &artsd; запускается как процесс реального времени (на тех платформах, где это возможно). Для этого требуются права пользователя root, поэтому, чтобы снизить риски, связанные с безопасностью, &artsd; можно запускать с помощью небольшой программы &artswrapper;, которая, будучи запущенной от root, получает приоритет выполнения в реальном времени и запускает &artsd; от непривелигированного пользователя (не root). + +Если для этой небольшой программы вы сделаете UID root, вероятнее всего, качество воспроизведения будет улучшено, так как должны исчезнуть задержки при воспроизведении. Однако при этом увеличивается риск того, что ошибка в программе или недобросовестный пользователь могут нарушить работу всей системы или как-то иначе повредить ее работе. Кроме того, на машине, которой пользуются несколько человек одновременно, приоритет реального времени для сервера может помещать пользователям, которые занимаются какой-то серьезной работой. + + + + +&artsshell; + +&artsshell; выполняет различные функции, связанные со звуковым сервером. Мы предполагаем дополнить модуль новыми командами в будущем (об этом смотрите в комментариях кода). + +Формат команды: + + + +artsshell suspendstatus terminate autosuspend secs networkbuffers n volume [volume] stereoeffect options + +artsshell [параметры] команда [параметры команды] + +Поддерживаются следущие параметры: + + + + + + +Подавлять весь вывод. + + + + + + +Справка по использованию команды. + + + + + +Поддерживаются следущие команды: + + + + + + +Отключить звуковой сервер. + + + + + + +Показать информацию о состоянии сервера. + + + + + + +Отключить звуковой сервер. Если какие-то приложения его используют, они сообщат об ошибках. + + + + + секунды + +Установите время ожидания в секундах. Если звуковой сервер будет бездействовать это количество времени, он отключится. Значение ноль отменяет автоотключение. + + + + + число + +Размер сетевых буферов вычисляется как стандартный размер буфера по умолчанию, умноженный на число. + + + + + [громкость] + +Установите громкость аудио вывода звуковым сервером. Аргумент громкость - это число с плавающей точкой. Если команда будет без парамеров, отобразится текущий уровень громкости. + + + + + + +Список всех модулей стереоэффектов. + + + + + название + +Помещает стререоэффект в стек и возвращает идентификатор, с помощью которого можно будет извлечь этот эффект. Эффект может быть помещён в начало или конец стека. + + + + + идентификатор + +Извлекает стереоэффект с указанным идентификатором из стека. + + + + + + + + +<application +>artsplay</application +> + +artsplay проигрывает звуковые файлы. У команды может быть только один аргумент - имя файла, который посылается звуковому серверу. Типом этого файла может быть wav, au или другой распространённый. Этот модуль полезен для тестирования активности звукового сервера. Запустив две команды параллельно или через малый промежуток времени, вы увидите, как звуковой сервер накладывает несколько сигналов друг на друга. + + + + +<application +>artsdsp</application +> + +Звуковой сервер поддерживает только совместимые с &arts; приложения. Многие приложения пытаются обратиться к звуковой карте напрямую, тогда команда &artsdsp; позволяет, не внося в них исправления, работать с &arts;. + +Если приложение запущено под &artsdsp;, все его попытки обратиться к устройству /dev/dsp перехватываются и преобразовываются в вызовы &arts; API. Поскольку эмуляция устройства несовершенна, большинство приложений работает, хотя и замечается увеличение задержки и снижается быстродействие. + +Формат команды &artsdsp;: + + +artsdsp [параметры] аргументы приложения + +Возможны следущие параметры: + + + + +, + +Вызов краткой справки. + + + + = имя + +Испульзуйте имя для определения проигрывателя artsd. + + + + + + + +Эмулировать отображение в память (например, для Quake). + + + + + + +Вывести параметры. + + + + + +Пример вызова: + + +artsdsp realplay song.mp3 + + +Некоторые приложения работают лучше, если задан параметр . Конечно, эмулируются не все характеристики устройства, но большинство работает. Если вы обнаружили неработающее приложение, отправьте подробный отчёт об ошибке, чтобы разработчики смогли это исправить. Не забывайте о встроенной поддержке &arts;. Если ваше любимое приложение не поддерживается, попросите разработчиков его добавить. + + + + +<application +>artscat</application +> + +Это простой модуль, отправляющий необработанные данные звуковому серверу. Вам необходимо только указать формат данных (частоту дискретизации, размер сэмплов и количество каналов). Вы, скорее всего, не будете его часто использовать, но он удобен для тестирования. Синтаксис команды: + + + +artscat [ параметры ] [ имя файла ] + +Если имя файла не указано, чтение идёт из потока стандартного ввода. Поддерживаются следущие параметры: + + + + частота дискретизации + +Установите частоту дискретизации. + + + + + биты + +Установите размер сэмпла (8 или 16). + + + + + каналы + +Установите количество каналов (1 или 2). + + + + + + +Показать использование команды и выйти. + + + + + + + +&artscontrol; + +Графический модуль для выполнения задач, связанных со звуковым сервером. По умолчанию отображаются два индикатора уровня громкости и ползунок для регулировки громкости. В меню Вид вы можете выбрать и другие функции: + + + + +Показать область БПФ + +Открывает окно с анализатором спектра в реальном времени. + + + + +Показать менеджера аудио + +Показывает активные источники звука и позволяет подключить их к любой доступной шине. + + + + +Показать состояние aRts + +С помощью этого модуля вы будете знать, активен ли сервер и обладает ли он приоритетом работы в реальном времени. Он также показывает, сколько времени осталось для автоматического отключения сервера, и позволяет вам немедленно его отключить вручную. + + + + +Показать midi-менеджера + +Отображает активные входы и выходы &MIDI; и позволяет их подключать друг к другу. + + + + +FreeVerb + +Подключает эффект эха к стеку &arts; и позволяет вам графически изменять параметры эффекта. + + + + +Указатель громкости в цифровом виде + +Показывает индикаторы громкости в главном окне в форме цветных индикаторов вместо строк состояния. + + + + + + + + +<application +>artsc-config</application +> + +Этот модуль поможет разработчикам в использовании &arts; C API. Он выбирает подходящие параметры компилятора и компоновщика при компиляции и компоновке кода с помощью &arts;. Желательно его использовать в сборочных файлах для обеспечения переносимости. Допустимы три параметра: + + + + + +Показывает необходимые компилятору флаги при использовании &arts; C API. + + + + + + +Показывает необходимые компоновщику флаги при компоновке с использованием &arts; C API. + + + +--version + +Показывает версию artsc-config. + + + + +Пример вывода команды: + +% artsc-config +-I/usr/local/kde2/include/artsc +% artsc-config +-L/usr/local/kde2/lib -ldl -lartsc -DPIC -fPIC -lpthread +% artsc-config +0.9.5 + + +Вы можете использовать этот модуль в сборочном файле по такому правилу: + +artsc: artsc.c + gcc `artsc-config --cflags` -o artsc artsc.c `artsc-config --libs` + + + + + +&mcopidl; + +&mcopidl; - это компилятор &IDL;-файлов для &MCOP;, (Multimedia Communication Protocol, протокол связи мультимедиа-модулей), использующийся в &arts;. Интерфейсы &arts; описаны в &IDL; (Interface Definition Language, язык определения интерфейса). Модуль &mcopidl; считает файл &IDL; входом и генерирует заголовочный и исходный файлы C++ для создания класса интерфейса. Синтаксис команды: + + + +mcopidl [ параметры ] имя файла + +Допустимые параметры: + + + каталог + +Поиск в каталоге каталог включаемых файлов (include). + + + + + имя + +Исключает структуру, интерфейс или перечисляемый тип с именем имя во время генерации кода. + + + + + + +Создайте также файлы .mcoptype/.mcopclass, содержащие информацию о типах для файла &IDL;. + + + + +Болееподробно &MCOP; и &IDL; рассматриваются в разделе Интерфейсы и &IDL;. + + + + -- cgit v1.2.1