diff options
author | Timothy Pearson <kb9vqf@pearsoncomputing.net> | 2011-12-03 11:05:10 -0600 |
---|---|---|
committer | Timothy Pearson <kb9vqf@pearsoncomputing.net> | 2011-12-03 11:05:10 -0600 |
commit | f7e7a923aca8be643f9ae6f7252f9fb27b3d2c3b (patch) | |
tree | 1f78ef53b206c6b4e4efc88c4849aa9f686a094d /tde-i18n-ru/docs/tdemultimedia | |
parent | 85ca18776aa487b06b9d5ab7459b8f837ba637f3 (diff) | |
download | tde-i18n-f7e7a923aca8be643f9ae6f7252f9fb27b3d2c3b.tar.gz tde-i18n-f7e7a923aca8be643f9ae6f7252f9fb27b3d2c3b.zip |
Second part of prior commit
Diffstat (limited to 'tde-i18n-ru/docs/tdemultimedia')
29 files changed, 14387 insertions, 0 deletions
diff --git a/tde-i18n-ru/docs/tdemultimedia/Makefile.am b/tde-i18n-ru/docs/tdemultimedia/Makefile.am new file mode 100644 index 00000000000..e8ff7c7b1b8 --- /dev/null +++ b/tde-i18n-ru/docs/tdemultimedia/Makefile.am @@ -0,0 +1,4 @@ +KDE_LANG = ru +SUBDIRS = $(AUTODIRS) +KDE_DOCS = AUTO +KDE_MANS = AUTO diff --git a/tde-i18n-ru/docs/tdemultimedia/Makefile.in b/tde-i18n-ru/docs/tdemultimedia/Makefile.in new file mode 100644 index 00000000000..7a0085caef0 --- /dev/null +++ b/tde-i18n-ru/docs/tdemultimedia/Makefile.in @@ -0,0 +1,587 @@ +# 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/tdemultimedia +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@ +tdeinitdir = @tdeinitdir@ +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 =. kioslave artsbuilder kmid +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/tdemultimedia/Makefile'; \ +#>- cd $(top_srcdir) && \ +#>- $(AUTOMAKE) --gnu docs/tdemultimedia/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/tdemultimedia/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu docs/tdemultimedia/Makefile + cd $(top_srcdir) && perl ../scripts/admin/am_edit -p../scripts/admin docs/tdemultimedia/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) + @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 + +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-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: + +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=Makefile.in Makefile.am + +#>+ 2 +docs-am: + +#>+ 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/tdemultimedia/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu docs/tdemultimedia/Makefile + cd $(top_srcdir) && perl ../scripts/admin/am_edit -p../scripts/admin docs/tdemultimedia/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/tdemultimedia/artsbuilder/Makefile.am b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/Makefile.am new file mode 100644 index 00000000000..e8ff7c7b1b8 --- /dev/null +++ b/tde-i18n-ru/docs/tdemultimedia/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/tdemultimedia/artsbuilder/Makefile.in b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/Makefile.in new file mode 100644 index 00000000000..4e0601c861b --- /dev/null +++ b/tde-i18n-ru/docs/tdemultimedia/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/tdemultimedia/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@ +tdeinitdir = @tdeinitdir@ +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/tdemultimedia/artsbuilder/Makefile'; \ +#>- cd $(top_srcdir) && \ +#>- $(AUTOMAKE) --gnu docs/tdemultimedia/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/tdemultimedia/artsbuilder/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu docs/tdemultimedia/artsbuilder/Makefile + cd $(top_srcdir) && perl ../scripts/admin/am_edit -p../scripts/admin docs/tdemultimedia/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/tdemultimedia/artsbuilder/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu docs/tdemultimedia/artsbuilder/Makefile + cd $(top_srcdir) && perl ../scripts/admin/am_edit -p../scripts/admin docs/tdemultimedia/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/tdemultimedia/artsbuilder/apis.docbook b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/apis.docbook new file mode 100644 index 00000000000..d5282cf74a0 --- /dev/null +++ b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/apis.docbook @@ -0,0 +1,434 @@ +<!-- <?xml version="1.0" ?> +<!DOCTYPE chapter PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN" "dtd/kdex.dtd"> +To validate or process this file as a standalone document, uncomment +this prolog. Be sure to comment it out again when you are done --> + +<chapter id="arts-apis"> +<title +>API интерфейс &arts;</title> + +<sect1 id="api-overview"> +<title +>Обзор</title> +<para +>aRts - это не просто какая-то программа, в нём поддерживается API для выполнения самых разных задач. В этом разделе будет рассказано о возможностях взаимодействия aRts с другими программами с помощью API. </para> + +<para +>Надо сразу отметить, что большинство возможностей API <emphasis +>не зависят</emphasis +>, от языка реализации и места вызова, поскольку они описаны на <emphasis +>mcopidl</emphasis +>. Вы можете использовать сервисы, которые они предлагают, на любом языке программирования, и не волноваться, работаете ли вы с локальным или с удалённым объектом. Вот список основных объектов: </para> + + +<variablelist> +<varlistentry> +<term +>core.idl</term> + <listitem +><para +>Основные определения из MCOP, например протокол, определения объектов, трейдер, менеджер потоков и т.д. </para +></listitem> + +</varlistentry> + +<varlistentry> +<term +>artsflow.idl</term> + + <listitem +><para +>Содержит менеджер, управляющий соединениями аудио потоков, определение <emphasis +>Arts::SynthModule</emphasis +>, базы любого интерфейса с потоками, а также несколько полезных аудио объектов. </para +></listitem> + +</varlistentry> + +<varlistentry> +<term +>kmedia2.idl</term> + + + <listitem +><para +>Здесь определен объект, который может проигрывать звук, <emphasis +>Arts::PlayObject</emphasis +>. Медиаплееры, наподобие noatun, смогут воспроизводить любой формат, для которого определён PlayObject. На этой базе уже реализованы форматы mp3, mpg video, midi, wav... </para +></listitem> + +</varlistentry> + +<varlistentry> +<term +>soundserver.idl</term> + + <listitem +><para +>Интерфейс с звуковым сервером artsd. Он называется <emphasis +>Arts::SoundServer</emphasis +>. Он позволяет получать потоки из сети, воспроизводить звук, создавать новые объекты aRts и т.д. Поддержка сети осуществляется прозрачным образом благодаря использованию MCOP (как и для всего прочего здесь). </para +></listitem> + +</varlistentry> + +<varlistentry> +<term +>artsbuilder.idl</term> + <listitem +><para +>Этот модуль определяет основные функции управления синтезом звука, совмещая простые и более сложные объекты, за счёт составления из них структур. Это определяет основной интерфейс <emphasis +>Arts::StructureDesc</emphasis +>, <emphasis +>Arts::ModuleDesc</emphasis +> и <emphasis +>Arts::PortDesc</emphasis +>, которые содержат описания структур, модулей и портов. Также есть возможность получить "живую сеть объектов" из этих описаний соединений и значений, используя factory. </para +></listitem> + +</varlistentry> + +<varlistentry> +<term +>artsmidi.idl</term> + + <listitem +><para +>Этот модуль определяет основные функции midi, например объекты, которые создают события midi, описание события midi и <emphasis +>Arts::MidiManager</emphasis +> для связи "производителей" и "потребителей" событий midi и т. д. Также поддерживается прозрачная работа в сети. </para +></listitem> + +</varlistentry> + +<varlistentry> +<term +>artsmodules.idl</term> + <listitem +><para +>Дополнительные фильтры, эффекты, задержки и т.д. Все они требуются для построения сложных инструментов и объектов обработки звука, которые выстраиваются из более простых объектов как из кирпичиков. </para +></listitem> + +</varlistentry> + +<varlistentry> +<term +>artsgui.idl</term> + + <listitem +><para +>Базовые типы для визуальных объектов. Из базового типа <emphasis +> Arts::Widget</emphasis +> происходят все модули графического интерфейса. Это позволяет создавать визуальные редакторы, независимые от конкретного набора библиотек. Также визуальные объекты могут служить для установки параметров напрямую через конкретный сигнал. (например значение ползунка соединено с фильтром обрезания частот). Также поддерживается прозрачная работа в сети. </para +></listitem> + +</varlistentry> + +</variablelist> +<para +>aRts написан на IDL везде, где это только возможно. С другой стороны есть некоторые <emphasis +>языкозависимые</emphasis +> API на C++ или C. Желательно использовать только интерфейсы IDL, а другие API только при необходимости. Вот список языкозависимых API: </para> + +<variablelist> + +<varlistentry> +<term +>KNotify, KAudioPlayer (включено в libtdecore)</term> + + <listitem +><para +>Это API из KDE для случая, когда просто нужно проиграть звуковой буфер. Эта функция на C++ оптимизирована под Qt/KDE и очень простая. </para +></listitem> + +</varlistentry> + +<varlistentry> +<term +>libartsc</term> + <listitem +><para +>Интерфейс C для звукового сервера. Используется для портирования программ. </para +></listitem> + +</varlistentry> + +<varlistentry> +<term +>libmcop</term> + + <listitem +><para +>Вот где проявляется магия MCOP. Библиотека содержит основные вещи для написания приложения MCOP, диспетчер, таймеры, а также внутренние классы для обеспечения протокола MCOP. </para +></listitem> + +</varlistentry> + +<varlistentry> +<term +>libartsflow</term> + <listitem +><para +>Вместе с определением artsflow.idl, есть некоторые утилиты, например конвертация частоты дискретизации. </para +></listitem> + +</varlistentry> + +<varlistentry> +<term +>libqiomanager</term> + + <listitem +><para +>Интеграция MCOP в цикл событий Qt, нужно при написании приложений Qt с использованием MCOP. </para +></listitem> + +</varlistentry> + +</variablelist> + + + +</sect1> +<sect1 id="knotify"> +<title +>knotify</title> +<para +>В процессе написания </para> +</sect1> + +<sect1 id="kaudioplayer"> +<title +>kaudioplayer</title> +<para +>В процессе написания </para> +</sect1> + +<sect1 id="libkmid"> +<title +>libkmid</title> +<para +>В процессе написания </para> +</sect1> + +<sect1 id="kmedia2"> +<title +>kmedia2</title> +<para +>В процессе написания </para> +</sect1> + +<sect1 id="soundserver"> +<title +>sound server</title> +<para +>В процессе написания </para> +</sect1> + +<sect1 id="artsflow"> +<title +>artsflow</title> +<para +>В процессе написания </para> +</sect1> + +<sect1 id="capi"> +<title +><acronym +>API</acronym +> для языка С</title> + +<sect2 id="capiintro"> +<title +>Введение</title> + +<para +>C <acronym +>API</acronym +> &arts; создано для упрощения написания и портирования приложений C в интерфейс звукового сервера &arts;. Это содержит функции потоков (отправка потоков в <application +>artsd</application +>), как блокирующих (синхронных), так и асинхронных.Для многих приложений вы должны просто заменить несколько системных вызовов, совместимых с вашим звуковым устройством, на соответствующие вызовы &arts;.</para> + +<para +>Для пробы я портировал две программы - <application +>mpg123</application +> и <application +>quake</application +>. Патчи для них можно взять <ulink url="http://space.twc.de/~stefan/kde/download/artsc-patches.tar.gz" +>здесь</ulink +>. Вы можете также отправлять ваши собственные патчи создателям &arts; или мультимедиа программ, чтобы они могли бы встроить поддержку &arts; в код их программ.</para> + +</sect2> + +<sect2 id="capiwalkthru"> +<title +>Краткое обозрение</title> + +<para +>Отправка звука серверу через <acronym +>API</acronym +> делается очень просто:</para> +<procedure> +<step +><para +>подключите заголовочный файл: <userinput +>#include <artsc.h></userinput +></para +></step> +<step +><para +>инициализируйте <acronym +>API</acronym +> функцией <function +>arts_init()</function +></para +></step> +<step +><para +>создайте поток <function +>arts_play_stream()</function +></para +></step> +<step +><para +>укажите требуемые параметры с помощью <function +>arts_stream_set()</function +></para +></step> +<step +><para +>отправьте аудио данные в поток функцией <function +>arts_write()</function +></para +></step> +<step +><para +>закройте поток: <function +>arts_close_stream()</function +></para +></step> +<step +><para +>освободите память, выделенную для <acronym +>API</acronym +>: <function +>arts_free()</function +></para +></step> +</procedure> + +<para +>Вот иллюстрация:</para> + +<programlisting +>#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; +} +</programlisting> +</sect2> + +<sect2 id="capiartscconfig"> +<title +>Компиляция и сборка: <application +>artsc-config</application +></title> + +<para +>Для упрощения сборки программ, использующих C <acronym +>API</acronym +> &arts;, используется утилита <application +>artsc-config</application +>, которая самостоятельно определяет, функции каких библиотек вам нужно импортировать, где находятся заголовочные файлы. Она вызывается так:</para> + +<screen +><userinput +><command +>artsc-config</command +> <option +>--libs</option +></userinput +> +</screen> + +<para +>для нахождения библиотек и так: </para> + +<screen +><userinput +><command +>artsc-config</command +> <option +>--cflags</option +></userinput +> +</screen> + +<para +>для нахождения дополнительных флагов компилятора C. Так, пример, описанный выше, можно скомпилировать из командной строки:</para> + +<screen +><userinput +><command +>cc</command +> <option +>-o artsctest artsctest.c `artsc-config --cflags` `artsc-config --libs`</option +></userinput> + +<userinput +><command +>cc</command +> <option +>-o artsctest</option +> <option +>artsctest.c</option +> <option +>`artsc-config --cflags`</option +> <option +>`artsc-config --libs`</option +></userinput +> +</screen> + +</sect2> + +<sect2 id="c-api-reference"> +<title +>Библиотеки</title> + +<para +>Ещё не готово (см. информацию в artsc.h) </para> + +</sect2> + +</sect1> +</chapter> diff --git a/tde-i18n-ru/docs/tdemultimedia/artsbuilder/artsbuilder.docbook b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/artsbuilder.docbook new file mode 100644 index 00000000000..0098a4d12f4 --- /dev/null +++ b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/artsbuilder.docbook @@ -0,0 +1,917 @@ +<chapter id="artsbuilder"> +<title +>&arts-builder;</title> + +<sect1 id="overview"> +<title +>Описание</title> + +<para +>Перед запуском &arts-builder; вам нужно запустить звуковой сервер (&artsd;). Обычно, если используется &kde; 2.1, это должно быть уже сделано. Если нет, вы можете настроить автоматический запуск звукового сервера в Центре управления в <menuchoice +><guilabel +>Звук</guilabel +><guilabel +>Звуковой сервер</guilabel +></menuchoice +>. </para> + +<para +>Когда вы запускаете &arts;, программа всегда запускает небольшие модули. &arts-builder; - это инструмент для создания новых структур из небольших связанных модулей. Вы просто выбираете модули внутри решётки. Для этого выбирайте их из меню <guimenu +>Модули</guimenu +> и затем укажите место на серо-зелёном фоне. </para> + +<para +>Модули обычно имеют порты (куда обычно аудио сигналы входят или выходят).Для связывания двух портов, укажите на первый, который становится оранжевым, и затем укажите на второй. Связывать вы можете только входные порты (верхняя часть модуля) с выходными (нижняя часть модуля). Если вы желаете установить постоянный сигнал в порт (или отключить его), тогда сделайте двойной щелчок мышью над портом. </para> + +</sect1> + +<sect1 id="artsbuilder-tutorial"> +<title +>Руководство</title> + +<sect2 id="step-1"> +<title +>1-й шаг</title> + +<para +>Запуск &arts-builder;. </para> + +<para +>Вам нужен модуль Synth_AMAN_PLAY для прослушивания результата вашего творчества. Для установки модуля Synth_AMAN_PLAY выберите <menuchoice +><guimenu +>Модули</guimenu +> <guisubmenu +>Синтез</guisubmenu +> <guisubmenu +>Звуковой ввод/вывод</guisubmenu +> <guisubmenu +>Synth_AMAN_PLAY</guisubmenu +></menuchoice +> и указать на свободное место для модуля. Расположите его ниже пятой линии, потому как мы добавим ещё что-нибудь выше. </para> + +<para +>Модуль имеет параметр <parameter +>title</parameter +> (крайний левый порт), и <parameter +>autoRestoreID</parameter +> (рядом с крайним левым портом) для поиска. Для заполнения их, сделайте двойной щелчок над этими портами, выберите значение и тип <userinput +>tutorial</userinput +> в поле ввода. Нажмите <guibutton +>OK</guibutton +> для завершения. </para> + +<para +>Выберите <menuchoice +><guimenu +>Файл</guimenu +><guimenuitem +>Выполнить структуру</guimenuitem +> </menuchoice +>. Вы абсолютно ничего не услышите.Модулю воспроизведения нужно что-нибудь ещё передать на вход. Если вы слышали некоторое время тишину, нажмите на <guibutton +>Да</guibutton +> и переходите ко второму шагу. </para> +</sect2> + +<sect2 id="step-2"> +<title +>2-й шаг</title> + +<para +>Создайте модуль Synth_WAVE_SIN (из меню <menuchoice +> <guimenu +>Модули</guimenu +> <guimenuitem +>Синтез</guimenuitem +> <guimenuitem +>Волновые</guimenuitem +> </menuchoice +>) и установите его выше модуля Synth_AMAN_PLAY. (Оставьте одну строку между ними). </para> + +<para +>Как вы видите, этот модуль что-то выдаёт, но требует <guilabel +>pos</guilabel +> в качестве входа. Сначала давайте установим выход на колонки.Нажмите на порт <guilabel +>out</guilabel +> в модуле Synth_WAVE_SIN и затем на порт <guilabel +>left</guilabel +> в модуле Synth_AMAN_PLAY.Теперь у нас соединены два модуля. </para> + +<para +>Все осцилляторы в &arts; не требуют частоту на входе, нужна позиция в волне. Позиция должна быть между 0 и 1, которые отображаются для стандартного объекта Synth_WAVE_SIN на область 0..2*пи. Для получения значений осцилляций из частоты используются модули Synth_FREQUENCY. </para> + +<para +>Установите модуль Synth_FREQUENCY (с помощью <menuchoice +> <guimenu +>Модули</guimenu +> <guimenu +>Синтез</guimenu +> <guimenu +>Oscillation & Modulation</guimenu +> </menuchoice +>) и соедините его вывод <quote +>pos</quote +> со входом <quote +>pos</quote +> вашего Synth_WAVE_SIN. Выставите частотному генератору значение 440. </para> + + +<para +>Выберите <menuchoice +><guimenu +>Файл</guimenu +><guimenuitem +>Исполнить структуру</guimenuitem +></menuchoice +>. Вы услышите частоту 440 Гц на одной из ваших колонок. Если вы услышали, то нажимайте на кнопку <guibutton +>Да</guibutton +> и переходите к 3-ему шагу. </para> + +</sect2> + +<sect2 id="step-3"> +<title +>3-й шаг</title> + +<para +>Было бы хорошо услышать частоту в обеих колонках. Для этого подключите правый канал Synth_PLAY к выходу Synth_WAVE_SIN. </para> + +<para +>Создайте объект Synth_SEQUENCE (из <menuchoice +><guimenu +>Модули</guimenu +><guisubmenu +>Синтез</guisubmenu +><guisubmenu +>Midi & Sequencing</guisubmenu +></menuchoice +>). Он должен быть сверху. Если вам нужно больше места вы можете переместить другие модули выделяя их (для выделения нескольких модулей используйте &Shift;), и перетаскивая их в сторону. </para> + +<para +>Снова соедините выход частоты Synth_SEQUENCE ко входу модуля Synth_FREQUENCY. Затем установите значение скорости последовательности в 0.13 (скорость крайний левый порт). </para> + +<para +>Сейчас перейдите крайнему правому порту (последовательности) Synth_SEQUENCE и установите последовательность, написав <userinput +>A-3;C-4;E-4;C-4;</userinput +>. За дополнительной информацией обращайтесь к описанию модулей. </para> + +<note> +<para +>Synth_SEQUENCE в действительности <emphasis +>нуждается</emphasis +> в установке последовательности и скорости. Без этого вы можете получить сбой программы. </para> +</note> + +<para +>Выберите <menuchoice +><guimenu +>Файл</guimenu +><guimenuitem +>Исполнить структуру</guimenuitem +></menuchoice +>. Вы услышите проигрывание последовательности. Если вам понравилось, то нажимайте <guibutton +>Да</guibutton +> и переходите к четвёртому шагу. </para> +</sect2> + +<sect2 id="step-4"> +<title +>4-й шаг</title> + +<para +>Создайте модуль Synth_PSCALE (из <menuchoice +><guimenu +>Модули</guimenu +> <guisubmenu +>Синтез</guisubmenu +> <guisubmenu +>Оболочки</guisubmenu +> </menuchoice +>). Отключите выход синусоидальной волны двойным щелчком и выберите <guilabel +>не подключён</guilabel +>. Подключите </para> + +<orderedlist +><listitem> +<para +>Выход модуля SIN ко входу модуля PSCALE</para> +</listitem> +<listitem> +<para +>Выход PSCALE ко левому входу модуля AMAN_PLAY</para> +</listitem> +<listitem> +<para +>Выход PSCALE ко правому входу модуля AMAN_PLAY</para> +</listitem> +<listitem> +<para +>SEQUENCE pos к PSCALE pos</para> +</listitem> +</orderedlist> + +<para +>Наконец, установите параметр top модуля PSCALE в некоторое значение, для примера 0.1 </para> + +<para +>Как это работает: Synth_SEQUENCE берёт дополнительную информацию о позиции ноты,которую сейчас проигрывает, пока 0 означает запущен и 1 завершён. Модуль Synth_PSCALE усиливает пропускаемый аудио поток от значения громкости 0 (тихо) до 1 (оригинальная громкость) и обратно до 0 (тихо). В соответствии с позицией. Позиция пика может быть получена как значение pos.0.1 означает, что после проигрывания 10% ноты, громкость увеличивается до максимума и потом начинает уменьшаться. </para> + + +<para +>Выберите <menuchoice +><guimenu +>Файл</guimenu +><guimenuitem +>Выполнить Структуру</guimenuitem +></menuchoice +>. Вы услышите воспроизведение прекрасной последовательности.Если вам понравилось, то нажмите <guibutton +>OK</guibutton +> и переходите к пятому шагу. </para> + +</sect2> + +<sect2 id="step-5-starting-to-beam-data-around"> +<title +>5-й шаг: Начало распространения данных вокруг ;)</title> + +<para +>Запустите ещё одну программу &arts-builder;</para> + +<para +>Установите там Synth__AMAN_PLAY и нормально настройте его. Добавьте туда Synth_BUS_DOWNLINK и:</para> + +<orderedlist> +<listitem> +<para +>Установите параметр bus модуля Synth_BUS_DOWNLINK в audio (это просто название, можно написать fred, если вам так нравится) </para> +</listitem> +<listitem> +<para +>Свяжите параметр left Synth_BUS_DOWNLINK с параметром left Synth_AMAN_PLAY </para> +</listitem> +<listitem> +<para +>Свяжите параметр right Synth_BUS_DOWNLINK с параметром right Synth_AMAN_PLAY </para> +</listitem> +</orderedlist> + +<para +>Запустите выполнение структуры. Подождав немного, вы так ничего и не услышите. </para> + +<para +>Вернёмся назад к структуре с Synth_WAVE_SIN, заменим Synth_AMAN_PLAY на Synth_BUS_UPLINK и настроим его название на audio (или fred, если так удобнее). Удаляем модули, выделяя их и выбирая в меню <menuchoice +><guimenu +>Правка</guimenu +><guimenuitem +>Удалить</guimenuitem +></menuchoice +> (или нажимая клавишу <keycap +>Del</keycap +>). </para> + +<para +>Запустим ещё раз структуру <menuchoice +><guimenu +>Файл</guimenu +> <guilabel +>выполнить структуру</guilabel +></menuchoice +>. Вы услышите последовательность нот, переданных через шину. </para> + +<para +>Если вам нужно выяснить, почему что-то подобное этому может быть действительно удобным, нажмите <guibutton +>Да</guibutton +> (в &arts-builder;, который выполняет Synth_SEQUENCE, вы можете всё оставить запущенным) и перейдите к 6-ому шагу. </para> +</sect2> + +<sect2 id="step-6-beaming-for-advanced-users"> +<title +>6-й шаг: Обмен данными для опытных пользователей</title> + +<para +>Выберите <menuchoice +><guimenu +>Файл</guimenu +><guimenuitem +>Переименовать</guimenuitem +></menuchoice +> структуру из меню artsbuilder, который содержит Synth_SEQUENCE, и назовите её tutorial. Нажмите <guibutton +>Да</guibutton +>. </para> + +<para +>Выберите <menuchoice +><guimenu +>Файл</guimenu +> <guimenuitem +>Сохранить</guimenuitem +></menuchoice +> </para> + +<para +>Запустите ещё один &arts-builder;, выберите <menuchoice +><guimenu +>Файл</guimenu +><guimenuitem +>Загрузить</guimenuitem +> </menuchoice +> и загрузите tutorial снова. </para> + +<para +>Сейчас вы можете выбрать <menuchoice +><guimenu +>Файл</guimenu +><guimenuitem +>Выполнить структуру</guimenuitem +></menuchoice +> в обеих копиях &arts-builder; с этой структурой. Вы можете услышать двойное воспроизведение одного и того же. В зависимости от времени, когда вы запускаете выполнение структуры, звук может изменяться. </para> + +<para +>Ещё можно сделать следующее: запустите &noatun; и начните проигрывание какого-нибудь <literal role="extension" +>mp3</literal +>. Запустите &artscontrol;. Перейдите в <menuchoice +><guimenu +>Вид</guimenu +><guimenuitem +>Управление звуком</guimenuitem +></menuchoice +>.Вы увидите &noatun; и вашу <quote +>tutorial</quote +> структуру воспроизводящую что-то. Ещё лучше, если вы сделаете следующее: дважды нажмите на &noatun;, и вы сможете просмотреть список доступных шин. Вы также можете указать &noatun; выводить данные на шину audio, предоставляемую структурой tutorial. </para> +</sect2> + +<sect2 id="step-7-midi-synthesis"> +<title +>Шаг 7: Синтез midi</title> + +<para +>Наконец, сейчас вы сможете сделать из вашей синусоидальной волны настоящий инструмент. Это ощутимо, только если у вас есть что-то передающее события &MIDI; в &arts;. Я хотел бы описать здесь, как вы сможете использовать некоторые внешние клавиатуры, midi-шина подобная &brahms; прекрасно подходит. </para> + +<para +>Во-первых, очистим рабочий стол от лишнего, вам понадобится только один &arts-builder;, выполняющий структуру с синусоидальной волной. Затем, трижды сделайте <menuchoice +><guimenu +>Порты</guimenu +> <guisubmenu +>Создать входящий сигнал</guisubmenu +></menuchoice +>, и три раза <menuchoice +><guimenu +>Порты</guimenu +> <guisubmenu +>Создать выходной сигнал</guisubmenu +></menuchoice +>. Разместите порты где-нибудь. </para> + +<para +>Выберите <menuchoice +><guimenu +>Порты</guimenu +> <guilabel +>Изменить позиции и имена</guilabel +></menuchoice +> и назовите порты frequency (частота), velocity (скорость), pressed (нажато), left (левый), right (правый), done (завершено). </para> + +<para +>Наконец, вы можете удалить модуль Synth_SEQUENCE и соединить входящий порт frequency структуры с портом frequence модуля Synth_FREQUENCY. Но как же позиция?</para +> <para +>Мы её не имеем, потому как нет алгоритма, по которому вы могли бы предсказать, когда пользователь отпустит ноту, которую он только что нажал на midi клавиатуре. Так что мы имеем параметр pressed, который показывает когда пользователь держит нажатой клавишу. (pressed = 1: клавиша остаётся нажатой, pressed = 0: клавиша отпущена) </para> + +<para +>Это означает, что объект Synth_PSCALE также должен замещён. Установите вместо него Synth_ENVELOPE_ADSR (из <menuchoice +><guimenu +>Модули</guimenu +><guisubmenu +>Синтез</guisubmenu +> <guisubmenu +>Оболочки</guisubmenu +> </menuchoice +>).Соедините: </para> + +<orderedlist> +<listitem> +<para +>Вход структуры pressed с параметром active ADSR</para> +</listitem> +<listitem> +<para +>Выход SIN с invalue ADSR</para> +</listitem> +<listitem> +<para +>Outvalue ADSR с выходом структуры left</para> +</listitem +><listitem> +<para +>Outvalue ADSR с выходом структуры right</para> +</listitem> +</orderedlist> + +<para +>Установите параметры attack в 0.1, decay в 0.2, sustain в 0.7, release в 0.1. </para> + +<para +>Ещё нам нужно обдумать, как структура должна узнать, когда нужно начать и остановить воспроизведение, потому что иначе никогда оно не остановится, если нота была отпущена. Но оболочка ADSR знает, когда уже ничего не должно быть слышно, начиная с уменьшения сигнала к нулю с момента отпускания ноты. </para> + +<para +>Завершение показывается установкой 1 на выходе порта done. Так что связываем это с выходом done. Структура будет удалена, как только done установится в 1. </para> + +<para +>Переименуем нашу структуру в instrument_tutorial (из <menuchoice +><guimenu +>Файл</guimenu +><guimenuitem +>Переименовать структуру</guimenuitem +></menuchoice +>. Затем сохраним его, используя сохранить как.</para +><para +>Запустим artscontrol, и перейдём в <menuchoice +><guimenu +>Вид</guimenu +><guimenuitem +>Управление MIDI</guimenuitem +></menuchoice +>, и выберем <menuchoice +><guimenu +>Добавить</guimenu +><guimenuitem +>Выход MIDI синтеза aRts</guimenuitem +></menuchoice +>. Наконец, вы здесь можете выбрать ваш инструмент (tutorial). </para> + +<para +>Откройте терминал и наберите <userinput +><command +>midisend</command +></userinput +>. Вы можете заметить, что <command +>midisend</command +> и инструмент присутствуют в окне управления &MIDI; &arts;. После выбора обоих элементов и нажатия <guibutton +>Соединить</guibutton +>, мы всё завершим. Возьмите вашу клавиатуру и начните играть (конечно же она должна быть соединена с вашим компьютером). </para> +</sect2> + +<sect2 id="suggestions"> +<title +>Предложения</title> + +<para +>Вам снова понадобилось по работать с &arts;. Имеются несколько советов, которые вы могли бы попробовать для улучшения вашей структуры: </para> + +<itemizedlist> +<listitem> +<para +>Попробуйте использовать что-нибудь другое, чем синусоидальную волну. Когда вы подключите треугольную волну, вы скорее всего предположите что звук не слишком хорош. Но попробуйте добавить фильтр SHELVE_CUTOFF сразу же после модуля треугольной волны для вырезания частот выше основной (попробуйте например 1000 Гц или лучше в два раза выше чем входная частота или входная частота + 200 Гц или что-то похожее на это). </para> +</listitem> +<listitem> +<para +>Попробуйте использовать больше чем один генератор. Synth_XFADE может быть использован для смешения двух сигналов, Synth_ADD для сложения их. </para> +</listitem> +<listitem> +<para +>Попробуйте установить для генераторов не совпадающие частоты, что даст несколько лучшие характеристики. </para> +</listitem> +<listitem> +<para +>По экспериментируйте с более чем одной оболочкой. </para> +</listitem> +<listitem> +<para +>Попробуйте создать инструменты с различными левым и правым выходом. </para> +</listitem> +<listitem> +<para +>Также попробуйте дополнительно обработать сигнал после того как он попадёт на выходную шину.Вы можете, к примеру, смешать задержанные версии сигнала с оригинальным для создания эффекта эха. </para> +</listitem> +<listitem> +<para +>Попробуйте использовать настройку скорости (это сила, с которой нота будет сжата, вы можете также говорить о громкости). Специальный эффект всегда есть не только когда изменяется громкость результирующего сигнала, но также и звучание инструмента (для примера вырезание частот). </para> +</listitem> +<listitem> +<para +>...</para> +</listitem> +</itemizedlist> + +<para +>Если вы создали что-то замечательное, пожалуйста подумайте над возможностью предоставить это для интернет страницы &arts;. Или над включением в следующую версию. </para> +</sect2> + +</sect1> + +<sect1 id="artsbuilder-examples"> +<title +>Примеры</title> + +<para +>&arts-builder; распространяется с несколькими примерами, которые могут быть открыты из <menuchoice +><guimenu +>Файл</guimenu +><guimenuitem +>Открыть пример...</guimenuitem +> </menuchoice +>. Некоторые из них есть в директории, другие, которые по каким-то причинам не работают с данной версией, находятся в директории todo. </para> +<para +>Примеры разделяются на несколько категорий: </para> + +<itemizedlist> +<listitem> +<para +>Независимые примеры иллюстрируют как нужно использовать каждый из встроенных модулей arts (названы <filename +>example_*.arts</filename +>). Обычно они выводятся что-то на звуковую карту. </para> +</listitem> + +<listitem> +<para +>Инструменты созданные из низкоуровневых модулей arts (названы <filename +>instrument_*.arts</filename +>).Они удовлетворяют соглашению о входных и выходных портах так что они могут быть использованы менеджером &MIDI; в &artscontrol;. </para> +</listitem> + +<listitem> +<para +>Шаблоны для создания новых модулей (названия <filename +>template_*.arts</filename +>). </para> +</listitem> + +<listitem> +<para +>Эффекты, которые могут быть использованы для создания ваших структур. (названы <filename +>effect_*.arts</filename +>) [все в директории todo ] </para> +</listitem> + +<listitem> +<para +>Элементы для смешивания сигналов включая и графические управляющие элементы (названы <filename +>mixer_element_*.arts</filename +>). [ все в директории todo ] </para> +</listitem> + +<listitem> +<para +>Различные модули что не подходят не к одной из выше названных категорий. </para> +</listitem> +</itemizedlist> + +<variablelist> +<title +>Детальное описание каждого из модулей:</title> +<varlistentry> +<term +><filename +>example_stereo_beep.arts</filename +></term> +<listitem> +<para +>Создаёт 440 Гц синусоидальную волну в левом канале и 880 Гц синусоидальную волну в правом канале, и выдаёт это на звуковую карту. Это описано в документации по &arts;. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><filename +>example_sine.arts</filename +></term> +<listitem> +<para +>Создаёт 440 Гц синусоидальную волну. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><filename +>example_pulse.arts</filename +></term> +<listitem> +<para +>Создаёт 440 Гц импульсную волну с 20% рабочим сигналом. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><filename +>example_softsaw.arts</filename +></term> +<listitem> +<para +>Создаёт 440 Гц пилообразную волну </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><filename +>example_square.arts</filename +></term> +<listitem> +<para +>Создаёт 440 Гц меандр. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><filename +>example_tri.arts</filename +></term> +<listitem> +<para +>Создаёт 440 Гц треугольную волну. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><filename +>example_noise.arts</filename +></term> +<listitem> +<para +>Создаёт белый шум. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><filename +>example_dtmf1.arts</filename +></term> +<listitem> +<para +>Создаёт двух тоновую волну из 697 Гц и 1209 Гц синусоидальных волн, усиливая их на 0.5 и складывая их вместе. Это DTMF тон для числа "1" на клавиатуре телефона. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><filename +>example_atan_saturate.arts</filename +></term> +<listitem> +<para +>Пропускает треугольную волну через фильтр насыщения на функции atan. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><filename +>example_autopanner.arts</filename +></term> +<listitem> +<para +>Используя авторазбиение 400 Гц синусной волны между левой и правой колонкой с частотой 2 Гц. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><filename +>example_brickwall.arts</filename +></term> +<listitem> +<para +>Увеличивает синусоидальную волну с коэффициентом 5 и затем пропускает через фильтр brickwall. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><filename +>example_bus.arts</filename +></term> +<listitem> +<para +>Исходящий канал из шины названной <quote +>Bus</quote +> и входящий канал в шину <quote +>out_soundcard</quote +> с зарезервированным левым и правым каналом. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><filename +>example_cdelay.arts</filename +></term> +<listitem> +<para +>Исходящий канал из шины названной <quote +>Delay</quote +> и входящий правый канал через задержку в 0.5 секунд, и левый канал не изменяется.Вы можете использовать &artscontrol; для соединения эффекта с проигрывателем и пронаблюдать результат. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><filename +>example_delay.arts</filename +></term> +<listitem> +<para +>Всё тоже самое как и в <filename +>example_cdelay.arts</filename +>, но используется эффект задержки. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><filename +>example_capture_wav.arts</filename +></term> +<listitem> +<para +>Этот пример использует модуль Synth_CAPTURE_WAV для сохранения 400 Гц волну как wav файл. Модуль запускается на несколько секунд и затем проверяет создание файла в <filename class="directory" +>/tmp</filename +>. Вы можете воспроизвести файл в таком проигрывателе как <application +>kaiman</application +>. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><filename +>example_data.arts</filename +></term> +<listitem> +<para +>Этот пример использует модуль Data для создания постоянного потока со значением <quote +>3</quote +> и пересылает его в модуль Debug для периодического показа. Также есть модуль Nil, иллюстрирующий как он может быть использован для ничего не делания. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><filename +>example_adsr.arts</filename +></term> +<listitem> +<para +>Показывает как создавать простые инструменты используя модуль Envelope Adsr, переключающийся меандром. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><filename +>example_fm.arts</filename +></term> +<listitem> +<para +>Используется модуль FM Source для создания 440 Гц синусоидальной волны с модулируемой частотой 5 Гц. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><filename +>example_freeverb.arts</filename +></term> +<listitem> +<para +>Данный пример соединяет эффект Freeverb исходящего канала с выходом. Вы можете использовать Artscontrol для подключения эффекта к проигрывателю и пронаблюдать результат. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><filename +>example_flanger.arts</filename +></term> +<listitem> +<para +>Данный пример реализует простой краевой(flanger) эффект (это может ещё не работать). </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><filename +>example_moog.arts</filename +></term> +<listitem> +<para +>Данная структура комбинирует два канала из шины в один, пропуская через Moog VCF-фильтр и посылает на шину звуковой платы. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><filename +>example_pitch_shift.arts</filename +></term> +<listitem> +<para +>Данная структура прогоняет данные левого канала через фильтр-смещения (pitch shift).С помощью установки различной скорости вы можете изменять эффект. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><filename +>example_rc.arts</filename +></term> +<listitem> +<para +>Данная структура пропускает белый шум через RC-фильтр и выводит сигнал на звуковую плату.На индикаторе БПФ(FFT) в artscontrol вы можете увидеть как изменяется форма сигнала из не фильтрованного шума. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><filename +>example_sequence.arts</filename +></term> +<listitem> +<para +>Демонстрация модуля Sequence с помощью проигрывания последовательности нот. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><filename +>example_shelve_cutoff.arts</filename +></term> +<listitem> +<para +>Эта структура пропускает белый шум через фильтр Shelve-Cutoff и выводит на звуковую плату.На индикаторе БПФ(FFT) в artscontrol вы можете увидеть как изменяется форма сигнала из не фильтрованного шума. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><filename +>example_equalizer.arts</filename +></term> +<listitem> +<para +>Демонстрация модуля Std_Equalizer. Повышает нижние и высокие частоты на 6 Дб. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><filename +>example_tremolo.arts</filename +></term> +<listitem> +<para +>Демонстрация эффекта Тремоло. Левый и правый канал модулируются 10 Гц Тремоло. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><filename +>example_xfade.arts</filename +></term> +<listitem> +<para +>В приведенном примере смешиваются частоты 440 Гц и 880 Гц синусоидальных волн с использованием cross fader. Последний может иметь значение от -1 до 1. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><filename +>example_pscale.arts</filename +></term> +<listitem> +<para +>Демонстрация работы модуля Pscale (Я не уверен что это подходящий пример). </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><filename +>example_play_wav.arts</filename +></term> +<listitem> +<para +>Иллюстрирует модуль Play Wave. Вам нужно ввести полный путь до файла <literal role="расширение" +>.wav</literal +> в параметр имя файла. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +>example_multi_add.arts</term> +<listitem> +<para +>Модуль Multi Add может обрабатывать любой набор входных каналов. В примере суммируются три выхода Data-модулей и показывает результат 6. </para> +</listitem> +</varlistentry> +</variablelist> + +</sect1> +</chapter> diff --git a/tde-i18n-ru/docs/tdemultimedia/artsbuilder/detail.docbook b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/detail.docbook new file mode 100644 index 00000000000..7fa900aba00 --- /dev/null +++ b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/detail.docbook @@ -0,0 +1,1365 @@ +<!-- <?xml version="1.0" ?> +<!DOCTYPE chapter PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN" "dtd/kdex.dtd"> +To validate or process this file as a standalone document, uncomment +this prolog. Be sure to comment it out again when you are done --> + +<chapter id="arts-in-detail"> +<title +>&arts; в деталях</title> + +<sect1 id="architecture"> +<title +>Архитектура</title> + +<mediaobject> +<imageobject> +<imagedata fileref="arts-structure.png" format="PNG"/> +</imageobject> +<textobject +><phrase +>Структура &arts;.</phrase +></textobject> +</mediaobject> +</sect1> + +<sect1 id="modules-ports"> +<title +>Модули и порты</title> + +<para +>Основная идея &arts; - это синтез звука при помощи небольших модулей, которые предназначены только для этой цели, и комбинирования из них различных структур. Модули обычно имеют входы, на которые поступают различные сигналы или параметры, и выходы, на которых вырабатываются некоторые сигналы. </para> + +<para +>В случае одного модуля (Synth_ADD) берутся два сигнала с входа и складываются вместе. Результатом является сигнал на выходе. Места, где модуль предоставляет свои входные/выходные сигналы, называются портами. </para> + +</sect1> + +<sect1 id="structures"> +<title +>Структуры</title> + +<para +>Структура - это набор связанных модулей, некоторые из которых могут иметь параметры, кодируемые непосредственно в их входные порты, другие могут быть связаны с остальными или вообще ни с чем не связаны. </para> + +<para +>С помощью &arts-builder; вы можете описать структуры. Вы описываете, какие модули вы хотели бы соединить. Завершив описание, вы можете сохранить полученную структуру в файле или создать описанную структуру, запустив Execute. </para> + +<para +>Вы услышите звук, если всё сделали правильно. </para> +</sect1> + +<!-- TODO + +<sect1 id="streams"> +<title +>Streams</title> + +</sect1> + +--> + +<sect1 id="latency"> +<title +>Задержки</title> + +<sect2 id="what-islatency"> +<title +>Что такое задержки?</title> + +<para +>Предположим, у вас есть программа <quote +>mousepling</quote +>, которая издает звук, если вы нажимаете на кнопку. Задержка - это время между нажатием кнопки и тем, когда вы слышите звук. Задержка в данном случае составляется из других задержек, имеющих различные причины. </para> + +</sect2> + +<sect2 id="latenbcy-simple"> +<title +>Задержка в простых программах</title> + +<para +>В этой простой программе задержки происходят в следующих местах: </para> + +<itemizedlist> + +<listitem> +<para +>Время, пока ядро операционной системы не оповестит сервер X11, что кнопка мыши была нажата. </para> +</listitem> + +<listitem> +<para +>Время, пока сервер X11 не оповестит вашу программу, что кнопка мыши была нажата. </para> +</listitem> + +<listitem> +<para +>Время, пока ваша программа не решит, что нужно проиграть звук. </para> +</listitem> + +<listitem> +<para +>Время указания программой звуковому серверу, что сервер должен проиграть звук. </para> +</listitem> + +<listitem> +<para +>Время прохода звукового фрагмента через буфер данных (когда звуковой сервер начинает микшировать другие потоки в один), пока он действительно не достигнет места для проигрывания звуковой картой. </para> +</listitem> + +<listitem> +<para +>Время прохождения звука от колонок до вашего уха. </para> +</listitem> +</itemizedlist> + +<para +>Первые три причины задержки не относятся к &arts;. Они интересны, но выходят за область этого документа. Тем не менее нужно осознавать, что они существуют, так что даже если вы всё оптимизировали до действительно низких значений, вы можете не получить в точности расчетный результат. </para> + +<para +>Указание серверу проиграть что-нибудь обычно включает один вызов &MCOP;. Имеются тесты, которые подтверждают, что на одном и том же компьютере с unix-сокетами проигрывание сервером чего-нибудь возможно около 9000 раз в секунду в текущей реализации. Я предполагаю, что большая часть этой задержки создается ядром ОС при переключении между процессами. Конечно, это значение зависит от типа параметров. Если вы передаёте целый образ за один вызов, то это будет медленнее, чем если вы передадите только одно длинное значение. Это справедливо и для кода возврата. Конечно, для обычных строк (таких как имя воспроизводимого <literal role="extension" +>wav</literal +> файла) это не должно быть проблемой. </para> + +<para +>Мы можем оценить это время как 1/9000 с, что меньше 0,15 мс. Мы увидим, что это не так важно. </para> + +<para +>Следующая задержка - это время между началом проигрывания сервером и временем прихода фрагмента на звуковую плату. Серверу необходима буферизация, так что когда запущены другие программы, как ваш сервер X11 или программа <quote +>mousepling</quote +>, звук не прерывается. Под &Linux; создаются фрагменты определенного размера. Сервер постоянно заполняет фрагменты и отдаёт их звуковой плате для воспроизведения. </para> + +<para +>Предположим, есть три фрагмента. Сервер заполняет первый, звуковая плата начинает проигрывать его. Сервер заполняет второй. Сервер заполняет третий. Сервер завершает работу, другие программы могут начинать что-нибудь делать. </para> + +<para +>Как только звуковая плата проиграет первый фрагмент, она начинает проигрывать второй, и сервер начинает заполнять первый фрагмент. И так далее. </para> + +<para +>Максимальная задержка при этом равна (число фрагментов)*(размер каждого фрагмента)/((частота дискретизации)*(размер одного отсчета)). С параметрами 44 Кгц стерео и 7 фрагментов размером по 1024 байта (настройки aRts по умолчанию), мы получим 40 мс. </para> + +<para +>Данное значение может быть настроено соответственно вашим нуждам. Конечно, загрузка <acronym +>CPU</acronym +> увеличивается с уменьшением задержки, так как звуковому серверу нужно заполнять буфера более часто, и в меньших размерах. Почти невозможно получить хорошие значения без предоставления звуковому серверу приоритета реального времени, иначе вы часто будете слышать прерывание звучания. </para> + +<para +>Конечно, вполне реально сделать что-нибудь вроде 3-х фрагментов, каждый размером 256 байтов, которые дали бы задержку в 4.4 мс. С 4.4 мс задержки и загрузка <acronym +>CPU</acronym +> &arts; будет около 7.5%. С 40 мс задержкой она составит около 3% (на PII-350, и данное значение может зависеть от вашей звуковой карты, версии ядра и т.д.). </para> + +<para +>Затем есть время, необходимое для прохода звука от колонок до ваших ушей. Предполагается что от вас до колонок 2 метра. Звук перемещается со скоростью 330 метров в секунду. Мы можем округлить данное время до 6 мс. </para> + +</sect2> + +<sect2 id="latency-streaming"> +<title +>Задержка в потоковых программах</title> + +<para +>Потоковые программы производят звук самостоятельно. Рассмотрим игру, которая создает постоянный поток отсчетов, и должна быть адаптирована для &arts;. Например, когда я нажимаю кнопку, фигура, которой я играю, прыгает, и раздаётся звук. </para> + +<para +>Сначала вам нужно знать, как &arts; работает с потоковым звуком. Это очень похоже на ввод/вывод со звуковой платой. Игра посылает некоторые пакеты с отсчетами звуковому серверу. Например, три пакета. Как только звуковой сервер закончит с первым пакетом, он посылает подтверждение игре, что этот пакет обработан. </para> + +<para +>Игра создаёт другой звуковой пакет и посылает его серверу. Тем временем сервер начинает поглощать второй пакет, и так далее. Задержка здесь схожа с простым случаем: </para> + +<itemizedlist> +<listitem> +<para +>Время, пока ядро не оповестит сервер X11, что клавиша была нажата. </para> +</listitem> + +<listitem> +<para +>Время, пока сервер X11 не оповестит игру, что кнопка была нажата. </para> +</listitem> + +<listitem> +<para +>Время, пока игра не определит, что по этой кнопке стоит проиграть звук. </para> +</listitem> + +<listitem> +<para +>Время, пока звуковой пакет, который игра начала передавать серверу, не достигнет звукового сервера. </para> +</listitem> + +<listitem> +<para +>Время, необходимое для прохождения звука, который звуковой сервер смешивает с другим выводимым звуком в один, через буфер данных, пока тот действительно не достигнет места, где звуковая плата проигрывает звук. </para> +</listitem> + +<listitem> +<para +>Время, нужное для достижения звука из колонок вашего уха. </para> +</listitem> + +</itemizedlist> + +<para +>Внешние задержки, как и ранее, вне рамок этого документа. </para> + +<para +>Очевидно, что задержка потокового звука зависит от времени, необходимого для воспроизведения всех пакетов потока. Итак, это (число пакетов)*(размер пакета)/((частота образцов)*(размер отсчета)). </para> + +<para +>Как вы видите, эта же формула применяется для фрагментов. Конечно, для игр это несущественно из-за такой же небольшой задержки, как и раньше. Я бы посоветовал использовать конфигурацию для игр 2048 байт на пакет и использование 3 пакетов. Результирующая задержка составит 35 мс. </para> + +<para +>Это основано на следующей оценке. Допустим, игра идёт с частотой 25 кадров в секунду. Возможно, вы не заметите различий вывода звука в пределах одного кадра. Итак, задержка в 1/25 с при потоковом воспроизведении приемлема, что составляет 40 мс. </para> + +<para +>Большинство не запускает игры с приоритетом реального времени, и опасностью перерывов в звуке нельзя пренебрегать. Потоковый звук с 3 пакетами по 256 возможен - я проверял - но сильно загружает процессор. </para> + +<para +>Задержки сервера вы можете расчитать точно также. </para> + +</sect2> + +<sect2 id="cpu-usage"> +<title +>О загрузке процессора</title> + +<para +>Имеется масса факторов, которые влияют на загрузку процессора в сложных случаях, с потоковыми и прочими приложениями и модулями сервера. Назовём несколько: </para> + +<itemizedlist> +<listitem> +<para +>Загрузка процессора необходимыми вычислениями. </para> +</listitem> + +<listitem> +<para +>Накладные расходы внутреннего планирования &arts; - &arts; решает когда,какой модуль и что должен вычислить. </para> +</listitem> + +<listitem> +<para +>Накладные расходы преобразования целых чисел в числа с плавающей запятой. </para> +</listitem> + +<listitem> +<para +>Накладные расходы протокола &MCOP;. </para> +</listitem> + +<listitem> +<para +>Ядро: переключение процессов/контекстов </para> +</listitem> + +<listitem> +<para +>Ядро: накладные расходы связи </para> +</listitem> +</itemizedlist> + +<para +>Если запущены два потока, то их загрузка процессора суммируется. Если вы применяете фильтр, то требуются некоторые вычисления. Упрощённо, сложение двух потоков может использовать четыре цикла <acronym +>CPU</acronym +> на сложение, для 350Мгц процессора это 44100*2*4/350000000 = 0.1% использования <acronym +>CPU</acronym +>. </para> + +<para +>Внутреннее планирование &arts;: &arts; должен решить, какой модуль, когда и что вычисляет. Это требует времени. Вам нужен профилировщик, если вы заинтересованы в этом. Чем меньше требуется обработки в реальном времени, (например, за счет обработки больших буферов), тем меньше накладные расходы планирования. Если обрабатывать блоки по 128 отсчетов (с использованием фрагментов размером по 512 байт), то на накладные расходы планирования можно не обращать внимания. </para> + +<para +>Накладные расходы преобразования целых чисел в числа с плавающей точкой: внутри &arts; используются данные в формате с плавающей точкой. Это упрощает обработку и на последних процессорах не медленнее, чем целочисленные операции. Конечно, если клиент использует целочисленные данные, (подобно игре, которая выводит звук через &arts;), то требуется их преобразовать. Также и звуковая карта принимает целочисленные данные, так что их нужно преобразовывать. </para> + +<para +>Вот данные для процессора Celeron, такты процессора на обработку одного отсчета, с опцией -O2 egcs 2.91.66 (получены Евгением Смитом <email +>hamster@null.ru</email +>). Конечно, это сильно зависит от процессора: </para> + +<programlisting +>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 +</programlisting> + +<para +>Итак загрузка составляет в среднем 1% для преобразования и 5% для интерполяции на 350 МГц процессоре. </para> + +<para +>Накладные расходы &MCOP; протокола, по приблизительным подсчётам, 9000 обращений в секунду. Многое из этого не является недостатком &MCOP;, но относится к двум моментам из ядра операционной системы, описанным ниже.Это даёт основу для вычислений стоимости затрат потоковой обработки. </para> + +<para +>Каждый пакет данных, передаваемый через потоки, может рассматриваться как одно &MCOP; обращение. Конечно же, большие пакеты медленнее, чем 9000 пакетов/с, но это только прикидки. </para> + +<para +>Предполагается, что вы используете пакеты размером 1024 байт. Таким образом, для передачи потока с 44 КГц стерео вам необходимо передать 44100*4/1024 = 172 пакета в секунду. Предполагается, что вы можете при 100% загрузке процессора передать 9000 пакетов, тогда получите (172*100)/9000 = 2% использования <acronym +>CPU</acronym +> для потока с пакетами в 1024 байт. </para> + +<para +>Это округлённые расчеты. Однако, они показывают, что намного лучше было бы, если время задержки вас устраивает, использовать к примеру пакеты по 4096 байт. Тогда мы имеем формулу вычисления размера пакета, который приводит к 100% загрузке <acronym +>CPU</acronym +>, 44100*4/9000 = 19.6 отсчета, и таким образом получаем формулу для оценок: </para> + +<para +>использование <acronym +>CPU</acronym +> потоком в процентах = 1960/(ваш размер пакета) </para> + +<para +>которая даёт нам 0.5% использования <acronym +>CPU</acronym +> потоками с размером пакета в 4096 байт. </para> + +<para +>Переключение ядром процессов/контекстов: это часть накладных расходов &MCOP; протокола. Переключение между двумя процессами требует времени - отображение новой памяти, непопадание в кэш, или что-то ещё (если это читает эксперт по ядру - дайте мне знать, что точно является причиной). Это забирает время. </para> + +<para +>Я не знаю, как с какой частотой &Linux; может переключать контексты, но это число не бесконечно. Таким образом, накладные расходы &MCOP; протокола, как я полагаю, в немалой степени вызваны переключением контекстов. В начале разработки &MCOP; я протестировал использование такого взаимодействия внутри одного процесса, и это было намного быстрее (в четыре раза быстрее или около того). </para> + +<para +>Ядро: накладные расходы взаимодействия: Это часть накладных расходов протокола &MCOP;. Передача данных между процессами сейчас сделана через сокеты. Это удобно, так как для определения прихода данных могут быть использованы обычные методы select(). И это может также сочетаться с другими источниками ввода-вывода, такими как звуковой ввод-вывод, сервер X11 или любыми другими. </para> + +<para +>Тем не менее, вызовы чтения и записи стоят процессорных тактов. Для небольших обращений (таких как передача одного midi события) это и не так плохо, но для больших обращений (как передача одного видеокадра размером в несколько мегабайт) это уже точно проблема. </para> + +<para +>Использование общей разделяемой памяти для &MCOP; там, где это возможно, было бы лучшим решением. Однако это должно быть сделано прозрачно для программиста приложения. </para> + +<para +>Возьмите профилировщик или сделайте другие тесты для выяснения, в какой степени на обработку текущего аудио потока влияет неиспользование общей памяти. Совсем не плохо, когда обработка аудио потока (проигрывание mp3) с помощью &artsd; и <application +>artscat</application +> с загружает процессор на 6% (на 5% с помощью только mp3-декодера). Конечно, это включает всё от выполнения необходимых вычислений до издержек работы с сокетами, таким образом я бы сказал, что возможно сэкономить 1%, используя общую память. </para> + +</sect2> + +<sect2 id="hard-numbers"> +<title +>Некоторые сложные случаи</title> + +<para +>Это сделано в текущем разрабатываемом варианте. Я также хотел проверить по-настоящему сложные случаи, и это не то, что должны использовать обычные приложения. </para> + +<para +>Я написал приложение, названное streamsound, которое посылает потоковые данные &arts;. Оно работает с приоритетом реального времени (без проблем), и с одним небольшим модулем сервера (масштабирование и ограничение громкости): </para> + +<programlisting +>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 +</programlisting> + +<para +>Каждый из этих процессов - обработка потока с 3 фрагментами по 1024 байта (18мс). Имеется три таких клиента, работающих одновременно. Я знаю, что это выглядит немного излишне, но как я сказал: возьмите профилировщик и выясните, на что тратится время, и если вы сочтёте необходимым, то исправьте. </para> + +<para +>Конечно, я не думаю, что в реальной жизни понадобится такая потоковая обработка. Для тестов я пробовал то, что уменьшаеит задержку до минимума. Результат: вы можете обрабатывать потоки без прерываний с одним клиентским приложением, если вы взяли 2 фрагмента по 128 байт между aRts и звуковой картой, и между клиентским приложением и aRts. Это означает, что вы имеете общую максимальную задержку в 128*4/44100*4 = 3 мс, где 1.5 мс происходят из-за ввода/вывода звуковой карты и 1.5 мс из-за взаимодействия с &arts;. Оба приложения нужно запускать с приоритетом реального времени. </para> + +<para +>Конечно, это сильно загружает процессор. Данный пример загружает мой P-II/350 приблизительно на 45%. Также будут слышны щелчки, если вы запустите top, начнёте перемещать окна на вашем дисплее X11 или выполнять операции дискового ввода/вывода. Всё это - проблемы ядра. Проблема планирования двух или большего числа приложений с приоритетом реального времени очень сложна, и ещё сложнее, если они взаимодействуют, оповещая друг друга и т. д. </para> + +<para +>Наконец, более жизненный пример. Это &arts; с artsd и одним artscat (один клиент обработки потока) запустивший 16 фрагментов по 4096 байт: </para> + +<programlisting +>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 +</programlisting> + +</sect2> +</sect1> + +<!-- TODO + +<sect1 id="dynamic-instantiation"> +<title +>Dynamic Instantiation</title> + +</sect1> + +--> + +<sect1 id="busses"> +<title +>Шины</title> + +<para +>Шины - это динамически созданные соединения, которые передают аудио. В основном, это некоторые входные и выходные связи. Все сигналы из входных связей складываются и посылаются на выходные связи. </para> + +<para +>Шины сейчас реализованы для операций со стерео, итак вы можете передавать через шины только стерео данные. Если вы хотите моно, хорошо, передавайте их только по одному каналу и установите другой в ноль или что-нибудь иное. Что же вам нужно сделать для этого, создать один или несколько Synth_BUS_UPLINK объектов и указать им имя шины, по которой они должны общаться ( например <quote +>аудио</quote +> или <quote +>барабаны</quote +>. Просто направляйте данные туда. </para> + +<para +>Затем, вам нужно создать один или несколько Synth_BUS_DOWNLINK объектов выходных связей, и указать им имя шины (<quote +>аудио</quote +> или <quote +>барабаны</quote +> ... если это подходит для передачи данных через них), и обработанные данные будут на выходе. </para> + +<para +>Входные и выходные связи могут находиться внутри различных структур, вы можете даже иметь несколько запущенных копий &arts-builder; и начать передавать в одной и принимать данные в другой. </para> + +<para +>Шины хороши тем, что они полностью динамические. Клиенты могут подключаться и отключаться во время работы, не будет прерываний потока или шума. </para> + +<para +>Конечно, вы не должны отключать клиента, проигрывающего сигнал, после отключения от шины возможно сигнал не будет нулевым, и тогда поток прервётся. </para> +</sect1> + +<!-- TODO +<sect1 id="network-ransparency"> +<title +>Network Transparency</title> + +</sect1> + +<sect1 id="security"> +<title +>Security</title> + +</sect1> + + +<sect1 id="effects"> +<title +>Effects and Effect Stacks</title> + +</sect1> + +--> +<sect1 id="trader"> +<title +>Трейдинг</title> + +<para +>&arts;/&MCOP; основан на распределении задач по небольшим компонентам. Благодаря этому система становится более гибкой, тогда можно расширять систему, просто добавляя новые компоненты, реализующие новые эффекты, форматы файлов, генераторы, элементы пользовательского интерфейса, ... Поскольку почти все элементы - это компоненты, всё можно расширять очень просто, без изменения существующих исходников. Новые компоненты могут быть просто динамически загружены для улучшения уже существующих приложений. </para> + +<para +>Для этого необходимы две вещи: </para> + +<itemizedlist> + +<listitem> +<para +>Компоненты должны извещать о себе сами - они должны описывать собственную функциональность так, чтобы другие приложения могли бы использовать их. </para> +</listitem> + +<listitem> +<para +>Приложения должны активно просматривать наличие компонентов, которые они могут использовать, вместо использования одних и тех же способов выполнения задач. </para> +</listitem> + +</itemizedlist> + +<para +>Обобщенно: компоненты, которые говорят: <quote +>здесь я, я то что нужно, используй меня</quote +>, и приложения (или если вам нужно, другие компоненты), которые выходят и смотрят, какой компонент они могут использовать для выполнения задачи. Это называется трейдинг. </para> + +<para +>В &arts;, компоненты описывают сами себя, указывая значения, которые они <quote +>поддерживают</quote +> как свойства. Типичным свойством для компонента загрузки файлов может быть расширение обрабатываемых файлов. Типичные значения могут быть <literal role="extension" +>wav</literal +>, <literal role="extension" +>aiff</literal +> или <literal role="extension" +>mp3</literal +>. </para> + +<para +>Фактически каждый компонент может предлагать несколько различных значений для одного свойства. Так, один компонент может предлагать прочитать оба, <literal role="extension" +>wav</literal +> и <literal role="extension" +>aiff</literal +> файла, указав что поддерживает эти значения для свойства <quote +>Расширение</quote +>. </para> + +<para +>Для этого компонент должен поместить в соответствующее место файл <literal role="extension" +>.mcopclass</literal +>, содержащий поддерживаемые свойства. Для нашего примера это может выглядеть подобно так (и установлено в <filename +><replaceable +>componentdir</replaceable +>/Arts/WavPlayObject.mcopclass</filename +>): </para> + +<programlisting +>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 +</programlisting> + +<para +>Важно, чтобы имя <literal role="extension" +>.mcopclass</literal +>-файла также было содержательным. Трейдер не просматривает содержание всего файла, если файл (как здесь) назван <filename +>Arts/WavPlayObject.mcopclass</filename +>, а интерфейс компонента назван <interfacename +>Arts::WavPlayObject</interfacename +> (модули отображаются на каталоги). </para> + +<para +>Для просмотра компонентов имеется два интерфейса (которые определены в <filename +>core.idl</filename +>, так что вы имеете их в каждом приложении), названные <interfacename +>Arts::TraderQuery</interfacename +> и <interfacename +>Arts::TraderOffer</interfacename +>. Вы ищете нужные компоненты следующим образом: </para> + +<orderedlist> +<listitem> +<para +>Создаёте объект запроса: </para> +<programlisting +>Arts::TraderQuery запрос; +</programlisting> +</listitem> + +<listitem> +<para +>Укажите, что вам нужно. Как вы видели выше, компоненты описывают сами себя, используя свойства, для которых они устанавливают определённые значения. Так что можно указать, что вам нужно, выбрав компоненты, которые поддерживают определённые значения для свойств. Это делается с помощью методов TraderQuery: </para> + +<programlisting +>query.supports("Interface","Arts::PlayObject"); + query.supports("Extension","wav"); +</programlisting> +</listitem> + +<listitem> +<para +>Наконец, делаем запрос, используя метод запроса. Затем (как надеемся) получаем некоторые предложения: </para> + +<programlisting +>vector<Arts::TraderOffer> *offers = query.query(); +</programlisting> +</listitem> + +<listitem> +<para +>Сейчас вы можете проверить то, что нашли. Важен метод interfaceName интерфейса TraderOffer, который вернёт вам имя компонента, подходящего запросу. Вы также можете узнать дополнительные свойства, используя getProperty. Следующий код просто проходит по всем компонентам, выводит их имена интерфейсов (которые могли быть использованы для создания) и удаляет результаты запроса: </para> +<programlisting +>vector<Arts::TraderOffer>::iterator i; + for(i = offers->begin(); i != offers->end(); i++) + cout << i->interfaceName() << endl; + delete offers; +</programlisting> +</listitem> +</orderedlist> + +<para +>Чтобы служба трейдинга была полезна, важно прийти к согласию, каковы могут быть свойства компонентов. Существенно, чтобы практически все компоненты в определённой области использовали одинаковый набор свойств для описания самих себя (и по возможности одинаковый набор значений), так что приложения или другие компоненты могли бы найти их. </para> + +<para +>Author (строковый тип, необязательный): Это может быть использовано для того, чтобы показать миру, что вы это написали. Вы можете написать здесь всё, что угодно, конечно желателен адрес электронной почты. </para> + +<para +>Buildable (булевый тип, рекомендуется): говорит о возможности использования компонента инструментами <acronym +>RAD</acronym +> (такими как &arts-builder;), которые используют компоненты, устанавливая соответствие свойствам и соединяя порты. Рекомендуется устанавливать данное значение в истинное для большинства компонент обработки сигналов (таких как фильтры, эффекты, осцилляторы и т. д.), и для всех других, которые могут быть использованы в <acronym +>RAD</acronym +>, но не для внутренней работы как, например, <interfacename +>Arts::InterfaceRepo</interfacename +>. </para> + +<para +>Extension (строковый тип, используется, когда это уместно): вcё, что связано с файлами, должно задавать это. Вы можете указать расширение файла в нижнем регистре без <quote +>.</quote +>, поэтому что-то типа <userinput +>wav</userinput +> подходит. </para> + +<para +>Interface (строковый тип, необходим): должно включать полный список поддерживаемых (полезных) интерфейсов вашими компонентами, возможно включая <interfacename +>Arts::Object</interfacename +> и, если это возможно, <interfacename +>Arts::SynthModule</interfacename +>. </para> + +<para +>Language (строковый тип, рекомендуется): если вы хотите загружать компонент динамически, то нужно указать здесь язык написания компонента. Сейчас допускается только значение <userinput +>C++</userinput +>, которое означает, что компонент был написан с использованием нормального <acronym +>API</acronym +> C++. Если вы сделали так, то вам ещё нужно установить свойство <quote +>Library</quote +>, описанное ниже. </para> + +<para +>Library (строковый тип, используется, когда это уместно): компоненты, написанные на C++, могут быть динамически загружены. Для этого вам нужно скомпилировать их в динамически загружаемые <literal role="extension" +>.la</literal +> модули, используя libtool. Здесь вы можете указать имя <literal role="extension" +>.la</literal +>-файла, который содержит ваш компонент. Не забудьте использовать REGISTER_IMPLEMENTATION (всегда). </para> + +<para +>MimeType (строковый тип, используется, когда это уместно): вcё, что связано с файлами, должно задавать это. Здесь вы можете установить стандартный mimetype в нижнем регистре, для примера <userinput +>audio/x-wav</userinput +>. </para> + +<para +>&URL; (строковый тип, используется по усмотрению автора): если вы хотите указать людям, где они могут найти последнюю версию компонента (или домашнюю страницу или что-нибудь другое), вы можете сделать это. Это может быть стандартным адресом &HTTP; или &FTP;. </para> + +</sect1> + +<!-- TODO +<sect1 id="midi-synthesis"> +<title +><acronym +>MIDI</acronym +> Synthesis</title> + +</sect1> + +<sect1 id="instruments"> +<title +>Instruments</title> + +</sect1> + +<sect1 id="session-management"> +<title +>Session Management</title> + +</sect1> + +<sect1 id="full-duplex"> +<title +>Full duplex Audio</title> + +</sect1> +--> + +<sect1 id="namespaces"> +<title +>Пространства имен в &arts;</title> + +<sect2 id="namespaces-intro"> +<title +>Введение</title> + +<para +>Каждое пространство имен соответствует <quote +>модулю</quote +>, объявленному в &IDL; &MCOP;. </para> + +<programlisting +>// mcop idl + +module M { + interface A + { + } +}; + +interface B; +</programlisting> + +<para +>В этом случае, созданный С++ код для &IDL; выглядел бы так: </para> + +<programlisting +>// C++ header + +namespace M { + /* объявление A_base/A_skel/A_stub и подобных */ + class A { // описание класса + /* [...] */ + }; +} + +/* объявление B_base/B_skel/B_stub и подобных */ +class B { + /* [...] */ +}; +</programlisting> + +<para +>Итак, когда вы ссылаетесь на классы из примера выше в вашем С++ коде, вы должны написать <classname +>M::A</classname +>, но просто B. Конечно, вы можете использовать <quote +>using M</quote +> где-нибудь - как с любыми другими пространствами имён в С++. </para> + +</sect2> + +<sect2 id="namespaces-how"> +<title +>Как &arts; использует пространства имён</title> + +<para +>Есть одно глобальное пространство имён, названное <quote +>Arts</quote +>, которое используют все программы и библиотеки, относящиеся к &arts;, для объявления своих интерфейсов. Это означает, что когда пишется С++ код, который зависит от &arts;, вы обычно должны добавлять префикс <classname +>Arts::</classname +> для каждого используемого класса, как в данном примере: </para> + +<programlisting +>int main(int argc, char **argv) +{ + Arts::Dispatcher dispatcher; + Arts::SimpleSoundServer server(Arts::Reference("global:Arts_SimpleSoundServer")); + + server.play("/var/foo/somefile.wav"); +</programlisting> + +<para +>Другая альтернатива - описать использование пространства имён <quote +>Arts</quote +> только один раз, подобно: </para> + +<programlisting +>using namespace Arts; + +int main(int argc, char **argv) +{ + Dispatcher dispatcher; + SimpleSoundServer server(Reference("global:Arts_SimpleSoundServer")); + + server.play("/var/foo/somefile.wav"); + [...] +</programlisting> + +<para +>В &IDL; файлах у вас нет выбора. Если вы пишете код, который относится к &arts;, то вы должны заключить его в конструкцию module &arts;. </para> + +<programlisting +>// IDL файл для aRts: +#include <artsflow.idl> +module Arts { // поместить это в пространство имён Arts + interface Synth_TWEAK : SynthModule + { + in audio stream invalue; + out audio stream outvalue; + attribute float tweakFactor; + }; +}; +</programlisting> + +<para +>Если вы пишете код, который не относится к &arts;, то не обязаны помещать его в пространство имён <quote +>Arts</quote +>. Конечно, вы можете сделать собственное пространство имён, если вам это нужно. В любом случае, вы должны устанавливать соответствующий префикс для классов из &arts;. </para> + +<programlisting +>// 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; + }; +}; +</programlisting> + +</sect2> + +<sect2 id="namespaces-implementation"> +<title +>Подробности: как работает реализация класса</title> + +<para +>Часто, в интерфейсах, преобразованиях, методах и пр. &MCOP; нуждается в описании имён типов или интерфейсов. Они представляются в виде строк в общей &MCOP; структуре данных, в то время как пространство имён написано на С++. Это означает, что строки содержат <quote +>M::A</quote +> и <quote +>B</quote +>, из примера выше. </para> + +<para +>Заметим, что это применяется, даже если внутри текста &IDL; не было квалификаторов пространства имён, поскольку из контекста ясно, в каком пространстве имён используется интерфейс <interfacename +>A</interfacename +>. </para> + +</sect2> +</sect1> + +<sect1 id="threads"> +<title +>Многопоточность в &arts;</title> + +<sect2 id="threads-basics"> +<title +>Основы</title> + +<para +>Многопоточность доступна не на всех платформах. Вот почему &arts; был изначально написан без использования потоков. Для всех задач может быть написано как многопоточное, так и однопоточное решение, которое делает то же самое. </para> + +<para +>Так, вместо аудиовывода в отдельном блокирующем потоке &arts; использует аудиовывод без блокировок, и узнаёт, когда нужно записывать следующий фрагмент данных с помощью функции <function +>select()</function +>. </para> + +<para +>Конечно, &arts; (в последних версиях) предоставляет поддержку для использования в объектах многопоточности. К примеру, если вы уже имеете код для проигрывателя <literal role="extension" +>mp3</literal +>, и код предполагает запуск декодера <literal role="extension" +>mp3</literal +> в отдельном потоке, то это проще всего сделать с использованием многопоточности. </para> + +<para +>Реализация &arts;/&MCOP; опирается на разделение состояний между различными объектами в явном и неявном виде. Список объектов в разделяемой области включает в себя: </para> + +<itemizedlist> +<listitem +><para +>Объект диспетчера, который осуществляет взаимодействие &MCOP;. </para> +</listitem> + +<listitem> +<para +>Подсчёт ссылок, связей (Smartwrappers). </para> +</listitem> + +<listitem> +<para +>Диспетчер ввода-вывода, который реализует таймер и следит за дескрипторами файлов. </para> +</listitem> + +<listitem> +<para +>Менеджер объектов, который создаёт объекты и динамично загружает модули. </para> +</listitem> + +<listitem> +<para +>Объект контроля потока, который вызывает calculateBlock в подходящих ситуациях. </para> +</listitem> +</itemizedlist> + +<para +>Ни один из предыдущих объектов не предполагает одновременного использования (например, вызова из различных потоков одновременно). В общем, имеются два подхода к разрешению этой проблемы: </para> + +<itemizedlist> +<listitem> +<para +>для вызова функций этих объектов требуется создать блокировку перед использованием. </para> +</listitem> + +<listitem> +<para +>написание кода этих объектов действительно безопасным с точки зрения многопоточности и/или создание для каждой потока своей копии. </para> +</listitem> +</itemizedlist> + +<para +>&arts; следует первому пути: вам нужна блокировка всякий раз, когда вы используете любой из этих объектов. Второй путь сложнее. Попытка реализовать его доступна на момент написания по ссылке <ulink url="http://space.twc.de/~stefan/kde/download/arts-mt.tar.gz" +> http://space.twc.de/~stefan/kde/download/arts-mt.tar.gz</ulink +>. На настоящий момент простой подход, возможно, работает лучше и создаёт меньше проблем с существующими приложениями. </para> + +</sect2> +<sect2 id="threads-locking"> +<title +>Когда и как задавать блокировку?</title> + +<para +>Можно установить или освободить блокировку двумя функциями: </para> + +<itemizedlist> +<listitem> +<para> +<ulink +url="http://space.twc.de/~stefan/kde/arts-mcop-doc/arts-reference/headers/Arts__Dispatcher.html#lock" +><function +>Arts::Dispatcher::lock()</function +></ulink> +</para> +</listitem> +<listitem> +<para> +<ulink +url="http://space.twc.de/~stefan/kde/arts-mcop-doc/arts-reference/headers/Arts__Dispatcher.html#unlock" +><function +>Arts::Dispatcher::unlock()</function +></ulink> +</para> +</listitem> +</itemizedlist> + +<para +>Обычно вам не нужна явная блокировка (и вы не должны пробовать делать это), если это уже сделано. Список условий, когда блокировка уже есть: </para> + +<itemizedlist> +<listitem> +<para +>Вы получаете обратный вызов из диспетчера ввода-вывода (по таймеру или через дескриптор файлов). </para> +</listitem> + +<listitem> +<para +>Вы получаете вызов какого-то &MCOP; запроса. </para> +</listitem> + +<listitem> +<para +>Вы получаете вызов менеджера оповещения. </para> +</listitem> + +<listitem> +<para +>Вы получаете вызов системы контроля потока (calculateBlock) </para> +</listitem> +</itemizedlist> + +<para +>Имеются также некоторые функции, которые вы можете вызывать только в основном потоке, и для них вам никогда не нужно получать блокировку: </para> + +<itemizedlist> +<listitem> +<para +>Конструктор/деструктор диспетчера объектов или ввода-вывода. </para> +</listitem> + +<listitem> +<para +><methodname +>Dispatcher::run()</methodname +> / <methodname +>IOManager::run()</methodname +> </para> +</listitem> + +<listitem> +<para +><methodname +>IOManager::processOneEvent()</methodname +></para> +</listitem> +</itemizedlist> + +<para +>И всё. Для всего остального, что хоть как-то взаимодействует с &arts;, вам нужно получить блокировку и освободить её сразу после завершения. Всегда. Вот простой пример: </para> + +<programlisting +>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); + } + } +} +</programlisting> + + +</sect2> + +<sect2 id="threads-classes"> +<title +>Классы для работы с многопоточностью</title> + +<para +>Доступны следующие классы: </para> + +<itemizedlist> +<listitem> +<para +><ulink url="http://www.arts-project.org/doc/headers/Arts__Thread.html" +><classname +> Arts::Thread</classname +></ulink +> - интерфейс к потокам. </para> +</listitem> + +<listitem> +<para +><ulink url="http://www.arts-project.org/doc/headers/Arts__Mutex.html" +> <classname +>Arts::Mutex</classname +></ulink +> - интерфейс к мьютексам. </para> +</listitem> + +<listitem> +<para +><ulink url="http://www.arts-project.org/doc/headers/Arts__ThreadCondition.html" +> <classname +>Arts::ThreadCondition</classname +></ulink +> - интерфейс к возобновлению условно приостановленных потоков. </para> +</listitem> + +<listitem> +<para +><ulink url="http://www.arts-project.org/doc/headers/Arts__SystemThreads.html" +><classname +>Arts::SystemThreads</classname +></ulink +> - интерфейс к потокам самой операционной системы (несколько полезных функций для прикладных программистов). </para> +</listitem> +</itemizedlist> + +<para +>См. ссылки на документацию. </para> + +</sect2> +</sect1> + +<sect1 id="references-errors"> +<title +>Ссылки и обработка ошибок</title> + +<para +>Ссылки &MCOP; - одна из основных концепций в программировании &MCOP;. В этой части описано, как используются ссылки, и даётся попытка осветить случаи отказов (сбоев работы сервера). </para> + +<sect2 id="references-properties"> +<title +>Основные свойства ссылок</title> + +<itemizedlist> +<listitem> +<para +>Ссылка &MCOP; не является объектом, но ссылается на объект: даже если следующее объявление, <programlisting> + Arts::Synth_PLAY p; +</programlisting +> выглядит похожим на определение объекта, оно только объявляет ссылку на объект. Как С++ программист, вы можете воспринимать это как Synth_PLAY *, указатель на объект Synth_PLAY. Главным образом это означает, что p подобно указателю на NULL. </para> +</listitem> + +<listitem> +<para +>Вы можете создать ссылку на NULL явно. </para> +<programlisting +>Arts::Synth_PLAY p = Arts::Synth_PLAY::null(); +</programlisting> +</listitem> + +<listitem> +<para +>Вызов функций с использованием ссылки на NULL приводит к сбою в core </para> +<programlisting +>Arts::Synth_PLAY p = Arts::Synth_PLAY::null(); + string s = p.toString(); +</programlisting> +<para +>приводит к сбою. Сравним с указателями, по существу это похоже на <programlisting> + QWindow* w = 0; + w->show(); +</programlisting +>. Каждый программист С++ знает, как избегать таких ситуаций. </para> +</listitem> + +<listitem> +<para +>Неинициализированные объекты кое-как пытаются создать себя сами при первом использовании </para> + +<programlisting +>Arts::Synth_PLAY p; + string s = p.toString(); +</programlisting> +<para +>это несколько отличается от разыменования указателя на NULL. Вы вообще не указали объекту, чем он является, и пытаетесь использовать его. Вообразим здесь, что вы хотели иметь новую локальную копию объекта Arts::Synth_PLAY. Конечно вы могли хотеть что-то ещё (вроде создания объекта где-то ещё или использования существующего внешнего объекта. Так или иначе, объект будет как-то создан, но созданный подобным образом объект не будет работать до тех пор пока вы не присвоите ему какое-то значение (также как и нулевая ссылка). </para> + +<para +>Эквивалент в терминах С++<programlisting> + QWidget* w; + w->show(); +</programlisting +> что в C++ безусловно приводит к ошибке обращения к памяти. Итак, есть отличия. Такое создание объекта может быть ошибочным потому, что необязательно существует реализация вашего интерфейса. </para> + +<para +>Для примера, рассмотрим абстрактную конструкцию, подобную Arts::PlayObject. Имеются вполне определённые объекты для воспроизведения mp3 или wav, но <programlisting> + Arts::PlayObject po; + po.play(); +</programlisting +> точно не будет работать. Проблема в том, что хотя код пытается как-то создать объект PlayObject, это не работает, так как имеются только реализации, подобные Arts::WavPlayObject. Так что создавать объекты вы можете только тогда, когда существует реализация. </para> +</listitem> + +<listitem> +<para +>Ссылки могут указывать на один и тот же объект </para> + +<programlisting +>Arts::SimpleSoundServer s = Arts::Reference("global:Arts_SimpleSoundServer"); + Arts::SimpleSoundServer s2 = s; +</programlisting> + +<para +>создаст две ссылки на один и тот же объект. Это не копирование значений и не создание двух объектов. </para> +</listitem> + +<listitem> +<para +>Все ссылки на объекты подсчитываются. Так что объект, на который нет ссылок, удаляется. Нет специальных методов для удаления объектов, однако, вы можете использовать что-то похожее на это <programlisting> + Arts::Synth_PLAY p; + p.start(); + [...] + p = Arts::Synth_PLAY::null(); +</programlisting +> для удаления объекта Synth_PLAY в конце. В особенности, никогда не требуется использовать new и delete вместе со ссылками. </para> +</listitem> +</itemizedlist> + +</sect2> + +<sect2 id="references-failure"> +<title +>Случаи сбоев</title> + +<para +>Ссылки могут указывать на внешние объекты, а серверы, содержащие такие объекты, могут упасть. Что тогда происходит? </para> + +<itemizedlist> + +<listitem> +<para +>Сбой сервера не изменяет ссылку, если это нулевая ссылка. Это означает, что если <function +>foo.isNull()</function +> была <returnvalue +>true</returnvalue +> до падения сервера, тогда она также вернёт <returnvalue +>true</returnvalue +> и после падения сервера. Это также означает, что, если <function +>foo.isNull()</function +> была <returnvalue +>false</returnvalue +> до падения сервера (ссылка foo ссылалась на объект), тогда она также вернёт <returnvalue +>false</returnvalue +> и после падения сервера. </para> +</listitem> + +<listitem> +<para +>Вызовы методов действительной ссылки безопасны. Предположим, что сервер содержащий объект calc, упал. Подобный вызов <programlisting> + int k = calc.subtract(i,j) +</programlisting +>безопасен. Явно subtract вернёт что-то неверное, потому что внешний объект уже не существует. В этом случае (k == 0) может быть верным. В основном, операции возвращают в качестве результата что-нибудь <quote +>нейтральное</quote +>, как 0.0, нулевые ссылки на объекты или пустые строки, когда объект более не существует. </para> +</listitem> + +<listitem> +<para +>Существует функция <function +>error()</function +> для проверки того, как что-то отработало. </para> + +<para +>В предыдущем случае, <programlisting> + int k = calc.subtract(i,j) + if(k.error()) { + printf("k is not i-j!\n"); + } +</programlisting +> может вывести <computeroutput +>k is not i-j</computeroutput +>, если внешний вызов не работает. Иначе <varname +>k</varname +> будет действительным результатом выполнения операции subtract, выполненной внешним объектом (сервер не разрушен). Однако для методов, выполняющих операции подобные удалению файлов, вы не можете знать, что произошло в действительности. Конечно, это произошло, если <function +>.error()</function +> вернула <returnvalue +>false</returnvalue +>. Однако, если <function +>.error()</function +> вернула <returnvalue +>true</returnvalue +>, существуют две возможности: </para> + +<itemizedlist> +<listitem> +<para +>Файл удалён и сервер упал сразу после удаления, но до передачи результата. </para> +</listitem> + +<listitem> +<para +>Сервер упал до удаления файла. </para> +</listitem> +</itemizedlist> +</listitem> + +<listitem> +<para +>Использование вложенных вызовов опасно в отказоустойчивых программах </para> + +<para +>Использование кода <programlisting> + window.titlebar().setTitle("foo"); +</programlisting +> - плохая идея. Предположим, вы знаете, что ссылка на Window действительна. Предположим, вы вы знаете, что функция <function +>window.titlebar()</function +> возвратит ссылку на Titlebar, так как объект Window реализован верно. Однако этот код остаётся небезопасным. </para> + +<para +>Что может случится, когда сервер, содержащий объект Window, падает? Невзирая на то, как хорошо реализован объект Window, операция window.titlebar() вернёт вам нулевую ссылку. И затем вызов setTitle приводит к сбою. </para> + +<para +>Итак, безопасный вариант может быть таким: <programlisting> + Titlebar titlebar = window.titlebar(); + if(!window.error()) + titlebar.setTitle("foo"); +</programlisting +>. Добавьте подходящую обработку ошибок, если вам нужно. Если вы не доверяете реализации Window, используйте код <programlisting> + Titlebar titlebar = window.titlebar(); + if(!titlebar.isNull()) + titlebar.setTitle("foo"); +</programlisting +>, который безопаснее. </para> +</listitem> +</itemizedlist> + +<para +>Имеются другие условия для сбоев, такие как нарушение сетевого соединения (предположим вы удалили кабель между сервером и клиентом, пока ваше приложение работает). Однако, такой эффект подобен сбою сервера. </para> + +<para +>В целом, это ваш подход к тому, насколько строго вы пробуете отследить ошибки взаимодействия внутри вашего приложения. Можно следовать методу <quote +>если сервер падает, нужно отлаживать сервер, пока он совсем не перестанет падать</quote +>, который означает, что вам не нужно беспокоиться обо всех этих проблемах. </para> + +</sect2> + +<sect2 id="references-internals"> +<title +>Подробности: Распределённый подсчёт ссылок</title> + +<para +>Объект может существовать только, когда им владеет кто-то. Если это не так, то он немедленно прекращает существовать. Владелец указывается с помощью счётчика ссылок на объект, который увеличивается при вызове функции <function +>_copy()</function +> и уменьшается при вызове функции <function +>_release()</function +>. Как только счётчик ссылок установится в ноль, объект удаляется. </para> + +<para +>Как вариант, удалённое (внешнее) использование устанавливается функцией <function +>_useRemote()</function +>, и аннулируется функцией <function +>_releaseRemote()</function +>. Эти функции ведут список серверов, из вызвавших (и поэтому владеющих объектами). Это используется в случае отключения сервера (например при его падении или сбое сети), для удаления оставшихся ссылок на объекты, с использованием функции <function +>_disconnectRemote()</function +>. </para> + +<para +>Снова проблема. Рассмотрим возвращаемое значение. Обычно возвращаемое значение-объект не принадлежит вызывающей функцией. Оно, однако, также не принадлежит вызывающему объекту, до тех пор пока сообщение, содержащее объект, не будет получено. Итак, какое-то время объекты остаются <quote +>беспризорными</quote +>. </para> + +<para +>Теперь, когда посылается объект, можно быть уверенным, что как только он будет получен, то его владельцем будет кто-нибудь снова, если только принимающий объект сам не успел уничтожиться. Тем не менее, это означает, что объект нужно поддерживать особо по крайней мере в течение его отправки, а возможно также и в течение приёма, чтобы он - объект - не исчез мгновенно. </para> + +<para +>&MCOP; делает это с помощью <quote +>меток</quote +> объектов, которые находятся в процессе копирования. До начала копирования, вызывается функция <function +>_copyRemote</function +>. Это защищает объект от освобождения в течение 5 секунд. Когда принимающая сторона вызывает <function +>_useRemote()</function +>, метка снова сбрасывается. Итак все объекты, которые пересылаются, помечаются перед отправкой по сети. </para> + +<para +>Если принимающая сторона принимает объект, который находится на том же сервере, то для этого, конечно же, не используется функция <function +>_useRemote()</function +>. Для специального случая существует функция <function +>_cancelCopyRemote()</function +> для удаления метки вручную. Имеются также способы удаления метки, основанные на таймере, но принимающая сторона в действительности может не получить объект (из-за падения сервера, сбоя сети). Тогда удаление меток выполняется с помощью специального класса <classname +>ReferenceClean</classname +>. </para> + +</sect2> + +</sect1> + +<sect1 id="detail-gui-elements"> +<title +>Элементы графического пользовательского интерфейса</title> + +<para +>Элементы графического пользовательского интерфейса сейчас в стадии разработки. Эта глава описывает то, что будет воплощено, так что если вы разработчик, то сможете понять как &arts; будет работать с графическим пользовательским интерфейсом в будущем. Уже есть некоторый готовый код. </para> + +<para +>Элементы графического интерфейса могут быть использованы для создания структур, взаимодействующих с пользователем. В простейшем случае пользователь мог бы непосредственно изменять некоторые параметры структуры (такие как уровень усиления, который используется в конце, перед воспроизводящим модулем). </para> + +<para +>В более сложных настройках пользователь мог бы измененять параметры группы структур и/или ещё не работающих структур, таких как изменение группы <acronym +>ADSR</acronym +> активного инструмента &MIDI;, или установка имени файла для некоторых инструментов. </para +> + +<para +>Также пользователю мог бы понадобиться монитор состояния синтезатора. Может представить себе осциллограф, спектроанализатор, измеритель уровня громкости и другие устройства для экспериментирования, которые рисовали бы кривую передаточной функции выбранного фильтра. </para> + +<para +>Наконец, элементы интерфейса должны уметь управлять всеми структурами, того что запущено внутри &arts;. Пользователь должны уметь устанавливать инструменты для каналов midi, запуская новые эффекты, конфигурируя основной микшер, который встроен в структуру &arts;, для усиления какого-либо канала и использования другой стратегии для эквалайзеров. </para> + +<para +>Вы видите - элементы пользовательского графического интерфейса, должны воспроизвести все возможности виртуальной студии &arts; для пользователя. Конечно, они также должны элегантно взаимодействовать со входами midi (бегунки должны перемещаться, если они управляют входами &MIDI;, которые также изменяются как параметры), и возможно создавать события, предоставлять пользователю возможность записывать звук на секвенсер. </para> + +<para +>Если говорить техническим языком, речь идёт о базовом классе на &IDL; для всех графических элементов (<classname +>Arts::Widget</classname +>), и наследовании из него (например <classname +>Arts::Poti</classname +>, <classname +>Arts::Panel</classname +>, <classname +>Arts::Window</classname +>, ...). </para> + +<para +>Тогда можно было бы реализовать эти графические примитивы, используя инструментарий, к примеру &Qt; или Gtk. Наконец, эффекты должны строить свой интерфейс на базе существующих элементов. Скажем, эффект freeverb может построить свой интерфейс с помощью пяти <classname +>Arts::Poti</classname +> и одного <classname +>Arts::Window</classname +>. Итак, если есть реализация таких окон на &Qt;, то эффекты могут отображать себя, используя &Qt;. Если имеется реализация на Gtk, то также можно работать с Gtk (что должно более или менее выглядеть и работать схожим образом). </para> + +<para +>Наконец, поскольку мы здесь используем &IDL;, &arts-builder; (или другой инструмент) может визуально встраивать элементы интерфейса или автоматически создавать их из подсказок для параметров, основываясь только на интерфейсах. Совсем несложно написать класс <quote +>создания элементов интерфейса по их описанию</quote +>, который использует описание &GUI; и создаёт живой объект элемент интерфейса. </para> + +<para +>Опираясь на &IDL; и компонентную модель &arts;/&MCOP;, будет легко расширять объекты, которые могут быть использованы для построения пользовательского интерфейса, также как это сделано для добавления отдельных модулей, реализующих новые фильтры для &arts;. </para> + +</sect1> + +</chapter> diff --git a/tde-i18n-ru/docs/tdemultimedia/artsbuilder/digitalaudio.docbook b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/digitalaudio.docbook new file mode 100644 index 00000000000..93998e657b5 --- /dev/null +++ b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/digitalaudio.docbook @@ -0,0 +1,16 @@ +<!-- <?xml version="1.0" ?> +<!DOCTYPE appendix PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN" "dtd/kdex.dtd"> +To validate or process this file as a standalone document, uncomment +this prolog. Be sure to comment it out again when you are done --> + +<appendix id="intro-digital-audio"> +<title +>Введение в цифровое аудио</title> + +<para +>оцифровка, фильтры, эффекты и т. д.</para> + +</appendix> + + + diff --git a/tde-i18n-ru/docs/tdemultimedia/artsbuilder/faq.docbook b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/faq.docbook new file mode 100644 index 00000000000..efd2875816b --- /dev/null +++ b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/faq.docbook @@ -0,0 +1,1296 @@ +<!-- <?xml version="1.0" ?> +<!DOCTYPE chapter PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN" "dtd/kdex.dtd"> +To validate or process this file as a standalone document, uncomment +this prolog. Be sure to comment it out again when you are done --> +<chapter id="faq"> +<title +>Вопросы и ответы</title> + +<para +>В этом разделы вы найдёте ответы на часто задаваемые вопросы об &arts;. </para> + +<qandaset id="faq-general"> +<title +>Общие вопросы</title> + +<qandaentry> +<question> +<para +>Поддерживает ли &kde; мою звуковую карту? </para> +</question> + +<answer> +<para +>Для воспроизведения звуков &kde; использует &arts;, а &arts; - драйверы ядра &Linux;: <acronym +>OSS</acronym +> или <acronym +>ALSA</acronym +> (с эмуляцией <acronym +>OSS</acronym +>). Всё будет работать, если они поддерживают вашу звуковую карту и она правильно настроена (т.е. другие приложения &Linux; могут производить звуки). Однако, с конкретным оборудованием могут возникнуть проблемы, об этом можно прочитать <link linkend="faq-hardware-specific" +>в разделе о проблемах с оборудованием </link +>. </para> +<para +>Кроме того, мы постоянно расширяем список поддерживаемых платформ. Это список для последней версии, если вашей там не оказалось, попробуйте портировать &arts; на нее. </para> + +<informaltable> +<tgroup cols="2"> +<thead> +<row> +<entry +>Ввод и вывод звука в &arts;</entry> +<entry +>Комментарий</entry> +</row> +</thead> + +<tbody> +<row> +<entry +>paud</entry> +<entry +>Поддержка AIX Personal Audio Device</entry> +</row> + +<row> +<entry +>alsa</entry> +<entry +>Драйверы ALSA-0.5 и ALSA-0.9 для Linux</entry> +</row> + +<row> +<entry +>libaudioio</entry> +<entry +>Поддержка библиотеки LibAudioIO для Solaris</entry> +</row> + +<row> +<entry +>nas</entry> +<entry +>Поддержка звукового сервера NAS, используется для X-терминалов с NAS</entry> +</row> + +<row> +<entry +>null</entry> +<entry +>Нулевое аудиоустройство, стирает данные о звуке</entry> +</row> + +<row> +<entry +>oss</entry> +<entry +>Поддержка OSS (Open Sound System), работает под Linux, различными BSD и другими платформами с установленными драйверами OSS</entry> +</row> + +<row> +<entry +>toss</entry> +<entry +>Расширенная поддержка OSS, исполльзуется тогда, когда стандартная система не работает.</entry> +</row> + +<row> +<entry +>sgi</entry> +<entry +>Поддержка SGI Direct Media для IRIX</entry> +</row> + +<row> +<entry +>sun</entry> +<entry +>Поддержка Solaris</entry> +</row> + +</tbody> +</tgroup> +</informaltable> +</answer> +</qandaentry> + +<qandaentry> +<question> +<para +>&artsd; не может воспроизводить файлы <literal role="extension" +>wav</literal +>! </para> +</question> + +<answer> +<para +>Проверьте, собрано ли приложение &artsd; с поддержкой <filename +>libaudiofile</filename +> (<userinput +><command +>ldd</command +> <parameter +>artsd</parameter +></userinput +>). Если нет, скачайте пакет tdesupport и скомпилируйте всё ещё раз. Будет работать. </para> +</answer> +</qandaentry> + +<qandaentry> +<question> +<para +>Я могу слышать звук только когда вхожу в систему как пользователь <systemitem class="username" +>root</systemitem +>, у остальных звука нет! </para> +</question> + +<answer> +<para +>На то, могут ли пользователи включать звук, влияют права в файле <filename class="devicefile" +>/dev/dsp</filename +>. Чтобы дать права всем пользователям , сделайте следущее: </para> + +<procedure> +<step> +<para +>Войдите в систему как пользователь <systemitem class="username" +>root</systemitem +>. </para> +</step> + +<step> +<para +>Откройте окно &konqueror;. </para> +</step> + +<step> +<para +>Перейдите в каталог <filename class="directory" +>/dev</filename +>. </para> +</step> + +<step> +<para +>Нажмите <mousebutton +>правую</mousebutton +> кнопку мыши на файле <filename +>dsp</filename +> и откройте свойства. </para> +</step> + +<step> +<para +>Откройте вкладку <guilabel +>Права</guilabel +>. </para> +</step> + +<step> +<para +>Выделите <guilabel +>Чтение</guilabel +> и <guilabel +>Запись</guilabel +> во всех строках. </para> +</step> + +<step> +<para +>Нажмите кнопку <guibutton +>OK</guibutton +>. </para> +</step> +</procedure> + +<para +>Или вы можете открыть окно терминала и набрать команду <userinput +><command +>chmod</command +> <option +>666</option +> <parameter +>/dev/dsp</parameter +></userinput +>. </para> + +<para +>Для ограничения прав доступа конкретных пользователей используйте права групп. В некоторых дистрибутивах &Linux;, к примеру, в Debian/Potato, право доступа к <filename class="devicefile" +>/dev/dsp</filename +> имеет группа <systemitem class="groupname" +>audio</systemitem +>, вам остаётся только добавить в эту группу пользователей. </para> +</answer> +</qandaentry> + +<qandaentry> +<question> +<para +>Это помогло для &artsd;, а что делать с &kmix;, &kmid;, &kscd; и т. д.? </para> +</question> +<answer> + +<para +>Есть и другие устройства для воспроизведения звука, к которым обращаются мультимедиа-приложения. Настраивать их можно так же, т. е. давать право доступа всем пользователям или группе. Этот список может быть и неполным (к тому же, есть устройства вроде <filename class="devicefile" +>midi0</filename +>, <filename class="devicefile" +>midi1</filename +>, ...: здесь перечислены только имена с 0). </para> + +<itemizedlist> +<listitem> +<para> +<filename class="devicefile" +>/dev/admmidi0</filename> +</para> +</listitem> +<listitem> +<para> +<filename class="devicefile" +>/dev/adsp0</filename> +</para> +</listitem> +<listitem> +<para> +<filename class="devicefile" +>/dev/amidi0</filename> +</para> +</listitem> +<listitem> +<para> +<filename class="devicefile" +>/dev/amixer0</filename> +</para> +</listitem> +<listitem> +<para> +<filename class="devicefile" +>/dev/audio</filename> +</para> +</listitem> +<listitem> +<para> +<filename class="devicefile" +>/dev/audio0</filename> +</para> +</listitem> +<listitem> +<para> +<filename class="devicefile" +>/dev/cdrom</filename> +</para> +</listitem> +<listitem> +<para> +<filename class="devicefile" +>/dev/dmfm0</filename> +</para> +</listitem> +<listitem> +<para> +<filename class="devicefile" +>/dev/dmmidi0</filename> +</para> +</listitem> +<listitem> +<para> +<filename class="devicefile" +>/dev/dsp</filename> +</para> +</listitem> +<listitem> +<para> +<filename class="devicefile" +>/dev/dsp0</filename> +</para> +</listitem> +<listitem> +<para> +<filename class="devicefile" +>/dev/midi0</filename> +</para> +</listitem> +<listitem> +<para> +<filename class="devicefile" +>/dev/midi0</filename> +</para> +</listitem> +<listitem> +<para> +<filename class="devicefile" +>/dev/midi00</filename> +</para> +</listitem> +<listitem> +<para> +<filename class="devicefile" +>/dev/midi00</filename> +</para> +</listitem> +<listitem> +<para> +<filename class="devicefile" +>/dev/mixer</filename> +</para> +</listitem> +<listitem> +<para> +<filename class="devicefile" +>/dev/mixer0</filename> +</para> +</listitem> +<listitem> +<para> +<filename class="devicefile" +>/dev/mpu401data</filename> +</para> +</listitem> +<listitem> +<para> +<filename class="devicefile" +>/dev/mpu401stat</filename> +</para> +</listitem> +<listitem> +<para> +<filename class="devicefile" +>/dev/music</filename> +</para> +</listitem> +<listitem> +<para> +<filename class="devicefile" +>/dev/rmidi0</filename> +</para> +</listitem> +<listitem> +<para> +<filename class="devicefile" +>/dev/rtc</filename> +</para> +</listitem> +<listitem> +<para> +<filename class="devicefile" +>/dev/sequencer</filename> +</para> +</listitem> +<listitem> +<para> +<filename class="devicefile" +>/dev/smpte0</filename> +</para> +</listitem> +<listitem> +<para> +<filename class="devicefile" +>/dev/sndstat</filename> +</para> +</listitem> +</itemizedlist> +</answer> +</qandaentry> + +<qandaentry> +<question> +<para +>Что делать, если artsd не запускается или работает с ошибками?</para> +</question> + +<answer> +<para +>Прежде всего, попробуйте установить параметры по умолчанию в &kcontrol; (или, если вы начинаете работу в ручном режиме, не задавайте дополнительных параметров, кроме <userinput +><option +>-F</option +><parameter +>10</parameter +> <option +>-S</option +><parameter +>4096</parameter +></userinput +> для задержки). Наиболее высокая вероятность ошибки в <emphasis +>двустороннем режиме</emphasis +>, поэтому постарайтесь его отключить. </para> + +<para +>Хороший способ понять, почему &artsd; не запускается (или работает с ошибками) - это запустить его вручную. Откройте окно &konsole; и сделайте следущее: </para> + +<screen width="40" +><prompt +>%</prompt +> <userinput +><command +>artsd</command +> <option +>-F</option +><parameter +>10</parameter +> <option +>-S</option +><parameter +>4096</parameter +></userinput +></screen> + +<para +>Вы можете добавить параметр <option +>-l0</option +>, который выведет больше информации о том, что происходит: </para> +<screen width="40" +><prompt +>%</prompt +> <userinput +><command +>artsd</command +> <option +>-l0</option +> <option +>-F</option +><parameter +>10</parameter +> <option +>-S</option +><parameter +>4096</parameter +></userinput +></screen> + +<para +>Вы, возможно, получите объяснение того, почему &artsd; не запускается. Или, если во время работы возникают ошибки, вы увидите, <quote +>где</quote +> они. Если хотите сообщить об ошибке, вложите лог с <command +>gdb</command +> и/или <command +>strace</command +>. </para> +</answer> +</qandaentry> + +<qandaentry> +<question> +<para +>Могу ли я переместить &artsd; (перенести скомпилированные файлы в другой каталог)?</para> +</question> + +<answer> +<para +>Вы не сможете переместить &arts; без проблем. Дело в том, что информация о расположении скомпилированного &artsd; хранится в &artswrapper; (это необходимо для обеспечения безопасности). Однако вы можете заставить перемещённый &artsd; хотя бы находить компоненты, для этого используйте файл <filename +>.mcoprc</filename +> (TraderPath/ExtensionPath entries). Подробности - в <link linkend="the-mcoprc-file" +>главе о файле <filename +>.mcoprc</filename +></link +>. </para> +</answer> +</qandaentry> + +<qandaentry> +<question> +<para +>Могу ли я скомпилировать &arts; gcc-3.0?</para> +</question> + +<answer> +<para +>Если коротко, нет. скомпилированный gcc-3.0 &arts; не будет работать. </para> + +<para +>В официальной версии содержатся две ошибки, влияющие на &arts;. Первая - gcc-3.0 bug c++/2733 относительно безобидна (и должна справляться с проблемами инструкций ассемблера). Она прерывает компиляцию convert.cc и исправлена в gcc-3.0 CVS. Ее не должно быть в gcc-3.0.1 и выше. Также была доработана CVS-версия KDE/aRts. </para> +<para +>Вторая - gcc-3.0 bug, c++/3145 (генерация неправильного кода для некоторых случаев множественного виртуального наследования) гораздо важнее. Такие приложения, как &artsd;, не будут запускаться после компиляции с gcc-3.0. Даже если в gcc-3.0 что-то исправили за время написания этого FAQ, &artsd; всё равно очень часто и непредсказуемо прекращает работу. </para> +</answer> +</qandaentry> +<qandaentry> +<question> +<para +>Какие приложения работают с &arts;?</para> +</question> +<answer> + +<para +>Вообще, все приложения &kde; работают с &arts;: </para> + +<itemizedlist> +<listitem +><para +>&noatun;</para +></listitem> +<listitem +><para +>&arts-builder;</para +></listitem> +<listitem +><para +>&aktion;</para +></listitem> +<listitem +><para +>&kmid;</para +></listitem> +<listitem +><para +>&kmidi;</para +></listitem> +<listitem +><para +>&kmix;</para +></listitem> +<listitem +><para +>&kscd;</para +></listitem> +<listitem +><para +>такие игры &kde;, как &kpoker; и &ktuberling;</para +></listitem> +</itemizedlist> + +<para +>Некоторые приложения, пока не включённые в &kde; (к примеру, в kdenonbeta), всё же поддерживают &arts;: </para> + +<itemizedlist> +<listitem +><para +>&brahms;</para +></listitem> +<listitem +><para +><application +>Kaboodle</application +></para +></listitem> +<listitem +><para +><application +>Kdao</application +></para +></listitem> +</itemizedlist> + +<para +>С &arts; работают и следущие приложения (не для &kde;): </para> + +<itemizedlist> +<listitem +><para +><application +>xmms</application +> (с модулем &arts;)</para +></listitem> +<listitem +><para +>Real Networks <application +>RealPlayer</application +> 8.0 (работает с &artsdsp;, полная поддержка &arts; в разработке)</para +></listitem> +</itemizedlist> + +<para +>Следущие приложения <emphasis +>не</emphasis +> работают с &arts;: </para> + +<itemizedlist> +<listitem +><para +>нет</para +></listitem> +</itemizedlist> + +<para +>См. также ответы на вопросы о <link linkend="faq-non-arts" +> приложениях не для &arts;</link +>. </para> + +<para +>Этот раздел ещё не закончен. Если вы знаете, какие приложения работают (или не работают) с &arts;, напишите автору, чтобы дополнить списки. </para> +</answer> +</qandaentry> + +</qandaset> + +<qandaset id="faq-non-arts"> +<title +>Приложения не для &arts;</title> + +<qandaentry> +<question> +<para +>Как только запускается &kde;, ни одно приложение не может получить доступ к звуковой карте! </para> +</question> +<answer> +<para +>Так как звуковой сервер &arts; запускается вместе с &kde;, он использует звуковую карту. Если сервер бездействует 60 секунд, он автоматически прекращает работу и освобождает устройство. </para> +</answer> +</qandaentry> + +<qandaentry> +<question> +<para +>Вы сказали, что сервер ждёт 60 секунд, а у меня не так! </para> +</question> +<answer> +<para +>Если вы запускаете artsd с панели управления KDE время ожидания по умолчанию будет 60 секунд. Если же из командной строки, нужно указывать его с помощью параметра -s. </para> +<para +>При использовании двустороннего режима сервер не отключается. Выключите его в &kcontrol;. Это вообще хорошая мысль, если вы используете &arts; только для прослушивания музыки, а не для записи. </para> +</answer> +</qandaentry> + +<qandaentry> +<question> +<para +>Могу ли я запускать старые приложения, не поддерживающие &arts;? </para> +</question> + +<answer> +<para +>Запускайте их с помощью &artsdsp;. К примеру, если обычно вы запускаете их так: </para> + +<screen +><prompt +>%</prompt +> <userinput +><command +>mpg123</command +> <option +>foo.mp3</option +></userinput +></screen> + +<para +>теперь набирайте следущее:</para> + +<screen +><prompt +>%</prompt +> <userinput +><command +>artsdsp</command +> <option +>mpg123 foo.mp3</option +></userinput +></screen> + +<para +>Звуковой выход будет перенаправляться в &arts;. Так вы не внесёте каких-либо изменений в ваши приложения. Вообще говоря, это уловка, и некоторые приложения могут не работать, или не будут использоваться все возможности звуковой карты. </para> +</answer> +</qandaentry> + +<qandaentry> +<question> +<para +>Я не могу запустить &artsdsp; никаким приложением, всё время выскакивают ошибки! </para> +</question> +<answer> +<para +>Вам нужна последняя версия библиотеки glibc; &artsdsp; не работает на более ранних дистрибутивах &Linux;. К примеру, в Debian 2.1 (основанный на glibc 2.0) он не работает, а в Debian 2.2 (основанный на glibc 2.1.3) работает. </para> +</answer> +</qandaentry> + +<qandaentry> +<question> +<para +>Есть ли какие-нибудь теоретические ограничения работы некоторых приложений с &artsdsp;? </para> +</question> +<answer> +<para +>Нет. Использование &artsdsp; может вылиться в большую задержку и более активное использовании процессора, чем при использовании &arts; <acronym +>API</acronym +>. Если всё-таки какое-то приложение не работает, это ошибка в &artsdsp;. Техника, применяемая в &artsdsp;, если она правильно реализована, должна позволять <emphasis +>каждому</emphasis +> приложению работать (включая такие объёмные приложения, как <application +>Quake</application +> 3). </para> +</answer> +</qandaentry> + +<qandaentry> +<question> +<para +>Что мне делать, если приложение не работает с &artsdsp;? </para> +</question> +<answer> +<para +>Вы можете подождать, пока отключится &artsd;, или отключить его самостоятельно. Для этого наберите в командной строке <userinput +><command +>artsshell</command +> <option +>suspend</option +> </userinput +>. Если в данный момент не работают никакие приложения &arts;, сервер отключится (и вы не сможете их запустить). </para> + +<para +>Если сервер занят, попробуйте грубый, но эффективный метод: </para> + + +<screen +><prompt +>%</prompt +> <userinput +><command +>killall</command +> <option +>artsd</option +> ; <command +>killall</command +> <option +>artswrapper</option +></userinput> +<lineannotation +>Теперь запустите своё приложение.</lineannotation> +<prompt +>%</prompt +> <userinput +><command +>kcminit</command +> <option +>arts</option +></userinput +> +</screen> + +<para +>Работающие приложения &arts; завершатся с ошибками, если вы отключите сервер. </para> +</answer> +</qandaentry> +<qandaentry> +<question> +<para +>Что насчет приложений, написанных под &kde; 1.x? </para> +</question> +<answer> +<para +>Если вы работаете с приложениями &kde; 1.x, которые воспроизводят звук через звуковой сервер &kde; 1, запустите <application +>kaudioserver</application +>. Это делается так же, как и для не-&arts; приложений. </para> + +<screen +><prompt +>%</prompt +> <userinput +><command +>artsdsp</command +> <option +>kaudioserver</option +></userinput +> +</screen> + +<para +>Вам нужно установить kaudioserver (взятый из того же источника, что и ваши приложения для &kde; 1.x), он принадлежит &kde; 1.x, а не &kde; 2. </para> +</answer> +</qandaentry> + +<qandaentry> +<question> +<para +>Как насчёт приложений, использующих облегчённый звуковой сервис <acronym +>ESD</acronym +>? </para> +</question> +<answer> +<para +>Выход такой же, как и с приложениями <application +>kaudioserver</application +>. Вам нужно запустить сервер esd (это можно сделать с помощью &artsdsp;), тогда все приложения, поддерживающие <acronym +>ESD</acronym +>, будут работать: </para> +<screen +><prompt +>%</prompt +> <userinput +><command +>artsdsp</command +> <option +>esd</option +></userinput +> +</screen> +<para +>Свежие версии aRts ( +>= 1.2.0) могут также работать с ESD (enlightened sound daemon). Укажите в командной строке параметр -a, например: </para> +<screen +><prompt +>%</prompt +> <userinput +><command +>artsd</command +> <option +>-a esd</option +></userinput +> +</screen> +<para +>для глобальной поддержки ESD в KDE, настройте artsd на работу с esd в разделе Центра управления Звук -> Звуковой сервер -> Ввод-вывод звука. </para> +</answer> +</qandaentry> + +</qandaset> + +<qandaset id="faq-latency"> +<title +>Задержка</title> + +<qandaentry> +<question> +<para +>Во время прослушивания иногда слышны короткие паузы. Это ошибка? </para> +</question> +<answer> +<para +>Скорее всего, это не ошибка, но паузы говорят о том, что ядро &Linux; не справляется с работой в режиме реального времени. Могут возникнуть ситуации, когда &arts; не сможет продолжать воспроизведение. Вы, однако, можете дать права реального времени (в &kcontrol;) и уменьшить задержку (<guilabel +>250ms</guilabel +> или <guilabel +>не важно</guilabel +>), чтобы улучшить ситуацию. </para> +</answer> +</qandaentry> + +<qandaentry> +<question> +<para +>Какой эффект у параметра времени ответа? </para> +</question> +<answer> +<para +>Статья помощи по этому параметру в &kcontrol;, возможно, введёт вас в заблуждение. Чем меньше значение, тем меньше времени требуется &arts;, чтобы ответить на внешние события (т.е. время после закрытия окна и до воспроизведения звука), тем больше требуется ресурсов процессора и тем больше вероятность выпаданий.</para> +</answer> +</qandaentry> + +<qandaentry> +<question> +<para +>Есть ли ещё какие-нибудь способы убрать паузы? </para> +</question> +<answer> +<para +>Если вы пользуетесь драйвером <acronym +>IDE</acronym +>, напишите команду <command +>hdparm</command +> для переключения <acronym +>IDE</acronym +> в режим <acronym +>DMA</acronym +>. Это работает не для всех устройств и, возможно, будет трудно вернуться в начальное сотояние или, в очень редких случаях, будут потеряны данные. Чтобы узнать подробности, прочтите документацию по команде <command +>hdparm</command +>. У меня всё получилось с командой: </para> + +<screen +><prompt +>%</prompt +> <userinput +><command +>hdparm</command +> <option +>-c1</option +> <option +>-d1</option +> <option +>-k1</option +> <option +>-K1</option +> <parameter +>/dev/hda</parameter +></userinput +> +</screen> + +<para +>Вам нужно будет проделывать это при каждом запуске системы. Возможно, вы захотите добавить её в сценарий запуска системы (это зависит от дистрибутива, в Debian &Linux; он обычно находится в <filename +>/etc/rc.boot</filename +>). </para> +</answer> +</qandaentry> + +<qandaentry> +<question> +<para +>Приоритет реального времени на меня совсем не влияет? </para> +</question> +<answer> +<para +>Убедитесь в том, что artswrapper действительно установлен suid <systemitem class="username" +>root</systemitem +>, как это должно быть. Во многих дистрибутивах (SuSE7.x, к примеру) это не делается. Проверить это можно так: ls -l $(which artswrapper). Хорошо: <screen> +<prompt +>%</prompt +> <userinput +><command +>ls</command +> <option +>-l</option +> <parameter +>$(which artswrapper)</parameter +></userinput> +-rwsr-xr-x 1 root root 4556 Sep 24 18:05 /opt/kde2/bin/artswrapper +</screen +> Плохо: <screen> +<prompt +>%</prompt +> <userinput +><command +>ls</command +> <option +>-l</option +> <parameter +>$(which artswrapper)</parameter +></userinput> +-rwxr-xr-x 1 root root 4556 Sep 24 18:05 /opt/kde2/bin/artswrapper +</screen +> Если у вас нет s, его можно получить с помощью: <screen +><prompt +>%</prompt +> <userinput +><command +>chown</command +> <option +>root</option +> <parameter +>$(which artswrapper)</parameter +></userinput> +<prompt +>%</prompt +> <userinput +><command +>chmod</command +> <option +>4755</option +> <parameter +>$(which artswrapper)</parameter +></userinput +> +</screen> +</para> + +<para +>Если вы сделаете &artswrapper; SUID <systemitem class="username" +>root</systemitem +>, это, скорее всего, улучшит качество воспроизведения, удаляя паузы. Однако риск того, что ошибка в коде или злобный пользователь вызовут прерывание программы (или что-нибудь поломают), увеличится. К тому же, в машинах, на которых работают несколько пользователей, приоритет хорошего качества звука может привести к ухудшению работы компьютера, если кто-то будет пытаться его использовать <quote +>продуктивно</quote +>.</para> + +</answer> +</qandaentry> + + +<qandaentry> +<question> +<para +>Почему &artsd; использует так много процессорного времени? </para> +</question> +<answer> +<para +>Проверьте настройки времени ответа. Хотя текущая версия ещё не оптимизирована. Мы работаем над этим, но сказать, насколько быстрее будет &artsd;, не можем. </para> +</answer> +</qandaentry> +</qandaset> + +<qandaset id="faq-network"> +<title +>Прозрачность сети</title> + +<qandaentry> +<question> +<para +>Зачем нужна прозрачность сети? </para> +</question> +<answer> +<para +>Включите её в &kcontrol; настройках <guilabel +>Звуковая подсистема</guilabel +> (<guilabel +>Обмениваться информацией о безопасности и идентификации через сервер X11</guilabel +> и <guilabel +>Принимать сетевые запросы</guilabel +>). Скопируйте <filename +>.mcoprc</filename +> на все машины, на которых сервер должен принимать запросы из сети. Зайдите в систему ещё раз. Убедитесь в том, что узлы обращаются друг к другу по имени (т.е. у них есть разрешимые имена или они находятся в <filename +>/etc/hosts</filename +>). </para> + +<para +>Это всё, что надо сделать. Если всё-таки не работает, вот несколько замечаний. &arts; и &artsd; должны быть запущены только на узле со звуковой картой (где и будет воспроизводиться звук). Они могут запускаться при входе в &kde; (если вы это указали в &kcontrol;) или вручную: </para> + +<screen +><prompt +>%</prompt +> <userinput +><command +>artsd</command +> <option +>-n</option +> <option +>-F</option +> <parameter +>5</parameter +> <option +>-S</option +> <parameter +>8192</parameter +></userinput +> +</screen> + +<para +>Параметр <option +>-n</option +> нужен для разрешения сетевых запросов, тогда как остальные используются для настройки задержки. </para> + +<para +>В файле <filename +>.mcoprc</filename +> должна содержаться запись: </para> + +<screen +><userinput +>GlobalComm=Arts::X11GlobalComm</userinput +> +</screen> + +<para +>на всех машинах для поддержки работы в сети. Это включается при установке флажка <guilabel +>Обмениваться информацией о безопасности и идентификации через сервер X11</guilabel +> на панели управления. </para> + +<para +>Наконец, в любой версии &kde; серии 2.0.x есть ошибка, возникающая, если вы не указали имя домена. Клиенты &artsd; пытаются найти, куда можно подключиться, используя комбинацию <systemitem class="systemname" +><replaceable +>имя узла</replaceable +>.<replaceable +>имя домена</replaceable +></systemitem +>. Если имя домена пустое, они будут подключаться к <systemitem class="systemname" +> <replaceable +>имени узла</replaceable +></systemitem +>. (заметьте, дополнительная точка). Добавление такой записи в <filename +>/etc/hosts</filename +> (т.е. <userinput +>orion.</userinput +>, если имя узла <systemitem class="systemname" +>orion</systemitem +>) решит проблему. </para> +</answer> +</qandaentry> + + +<qandaentry> +<question> +<para +>Как мне настроить сети, если она не работает? </para> +</question> +<answer> +<para +>Если у вас есть исходный код &kde;, зайдите в <filename class="directory" +>tdelibs/arts/examples</filename +>, и запустите <userinput +><command +>make</command +> <option +>check</option +></userinput +>, чтобы скомпилировать некоторые программы, включая <application +>referenceinfo</application +>. После этого запустите </para> + +<screen +><prompt +>%</prompt +> <userinput +><command +>./referenceinfo</command +> <option +>global:Arts_SimpleSoundServer</option +></userinput +> +</screen> + +<para +>Будут выведены имя узла и используемый &arts;. К примеру, <computeroutput +>tcp:orion:1698</computeroutput +> значит, что любой клиент, пытающийся использовать прозрачность сети, должен знать, как подключиться к узлу <systemitem class="systemname" +>orion</systemitem +>. </para> +</answer> +</qandaentry> + +</qandaset> + +<qandaset id="faq-hardware-specific"> +<title +>Вопросы, связанные с аппаратным обеспечением</title> + +<qandaentry> +<question> +<para +>С каким оборудованием artsd не работает? </para> +</question> +<answer> +<para +>Не все звуковые драйверы Linux хорошо работают с aRts в некоторых версиях ядра. Ознакомьтесь с этим списком, прежде чем сообщать об ошибке. Если же вы встретились с чем-либо, отсутствующим в списке, сразу же сообщите об этом. <informaltable +> <tgroup cols="4"> +<thead> +<row> +<entry +>Дравер и звуковая плата Linux</entry> +<entry +>Не работает в </entry> +<entry +>Работает в </entry> +<entry +>Примечания</entry> +</row> +</thead> + +<tbody> +<row> +<entry +>Драйвер i810 (Intel 810 + AC97 Audio)</entry> +<entry +>2.4.9</entry> +<entry +>2.4.18, 2.2.20, коммерческий драйвер oss, alsa-0.5.12a с эмуляцией OSS</entry> +<entry +>драйвер вызывает перегрузку процессора (см. ниже)</entry> +</row> + +<row> +<entry +>maestro 3/4 chipset</entry> +<entry +>2.4.9</entry> +<entry +>?</entry> +<entry +>драйвер иногда вызывает перегрузку процессора (см. ниже)</entry> +</row> + +<row> +<entry +>драйверы aureal8820, aureal8830 с sourceforge</entry> +<entry +>2.4.17</entry> +<entry +>?</entry> +<entry +>Драйвер не проходит проверку или вызывает перегрузку процессора (см. ниже)</entry> +</row> + +<row> +<entry +>Коммерческий драйвер OSS 3.9.4g с Aureal Vortex</entry> +<entry +>?</entry> +<entry +>?</entry> +<entry +>системный сбой</entry> +</row> + +<row> +<entry +>ymfpci</entry> +<entry +>2.4.0, 2.4.12</entry> +<entry +>2.4.17</entry> +<entry +>Драйвер не проходит проверку (см. ниже)</entry> +</row> + + + +</tbody> +</tgroup> +</informaltable> +</para> +</answer> +</qandaentry> + + + +<qandaentry> +<question> +<para +>Почему возникают проблемы с оборудованием и как мне о них узнать? </para> +</question> +<answer> +<para +>Обычная поблема - драйвер не предоставляет достаточно информации aRts (или даёт неправильную) о том, когда нужно писать звуковые данные. Большинство драйверов OSS предоставляют правильные данные, но не все. </para> +<para +>Вы, возможно, заметили, что не всем приложениям (как xmms) нужна эта информация, поэтому они работают нормально даже с вашей звуковой картой. Но для &arts; она необходима, поэтому artsd выполняется с ошибками. Это ошибка в драйвере, а не в &arts;. </para> +<para +>Есть два варианта поведения artsd при запуске с некорректным драйвером. Во-первых, он постоянно пытается передать новые данные, но безуспешно. В результате потребляются все ресурсы процессора, выводится отчёт о <emphasis +>перегрузке cpu</emphasis +>, и приложение закрывается. Другое дело, когда artsd получает неправильную информацию о том, какой объем данных нужно записать. Тогда он прекращает работать на примерно такой <emphasis +>проверке</emphasis +>: <screen +>artsd: audiosubsys.cc:458: void Arts::AudioSubSystem::handleIO(int): +Assertion `len == can_write'. +Aborted +</screen> +</para> +</answer> +</qandaentry> + +<qandaentry> +<question> +<para +>Что не так с драйвером, если выдаётся ошибка о пререгрузке процессора? </para> +</question> +<answer> +<para +>Обычно artsd узнаёт, когда надо записывать новые данные, с помощью функции select(). Потом используется ioctl(...GETOSPACE...) для поиска объема данных для записи. И, наконец, данные записываются. </para> +<para +>Проблемы возникают тогда, когда artsd постоянно работает или объём данных для записи слишком мал. В документации OSS указано, то select() только запускает процесс, если есть хоть что-то для записи, к примеру, один байт. Тогда запись данных продолжается небольшими частями, что очень трудоёмко, и в результате процессор перегружается. </para> +<para +>Чтобы такого не происходило, драйвер должен вызывать artsd только тогда, когда есть целый фрагмент информации для записи. </para> +</answer> +</qandaentry> + +<qandaentry> +<question> +<para +>Что не так с драйвером, если мне выдаётся сообщение об ошибке при проверке? </para> +</question> +<answer> +<para +>Обычно artsd узнаёт, когда надо записывать новые данные, с помощью функции select(). Потом используется ioctl(...GETOSPACE...) для поиска объема данных для записи. И, наконец, данные записываются. </para> +<para +>Если artsd не может записать тот объём информации, которы указан в ioctl, будет выдаваться эта ошибка. Чтобы исправить ситуацию, драйвер должен предоставлять правильную информацию. </para> +</answer> +</qandaentry> +</qandaset> + +<qandaset id="faq-other"> +<title +>Другие проблемы</title> + +<qandaentry> +<question> +<para +>Я не могу работать с &arts-builder;. Во время работы модуля возникают ошибки! </para> +</question> +<answer> +<para +>Обычно так получается при использовании старых структур или модулей, которые не поддерживаются версией &kde; 2. К сожалению, информация об &arts;-0.3.4.1 устарела. Самой распространённой ошибкой является выполнение структуры &arts-builder;, приводящей к ошибке <errorname +>[artsd] Synth_PLAY: audio subsystem is already used.</errorname +> </para> + +<para +>Следует использовать модуль Synth_AMAN_PLAY вместо Synth_PLAY. Прочитайте файл помощи &arts-builder; (нажмите <keycap +>F1</keycap +> в &arts-builder;). </para> + +<para +>В последних версиях &arts-builder; (&kde; 2.1 beta 1 и позднее) есть примеры, которые вы можете использовать. </para> +</answer> +</qandaentry> + +</qandaset> + +</chapter> diff --git a/tde-i18n-ru/docs/tdemultimedia/artsbuilder/future.docbook b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/future.docbook new file mode 100644 index 00000000000..6d94bf0535e --- /dev/null +++ b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/future.docbook @@ -0,0 +1,399 @@ +<!-- <?xml version="1.0" ?> +<!DOCTYPE chapter PUBLIC "-//KDE//DTD DocBook XML V4.1.2-Based Variant +V1.1//EN" "dtd/kdex.dtd"> +To validate or process this file as a standalone document, uncomment +this prolog. Be sure to comment it out again when you are done --> + +<chapter id="future-work"> +<title +>Дальнейшая работа</title> + +<para +>В этом разделе описывается то, над чем мы сейчас работаем. А так как разработка ведётся быстро, информация может быть устаревшей. Чтобы узнать о последних планах, проверяйте список файла TODO и <link linkend="mailing-lists" +>список рассылки</link +>. Не забывайте о том, что вы тоже можете принять участие в разработке. </para> + +<para +>Это черновик, в котором описано, как новые технологии внедряются в &arts;. Вот какие темы здесь упомянуты: </para> + +<itemizedlist> +<listitem +><para +>Как работает интерфейс.</para +></listitem> +<listitem +><para +>Кодеки - декодирование потоков mp3 или wav для того, чтобы использовать их как данные.</para +></listitem> +<listitem +><para +>Видео.</para +></listitem> +<listitem +><para +>Многопоточность.</para +></listitem> +<listitem +><para +>Синхронизация.</para +></listitem> +<listitem +><para +>Динамическое расширение.</para +></listitem> +<listitem +><para +>Динамическое построение.</para +></listitem> +<listitem +><para +>&GUI;</para +></listitem> +<listitem +><para +>&MIDI;</para +></listitem> +</itemizedlist> + +<para +>Над этим мы сейчас работаем. Если вы хотите увидеть технологию в &arts;, начните с этого. Вы получите общее представление о решающихся проблемах. Вы можете и исправить эту информацию. </para> + +<para +>То, что будет использоваться совместно с &arts; (поэтому координируйте свои действия, пожалуйста): </para> + +<itemizedlist> +<listitem> +<para +><application +>KPhone</application +> (передача речи по протоколу <acronym +>IP</acronym +>) </para> +</listitem> + +<listitem> +<para +>&noatun; (видео- и аудиопроигрыватель) </para> +</listitem> + +<listitem> +<para +>&artscontrol; (программа управления звуковым сервером, для осциллографов) </para> +</listitem> + +<listitem> +<para +><application +>Brahms</application +> (музыкальный синтезатор) </para> +</listitem> + +<listitem> +<para +><application +>Kaiman</application +> (&kde;2 медиа-проигрыватель, совместим с kmedia2) </para> +</listitem> + +<listitem> +<para +><application +>mpglib</application +>/<application +>kmpg</application +> (<acronym +>mpg</acronym +> - технология воспроизведения аудио и видео) </para> +</listitem> + +<listitem> +<para +><application +>SDL</application +> (обращение к мульитмедиа-данным напрямую, для игр, ещё не реализовано) </para> +</listitem> + +<listitem> +<para +><application +>electric ears</application +> (автор со мной связался - статус неизвестен) </para> +</listitem> +</itemizedlist> + +<sect1 id="interfaces-how"> +<title +>Как работает интерфейс</title> + +<!-- I think this is now obsolete and documented elsewhere ? --> + +<para +>Интерфейсы &MCOP; - основа идеи &arts;. Они эквивалентны классам в C++. Когда возможно, ориентируйтесь на интерфейсы. Они состоят из четырёх частей: </para> + +<itemizedlist> +<listitem +><para +>Синхронные потоки</para +></listitem> +<listitem +><para +>Асинхронные потоки</para +></listitem> +<listitem +><para +>Методы</para +></listitem> +<listitem +><para +>Атрибуты</para +></listitem> +</itemizedlist> + +<para +>Их можно смешивать как угодно. Новые технологии должны быть определены в терминах интерфейсов. Прочитайте разделы о синхронных и асинхронных потоках, а также об интерфейсах KMedia2, которые являются замечательными примерами работы интерфейсов. </para> + +<para +>Интерфейсы определены в коде <literal role="extension" +>.idl</literal +> и компилируются <command +>mcopidl</command +>. Вы создаёте производный класс <classname +><replaceable +>Interfacename</replaceable +>_impl</classname +> и используете функцию <function +>REGISTER_IMPLEMENTATION(Interfacename_impl)</function +>, чтобы встроить ваши объктные реализации в систему объектов &MCOP;. </para> + +</sect1> + +<sect1 id="codecs"> +<title +>Кодеки - Декодирование данных</title> + +<para +>Интерфейсы kmedia2 позволяют игнорировать файлы wav, mp3 и всё, что состоит из потоков данных. Вместо этого вы описываете методы их воспроизведения. </para> + +<para +>Поэтому вы можете написать программу загрузки файлов wave таким образом, чтобы она пригрывала их (как PlayObject), но никто другой, кроме вас, не сможет использовать код. </para> + +<para +>Альтернативой являются асинхронные потоки. Вы определяете интерфейс, который позволяет передавать блоки данных. В &MCOP; это выглядит так: </para> + +<programlisting +>interface Codec { + in async byte stream indata; + out async byte stream outdata; +}; +</programlisting> + + +<para +>Конечно, кодеки могут снабжаться атрибутами для получения дополнительной информации, к примеру, о формате. </para> + +<programlisting +>interface ByteAudioCodec { + in async byte stream indata; + out async byte stream outdata; + readonly attribute samplingRate, bits, channels; +}; +</programlisting> + +<para +>Этот <interfacename +>ByteAudioCodec</interfacename +>, например, может быть подключен к объекту <interfacename +>ByteStreamToAudio</interfacename +> для создания настоящего аудио потока. </para> + +<para +>Конечно, в других типах кодеков видео воспроизводится напрямую, например </para> + +<programlisting +>interface VideoCodec { + in async byte stream indata; + out video stream outdata; /* note: видеопотоки ещё не используются */ +}; +</programlisting> + +<para +>Кодек не должен разрабатываться по принципу <quote +>вы знаете, как воспроизводить, а я - нет</quote +>, как, например, <interfacename +>WavPlayObject</interfacename +>. И всё же кто-то должен сидеть и тестировать его до завершения <acronym +>API</acronym +>. </para> + +</sect1> + +<sect1 id="video"> +<title +>Видео</title> + +<para +>Я хочу сделать видео асинхронными потоками некоторых встроенных типов данных &MCOP;, содержащих изображения. Сейчас идёт работа над этим типом данных. Тогдга модули, работающие с видео изображениями могут быть подключены так же, как и модули, работающие со звуком. </para> + +<para +>Есть ещё несколько вещей, которые обязательно нужно иметь в виду: </para> + +<itemizedlist> +<listitem> +<para +>Цветовые пространства <acronym +>RGB</acronym +> и <acronym +>YUV</acronym +> </para> +</listitem> +<listitem> +<para +>Формат должен каким-то образом добавляться к потоку. </para> +</listitem> +<listitem> +<para +>Очень важна синхронизация. </para> +</listitem> +</itemizedlist> + +<para +>Также я хочу оставить возможность переопределить класс <classname +>VideoFrame</classname +>, чтобы он мог хранить данные в разделённой памяти. Тогда будут возможны видео потоки между различными процессами без особых проблем. </para> + +<para +>Как обычно, вся обработка видео, от декодирования до отображения на экране, должна производиться в одном процессе. </para> + +<para +>Я сделал прототип реализации видеопотоков, который вы можете скачать <ulink url="http://space.twc.de/~stefan/kde/download/video-quickdraw.tar.gz" +>отсюда</ulink +>. Его нужно будет интегрировать в &MCOP; после тестирования. </para> + +<para +>Компонент визуализации должен поддерживать XMITSHM (с <acronym +>RGB</acronym +> и <acronym +>YUV</acronym +>), Мартин Вогт (Martin Vogt) сказал, что работает над этим. </para> + +</sect1> + +<sect1 id="threading"> +<title +>Многопоточность</title> + +<para +>Сейчас &MCOP; не поддерживает работу с несколькими потоками обработки данных. Возможно, мы не сможем избежать многопоточности при работе с видео. Но есть вещи, с которыми нужно обращаться аккуратно: </para> + + +<itemizedlist> +<listitem +><para +>SmartWrappers - их использование с многопоточностью небезопасно из-за незащищенного механизма подсчета ссылок и т. д. </para> +</listitem> +<listitem> +<para +>Диспетчер ввода-вывода тоже небезопасен. </para> +</listitem> +</itemizedlist> + +<para +>Однако я мечтаю сделать эти модули безопасными для синхронных и асинхронных потоков. Тогда можно будет посылать сигнал на несколько процессоров. Кроме того, это можно использовать при воспроизведении аудио на многопроцессорных системах. </para> + +<para +>Как это будет работать: </para> + + +<itemizedlist> +<listitem> +<para +>Система управления потоками решает, что должны обрабатывать модули (и какие), т. е.: </para> + <itemizedlist> + <listitem +><para +>видеокадры (метод process_indata)</para +></listitem> + <listitem +><para +>синхронные аудиопотоки (calculateBlock)</para +></listitem> + <listitem +><para +>другие асинхронные потоки, в основном байтовые</para +></listitem> + </itemizedlist> +</listitem> +<listitem> +<para +>Модули могут обрабатывать эти вещи и в собственных потоках. В аудио можно использовать потоки повторно (т. е. использование 4 потоков на 4 процессорах, даже если запущено 100 модулей). Для видео и декомпрессии будет удобно использование блокирующего средства во внутреннем потоке, которое синхронизировано с остальной частью &MCOP; системой управления потоками. </para> +</listitem> + +<listitem> +<para +>Модули могут не использовать средства &MCOP; (такие, как удалённый вызов) во время работы в потоке. </para> +</listitem> +</itemizedlist> + +</sect1> + +<sect1 id="synchronization"> +<title +>Синхронизация</title> + +<para +>Видео и &MIDI; (и аудио) могут требовать синхронизации. Это могут быть маркеры времени. Я хочу использовать их в асинхронным потокам, добавляя эти маркеры к каждому пакету. Если вы посылаете два видеокадра, сделайте их пвкетами (всё равно они большие), чтобы у вас были два разных маркера. </para> + +<para +>Т. к. аудио - синхронный поток, временные метки здесь тоже подразумеваются. </para> + +</sect1> + +<sect1 id="dynamic-composition"> +<title +>Динамическое построение</title> + +<para +>Нужно сделать так, чтобы можно было сказать: эффект FX состоит из этих простых модулей. FX должен выглядеть как обычный модуль &MCOP;, но состоять из других модулей. </para> + +<para +>Это необходимо для &arts-builder;. </para> + +</sect1> + +<sect1 id="gui"> +<title +>&GUI;</title> + +<para +>Все компоненты &GUI; будут модулями &MCOP;. У них должны быть такие атрибуты, как размер, метка, цвет, ... &arts-builder; должен уметь составлять их визуально. </para> + +<para +>Должна быть возможность сохранять графический интерфейс, сохраняя атрибуты. </para> + +</sect1> + +<sect1 id="midi-stuff"> +<title +>&MIDI;</title> + +<para +>&MIDI; будет реализован с помощью асинхронных потоков. Есть два варианта: использовать обычные структуры &MCOP; для описания типа или вводить новые стандартные типы. </para> + +<para +>Думаю, обычных структур будет достаточно: </para> + +<programlisting +>struct MidiEvent { + byte b1,b2,b3; + sequence<byte> sysex; +} +</programlisting> + +<para +>Асинхронные потоки должны поддерживать обычные типы потоков. </para> + +</sect1> + +</chapter> + + diff --git a/tde-i18n-ru/docs/tdemultimedia/artsbuilder/glossary.docbook b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/glossary.docbook new file mode 100644 index 00000000000..45250e529aa --- /dev/null +++ b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/glossary.docbook @@ -0,0 +1,173 @@ +<!-- <?xml version="1.0" ?> +<!DOCTYPE glossary PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN" "dtd/kdex.dtd"> +To validate or process this file as a standalone document, uncomment +this prolog. Be sure to comment it out again when you are done --> + +<glossary id="glossary"> + +<glossentry id="gloss-alsa"> +<glossterm +><acronym +>ALSA</acronym +></glossterm> +<glossdef> +<para +>Advanced &Linux; Sound Architecture (современная звуковая архитектура &Linux;), драйвер звуковой карты для &Linux;, ещё не включенный в исходный код стандартного ядра. </para> +</glossdef> +</glossentry> + +<glossentry id="gloss-arts"> +<glossterm +>&arts;</glossterm> +<glossdef> +<para +>Analog Real-Time Synthesizer (аналоговый синтезатор, работающий в реального времени), название мультимедиа-архитектуры/библиотеки/набора инструментов, использующихся в проекте &kde;. </para> +</glossdef> +</glossentry> + +<glossentry id="gloss-bsd"> +<glossterm +><acronym +>BSD</acronym +></glossterm> +<glossdef> +<para +>Berkeley Software Distribution (дистрибутив ПО Беркли), здесь относится к нескольким свободным &UNIX;-совместимым ОС, созданным на основе <acronym +>BSD</acronym +> &UNIX;. </para> +</glossdef> +</glossentry> + +<glossentry id="gloss-corba"> +<glossterm +><acronym +>CORBA</acronym +></glossterm> +<glossdef> +<para +>Common Object Request Broker Architecture (обобщённая архитектура посредника объектных запросов), стандартна для реализации объектно-ориентированного удалённого выполнения. </para> +</glossdef> +</glossentry> + +<glossentry id="gloss-cvs"> +<glossterm +><acronym +>CVS</acronym +></glossterm> +<glossdef> +<para +>Concurrent Versions System (система управления параллельными версиями), система управления исходными кодами ПО различных версий, использующаяся во многих проектах, включая &kde; и &arts;. </para> +</glossdef> +</glossentry> + +<glossentry id="glos-fft"> +<glossterm +><acronym +>FFT</acronym +></glossterm> +<glossdef> +<para +>Fast Fourier Transform (быстрое преобразование Фурье), алгоритм для перевода временных данных в домен частот, обычно используется при обработке сигналов. </para> +</glossdef> +</glossentry> + +<glossentry id="gloss-full-duplex"> +<glossterm +>Двусторонний режим работы</glossterm> +<glossdef> +<para +>Возможность звуковой карты одновременно записывать и воспроизводить аудио. </para> +</glossdef> +</glossentry> + +<glossentry id="gloss-gpl"> +<glossterm +><acronym +>GPL</acronym +></glossterm> +<glossdef> +<para +><acronym +>GNU</acronym +> General Public License (Стандартная общественная лицензия GNU), лицензия для ПО, разработанная Free Software Foundation с целью определить условия выпуска свободного ПО. </para> +</glossdef> +</glossentry> + +<glossentry id="gloss-gui"> +<glossterm +>&GUI;</glossterm> +<glossdef> +<para +>Graphical User Interface (графический интерфейс пользователя). </para> +</glossdef> +</glossentry> + +<glossentry id="gloss-idl"> +<glossterm +><acronym +>IDL</acronym +></glossterm> +<glossdef> +<para +>Interface Definition Language (язык определения интерфейсов), формат описания интерфейсов (методов и данных), не зависящий от языка программирования. </para> +</glossdef> +</glossentry> + +<glossentry id="gloss-kde"> +<glossterm +>&kde;</glossterm> +<glossdef> +<para +>K Desktop Environment (графическая среда K), графическая среда для &UNIX;-совместимых систем и одноименный проект по разработке этой среды. </para> +</glossdef> +</glossentry> + +<glossentry id="gloss-lgpl"> +<glossterm +><acronym +>LGPL</acronym +></glossterm> +<glossdef> +<para +><acronym +>GNU</acronym +> Lesser General Public License (Стандартная общественная лицензия ограниченного применения GNU), лицензия для ПО, разработанная Free Software Foundation с целью определить условия выпуска свободного ПО, эта лицензия менее строга, чем <acronym +>GPL</acronym +> и обычно используется при распространении библиотек. </para> +</glossdef> +</glossentry> + +<glossentry id="gloss-mcop"> +<glossterm +>&MCOP;</glossterm> +<glossdef> +<para +>Multimedia COmmunication Protocol (протокол передачи мультимедиа), протокол передачи данных между модулями &arts;, похожий на <acronym +>CORBA</acronym +>, но проще и оптимизированный для работы с мультимедиа. </para> +</glossdef> +</glossentry> + +<glossentry id="gloss-midi"> +<glossterm +>&MIDI;</glossterm> +<glossdef> +<para +>Musical Instrument Digital Interface (цифровой интерфейс музыкальных инструментов), стандартный протокол для обмена данными между электронными музыкальными инструментами, используется для обозначения формата файлов, хранящих команды &MIDI;. </para> +</glossdef> +</glossentry> + +<glossentry id="gloss-oss"> +<glossterm +><acronym +>OSS</acronym +></glossterm> +<glossdef> +<para +>Open Sound System (открытая звуковая система), драйверы для звуковых карт, включённые в ядро &Linux; (иногда называются <acronym +>OSS</acronym +>/Free), так же называется и их коммерческая версия от 4Front Technologies. </para> +</glossdef> +</glossentry> + +</glossary> diff --git a/tde-i18n-ru/docs/tdemultimedia/artsbuilder/gui.docbook b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/gui.docbook new file mode 100644 index 00000000000..b769c161b6b --- /dev/null +++ b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/gui.docbook @@ -0,0 +1,29 @@ +<!-- <?xml version="1.0" ?> +<!DOCTYPE chapter PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN" "dtd/kdex.dtd"> +To validate or process this file as a standalone document, uncomment +this prolog. Be sure to comment it out again when you are done --> + +<!-- +<chapter id="gui-elements"> +<title +>&GUI; Elements</title> + +<sect1 id="gui-introduction"> +<title +>Introduction</title> + +</sect1> + +<sect1 id="parents"> +<title +>Parents</title> + +</sect1> + +<sect1 id="mixers"> +<title +>Mixers</title> + +</sect1> +</chapter> +--> diff --git a/tde-i18n-ru/docs/tdemultimedia/artsbuilder/helping.docbook b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/helping.docbook new file mode 100644 index 00000000000..3b9375b5a73 --- /dev/null +++ b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/helping.docbook @@ -0,0 +1,239 @@ +<!-- <?xml version="1.0" ?> +<!DOCTYPE chapter PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN" "dtd/kdex.dtd"> +To validate or process this file as a standalone document, uncomment +this prolog. Be sure to comment it out again when you are done --> + +<chapter id="contributing"> +<title +>Сотрудничество с &arts;</title> + +<sect1 id="how-to-help"> +<title +>Как вы можете помочь</title> + +<para +>Помощь разработчикам заключается в адаптации существующих мультимедиа-приложений для работы с &arts;, создании новых приложений и расширении возможностей &arts;. Однако вам совсем необязательно быть разработчиком, чтобы помочь &arts;. Нам нужна помощь в тестировании (и написании отчётов об ошибках), переводе текстов и документации на различные языки, создании дизайна (особенно для модулей <application +>artsbuilder</application +>), музыканты могут написать примеры для модулей &arts;, а писатели - документацию. </para> +</sect1> + +<sect1 id="mailing-lists"> +<title +>Списки рассылок</title> + +<para +>Большинство дискуссий разработчиков &arts; ведутся в двух рассылках. В этой обсуждаются новые функции, делятся мыслями и просят о помощи, если возникли проблемы. </para> + +<para +>Рассылка <quote +>&kde; Multimedia</quote +> предназначена для обсуждения общих мультимедиа-приложений для &kde;, в том числе и &arts;, наряду с &noatun; и &aktion;. Вы можете подписаться на нее с сайта <ulink url="http://www.kde.org/mailinglists.html" +> http://www.kde.org/mailinglists.html</ulink +> или послать сообщение с темой <userinput +>subscribe <replaceable +>ваш-email-адрес</replaceable +></userinput +> на <email +>kde-multimedia-request@kde.org</email +>. Архив рассылки можно найти по адресу <ulink url="http://lists.kde.org" +> http://lists.kde.org</ulink +>. </para> + +<para +>Рассылка для обсуждения вопросов об &arts;, в том числе и об использовании &arts; не в &kde;. Чтобы подписаться, пошлите сообщение с текстом<userinput +>subscribe <replaceable +>ваш-email-адрес</replaceable +></userinput +> на <email +>arts-request@space.twc.de</email +>. Архив рассылки можно найти по адресу <ulink url="http://space.twc.de/~stefan/arts-archive" +> http://space.twc.de/~stefan/arts-archive</ulink +>. </para> + +</sect1> + +<sect1 id="coding-standards"> +<title +>Стандарты кодирования</title> + +<para +>Чтобы можно было без лишних проблем читать разные исходные файлы, в них нужно использовать один стиль написания кода. Если вы просто пишете модуль, пожалуйста, постарайтесь писать код соответственно (или отформатируйте его), тогда разные люди смогут его дополнять или копировать его части. </para> + +<variablelist> +<varlistentry> +<term +>Именование функций-членов</term> +<listitem> +<para +>Стиль &Qt;/&Java;. То есть каждое новое слово должно начинаться с заглавной буквы, но первое слово начинается со строчной, подчеркивания между словами не используются. </para> +<para +>Это значит, к примеру:</para> + +<programlisting +>createStructureDesc() + updateWidget(); + start(); </programlisting> + +</listitem> +</varlistentry> + +<varlistentry> +<term +>Члены класса</term> +<listitem> +<para +>Имена членов классов пишутся со строчной буквы: menubar, button. </para> + +<para +>Если необходима функция доступа, лучше всего её писать в соответствии с &MCOP;, т. е. если есть функция-член <function +>foo</function +> типа long, которая не должна быть всегда видимой, вы пишете: </para> + +<programlisting +>foo(long new_value); + long foo(); </programlisting> + +<para +>функции получения и задания какого-либо значения. В этом случае, значение <function +>foo</function +> должно храниться в <returnvalue +>_foo</returnvalue +>. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +>Имена классов</term> +<listitem> +<para +>В именах классов все слова должны начинаться с заглавной буквы, например, <classname +>ModuleView</classname +>, <classname +>SynthModule</classname +>. Все классы должны принадлежать библиотекам и использовать пространство имён &arts;, к примеру, <classname +>Arts::Soundserver</classname +>. </para> +<para +>Классы &MCOP; должны называться так:<classname +>Class_impl</classname +>, например, <classname +>SoundServer_impl</classname +>. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +>Параметры</term> +<listitem> +<para +>Параметры всегда пишутся строчными буквами. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +>Локальные переменные</term> +<listitem> +<para +>Локальные переменные всегда пишутся строчными буквами и могут называться <varname +>i</varname +>, <varname +>p</varname +>, <varname +>x</varname +> и т. д., если это не делает код трудночитаемым. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +>Размер табуляции (отступы)</term> +<listitem> +<para +>Один уровень отступа равен 4 пробелам. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +>Пробелы в выражениях</term> +<listitem> +<para +>Обычно вам не нужно использовать пробелы в выражениях. Хотя вы можете их вставлять между операторами и операндами. Однако, если вы набрали пробел перед оператором (например, +), нужно поставить его и после оператора. Единственное исключение - выражения с ",", в которых пробел нужно ставить после "," или вообще его опустить. </para> +<para +>Вот примеры правильного использования пробелов: </para> +<programlisting +>{ + 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); +} +</programlisting> +<para +>А вот пример того, как <emphasis +>не нужно</emphasis +> ставить пробелы. В вызовах функций, после if, while, for, switch и т. д. пробелы не пишутся. </para> +<programlisting +>{ + // ПЛОХО: в списке пробел ставится только после "," + 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 (); +} +</programlisting> +</listitem> +</varlistentry> + + +<varlistentry> +<term +>Имена сходных файлов</term> +<listitem> +<para +>В названиях исходных файлов не должно быть заглавных букв. Они должны называться по имени реализуемого класса, если в них описывается только он один. Если файл содержит код, не зависящий от &Qt;/&GUI;, его расширением должно быть <literal role="extension" +>.cc</literal +>, иначе - <literal role="extension" +>.cpp</literal +>. Файлы, в которых реализуются интерфейсы, должны называться так: <filename +><replaceable +>foo</replaceable +>_impl</filename +>, если именем реализуемого интерфейса является Foo. </para> + +<para +>Имена файлов &IDL; должны в достаточной мере описывать содержимое этих файлов и также не должны содержать заглавных букв. Не стоит называть файл по имени класса, так как информация о трейдере и типе в .mcopclass может перемешаться. </para> +</listitem> +</varlistentry> +</variablelist> +</sect1> + +</chapter> diff --git a/tde-i18n-ru/docs/tdemultimedia/artsbuilder/index.cache.bz2 b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/index.cache.bz2 Binary files differnew file mode 100644 index 00000000000..18478e26226 --- /dev/null +++ b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/index.cache.bz2 diff --git a/tde-i18n-ru/docs/tdemultimedia/artsbuilder/index.docbook b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/index.docbook new file mode 100644 index 00000000000..bc50a7f0c5e --- /dev/null +++ b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/index.docbook @@ -0,0 +1,417 @@ +<?xml version="1.0" ?> +<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN" "dtd/kdex.dtd" [ + <!ENTITY kappname "&arts;"> + <!ENTITY tools SYSTEM "tools.docbook"> + <!ENTITY artsbuilder-doc SYSTEM "artsbuilder.docbook" +> + <!ENTITY detail SYSTEM "detail.docbook"> + <!ENTITY arts-midi SYSTEM "midi.docbook"> + <!ENTITY gui SYSTEM "gui.docbook"> + <!ENTITY mcop-ref SYSTEM "mcop.docbook"> + <!ENTITY arts-mcop SYSTEM "mcop.docbook"> + <!ENTITY apis SYSTEM "apis.docbook"> + <!ENTITY modules SYSTEM "modules.docbook"> + <!ENTITY porting SYSTEM "porting.docbook"> + <!ENTITY helping SYSTEM "helping.docbook"> + <!ENTITY future SYSTEM "future.docbook"> + <!ENTITY references SYSTEM "references.docbook"> + <!ENTITY arts-faq SYSTEM "faq.docbook"> + <!ENTITY arts-glossary SYSTEM "glossary.docbook"> + <!ENTITY digitalaudio SYSTEM "digitalaudio.docbook"> + <!ENTITY midiintro SYSTEM "midiintro.docbook"> + <!ENTITY MCOP "<acronym +>MCOP</acronym +>"> + <!ENTITY DCOP "<acronym +>DCOP</acronym +>"> + <!ENTITY MIDI "<acronym +>MIDI</acronym +>"> + <!ENTITY mcopidl "<application +>mcopidl</application +>"> + <!ENTITY IDL "<acronym +>IDL</acronym +>"> + <!ENTITY % Russian "INCLUDE" +> <!-- change language only here --> + <!ENTITY % addindex "IGNORE"> +]> + +<book lang="&language;"> +<bookinfo> +<title +>Справочное руководство по &arts;.</title> +<authorgroup> + +<author +><firstname +>Stefan</firstname +> <surname +>Westerfeld</surname +> <affiliation +> <address +><email +>stefan@space.twc.de</email +></address> +</affiliation> +</author> + +<author +><firstname +>Jeff</firstname +> <surname +>Tranter</surname +> <affiliation +> <address +><email +>tranter@kde.org</email +></address> +</affiliation> +</author> + +<othercredit role="translator" +><firstname +>Сергей</firstname +><surname +>Пачков</surname +> <affiliation +><address +><email +>spigel@mail.ru</email +></address +></affiliation +><contrib +>Перевод на русский</contrib +></othercredit +> +</authorgroup> + +<copyright> +<year +>1999-2001</year> +<holder +>Stefan Westerfeld & Jeff Tranter</holder> +</copyright> +<legalnotice +>&FDLNotice;</legalnotice> + +<date +>2001-06-10</date> +<releaseinfo +>1.00.09</releaseinfo> + +<abstract +><para +>Руководство описывает &arts;,- Аналоговый синтезатор в реальном времени</para> + +</abstract> + +<keywordset> +<keyword +>aRts</keyword> +<keyword +>artsbuilder</keyword> +<keyword +>синтезатор</keyword> +<keyword +>мультимедиа</keyword> +<keyword +>структура</keyword> +<keyword +>музыка</keyword> +<keyword +>звук</keyword> +<keyword +>KDE</keyword> +</keywordset> +</bookinfo> + +<chapter id="introduction"> +<title +>Введение</title> + +<sect1 id="what-is-arts"> +<title +>Что такое &arts;?</title> + +<para +>Аналоговый синтезатор в реальном времени, или &arts;, - это модульная система для синтезирования звука и музыки на цифровом компьютере. Используя небольшие блоки, называемые модулями, пользователь может просто строить различные инструменты аудио обработки. Модули обычно предоставляют такие функции, как генераторы звука, фильтры, аудио эффекты, микширование и воспроизведение цифрового аудио в различных форматах</para> + +<para +>&artsd; - сервер, смешивающий звук из различных источников в реальном времени, благодаря чему сразу несколько программ могут иметь доступ к звуковой плате.</para> + +<para +>При использовании &MCOP;, - мультимедийного протокола взаимодействия, мультимедиа программы могут быть сетевыми, защищенными и кросс-платформенными с интерфейсами, описанными на независимом языке &IDL;. Поддержка также распространяется для не &arts; - программ. Как компонент ядра &kde; 2, &arts; представляет базис мультимедийной архитектуры &kde; и в будущем будет поддерживать больше типов мультимедиа, включая и видео. Подобно &kde;, &arts; может работать в различных операционных системах, например &Linux; и вариантах BSD. Также &arts; можно использовать независимо от &kde;.</para> + +</sect1> + +<sect1 id="using-this-manual"> +<title +>Использование данного руководства</title> + +<para +>Руководство служит для предоставления всесторонней документации по &arts; для пользователей всех уровней подготовки. Если вы пользователь или разработчик мультимедиа программ, вы можете использовать разные части документации.</para> + +<para +>Рекомендуется сначала прочитать <link linkend="installation" +>Получение и сборка &arts;</link +>, если вам нужно установить и запустить &arts;. Если вы уже имеете рабочую систему, например установленную вместе с дистрибутивом операционной системы, можете пропустить эту часть.</para> + +<para +>Вам следовало бы прочесть <link linkend="arts-tools" +>&arts; инструменты</link +>, в особенности &artsd;, &artscontrol;, &artsshell;, и &artsdsp;. Это может помочь более эффективно использовать &arts;.</para> + +<para +>Если вам интересно, что можно сделать при помощи &arts;, то прочитайте раздел <link linkend="artsbuilder" +>&arts-builder;</link +> и обратитесь к учебному руководству. Вы сможете оценить всю мощь &arts; и то, что предоставляемые модули могут использоваться и не программистами.</para> + +<para +>Если вы хотите узнать больше об внутреннем устройстве &arts;, также для разработки мультимедиа программ или расширения самого &arts;, прочтите что-нибудь или всё из <link linkend="arts-in-detail" +>&arts; в деталях</link +>. Это даст вам понимание всех концепций, предпосылок разработки &arts;.</para> + +<para +>Если вам интересна совместимость &arts; с <acronym +>MIDI</acronym +>, прочтите раздел о <link linkend="midi" +>&MIDI;</link +>.</para> + +<!-- TODO +<para +>To learn more about the &arts; graphical elements, either as an advanced +user of artsbuilder or to create new elements, read the section on <link +linkend="gui-elements" +><acronym +>GUI</acronym +> Elements</link +>.</para> +--> + +<para +>Если вы желаете разрабатывать &arts;-программы, тогда в разделе <link linkend="arts-apis" +>Разработка &arts;-программ</link +>, вы сможете ознакомиться с различными <acronym +>API</acronym +>s.</para> + +<para +>Если вы хотите расширить &arts;, создав новые модули, прочитайте раздел <link linkend="arts-modules" +>&arts; модули</link +></para> + +<para +>Если вы хотите модифицировать существующее приложение для работы с &arts;, читайте <link linkend="porting" +>Перенос программ в &arts;</link +>.</para> + +<para +>Вы можете узнать о том, как внести вклад в проект &arts;, в статье <link linkend="contributing" +>Как помочь проекту &arts;</link +>, читайте об текущей разработке &arts; в статье <link linkend="future-work" +> Дальнейшая разработка</link +>. Ссылки на дополнительную информацию см. в разделе <link linkend="references" +>Ссылки</link +>.</para> + +<para +>Руководство завершается несколькими дополнительными материалами, включающими <link linkend="faq" +>Ответы на часто задаваемые вопросы</link +>, <link linkend="contributors" +>список разработчиков</link +>,сведения об авторских правах на &arts; и <link linkend="copyright-and-licenses" +> лицензировании</link +>, и некоторые вспомогательные материалы <link linkend="intro-digital-audio" +>Цифровой звук</link +> и <link linkend="midi-introduction" +>&MIDI;</link +>. Термины включены в <link linkend="glossary" +>Глоссарий</link +>.</para> + +<note> +<para +>Это руководство находится в разработке. Вы можете принять участие в написании части его. Если вы желаете это сделать, то сообщите Jeff Tranter <email +>tranter@kde.org </email +> или Stefan Westerfeld <email +>stefan@space.twc.de</email +> для избежания повторов. </para> +</note> + +</sect1> + +<sect1 id="history"> +<title +>История</title> + +<para +>В конце 1997 Stefan Westerfeld начал работать над модульной системой синтезирования звука в реальном времени. Первоначально код работал на PowerPC с &AIX;. Эта первая реализация была проста, но поддерживала полнофункциональную поточную систему, что позволило реализовать проигрывание MP3 файлов и каналы аудио потоков через модули эффектов. </para> + + +<para +>Следующим шагом была реализация &GUI;, чтобы можно было управлять модулями в графическом интерфейсе. Stefan имел хороший опыт использования &kde;, который и был выбран в качестве инструмента разработки &GUI;, (причем понятна была необходимость создания также и GNOME/Gtk+ версии). Поэтому в дальнейшем разработка велась на &Linux; как основной платформе. Первоначально названный <application +>ksynth</application +>, проект был переименован в &arts; и темп разработки увеличился. Эта стадия проекта была завершена и включала протокол, основанный на <acronym +>CORBA</acronym +>, множество модулей, графический редактор модулей, C и C++ <acronym +>API</acronym +>, документацию, утилиты, список рассылки и веб-сервер с небольшой группой разработчиков. Проект прошёл большой путь после чуть более года разработки.</para> + +<para +>Как только команда &kde; начала планировать &kde; 2.0, появилась необходимость в более мощной инфраструктуре для звука и других потоковых мультимедиа. Было решено использовать &arts; в качестве основы для мультимедийных приложений, это был хороший шаг в направлении испытанной архитектуры. Благодаря усилиям разработчиков в новой версии &arts; код <acronym +>CORBA</acronym +> был полностью заменен на совершенно новую подсистему &MCOP;, оптимизированную для мультимедиа. Версия 0.4 &arts; была включена в &kde; 2.0.</para> + +<para +>Работа над &arts; продолжалась: улучшение производительности и добавление новой функциональности. Хотя &arts; - это компонент ядра &kde;, он может использоваться без &kde;, а также для программ далеко за пределами традиционного мультимедиа. Проект привлек интерес команды GNOME, тем самым открылась возможность, что когда нибудь он станет стандартом мультимедиа архитектуры для настольных систем &UNIX;.</para> + +</sect1> + +</chapter> + +&tools; +&artsbuilder-doc; +&detail; +&arts-midi; +&gui; +&mcop-ref; +&apis; +&modules; +&porting; +&helping; +&future; +&references; +&arts-faq; + +<chapter id="copyright-and-licenses"> + +<title +>&arts; Авторские права и лицензирование</title> + +<para +>&arts; авторские права 1998-2001 Stefan Westerfeld <email +>stefan@space.twc.de</email +></para> + +<para +><anchor id="contributors"/> Авторские права на документацию 1999-2001 Stefan Westerfeld <email +>stefan@space.twc.de</email +> и Jeff Tranter <email +>tranter@kde.org</email +>. </para> +<para +>Перевод на русский - Сергей Пачков <email +>spigel@mail.ru</email +></para +> +&underFDL; <para +>Все библиотеки в &arts; имеют лицензию <acronym +>GNU</acronym +> Lesser General Public license. Большинство основного кода &arts; находится в библиотеках, целиком включая <acronym +>MCOP</acronym +> и ArtsFlow. Это позволяет использовать библиотеки в не свободно распространяемых программах или в программах, не поддерживающих Open Source. </para> + +<para +>Имеются несколько программ (таких как <application +>artsd</application +>), выпущенных под лицензией <acronym +>GNU</acronym +> General Public License. Поскольку легальность сборки <acronym +>GPL</acronym +> программ с &Qt; часто вызывает недопонимание, я также добавил подробные замечания, которые разрешают это, в добавление к <acronym +>GPL</acronym +>: это также разрешает сборку программ с библиотекой &Qt;. &Qt; как библиотека обычно сопровождает ядро операционной системы, так это или не так.</para> + +</chapter> + +<appendix id="installation"> +<title +>Установка &arts;</title> + +<para +>Для использования &arts; вам, естественно, нужно уже установить и запустить его в вашей системе. Существует два способа, которые описываются в следующих разделах. </para> + +<sect1 id="binary-install"> +<title +>Установка из готового скомпилированного пакета</title> + +<para +>Наиболее быстрый и простой путь получения работающего &arts; - это установка бинарного пакета для вашей системы. Самый последние дистрибутивы &Linux; имеют &kde;, и если это &kde; 2.0 или более поздний, то там есть и &arts;. Если &kde; нет на установочном диске (или другом носителе), то его можно скачать у производителя операционной системы. Иначе же его можно получить из других источников. Убедитесь, что вы используете пакет, совместимый с вашей операционной системой. </para> + +<para +>По умолчанию &kde; содержит в себе звуковой сервер, и большинство программ использует его для воспроизведения звука. Если вы хотите полный набор мультимедиа инструментов и программ, то вам необходимо установить дополнительные пакеты. </para> + +<para +>Неудобством использования бинарного пакета может быть то, что это не самая последняя версия &arts;. Это особенно вероятно, если пакет распространяется на компакт диске, темп разработки &arts; и &kde; такой, что выпуски на компакт дисках обычно за ним не успевают. Может также получиться, что если у вас нестандартная архитектура или дистрибутив операционной системы, то бинарные пакеты могут быть недоступны и вам нужно будет использовать второй метод. </para> + +</sect1> + +<sect1 id="source-install"> +<title +>Сборка из исходников</title> + +<para +>Самым гибким способом собрать &arts; является компиляция из исходного кода. Это гарантирует получение версии, оптимально скомпилированной для вашей конфигурации системы и позволит вам собрать самую последнюю версию. </para> + +<para +>Здесь вы можете выбрать из двух вариантов - вы можете установить последнюю стабильную версию, включенную в &kde; или вы самую последнюю версию (но возможно нестабильную) прямо из <acronym +>CVS</acronym +> архива проекта &kde;. Большинство пользователей, которые не разрабатывают программы для &arts;, используют стабильную версию. Вы можете получить ее с <ulink url="ftp://ftp.kde.org" +>ftp://ftp.kde.org</ulink +> или с одного из зеркал. Если вы активно разрабатываете приложения для &arts;, вам лучше использовать <acronym +>CVS</acronym +> версию. Если вы хотите использовать aRts без KDE, можете скачать отдельный вариант с <ulink url="http://space.twc.de/~stefan/kde/arts-snapshot-doc.html" +>http://space.twc.de/~stefan/kde/arts-snapshot-doc.html</ulink +>. </para> + +<para +>Заметьте, что если вы собираете из <acronym +>CVS</acronym +>, то некоторые компоненты &arts; (например, компоненты ядра, включая звуковой сервер) находятся в <acronym +>CVS</acronym +> модуле tdelibs, в то время как дополнительные компоненты (в том числе <application +>artsbuilder</application +>) находятся в модуле tdemultimedia/arts. В будущем это может изменится. Вы можете найти версию в модуле kmusic, но это уже старая (pre-&kde; 2.0) версия. </para> + +<para +>Требования для сборки &arts; такие же, как и для сборки &kde;. Конфигурационный скрипт определит параметры вашей системы и проинформирует, если необходимые компоненты будут отсутствовать. Убедитесь, что у вас работает драйвер звуковой карты (один из <acronym +>OSS</acronym +>/Free драйверов в ядре операционной системы, <acronym +>OSS</acronym +> драйвер от 4Front Technologies, или <acronym +>ALSA</acronym +> драйвер с <acronym +>OSS</acronym +> эмуляцией). </para> + +<para +>Подробнее о том, как получить и установить &kde; (включая &arts;), можно узнать в <ulink url="http://www.kde.org/documentation/faq/index.html" +>&kde; &FAQ;</ulink +>.</para> + +</sect1> + +</appendix> + +&digitalaudio; +&midiintro; +&arts-glossary; + +</book> +<!-- +Local Variables: +mode: sgml +sgml-omittag:nil +sgml-shorttag:t +sgml-namecase-general:t +sgml-general-insert-case:lower +sgml-minimize-attributes:nil +sgml-always-quote-attributes:t +sgml-indent-step:0 +sgml-indent-data:nil +End: +--> diff --git a/tde-i18n-ru/docs/tdemultimedia/artsbuilder/mcop.docbook b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/mcop.docbook new file mode 100644 index 00000000000..a372f11d280 --- /dev/null +++ b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/mcop.docbook @@ -0,0 +1,1958 @@ +<!-- <?xml version="1.0" ?> +<!DOCTYPE chapter PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN" "dtd/kdex.dtd"> +To validate or process this file as a standalone document, uncomment +this prolog. Be sure to comment it out again when you are done --> + +<chapter id="mcop"> +<title +>&MCOP;: Потоки и объектные модели</title> + +<sect1 id="mcop-overview"> + +<title +>Описание</title> + +<para +>&MCOP; используется в &arts; для: </para> + +<itemizedlist> +<listitem> +<para +>Связи между объектами. </para> +</listitem> + +<listitem> +<para +>Прозрачности работы в сети. </para> +</listitem> + +<listitem> +<para +>Описания интерфейсов объектов. </para> +</listitem> + +<listitem> +<para +>Независимости от языка. </para> +</listitem> +</itemizedlist> + +<para +>Важным составляющим &MCOP; является <emphasis +>язык описания интерфейса</emphasis +> &IDL;, с помощью которого описано большинство интерфейсов &arts; и <acronym +>API</acronym +>. </para> + +<para +>Чтобы использовать &IDL;, интерфейсы из C++ компилируются &IDL;-компилятором вместе с кодом C++. При реализации интерфейса вы наследуете от базового класса &IDL;, созданного компилятором. При использовании интерфейсов это можно сделать с помощью надстраивания функциональности. Таким образом, &MCOP; может пользоваться своим протоколом, даже если объект нелокален. Так вы получаете прозраночть работы в сети. </para> + +<para +>В этой главе описываются основные черты объектной модели, получаемой при использовании &MCOP;, сам протокол и его использование в C++ (связывание языков) и т.д. </para> + +</sect1> + +<sect1 id="interfaces"> + +<title +>Интерфейсы и &IDL;</title> + +<para +>Большинство сервисов &arts; (к примеру, модули и звуковой сервер) определены в терминах <acronym +>интерфейсов</acronym +>. А интерфейсы описаны в формате, не зависящем от языка: &IDL;. </para> + +<para +>Таким образом, многие детали вроде формата потоков медиаданных, прозрачность сети и зависимости от языка программирования можно скрыть в описании интерфейса. Инструмент &mcopidl; преобразовывает определение интерфейса для конкретного языка программирования (сейчас поддерживается только C++). </para> + +<para +>Инструмент генерирует каркасный класс с основными функциями. Ваши собственные классы будут от него наследовать. </para> + +<para +>&IDL; использующийся в &arts; похож на язык, использующийся в <acronym +>CORBA</acronym +> and <acronym +>DCOM</acronym +>. </para> + +<para +>Файлы &IDL; могут содержать: </para> + +<itemizedlist> +<listitem> +<para +>Директивы #include для других файлов &IDL;. </para> +</listitem> + +<listitem> +<para +>Объявления перечисляемых типов и структур, как в C/C++. </para> +</listitem> + +<listitem> +<para +>Объявления интерфейсов. </para> +</listitem> +</itemizedlist> + +<para +>Интерфейсы в &IDL; - это почти то же самое, что класс в C++ или структура в C, но с некоторыми ограничениями. Как и в C++, интерфейсы наследовать от других интерфейсов. В определение интерфейса можно включать: потоки, атрибуты и методы. </para> + +<sect2 id="streams"> + +<title +>Потоки</title> + +<para +>Потоки определяют медиаданные, они являются важнейшими компонентами модуля. Формат потока: </para> + +<para +>[ async ] in|out [ multi ] <replaceable +>тип</replaceable +> stream <replaceable +>имя</replaceable +> [ , <replaceable +>имя</replaceable +> ] ; </para> + +<para +>Направленность потоков зависит от квалификатора (выход или вход). Аргумент типа определяет тип данных (один из перечисленных ниже типов атрибутов), однако поддерживаются ещё не все типы. Во многих модулях типом потока ставится аудио, это внутренний формат данных. Несколько потоков одного типа могут быть объявлены через запятую. </para> + +<para +>По умолчанию потоки синхронны, т.е. передача данных идёт постоянно и на определённой частоте, как <acronym +>PCM</acronym +>-аудио. Если вы установите параметр async, поток будет асинхронным, т.е. данные будут передаваться с перерывами. Примером асинхронных потоков могут служить &MIDI;-сообщения. </para> + +<para +>Ключевое слово multi, допустимое только для входных потоков, указывает на то, что поток может принимать переменное количество входов. Это удобно при создании таких устройств, как микшеры, которые могут принимать любое количество входных потоков. </para> + +</sect2> +<sect2 id="attributes"> + +<title +>Атрибуты</title> + +<para +>Атрибуты - это данные, ассоциирующиеся с объектом интерфейса. Они определяются как переменные-члены классов в C++ и могут быть одного из простейших типов данных: boolean, byte, long, string или float - а такжеструктурами, определёнными пользователем, перечисляемого типа (enum) или последовательностью с переменной длиной (используется <type>). Лучше всего атрибуты помечать как доступные только для чтения. </para> + +</sect2> +<sect2 id="methods"> + +<title +>Методы</title> + +<para +>Как и в C++, методы могут определяться в интерфейсах. Тип параметров метода может быть таким же, у атрибута. Ключевое слово oneway показывает, что метод возвращает какое-то значение сразу и выполняется асинхронно. </para> + +</sect2> + +<sect2 id="standardinterfaces"> + +<title +>Стандартные интерфейсы</title> + +<para +>В &arts; уже определены несколько стандартных модульных интерфейсов, например, <interfacename +>StereoEffect</interfacename +> и <interfacename +>SimpleSoundServer</interfacename +>. </para> + +</sect2> + +<sect2 id="example"> +<title +>Пример</title> + +<para +>Простым примером модуля &arts; может служить модуль постоянных задержек из файла <filename +>tdemultimedia/arts/modules/artsmodules.idl</filename +>. Определение интерфейса приведено ниже. </para> + +<programlisting +>interface Synth_CDELAY : SynthModule { + attribute float time; + in audio stream invalue; + out audio stream outvalue; +}; +</programlisting> + +<para +>Модуль наследует от <interfacename +>SynthModule</interfacename +>. Этот интерфейс, описанный в <filename +>artsflow.idl</filename +>, определяет методы, использующиеся во всех модулях-синтезаторах. </para> + +<para +>Эффект CDELAY задерживает звуковой стереопоток на время, указанное как параметр с плавающей точкой. В определении интерфейса есть атрибут типа float для хранения длительности задержки. Он определяет два входных аудиопотока и два выходных. Никаких других методов, кроме тех, от которых он наследует, не требуется. </para> + +</sect2> + +</sect1> + +<sect1 id="more-about-streams"> +<title +>Подробнее о потоках</title> + +<para +>В этом разделе вы найдёте дополнительную информацию о потоках. </para> + +<sect2 id="stream-types"> +<title +>Типы потоков</title> + +<para +>Есть несколько вариантов реализации потоков в модуле. Вот несколько примеров: </para> + +<itemizedlist> +<listitem> +<para +>Увеличение сигнала в два раза. </para> +</listitem> + +<listitem> +<para +>Выборочное изменение частоты. </para> +</listitem> + +<listitem> +<para +>Декодирование сигналов. </para> +</listitem> + +<listitem> +<para +>Чтение &MIDI;-событий из <filename class="devicefile" +>/dev/midi00</filename +> и добавление их в поток. </para> +</listitem +> +</itemizedlist> + +<para +>Первый случай очень прост: получив 200 сэмплов на входе, модуль воспроизводит 200 сэмплов на выходе. Т.е. выходные данные производятся только после получения входных. </para> + +<para +>Во втором случае при 200 входных сэмплов производится другое число выходных. Это зависит от выполненного преобразования, но их количество известно заранее. </para> + +<para +>В третьем случае всё ещё сложнее. Нельзя угадать заранее, сколько байтов будет сгенерировано из 200 сэмплов (возможно, гораздо больше, но...). </para> + +<para +>В последнем случае модуль активизируется сам по себе и иногда генерирует данные. </para> + +<para +>В &arts;-0.3.4 поддерживались потоки только первого типа, и большинство задач выполнялись. Возможно, это и требуется при написании модулей обработки аудиоданных. Со сложными типами потоков возникают проблемы, т.к. их очень сложно программировать и большая часть функций часто не нужна. Поэтому мы решили использовать два типа потоков: синхронные и асинхронные. </para> + +<para +>Характеристики синхронных потоков: </para> + +<itemizedlist> +<listitem> +<para +>Модули должны обрабатывать входные данные любой длины (при условии, что их достаточно). </para> +</listitem> + +<listitem> +<para +>У всех потоков одна частота модуляции. </para> +</listitem> + +<listitem> +<para +>Функция <function +>calculateBlock()</function +> будет вызываться в том случае, если есть достаточное количество входных данных и указатели содержат ссылки на данные. </para> +</listitem +> + +<listitem> +<para +>Резервирование и освобождение не выполняются. </para> +</listitem> +</itemizedlist> + +<para +>Асинхронные потоки работают по-другому: </para> + +<itemizedlist> +<listitem> +<para +>Модули могут формировать данные время от времени, с меняющейся частотой модуляции или только если они не ограничены правилом <quote +>на запрос любой длины нужно отвечать</quote +>. </para> +</listitem> + +<listitem> +<para +>В асинхронных потоках частоты модуляции могут быть совершенно разными. </para> +</listitem> + +<listitem> +<para +>Исходящие потоки: содержат открытые функции для размещения пакетов, пересылки и учёта данных (используя этот механизм, вы будете знать, когда следует передать очередную порцию данных). </para> +</listitem> + +<listitem> +<para +>Входящие потоки: вызов происходит при получении нового пакета, вам нужно послать ответ, когда он будет обработан (вы можете послать сообщение об этом позже, если пакет кем-нибудь обработан, он будет освобождён/использовано заново). </para> +</listitem> +</itemizedlist> + +<para +>В определении потоков используется ключевое слово <quote +>async</quote +> для указания асинхронного потока. Если вы, к примеру, решили преобразовать ваш асинхронный поток байтов в синхронный поток сэмплов, интерфейс должен выглядеть так: </para> + +<programlisting +>interface ByteStreamToAudio : SynthModule { + async in byte stream indata; // the asynchronous input sample stream + + out audio stream left,right; // the synchronous output sample streams +}; +</programlisting> + +</sect2> + +<sect2 id="async-streams"> +<title +>Использование асинхронных потоков</title> + +<para +>Предположим, вам нужно написать модуль, воспроизводящий звук асинхронно. Его интерфейс будет выглядеть следущим образом: </para> + +<programlisting +>interface SomeModule : SynthModule +{ + async out byte stream outdata; +}; +</programlisting> + +<para +>Как посылать данные? Первый способ называется <quote +>принудительная доставка</quote +>. В асинхронных потоках данные посылаются пакетами. Это значит, что вы посылаете отдельные пакеты байтов, как в примере выше. Вся процедура состоит в том, чтобы разместить пакет, заполнить его и послать. </para> + +<para +>Вот пример кода. Сначала пакет размещается: </para> + +<programlisting +>DataPacket<mcopbyte> *packet = outdata.allocPacket(100); +</programlisting> + +<para +>Потом он заполняется: </para> + +<programlisting +>//для fgets необходим указатель (char *) +char *data = (char *)packet->contents; + +//как видите, размер пакета можно уменьшить после размещения +if(fgets(data,100,stdin)) + packet->size = strlen(data); +else + packet->size = 0; +</programlisting> + +<para +>И теперь посылаем: </para> + +<programlisting +>packet->send(); +</programlisting> + +<para +>Как видите, это достаточно просто. Но если пакеты нужно посылать с такой скоростью, чтобы получатель успевал их обрабатывать, нужен другой подход - <quote +>доставка с задержкой</quote +>. Сначала вы посылаете какое-то количество пакетов, в то время, когда получатель по очереди их обрабатывает, формируете новые и опять посылаете их. </para> + +<para +>Вызов производится командой setPull. Например: </para> + +<programlisting +>outdata.setPull(8, 1024); +</programlisting> + +<para +>Это значит, что вы хотите посылать пакеты через outdata и начать с 8, а когда получатель обработает несколько, восполнить их. </para> + +<para +>После этого нужно указать метод заполнения пакетов. Он может выглядеть так: </para> + +<programlisting +>void request_outdata(DataPacket<mcopbyte> *packet) +{ + packet->size = 1024; //не больше 1024 + for(int i = 0;i < 1024; i++) + packet->contents[i] = (mcopbyte)'A'; + packet->send(); +} +</programlisting> + +<para +>Вот и всё. Когда закончатся пакеты, установите размер пакетов в ноль, что предотвратит их дальнейшую отправку. </para> + +<para +>Заметьте, что очень важно называть метод определённым образом: <methodname +>request_<replaceable +>имя потока</replaceable +></methodname +>. </para> + +<para +>Мы обсудили, как отправлять данные. Получать их намного проще. Предположим, есть простой фильтр ToLower, который преобразовывает все буквы в нижний регистр: </para> + +<programlisting +>interface ToLower { + async in byte stream indata; + async out byte stream outdata; +}; +</programlisting> + +<para +>Очень простое использование: </para> + +<programlisting +>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); +</programlisting> + +<para +>И опять обратите внимание на имя метода <methodname +>process_<replaceable +>имя потока</replaceable +></methodname +>. </para> + +<para +>Как видите, при получении пакета вызывается функция (в нашем случае это <function +>process_indata</function +>). А чтобы показать, что пакет обработан, нужно вызвать метод <methodname +>processed()</methodname +>. </para> + +<para +>Совет по использованию: если обработка проходит медленно (к примеру, если нужно ждать вывода данных звуковой картой), не вызывайте processed() сразу же, а только после того, как пакет будет действительно обработан. Тогда отправитель будет знать, сколько времени требуется на самом деле. </para> + +<para +>Т.к. асинхронные потоки синхронизируются не очень хорошо, старайтесь использовать синхронные, а асинхронные только в крайнем случае. </para> + +</sect2> + +<sect2 id="default-streams"> +<title +>Стандартные потоки</title> + +<para +>Предположим, есть 2 объекта, например, AudioProducer и AudioConsumer. У AudioProducer есть выходной поток, а у AudioConsumer - входной. Соединяя их, вы будете использовать эти потоки. С помощью стандартных потоков соединение упрощается: не нужно указывать порты. </para> + +<para +>Пусть теперь у нас есть объекты стререозвука, у каждого есть <quote +>левый </quote +> и <quote +>правый</quote +> порт. Очень хочется, чтобы подключение было как можно проще. Но как система узнает, какие порты соединять? Тут опять помогут стандартные потоки: можно указать несколько потоков по порядку. Поэтому, когда вы будете подключать два выходных стандартных потока к двум входным, не нужно будет указывать порты, а соответствие будет правильным. </para> + +<para +>Конечно, это не ограничено стреозвуком. Любое количество потоков можно сделать стандартным при необходимости, а функция связи будет проверять совпадение количества стандартных потоков двух объектов (в необходимом направлении), если вы не укажете порты. </para> + +<para +>Ключевое слово default в &IDL; может указывать в описании потока или в отдельной строке. Например: </para> + +<programlisting +>interface TwoToOneMixer { + default in audio stream input1, input2; + out audio stream output; +}; +</programlisting> + +<para +>В этом примере у объекта два входных порта будут соединены по умолчанию. Порядок определяется по строке со словом default. Поэтому у такого объекта: </para> + +<programlisting +>interface DualNoiseGenerator { + out audio stream bzzt, couic; + default couic, bzzt; +}; +</programlisting> + +<para +>Соединение <quote +>couic</quote +> с <quote +>input1</quote +> и <quote +>bzzt</quote +> с <quote +>input2</quote +> будет установлено автоматически. Заметьте, что в этом случае единственный выходной порт будет стандартным (смотрите ниже). Синтаксис генератора шума удобен для описания другого порядка или выбора только некоторых портов по умолчанию. Направления портов будет назначать &mcopidl;, поэтому не указывайте их. Входные и выходные порты можно записать в одной строке, важен лишь порядок. </para> + +<para +>Есть несколько правил наследования: </para> + +<itemizedlist> +<listitem> +<para +>Если в &IDL; указан стандартный список, пользуйтесь им. В него могут быть добавлены родительские порты, независимо от того, были ли они стандартными. </para> +</listitem> + +<listitem> +<para +>Иначе наследоваться будут родительские порты по умолчанию в таком порядке: родитель1 порт1, родитель1 порт2, ..., родитель2 порт1, ... Если есть общий предок с двумя родительскими ветвями, по умолчанию использоваться будет первый попавшийся в списке порт. </para> +</listitem> + +<listitem> +<para +>Если порта по умолчанию нет, но есть одночный поток в каком-то направлении, используйте его как стандартый для этого направления. </para> +</listitem> +</itemizedlist> + +</sect2> + +</sect1> +<sect1 id="attribute-change-notify"> +<title +>Флаги смены атрибута</title> + +<!-- TODO: This should be embedded better into the context - I mean: the + context should be written ;-). --> + +<para +>Флаги смены атрибута - это способ показать, что атрибут изменился. Они похожи на сигналы и функции внешнего вызова в &Qt; или Gtk. Например, если есть элемент &GUI; ползунок, отмечающий значение от 0 до 100, то должен быть объект, работающий с этим значением (к примеру, он может управлять громкостью сигнала). Будет удобно, если объект будет знать, изменился ли уровень громкости. Связь между отправителем и получателем. </para> + +<para +>В &MCOP; есть возможность контролировать изменения атрибутов. Независимо от того, что объявлено в &IDL;, <quote +>атрибут</quote +> может (и должен) изменяться, а также получать сообщения об изменении. Например, если у вас было два &IDL;-интерфейса: </para> + +<programlisting +>interface Slider { + attribute long min,max; + attribute long position; + }; + interface VolumeControl : Arts::StereoEffect { + attribute long volume; // 0..100 + }; +</programlisting> + +<para +>Вы можете их связать с помощью флагов изменения. В этом случае связь будет выглядеть так (код на C++): </para> + +<programlisting +>#include <connect.h> +using namespace Arts; +[...] +connect(slider,"position_changed",volumeControl,"volume"); +</programlisting> + +<para +>Как видите, у каждого атрибута есть два разных потока: для отправки извещений об изменении вызывается <function +><replaceable +>имя атрибута</replaceable +> _changed</function +> и для получения — <function +>attributename</function +>. </para> + +<para +>Важно знать, что флаги изменения совместимы с асинхронными потоками. А также они "прозрачны", поэтому вы можете связать атрибут типа float элемента &GUI; с асинхронным потоком модуля синтезатора на другом компьютере. Естественно, изменение флага <emphasis +>не будет синхронным </emphasis +>, т. к. на передачу уходит некоторое время. </para> + +<sect2 id="sending-change-notifications"> + +<title +>Отправка извещений об изменении</title> + +<para +>Если вы используете объекты с атрибутами, извещение об изменении нужно посылать каждый раз, когда атрибут меняется. Код выглядит приблизительно так: </para> + +<programlisting +>void KPoti_impl::value(float newValue) + { + if(newValue != _value) + { + _value = newValue; + value_changed(newValue); // <- послать извещение + } + } +</programlisting> + +<para +>Мы рекомендуем такой код для всех создаваемых объектов, чтобы флаги изменения могли использовать другие люди. Однако не стоит посылать извещения слишком часто, поэтому если вы обрабатываете сигнал, будет удобно записывать, когда было послано последнее извещение, чтобы не посылать его с каждым сэмплом. </para> + +</sect2> + +<sect2 id="change-notifications-apps"> +<title +>Приложения для изменения флага</title> + +<para +>Будет особенно полезно менять флаг вместе с оболочками (которые, к примеру, визуализируют аудио данные), элементами gui, контроля и мониторинга. Такой код находится в <filename class="directory" +>tdelibs/arts/tests</filename +> а экспериментальая реализация artsgui - в <filename class="directory" +>tdemultimedia/arts/gui</filename +>. </para> + +<!-- TODO: can I markup links into the source code - if yes, how? --> + +<!-- LW: Linking into the source is problematic - we can't assume people are +reading this on a machine with the sources available, or that they aren't +reading it from a website. We're working on it! --> + +</sect2> +</sect1> + +<sect1 id="the-mcoprc-file"> + +<title +>Файл <literal role="extension" +>.mcoprc</literal +></title> + +<para +>Файл <literal role="extension" +>.mcoprc</literal +> (в каталоге home каждого пользователя) может быть использован для настройки &MCOP;. Сейчас возможно следущее: </para> + +<variablelist> + +<varlistentry> +<term +>GlobalComm</term> +<listitem> +<para +>Имя интерфейса для глобальной связи. Глобальная связь необходима для того, чтобы находить другие объекты и получать личные данные пользователя. Для разных &MCOP;-клиентов/серверов, которые должны быть как-то связаны, нужен общий объект GlobalComm для разделения информации между ними. Возможные значения: <quote +>Arts::TmpGlobalComm</quote +> для связи посредством каталога <filename class="directory" +>/tmp/mcop-<replaceable +>имя пользователя</replaceable +></filename +> (который будет только на локальном компьютере) и <quote +>Arts::X11GlobalComm</quote +> для связи через свойства корневого окна сервера X11. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +>TraderPath</term> + +<listitem> +<para +>Указывает, в каком каталоге хранится информация о трейдере. Вы можете перечислить несколько, разделив их запятой. </para> +</listitem> + +</varlistentry> + +<varlistentry> +<term +>ExtensionPath</term> + +<listitem> +<para +>Указывает, из каких каталогов загружаются расширения (в форме общих библиотек). Несколько значений разделяются запятой. </para> +</listitem> + +</varlistentry> +</variablelist> + +<para +>Вот пример использования: </para> + +<programlisting +># $HOME/.mcoprc file +GlobalComm=Arts::X11GlobalComm + +#если вы разработчик, будет удобно добавлять путь к каталогу трейдера +#т.е. вы сможете использовать добавлять компоненты, не устанавливая их +TraderPath="/opt/kde2/lib/mcop","/home/joe/mcopdevel/mcop" +ExtensionPath="/opt/kde2/lib","/home/joe/mcopdevel/lib" +</programlisting> + +</sect1> + +<sect1 id="mcop-for-corba-users"> +<title +>&MCOP; для пользователей <acronym +>CORBA</acronym +></title> + +<para +>Если вы пользовались <acronym +>CORBA</acronym +> раньше, вы заметите, что &MCOP; очень похож на эту технологию. Вообще-то до версии 0.4 &arts; использовал <acronym +>CORBA</acronym +>. </para> + +<para +>Основная идея <acronym +>CORBA</acronym +> такая же: вы создаёте объекты (компоненты). В &MCOP; ваши объекты доступны как обычные классы, в том числе и для удалённого сервера. Для этого нужно определить интерфейс объектов в файле &IDL;, так же, как и в <acronym +>CORBA</acronym +>. Однако есть несколько различий. </para> + +<sect2 id="corba-missing"> +<title +>Функции <acronym +>CORBA</acronym +>, которые отсутствуют в &MCOP;</title> + +<para +>В &MCOP; нет параметров <quote +>вход</quote +> и <quote +>выход</quote +> вызова методов. Параматры всегда входящие, а возвращаемый код всегда исходящий. Это значит, что интерфейс: </para> + +<programlisting +>// CORBA idl +interface Account { + void deposit( in long amount ); + void withdraw( in long amount ); + long balance(); +}; +</programlisting> + +<para +>пишется как </para> + +<programlisting +>// MCOP idl +interface Account { + void deposit( long amount ); + void withdraw( long amount ); + long balance(); +}; +</programlisting> + +<para +>в &MCOP;. </para> + +<para +>Нет обработки исключений. В &MCOP; есть другие способы для обхода ошибок. </para> + +<para +>Здесь нет типа union и typedef. Не знаю, большой ли это недостаток... </para> + +<para +>Нет поддержки передачи интерфейсов и обращения к объектам </para> + +</sect2> + +<sect2 id="corba-different"> +<title +>Функции <acronym +>CORBA</acronym +>, отличающиеся в &MCOP;</title> + +<para +>В &MCOP; последовательности определяются так: <quote +>последовательность<replaceable +>тип</replaceable +></quote +>. Нет необходимости писать typedef. Например, вместо </para> + +<programlisting +>// CORBA idl +struct Line { + long x1,y1,x2,y2; +}; +typedef sequence<Line> LineSeq; +interface Plotter { + void draw(in LineSeq lines); +}; +</programlisting> + +<para +>вы напишете </para> + +<programlisting +>// MCOP idl +struct Line { + long x1,y1,x2,y2; +}; +interface Plotter { + void draw(sequence<Line> lines); +}; +</programlisting> + +</sect2> + +<sect2 id="no-in-corba"> +<title +>Функции &MCOP;, которых нет в <acronym +>CORBA</acronym +></title> + +<para +>Вы можете объявить потоки, которые будут обрабатываться платформой &arts;. Объявление потоков похоже на объявление атрибутов. Например: </para> + +<programlisting +>// MCOP idl +interface Synth_ADD : SynthModule { + in audio stream signal1,signal2; + out audio stream outvalue; +}; +</programlisting> + +<para +>Это значит, что ваш объект будет принимать два входящих синхронных аудиопотока signal1 и signal2. "Синхронный" значит, что эти потоки обязательно будут выдавать определённое количество данных. Т. е. если вызывается ваш объект и ему передаётся 200 сэмплов (signal1 + signal2), он выдаст 200 сэмплов. </para> + +</sect2> + +<sect2 id="mcop-binding"> +<title +>Связь &MCOP; с C++</title> + +<para +>Основные отличия от <acronym +>CORBA</acronym +>: </para> + +<itemizedlist> +<listitem> +<para +>Для работы со строками используется класс C++ <acronym +>STL</acronym +> <classname +>string</classname +>. Если они хранятся в последовательности, они хранятся <quote +>просто тпе</quote +>, т.е. они считаются простым типом. Поэтому им необходимо копирование. </para> +</listitem> + +<listitem> +<para +>long - обычный тип long (32 бита). </para> +</listitem> + +<listitem> +<para +>Последовательности используют класс C++ <acronym +>STL</acronym +> <classname +>vector</classname +>. </para> +</listitem> + +<listitem> +<para +>Все структуры созданы из класса &MCOP; <classname +>Type</classname +> и сгенерированы компилятором &IDL;. Если они хранятся в массиве, для того, чтобы избежать копирования, хранятся только ссылки. </para> +</listitem> +</itemizedlist> +</sect2> + +<sect2 id="implementing-objects"> +<title +>Создание объектов &MCOP;</title> + +<para +>После компиляции их нужно извлечь из класса <classname +>_skel</classname +>. Например, если вы определили ваш интерфейс так: </para> + +<programlisting +>// MCOP idl: hello.idl +interface Hello { + void hello(string s); + string concat(string s1, string s2); + long sum2(long a, long b); +}; +</programlisting> + +<para +>Вы компилируете его, вызвав <userinput +><command +>mcopidl</command +> <parameter +>hello.idl</parameter +></userinput +>, при этом сгенерируется <filename +>hello.cc</filename +> и <filename +>hello.h</filename +>. Чтобы эти файлы использовать, нужно определить C++ класс, который будет наследовать каркас: </para> + +<programlisting +>//заголовочный файл 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); +}; +</programlisting> + +<para +>И, наконец, можете пользоваться методами как в обычном C++ </para> + +<programlisting +>// файл, использующий 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; +} +</programlisting> + +<para +>После этого вы получите объекты, которые могут "общаться" с помощью &MCOP;. Теперь осталось их создать (это делается так же, как в C++): </para> + +<programlisting +>Hello_impl server; +</programlisting> + +<para +>И как только вы добавите ссылку </para> + +<programlisting +>string reference = server._toString(); + printf("%s\n",reference.c_str()); +</programlisting> + +<para +>и перейдете в цикл ожидания </para> + +<programlisting +>Dispatcher::the()->run(); +</programlisting> + +<para +>Люди смогут обращаться к нему </para> + +<programlisting +>// этот код может содержаться где угодно +// (даже на другом компьютере с другой архитектурой) + + Hello *h = Hello::_fromString([the object reference printed above]); +</programlisting> + +<para +>и вызывать методы: </para> + +<programlisting +>if(h) + h->hello("test"); + else + printf("Access failed?\n"); +</programlisting> + +</sect2> +</sect1> + +<sect1 id="mcop-security"> +<title +>Безопасность в &MCOP;</title> + +<para +>Так как передача данных между серверами &MCOP; идёт по протоколу <acronym +>TCP</acronym +>, любой (если вы подключены к Интернету) может попробовать подключиться к сервисам &MCOP;. Поэтому рекомендуется использовать аутентификацию клиентов. В &MCOP; используется протокол md5-auth </para> + +<para +>В md5-auth отбор клиентов, которые могут подключиться, происходит так: </para> + +<itemizedlist> +<listitem> +<para +>Предполагается, что любой может получить ваш секретный пароль. </para> +</listitem> + +<listitem> +<para +>При каждом подключении клиента проверяется, знает ли он секретный пароль, при этом пароль не пересылается по сети, чтобы любой, прослушивающий сеть, не мог его получить. </para> +</listitem> + +</itemizedlist> + +<para +>Чтобы назначить каждому клиенту свой секретный пароль, &MCOP; запишет его в каталоге <filename class="directory" +>mcop</filename +> (<filename class="directory" +>/tmp/mcop-<envar +>USER</envar +>/secret-cookie</filename +>). Конечно, вы можете его скопировать на другой компьютер. Однако в этом случае нужен безопасный способ копирования, например, <command +>scp</command +> (из <application +>ssh</application +>). </para> + +<para +>Шаги аутентификации: </para> + +<procedure> +<step> +<para +>[Сервер] генерирует новый (случайный) пароль R </para> +</step> + +<step> +<para +>[Сервер] посылает его клиенту </para> +</step> + +<step> +<para +>[Клиент] читает "секретный пароль" S из файла </para> +</step> + +<step> +<para +>[Клиент] с помощью алгоритма MD5 преобразует пароли R и S и формирует пароль M </para> +</step> + +<step> +<para +>[Клиент] посылает M серверу </para> +</step> + +<step> +<para +>[Сервер] проверяет, действительно ли преобразование R и S даёт пароль M, полученный от клиента. Если да, аутентификация прошла успешно. </para> +</step> + +</procedure> + +<para +>Этот алгоритм обеспечивает безопасность при условии, что </para> + +<orderedlist> +<listitem> +<para +>Секретный и случайный пароли <quote +>достаточно случайны</quote +> и </para> +</listitem> + +<listitem> +<para +>Алгоритм искажения MD5 не позволяет восстановить <quote +>исходный текст</quote +>, т.е. секретный S и случайный R пароли (который все знают) из преобразованного пароля M. </para> +</listitem> +</orderedlist> + +<para +>Каждое новое подключение по протоколу &MCOP; начинается с аутентификации. Это выглядит так: </para> + +<procedure> + +<step> +<para +>Сервер посылает сообщение ServerHello, в котором описываются все известные протоколы аутентификации. </para> +</step> + +<step> +<para +>Клиент посылает сообщение ClientHello с информацией об аутентификации. </para> +</step> + +<step> +<para +>Сервер посылает сообщение AuthAccept. </para> +</step> +</procedure> + +<para +>Чтобы понять, как действительно работает система безопасности, нужно посмотреть, как обрабатываются сообщения во время аутентификации: </para> + +<itemizedlist> +<listitem> +<para +>Пока не завершится этап аутентификации, никаких других сообщений сервер принимать не будет. Например, если он ожидает сообщение <quote +>ClientHello</quote +>, а получает mcopInvocation, связь разрывается. </para> +</listitem> + +<listitem> +<para +>Если клиент вообще не посылает допустимых сообщений &MCOP; во время аутентификации, связь разрывается. </para> +</listitem> + +<listitem> +<para +>Если клиент пытается послать слишком большое сообщение (4096 байтов во время аутентификации), оно обрезается до 0 байтов, и сервер считает, что сообщение не было послано. Это необходимо, чтобы неаутентифицированный пользователь не мог послать сообщение в 100 мегабайт и израсходовал всю память сервера. </para> +</listitem> + +<listitem> +<para +>Если клиент присылает искажённое сообщение ClientHello, соединение разрывается. </para> +</listitem> + +<listitem> +<para +>Кроме того, нужно указать время ожидания на случай, если клиент вообще ничего не посылает. </para> +</listitem> +</itemizedlist> + +</sect1> + +<sect1 id="mcop-protocol"> +<title +>Описание потокола &MCOP;</title> + +<sect2 id="mcop-protocol-intro"> +<title +>Введение</title> + +<para +>Протокол очень похож на <acronym +>CORBA</acronym +>, но он был расширен, чтобы выполнять все необходимые операции в реальном времени. </para> + +<para +>Вы можете создать объектную мультимедиа-модель, которую можно будет использовать для связи между компонентами в одном адресном пространстве (в одной задаче), а также между компонентами в различных потоках, задачах и на разных узлах. </para> + +<para +>Он будет доработан, чтобы выполнение проходило очень быстро и подходило "общительным" приложениям. Например, потоки видео - одно из приложений &MCOP;, где большая часть реализаций <acronym +>CORBA</acronym +> явно проигрывает. </para> + +<para +>Определения интерфейсов полностью реализуют следующую функуиональность: </para> + +<itemizedlist> +<listitem> +<para +>Непрерывные потоки данных (например, аудиоданные). </para> +</listitem> + +<listitem> +<para +>Потоки событий (например, &MIDI;-события). </para> +</listitem> + +<listitem> +<para +>Счётчик ссылок. </para> +</listitem> +</itemizedlist> + +<para +>и наиболее важные особенности <acronym +>CORBA</acronym +> , например: </para> + +<itemizedlist> +<listitem> +<para +>Вызовы синхронных методов. </para> +</listitem> + +<listitem> +<para +>Вызовы асинхронных методов. </para> +</listitem> + +<listitem> +<para +>Создание определённых пользователем типов. </para> +</listitem> + +<listitem> +<para +>Множественное наследование. </para> +</listitem> + +<listitem> +<para +>Передача ссылок на объекты. </para> +</listitem> +</itemizedlist> + +</sect2> + +<sect2 id="mcop-protocol-marshalling"> +<title +>Упаковка сообщений &MCOP;</title> + +<para +>Идеи/цели дизайна: </para> + +<itemizedlist> + +<listitem> +<para +>Упаковка объектов должна быть проста в использовании. </para> +</listitem> + +<listitem> +<para +>При распаковке получатель должен знать, сообщение какого типа он собирается распаковывать. </para> +</listitem> + +<listitem> +<para +>Получатель должен использовать всю информацию, поэтому пропуски информации обычно бывают только в таких случаях: </para> + +<itemizedlist> +<listitem> +<para +>Если вы знаете, что получите блок байтов, вам не нужно проверять каждый из них на наличие маркера конца передачи. </para> +</listitem> + +<listitem> +<para +>Если вы собираетесь получить строку, не нужно читать её до нулевого байта, чтобы вычислить длину, но </para> +</listitem> + +<listitem> +<para +>При получении массива строк нужно отслеживать длину каждой строки, чтобы узнать, когда закончится массив. Хотя если вы используете строки для чего-то важного, это нужно делать в любом случае. </para> +</listitem> +</itemizedlist> + +</listitem> + +<listitem> +<para +>Снижение непроизводительных издержек. </para> +</listitem> +</itemizedlist> + +<!-- TODO: Make this a table --> + +<para +>Упаковка сообщений различных типов показана в таблице ниже: </para> + +<informaltable> +<tgroup cols="3"> +<thead> +<row> +<entry +>Тип</entry> +<entry +>Процедура упаковки</entry> +<entry +>Результат</entry> +</row> +</thead> + +<tbody> +<row> +<entry +><type +>void</type +></entry> +<entry +>в поток ничего не записывается</entry> +<entry +></entry> +</row> + +<row> +<entry +><type +>long</type +></entry> +<entry +>занимает четыре байта, и самый важный из них - первый; например, число 10001025 (0x989a81) будет упаковано так:</entry> +<entry +><literal +>0x00 0x98 0x9a 0x81</literal +></entry> +</row> + +<row> +<entry +><type +>enum</type +></entry> +<entry +><para +>см. <type +>long</type +></para +></entry> +<entry +></entry> +</row> + +<row> +<entry +><type +>byte</type +></entry> +<entry +><para +>занимает один байт; например, число 0x42 будет упаковано так:</para +></entry> +<entry +><literal +>0x42</literal +></entry> +</row> + +<row> +<entry +><type +>string</type +></entry> +<entry +><para +>см. <type +>long</type +>; отличия: содержит длину строки и последовательность символов, которая обязательно оканчивается нулевым байтом (он включён в длину)</para> +<important> +<para +>длина строки должна включать последний нулевой байт!</para> +</important> +<para +>например, <quote +>hello</quote +> упаковывается так:</para +></entry> +<entry +><literal +>0x00 0x00 0x00 0x06 0x68 0x65 0x6c 0x6c 0x6f 0x00</literal +></entry> +</row> + +<row> +<entry +><type +>boolean</type +></entry> +<entry +><para +>см. байт; содержит 0, если <returnvalue +>false</returnvalue +>, и 1 если <returnvalue +>true</returnvalue +>; значение <returnvalue +>true</returnvalue +> выглядит так:</para +></entry> +<entry +><literal +>0x01</literal +></entry> +</row> + +<row> +<entry +><type +>float</type +></entry> +<entry +><para +>упаковывается в соответствии с четырёхбайтовым представлением IEEE754 -подробнее об этом можно узнать здесь: <ulink url="http://twister.ou.edu/workshop.docs/common-tools/ numerical_comp_guide/ncg_math.doc.html" +> http://twister.ou.edu/workshop.docs/common-tools/numerical_comp_guide/ncg_math.doc.html</ulink +> и здесь: <ulink url="http://java.sun.com/docs/books/vmspec/2nd-edition/html/Overview.doc.html" +>http://java.sun.com/docs/books/vmspec/2nd-edition/html/Overview.doc.html</ulink +>; например, значение 2.15 будет выглядеть так:</para +></entry> +<entry +><literal +>0x9a 0x99 0x09 0x40</literal +></entry> +</row> + +<row> +<entry +><type +>struct</type +></entry> +<entry +><para +>используется содержимое структуры; для этого не нужны дополнительные префиксы или суффиксы; например, структура </para> +<programlisting +>struct test { + string name; // это "hello" + long value; // это 10001025 (0x989a81) +}; +</programlisting> +<para +>будет упакована так:</para +></entry> +<entry> +<literallayout +>0x00 0x00 0x00 0x06 0x68 0x65 0x6c 0x6c +0x6f 0x00 0x00 0x98 0x9a 0x81 +</literallayout +></entry> +</row> + +<row> +<entry +><type +>последовательность</type +></entry> +<entry +><para +>последовательность располагается так: количество элементов и сами элементы друг за другом</para> +<para +>поэтому последовательность а из 3 элементов типа long, с a[0] = 0x12345678, a[1] = 0x01 и [2] = 0x42 будет упакована так:</para +></entry> +<entry> +<literallayout +>0x00 0x00 0x00 0x03 0x12 0x34 0x56 0x78 +0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x42 +</literallayout> +</entry> +</row> +</tbody> +</tgroup> +</informaltable> + +<para +>При обращении к простому типу используется его имя. У структур и перечисляемых типов есть собственные имена. Последовательности являются указателями на *<replaceable +>обычные типы</replaceable +>, поэтому обращение к последовательности элементов типа long будет таким: <quote +>*long</quote +>, а к последовательности структур Header: <quote +>*Header</quote +>. </para> + +</sect2> + +<sect2 id="mcop-protocol-messages"> +<title +>Сообщения</title> + +<para +>Формат заголовка сообщения &MCOP; определяется такой структурой: </para> + +<programlisting +>struct Header { + long magic; // значение 0x4d434f50: MCOP + long messageLength; + long messageType; +}; +</programlisting> + +<para +>Возможные типы сообщений: </para> + +<programlisting +>mcopServerHello = 1 + mcopClientHello = 2 + mcopAuthAccept = 3 + mcopInvocation = 4 + mcopReturn = 5 + mcopOnewayInvocation = 6 +</programlisting> + +<para +>Несколько замечаний о сообщениях &MCOP;: </para> + + +<itemizedlist> +<listitem> +<para +>Каждое сообщение начинается с заголовка. </para> +</listitem> + +<listitem> +<para +>Некоторые сообщения должны отбрасываться сервером, если процесс аутентификации ещё не пройден. </para> +</listitem> + +<listitem> +<para +>После получения заголовка, можно получать всё сообщение целиком без просмотра его содержимого. </para> +</listitem> +</itemizedlist> + +<para +>Значение messageLength в заголовке в некоторых случаях бывает лишним. </para> + +<para +>Однако это простой (и быстрый) способ обработки неблокового сообщения. С его помощью сообщения могут быть получены в фоновом режиме. Если одновременно установлено несколько соединений, они будут параллельными. Вам не нужно будет проверять содержимое всего сообщения (чтобы узнать, когда оно закончится), нужен только заголовок. Это упрощает кодирование. </para> + +<para +>После получения сообщения оно может быть распаковано и обработано за один проход, без рассматривания случаев, когда получены не все данные (это гарантирует messageLength). </para> + +</sect2> + +<sect2 id="mcop-protocol-invocations"> +<title +>Вызовы</title> + +<para +>Для вызова удалённого метода нужно послать структуру, приведённую ниже, в теле сообщения &MCOP; с messageType = 1 (mcopInvocation): </para> + +<programlisting +>struct Invocation { + long objectID; + long methodID; + long requestID; +}; +</programlisting> + +<para +>после этого параметры передаются как структура, т.е. если вы вызываете string concat(string s1, string s2), отправьте такую структуру: </para> + +<programlisting +>struct InvocationBody { + string s1; + string s2; +}; +</programlisting> + + +<para +>Если нужен метод однонаправленный - т.е. асинхронный без возвращения значения - это был он. Иначе вы получите сообщение с messageType = 2 (mcopReturn) </para> + +<programlisting +>struct ReturnCode { + long requestID; + <resulttype> result; +}; +</programlisting> + + +<para +>где <resulttype> - это тип результата. Вы можете написать только requestID, если тип метода был void. </para> + +<para +>Таким образом, concat(string s1, string s2) вернёт код </para> + +<programlisting +>struct ReturnCode { + long requestID; + string result; +}; +</programlisting> + +</sect2> + +<sect2 id="mcop-protocol-inspecting"> +<title +>Изучение интерфейсов</title> + +<para +>Чтобы вызвать объект, нужно знать, какие методы можно использовать во время работы с ним. Значения 0, 1, 2, и 3 methodID определены для конкретных задач: </para> + +<programlisting +>long _lookupMethod(MethodDef methodDef); // methodID всегда 0 +string _interfaceName(); // methodID всегда 1 +InterfaceDef _queryInterface(string name); // methodID всегда 2 +TypeDef _queryType(string name); // methodID всегда 3 +</programlisting> + +<para +>чтобы это прочесть, необходима сруктура </para> + +<programlisting +>struct MethodDef { + string methodName; + string type; + long flags; // установить в 0 (необходимо для потоков) + sequence<ParamDef> signature; +}; + +struct ParamDef { + string name; + long typeCode; +}; +</programlisting> + +<para +>в полях параметров содержатся компоненты, определяющие типы параметров. Тип возвращаемого значения зависит от типа MethodDef. </para> + +<para +>Строго говоря, только методы <methodname +>_lookupMethod()</methodname +> и <methodname +>_interfaceName()</methodname +> разные для всех объектов, а <methodname +>_queryInterface()</methodname +> и <methodname +>_queryType()</methodname +> всегда одинаковы. </para> + +<para +>Что же такое methodID? Если вы вызываете метод, нужно передавать его номер, т.к. цифры в запросе &MCOP; обрабатываются гораздо быстрее строк. </para> + +<para +>Итак, как же получить номер метода? Зная его подпись - MethodDef (в которой содержится имя, тип и информация о параметрах) - вы можете передать её в _lookupMethod объекта, вызывающего метод. Так как _lookupMethod настроен на methodID 0, проблем с этим не будет. </para> + +<para +>Если же вы не знаете подписи, с помощью _interfaceName, _queryInterface и _queryType можно узнать, какие методы поддерживаются. </para> +</sect2> + +<sect2 id="mcop-protocol-typedefs"> +<title +>Определения типов</title> + +<para +>Определённые пользователем типы данных описаны с помощью структуры <structname +>TypeDef</structname +>: </para> + +<programlisting +>struct TypeComponent { + string type; + string name; +}; + +struct TypeDef { + string name; + + sequence<TypeComponent> contents; +}; +</programlisting> + +</sect2> +</sect1> + +<sect1 id="why-not-dcop"> +<title +>Почему &arts; не использует &DCOP;</title> + +<para +>В связи с тем, что в &kde; отказались от <acronym +>CORBA</acronym +> полностью и используют вместо него &DCOP;, обычно возникает вопрос, почему это не делается в &arts;. Тем не менее в <classname +>KApplication</classname +> есть хорошая поддержка &DCOP; для интеграции с libICE. </para> + +<para +>Возможно, многие захотят спросить, зачем нужен &MCOP;, если есть &DCOP;, поэтому скажу сразу. Поймите меня правильно, я не хочу сказать, что <quote +>&DCOP; - это плохо</quote +>. Я просто хочу сказать, что <quote +>&DCOP; не подходит &arts;</quote +> (хотя это хорошее решение для других задач). </para> + +<para +>Во-первых, нужно понять, для чего был написан &DCOP;. Созданный за два дня на встрече &kde;-2, он должен был быть как можно более простым, <quote +>легковесным</quote +> протоколом связи. При разработке были упущены все сколько-нибудь сложные вопросы, например, подробное описание, как упаковывать типы данных. </para> + +<para +>Хотя в &DCOP; не важны некоторые вещи (например, как нужно посылать строку, чтобы обеспечить прозрачность сети?) - они необходимы. Поэтому всё, чего не может делать &DCOP;, добавлено в &Qt;. В основном, это управление типами (с помощью оператора сериализации &Qt;). </para> + +<para +>&DCOP; замечательно работает, позволяя приложениям &kde; отправлять простые сообщения вроде <quote +>открыть в окне http://www.kde.org</quote +> или <quote +>данные о конфигурации изменились</quote +>. Однако в &arts; важно другое. </para> + +<para +>Идея заключается в том, что небольшие модули &arts; должны общаться с помощью таких структур данных, как <quote +>события midi</quote +> и<quote +>указатели на позицию в песне</quote +>. </para> + +<para +>Это сложные типы данных, которые должны пересылаться различными объектами как потоки или параметры. В &MCOP; есть возможность определить сложные типы через простые (похожие на структуры или массивы в C++). В &DCOP; программист должен сам писать, например, классы и проверять, что они правильно сериализуются (к примеру, поддержка потокового оператора в &Qt;). </para> + +<para +>Но в этом случае они будут доступны только для C++, так как нельзя разработать язык, который будет распознавать все типы модулей (которые не будут самоописывающимися). </para> + +<para +>Почти та же проблема с интерфейсами. В объектах &DCOP; информация о связях, иерархии наследования и т. д. закрыта. И если вам нужно написать приложение, которое должно показывать, <quote +>какие атрибуты есть у этого объекта</quote +>, у вас ничего не получится. </para> + + +<para +>Матиас (Matthias) рассказал, что есть специальная функция <quote +>functions</quote +> для каждого объекта, которая определяет, какие методы поддерживает объект. Она пропускает информацию об атрибутах (параметрах), потоках и наследовании. </para> + +<para +>Это серьёзно нарушает целостность таких приложений, как &arts-builder;. Но не следует забывать, что &DCOP; разрабатывался не как объектная модель (как &Qt; с <application +>moc</application +> и подобными), не как что-то вроде <acronym +>CORBA</acronym +>, а только для обеспечения связи между приложениями. </para> + +<para +>Отличие &MCOP; состоит в том, что он должен работать с потоками, которые являются основным способом сообщения между объектами. В <acronym +>CORBA</acronym +>-версии &arts; приходилось разделять <quote +>объекты SynthModule</quote +>, которые создавали потоки, и <quote +>интерфейс <acronym +>CORBA</acronym +></quote +>. </para> + +<para +>Основную часть кода занимала реализация взаимодействия <quote +>объектов SynthModule</quote +> и <quote +>интерфейсов <acronym +>CORBA</acronym +> </quote +>, она должна быть органичной, но не была, т.к. в <acronym +>CORBA</acronym +> не было даже понятия "поток". Взгляните на этот код (что-то вроде <filename +>simplesoundserver_impl.cc </filename +>). Он выглядит намного лучше! Потоки можно объявлять в интерфейсах модулей, а их использование выглядит естественно. </para> + +<para +>Этого нельзя отрицать. Одной из причин написания &MCOP;, была скорость. Вот несколько объяснений, почему &MCOP; будет работать быстрее &DCOP;. </para> + + +<para +>Вызов в &MCOP; содержит заголовок из 6 чисел типа long: </para> + +<itemizedlist> +<listitem +><para +>magic <quote +>MCOP</quote +>;</para +></listitem> +<listitem +><para +>тип сообщения (вызов);</para +></listitem> +<listitem +><para +>размер запроса в байтах;</para +></listitem> +<listitem +><para +>идентификатор запроса;</para +></listitem> +<listitem +><para +>идентификатор цели;</para +></listitem> +<listitem +><para +>илентификатор метода.</para +></listitem> +</itemizedlist> + +<para +>После этого последуют параметры. Заметьте, что распаковка при этом очень быстра. Вы можете использовать стандартные функции для распаковки объекта или метода, что сводит сложность кодирования к минимуму. </para> + +<para +>Сравним этот вариант с &DCOP;. В нём будет по крайней мере: </para> + +<itemizedlist> +<listitem +><para +>строка целевого объекта вроде <quote +>myCalculator</quote +>;</para +></listitem +> +<listitem +><para +>строка <quote +>addNumber(int,int)</quote +>, указывающая метод;</para +></listitem> +<listitem +><para +>информация о протоколе, добавленная libICE, а также другие дополнительные данные, которых я не знаю.</para +></listitem> +</itemizedlist> + +<para +>Распаковывать все это гораздо сложнее, ведь вам придется обрабатывать строки, искать функции и т. д. </para> + +<para +>В &DCOP; все запросы проходят через сервер (<application +>DCOPServer</application +>). Это значит, что синхронный вызов выглядит так: </para> + +<itemizedlist> +<listitem> +<para +>Задача-клиент посылает вызов. </para> +</listitem> + +<listitem> +<para +><application +>DCOPserver</application +> (посредник) получает его, решает, куда нужно отправить запрос, и отправляет его <quote +>настоящему</quote +> серверу. </para> +</listitem +> + +<listitem> +<para +>Этот сервер получает вызов, выполняет запрос и отправляет результат. </para> +</listitem> + +<listitem> +<para +><application +>DCOPserver</application +> (посредник) получает результат и... посылает его клиенту. </para> +</listitem> + +<listitem> +<para +>Клиент декодирует ответ. </para> +</listitem> +</itemizedlist> + +<para +>В &MCOP; тот же вызов выглядит по-другому: </para> + +<itemizedlist> +<listitem> +<para +>Задача-клиент посылает вызов. </para> +</listitem> + +<listitem> +<para +>Этот сервер получает вызов, выполняет запрос и отправляет результат. </para> +</listitem> + +<listitem> +<para +>Клиент декодирует ответ. </para> +</listitem> +</itemizedlist> + +<para +>Если и то, и другое было выполнено правильно, всё равно передача запроса через &MCOP; в два раза быстрее. И всё же есть причины выбрать&DCOP;: если запущено 20 приложений, все они связаны друг с другом, в &DCOP; нужно 20 соединения, а в &MCOP; 200. Однако в работе с мультимедиа это не распространено. </para> + +<para +>Я пробовал сравнивать &MCOP; и &DCOP;, делая вызов как сложение двух чисел, подправив testdcop. Но не смог получить точные результаты для &DCOP;. Метод вызывался в том же процессе, где был вызов &DCOP;, и я не знал, как избавиться от одного сообщения об отладке, пришлось перенаправить выход. </para> + +<para +>В тесте использовлись один объект и одна функция. С увеличением количества объектов и функций результаты &DCOP; ухудшаются, а у &MCOP; остаются прежними. Кроме того, задача <application +>dcopserver</application +> не была подключена к другим приложениям. Возможно, в этом случае, работа маршрутизатора была бы медленнее. </para> + +<para +>Наконец, полученный результат: чуть больше 2000 вызовов в секунду у &DCOP; и чуть больше 8000 вызовов в секунду у &MCOP;. В четыре раза. И я знаю, что это не предел &MCOP; (для сравнения: mico в <acronym +>CORBA</acronym +> совершает 1000-1500 вызовов в секунду). </para> + +<para +>Если вы хотите более точных данных, напишите небольшие приложения для сравнения с &DCOP; и пришлите их мне. </para> + +<para +>В <acronym +>CORBA</acronym +> была возможность использовать однажды вызванный объект как <quote +>отдельный серверный процесс</quote +> или как <quote +>библиотеку</quote +>. Можно было использовать один и тот же код, а <acronym +>CORBA</acronym +> уже сам решала, что делать. Насколько я знаю, в &DCOP; такое невозможно. </para> + +<para +>С другой стороны, в &MCOP; это обязательно должно быть. Поэтому вы можете прослушивать какой-то эффект в &artsd;, а при этом редактор звуковых файлов использует его в своем пространстве задачи. </para> + +<para +>Если &DCOP; - это способ передачи данных между приложениями, то &MCOP; - связь внутри приложений. Это особенно важно для потоков мультимедиа, т.к. можно запускать несколько объектов параллельно. </para> + +<para +>Хотя &MCOP; ещё этого не поддерживает, возможность помечать приоритет остаётся. Например, так: <quote +>это событие &MIDI; намного важнее этого вызова</quote +>. Или так: <quote +>должно быть получено вовремя</quote +>. </para> + +<para +>С другой стороны, в &MCOP; может быть интергрирована передача потоков, объединённая с <acronym +>QoS</acronym +>. Если это будет сделано, &MCOP; не будет работать медленнее, чем <acronym +>TCP</acronym +>, но будет проще в использовании. </para> + +<para +>Нет необходимости писать связующее ПО для мультимедиа в &Qt;, иначе оно станет &Qt;-зависимым. </para> + +<para +>Насколько я знаю, тип пересылаемых по &DCOP; данных не важен, поэтому &DCOP; может использоваться отдельно от &Qt;. Вот пример повседневного использования в &kde;: пользователи посылают типы <classname +>QString</classname +>, <classname +>QRect</classname +>, <classname +>QPixmap</classname +>, <classname +>QCString</classname +>, ... Они используют сериализацию &Qt;. Поэтому если кто-то решит включить поддержку &DCOP;, например, в GNOME, он не сможет использовать типы <classname +>QString</classname +> и др. и ему придётся эмулировать работу &Qt; с потоками или посылать строку, пиксельные изображения и типы rect, что, конечно, никуда не годится. </para> + +<para +>&arts; не привязан к &kde;, он может работать как с &Qt; и X11, так и без них, и даже без &Linux; (я знаю людей, у которых он нормально работает в распространённых коммерческих ОС). </para> + +<para +>Я считаю, что компоненты, написанные не для &GUI;, не должны от него зависеть, чтобы была возможность более широкого их распространения среди разработчиков. </para> + +<para +>Я понимаю, что использование двух протоколов <acronym +>IPC</acronym +> неудобно, однако переход на &DCOP; я не считаю выходом. При желании можно попытаться объединить два протокола. Можно даже научить &MCOP; говорить на <acronym +>IIOP</acronym +>, получится <acronym +>CORBA</acronym +> <acronym +>ORB</acronym +> ;). </para> + +<para +>Мы разговаривали с Матиасом Этрихом (Matthias Ettrich) о будущем двух протоколов и нашли множество путей их развития. Например, &MCOP; мог бы осуществлять передачу сообщений в &DCOP;, это бы сблизило протоколы. </para> + +<para +>Поэтому возможными решениями могли бы быть: </para> + +<itemizedlist> +<listitem> +<para +>Создание шлюза &MCOP; - &DCOP;, который осуществлял бы взаимодействие этих протоколов. Если вы заинтересовались, спешу сообщить, что рабочий прототип уже существует. </para> +</listitem> + +<listitem> +<para +>Интеграция в &MCOP; всего, чего пользователи ожидают от &DCOP;. Попытаться работать только с ним. Кто-нибудь может добавить в &MCOP;<quote +>сервер-посредник</quote +> :) </para> +</listitem> + +<listitem> +<para +>Сделать основой &DCOP; не libICE, а &MCOP; и постепенно их объединять. </para> +</listitem> +</itemizedlist> + +<para +>А можно использовать протоколы по их предназначению (оно ведь разное у каждого) и не пытаться их объединить. </para> + +</sect1> +</chapter> diff --git a/tde-i18n-ru/docs/tdemultimedia/artsbuilder/midi.docbook b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/midi.docbook new file mode 100644 index 00000000000..651330d574e --- /dev/null +++ b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/midi.docbook @@ -0,0 +1,526 @@ +<!-- <?xml version="1.0" ?> +<!DOCTYPE chapter PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN" "dtd/kdex.dtd"> +To validate or process this file as a standalone document, uncomment +this prolog. Be sure to comment it out again when you are done --> + +<chapter id="midi"> +<title +>&MIDI;</title> + +<sect1 id="midi-overview"> +<title +>Обзор</title> + +<!-- what-to-say-here: aRts has three roles + * moving midi events around between applications + * abstracting the hardware + * synthesizer --> + +<para +>Поддержка &MIDI; в &arts; обширна. Она разрешает <emphasis +>обмен</emphasis +> данными между приложениями, генерирующими &MIDI;-события, и получателями этих событий. К примеру, если вы используете синтезатор и сэмплер, поддерживающие &arts;, вы можете посылать &MIDI;-события от синтезатора сэмплеру. </para> + +<para +>С другой стороны, &arts; позволяет приложениям <emphasis +>взаимодействовать с оборудованием</emphasis +>. Если какое-то приложение (сэмплер, к примеру) работает с &arts;, оно сможет получать &MIDI;-события со внешней &MIDI;-клавиатуры. </para> + +<para +>Наконец, &arts; - это замечательный <emphasis +>модульный синтезатор</emphasis +>. Он был разработан именно для использования в таком качестве. То есть вы можете создавать инструменты из небольших модулей, используя artsbuilder. В &arts; есть и модули-сэмплеры. Таким образом, &arts; - это мощный сэмплер и синтезатор, он состоит из отдельных модулей, поэтому его легко расширять. </para> +</sect1> + +<sect1 id="midi-manager"> +<title +>Менеджер &MIDI;</title> +<!-- what-to-say-here: + * how to use artscontrol - view midimanager + * what does autorestore do? (not yet implemented - so not yet documented) --> + +<para +>Главный компонент &arts; - это Менеджер &MIDI;, он знает, как связаны приложения и как должна пересылаться информация. Чтобы посмотреть, что он делает или настроить его, выберите <menuchoice +><guilabel +>Вид</guilabel +><guilabel +>Показать midi-менеджера</guilabel +> </menuchoice +> в меню &artscontrol;. </para> + +<para +>Слева вы видите <guilabel +>Входные каналы MIDI</guilabel +>. Там перечислены все объекты, которые могут производить &MIDI;-события: внешний &MIDI;-порт, к которому подключена &MIDI;-клавиатура, синтезатор и т. д. Справа - <guilabel +>Выходные каналы MIDI</guilabel +>. Это, к примеру, приложение-сэмплер или внешний &MIDI;-порт, к которому подключен сэмплер. Новые приложения, например, синтезатор, регистрируются сами, поэтому список будет меняться. </para> + +<para +>Входные и выходные каналы можно соединить, щелкнув по соответствующим объектам и нажав на кнопку <guilabel +>Соединиться</guilabel +> внизу. Аналогично работает кнопка <guilabel +>Разъединиться</guilabel +>. Если два устройства подключены, между ними будет нарисована линия. Заметьте, что к одному входу можно подключить несколько выходов и наборот. </para> + +<para +>Приложения (вроде синтезатора Brahms) будут автоматически добавляться в список при запуске и удаляться при выходе. Однако вы можете самостоятельно добавить их в меню <guilabel +>Добавить</guilabel +>: </para> + +<variablelist> +<varlistentry> +<term +><guimenuitem +>Порт MIDI на эту систему (OSS)</guimenuitem +></term> +<listitem> +<para +>Создаст новый объект &arts;, который будет посылать данные на внешний MIDI-порт. </para> + +<para +>Внешние MIDI-порты могут как получать, так и посылать данные. Эта операция позволяет создаьт входной и выходной каналы MIDI. Для работы вам необходима <acronym +>OSS</acronym +> (или <acronym +>OSS</acronym +>/Free, она идёт с ядром &Linux;) или драйвер звуковой карты <acronym +>ALSA</acronym +>. Имя устройства обычно такое: <filename class="devicefile" +>/dev/midi</filename +> или <filename class="devicefile" +>/dev/midi00</filename +>. </para> + +<para +>Однако, если у вас более одного MIDI-устройства или установлен драйвер, имитирующий MIDI-устройство, выбор становится шире. Чтобы получить дополнительную информацию о ваших портах MIDI, запустите &kcontrolcenter; и зайдите в <menuchoice +><guilabel +>Информация</guilabel +> <guilabel +>Звук</guilabel +></menuchoice +>. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><guimenuitem +>Синтезированный вывод MIDI aRts</guimenuitem +></term> +<listitem> +<para +>Будет создан новый &MIDI;-выход синтезатора &arts;. Если вы выберете соответствующий пункт в меню, откроется диалоговое окно, в котором можно будет указать инструмент. Вы можете создавать новые инструменты, используя artsbuilder. Все файлы с расширением <literal role="extension" +>.arts</literal +> и именем, начинающимся с <filename +>instrument_</filename +>, будут отображены здесь. </para> +</listitem> +</varlistentry> +</variablelist> + +</sect1> + +<sect1 id="brahms"> +<title +>Использование &arts; и Brahms</title> + +<para +>Запустить &brahms; достаточно просто, вам нужна версия &brahms; для &kde; 2.1,которую можно найти в модуле <literal +>kmusic</literal +><acronym +>CVS</acronym +>. Также есть информация о том, где взять &brahms; на <ulink url="http://www.arts-project.org/" +>Домашней странице aRts</ulink +> в разделе <quote +>Download</quote +>. </para> + +<para +>При запуске вызывается Менеджер &MIDI;. Если вы хотите получить синтезатор, просто добавьте &MIDI;-инструмент в <menuchoice +><guilabel +>Добавить</guilabel +><guilabel +>Синтезированный вывод MIDI aRts</guilabel +></menuchoice +>. </para> + +<para +>Выберите инструмент (к примеру, <guilabel +>organ2</guilabel +>). Подключите его, нажав на кнопку <guilabel +>Соединиться</guilabel +>. Теперь вы можете писать музыку в &brahms;, а играть её будет &arts;. </para> + +<para +>Очень удобно держать открытым окно &artscontrol;, чтобы контролировать громкость (качество звука теряется, когда уровень звука выше определённых границ). Сейчас вы можете начать работу над новой композицией в &arts;, а когда закончите, сможете опубликовать её на aRts-project.org ;-). </para> + +<!-- TODO: how to do more than one instrument in Brahms (hm, not implemented + yet, not documented yet), how to use samples, mapping and so on. These + things need to be implemented, too. --> + +</sect1> + +<sect1 id="midisend"> +<title +>midisend</title> + +<para +><command +>midisend</command +> - это небольшое приложение, позволяющее отправлять &MIDI;-события из оболочки. Оно регистрирует себя как клиента. Самый простой способ использования: <screen +><prompt +>%</prompt +> <userinput +><command +>midisend</command +> <option +>-f</option +> <parameter +> <replaceable +>/dev/midi00</replaceable +></parameter +></userinput +> </screen +>, результат будет почти таким же, как если бы вы добавили &MIDI;-порт в &artscontrol; (<quote +>почти</quote +> потому, что <command +>midisend</command +> только отправляет события). Разница в том, что <command +>midisend</command +> гораздо проще запустить на разных компьютерах. </para> + +<para +>Также есть возможность с помощью <command +>midisend</command +> посылать данные из <filename class="devicefile" +>stdin</filename +>, которые могут использоваться для переноса данных из приложений, не поддерживающих &arts;, в &arts;. К примеру: <screen +><prompt +>%</prompt +> <userinput +><command +><replaceable +> applicationwhichproducesmidieventsonstdout</replaceable +></command +> | <command +>midisend</command +> <option +>-f</option +> <option +><replaceable +>-</replaceable +></option +></userinput +></screen> +<!-- TODO: document all options --> +</para> + +</sect1> + +<sect1 id="midi-creating-instruments"> +<title +>Создание инструментов</title> + +<para +>В &arts; синтезатор работает следующим образом: со входных портов структур получаются данные о частоте, громкости и устанавливается параметр нажатия клавиши. Затем структура синтезирует необходимую ноту заданной громкости, а также считывает параметр нажатия (где 1 значит, что клавиша ещё нажата, а 0 - отпущена). </para> + +<para +>Когда &MIDI;-событие получено, &arts; создаёт новую структуру для необходимых нот и передаёт ей параметры. После завершения процесса структура удаляется. </para> + +<para +>Чтобы создать и использовать структуру, необходимо сделать следущее: </para> + +<itemizedlist> +<listitem> +<para +>Самый удобный способ запуска: открыть <filename +>template_Instrument.arts</filename +> в &arts-builder;. </para> + +<para +>Это может быть сделано так: <menuchoice +><guimenu +>Файл</guimenu +><guimenuitem +>Открыть пример</guimenuitem +></menuchoice +> и выбрать <guimenuitem +>template_Instrument</guimenuitem +>. Таким образом будет создана пустая структура с необходимыми параметрами, которую вам нужно только <quote +>заполнить</quote +>. </para> +</listitem> + +<listitem> +<para +>Для обработки параметра нажатия удобно использовать Synth_ENVELOPE_ADSR или, если идёт воспроизведение wav с ударными, просто игнорируйте его. </para> +</listitem> + +<listitem> +<para +>Структура должна отображать, нужна ли она. Если done содержит значение <returnvalue +>1</returnvalue +>, &arts; удаляет структуру. Для удобства оболочка ADSR предоставляет такой параметр, вам нужно только подключить его к выходу структуры. </para> +</listitem> + +<listitem> +<para +>Вам нужно переименовать структуру, начиная имя файла с <filename +>instrument_</filename +>, к примеру, <filename +>instrument_piano.arts</filename +>, и сохранить её в каталоге <filename class="directory" +>$<envar +>HOME</envar +>/arts/structures</filename +> (это стандартный каталог для сохранения файлов). </para> +</listitem> + +<listitem> +<para +>Теперь, когда вы её сохранили, вы сможете использовать её в &artscontrol; в Менеджере &MIDI;.</para> +</listitem> + +<listitem> +<para +>И, конечно, ваша структура должна уметь проигрывать сгенерированные аудиоданные, которые будут потом воспроизводиться Менеджером аудио (это можно увидеть в &artscontrol;) и которые вы сможете обработать с помощью эффектов. </para> +</listitem> +</itemizedlist> + +<para +>Хороший способ поучиться созданию инструментов - это открыть уже существующие в <menuchoice +><guilabel +>Файл</guilabel +><guilabel +>Открыть пример</guilabel +> </menuchoice +> и посмотреть, как они работают ;) </para> +</sect1> + +<sect1 id="mapped-instruments"> +<title +>Карты инструментов</title> + +<para +>Карты инструментов - это такие инструменты, звучание которых меняется в зависимости от высоты, программы, канала или скорости. К примеру, вы можете создать пианино с пятью октавами, и оно будет звучать намного лучше, чем просто один сэмпл. </para> + +<para +>Также вы можете создать карту ударных инструментов, тогда при нажатии на определённую клавишу будет проигрываться соответствующий сэмпл. </para> + +<para +>Очень удобно помещать разные звуки на одну карту, но с разными программами. В этом случае вы сможете использовать синтезатор, внешнюю &MIDI;-клавиатуру или что-нибудь ещё для переключения звуков. </para> + +<para +>Хороший пример этого инструмента - <filename +>arts_all</filename +>, в котором собраны все инструменты &arts; на одной карте. С ним вам нужно только настроить его в &artscontrol; на использование <quote +>инструмента</quote +>, а потом писать музыку на синтезаторе, не думая об &arts;. Понадобился другой звук? Поменяйте программу синтезатора. </para> + +<para +>Создать такую карту очень просто. Нужно создать текстовый файл и записать туда правила, которые выглядят примерно так: </para> + +<programlisting +>ON <replaceable +>[ условия ...]</replaceable +> DO structure=<replaceable +>какая-то структура</replaceable +>.arts +</programlisting> + +<para +>Условий может быть и более одного: </para> + +<variablelist> + +<varlistentry> +<term +><option +>pitch</option +></term> + +<listitem> +<para +>Высота проигрываемой ноты. Это нужно, если вы хотите создать зависящий от высоты инструмент. В одном из наших примеров для разных октав пианино используются разные сэмплы с этим условием. Вы можете задать одну высоту: <userinput +><option +>pitch</option +>=<parameter +>62</parameter +></userinput +> или диапазон: <userinput +><option +>pitch</option +>=<parameter +>60</parameter +>-<parameter +>72</parameter +></userinput +>. Допустимый диапазон: от <parameter +>0</parameter +> до <parameter +>127</parameter +>. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><option +>program</option +></term> +<listitem> +<para +>Если на канал, который использует какая-то программа, посылается нота, программа становится активной. Обычно <quote +>инструмент</quote +> можно указать в настройках программы, которых может быть и несколько: <userinput +><option +>program </option +>=<parameter +>3</parameter +></userinput +> или <userinput +> <option +>program</option +>=<parameter +>3</parameter +>-<parameter +>6 </parameter +></userinput +>. Диапазон номеров программ: от <parameter +>0</parameter +> до <parameter +>127</parameter +>. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><option +>channel</option +></term> +<listitem> +<para +>Канал, на который посылается нота. Возможен выбор одного или нескольких каналов: <userinput +><option +>channel</option +>=<parameter +>0</parameter +></userinput +> или <userinput +><option +>channel</option +>=<parameter +>0</parameter +>-<parameter +>8</parameter +></userinput +>. Допустимые каналы: от <parameter +>0</parameter +> до <parameter +>15</parameter +>. </para> +</listitem> + +</varlistentry> +<varlistentry> +<term +><option +>velocity</option +></term> +<listitem> +<para +>Это скорость (громкость) ноты. Вы можете выбрать одну (кому она только нужна?) или диапазон: <userinput +><option +>velocity</option +>=<parameter +>127</parameter +></userinput +> или <userinput +><option +>velocity</option +>=<parameter +>64</parameter +>-<parameter +>127</parameter +></userinput +>. Диапазон: от <parameter +>0</parameter +> до <parameter +>127</parameter +>. </para> +</listitem> +</varlistentry> +</variablelist> + +<para +>Законченный пример карты (взят из текущего <filename +>instrument_arts_all.arts-map</filename +>): </para> + +<programlisting +>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 +</programlisting> + +<para +>Как вы видите, структура выбирается в зависимости от программы. В программе 11 задана <quote +>карта ударных</quote +> (с двумя входами), которая будет играть <quote +>deepdrum</quote +> C-5 (высота=60) и <quote +>chirpdrum</quote +> C#5 (высота=61). </para> + +<para +>Чтобы карты появлялись в &artscontrol; как вариант инструмента, их нужно вызвать так: <filename +>instrument_<replaceable +>что-то</replaceable +>.arts-map</filename +> и перенести в домашний каталог <filename class="directory" +>$<envar +>HOME</envar +>/arts/structures</filename +>или в каталог &kde; <filename class="directory" +>$<envar +>KDEDIR</envar +>/usr/local/kde/share/apps/artsbuilder/examples</filename +>. Используемые картами структуры могут иметь как полный путь, так и путь до каталога карты. </para> + +<para +>Расширение карты arts_all или даже создание законченной общей &MIDI;-карты для &arts; поможет сделать &arts; проще. Подумайте над опубликованием своих интересных инструментов, которые мы можем включить в следущую версию &arts;. </para> +</sect1> + +<!-- TODO: Maybe helpful + * using an external keyboard + * loopback midi device + +<sect1 id="quick-start"> +<title +>Quick Start</title> + +</sect1> +<sect1 id="internal-details"> +<title +>More Internal Details</title> + +</sect1> + +<sect1 id="other-considerations"> +<title +>Other Considerations</title> + +</sect1> +--> + +</chapter> diff --git a/tde-i18n-ru/docs/tdemultimedia/artsbuilder/midiintro.docbook b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/midiintro.docbook new file mode 100644 index 00000000000..d04b17d15b8 --- /dev/null +++ b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/midiintro.docbook @@ -0,0 +1,16 @@ +<!-- <?xml version="1.0" ?> +<!DOCTYPE appendix PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN" "dtd/kdex.dtd"> +To validate or process this file as a standalone document, uncomment +this prolog. Be sure to comment it out again when you are done --> + +<appendix id="midi-introduction"> + +<title +>Введение в <acronym +>MIDI</acronym +></title> + +<para +>В процессе написания </para> + +</appendix> diff --git a/tde-i18n-ru/docs/tdemultimedia/artsbuilder/modules.docbook b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/modules.docbook new file mode 100644 index 00000000000..91ca8d9a3e8 --- /dev/null +++ b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/modules.docbook @@ -0,0 +1,1321 @@ +<!-- <?xml version="1.0" ?> +<!DOCTYPE chapter PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN" "dtd/kdex.dtd"> +To validate or process this file as a standalone document, uncomment +this prolog. Be sure to comment it out again when you are done --> + +<chapter id="arts-modules"> +<title +>Модули &arts;</title> + + <sect1 id="modules-introduction"> +<title +>Введение</title> + +<para +>В этой главе рассказывается обо всех стандартных модулях &arts;. Это, пожалуй, самое мощное средство &arts;. Модули можно объединять в структуры, получая эффекты и инструменты. </para> + +<para +>Есть два вида модулей. Модули-синтезаторы используются для создания различных эффектов, инструментов, микшеров и приложений с помощью потоков мультимедиа-данных. С помощью визуальных модулей вы сможете создать графический интерфейс управления встроенными в синтезаторы звуковыми структурами. </para> + +</sect1> + +<sect1 id="synth-modules-reference"> +<title +>Описание модулей-синтезаторов</title> + + +<sect2 id="mcat-synth-arithmetic-mixing"> +<title +>Арифметика + Микширование</title> + + + +<sect3 id="mref-synth-add-sect"> +<title +>Synth_ADD</title> +<anchor id="mref-synth-add"/> + +<mediaobject> +<imageobject> +<imagedata fileref="images/Synth_ADD.png" format="PNG"/></imageobject> +<textobject +><phrase +>Synth_ADD</phrase +></textobject> +</mediaobject> + +<para +>Добавляет два сигнала. </para> + +</sect3> + +<sect3 id="mref-synth-mul-sect"> +<title +>Synth_MUL</title> +<anchor id="mref-synth-mul"/> + +<mediaobject> +<imageobject> +<imagedata fileref="images/Synth_MUL.png" format="PNG"/></imageobject> +<textobject +><phrase +>Synth_MUL</phrase +></textobject> +</mediaobject> + +<para +>Умножает сигнал на коэффициент. Его можно использовать для понижения сигнала (0 < коэффициент < 1), повышения (коэффициент> 1) или инвертирования (коэффициент < 0). Заметьте, что коэффициентом может быть не только константа, но и сигнал (например, оболочка или настоящий сигнал). </para> + +</sect3> + +<sect3 id="mref-synth-div-sect"> +<title +>Synth_DIV</title> +<anchor id="mref-synth-div"/> + +<mediaobject> +<imageobject> +<imagedata fileref="images/Synth_DIV.png" format="PNG"/></imageobject> +<textobject +><phrase +>Synth_DIV</phrase +></textobject> +</mediaobject> + +<para +>Делит значение сигнала на какую-либо величину, например, на другой сигнал. Зайдайте invalue1 равным 1, и получите обратную величину для invalue2 в outvalue. Конечно, значение invalue2 не должно обращаться в 0, иначе возникнет ошибка деления на ноль. </para> + +</sect3> + +<sect3 id="mref-synth-multi-add-sect"> +<title +>Synth_MULTI_ADD</title> +<anchor id="mref-synth-multi-add"/> + +<mediaobject> +<imageobject> +<imagedata fileref="images/Synth_MULTI_ADD.png" + format="PNG"/></imageobject> +<textobject +><phrase +>Synth_MULTI_ADD</phrase +></textobject> +</mediaobject> + +<para +>Добавляет случайное количество сигналов. Если вам нужно объединить сигналы четырёх осцилляторов, можете подключить их выходы к одному модулю Synth_MULTI_ADD. Это будет эффективнее использования трёх модулей Synth_ADD. </para> + +</sect3> + +<sect3 id="mref-synth-xfade-sect"> +<title +>Synth_XFADE</title> +<anchor id="mref-synth-xfade"/> + +<mediaobject> +<imageobject +><imagedata fileref="images/Synth_XFADE.png" format="PNG"/> +</imageobject> +<textobject +><phrase +>Synth_XFADE</phrase +></textobject> +</mediaobject> + +<para +>Приглушает два сигнала. Если входное значение -1, будет слышен только левый сигнал, 1 - правый, 0 - оба сигнала слышны с одинаковой громкостью. </para> + +<para +>С помощью этого модуля вы сможете убедиться, что сигнал находится в определённом диапазоне. Если у вас было два сигнала из диапазона -1..1, после обработки этим модулем они будут такими же. </para> +</sect3> + +<sect3 id="mref-synth-autopanner-sect"> +<title +>Synth_AUTOPANNER</title> +<anchor id="mref-synth-autopanner"/> + +<para +>Эфект, обратный crossfader. Преобразовывает моносигнал в стерео. Используется автоматически для разделения между правым и левым выходами. Стандартным приложением может быть гитара или другой сольный инструмент. </para> + +<para +>Соедините генератор низких частот, источник синусоидального или пилообразного сигнала с inlfo и задайте частоту между 0,1 и 5 Гц для создания обычного эффекта или больше, если хотите создать особый. </para> + +</sect3> + +</sect2> + +<sect2 id="mcat-synth-busses"> +<title +>Шины</title> + +<sect3 id="mref-synth-bus-uplink-sect"> +<title +>Synth_BUS_UPLINK</title> +<anchor id="mref-synth-bus-uplink"/> + +<mediaobject> +<imageobject +><imagedata fileref="images/Synth_BUS_UPLINK.png" + format="PNG"/> +</imageobject> +<textobject +><phrase +>Synth_BUS_UPLINK</phrase +></textobject> +</mediaobject> + +<para +>Входная связь шины. Передает сигналы левого и правого каналов, также имя шины, куда передаются данные. Комбинированный сигнал со всех входных связей с таким именем будет появляться на выходной связи этой шины. </para> +</sect3> + +<sect3 id="mref-synth-bus-downlink-sect"> +<title +>Synth_BUS_DOWNLINK</title> +<anchor id="mref-synth-bus-downlink"/> + +<mediaobject> +<imageobject> +<imagedata fileref="images/Synth_BUS_DOWNLINK.png" + format="PNG"/></imageobject> +<textobject +><phrase +>Synth_BUS_DOWNLINK</phrase +></textobject> +</mediaobject> + +<para +>Получает (суммирует) все данные с конкретной шины (с именем, указанным в портешины). </para> +</sect3> + +</sect2> + +<!-- TODO AFTER KDE2.1: move freeverb into delays, and rename category to + Delays & reverbs --> + +<sect2 id="mcat-synth-delays"> +<title +>Задержки</title> + + + +<sect3 id="mref-synth-delay-sect"> +<title +>Synth_DELAY</title> +<anchor id="mref-synth-delay"/> + +<mediaobject> +<imageobject +><imagedata fileref="images/Synth_DELAY.png" + format="PNG"/></imageobject +></mediaobject> + +<para +>Задерживает входящий сигнал на определённое время. Оно задаётся в секундах и не должно превышать максимальное значние задержки. </para> + +<para +>Этот тип задержек <emphasis +>не следует использовать</emphasis +> в структурах обратной связи, т. к. это непостоянная задержка: вы можете изменить её длительность во время исполнения программы и даже дать ей значение 0. Но в структурах обратной связи собственный вывод используется для вычисления следующих сэмплов, поэтому задержка, которую можно свести к 0 во время синтеза, может привести к нежелательным последствиям. </para> + +<para +>Используйте CDELAY в этих настройках. Можно сочетать небольшую постоянную задержку (0,001 секунд) с переменной. </para> + +<para +>Также вы можете комбинировать CDELAY и DELAY, чтобы получить переменную длину задержки с минимальным значением в петле обратной связи. Просто убедитесь, что используете CDELAY. </para> + +</sect3> + +<sect3 id="mref-synth-cdelay-sect"> +<title +>Synth_CDELAY</title> +<anchor id="mref-synth-cdelay"/> + +<mediaobject> +<imageobject +><imagedata fileref="images/Synth_CDELAY.png" +format="PNG"/></imageobject> +<textobject +><phrase +>Synth_CDELAY</phrase +></textobject> +</mediaobject> + +<para +>Задерживает входной сигнал на определённое время. Значение должно быть больше 0 для задержки в 0 секунд и дольше. Оно постоянно во время выполнения программы, т.е. не может быть изменено. </para> + +<para +>Сокращает время обработки засчёт того, что не выполняет интерполяцию. Полезен в рекурсивных структурах. Описание смотрите ниже (Synth_DELAY). </para> + +</sect3> + +</sect2> + +<sect2 id="mcat-synth-envelopes"> +<title +>Оболочки</title> + + + +<sect3 id="mref-synth-envelope-adsr-sect"> +<title +>Synth_ENVELOPE_ADSR</title> +<anchor id="mref-synth-envelope-adsr"/> + +<mediaobject> +<imageobject +><imagedata fileref="images/Synth_ENVELOPE_ADSR.png" + format="PNG"/></imageobject> +<textobject +><phrase +>Synth_ENVELOPE_ADSR</phrase +></textobject> +</mediaobject> + +<para +>Это классическая <acronym +>ADSR</acronym +>-оболочка; подразумевается, что вы укажете следущее: </para> + +<variablelist> +<varlistentry> +<term +>active</term> +<listitem> +<para +>Нажата ли нота в данный момент. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +>invalue</term> +<listitem> +<para +>Входной сигнал. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +>attack</term> +<listitem> +<para +>Время между нажатием клавиши и достижением максимальной амплитуды сигнала (в секундах). </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +>decay</term> +<listitem> +<para +>Время, необходимое для того, чтобы сигнал с максимальной амплитудой вернулся к некоторому постоянному уровню (в секундах). </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +>sustain</term> +<listitem> +<para +>Уровень сигнала до того, как пользователь отпустит клавишу. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +>release</term> +<listitem> +<para +>Время (в секундах) до полного затухания сигнала после того, как пользователь отпустил клавишу. </para> +</listitem> +</varlistentry> +</variablelist> + +<para +>На выходе получится сигнал с заданными параметрами. Если оболочка <acronym +>ASDR</acronym +> закончила работу, установится значение 1. Этоможно ипользовать для обеспечения <quote +>готовых</quote +> выходных данных инструмента (при этом после завершения фазы &MIDI; маршрутизатор разрушит объект). </para> + +</sect3> + +<sect3 id="mref-synth-pscale-sect"> +<title +>Synth_PSCALE</title> +<anchor id="mref-synth-pscale"/> + +<mediaobject> +<imageobject +><imagedata fileref="images/Synth_PSCALE.png" +format="PNG"/></imageobject> +<textobject +><phrase +>Synth_PSCALE</phrase +></textobject> +</mediaobject> + +<para +>Модуль Synth_PSCALE управляет уровнем громкости пропускаемого сигнала: от 0 (тихо) до 1 (исходная громкость) и опять до 0. Точка наивысшего уровня громкости может меняться в зависимости от pos (получается из Synth_SEQUENCE). </para> + +<para +>Пример: установка пика в 0,1 приведёт к тому, что после проигрыша 10% ноты звук достигнет максимума и начнет затухать. </para> +</sect3> + +</sect2> + +<sect2 id="mcat-synth-effects"> +<title +>Эффекты</title> + +<sect3 id="mref-synth-freeverb-sect"> +<title +>Synth_FREEVERB</title> +<anchor id="mref-synth-freeverb"/> + +<mediaobject> +<imageobject +><imagedata fileref="images/Synth_FREEVERB.png" +format="PNG"/></imageobject> +<textobject +><phrase +>Synth_FREEVERB</phrase +></textobject> +</mediaobject> + +<para +>Это эффект реверберации. В этой реализации сигнал проходит через модуль и к нему будет добавлен его же эхо. </para> + +<note> +<para +>Это значит, что им можно пользоваться и в StereoEffectStack. </para> +</note> + +<para +>Входной сигнал должен быть подключен к (inleft, inright), а выходной будет (outleft, outright). </para> + +<para +>Параметры: </para> + +<variablelist> +<varlistentry> +<term +>roomsize</term> +<listitem> +<para +>Размер помещения, в котором эмулируется эхо (диапазон: 0..1, где 1 - самый большой размер помещения). </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +>damp</term> +<listitem> +<para +>Настраивает фильтр поглощения высоких частот (диапазон: 0..1, при значении 1 частоты сильно поглощаются). </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +>wet</term> +<listitem> +<para +>Величина сигнала эха (часть исходного сигнала, которая должна быть преобразована фильтрами). </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +>dry</term> +<listitem> +<para +>Количество звука, для которого создается обычное эхо (или задержка) вместо реверберации (диапазон: 0..1). </para> +<!-- TODO: do some measurements to show that this documentation -is- correct, +I am not sure if it is echo, or really pure (non-delayed), or multiple delay +or whatever --> +</listitem> +</varlistentry> + +<varlistentry> +<term +>width</term> +<listitem> +<para +>Величина, добавляемая алгоритмом, чтобы сделать звук более <quote +>широким</quote +> в пространстве (диапазон: 0..1). </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +>mode</term> +<listitem> +<para +>В значении 0 происходит обычная обработка. </para> +</listitem> +</varlistentry> +</variablelist> + +</sect3> + +<sect3 id="mref-synth-tremolo-sect"> +<title +>Synth_TREMOLO</title> +<anchor id="mref-synth-tremolo"/> + +<mediaobject +><imageobject +><imagedata fileref="images/Synth_TREMOLO.png" +format="PNG"/></imageobject> +<textobject +><phrase +>Synth_TREMOLO</phrase +></textobject> +</mediaobject> + +<para +>Тремоло модулирует амплитуду в соответствии с волной генератора нихких частот. Вы, наверное, использовали бы синусоидальную волну, но... Зачем же ограничивать себя? Вы получите сильный эффект, пробивающийся сквозь все остальные звуки из-за его широкого динамического диапазона. Тремоло - один из любимых эффектов гитаристов, хотя сейчас он не столь популярен, как это было в 1960-х. </para> + +<para +>Сейчас вычисляется как invalue + abs(inlfo). Возможно, будет лучше использовать такую формулу: invalue * (1+inlfo*depth), где depth - параметр со значением из диапазона 0..1. </para> + +</sect3> +<sect3 id="mref-synth-fx-cflanger-sect"> +<title +>Synth_FX_CFLANGER</title> +<anchor id="mref-synth-fx-cflanger"/> + +<mediaobject +><imageobject +><imagedata +fileref="images/Synth_FX_CFLANGER.png" format="PNG"/></imageobject> +<textobject +><phrase +>Synth_FX_CFLANGER</phrase +></textobject> +</mediaobject> + +<para +>Эффект задержки, непостоянной во времени, <quote +>флэнджер</quote +>. </para> + +<para +>Порты модуля:</para> + +<variablelist> +<varlistentry> +<term +>invalue</term> +<listitem> +<para +>Обрабатываемый сигнал. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +>lfo</term> +<listitem> +<para +>Предпочтительно синусоидальная волна, определяющая время задержки: (-1 .. 1). </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +>mintime</term> +<listitem> +<para +>Минимальное значение задержки внутри модуля (в миллисекундах). Рекомендуемые значения: попробуйте 1 мс. Используйте значения < 1000 мс. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +>maxtime</term> +<listitem> +<para +>Максимальное значение задержки внутри модуля (в миллисекундах). Рекомендуемые значения: попробуйте 5 мс. Используйте значения < 1000 мс. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +>outvalue</term> +<listitem> +<para +>Полученный сигнал. Для достижения эффекта нужно его смешать с исходным сигналом. </para> +</listitem> +</varlistentry> +</variablelist> + +<tip> +<para +>Вы можете сделать это основой эффекта <quote +>хора</quote +>. </para> +</tip> + +</sect3> + +</sect2> + +<sect2 id="mcat-synth-filters"> +<title +>Фильтры</title> + +<sect3 id="mref-synth-pitch-shift-sect"> +<title +>Synth_PITCH_SHIFT</title> +<anchor id="mref-synth-pitch-shift"/> + +<mediaobject +><imageobject +><imagedata +fileref="images/Synth_PITCH_SHIFT.png" format="PNG"/></imageobject> +<textobject +><phrase +>Synth_PITCH_SHIFT</phrase +></textobject> +</mediaobject> + +<para +>Этот эффект сдвига высоты звука меняет частоту входного сигнала, оставляя скорость прежней. Примером приложения,. использующего этот эффект, может быть такое, которое меняет высоту голоса при записи (и проигрывании). </para> + +<para +>Параметр <emphasis +>speed</emphasis +> - это относительная скорость проигрывания сигнала. Поэтому если дать ему значение 2, звук будет выше в два раза (например, входная частота 440 Hz, а на выходе будет 880 Hz). </para> + +<para +>Параметр <emphasis +>frequency</emphasis +> используется для внутреннего переключения между разными частями сигнала. В зависимости от настроек звук будет боле или менее реалистичным. Советую начать со значений 5 или 10. </para> + +</sect3> + +<sect3 id="mref-synth-shelve-cutoff-sect"> +<title +>Synth_SHELVE_CUTOFF</title> +<anchor id="mref-synth-shelve-cutoff"/> + +<mediaobject +><imageobject +><imagedata +fileref="images/Synth_SHELVE_CUTOFF.png" format="PNG"/></imageobject> +<textobject +><phrase +>Synth_SHELVE_CUTOFF</phrase +></textobject> +</mediaobject> + +<para +>Фильтрует все частоты выше заданного порога. </para> + +</sect3> + +<sect3 id="mref-synth-brickwall-limiter-sect"> +<title +>Synth_BRICKWALL_LIMITER</title> +<anchor id="mref-synth-brickwall-limiter"/> + +<mediaobject +><imageobject +><imagedata +fileref="images/Synth_BRICKWALL_LIMITER.png" + format="PNG"/></imageobject> +<textobject +><phrase +>Synth_BRICKWALL_LIMITER</phrase +></textobject> +</mediaobject> + +<para +>Этот модуль обрезает сигнал таким образом, чтобы он попадал в диапазон [-1;1]. Но он не предотвращает искажение, возникающее при обрезании громкого сигнала. Его можно использовать как эффект (например, чтобы получить слегка обрезанную синусоидальную волну). Звук будет не таким резким, если пропустить сигнал через фильтр низких частот. </para> +</sect3> + +<sect3 id="mref-synth-std-equalizer-sect"> +<title +>Synth_STD_EQUALIZER</title> +<anchor id="mref-synth-std-equalizer"/> + +<mediaobject +><imageobject +><imagedata +fileref="images/Synth_STD_EQUALIZER.png" format="PNG"/></imageobject> +<textobject +><phrase +>Synth_STD_EQUALIZER</phrase +></textobject> +</mediaobject> + +<para +>Это неплохой эквалайзер. Его параметры: </para> + +<variablelist> +<varlistentry> +<term +>invalue, outvalue</term> +<listitem> +<para +>Сигнал, который фильтрует эквалайзер. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +>low</term> +<listitem> +<para +>Как следует менять низкие частоты. Значение задаётся в децибелах. 0 значит, что их не нужно менять, -6 - понижены на 6 дб, +6 - повышены. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +>mid</term> +<listitem> +<para +>Как следует менять средние частоты. Значение задаётся в децибелах. (см. low). </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +>high</term> +<listitem> +<para +>Как следует менять высокие частоты. Значение задаётся в децибелах. (см. low). </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +>frequency</term> +<listitem> +<para +>Это средняя частота эквалайзера в Гц, средние частоты находятся вокруг этого спктра, нижние - ниже, верхние - выше. Заметьте, что частота не может быть выше половины частоты дискретизации, обычно это 22050 Гц, и ниже 1 Гц. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +>q</term> +<listitem> +<para +>Показывает, насколько широк спектр средних частот. Это должно быть положительное число > 0. Значение 1 вполне приемлемо. С увеличением значения спектр становится уже, а с уменьшением - шире. </para> +</listitem> +</varlistentry> +</variablelist> + +</sect3> + +<sect3 id="mref-synth-rc-sect"> +<title +>Synth_RC</title> +<anchor id="mref-synth-rc"/> + +<mediaobject +><imageobject +><imagedata fileref="images/Synth_RC.png" +format="PNG"/></imageobject> +<textobject +><phrase +>Synth_RC</phrase +></textobject> +</mediaobject> + +<para +>Фильтр всех частот вокруг некоторого пикового значения. Не рекомендуется указывать среднуюю частоту (она все равно не будет обрезана). Этот код довольно старый и, возможно, будет заменен новым фильтром, который будет принимать в качестве параметров понятные значения, а не странные f и b. </para> + +<para +>Попробуйте b=5, f=5 или b=10, f=10 или b=15, f=15. </para> + +</sect3> + +<sect3 id="mref-synth-moog-vcf-sect"> +<title +>Synth_MOOG_VCF</title> +<anchor id="mref-synth-moog-vcf"/> + +<mediaobject +><imageobject +><imagedata fileref="images/Synth_MOOG_VCF.png" +format="PNG"/></imageobject> +<textobject +><phrase +>Synth_MOOG_VCF</phrase +></textobject> +</mediaobject> + +<para +>Отфильтровывает все частоты, выходящие за предел (фильтр четырехполюсника 24 дб, который фильтрует -24db в октаве выше пороговой частоты), есть возможность настроить резонанс фильтрации, 0 - без резонанса, 4 - собственные колебания. </para> + +</sect3> + +</sect2> + +<sect2 id="mcat-synth-midi-sequencing"> +<title +>Midi + Синтезирование</title> + +<sect3 id="mref-synth-midi-test-sect"> +<title +>Synth_MIDI_TEST</title> +<anchor id="mref-synth-midi-test"/> + +<mediaobject +><imageobject +><imagedata fileref="images/Synth_MIDI_TEST.png" +format="PNG"/></imageobject> +<textobject +><phrase +>Synth_MIDI_TEST</phrase +></textobject> +</mediaobject> + +<para +>Загружает структуру инструмента из файла и регистрирует себя как midi-выход с &arts; &MIDI;-менеджером. Ноты, посланные на выход, будут создавать звучание инструмента. </para> + +<note> +<para +>Настраивать это в &artscontrol; удобнее, чем вручную в &arts-builder;. </para> +</note> + +</sect3> + +<sect3 id="mref-synth-sequence-sect"> +<title +>Synth_SEQUENCE</title> +<anchor id="mref-synth-sequence"/> + +<mediaobject +><imageobject +><imagedata fileref="images/Synth_SEQUENCE.png" +format="PNG"/></imageobject +></mediaobject> + +<para +>Будет циклически проигрывать последовательность нот. Ноты разделены точками с запятой. Например: <literal +>A-3;C-4;E-4;C-4;</literal +>. Скорость дана в секундах на ноту, поэтому если вы хотите получить 120 уд./мин., нужно будет указать 0,5 секунд/нота, т. к. 60 секунд/0,5 секунд на ноту = 120 уд./мин. </para> + +<para +>Вы можете задать относительную длительность ноты, поставив двоеточие после ноты и записав длительность. <literal +>A-3:2;C-4:0.5;D-4:0.5;E-4;</literal +>. </para> + +<para +>С помощью модуля Synth_SEQUENCE можно получить дополнительную информацию о проигрываемой ноте. 0 значит, что она только что началась, 1 - закончилась. Эту информацию использует Synth_PSCALE (см. ниже). </para> +</sect3> + +<sect3 id="mref-synth-sequence-freq-sect"> +<title +>Synth_SEQUENCE_FREQ</title> +<anchor id="mref-synth-sequence-freq"/> + +<mediaobject +><imageobject +><imagedata fileref="images/Synth_SEQUENCE_FREQ.png" +format="PNG"/></imageobject +></mediaobject> + +<para +>Этот модуль работает как Synth_SEQUENCE, только вам нужно указывать не имена нот, а частоты. </para> + +</sect3> + +</sect2> + +<sect2 id="mcat-synth-samples"> +<title +>Сэмплы</title> + +<sect3 id="mref-synth-play-wav-sect"> +<title +>Synth_PLAY_WAV</title> +<anchor id="mref-synth-play-wav"/> + +<mediaobject> +<imageobject +><imagedata fileref="images/Synth_PLAY_WAV.png" +format="PNG"/></imageobject> +<textobject +><phrase +>Synth_PLAY_WAV</phrase +></textobject> +</mediaobject> + +<para +>Проигрывает файлы <literal role="extension" +>wav</literal +>., если у вас есть libaudiofile. Как только модуль будет создан, воспроизведение файла начнётся. </para> + +<para +>И остановится, как только он закончится. Параметр скорости может использоваться, чтобы задать скорость воспроизведения, 1,0 - обычная скорость (записи). </para> +<!-- TODO: KDE2.2: check that this really works together in instruments with +the done parameter things ;) --> +</sect3> + +</sect2> + +<sect2 id="mcat-synth-soundio"> +<title +>Ввод и вывод звука</title> + +<sect3 id="mref-synth-play-sect"> +<title +>Synth_PLAY</title> +<anchor id="mref-synth-play"/> + +<mediaobject> +<imageobject +><imagedata fileref="images/Synth_PLAY.png" +format="PNG"/></imageobject> +<textobject +><phrase +>Synth_PLAY</phrase +></textobject> +</mediaobject> + +<important> +<para +>Вам, скорее всего, не понадобится этот модуль, если, конечно, вы не пишете отдельное приложение. В &artsd; уже включен такой модуль, а создать ещё один Synth_PLAY не удастся. </para> +</important> + +<para +>Модуль Synth_PLAY передаст сигнал на звуковую карту. Левый и правый каналы должны содержать <emphasis +>нормализованный</emphasis +> выход для каналов. Если он не будет помещаться в диапазон -1..1, он будет обрезан. </para> + +<para +>Как уже говорилось, может быть только один Synth_PLAY, который будет обращаться к звуковой карте напрямую. Смешивать аудиопотоки перед воспроизведением можно с помощью шин. Модуль Synth_AMAN_PLAY может использоваться для получения выходного сигнала в &artsd;. </para> + +<para +>Заметьте, что Synth_PLAY осуществляет синхронизацию всей структуры. Это значит, что: нет Synth_PLAY = нет синхронизации = нет звука. Один объект Synth_PLAY нужен обязательно. </para> + +</sect3> + +<sect3 id="mref-synth-record-sect"> +<title +>Synth_RECORD</title> +<anchor id="mref-synth-record"/> + +<mediaobject +><imageobject +><imagedata fileref="images/Synth_RECORD.png" +format="PNG"/></imageobject> +<textobject +><phrase +>Synth_RECORD</phrase +></textobject> +</mediaobject> + +<important> +<para +>Вам, скорее всего, не понадобится этот модуль, если, конечно, вы не пишете отдельное приложение. В &artsd; уже включен такой модуль, а создать ещё один Synth_RECORD не удастся. </para> +</important> + +<para +>Synth_RECORD записывает сигнал, поступающий со звуковой карты. Левый и правый каналы содержат вход для каналов (между -1 и 1). </para> + +<para +>Как уже говорилось, может быть только один модуль Synth_RECORD, который будет иметь прямой доступ к звуковой карте. Для записи сигнала в нескольких местах используются шины. Synth_AMAN_RECORD получает что-то вроде входа в artsd. Чтобы это работало, &artsd; должен быть запущен со <emphasis +>использованием двустороннего режима</emphasis +>. </para> +</sect3> + +<sect3 id="mref-synth-aman-play-sect"> +<title +>Synth_AMAN_PLAY</title> +<anchor id="mref-synth-aman-play"/> + +<mediaobject +><imageobject +><imagedata fileref="images/Synth_AMAN_PLAY.png" +format="PNG"/></imageobject> +<textobject +><phrase +>Synth_AMAN_PLAY</phrase +></textobject> +</mediaobject> + +<para +>Модуль Synth_AMAN_PLAY выводит сигнал. Очень хорошо, если сигнал нормализован (между -1 и 1), но это необязательно. </para> + +<para +>С помощью аудиоменеджера модуль определяет, где должен проигрываться сигнал. Управлять аудиоменеджером можно в &artscontrol;. Чтобы управление тало понятнее, назовите как-нибудь сигнал. Это можно сделать, задав <emphasis +>title</emphasis +>. Ещё одна удобная черта: аудиоменеджер хранит информацию о том, где был воспроизведён сигнал в прошлый раз. Конечно, для этого нужно как-то различать сигналы. Поэтому <emphasis +>autoRestoreID</emphasis +> должен иметь уникальное значение. </para> +</sect3> + +<sect3 id="mref-synth-aman-record-sect"> +<title +>Synth_AMAN_RECORD</title> +<anchor id="mref-synth-aman-record"/> + +<mediaobject +><imageobject +><imagedata +fileref="images/Synth_AMAN_RECORD.png" format="PNG"/></imageobject> +<textobject +><phrase +>Synth_AMAN_RECORD</phrase +></textobject> +</mediaobject> + +<para +>Synth_AMAN_RECORD записывает сигнал со внешнего источника (напрмер, микрофона) в &artsd;. Выходной сигнал будет нормальзован (между -1 и 1). </para> + +<para +>С помощью аудиоменеджера модуль определяет, где должен проигрываться сигнал. Управлять аудиоменеджером можно в &artscontrol;. Чтобы управление тало понятнее, назовите как-нибудь сигнал. Это можно сделать, задав <emphasis +>title</emphasis +>. Ещё одна удобная черта: аудиоменеджер хранит информацию о том, где был воспроизведён сигнал в прошлый раз. Конечно, для этого нужно как-то различать сигналы. Поэтому <emphasis +>autoRestoreID</emphasis +> должен иметь уникальное значение. </para> +</sect3> + +<sect3 id="mref-synth-capture-sect"> +<title +>Synth_CAPTURE</title> +<anchor id="mref-synth-capture"/> + +<mediaobject +><imageobject +><imagedata fileref="images/Synth_CAPTURE.png" +format="PNG"/></imageobject> +<textobject +><phrase +>Synth_CAPTURE</phrase +></textobject> +</mediaobject> + +<para +>Synth_CAPTURE запишет аудио сигнал в файл .wav на диск. Именем файла всегда будет <filename +>/tmp/mcop-<replaceable +>имя_пользователя</replaceable +>/capture.wav</filename +> </para> +</sect3> + +</sect2> + +<sect2 id="mcat-synth-tests"> +<title +>Тесты</title> + +<sect3 id="mref-synth-nil-sect"> +<title +>Synth_NIL</title> +<anchor id="mref-synth-nil"/> + +<mediaobject +><imageobject +><imagedata fileref="images/Synth_NIL.png" +format="PNG"/></imageobject> +<textobject +><phrase +>Synth_NIL</phrase +></textobject> +</mediaobject> + +<para +>Ничего не делает, но нужен в тестах. </para> + +</sect3> + +<sect3 id="mref-synth-debug-sect"> +<title +>Synth_DEBUG</title> +<anchor id="mref-synth-debug"/> + +<mediaobject +><imageobject +><imagedata fileref="images/Synth_DEBUG.png" +format="PNG"/></imageobject> +<textobject +><phrase +>Synth_DEBUG</phrase +></textobject> +</mediaobject> + +<para +>Можно использовать для устранения ошибок. Выводит значение сигнала (invalue) через определённый интервал (1 секунда) и указанный вами комментарий. Таким образом вы сможете отследить сигналы и их диапазоны. </para> +</sect3> + +<sect3 id="mref-synth-midi-debug-sect"> +<title +>Synth_MIDI_DEBUG</title> +<anchor id="mref-synth-midi-debug"/> + +<mediaobject +><imageobject +><imagedata fileref="images/Synth_MIDI_DEBUG.png" +format="PNG"/></imageobject> +<textobject +><phrase +>Synth_MIDI_DEBUG</phrase +></textobject> +</mediaobject> + +<para +>Нужен, чтобы посмотреть, как действительно события &MIDI; попадают в &arts;. </para> + +<para +>Во время работы MIDI_DEBUG &artsserver; будет печатать такие строки: </para> + +<screen +><computeroutput +>201 100753.837585 on 0 42 127</computeroutput +></screen> + +<screen +><computeroutput +>202 101323.128355 off 0 42</computeroutput +></screen> + +<para +>В первой строке говорится, что прошло 00753 мс (это 100 секунд) с момента запуска MIDI_DEBUG, на канал 0 поступило событие &MIDI;. Его громкость 127 (максимально возможная). В следущей строке событие освобождается. </para> +</sect3> + +<sect3 id="mref-synth-data-sect"> +<title +>Synth_DATA</title> +<anchor id="mref-synth-data"/> + +<mediaobject +><imageobject +><imagedata fileref="images/Synth_DATA.png" +format="PNG"/></imageobject> +<textobject +><phrase +>Synth_DATA</phrase +></textobject> +</mediaobject> + +<para +>Создаёт сигнал с постоянным числом. </para> +<!-- TODO: this doesn't really belong in test, does it? --> +</sect3> +</sect2> + +<sect2 id="mcat-synth-osc-mod"> +<title +>Осцилляция и модуляция</title> + +<sect3 id="mref-synth-frequency-sect"> +<title +>Synth_FREQUENCY</title> +<anchor id="mref-synth-frequency"/> + +<mediaobject +><imageobject +><imagedata fileref="images/Synth_FREQUENCY.png" +format="PNG"/></imageobject> +<textobject +><phrase +>Synth_FREQUENCY</phrase +></textobject> +</mediaobject> + +<para +>Осцилляторам &arts; нужна не частота как входной параметр, а положение в волне. Она должна быть между 0 и 1 для отображения стандартного объекта Synth_WAVE_SIN в диапазон 0..2*Пи. Synth_FREQUENCY используется для генерации колебательных значений из частоты. </para> +</sect3> + +<sect3 id="mref-synth-fm-source-sect"> +<title +>Synth_FM_SOURCE</title> +<anchor id="mref-synth-fm-source"/> + +<mediaobject +><imageobject +><imagedata fileref="images/Synth_FM_SOURCE.png" +format="PNG"/></imageobject> +<textobject +><phrase +>Synth_FM_SOURCE</phrase +></textobject> +</mediaobject> + +<para +>Используется для модуляции частоты. Укажите частоту ввода; на ввод модулятора подайте сигнал. Уровень модуляции задайте как, скажем, 0.3. Частота будет модулироваться. Просто попробуйте. </para> + +<para +>Замечательно работает вместе с осцилляорами Synth_WAVE_SIN. </para> +</sect3> + +</sect2> + +<sect2 id="mcat-synth-waveforms"> +<title +>Формы сигналов</title> + +<sect3 id="mref-synth-wave-sin-sect"> +<title +>Synth_WAVE_SIN</title> +<anchor id="mref-synth-wave-sin"/> + +<mediaobject +><imageobject +><imagedata fileref="images/Synth_WAVE_SIN.png" +format="PNG"/></imageobject> +<textobject +><phrase +>Synth_WAVE_SIN</phrase +></textobject> +</mediaobject> + +<para +>Синусоидальный сигнал. На вход ставится pos signal из Synth_FREQUENCY или Synth_FM_SOURCE, а на выходе получается синусоидальный сигнал. Pos signal указывает на позицию в волне, а диапазон 0..1 отображается в 0..2*Пи. </para> + +</sect3> + +<sect3 id="mref-synth-wave-tri-sect"> +<title +>Synth_WAVE_TRI</title> +<anchor id="mref-synth-wave-tri"/> + +<mediaobject +><imageobject +><imagedata fileref="images/Synth_WAVE_TRI.png" +format="PNG"/></imageobject> +<textobject +><phrase +>Synth_WAVE_TRI</phrase +></textobject> +</mediaobject> + +<para +>Треугольный сигнал. На вход подается pos signal из Synth_FREQUENCY или Synth_FM_SOURCE, а на выходе получаются треугольные колебания. Pos signal указывает на позицию в волне, а диапазон 0..1 отображается в 0..2*Пи. Будьте внимательны, входной сигнал <emphasis +>должен</emphasis +>быть в диапазоне 0..1, чтобы получить какой-нибудь результат. </para> +</sect3> + +<sect3 id="mref-synth-noise-sect"> +<title +>Synth_NOISE</title> +<anchor id="mref-synth-noise"/> + +<mediaobject +><imageobject +><imagedata fileref="images/Synth_NOISE.png" +format="PNG"/></imageobject> +<textobject +><phrase +>Synth_NOISE</phrase +></textobject> +</mediaobject> + +<para +>Генератор шумов. Генерирует случайный сигнал в пределах -1 и 1. </para> + +</sect3> + +<sect3 id="mref-synth-wave-square-sect"> +<title +>Synth_WAVE_SQUARE</title> +<anchor id="mref-synth-wave-square"/> + +<mediaobject +><imageobject +><imagedata +fileref="images/Synth_WAVE_SQUARE.png" format="PNG"/></imageobject> +<textobject +><phrase +>Synth_WAVE_SQUARE</phrase +></textobject> +</mediaobject> + +<para +>Прямоугольный сигнал. На вход ставится pos signal из Synth_FREQUENCY или Synth_FM_SOURCE, а на выходе получаются прямоугольные колебания. Pos signal указывает на позицию в волне, а диапазон 0..1 отображается в 0..2*Пи. Будьте внимательны, входной сигнал <emphasis +>должен</emphasis +> быть в диапазоне 0..1, чтобы получить какой-нибудь результат. </para> +</sect3> + +<sect3 id="mref-synth-wave-softsaw-sect"> +<title +>Synth_WAVE_SOFTSAW</title> +<anchor id="mref-synth-wave-softsaw"/> + +<mediaobject +><imageobject +><imagedata +fileref="images/Synth_WAVE_SOFTSAW.png" format="PNG"/></imageobject> +<textobject +><phrase +>Synth_WAVE_SOFTSAW</phrase +></textobject> +</mediaobject> + +<para +>Пилообразный сигнал, похожий на сигнал Synth_WAVE_TRI. На вход ставится pos signal из Synth_FREQUENCY или Synth_FM_SOURCE, а на выходе получаются зубчатые колебания. Pos signal указывает на позицию в волне, а диапазон 0..1 отображается в 0..2*Пи. Будьте внимательны, входной сигнал <emphasis +>должен</emphasis +> быть в диапазоне 0..1, чтобы получить какой-нибудь результат. </para> +</sect3> + +<sect3 id="mref-synth-wave-pulse-sect"> +<title +>Synth_WAVE_PULSE</title> +<anchor id="mref-synth-wave-pulse"/> + +<mediaobject +><imageobject +><imagedata fileref="images/Synth_WAVE_PULSE.png" +format="PNG"/></imageobject> +<textobject +><phrase +>Synth_WAVE_PULSE</phrase +></textobject> +</mediaobject> + +<para +>Импульсные колебания. Очень похожи на прямоугольные сигналы (Synth_WAVE_RECT), но для них можно задать соотношение <emphasis +>dutycycle</emphasis +>. На вход дается pos signal из Synth_FREQUENCY или Synth_FM_SOURCE, а на выходе получаются импульсы. Pos signal указывает на позицию в волне, а диапазон 0..1 отображается в 0..2*Пи. Будьте внимательны, входной сигнал <emphasis +>должен</emphasis +> быть в диапазоне 0..1, чтобы получить какой-нибудь результат. </para> +</sect3> +</sect2> +<sect2 id="mcat-synth-misc"> +<title +>Прочее</title> + +<sect3 id="mref-synth-compressor-sect"> +<title +>Synth_COMPRESSOR</title> +<anchor id="mref-synth-compressor"/> + +<mediaobject> +<imageobject +><imagedata fileref="images/Synth_COMPRESSOR.png" + format="PNG"/></imageobject +></mediaobject> + +<para +>Сокращает динамический диапазон сигнала. Компрессоры полезны, например, для нормализации громкости микрофона. </para> + +<para +>Как только входной сигнал достигает определённого уровня (порога), сигнал сжимается. Это достигается умножением всего, что выше порога на коэффициент - число от 0 до 1. И весь сигнал умножается на выходной коэффициент. </para> + +<para +>Параметры attack и release задерживают начало и конец сжатия. Используйте их, если хотите, например, слышать громкое вступление ударных. Значения параметров задаются в миллисекундах. Со значением 0 может усилиться шум. </para> + +</sect3> +</sect2> +</sect1> + +<sect1 id="visual-modules-reference"> +<title +>Описание визуальных модулей</title> + +<para +>Их описание пока не готово. </para> +</sect1> + +</chapter> diff --git a/tde-i18n-ru/docs/tdemultimedia/artsbuilder/porting.docbook b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/porting.docbook new file mode 100644 index 00000000000..b133390838f --- /dev/null +++ b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/porting.docbook @@ -0,0 +1,52 @@ +<!-- <?xml version="1.0" ?> +<!DOCTYPE chapter PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN" "dtd/kdex.dtd"> +To validate or process this file as a standalone document, uncomment +this prolog. Be sure to comment it out again when you are done --> + +<chapter id="porting"> +<title +>Доработка приложений для их использования с &arts;</title> + +<sect1 id="using-artsdsp"> +<title +>Использование &artsdsp;</title> + +<para +>Программа &artsdsp;, <link linkend="artsdsp" +>описанная выше</link +>, позволяет большинству звуковых приложений, работающих с устройствами напрямую,работать и с &arts;. Приложения, использующие Enlightenment Sound Daemon (<application +>esd</application +>), в большинстве случаев будут работать, если запускать <application +>esd</application +> через &artsdsp;. </para> + +<para +>Это неплохой способ адаптации уже существующих приложений в &kde;. Однако такие приложения не могут использовать все ресурсы &arts;, например, модули или потоки мультимедиа (кроме цифрового звука). Если приложение не просто проигрывает звуковые файлы, есть смысл добавить в приложение поддержку &arts;. </para> + +<para +>Использование &arts; подразумевает, что само приложение может быть не обременено функциональностью: можно использовать &arts;, например, для работы с кодеками разных форматов мультимедиа и управления звуковым оборудованием. </para> + +</sect1> + +<sect1 id="adding-native-arts-support"> +<title +>Добавление полной поддержки &arts;</title> + +<para +>В &arts; есть множество различных <link linkend="arts-apis" +>программынх интерфейсов</link +> (<acronym +>API</acronym +>). Вы можете выбрать любой, в зависимости от типа используемого потока (звук, &MIDI;, &CD; и т. д.), особенностей <acronym +>API</acronym +> и языка, на котором написано приложение. В большинстве случаев основным фактором явлются особенности API. </para> + +<para +>Для обеспечения переносимости на другие платформы приложениям, которые должны работать не только в &kde;, недостаточно &arts;. Использование парадигмы модулей - неплохой способ поддержки различных сред мультимедиа. Документирование (важно особенно для закрытых программ) и открытость <acronym +>API</acronym +> для модулей поможет разработчикам добавлять поддержку модулей &arts;. </para> + +</sect1> + +</chapter> + diff --git a/tde-i18n-ru/docs/tdemultimedia/artsbuilder/references.docbook b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/references.docbook new file mode 100644 index 00000000000..8d93e9fca2c --- /dev/null +++ b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/references.docbook @@ -0,0 +1,61 @@ +<!-- <?xml version="1.0" ?> +<!DOCTYPE chapter PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN" "dtd/kdex.dtd"> +To validate or process this file as a standalone document, uncomment +this prolog. Be sure to comment it out again when you are done --> + +<chapter id="references"> +<title +>Ссылки</title> + +<variablelist> + +<varlistentry> +<term +><ulink +url="http://multimedia.kde.org" +>http://multimedia.kde.org</ulink +></term> +<listitem> +<para +>Самый важный сайт, содержащий информацию о работе с мультимедиа в &kde;. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><ulink +url="http://www.arts-project.org" +>http://www.arts-project.org</ulink +></term> +<listitem> +<para +>Это домашняя страница проекта &arts;. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +>&kde; 2.0 Разработка</term> +<listitem> +<para +>14 глава этой книги посвящена мультимедиа, в том числе &arts;. Прочесть книгу вы можете в напечатанном виде или в интернете с примечаниями на сайте <ulink url="http://www.andamooka.org/" +>http://www.andamooka.org</ulink +>. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term> +<ulink +url="http://sound.condorow.net" +>http://sound.condorow.net</ulink +></term> +<listitem> +<para +>На этом сайте вы найдёте много хороших приложений для прослушивания звуковых файлов, в том числе &MIDI;, для &Linux;. </para> +</listitem> +</varlistentry> + +</variablelist> + +</chapter> diff --git a/tde-i18n-ru/docs/tdemultimedia/artsbuilder/tools.docbook b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/tools.docbook new file mode 100644 index 00000000000..2cdda978057 --- /dev/null +++ b/tde-i18n-ru/docs/tdemultimedia/artsbuilder/tools.docbook @@ -0,0 +1,1003 @@ +<!-- +<?xml version="1.0" ?> +<!DOCTYPE chapter PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN" "dtd/kdex.dtd"> + +To validate or process this file as a standalone document, uncomment +this prolog. Be sure to comment it out again when you are done --> + +<chapter id="arts-tools"> +<title +>Инструменты &arts;</title> + +<para +>Это набор управляющих &arts; модулей. Чтобы пользоваться &arts; эффективно, нужно уметь ими пользоваться. В этом разделе описывается каждый из модулей и параметры их команд. </para> + +<sect1 id="kde-control-center"> +<title +>&kcontrol;</title> + +<para +>Если &arts; запущен в &kde;, &kcontrolcenter; размещает его настройками в категории <guilabel +>Звук</guilabel +>. Вы можете связать звуки с различными событиями менеджера окон и &kde; в категории <menuchoice +><guilabel +>Звук</guilabel +><guilabel +>Системные оповещения</guilabel +></menuchoice +>. О настройках панели управления читайте в справочнике по &kcontrol;. </para> + +</sect1> + +<sect1 id="artsd"> +<title +>&artsd;</title> + +<para +>&artsd; управляет доступом к звуковому оборудованию, это один из сервисов &arts;. Он позволяет разным приложениям одновременно посылать запросы серверу, где они будут накладываться друг на друга и воспроизводиться. Без единого звукового сервера одно приложение, использующее звуковое устройство, будет блокировать запросы остальных. </para> + +<para +>Для работы &arts; нужно, чтобы была запущена только одна копия модуля &artsd;. Если это указано в панели &kcontrol; <guilabel +>Звуковая подсистема</guilabel +>, &artsd; будет запускаться автоматически при входе в систему. </para> + +<para +>Аргументами программы могут быть:</para> + +<!-- LW: FIX THIS --> + +<cmdsynopsis +><command +>artsd</command +> <group choice="opt" +> <option +>-n</option +> <option +>-p</option +> <option +>-N</option +> <option +>-W <replaceable +>n</replaceable +></option +> </group +> <group choice="opt" +> <option +>-a <replaceable +>audiomethod</replaceable +></option +> <option +>-r <replaceable +>sampling rate</replaceable +></option +> <option +>-b <replaceable +>bits</replaceable +></option +> <option +>-d</option +> <option +>-D <replaceable +>devicename</replaceable +></option +> <option +>-F <replaceable +>fragments</replaceable +></option +> <option +>-S <replaceable +>size</replaceable +></option +> <option +>-s <replaceable +>seconds</replaceable +></option +> <option +>-m <replaceable +>appName</replaceable +></option +> </group +> <group choice="opt" +> <option +>-h</option +> <option +>-A</option +> <option +>-v</option +> <option +>-l <replaceable +>level</replaceable +></option +> </group +> </cmdsynopsis> + +<variablelist +><varlistentry> +<term +><option +>-r <replaceable +>частота дискретизации</replaceable +></option +></term> +<listitem> +<para +>Задайте используемую частоту дискретизации.</para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><option +>-h</option +></term> +<listitem> +<para +>Справка по использованию команды.</para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><option +>-n</option +></term> +<listitem> +<para +>Использовать работу в сети.</para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><option +>-p <replaceable +>порт</replaceable +></option> +</term> +<listitem> +<para +>Задать <acronym +>TCP</acronym +> порт (подразумевает указание и <option +>-n</option +>).</para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><option +>-u</option +></term> +<listitem> +<para +>Открытый доступ без аутентификации (опасно).</para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><option +>-d</option +></term> +<listitem> +<para +>Включить режим двустороннего ввода-вывода.</para> +</listitem> +</varlistentry> +<varlistentry> +<term +><option +>-D <replaceable +>имя устройства</replaceable +></option +></term> +<listitem> +<para +>Укажите аудиоустройство (обычно <filename +>/dev/dsp</filename +>).</para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><option +>-F <replaceable +>блоки</replaceable +></option +></term> +<listitem> +<para +>Установите количество блоков.</para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><option +>-S <replaceable +>размер</replaceable +></option +></term> +<listitem> +<para +>Установите размер блока в байтах.</para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><option +>-s <replaceable +>секунды</replaceable +></option +></term> +<listitem> +<para +>Установите время отключения сервера при бездействии в секундах. Значение ноль отменяет автоматическое отключение.</para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><option +>-m <replaceable +>имя приложения</replaceable +></option +></term> +<listitem> +<para +>Укажите имя приложения, которое будет использоваться для сообщений об ошибках, предостережениях и отображения информации. Если вы используете KDE, это может делать <application +>artsmessage</application +>.</para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><option +>-N</option +></term> +<listitem> +<para +>Увеличивает размер сетевого буфера до значения, подходящего при использовании локальной сети 10 мбит/. То же самое, что и параметр -w 5 (смотрите ниже). </para> +</listitem> +</varlistentry> +<varlistentry> +<term +><option +>-w <replaceable +>число</replaceable +></option +></term> +<listitem> +<para +>При использовании <application +>artsd</application +> в сети обычно стоит использовать сетевой буфер большего размера, чтобы избежать пропадания звука. ARts предоставляет минимальный буфер для приложений. Без указания данного параметра за минимальный размер буфера берется размер блока, умноженный на число блоков (см. выше). Данный же параметр позволяет увеличить стандартный размер с коэффициентом <replaceable +>число</replaceable +>. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><option +>-l <replaceable +>уровень</replaceable +></option +></term> +<listitem> +<para +>Установите уровень вывода служебной информации: - 3 (нет), 2 (предупреждения), 1 (информация), 0 (отладка).</para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><option +>-v</option +></term> +<listitem> +<para +>Показать версию.</para> +</listitem> +</varlistentry> + +</variablelist> + +<para +>В большинстве случаев достаточно просто запустить &artsd;. </para> +</sect1> + +<sect1 id="artswrapper"> +<title +>&artswrapper;</title> + +<para +>Чтобы добиться хорошего времени отклика, &artsd; запускается как процесс реального времени (на тех платформах, где это возможно). Для этого требуются права пользователя <systemitem class="username" +>root</systemitem +>, поэтому, чтобы снизить риски, связанные с безопасностью, &artsd; можно запускать с помощью небольшой программы &artswrapper;, которая, будучи запущенной от <systemitem class="username" +>root</systemitem +>, получает приоритет выполнения в реальном времени и запускает &artsd; от непривелигированного пользователя (не <systemitem class="username" +>root</systemitem +>). </para> + +<para +>Если для этой небольшой программы вы сделаете UID <systemitem class="username" +>root</systemitem +>, вероятнее всего, качество воспроизведения будет улучшено, так как должны исчезнуть задержки при воспроизведении. Однако при этом увеличивается риск того, что ошибка в программе или недобросовестный пользователь могут нарушить работу всей системы или как-то иначе повредить ее работе. Кроме того, на машине, которой пользуются несколько человек одновременно, приоритет реального времени для сервера может помещать пользователям, которые занимаются какой-то серьезной работой.</para> + +</sect1> + +<sect1 id="artsshell"> +<title +>&artsshell;</title> + +<para +>&artsshell; выполняет различные функции, связанные со звуковым сервером. Мы предполагаем дополнить модуль новыми командами в будущем (об этом смотрите в комментариях кода). </para> + +<para +>Формат команды: </para> + +<!-- LW: FIX THIS --> + +<cmdsynopsis +><command +>artsshell</command +> <group +> <arg +>suspend</arg +><arg +>status</arg +> <arg +>terminate</arg +> <arg +>autosuspend <replaceable +>secs</replaceable +></arg +> <arg +>networkbuffers <replaceable +>n</replaceable +></arg +> <arg +>volume [<replaceable +>volume</replaceable +>]</arg +> <arg +>stereoeffect <replaceable +>options</replaceable +></arg +> </group +> <group +> <option +>-h</option +> <option +>-q</option +> </group +> </cmdsynopsis> + +<para +>artsshell [параметры] <replaceable +>команда</replaceable +> [<replaceable +>параметры команды</replaceable +>] </para> + +<para +>Поддерживаются следущие параметры: </para> + +<variablelist> + +<varlistentry> +<term +><option +>-q</option +></term> +<listitem> +<para +>Подавлять весь вывод.</para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><option +>-h</option +></term> +<listitem> +<para +>Справка по использованию команды.</para> +</listitem> +</varlistentry> + +</variablelist> + +<para +>Поддерживаются следущие команды:</para> + +<variablelist> + +<varlistentry> +<term +><option +>suspend</option +></term> +<listitem> +<para +>Отключить звуковой сервер. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><option +>status</option +></term> +<listitem> +<para +>Показать информацию о состоянии сервера.</para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><option +>terminate</option +></term> +<listitem> +<para +>Отключить звуковой сервер. Если какие-то приложения его используют, они сообщат об ошибках. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><option +>autosuspend</option +> <parameter +>секунды</parameter +></term> +<listitem> +<para +>Установите время ожидания в секундах. Если звуковой сервер будет бездействовать это количество времени, он отключится. Значение ноль отменяет автоотключение. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><option +>networkbuffers</option +> <parameter +>число</parameter +></term> +<listitem> +<para +>Размер сетевых буферов вычисляется как стандартный размер буфера по умолчанию, умноженный на <parameter +>число</parameter +>. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><option +>volume</option +> [<replaceable +>громкость</replaceable +>]</term> +<listitem> +<para +>Установите громкость аудио вывода звуковым сервером. Аргумент <replaceable +>громкость</replaceable +> - это число с плавающей точкой. Если команда будет без парамеров, отобразится текущий уровень громкости. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><option +>stereoeffect list</option +></term> +<listitem> +<para +>Список всех модулей стереоэффектов.</para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><option +>stereoeffect insert [top|bottom]</option +> <replaceable +>название</replaceable +></term> +<listitem> +<para +>Помещает стререоэффект в стек и возвращает идентификатор, с помощью которого можно будет извлечь этот эффект. Эффект может быть помещён в начало или конец стека.</para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><option +>stereoeffect remove</option +> <replaceable +>идентификатор</replaceable +></term> +<listitem> +<para +>Извлекает стереоэффект с указанным <replaceable +>идентификатором</replaceable +> из стека.</para> +</listitem> +</varlistentry> + +</variablelist> + +</sect1> + +<sect1 id="artsplay"> +<title +><application +>artsplay</application +></title> + +<para +><application +>artsplay</application +> проигрывает звуковые файлы. У команды может быть только один аргумент - имя файла, который посылается звуковому серверу. Типом этого файла может быть <literal role="extension" +>wav</literal +>, <literal role="extension" +>au</literal +> или другой распространённый. Этот модуль полезен для тестирования активности звукового сервера. Запустив две команды параллельно или через малый промежуток времени, вы увидите, как звуковой сервер накладывает несколько сигналов друг на друга.</para> + +</sect1> + +<sect1 id="artsdsp"> +<title +><application +>artsdsp</application +></title> + +<para +>Звуковой сервер поддерживает только совместимые с &arts; приложения. Многие приложения пытаются обратиться к звуковой карте напрямую, тогда команда &artsdsp; позволяет, не внося в них исправления, работать с &arts;. </para> + +<para +>Если приложение запущено под &artsdsp;, все его попытки обратиться к устройству <filename class="devicefile" +>/dev/dsp</filename +> перехватываются и преобразовываются в вызовы &arts; <acronym +>API</acronym +>. Поскольку эмуляция устройства несовершенна, большинство приложений работает, хотя и замечается увеличение задержки и снижается быстродействие. </para> + +<para +>Формат команды &artsdsp;: </para> + +<!-- LW: FIX THIS --> +<para +>artsdsp [<replaceable +>параметры</replaceable +>] <replaceable +>аргументы приложения</replaceable +> </para> + +<para +>Возможны следущие параметры: </para> + +<variablelist> + +<varlistentry> +<term +><option +>-h</option +>, <option +>--помощь</option +></term> +<listitem> +<para +>Вызов краткой справки.</para> +</listitem> +</varlistentry> +<varlistentry> +<term +><option +>-n</option +> <option +>--name</option +> = <replaceable +>имя</replaceable +></term> +<listitem> +<para +>Испульзуйте <replaceable +>имя</replaceable +> для определения проигрывателя <command +>artsd</command +>.</para> + +</listitem> +</varlistentry> + +<varlistentry> +<term +><option +>-m</option +> <option +>--mmap</option +></term> +<listitem> +<para +>Эмулировать отображение в память (например, для <application +>Quake</application +>).</para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><option +>-v</option +> <option +>--verbose</option +></term> +<listitem> +<para +>Вывести параметры.</para> +</listitem> +</varlistentry> + +</variablelist> + +<para +>Пример вызова: </para> + +<para> +<userinput +><command +>artsdsp</command +> <option +>-v</option +> <option +>-m</option +> <parameter +>realplay <replaceable +>song.mp3</replaceable +></parameter +></userinput> +</para> + +<para +>Некоторые приложения работают лучше, если задан параметр <option +>--mmap</option +>. Конечно, эмулируются не все характеристики устройства, но большинство работает. Если вы обнаружили неработающее приложение, отправьте подробный отчёт об ошибке, чтобы разработчики смогли это исправить. Не забывайте о встроенной поддержке &arts;. Если ваше любимое приложение не поддерживается, попросите разработчиков его добавить. </para> + +</sect1> + +<sect1 id="artscat"> +<title +><application +>artscat</application +></title> + +<para +>Это простой модуль, отправляющий необработанные данные звуковому серверу. Вам необходимо только указать формат данных (частоту дискретизации, размер сэмплов и количество каналов). Вы, скорее всего, не будете его часто использовать, но он удобен для тестирования. Синтаксис команды: </para> + +<!-- LW: FIX THIS --> + +<para +>artscat [ <replaceable +>параметры</replaceable +> ] [ <replaceable +>имя файла</replaceable +> ] </para> + +<para +>Если имя файла не указано, чтение идёт из потока стандартного ввода. Поддерживаются следущие параметры: </para> + +<variablelist> +<varlistentry> +<term +><option +>-r</option +> <parameter +>частота дискретизации</parameter +></term> +<listitem> +<para +>Установите частоту дискретизации. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><option +>-b</option +> <parameter +>биты</parameter +></term> +<listitem> +<para +>Установите размер сэмпла (8 или 16). </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><option +>-c</option +> <parameter +>каналы</parameter +></term> +<listitem> +<para +>Установите количество каналов (1 или 2). </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><option +>-h</option +></term> +<listitem> +<para +>Показать использование команды и выйти. </para> +</listitem> +</varlistentry> + +</variablelist> +</sect1> + +<sect1 id="artscontrol"> +<title +>&artscontrol;</title> + +<para +>Графический модуль для выполнения задач, связанных со звуковым сервером. По умолчанию отображаются два индикатора уровня громкости и ползунок для регулировки громкости. В меню <guimenu +>Вид</guimenu +> вы можете выбрать и другие функции: </para> + +<variablelist> + +<varlistentry> +<term +><guimenuitem +>Показать область БПФ</guimenuitem +></term> +<listitem> +<para +>Открывает окно с анализатором спектра в реальном времени. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><guimenuitem +>Показать менеджера аудио</guimenuitem +></term> +<listitem> +<para +>Показывает активные источники звука и позволяет подключить их к любой доступной шине. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><guimenuitem +>Показать состояние aRts</guimenuitem +></term> +<listitem> +<para +>С помощью этого модуля вы будете знать, активен ли сервер и обладает ли он приоритетом работы в реальном времени. Он также показывает, сколько времени осталось для автоматического отключения сервера, и позволяет вам немедленно его отключить вручную. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><guimenuitem +>Показать midi-менеджера</guimenuitem +></term> +<listitem> +<para +>Отображает активные входы и выходы &MIDI; и позволяет их подключать друг к другу. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><guimenuitem +>FreeVerb</guimenuitem +></term> +<listitem> +<para +>Подключает эффект эха к стеку &arts; и позволяет вам графически изменять параметры эффекта. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><guimenuitem +>Указатель громкости в цифровом виде</guimenuitem +></term> +<listitem> +<para +>Показывает индикаторы громкости в главном окне в форме цветных индикаторов вместо строк состояния. </para> +</listitem> +</varlistentry> + +</variablelist> + +</sect1> + +<sect1 id="artsc-config"> +<title +><application +>artsc-config</application +></title> + +<para +>Этот модуль поможет разработчикам в использовании &arts; C <acronym +>API</acronym +>. Он выбирает подходящие параметры компилятора и компоновщика при компиляции и компоновке кода с помощью &arts;. Желательно его использовать в сборочных файлах для обеспечения переносимости. Допустимы три параметра: </para> + +<variablelist> +<varlistentry> +<term +><option +>--cflags</option +></term> +<listitem> +<para +>Показывает необходимые компилятору флаги при использовании &arts; C <acronym +>API</acronym +>. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><option +>--libs</option +></term> +<listitem> +<para +>Показывает необходимые компоновщику флаги при компоновке с использованием &arts; C <acronym +>API</acronym +>. </para> +</listitem> +</varlistentry> +<varlistentry> +<term +><acronym +>--version</acronym +></term> +<listitem> +<para +>Показывает версию <command +>artsc-config</command +>. </para> +</listitem> +</varlistentry> +</variablelist> + +<para +>Пример вывода команды:</para> + +<screen width="40" +><prompt +>%</prompt +> <userinput +><command +>artsc-config</command +> <option +>--cflags</option +></userinput> +<computeroutput +>-I/usr/local/kde2/include/artsc</computeroutput> +<prompt +>%</prompt +> <userinput +><command +>artsc-config</command +> <option +>--libs</option +></userinput> +<computeroutput +>-L/usr/local/kde2/lib -ldl -lartsc -DPIC -fPIC -lpthread</computeroutput> +<prompt +>%</prompt +> <userinput +><command +>artsc-config</command +> <option +>--version</option +></userinput> +<computeroutput +>0.9.5</computeroutput +> +</screen> + +<para +>Вы можете использовать этот модуль в сборочном файле по такому правилу: </para> + +<programlisting +>artsc: artsc.c + gcc `artsc-config --cflags` -o artsc artsc.c `artsc-config --libs` +</programlisting> + +</sect1> + +<sect1 id="mcopidl"> +<title +>&mcopidl;</title> + +<para +>&mcopidl; - это компилятор &IDL;-файлов для &MCOP;, (Multimedia Communication Protocol, протокол связи мультимедиа-модулей), использующийся в &arts;. Интерфейсы &arts; описаны в &IDL; (Interface Definition Language, язык определения интерфейса). Модуль &mcopidl; считает файл &IDL; входом и генерирует заголовочный и исходный файлы C++ для создания класса интерфейса. Синтаксис команды: </para> + +<!-- LW: FIX THIS --> + +<para +>mcopidl [ <replaceable +>параметры</replaceable +> ] <replaceable +>имя файла</replaceable +> </para> + +<para +>Допустимые параметры:</para> +<variablelist> +<varlistentry> +<term +><option +>-I</option +> <parameter +>каталог</parameter +></term> +<listitem> +<para +>Поиск в каталоге <parameter +>каталог</parameter +> включаемых файлов (include). </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><option +>-e</option +> <parameter +>имя</parameter +></term> +<listitem> +<para +>Исключает структуру, интерфейс или перечисляемый тип с именем <parameter +>имя</parameter +> во время генерации кода. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><option +>-t</option +></term> +<listitem> +<para +>Создайте также файлы <literal role="extension" +>.mcoptype</literal +>/<literal role="extension" +>.mcopclass</literal +>, содержащие информацию о типах для файла &IDL;. </para> +</listitem> +</varlistentry> +</variablelist> + +<para +>Болееподробно &MCOP; и &IDL; рассматриваются в разделе <link linkend="interfaces" +>Интерфейсы и &IDL;</link +>. </para> + +</sect1> + +</chapter> diff --git a/tde-i18n-ru/docs/tdemultimedia/kioslave/Makefile.am b/tde-i18n-ru/docs/tdemultimedia/kioslave/Makefile.am new file mode 100644 index 00000000000..e8ff7c7b1b8 --- /dev/null +++ b/tde-i18n-ru/docs/tdemultimedia/kioslave/Makefile.am @@ -0,0 +1,4 @@ +KDE_LANG = ru +SUBDIRS = $(AUTODIRS) +KDE_DOCS = AUTO +KDE_MANS = AUTO diff --git a/tde-i18n-ru/docs/tdemultimedia/kioslave/Makefile.in b/tde-i18n-ru/docs/tdemultimedia/kioslave/Makefile.in new file mode 100644 index 00000000000..366ac4004bb --- /dev/null +++ b/tde-i18n-ru/docs/tdemultimedia/kioslave/Makefile.in @@ -0,0 +1,613 @@ +# 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/tdemultimedia/kioslave +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@ +tdeinitdir = @tdeinitdir@ +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/tdemultimedia/kioslave/Makefile'; \ +#>- cd $(top_srcdir) && \ +#>- $(AUTOMAKE) --gnu docs/tdemultimedia/kioslave/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/tdemultimedia/kioslave/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu docs/tdemultimedia/kioslave/Makefile + cd $(top_srcdir) && perl ../scripts/admin/am_edit -p../scripts/admin docs/tdemultimedia/kioslave/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-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-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-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=audiocd.docbook Makefile.in Makefile.am + +#>+ 2 +docs-am: audiocd.docbook + +#>+ 13 +install-nls: + $(mkinstalldirs) $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/kioslave + @for base in audiocd.docbook ; do \ + echo $(INSTALL_DATA) $$base $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/kioslave/$$base ;\ + $(INSTALL_DATA) $(srcdir)/$$base $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/kioslave/$$base ;\ + done + +uninstall-nls: + for base in audiocd.docbook ; do \ + rm -f $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/kioslave/$$base ;\ + done + + +#>+ 5 +distdir-nls: + for file in audiocd.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/tdemultimedia/kioslave/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu docs/tdemultimedia/kioslave/Makefile + cd $(top_srcdir) && perl ../scripts/admin/am_edit -p../scripts/admin docs/tdemultimedia/kioslave/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/tdemultimedia/kioslave/audiocd.docbook b/tde-i18n-ru/docs/tdemultimedia/kioslave/audiocd.docbook new file mode 100644 index 00000000000..d25418a3ad8 --- /dev/null +++ b/tde-i18n-ru/docs/tdemultimedia/kioslave/audiocd.docbook @@ -0,0 +1,283 @@ +<article lang="&language;" id="audiocd"> +<title +>audiocd</title> +<articleinfo> +<authorgroup> +<author +>&Rik.Hemsley; &Rik.Hemsley.mail;</author> +<author +><personname +><firstname +>Benjamin</firstname +><surname +>Meyer</surname +></personname +></author> +<othercredit role="translator" +><firstname +>Николай</firstname +><surname +>Шафоростов</surname +><affiliation +><address +><email +>shafff@ukr.net</email +></address +></affiliation +><contrib +>Перевод на русский</contrib +></othercredit +> +</authorgroup> + +<date +>2004-09-16</date> +<releaseinfo +>2.30.00</releaseinfo> + +</articleinfo> + +<para +>Обеспечивает работу со звуковыми <acronym +>CD</acronym +>. Дорожки представляются в виде файлов (в разных форматах) и при копировании их в локальную файловую систему они автоматически преобразуются в соответствующий формат.</para> + +<para +>Чтобы понять, как это работает, вставьте звуковой компакт-диск в привод &CD-ROM; и наберите <userinput +>audiocd:/</userinput +> в строке адреса &konqueror;. Через несколько секунд вы увидите список файлов-дорожек и папки.</para> + +<para +>Звуковые компакт-диски не содержат папок, однако они были добавлены разработчиками канала audiocd для наглядности хранимых данных. В каждой папке находится одинаковый набор дорожек. Если у вас есть соединение с Интернетом, вместо названий дорожек в виде их номеров вы увидите реальные названия песен.</para> + +<para +>Папки соответствуют различным форматом представления звуковых записей дорожек звукового компакт-диска.</para> + +<para +>Например, если перетащить файл из папки <filename class="directory" +>Ogg Vorbis</filename +> в другое окно или вкладку &konqueror;, содержащие папку локального диска, то отобразится окно, показывающее состояние процесса преобразования звуковой дорожки в этот формат и сохранения в виде локального файла. Помните, что Ogg Vorbis — это сжатый формат хранения звуковых записей с потерей качества, поэтому нельзя пользоваться этим методом, если вы хотите записать точную копию звукового диска. Для этого существуют специальные программы.</para> + +<para +>Механизм канала довольно прост. Когда каналу audiocd поступает запрос на получение дорожки из папки <filename class="directory" +>Ogg Vorbis</filename +>, он начинает считывать звуковую дорожку с компакт-диска, преобразуя её "на лету" в формат Ogg Vorbis (дорожки на звуковых компакт-дисках содержат несжатые звуковые записи).</para> + +<para +>Файлы с расширением <literal role="extension" +>.wav</literal +> — точная копия звуковых дорожек (без потерь качества), поэтому они и занимают больше места. Попробуйте перетащить их на звуковой проигрыватель &noatun;, и вы сможете прослушать дорожки с цифровой обработкой (например, у вас будет возможность включить эквалайзер). На самом деле, дорожки имеют несжатый формат <quote +>RIFF WAV</quote +>, который отличается от формата файлов <literal role="extension" +>.cda</literal +>, расположенных в каталоге компакт-диска, только "оформлением" (т.е. с адаптацией для обычной файловой системы). Этот формат может быть воспроизведён на подавляющем большинстве звуковых проигрывателей.</para> + +<para +>Звуковой проигрыватель &noatun; должен без проблем проигрывать файл <literal role="extension" +>.wav</literal +>, однако если он проигрывается с шумом (щелчками и т.п.), включите параметр <option +>paranoia_level</option +>, рассматриваемый ниже.</para> + +<variablelist> +<title +>Параметры</title> + +<varlistentry> +<term +><option +>device</option +></term> +<listitem> +<para +>Введите путь к приводу CD-ROM, например <userinput +>audiocd:/<option +>?device</option +>=<parameter +>/dev/sdc</parameter +></userinput +>. Обычно, если в системе несколько приводов, будет использован привод со звуковым <acronym +>CD</acronym +>, но если определить такой привод автоматически не получается, используйте этот параметр. Кроме того, устройство по умолчанию можно задать в диалоге настройки.</para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><option +>fileNameTemplate</option +></term> +<listitem> +<para +>Установить шаблон имён файлов, например <userinput +>audiocd:/<option +>?fileNameTemplate</option +>=<parameter +>Track %{number}</parameter +></userinput +>. В диалоге настроек вы можете изменить значение по умолчанию и не указывать его каждый раз. Если вы укажете пустую строку, файлы не будут показаны.</para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><option +>albumNameTemplate</option +></term> +<listitem> +<para +>Установить шаблон имён альбомов, например <userinput +>audiocd:/<option +>?albumNameTemplate</option +>=<parameter +>%{albumartist} %{albumtitle}</parameter +></userinput +>. В диалоге настройки можно изменить значение по умолчанию и не указывать его каждый раз.</para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><option +>niceLevel</option +></term> +<listitem> +<para +>Установить приоритет кодера, например <userinput +>audiocd:/<option +>?albumNameTemplate</option +>=<parameter +>niceLevel=10</parameter +></userinput +>. В диалоге настройки можно изменить значение по умолчанию и не указывать его каждый раз.</para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><option +>paranoia_level</option +></term> +<listitem> +<para +>Величина коррекции ошибок чтения.</para> + +<variablelist> +<varlistentry> +<term +>Уровень 0</term> +<listitem> +<para +>Без коррекции ошибок. Полезно использовать, если ваш привод идеально читает компакт-диски.</para> +</listitem> +</varlistentry> + +<varlistentry> +<term +>Уровень 1</term> +<listitem> +<para +>Простая коррекция ошибок.</para> +</listitem> +</varlistentry> + +<varlistentry> +<term +>Уровень 2</term> +<listitem> +<para +>По умолчанию. Принимается только безупречное чтение.</para> +</listitem> +</varlistentry> +</variablelist> + +<para +>Учтите, что при этом считывание может быть очень медленным, что затруднит одновременное проигрывание дорожки. Если вы обладатель высококачественного привода компакт-дисков (помните, что более высокая цена не всегда означает повышение качества), то, возможно, вы не заметите задержки. Однако на старых приводах получение звуковых записей с компакт-диска может занять дни!</para> +</listitem> +</varlistentry> + +<varlistentry> +<term +><option +>cddbChoice</option +></term> +<listitem> + +<para +>Обращаться к указанной базе данных <acronym +>CD</acronym +> в Интернете. Большинство звуковых компакт-дисков не содержат в себе названий дорожек, поэтому, чтобы не вводить их самостоятельно, вы можете воспользоваться чужим трудом. Названия дорожек, которые вы запрашиваете, определяются по длинам и количеству дорожек на диске. Базы данных дорожек компакт-дисков составляются интернет-сообществом и доступны для всех. Иногда запрос может вернуть несколько результатов, и тогда нужно будет выбрать один из них.</para> + +<para +>Вы можете разместить в этой базе собственные названия дорожек через &kscd;, проигрыватель звуковых компакт-дисков &kde;.</para> + +<para +>По умолчанию audiocd выбирает лучший вариант.</para> +</listitem> +</varlistentry> +</variablelist> + +<variablelist> +<title +>Примеры</title> +<varlistentry> +<term +><userinput +>audiocd:/?device=/dev/scd0&paranoia_level=0&cddbChoice=0</userinput +></term> +<listitem> +<para +>Получить список дорожек <acronym +>CD</acronym +>, вставленного в <acronym +>SCSI</acronym +>-привод <filename class="devicefile" +>/dev/scd0</filename +>. Считывать данные без коррекции, использовать <acronym +>CDDB</acronym +>-запись с номером 0.</para> +</listitem> +</varlistentry> +</variablelist> + +<qandaset> +<title +>Вопросы и ответы</title> +<qandaentry> +<question> +<para +>Как исправить ошибку <errorname +>Файл или папка / не существует</errorname +>? Звуковой компакт-диск вставлен в привод.</para> +</question> + +<answer> +<para +>Выполните <userinput +><command +>cdparanoia</command +> <option +>-vsQ</option +></userinput +> с правами обычного пользователя (не от имени <systemitem class="username" +>root</systemitem +>). Если список дорожек не выдаётся, убедитесь, что у вас есть права доступа к приводу <acronym +>CD</acronym +>. Если вы используете эмуляцию <acronym +>SCSI</acronym +>, проверьте права доступа к <acronym +>SCSI</acronym +>-устройству (<filename class="devicefile" +>/dev/sg0</filename +>, <filename class="devicefile" +>/dev/sg1</filename +> и т.д.). Если и это не работает, введите <userinput +>audiocd:/?device=/dev/sg0</userinput +> (или укажите другое правильное устройство) для указания, какое устройство привода компакт-дисков будет использовано.</para +> +</answer> +</qandaentry> +</qandaset> + + +</article> diff --git a/tde-i18n-ru/docs/tdemultimedia/kmid/Makefile.am b/tde-i18n-ru/docs/tdemultimedia/kmid/Makefile.am new file mode 100644 index 00000000000..e8ff7c7b1b8 --- /dev/null +++ b/tde-i18n-ru/docs/tdemultimedia/kmid/Makefile.am @@ -0,0 +1,4 @@ +KDE_LANG = ru +SUBDIRS = $(AUTODIRS) +KDE_DOCS = AUTO +KDE_MANS = AUTO diff --git a/tde-i18n-ru/docs/tdemultimedia/kmid/Makefile.in b/tde-i18n-ru/docs/tdemultimedia/kmid/Makefile.in new file mode 100644 index 00000000000..45d95986786 --- /dev/null +++ b/tde-i18n-ru/docs/tdemultimedia/kmid/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/tdemultimedia/kmid +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@ +tdeinitdir = @tdeinitdir@ +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/tdemultimedia/kmid/Makefile'; \ +#>- cd $(top_srcdir) && \ +#>- $(AUTOMAKE) --gnu docs/tdemultimedia/kmid/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/tdemultimedia/kmid/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu docs/tdemultimedia/kmid/Makefile + cd $(top_srcdir) && perl ../scripts/admin/am_edit -p../scripts/admin docs/tdemultimedia/kmid/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=index.docbook index.cache.bz2 Makefile.in Makefile.am + +#>+ 24 +index.cache.bz2: $(srcdir)/index.docbook $(KDE_XSL_STYLESHEET) index.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)/kmid + @if test -f index.cache.bz2; then \ + echo $(INSTALL_DATA) index.cache.bz2 $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/kmid/; \ + $(INSTALL_DATA) index.cache.bz2 $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/kmid/; \ + elif test -f $(srcdir)/index.cache.bz2; then \ + echo $(INSTALL_DATA) $(srcdir)/index.cache.bz2 $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/kmid/; \ + $(INSTALL_DATA) $(srcdir)/index.cache.bz2 $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/kmid/; \ + fi + -rm -f $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/kmid/common + $(LN_S) $(kde_libs_htmldir)/$(KDE_LANG)/common $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/kmid/common + +uninstall-docs: + -rm -rf $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/kmid + +clean-docs: + -rm -f index.cache.bz2 + + +#>+ 13 +install-nls: + $(mkinstalldirs) $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/kmid + @for base in index.docbook ; do \ + echo $(INSTALL_DATA) $$base $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/kmid/$$base ;\ + $(INSTALL_DATA) $(srcdir)/$$base $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/kmid/$$base ;\ + done + +uninstall-nls: + for base in index.docbook ; do \ + rm -f $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/kmid/$$base ;\ + done + + +#>+ 5 +distdir-nls: + for file in index.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/tdemultimedia/kmid/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu docs/tdemultimedia/kmid/Makefile + cd $(top_srcdir) && perl ../scripts/admin/am_edit -p../scripts/admin docs/tdemultimedia/kmid/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/tdemultimedia/kmid/index.cache.bz2 b/tde-i18n-ru/docs/tdemultimedia/kmid/index.cache.bz2 Binary files differnew file mode 100644 index 00000000000..4f12a2ca0de --- /dev/null +++ b/tde-i18n-ru/docs/tdemultimedia/kmid/index.cache.bz2 diff --git a/tde-i18n-ru/docs/tdemultimedia/kmid/index.docbook b/tde-i18n-ru/docs/tdemultimedia/kmid/index.docbook new file mode 100644 index 00000000000..33baf74e35b --- /dev/null +++ b/tde-i18n-ru/docs/tdemultimedia/kmid/index.docbook @@ -0,0 +1,1396 @@ +<?xml version="1.0" ?> +<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN" "dtd/kdex.dtd" [ + <!ENTITY kappname "&kmid;"> + <!ENTITY package "tdemultimedia"> + <!ENTITY % Russian "INCLUDE" +> <!-- change language only here --> + <!ENTITY % addindex "IGNORE"> +]> + +<book lang="&language;"> + +<bookinfo> +<title +>Руководство &kmid;</title> +<authorgroup> +<author +><firstname +>Antonio</firstname +> <surname +>Larrosa Jiménez</surname +> <affiliation +> <address +><email +>larrosa@kde.org</email +></address> +</affiliation> +</author> +<othercredit role="translator" +><firstname +>Иван</firstname +><surname +>Кашуков</surname +><affiliation +><address +><email +>dolphin210@yandex.ru</email +></address +></affiliation +><contrib +>Перевод на русский</contrib +></othercredit +> +</authorgroup> + +<copyright> +<year +>1999</year +><year +>2001</year> +<holder +>Antonio Larrosa Jiménez</holder> +</copyright> + +<date +>2002-02-05</date> +<releaseinfo +>2.00.00</releaseinfo> + +<abstract> +<para +>&kmid; - мультимедийный проигрыватель файлов midi/karaoke </para> +</abstract> + +<keywordset> +<keyword +>KMid</keyword> +<keyword +>midi</keyword> +<keyword +>karaoke</keyword> +<keyword +>multimedia</keyword> +<keyword +>mid</keyword> +<keyword +>kar</keyword> +<keyword +>player</keyword> +<keyword +>music</keyword> +<keyword +>sound</keyword> +<keyword +>fm</keyword> +<keyword +>awe</keyword> +<keyword +>gus</keyword> +</keywordset> +</bookinfo> + +<chapter id="introduction"> +<title +>Введение</title> + +<para +>&kmid; - мультимедийный проигрыватель файлов midi/karaoke под &kde;. Некоторые его качества, такие как графика реального времени и подсветка текста караоке, не встречаются у других midi-проигрывателей &UNIX;. </para> + +<para +>&kmid; работает на платформах &Linux; и FreeBSD. Программа использует звуковой драйвер <acronym +>OSS</acronym +>, так что сможет работать на любой системе, где скомпилированы &kde; и <acronym +>OSS</acronym +>. &kmid; также поддерживает &Linux; Ultrasound Project Driver, который работает со звуковыми картами <acronym +>GUS</acronym +>. Я планирую ввести поддержку драйвера <acronym +>ALSA</acronym +> одновременно с поддержкой секвенсера. </para> + +<para +>Одновременно с воспроизведением музыки в окне &kmid; выводится текст песни. Цвет текста меняется по ходу воспроизведения, так что следовать за музыкой очень легко. </para> + +<para +>Надеюсь, что вам будет так же интересно использовать &kmid;, как мне было интересно её разрабатывать. </para> + +<para +>Antonio Larrosa Jiménez <email +>larrosa@kde.org</email +> </para> + +<sect1 id="kmids-features"> +<title +>Возможности &kmid;</title> + +<para +>Основные характеристики &kmid;: </para> + +<itemizedlist> +<listitem> +<para +>Очень <emphasis +>дружелюбный интерфейс пользователя</emphasis +> - отображение текста караоке с подсвечиванием. </para> +</listitem> +<listitem> +<para +>Графическое отображение состояния каждого из каналов midi - подсвечивание нажатых клавиш на виртуальных клавиатурах. </para> +</listitem> +<listitem> +<para +><emphasis +>Midi-мэппер</emphasis +>, имеющий больше возможностей, чем любой другой на всех операционных системах. </para> +</listitem> +<listitem> +<para +>Поддержка механизма <emphasis +>drag & drop</emphasis +> - при использовании &kde; вы сможете перетаскивать файлы midi из окна &konqueror;. </para> +</listitem> +<listitem> +<para +>Вы можете <emphasis +>изменять скорость</emphasis +> воспроизведения песен. </para> +</listitem> +<listitem> +<para +>Программа отображает индикаторы ритма песни. </para> +</listitem> +<listitem> +<para +>Вы можете <emphasis +>настраивать шрифты</emphasis +> отображаемого текста караоке. </para> +</listitem> +<listitem> +<para +>Поддержка двух стандартов представления текста песен в файлах midi - текст песни или сообщения (программа автоматически определяет метод, используемый данным файлом). </para> +</listitem> +<listitem> +<para +>Управление сеансами. Если вы вышли из &kde; во время воспроизведения песни, при следующем входе программа начнёт проигрывать этот же файл. </para> +</listitem> +<listitem> +<para +><emphasis +>Регулировка звука</emphasis +> в режиме реального времени. </para> +</listitem> +<listitem> +<para +>Программа может воспроизводить искажённые файлы midi, попытка воспроизведения которых на других проигрывателях вызовет сбой ядра. </para> +</listitem> +<listitem> +<para +>Вы можете открывать <emphasis +>файлы midi/караоке, сжатые gzip</emphasis +>, так же, как обычные файлы. </para> +</listitem> +<listitem> +<para +>В моей системе программа занимает приблизительно <emphasis +>0.1%</emphasis +> ресурсов <acronym +>CPU</acronym +> (зависит от состава файла). </para> +</listitem> +<listitem> +<para +>Поддерживает внешние midi-синтезаторы, звуковые карты <acronym +>AWE</acronym +>, <acronym +>FM</acronym +> и <acronym +>GUS</acronym +> (для последней вам понадобится установить драйвер <acronym +>LUP</acronym +> и gusd). </para> +</listitem> +<listitem> +<para +>Работает на &Linux; и FreeBSD (возможно, и на других Unix-подобных системах). </para> +</listitem> +</itemizedlist> + +</sect1> +</chapter> + +<chapter id="general-usage"> +<title +>Использование</title> + +<sect1 id="opening-songs"> +<title +>Как открыть файл</title> + +<para +>Есть несколько способов открыть файл. </para> + +<para +>Вы можете выбрать опцию <guimenuitem +>Открыть...</guimenuitem +> в меню <guimenu +>Файл</guimenu +> - будет выведено стандартное диалоговое окно выбора файла, в котором вы сможете выбрать нужную песню. </para> + +<para +>Вы можете перетащить один или несколько файлов из окна &konqueror; в окно &kmid;. </para> + +<para +>Также вы можете задать файл при вызове &kmid; из командной строки. </para> + +<para +>Наконец, вы можете выбрать файл из списка файлов активной коллекции. </para> + +</sect1> + +<sect1 id="playing-songs"> +<title +>Воспроизведение файлов</title> + +<para +>Чтобы воспроизвести файл, откройте его и нажмите на кнопку <guiicon +>Воспроизвести</guiicon +> на панели инструментов, выберите пункт <guimenuitem +>Воспроизвести</guimenuitem +> в меню <guimenu +>Песня</guimenu +> или нажмите <keycap +>пробел</keycap +>. </para> + +<para +>Обратите внимание, что когда вы открываете файл, перетаскивая его в окно &kmid;, программа автоматически начинает его воспроизведение (если вы перетащили более одного файла, они будут добавлены в коллекцию и будут воспроизведены по очереди). </para> + +<para +>Во время проигрывании песни вы можете передвинуть ползунок времени или щёлкнуть средней кнопкой мыши по нужному месту на шкале. </para> + +<para +>Если музыка играет слишком быстро или слишком медленно, вы можете изменить скорость с помощью стрелок с двух сторон <acronym +>индикатора</acronym +> скорости. Чтобы восстановить скорость по умолчанию, дважды щёлкните по <acronym +>индикатору</acronym +> скорости. </para> + +<para +>Клавиша <keycap +>пробел</keycap +> используется для двух вещей: если вы нажмёте пробел во время воспроизведения музыки, оно будет приостановлено (также вы можете нажать кнопку <guiicon +>Пауза</guiicon +> или выбрать пункт <guimenuitem +>Пауза</guimenuitem +> в меню <guimenuitem +>Песня</guimenuitem +>). Если музыка не воспроизводилась, после нажатия клавиши <keycap +>пробел</keycap +> &kmid; начнёт воспроизведение. </para> + +</sect1> + +<sect1 id="displaying-lyrics"> +<title +>Отображение текста песни</title> + +<para +>Есть два способа хранения текста песни в файле - используя <guimenuitem +>Сообщения</guimenuitem +> или <guimenuitem +>Текст песни</guimenuitem +>. Некоторые файлы используют первый способ, некоторые - второй, а некоторые не включают текст песни :-) </para> + +<para +>&kmid; позволяет вам выбрать способ отображения текста, также вы можете включить опцию, позволяющую программе автоматически определять метод, используемый данным файлом, так что вам не придётся изменять его вручную. Если вы выберите пункт <guimenuitem +>Автовыбор текста</guimenuitem +> в меню <guimenu +>Настройка</guimenu +>, тип текста караоке будет устанавливаться автоматически, но вы сможете изменить выбор вручную. </para> + +<para +>Чтобы выбрать нужный тип, вы можете использовать пункты меню <guimenu +>Настройка</guimenu +> или просто нажать клавишу <keycap +>1</keycap +> или <keycap +>2</keycap +>, чтобы выбрать тип <guimenuitem +>Сообщения</guimenuitem +> или <guimenuitem +>Текст песни</guimenuitem +> соответственно. </para> + +</sect1> + +</chapter> + +<chapter id="collections"> +<title +>Коллекции</title> + +<para +>Коллекция - созданный пользователем список файлов midi, которые воспроизводятся по очереди. В этой секции руководства даётся информация и приводятся полезные советы по использованию коллекций. </para> + +<sect1 id="creating-a-collection"> +<title +>Создание коллекции</title> + +<para +>Чтобы создать коллекцию, откройте диалог <guilabel +>Менеджер коллекций...</guilabel +>, выбрав пункт <guimenuitem +>Менеджер коллекций ...</guimenuitem +> меню <guimenu +>Коллекции</guimenu +>. Затем щёлкните по кнопке <guibutton +>Новая</guibutton +> и введите название, которое вы хотите присвоить коллекции. </para> + +<para +>Чтобы скопировать коллекцию, выберите её и нажмите на кнопку <guibutton +>Копировать</guibutton +>. Программа выведет окно, в котором вы сможете ввести имя новой коллекции. Она будет содержать те же песни, что и выбранная коллекция. </para> + +<para +>Если у вас более одной коллекции, вы сможете выбирать активную в окне <guilabel +>Менеджера коллекций</guilabel +>. </para> + +</sect1> +<sect1 id="the-temporary-collection"> +<title +>Временная коллекция</title> + +<para +>Временная коллекция содержит файлы, которые вы назначили на воспроизведение, но не хотите добавлять к какой-либо коллекции. </para> + +<para +>Если вы добавляете много песен в эту коллекцию, имейте в виду, что она <emphasis +>не сохраняется</emphasis +> при выходе из приложения. </para> + +<para +>Продолжайте читать эту секцию, чтобы узнать больше о Временной коллекции. </para> + +</sect1> + +<sect1 id="adding-songs-to-a-collection"> +<title +>Добавление песен в коллекцию</title> +<subtitle +>Как использовать опцию <guimenuitem +>Автоматически добавлять в коллекцию</guimenuitem +></subtitle> + +<para +>Есть несколько способов добавления песни в коллекцию. </para> + +<para +>При использовании любого метода в первую очередь вы должны выбрать коллекцию, к которой хотите добавить файлы, в <guilabel +>Менеджере коллекций</guilabel +>. Затем, чтобы добавить файл, нажмите на кнопку <guibutton +>Добавить</guibutton +> - будет выведено диалоговое окно, в котором вы сможете выбрать файлы. </para> + +<para +>Возможность использования других методов зависит от того, включена опция <guimenuitem +>Автоматически добавлять в коллекцию</guimenuitem +> или нет. </para> + +<para +>Если опция <guimenuitem +>Автоматически добавлять в коллекцию</guimenuitem +> включена, то когда вы открываете файл (используя опцию<menuchoice +><guimenu +>Файл</guimenu +> <guimenuitem +>Открыть...</guimenuitem +></menuchoice +> или перетащив файл в окно программы), он (они) автоматически добавляется (добавляются) в активную коллекцию без вмешательства пользователя. </para> + +<para +>Если опция <guimenuitem +>Автоматически добавлять в коллекцию</guimenuitem +> не включена, файлы будут добавляться во временную коллекцию, которая перед этим будет очищаться. </para> + +</sect1> + +<sect1 id="removing-songs-from-collections"> +<title +>Удаление файлов из коллекций</title> + +<para +>Чтобы удалить файл из коллекции, откройте <guilabel +>Менеджер коллекций</guilabel +>, выберите коллекцию, в ней - файл, который вы хотите удалить, и нажмите кнопку <guibutton +>Удалить</guibutton +>. </para> + +</sect1> + +<sect1 id="playing-order"> +<title +>Воспроизведение по порядку или случайно</title> + +<para +>Вы можете выбирать порядок, в котором будут воспроизводиться песни. Если вы выберете режим <guimenuitem +>По порядку</guimenuitem +> из меню <guisubmenu +>Коллекции</guisubmenu +>, подменю <guimenu +>Коллекции</guimenu +>, песни будут воспроизводиться в том порядке, в каком они были добавлены в коллекцию. </para> + +<para +>Если вы выберите режим <guimenuitem +>В случайном порядке</guimenuitem +>, &kmid; будет создавать переменную со случайным значением, чтобы песни воспроизводились в действительно случайном порядке. В соответствии со значениями, присваемыми переменной, будет создаваться список, по которому будут воспроизводиться файлы (вы хотите, чтобы они воспроизводились в случайном порядке, но не хотите слушать одну песню два раза подряд, и хотите, чтобы при нажатии кнопки <guibutton +>Предыдущая песня</guibutton +>, воспроизводилась песня, игравшая до этого, не так ли? :-) ). </para> + +<para +>Этот список создаётся заново каждый раз, когда вы добавляете или удаляете файл из активной коллекции и когда вы выбираете пункт меню <guimenuitem +>В случайном порядке</guimenuitem +>. </para> + +</sect1> + +<sect1 id="selecting-from-a-collection"> +<title +>Выбор песни из коллекции</title> + +<para +>Вы можете выбрать песню, которую хотите прослушать, с помощью <literal +>Менеджера коллекций</literal +> или с помощью выпадающего списка над текстом караоке. </para> + +<para +>Также вы можете выбрать следующую песню с помощью пункта <literal +>Следующая песня</literal +> меню <literal +>Песня</literal +>, с помощью кнопки <literal +>Следующая песня</literal +> или нажав на клавишу <literal +>стрелка вправо</literal +>. </para> + +<para +>Чтобы перейти к предыдущей песне, используйте пункт <guimenuitem +>Предыдущая песня</guimenuitem +> меню <guimenu +>Песня</guimenu +>, нажмите на кнопку <guimenuitem +>Предыдущая песня</guimenuitem +> на панели инструментов или нажмите на клавишу <keycap +>стрелка влево</keycap +>. </para> + +</sect1> + +<sect1 id="deleting-a-collection"> +<title +>Удаление коллекции</title> + +<para +>Чтобы удалить коллекцию, откройте <guilabel +>Менеджер коллекций</guilabel +>, выберите коллекцию, которую вы хотите удалить и щёлкните по кнопке <guibutton +>Удалить</guibutton +>. Легко, не правда ли? </para> + +<para +>Помните, что вы не можете удалить временную коллекцию, но это неважно, так как когда вы выйдете из &kmid;, она всё равно будет удалена. </para> + +</sect1> + +</chapter> + +<chapter id="midi-maps"> +<title +>Таблицы событий midi</title> + +<sect1 id="what-is-a-midimap"> +<title +>Что такое таблица событий midi?</title> + +<para +>Таблица событий midi определяет события midi в других событиях midi. </para> + +<para +>Это необходимо для синтезаторов, которые не поддерживают стандартные события (т. е. не являются совместимыми с General Midi), в этом случае таблица событий midi переводит события General Midi в события, которые понимает синтезатор. </para> + +<para +>Например, вы можете создать таблицу событий midi, которая переводит все события <literal +>Change patch to Bright Piano</literal +> (сменить патч на концертный рояль) в события <literal +>Change patch to Trumpet</literal +> (сменить патч на трубу) - когда песня пытается воспроизвести рояль, будет воспроизводиться звук трубы. </para> + +<para +>Это может звучать необычно (зачем воспроизводить трубу, если музыка предназначена для воспроизведения на рояле?), но это может быть очень полезным. Стандарт <acronym +>GM</acronym +> говорит, что когда midi-клавиатура получает команду сменить патч на <literal +>0</literal +>, она заменяет текущий патч на <literal +>Рояль</literal +>. Старые синтезаторы при команде сменить патч на <literal +>0</literal +>, могут сменить его, например, на патч <literal +>Электрогитара</literal +>. Чтобы сменить патч на <literal +>Рояль</literal +>, им, например, необходимо получить команду сменить патч на <literal +>3</literal +>. Здесь может помочь таблица событий midi, которая заменяет все команды <literal +>change patch to 0</literal +> (сменить патч на 0) на команды <literal +>change patch to 3</literal +> (сменить патч на 3), и при этом воспроизводится необходимый инструмент. </para> + +</sect1> + +<sect1 id="do-i-need-a-midi-map"> +<title +>Нужна ли мне таблица событий midi?</title> + +<para +>Коротко говоря, если у вас нет внешнего синтезатора, то <emphasis +>нет</emphasis +>! </para> + +<para +>Если у вас есть только звуковая карта, таблицы событий midi не нужны, так как все звуковые карты совместимы с <acronym +>GM</acronym +> (включая карты <acronym +>GUS</acronym +>, устройства <acronym +>FM</acronym +> и так далее). </para> + +<para +>Если вы воспроизводите музыку через внешний синтезатор, и он не является GM-совместимым, вам придётся создать таблицу событий midi для вашей midi-клавиатуры. Хотя создание таблицы событий midi и проверка всех возможных значений для всех опций может занять около шести часов, после завершения вы будете полностью вознаграждены, так как вы будете знать все скрытые возможности вашей клавиатуры. Например, я использую недорогую клавиатуру Yamaha PSS-790, которая не является <acronym +>GM</acronym +>-совместимой и включает меньше инструментов, чем синтезатор <acronym +>GM</acronym +>, но с использованием таблицы событий midi &kmid; она звучит даже лучше, чем многие звуковые карты (включая AWE :-)), в соответствии с качеством звучания внешних синтезаторов (даже тех, которые не являются <acronym +>GM</acronym +>-совместимыми). </para> + +</sect1> + +<sect1 id="creating-a-midi-map"> +<title +>Создание таблицы событий midi</title> + +<para +>Программы, созданной для создания таблиц событий midi, не существует, поэтому вам придётся редактировать файл вручную (используя ваш любимый текстовый редактор). </para> + +<para +>Таблица событий midi - это текстовый файл, содержащий все необходимые переводы, которые будут сделаны во время воспроизведения музыки. </para> + +<para +>Он состоит из четырёх секций: <literal +>PATCHMAP</literal +>, <literal +>KEYMAP</literal +>, <literal +>CHANNELMAP</literal +> и <literal +>OPTIONS</literal +>. </para> + +<para +>Каждая секция должна встречаться только однажды, исключая секцию <literal +>KEYMAP</literal +>, которая может вставляться столько раз, сколько необходимо - каждая из них использует разные текстовые идентификаторы - имена (детали см. далее). </para> + +<para +>Общая структура таблицы событий midi: </para> + +<screen +>DEFINE PATCHMAP +... +END + +DEFINE KEYMAP "Название таблицы клавиш" +... +END + +DEFINE KEYMAP "Название другой таблицы клавиш" +... +END + +DEFINE CHANNELMAP +... +END + +OPTIONS +... +END +</screen> + +<para +>Вы можете видеть, что слово <literal +>DEFINE</literal +> используется, чтобы установить начало секции (исключая <literal +>OPTIONS</literal +>). В конце каждой секции ставится слово <literal +>END</literal +>. </para> + +<para +>Чтобы ввести комментарий, начните строку с символа <literal +>#</literal +>. </para> + +<para +>Пожалуйста, не забудьте выслать мне вашу таблицу событий midi по электронной почте, чтобы следующие версии &kmid; включали поддержку большего количества клавиатур, не являющихся General Midi - совместимыми. </para> + +<sect2 id="the-patchmap-section"> +<title +>Секция <literal +>PATCHMAP</literal +></title> + +<para +>Эта секция используется, чтобы установить соответствие между патчами GM и вашей клавиатуры. Использование: </para> + +<screen +>(Название патча GM)=(<replaceable +>N</replaceable +>) [AllKeysTo M] +</screen> + +<para +>Здесь <replaceable +>N</replaceable +> - номер, который ваша клавиатура должна получить, чтобы сменить патч на соответствующий стандарту GM. </para> + +<para +>Обратите внимание, что название патча (слева от знака равенства) игнорируется, так как предполагается, что патчи идут в порядке от 0 до 127. Поэтому вам не следует менять порядок строк, чтобы не пропустить какой-либо из 128 инструментов. </para> + +<para +>Секция <literal +>AllKeysTo M</literal +> используется, чтобы отнести все ноты, воспроизводимые этим инструментом, к клавише <literal +>M</literal +>. Пример: предположим, что ваша клавиатура не включает звук Выстрел (по стандарту GM - патч 127), и вы хотите отнести его к барабану (клавиша 60), звучание которого похоже на выстрел. Тогда в 127-й строке секции <literal +>PATCHMAP</literal +> вам следует ввести следующее: </para> + +<screen +>Gunshot =100 AllKeysTo 60</screen> + + +<para +>Когда файл midi пытается воспроизвести звук с помощью патча 127 (выстрел), сигнал будет переназначен на патч 100 (патч ударных вашей клавиатуры), на котором будет воспроизведена нота 60 (вне зависимости от ноты, которая должна была быть воспроизведена). </para> + +<para +>Обратите внимание, что когда я использую выражение <quote +>Ударные</quote +>, я имею в виду патч, в котором каждая клавиша соответствует отдельному инструменту - барабану, цимбалам и т. д., а не отдельному звуку барабана, отличающегося от других только тоном, как на некоторых клавиатурах. </para> + +</sect2> + +<sect2 id="The-keymap-section"> +<title +>Секция <literal +>KEYMAP</literal +></title> + +<para +>Секция <literal +>KEYMAP</literal +> используется, чтобы обозначить соответствие клавиш какого-либо канала или инструмента. Использование: </para> + +<screen +>DEFINE KEYMAP "Название таблицы клавиш" +C 0 =0 +C#0 =1 +D 0 =2 +... +END +</screen> + +<para +>Как и в секции <literal +>PATCHMAP</literal +>, здесь очень важен порядок строк, и необходимо, чтобы все они (128 клавиш) были указаны. </para> + +<para +>Так как вы можете задать несколько таблиц клавиш для разных каналов и инструментов, вы должны присвоить всем различные имена (задаётся в первой строке). </para> + +<para +>В таблицы клавиш обычно вносятся клавиши канала ударных. Примеры - в таблицах событий midi, включённых в дистрибутив. </para> + +</sect2> + +<sect2 id="the-channelmap-section"> +<title +>Секция <literal +>CHANNELMAP</literal +></title> + +<para +>Эта секция используется, чтобы изменить некоторые каналы на другие. Например, если вы хотите поменять местами первый и второй канал, вы легко можете это сделать в секции <literal +>CHANNELMAP</literal +>. </para> + +<para +>Однако эта секция наиболее полезна для клавиатур, для которых необходимо указать номер канала ударных (по стандарту GM это канал 10, но некоторые клавиатуры используют канал 16, а некоторые - канал 9). </para> + +<para +>Обратите внимание, что устройства midi используют 16 каналов, поэтому секция <literal +>CHANNELMAP</literal +> должна включать 16 строк, от 0 до 15. Использование: </para> + +<screen +>(N) = (M) [Keymap "Name"] [ForcePatch x] +</screen> + +<para +>Здесь <literal +>N</literal +> - канал, который будет заменяться на канал <literal +>M</literal +>. Если используется опция <literal +>Keymap</literal +>, то на этом канале будет использоваться таблица клавиш с именем <literal +>Name</literal +> (эту таблицу необходимо внести перед этой секцией в файл map!). Если используется опция <literal +>ForcePatch</literal +>, все события, которые пытаются сменить патч на этом канале, будут игнорироваться, патч <literal +>x</literal +> будет использоваться постоянно. </para> + +<para +>Опция <literal +>ForcePatch</literal +> может быть полезной, если вы, например, хотите всегда использовать патч ударных на канале ударных. </para> + +</sect2> + +<sect2 id="the-options-section"> +<title +>Секция <literal +>OPTIONS</literal +></title> + +<para +>Секция <literal +>OPTIONS</literal +> включает некоторые основные опции, которые могут быть очень полезными: </para> + +<screen +>OPTIONS +PitchBenderRatio = r +MapExpressionToVolumeEvents +END +</screen> + +<para +>Вы можете указывать обе опции, только одну, либо ни одной. </para> + +<para +>Значение, указанное в <literal +>PitchBenderRatio r</literal +> определяет, во сколько раз будет увеличена высота звука. Когда файл midi пытается установить высоту звука <literal +>n</literal +>, будет установлено значение <literal +>n*(r/4096)</literal +> (значение <literal +>4096</literal +> введено, чтобы вам не приходилось ставить десятичные значения в файле map). </para> + +<para +>Это используется, так как стандарт <acronym +>GM</acronym +> говорит, что когда клавиатура midi получает сигнал увеличения высоты со значением 4096, следует увеличить ноту на более высокую, но некоторые клавиатуры при получении 4096 повышают исходную ноту на 2 или больше (иногда даже на октаву!). Это можно легко исправить, перепробовав различные значения, чтобы вместо 4096 KMid посылала соответствующее значение. </para> + +<para +>Если в файле map установлена опция <literal +>MapExpressionToVolumeEvents</literal +> и файл midi пытается послать событие выражения, KMid посылает событие громкости - его понимает большее количество клавиатур, не соответствующих стандарту GM, и он производит похожий эффект. Многие файлы midi используют событие выражения в конце песни, что производит эффект затухания, так что если вы чувствуете, что музыка должна воспроизводиться всё мягче и мягче, вы можете включить эту опцию и поглядеть, это ли вам было нужно - ваш синтезатор midi может игнорировать события выражения, потому что не понимает их. </para> + +</sect2> + +</sect1> + +<sect1 id="using-midimaps"> +<title +>Использование таблиц событий midi</title> + +<para +>Чтобы использовать таблицу событий midi, просто откройте диалоговое окно <guilabel +>Настройки midi устройства</guilabel +>, выбрав пункт <guimenuitem +>Настройки midi</guimenuitem +> меню <guimenu +>Настройка</guimenu +>. </para> + +<para +>Затем нажмите на кнопку <guilabel +>Просмотр ...</guilabel +>, выберите файл в диалоговом окне выбора файла и наслаждайтесь музыкой! :-) </para> +</sect1> +</chapter> + +<chapter id="advanced-features"> +<title +>Дополнительные характеристики</title> + +<sect1 id="the-channel-view"> +<title +>Вид каналов</title> + +<para +>В окне Вид каналов показаны несколько клавиатур (каждая соответствует каналу midi). На этих клавиатурах подсвечиваются клавиши, которые соответствуют нотам, воспроизводимым в данный момент, так что вы можете видеть, что играет каждый инструмент. </para> + +<sect2 id="changing-instruments"> +<title +>Изменение инструментов</title> + +<para +>Вы можете использовать окно Вид каналов, чтобы сменить инструмент, который воспроизводится на каждом канале. Каналу соответствует выпадающий список, где вы можете выбрать инструмент. Если вы измените инструмент, цвет индикатора канала сменится с зелёного на красный - это означает, что воспроизводится не инструмент по умолчанию. </para> + +<para +>Если вы хотите вернуться к инструменту по умолчанию, щёлкните по красной кнопке, и он будет автоматически установлен. </para> + +</sect2> + +<sect2 id="changing-the-look"> +<title +>Изменение режима просмотра</title> + +<para +>На данный момент окно Вид каналов может отображать воспроизводимые ноты двумя способами. Вы можете выбрать способ с помощью пункта <guimenuitem +>Настройки вида каналов</guimenuitem +> меню <guimenu +>Настройка</guimenu +>. </para> + +<para +>Вы можете выбирать между режимом, в котором нажатые клавиши (соответствующие воспроизводимым нотам) показаны как на обычном рояле (режим <guilabel +>Объёмное</guilabel +>) и режимом, в котором клавиши к тому же выделяются красным цветом - легче для восприятия (режим <guilabel +>Объёмное с заполнением</guilabel +>). Если вы играете на рояле или каком-либо другом музыкальном инструменте, вы можете использовать этот режим, чтобы научиться играть эту музыку самому. Я использовал эту технику и считаю её (если использовать с замедлением темпа) удобной для разучивания новых композиций. </para> + +</sect2> + +</sect1> + +<sect1 id="the-tempo-lcd"> +<title +><acronym +>Индикатор</acronym +> темпа</title> + +<para +>Он показывает темп, в котором воспроизводится песня, т. е. скорость воспроизведеиня. Чем выше показанное число, тем быстрее воспроизводится песня. </para> + +<para +>Вы можете менять темп воспроизведения песни, так что если песня играет слишком быстро и вы не можете следить за текстом, вы можете замедлить скорость. Чтобы сменить темп, используйте стрелки, расположенные с двух сторон <acronym +>индикатора</acronym +>. </para> + +<para +>Вы можете восстановить скорость воспроизведения, установленную по умолчанию, дважды щёлкнув по <acronym +>индикатору</acronym +>. </para> + +</sect1> + +</chapter> + +<chapter id="key-bindings"> +<title +>Привязки клавиш</title> + +<informaltable> +<tgroup cols="2"> +<thead> +<row> +<entry +>Клавиша</entry> +<entry +>Действие</entry> +</row> +</thead> +<tbody> +<row> +<entry +><keycap +>Пробел</keycap +></entry> +<entry +>Воспроизводить загруженную песню, если она не воспроизводится, если воспроизводится - приостановить.</entry> +</row> +<row> +<entry +><keycap +>Backspace</keycap +></entry> +<entry +>Остановить воспроизведение</entry> +</row> +<row> +<entry +><keycap +>Стрелка вправо</keycap +></entry> +<entry +>Следующая песня текущей коллекции</entry> +</row> +<row> +<entry +><keycap +>Стрелка влево</keycap +></entry> +<entry +>Предыдущая песня текущей коллекции</entry> +</row> +<row> +<entry +><keycap +>Стрелка вверх</keycap +></entry> +<entry +>Пролистнуть текст песни на одну строку вверх</entry> +</row> +<row> +<entry +><keycap +>Стрелка вниз</keycap +></entry> +<entry +>Пролистнуть текст песни на одну строку вниз</entry> +</row> +<row> +<entry +><keycap +>Page Up</keycap +></entry> +<entry +>Пролистнуть текст песни на одну страницу вверх</entry> +</row> +<row> +<entry +><keycap +>Page Down</keycap +></entry> +<entry +>Пролистнуть текст песни на одну страницу вниз</entry> +</row> +<row> +<entry +><keycap +>1</keycap +></entry> +<entry +>Отображать сообщения</entry> +</row> +<row> +<entry +><keycap +>2</keycap +></entry> +<entry +>Отображать текст песни</entry> +</row> +<row> +<entry +><keycombo action="simul" +>&Ctrl;<keycap +>O</keycap +></keycombo +></entry> +<entry +>Открыть песню</entry> +</row> +<row> +<entry +><keycombo action="simul" +>&Ctrl;<keycap +>Q</keycap +></keycombo +></entry> +<entry +>Выйти из &kmid;</entry> +</row> +<row> +<entry +><keycap +>F1</keycap +></entry> +<entry +>Открыть этот документ</entry> +</row> +</tbody> +</tgroup> +</informaltable> + +</chapter> + +<chapter id="frequently-asked-questions"> +<title +>Вопросы и ответы</title> + +<qandaset> +<qandaentry> +<question> +<para +>Что такое файл midi? </para> +</question> + +<answer> +<para +>Файл midi - это файл, который содержит информацию о том, как воспроизводить песню, то есть содержит ноты, информацию о ритме, скорости воспроизведения и т. д. Это значит, что один и тот же файл midi, проигрываемый на двух различных устройствах, может звучать по-разному, так же как два музыканта по-разному играют музыку по одним и тем же нотам. </para> +</answer> +</qandaentry> + +<qandaentry> +<question> +<para +>Я получаю лучший звук, используя проигрыватель mp3/wav, зачем мне &kmid;? </para> +</question> +<answer> +<para +>Что ж, я не могу принудить вас использовать &kmid;, но типичный файл midi занимает 50 Кб, а файл mp3 - 4 Мб (т. е. соотношение объёмов - 1:80 :-) . С хорошим синтезатором вы получаете качество, сравнимое с mp3. Более того, используя файл midi, вы можете изменять отдельные инструменты, скорость воспроизведения и т. д., то есть вы лучше контролируете воспроизведение. </para> +</answer> +</qandaentry> + +<qandaentry> +<question> +<para +>Моя карта AWE не работает с KMid, что мне делать? </para> +</question> +<answer> +<para +>Это может произойти, если вы устанавливали &kmid; с двоичного дистрибутива (rpm,deb). Дело в том, что &kmid; компилируется без поддержки awe. Если карта не работает, вам нужно скачать исходные коды (например, с <ulink url="http://www.arrakis.es/~rlarrosa/kmid.html" +>домашней страницы &kmid;</ulink +>) </para> +</answer> +</qandaentry> + +<qandaentry> +<question> +<para +>Я хочу добавить в коллекцию весь каталог, но добавлять файлы по одному мне не очень весело. </para> +</question> + +<answer> +<para +>Согласен с этим, поэтому &kmid; поддерживает механизм Drag & Drop. В окне &konqueror; откройте каталог, который вы хотите добавить, выберите все файлы и перетащите их в окно &kmid;. </para> +<para +>Перед этим убедитесь, что опция <guimenuitem +>Автоматически добавлять в коллекцию</guimenuitem +> включена - это необходимо, чтобы файлы были добавлены в текущую коллекцию. Если вы этого не сделаете, файлы будут добавлены во Временную коллекцию. </para> +</answer> +</qandaentry> + +<qandaentry> +<question> +<para +>Я не могу следить за текстом песни, она воспроизводится слишком быстро! </para> +</question> +<answer> +<para +>Нажмите на стрелку слева <acronym +>индикатора</acronym +> темпа, чтобы замедлить воспроизведение. Чтобы вернуться к темпу по умолчанию, дважды щёлкните по <acronym +>индикатору</acronym +>. </para +> +</answer> +</qandaentry> +</qandaset> + +</chapter> + +<chapter id="final-notes"> +<title +>Дополнительные заметки</title> + +<sect1 id="some-tips-and-tricks"> +<title +>Полезные советы</title> + +<para +>Я включил некоторые советы, чтобы вы могли полностью использовать возможности &kmid;: </para> + +<variablelist> +<varlistentry> +<term +>Как открывать файлы</term> +<listitem> +<para +>На рабочем столе &kde; я всегда открываю окно &konqueror; в моей корневой папке файлов midi вместе с &kmid;. Когда активная коллекция заканчивается, или я хочу прослушать какой-либо файл, я просто переключаюсь на окно &konqueror;, выбираю желаемые файлы и перетаскиваю их в окно &kmid;. </para> + +<para +>Предположим, что вы хотите воспроизвести некоторые файлы midi, но не хотите добавлять их в какую-либо коллекцию - просто выключите опцию <guimenuitem +>Автоматически добавлять в коллекцию</guimenuitem +> в меню <guimenu +>Коллекции</guimenu +> и открывайте файлы, они будут добавлены во Временную коллекцию. </para> +</listitem> +</varlistentry> + +<varlistentry> +<term +>Другой метод создания новой коллекции</term> +<listitem> +<para +>Предположим, что у вас есть midi файлы <filename +>A.mid</filename +>, <filename +>B.mid</filename +> и <filename +>C.mid</filename +>. Сначала вы хотели воспроизвести только первый файл, так что вы выключили опцию <guimenuitem +>Автоматически добавлять в коллекцию</guimenuitem +> и открыли <filename +>A.mid</filename +>. После этого во Временной коллекции находится только один файл midi. </para> +<para +>Затем вы решаете воспроизвести также B и C, и создать коллекцию, включающую все эти файлы - что нужно сделать? </para> +<para +>Просто выберите опцию <guimenuitem +>Автоматически добавлять в коллекцию</guimenuitem +> и откройте <filename +>B.mid</filename +> и <filename +>C.mid</filename +> (любым из нескольких методов) - они будут автоматически добавлены во Временную коллекцию, в которой после этого будут находиться <filename +>A.mid</filename +>, <filename +>B.mid</filename +> и <filename +>C.mid</filename +>. После этого откройте диалог <guilabel +>Менеджер коллекций</guilabel +>, выберите Временную коллекцию, щёлкните по кнопке <literal +>Копировать</literal +>, введите название новой коллекции, и всё готово. У вас есть новая коллекция, включающая midi файлы A, B и C, и она не будет удалена после того, как вы выйдете из &kmid;. </para> +</listitem> +</varlistentry> +</variablelist> + +</sect1> + +<sect1 id="hall-of-kmids-friends"> +<title +>Зал друзей &kmid;</title> + +<para +>Некоторые люди отправляли мне файл midi или открытку, спасибо всем! Прослушивание этих песен и просмотр этих открыток помогут мне в дальнейшем программировании &kmid;. </para> + +<itemizedlist> +<listitem> +<para +>Ola Sigurdson - <literal +>Taking Care of Business</literal +> (Bachman Turner Overdrive)</para> +</listitem> +<listitem> +<para +>EG Lim - Очень красивая открытка из Пенанга.</para> +</listitem> +<listitem> +<para +>Guenther Starnberger - <literal +>Amadeus</literal +> (Falco) и <literal +>Schrei Nach Liebe</literal +> (Die Aerzte)</para> +</listitem> +<listitem> +<para +>Leandro Terrés - <literal +>All That She Wants</literal +> и <literal +>The Sign</literal +> (Ace of Base)</para> +</listitem> +<listitem> +<para +>Nick Stoic - Два midi файла</para> +</listitem> +</itemizedlist> + +</sect1> + +<sect1 id="about-the-author"> +<title +>Об авторе</title> + +<para +>Автор &kmid; - Antonio Larrosa Jiménez, из Málaga (Испания). Я изучаю математику в Университете Málaga, в данный момент я на третьем курсе, так что на мои увлечения у меня остаётся не очень много времени, но я всегда стараюсь выкроить немного :-) . Мои увлечения: программирование, коллекционирование файлов midi, слушание музыки и доказывание теорем ;-). </para> + +<para +>Если вы хотите узнать, где можно скачать файлы midi/karaoke, имеете вопрос, данные об ошибке в программе, идею, хотите сказать, что ещё вы бы хотели видеть в &kmid; или хотите просто сделать мне приятное, пишите мне по адресу <email +>larrosa@kde.org</email +> или <email +>antlarr@arrakis.es</email +> </para> + +<para +>или пишите обычной почтой: </para> + +<literallayout +>Antonio Larrosa Jimenez +Rio Arnoya 10 5B +Malaga (Spain) +</literallayout> + +<para +>Вы доставите мне большое удовольствие, если отправите мне открытку из того места, где вы живёте, или файл midi/karaoke музыкальной группы вашей страны. Каждый, кто вышлет мне открытку или файл midi, будет добавлен в Зал друзей &kmid; (если будет не против). Пожалуйста, свяжитесь со мной перед тем, как высылать файлы midi, потому что такие могут у меня уже быть. </para> + +<para +>Я хочу обратить ваше внимание на то, что программа &kmid; была полностью создана в свободное время без какой-либо денежной поддержки - ни от организаций, ни от частных лиц. Так что, пожалуйста, помните, когда используете программу, о том, что единственное, что заставляло меня работать над ней - обратная связь от её пользователей (открытка или просто письмо). </para> + +<para +>Я хочу поблагодарить следующих людей за помощь в разработке &kmid;: </para> + +<itemizedlist> +<listitem> +<para +>Paul J. Leonard <email +>P.J.Leonard@bath.ac.uk</email +> - Поддержка карт AWE </para> +</listitem> +<listitem> +<para +>Sebestyen Zoltan <email +>szoli@digo.inf.elte.hu</email +>- перенос на FreeBSD и тестирование AWE </para> +</listitem> +<listitem> +<para +>Christian Esken <email +>esken@kde.org</email +> - за организацию усилий KDE multimedia </para> +</listitem> +<listitem> +<para +>Stephan Kulow <email +>coolo@kde.org</email +>- Настройка скриптов и помощь с <command +>automake</command +> и <command +>CVS</command +> </para> +</listitem> +<listitem> +<para +>Jaroslav Kysela - Помощь в поддержке драйвера &Linux; Ultrasound Project </para> +</listitem> +<listitem> +<para +>Takashi Iwai and Joseph H. Buehler - исправление слишком большой высоты звука карт AWE </para> +</listitem> +<listitem> +<para +>Adrian Knoth - За хорошие новости и большое количество предложений </para> +</listitem> +<listitem> +<para +>Kevin Street - Патч для поддержки FreeBSD 3.0 </para> +</listitem> +<listitem> +<para +>Также спасибо Jose Luis Sanchez за поддержку карт GUS, Ignacio Garcia за тестирование поддержки AWE, Hans Petter Bieker, Ola Sigurdson, Marc Diefenbruch, Peter Gritsch, Magnus Pfeffer, Urko Lusa, Peter-Paul Witta, Thorsten Westheider, Ulrich Cordes и всем, кто послал мне патч, сообщение об ошибке, или просто электронное письмо, что поддерживало меня. </para> +</listitem> +<listitem> +<para +>И конечно, всем потрясающим музыкантам в сети, которые дают нам чудесные файлы midi и karaoke. </para> +</listitem> +</itemizedlist> + +<para +>Перевод на русский: Иван Кашуков <email +>dolphin210@yandex.ru</email +></para +> + +</sect1> + +<sect1 id="copyright-and-license"> +<title +>Авторские права и лицензирование</title> + +<para +>Авторские права на &kmid; принадлежат Antonio Larrosa Jiménez, 1999-2001</para> + +<para +>Авторские права на документацию Antonio Larrosa Jiménez 1999, 2001</para> +&underFDL; &underGPL; </sect1> + +</chapter> + +<appendix id="installation"> +<title +>Установка</title> + +<sect1 id="how-to-obtain-kmid"> +<title +>Где взять &kmid;</title> +&install.intro.documentation; <para +>&kmid; можно взять с её домашней страницы - <ulink url="http://www.arrakis.es/~rlarrosa/kmid.html" +> http://www.arrakis.es/~rlarrosa/kmid.html</ulink +>. Здесь вы сможете включиться в разработку программы, получить некоторую информацию о ней, снимки, список страниц, откуда вы сможете скачать песни karaoke и т. д. </para> + +</sect1> + +<sect1 id="requirements"> +<title +>Системные требования</title> + +<para +>Для работы &kmid; необходимо:</para> + +<itemizedlist> +<listitem> +<para +>&kde;. Что ж, возможно, это у вас уже есть :-) </para> +</listitem> +<listitem> +<para +>Звуковая карта. Рекомендуется хорошая звуковая карта и/или внешний синтезатор, так как качество звука в большой степени зависит от звуковой карты: воспроизводить музыку, используя устройство FM - это не то же, что использование карты AWE. </para> + +<para +>Если у вас нет звуковой карты, вы можете скомпилировать &kmid; с опцией <literal +>MODE_DEMO_ONLYVISUAL</literal +>, и программа будет работать так, как если бы она была (но музыка, конечно, воспроизводиться не будет :-( ). </para> +</listitem> +</itemizedlist> + +</sect1> + +<sect1 id="compilation-and-installation"> +<title +>Компиляция и установка</title> +&install.compile.documentation; <para +>Я включил некоторые примеры, которые устанавливаются в каталог <filename class="directory" +>$dollar;<envar +>KDEDIR</envar +>/share/apps/kmid</filename +> </para> + +<para +>Если возникнет какая-либо проблема, не сомневайтесь связаться с любым из списков рассылки &kde; или выслать отчёт напрямую мне. </para> + +</sect1> + +</appendix> + +</book> +<!-- +Local Variables: +mode: sgml +sgml-omittag: nil +sgml-shorttag: t +End: +--> |