Mercurial > audlegacy
changeset 33:8c64ae514525 trunk
[svn] Remove dead libvisual dir.
author | nenolod |
---|---|
date | Wed, 26 Oct 2005 00:41:18 -0700 |
parents | 8aee6a5bcc70 |
children | ffddef61dd83 |
files | configure.ac libvisual/Makefile.am libvisual/Makefile.in libvisual/libvisual.h libvisual/lv_actor.c libvisual/lv_actor.h libvisual/lv_audio.c libvisual/lv_audio.h libvisual/lv_bin.c libvisual/lv_bin.h libvisual/lv_bmp.c libvisual/lv_bmp.h libvisual/lv_color.c libvisual/lv_color.h libvisual/lv_common.h libvisual/lv_cpu.c libvisual/lv_cpu.h libvisual/lv_endianess.h libvisual/lv_error.c libvisual/lv_error.h libvisual/lv_event.c libvisual/lv_event.h libvisual/lv_fft.c libvisual/lv_fft.h libvisual/lv_input.c libvisual/lv_input.h libvisual/lv_keysym.h libvisual/lv_libvisual.c libvisual/lv_libvisual.h libvisual/lv_list.c libvisual/lv_list.h libvisual/lv_log.c libvisual/lv_log.h libvisual/lv_mem.c libvisual/lv_mem.h libvisual/lv_morph.c libvisual/lv_morph.h libvisual/lv_object.c libvisual/lv_object.h libvisual/lv_palette.c libvisual/lv_palette.h libvisual/lv_param.c libvisual/lv_param.h libvisual/lv_plugin.c libvisual/lv_plugin.h libvisual/lv_random.c libvisual/lv_random.h libvisual/lv_songinfo.c libvisual/lv_songinfo.h libvisual/lv_thread.c libvisual/lv_thread.h libvisual/lv_time.c libvisual/lv_time.h libvisual/lv_transform.c libvisual/lv_transform.h libvisual/lv_types.h libvisual/lv_ui.c libvisual/lv_ui.h libvisual/lv_video.c libvisual/lv_video.h libvisual/lv_video_mmx.c libvisual/lvconfig.h |
diffstat | 62 files changed, 0 insertions(+), 18236 deletions(-) [+] |
line wrap: on
line diff
--- a/configure.ac Tue Oct 25 22:53:38 2005 -0700 +++ b/configure.ac Wed Oct 26 00:41:18 2005 -0700 @@ -606,7 +606,6 @@ audacious/glade/Makefile audacious/images/Makefile libaudacious/Makefile - libvisual/Makefile Output/Makefile Output/OSS/Makefile Output/esd/Makefile
--- a/libvisual/Makefile.am Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,36 +0,0 @@ -## Process this file with automake to generate a Makefile.in - -library_includedir = $(includedir)/libvisual -library_include_HEADERS = lvconfig.h libvisual.h lv_actor.h \ - lv_audio.h lv_bin.h lv_common.h lv_fft.h \ - lv_input.h lv_event.h lv_keysym.h \ - lv_list.h lv_log.h lv_palette.h lv_plugin.h \ - lv_video.h lv_libvisual.h lv_songinfo.h \ - lv_morph.h lv_bmp.h lv_param.h lv_mem.h \ - lv_endianess.h lv_cpu.h lv_color.h \ - lv_time.h lv_random.h lv_error.h lv_ui.h \ - lv_types.h lv_thread.h lv_object.h \ - lv_transform.h - -lib_LTLIBRARIES = libvisual.la - -DEFS = @DEFS@ - -LIBS += -L. -L$(libdir) - -PLUGPATH = $(libdir)/libvisual - -AM_CFLAGS = -DPLUGPATH="\"$(plugindir)/$(VISUALIZATION_PLUGIN_DIR)\"" - -INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/libvisual \ - -I$(top_builddir) -I$(top_builddir)/libvisual - -libvisual_la_LDFLAGS = -export-dynamic -no-undefined - -libvisual_la_SOURCES = lv_actor.c lv_input.c lv_event.c \ - lv_bin.c lv_plugin.c lv_video.c lv_video_mmx.c lv_mem.c \ - lv_audio.c lv_fft.c lv_list.c lv_log.c lv_palette.c \ - lv_libvisual.c lv_songinfo.c lv_morph.c lv_bmp.c lv_param.c \ - lv_cpu.c lv_color.c lv_time.c lv_random.c lv_error.c lv_ui.c \ - lv_thread.c lv_object.c lv_transform.c -
--- a/libvisual/Makefile.in Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,643 +0,0 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 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@ - - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = .. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ -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 = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = libvisual -DIST_COMMON = $(library_include_HEADERS) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ - $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ - $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ - $(top_srcdir)/m4/inttypes-pri.m4 $(top_srcdir)/m4/inttypes.m4 \ - $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lcmessage.m4 \ - $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ - $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/nls.m4 \ - $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/m4/po.m4 \ - $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/stdint_h.m4 \ - $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ - $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac -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 = -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; -am__installdirs = "$(DESTDIR)$(libdir)" \ - "$(DESTDIR)$(library_includedir)" -libLTLIBRARIES_INSTALL = $(INSTALL) -LTLIBRARIES = $(lib_LTLIBRARIES) -libvisual_la_LIBADD = -am_libvisual_la_OBJECTS = lv_actor.lo lv_input.lo lv_event.lo \ - lv_bin.lo lv_plugin.lo lv_video.lo lv_video_mmx.lo lv_mem.lo \ - lv_audio.lo lv_fft.lo lv_list.lo lv_log.lo lv_palette.lo \ - lv_libvisual.lo lv_songinfo.lo lv_morph.lo lv_bmp.lo \ - lv_param.lo lv_cpu.lo lv_color.lo lv_time.lo lv_random.lo \ - lv_error.lo lv_ui.lo lv_thread.lo lv_object.lo lv_transform.lo -libvisual_la_OBJECTS = $(am_libvisual_la_OBJECTS) -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = $(libvisual_la_SOURCES) -DIST_SOURCES = $(libvisual_la_SOURCES) -library_includeHEADERS_INSTALL = $(INSTALL_HEADER) -HEADERS = $(library_include_HEADERS) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -ALLOCA = @ALLOCA@ -ALSA_CFLAGS = @ALSA_CFLAGS@ -ALSA_LIBS = @ALSA_LIBS@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ -AMTAR = @AMTAR@ -AR = @AR@ -ARCH_DEFINES = @ARCH_DEFINES@ -ARCH_X86_FALSE = @ARCH_X86_FALSE@ -ARCH_X86_TRUE = @ARCH_X86_TRUE@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -BEEP_DEFINES = @BEEP_DEFINES@ -BEEP_PATH = @BEEP_PATH@ -BMP_RCPATH = @BMP_RCPATH@ -BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ -CATOBJEXT = @CATOBJEXT@ -CC = @CC@ -CCAS = @CCAS@ -CCASFLAGS = @CCASFLAGS@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DATADIRNAME = @DATADIRNAME@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EFFECT_PLUGINS = @EFFECT_PLUGINS@ -EFFECT_PLUGIN_DIR = @EFFECT_PLUGIN_DIR@ -EGREP = @EGREP@ -ENABLE_AAC_FALSE = @ENABLE_AAC_FALSE@ -ENABLE_AAC_TRUE = @ENABLE_AAC_TRUE@ -ENABLE_MPG123_FALSE = @ENABLE_MPG123_FALSE@ -ENABLE_MPG123_TRUE = @ENABLE_MPG123_TRUE@ -ESD_CFLAGS = @ESD_CFLAGS@ -ESD_LIBS = @ESD_LIBS@ -EXEEXT = @EXEEXT@ -GCONF_CFLAGS = @GCONF_CFLAGS@ -GCONF_LIBS = @GCONF_LIBS@ -GENCAT = @GENCAT@ -GENERAL_PLUGINS = @GENERAL_PLUGINS@ -GENERAL_PLUGIN_DIR = @GENERAL_PLUGIN_DIR@ -GLIBC21 = @GLIBC21@ -GMSGFMT = @GMSGFMT@ -GNOMEVFS_CFLAGS = @GNOMEVFS_CFLAGS@ -GNOMEVFS_LIBS = @GNOMEVFS_LIBS@ -GTK_CFLAGS = @GTK_CFLAGS@ -GTK_LIBS = @GTK_LIBS@ -HAVE_ALSA_FALSE = @HAVE_ALSA_FALSE@ -HAVE_ALSA_TRUE = @HAVE_ALSA_TRUE@ -HAVE_CDROM_FALSE = @HAVE_CDROM_FALSE@ -HAVE_CDROM_TRUE = @HAVE_CDROM_TRUE@ -HAVE_ESD_FALSE = @HAVE_ESD_FALSE@ -HAVE_ESD_TRUE = @HAVE_ESD_TRUE@ -HAVE_GCONF_FALSE = @HAVE_GCONF_FALSE@ -HAVE_GCONF_TRUE = @HAVE_GCONF_TRUE@ -HAVE_GNOME_VFS_FALSE = @HAVE_GNOME_VFS_FALSE@ -HAVE_GNOME_VFS_TRUE = @HAVE_GNOME_VFS_TRUE@ -HAVE_LINUX_JOYSTICK_FALSE = @HAVE_LINUX_JOYSTICK_FALSE@ -HAVE_LINUX_JOYSTICK_TRUE = @HAVE_LINUX_JOYSTICK_TRUE@ -HAVE_MIKMOD_FALSE = @HAVE_MIKMOD_FALSE@ -HAVE_MIKMOD_TRUE = @HAVE_MIKMOD_TRUE@ -HAVE_OGGVORBIS_FALSE = @HAVE_OGGVORBIS_FALSE@ -HAVE_OGGVORBIS_TRUE = @HAVE_OGGVORBIS_TRUE@ -HAVE_OSS_FALSE = @HAVE_OSS_FALSE@ -HAVE_OSS_TRUE = @HAVE_OSS_TRUE@ -HAVE_SOLARIS_FALSE = @HAVE_SOLARIS_FALSE@ -HAVE_SOLARIS_TRUE = @HAVE_SOLARIS_TRUE@ -HAVE_SUN_FALSE = @HAVE_SUN_FALSE@ -HAVE_SUN_TRUE = @HAVE_SUN_TRUE@ -ID3LIBS = @ID3LIBS@ -INPUT_PLUGINS = @INPUT_PLUGINS@ -INPUT_PLUGIN_DIR = @INPUT_PLUGIN_DIR@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -INSTOBJEXT = @INSTOBJEXT@ -INTLBISON = @INTLBISON@ -INTLLIBS = @INTLLIBS@ -INTLOBJS = @INTLOBJS@ -INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ -LDFLAGS = @LDFLAGS@ -LIBBEEP_MAJOR_VERSION = @LIBBEEP_MAJOR_VERSION@ -LIBBEEP_MICRO_VERSION = @LIBBEEP_MICRO_VERSION@ -LIBBEEP_MINOR_VERSION = @LIBBEEP_MINOR_VERSION@ -LIBGLADE_CFLAGS = @LIBGLADE_CFLAGS@ -LIBGLADE_LIBS = @LIBGLADE_LIBS@ -LIBICONV = @LIBICONV@ -LIBINTL = @LIBINTL@ -LIBMIKMOD_CFLAGS = @LIBMIKMOD_CFLAGS@ -LIBMIKMOD_CONFIG = @LIBMIKMOD_CONFIG@ -LIBMIKMOD_LDADD = @LIBMIKMOD_LDADD@ -LIBMIKMOD_LIBS = @LIBMIKMOD_LIBS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -L. -L$(libdir) -LIBTOOL = @LIBTOOL@ -LN_S = @LN_S@ -LTLIBICONV = @LTLIBICONV@ -LTLIBINTL = @LTLIBINTL@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKINSTALLDIRS = @MKINSTALLDIRS@ -MSGFMT = @MSGFMT@ -MSGMERGE = @MSGMERGE@ -OBJEXT = @OBJEXT@ -OGG_VORBIS_CFLAGS = @OGG_VORBIS_CFLAGS@ -OGG_VORBIS_LIBS = @OGG_VORBIS_LIBS@ -OUTPUT_PLUGINS = @OUTPUT_PLUGINS@ -OUTPUT_PLUGIN_DIR = @OUTPUT_PLUGIN_DIR@ -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@ -PC_REQUIRES = @PC_REQUIRES@ -PKG_CONFIG = @PKG_CONFIG@ -PLUGIN_LDFLAGS = @PLUGIN_LDFLAGS@ -POSUB = @POSUB@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ -USE_NLS = @USE_NLS@ -USE_SIMD_FALSE = @USE_SIMD_FALSE@ -USE_SIMD_TRUE = @USE_SIMD_TRUE@ -USE_X86ASM_FALSE = @USE_X86ASM_FALSE@ -USE_X86ASM_TRUE = @USE_X86ASM_TRUE@ -VERSION = @VERSION@ -VISUALIZATION_PLUGINS = @VISUALIZATION_PLUGINS@ -VISUALIZATION_PLUGIN_DIR = @VISUALIZATION_PLUGIN_DIR@ -XGETTEXT = @XGETTEXT@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -beepdir = @beepdir@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -datadir = @datadir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -plugindir = @plugindir@ -pluginsubs = @pluginsubs@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -library_includedir = $(includedir)/libvisual -library_include_HEADERS = lvconfig.h libvisual.h lv_actor.h \ - lv_audio.h lv_bin.h lv_common.h lv_fft.h \ - lv_input.h lv_event.h lv_keysym.h \ - lv_list.h lv_log.h lv_palette.h lv_plugin.h \ - lv_video.h lv_libvisual.h lv_songinfo.h \ - lv_morph.h lv_bmp.h lv_param.h lv_mem.h \ - lv_endianess.h lv_cpu.h lv_color.h \ - lv_time.h lv_random.h lv_error.h lv_ui.h \ - lv_types.h lv_thread.h lv_object.h \ - lv_transform.h - -lib_LTLIBRARIES = libvisual.la -PLUGPATH = $(libdir)/libvisual -AM_CFLAGS = -DPLUGPATH="\"$(plugindir)/$(VISUALIZATION_PLUGIN_DIR)\"" -INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/libvisual \ - -I$(top_builddir) -I$(top_builddir)/libvisual - -libvisual_la_LDFLAGS = -export-dynamic -no-undefined -libvisual_la_SOURCES = lv_actor.c lv_input.c lv_event.c \ - lv_bin.c lv_plugin.c lv_video.c lv_video_mmx.c lv_mem.c \ - lv_audio.c lv_fft.c lv_list.c lv_log.c lv_palette.c \ - lv_libvisual.c lv_songinfo.c lv_morph.c lv_bmp.c lv_param.c \ - lv_cpu.c lv_color.c lv_time.c lv_random.c lv_error.c lv_ui.c \ - lv_thread.c lv_object.c lv_transform.c - -all: all-am - -.SUFFIXES: -.SUFFIXES: .c .lo .o .obj -$(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 libvisual/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu libvisual/Makefile -.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 -install-libLTLIBRARIES: $(lib_LTLIBRARIES) - @$(NORMAL_INSTALL) - test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)" - @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ - if test -f $$p; then \ - f=$(am__strip_dir) \ - echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \ - $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \ - else :; fi; \ - done - -uninstall-libLTLIBRARIES: - @$(NORMAL_UNINSTALL) - @set -x; list='$(lib_LTLIBRARIES)'; for p in $$list; do \ - p=$(am__strip_dir) \ - echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \ - $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \ - done - -clean-libLTLIBRARIES: - -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) - @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done -libvisual.la: $(libvisual_la_OBJECTS) $(libvisual_la_DEPENDENCIES) - $(LINK) -rpath $(libdir) $(libvisual_la_LDFLAGS) $(libvisual_la_OBJECTS) $(libvisual_la_LIBADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lv_actor.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lv_audio.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lv_bin.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lv_bmp.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lv_color.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lv_cpu.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lv_error.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lv_event.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lv_fft.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lv_input.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lv_libvisual.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lv_list.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lv_log.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lv_mem.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lv_morph.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lv_object.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lv_palette.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lv_param.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lv_plugin.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lv_random.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lv_songinfo.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lv_thread.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lv_time.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lv_transform.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lv_ui.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lv_video.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lv_video_mmx.Plo@am__quote@ - -.c.o: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< - -.c.obj: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` - -.c.lo: -@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: -install-library_includeHEADERS: $(library_include_HEADERS) - @$(NORMAL_INSTALL) - test -z "$(library_includedir)" || $(mkdir_p) "$(DESTDIR)$(library_includedir)" - @list='$(library_include_HEADERS)'; for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - f=$(am__strip_dir) \ - echo " $(library_includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(library_includedir)/$$f'"; \ - $(library_includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(library_includedir)/$$f"; \ - done - -uninstall-library_includeHEADERS: - @$(NORMAL_UNINSTALL) - @list='$(library_include_HEADERS)'; for p in $$list; do \ - f=$(am__strip_dir) \ - echo " rm -f '$(DESTDIR)$(library_includedir)/$$f'"; \ - rm -f "$(DESTDIR)$(library_includedir)/$$f"; \ - 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; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - 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; } \ - END { 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: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - 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; } \ - END { 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)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - 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 -check-am: all-am -check: check-am -all-am: Makefile $(LTLIBRARIES) $(HEADERS) -installdirs: - for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(library_includedir)"; do \ - test -z "$$dir" || $(mkdir_p) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -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-am - -clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ - mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: install-library_includeHEADERS - -install-exec-am: install-libLTLIBRARIES - -install-info: install-info-am - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-info-am uninstall-libLTLIBRARIES \ - uninstall-library_includeHEADERS - -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-libLTLIBRARIES clean-libtool ctags distclean \ - distclean-compile distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-exec \ - install-exec-am install-info install-info-am \ - install-libLTLIBRARIES install-library_includeHEADERS \ - install-man install-strip installcheck installcheck-am \ - installdirs maintainer-clean maintainer-clean-generic \ - mostlyclean mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ - uninstall-am uninstall-info-am uninstall-libLTLIBRARIES \ - uninstall-library_includeHEADERS - -# 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:
--- a/libvisual/libvisual.h Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,59 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef LV_LIBVISUAL_H -#define LV_LIBVISUAL_H - -#include <libvisual/lvconfig.h> - -#include <libvisual/lv_endianess.h> -#include <libvisual/lv_time.h> -#include <libvisual/lv_color.h> -#include <libvisual/lv_param.h> -#include <libvisual/lv_cpu.h> -#include <libvisual/lv_bin.h> -#include <libvisual/lv_event.h> -#include <libvisual/lv_keysym.h> -#include <libvisual/lv_actor.h> -#include <libvisual/lv_input.h> -#include <libvisual/lv_audio.h> -#include <libvisual/lv_fft.h> -#include <libvisual/lv_list.h> -#include <libvisual/lv_palette.h> -#include <libvisual/lv_plugin.h> -#include <libvisual/lv_video.h> -#include <libvisual/lv_libvisual.h> -#include <libvisual/lv_songinfo.h> -#include <libvisual/lv_morph.h> -#include <libvisual/lv_transform.h> -#include <libvisual/lv_bmp.h> -#include <libvisual/lv_log.h> -#include <libvisual/lv_random.h> -#include <libvisual/lv_ui.h> -#include <libvisual/lv_error.h> -#include <libvisual/lv_thread.h> -#include <libvisual/lv_object.h> -#include <libvisual/lv_types.h> -#include <libvisual/lv_common.h> - -#endif /* LV_LIBVISUAL_H */
--- a/libvisual/lv_actor.c Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,719 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> - -#include "lvconfig.h" -#include "lv_log.h" -#include "lv_list.h" -#include "lv_actor.h" -#include "lv_mem.h" - -extern VisList *__lv_plugins_actor; - -static int actor_dtor (VisObject *object); - -static VisActorPlugin *get_actor_plugin (VisActor *actor); -static int negotiate_video_with_unsupported_depth (VisActor *actor, int rundepth, int noevent, int forced); -static int negotiate_video (VisActor *actor, int noevent); - - -static int actor_dtor (VisObject *object) -{ - VisActor *actor = VISUAL_ACTOR (object); - - if (actor->plugin != NULL) - visual_plugin_unload (actor->plugin); - - if (actor->transform != NULL) - visual_object_unref (VISUAL_OBJECT (actor->transform)); - - if (actor->fitting != NULL) - visual_object_unref (VISUAL_OBJECT (actor->fitting)); - - visual_object_unref (VISUAL_OBJECT (&actor->songcompare)); - - actor->plugin = NULL; - actor->transform = NULL; - actor->fitting = NULL; - - return VISUAL_OK; -} - -static VisActorPlugin *get_actor_plugin (VisActor *actor) -{ - VisActorPlugin *actplugin; - - visual_log_return_val_if_fail (actor != NULL, NULL); - visual_log_return_val_if_fail (actor->plugin != NULL, NULL); - - actplugin = VISUAL_PLUGIN_ACTOR (actor->plugin->info->plugin); - - return actplugin; -} - -/** - * @defgroup VisActor VisActor - * @{ - */ - -/** - * Gives the encapsulated VisPluginData from a VisActor. - * - * @param actor Pointer of a VisActor of which the VisPluginData needs to be returned. - * - * @return VisPluginData that is encapsulated in the VisActor, possibly NULL. - */ -VisPluginData *visual_actor_get_plugin (VisActor *actor) -{ - return actor->plugin; -} - -/** - * Gives a list of VisActors in the current plugin registry. - * - * @return An VisList containing the VisActors in the plugin registry. - */ -VisList *visual_actor_get_list () -{ - return __lv_plugins_actor; -} - -/** @todo find a way to NOT load, unload the plugins */ - -/** - * Gives the next actor plugin based on the name of a plugin but skips non - * GL plugins. - * - * @see visual_actor_get_prev_by_name_gl - * - * @param name The name of the current plugin or NULL to get the first. - * - * @return The name of the next plugin within the list that is a GL plugin. - */ -const char *visual_actor_get_next_by_name_gl (const char *name) -{ - const char *next = name; - VisPluginData *plugin; - VisPluginRef *ref; - VisActorPlugin *actplugin; - int gl; - - do { - next = visual_plugin_get_next_by_name (visual_actor_get_list (), next); - - if (next == NULL) - return NULL; - - ref = visual_plugin_find (__lv_plugins_actor, next); - plugin = visual_plugin_load (ref); - - actplugin = VISUAL_PLUGIN_ACTOR (plugin->info->plugin); - - if ((actplugin->depth & VISUAL_VIDEO_DEPTH_GL) > 0) - gl = TRUE; - else - gl = FALSE; - - visual_plugin_unload (plugin); - - } while (gl == FALSE); - - return next; -} - -/** - * Gives the previous actor plugin based on the name of a plugin but skips non - * GL plugins. - * - * @see visual_actor_get_next_by_name_gl - * - * @param name The name of the current plugin or NULL to get the last. - * - * @return The name of the previous plugin within the list that is a GL plugin. - */ -const char *visual_actor_get_prev_by_name_gl (const char *name) -{ - const char *prev = name; - VisPluginData *plugin; - VisPluginRef *ref; - VisActorPlugin *actplugin; - int gl; - - do { - prev = visual_plugin_get_prev_by_name (visual_actor_get_list (), prev); - - if (prev == NULL) - return NULL; - - ref = visual_plugin_find (__lv_plugins_actor, prev); - plugin = visual_plugin_load (ref); - actplugin = VISUAL_PLUGIN_ACTOR (plugin->info->plugin); - - if ((actplugin->depth & VISUAL_VIDEO_DEPTH_GL) > 0) - gl = TRUE; - else - gl = FALSE; - - visual_plugin_unload (plugin); - - } while (gl == FALSE); - - return prev; -} - -/** - * Gives the next actor plugin based on the name of a plugin but skips - * GL plugins. - * - * @see visual_actor_get_prev_by_name_nogl - * - * @param name The name of the current plugin or NULL to get the first. - * - * @return The name of the next plugin within the list that is not a GL plugin. - */ -const char *visual_actor_get_next_by_name_nogl (const char *name) -{ - const char *next = name; - VisPluginData *plugin; - VisPluginRef *ref; - VisActorPlugin *actplugin; - int gl; - - do { - next = visual_plugin_get_next_by_name (visual_actor_get_list (), next); - - if (next == NULL) - return NULL; - - ref = visual_plugin_find (__lv_plugins_actor, next); - plugin = visual_plugin_load (ref); - actplugin = VISUAL_PLUGIN_ACTOR (plugin->info->plugin); - - if ((actplugin->depth & VISUAL_VIDEO_DEPTH_GL) > 0) - gl = TRUE; - else - gl = FALSE; - - visual_plugin_unload (plugin); - - } while (gl == TRUE); - - return next; -} - -/** - * Gives the previous actor plugin based on the name of a plugin but skips - * GL plugins. - * - * @see visual_actor_get_next_by_name_nogl - * - * @param name The name of the current plugin or NULL to get the last. - * - * @return The name of the previous plugin within the list that is not a GL plugin. - */ -const char *visual_actor_get_prev_by_name_nogl (const char *name) -{ - const char *prev = name; - VisPluginData *plugin; - VisPluginRef *ref; - VisActorPlugin *actplugin; - int gl; - - do { - prev = visual_plugin_get_prev_by_name (visual_actor_get_list (), prev); - - if (prev == NULL) - return NULL; - - ref = visual_plugin_find (__lv_plugins_actor, prev); - plugin = visual_plugin_load (ref); - actplugin = VISUAL_PLUGIN_ACTOR (plugin->info->plugin); - - if ((actplugin->depth & VISUAL_VIDEO_DEPTH_GL) > 0) - gl = TRUE; - else - gl = FALSE; - - visual_plugin_unload (plugin); - - } while (gl == TRUE); - - return prev; -} - -/** - * Gives the next actor plugin based on the name of a plugin. - * - * @see visual_actor_get_prev_by_name - * - * @param name The name of the current plugin, or NULL to get the first. - * - * @return The name of the next plugin within the list. - */ -const char *visual_actor_get_next_by_name (const char *name) -{ - return visual_plugin_get_next_by_name (visual_actor_get_list (), name); -} - -/** - * Gives the previous actor plugin based on the name of a plugin. - * - * @see visual_actor_get_next_by_name - * - * @param name The name of the current plugin. or NULL to get the last. - * - * @return The name of the previous plugin within the list. - */ -const char *visual_actor_get_prev_by_name (const char *name) -{ - return visual_plugin_get_prev_by_name (visual_actor_get_list (), name); -} - -/** - * Checks if the actor plugin is in the registry, based on it's name. - * - * @param name The name of the plugin that needs to be checked. - * - * @return TRUE if found, else FALSE. - */ -int visual_actor_valid_by_name (const char *name) -{ - if (visual_plugin_find (visual_actor_get_list (), name) == NULL) - return FALSE; - else - return TRUE; -} - -/** - * Creates a new actor from name, the plugin will be loaded but won't be realized. - * - * @param actorname - * The name of the plugin to load, or NULL to simply allocate a new - * actor. - * - * @return A newly allocated VisActor, optionally containing a loaded plugin. Or NULL on failure. - */ -VisActor *visual_actor_new (const char *actorname) -{ - VisActor *actor; - VisPluginRef *ref; - - if (__lv_plugins_actor == NULL && actorname != NULL) { - visual_log (VISUAL_LOG_CRITICAL, "the plugin list is NULL"); - return NULL; - } - - actor = visual_mem_new0 (VisActor, 1); - - /* Do the VisObject initialization */ - visual_object_initialize (VISUAL_OBJECT (actor), TRUE, actor_dtor); - - if (actorname == NULL) - return actor; - - ref = visual_plugin_find (__lv_plugins_actor, actorname); - - actor->plugin = visual_plugin_load (ref); - - return actor; -} - -/** - * Realize the VisActor. This also calls the plugin init function. - * - * @param actor Pointer to a VisActor that needs to be realized. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_ACTOR_NULL, -VISUAL_ERROR_PLUGIN_NULL or - * error values returned by visual_plugin_realize () on failure. - * - */ -int visual_actor_realize (VisActor *actor) -{ - visual_log_return_val_if_fail (actor != NULL, -VISUAL_ERROR_ACTOR_NULL); - visual_log_return_val_if_fail (actor->plugin != NULL, -VISUAL_ERROR_PLUGIN_NULL); - - return visual_plugin_realize (actor->plugin); -} - -/** - * Gives a pointer to the song info data within the VisActor. This song info data can be used - * to set name, artist and even coverart which can be used by the plugins and the framework itself. - * - * @see VisSongInfo - * - * @param actor Pointer to a VisActor of which the song info is needed. - * - * @return Pointer to the song info structure on succes or NULL on failure. - */ -VisSongInfo *visual_actor_get_songinfo (VisActor *actor) -{ - VisActorPlugin *actplugin; - - visual_log_return_val_if_fail (actor != NULL, NULL); - - actplugin = get_actor_plugin (actor); - visual_log_return_val_if_fail (actplugin != NULL, NULL); - - return &actplugin->songinfo; -} - -/** - * Gives a pointer to the palette within the VisActor. This can be needed to set a palette on the target - * display when it's in index mode. - * - * @see VisPalette - * - * @param actor Pointer to a VisActor of which the palette is needed. - * - * @return Pointer to the palette structure on succes or NULL on failure. Also it's possible that NULL - * is returned when the plugin is running in a full color mode or openGL. The returned palette is - * read only. - */ -VisPalette *visual_actor_get_palette (VisActor *actor) -{ - VisActorPlugin *actplugin; - - visual_log_return_val_if_fail (actor != NULL, NULL); - - actplugin = get_actor_plugin (actor); - - if (actplugin == NULL) { - visual_log (VISUAL_LOG_CRITICAL, - "The given actor does not reference any actor plugin"); - return NULL; - } - - if (actor->transform != NULL && - actor->video->depth == VISUAL_VIDEO_DEPTH_8BIT) { - - return actor->ditherpal; - - } else { - return actplugin->palette (visual_actor_get_plugin (actor)); - } - - return NULL; -} - -/** - * This function negotiates the VisActor with it's target video that is set by visual_actor_set_video. - * When needed it also sets up size fitting environment and depth transformation environment. - * - * The function has a few extra arguments that are mainly to be used from within internal code. - * - * This function needs to be called everytime there is a change within either the size or depth of - * the target video. - * - * The main method of calling this function is: "visual_actor_video_negotiate (actor, 0, FALSE, FALSE)" - * - * @see visual_actor_set_video - * - * @param actor Pointer to a VisActor that needs negotiation. - * @param rundepth An depth in the form of the VISUAL_VIDEO_DEPTH_* style when a depth is forced. - * This could be needed when for example a plugin has both a 8 bits and a 32 bits display method - * but while the target video is in 32 bits you still want to run the plugin in 8 bits. If this - * is desired the "forced" argument also needs to be set on TRUE. - * @param noevent When set on TRUE this does only renegotiate depth transformation environments. For example - * when the target display was running in 32 bits and switched to 8 bits while the plugin was already - * in 8 bits it doesn't need an events, which possibly reinitializes the plugin. - * @param forced This should be set if the rundepth argument is set, so it forces the plugin in a certain - * depth. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_ACTOR_NULL, -VISUAL_ERROR_PLUGIN_NULL, -VISUAL_ERROR_PLUGIN_REF_NULL, - * -VISUAL_ERROR_ACTOR_VIDEO_NULL or -VISUAL_ERROR_ACTOR_GL_NEGOTIATE on failure. - */ -int visual_actor_video_negotiate (VisActor *actor, int rundepth, int noevent, int forced) -{ - int depthflag; - - visual_log_return_val_if_fail (actor != NULL, -VISUAL_ERROR_ACTOR_NULL); - visual_log_return_val_if_fail (actor->plugin != NULL, -VISUAL_ERROR_PLUGIN_NULL); - visual_log_return_val_if_fail (actor->plugin->ref != NULL, -VISUAL_ERROR_PLUGIN_REF_NULL); - visual_log_return_val_if_fail (actor->video != NULL, -VISUAL_ERROR_ACTOR_VIDEO_NULL); - - if (actor->transform != NULL) { - visual_object_unref (VISUAL_OBJECT (actor->transform)); - - actor->transform = NULL; - } - - if (actor->fitting != NULL) { - visual_object_unref (VISUAL_OBJECT (actor->fitting)); - - actor->fitting = NULL; - } - - if (actor->ditherpal != NULL) { - visual_object_unref (VISUAL_OBJECT (actor->ditherpal)); - - actor->ditherpal = NULL; - } - - depthflag = visual_actor_get_supported_depth (actor); - - visual_log (VISUAL_LOG_INFO, "negotiating plugin %s", actor->plugin->info->name); - - /* Set up depth transformation enviroment */ - if (visual_video_depth_is_supported (depthflag, actor->video->depth) != TRUE || - (forced == TRUE && actor->video->depth != rundepth)) - /* When the depth is not supported, or if we only switch the depth and not - * the size */ - return negotiate_video_with_unsupported_depth (actor, rundepth, noevent, forced); - else - return negotiate_video (actor, noevent); - - return -VISUAL_ERROR_IMPOSSIBLE; -} - -static int negotiate_video_with_unsupported_depth (VisActor *actor, int rundepth, int noevent, int forced) -{ - VisActorPlugin *actplugin = get_actor_plugin (actor); - int depthflag = visual_actor_get_supported_depth (actor); - - /* Depth transform enviroment, it automaticly - * fits size because it can use the pitch from - * the dest video context */ - actor->transform = visual_video_new (); - - visual_log (VISUAL_LOG_INFO, "run depth %d forced %d\n", rundepth, forced); - - if (forced == TRUE) - visual_video_set_depth (actor->transform, rundepth); - else - visual_video_set_depth (actor->transform, - visual_video_depth_get_highest_nogl (depthflag)); - - visual_log (VISUAL_LOG_INFO, "transpitch1 %d depth %d bpp %d", actor->transform->pitch, actor->transform->depth, - actor->transform->bpp); - /* If there is only GL (which gets returned by highest nogl if - * nothing else is there, stop here */ - if (actor->transform->depth == VISUAL_VIDEO_DEPTH_GL) - return -VISUAL_ERROR_ACTOR_GL_NEGOTIATE; - - visual_video_set_dimension (actor->transform, actor->video->width, actor->video->height); - visual_log (VISUAL_LOG_INFO, "transpitch2 %d %d", actor->transform->width, actor->transform->pitch); - - actplugin->requisition (visual_actor_get_plugin (actor), &actor->transform->width, &actor->transform->height); - visual_log (VISUAL_LOG_INFO, "transpitch3 %d", actor->transform->pitch); - - if (noevent == FALSE) { - visual_event_queue_add_resize (&actor->plugin->eventqueue, actor->transform, - actor->transform->width, actor->transform->height); - visual_plugin_events_pump (actor->plugin); - } else { - /* Normally a visual_video_set_dimension get's called within the - * event handler, but we won't come there right now so we've - * got to set the pitch ourself */ - visual_video_set_dimension (actor->transform, - actor->transform->width, actor->transform->height); - } - - visual_log (VISUAL_LOG_INFO, "rundepth: %d transpitch %d\n", rundepth, actor->transform->pitch); - visual_video_allocate_buffer (actor->transform); - - if (actor->video->depth == VISUAL_VIDEO_DEPTH_8BIT) - actor->ditherpal = visual_palette_new (256); - - return VISUAL_OK; -} - -static int negotiate_video (VisActor *actor, int noevent) -{ - VisActorPlugin *actplugin = get_actor_plugin (actor); - int tmpwidth, tmpheight, tmppitch; - - tmpwidth = actor->video->width; - tmpheight = actor->video->height; - tmppitch = actor->video->pitch; - - /* Pump the resize events and handle all the pending events */ - actplugin->requisition (visual_actor_get_plugin (actor), &actor->video->width, &actor->video->height); - - if (noevent == FALSE) { - visual_event_queue_add_resize (&actor->plugin->eventqueue, actor->video, - actor->video->width, actor->video->height); - - visual_plugin_events_pump (actor->plugin); - } - - /* Size fitting enviroment */ - if (tmpwidth != actor->video->width || tmpheight != actor->video->height) { - actor->fitting = visual_video_new_with_buffer (actor->video->width, - actor->video->height, actor->video->depth); - - visual_video_set_dimension (actor->video, tmpwidth, tmpheight); - } - - /* Set the pitch seen this is the framebuffer context */ - visual_video_set_pitch (actor->video, tmppitch); - - return VISUAL_OK; -} - -/** - * Gives the by the plugin natively supported depths - * - * @param actor Pointer to a VisActor of which the supported depth of it's - * encapsulated plugin is requested. - * - * @return an OR value of the VISUAL_VIDEO_DEPTH_* values which can be checked against using AND on succes, - * -VISUAL_ERROR_ACTOR_NULL, -VISUAL_ERROR_PLUGIN_NULL or -VISUAL_ERROR_ACTOR_PLUGIN_NULL on failure. - */ -int visual_actor_get_supported_depth (VisActor *actor) -{ - VisActorPlugin *actplugin; - - visual_log_return_val_if_fail (actor != NULL, -VISUAL_ERROR_ACTOR_NULL); - visual_log_return_val_if_fail (actor->plugin != NULL, -VISUAL_ERROR_PLUGIN_NULL); - - actplugin = get_actor_plugin (actor); - - if (actplugin == NULL) - return -VISUAL_ERROR_ACTOR_PLUGIN_NULL; - - return actplugin->depth; -} - -/** - * Used to connect the target display it's VisVideo structure to the VisActor. - * - * Using the visual_video methods the screenbuffer, it's depth and dimension and optionally it's pitch - * can be set so the actor plugins know about their graphical environment and have a place to draw. - * - * After this function it's most likely that visual_actor_video_negotiate needs to be called. - * - * @see visual_video_new - * @see visual_actor_video_negotiate - * - * @param actor Pointer to a VisActor to which the VisVideo needs to be set. - * @param video Pointer to a VisVideo which contains information about the target display and the pointer - * to it's screenbuffer. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_ACTOR_NULL on failure. - */ -int visual_actor_set_video (VisActor *actor, VisVideo *video) -{ - visual_log_return_val_if_fail (actor != NULL, -VISUAL_ERROR_ACTOR_NULL); - - actor->video = video; - - return VISUAL_OK; -} - -/** - * This is called to run a VisActor. It also pump it's events when needed, checks for new song events and also does the fitting - * and depth transformation actions when needed. - * - * Every run cycle one frame is created, so this function needs to be used in the main draw loop of the application. - * - * @param actor Pointer to a VisActor that needs to be runned. - * @param audio Pointer to a VisAudio that contains all the audio data. - * - * return VISUAL_OK on succes, -VISUAL_ERROR_ACTOR_NULL, -VISUAL_ERROR_ACTOR_VIDEO_NULL, -VISUAL_ERROR_NULL or - * -VISUAL_ERROR_ACTOR_PLUGIN_NULL on failure. - */ -int visual_actor_run (VisActor *actor, VisAudio *audio) -{ - VisActorPlugin *actplugin; - VisPluginData *plugin; - VisVideo *video; - VisVideo *transform; - VisVideo *fitting; - - /* We don't check for video, because we don't always need a video */ - /* - * Really? take a look at visual_video_set_palette bellow - */ - visual_log_return_val_if_fail (actor != NULL, -VISUAL_ERROR_ACTOR_NULL); - visual_log_return_val_if_fail (actor->video != NULL, -VISUAL_ERROR_ACTOR_VIDEO_NULL); - visual_log_return_val_if_fail (audio != NULL, -VISUAL_ERROR_NULL); - - actplugin = get_actor_plugin (actor); - plugin = visual_actor_get_plugin (actor); - - if (actplugin == NULL) { - visual_log (VISUAL_LOG_CRITICAL, - "The given actor does not reference any actor plugin"); - - return -VISUAL_ERROR_ACTOR_PLUGIN_NULL; - } - - /* Songinfo handling */ - if (visual_songinfo_compare (&actor->songcompare, &actplugin->songinfo) == FALSE) { - visual_songinfo_mark (&actplugin->songinfo); - - visual_event_queue_add_newsong ( - visual_plugin_get_eventqueue (plugin), - &actplugin->songinfo); - - visual_songinfo_free_strings (&actor->songcompare); - visual_songinfo_copy (&actor->songcompare, &actplugin->songinfo); - } - - video = actor->video; - transform = actor->transform; - fitting = actor->fitting; - - /* - * This needs to happen before palette, render stuff, always, period. - * Also internal vars can be initialized when params have been set in init on the param - * events in the event loop. - */ - visual_plugin_events_pump (actor->plugin); - - visual_video_set_palette (video, visual_actor_get_palette (actor)); - - /* Set the palette to the target video */ - video->pal = visual_actor_get_palette (actor); - - /* Yeah some transformation magic is going on here when needed */ - if (transform != NULL && (transform->depth != video->depth)) { - actplugin->render (plugin, transform, audio); - - if (transform->depth == VISUAL_VIDEO_DEPTH_8BIT) { - visual_video_set_palette (transform, visual_actor_get_palette (actor)); - visual_video_depth_transform (video, transform); - } else { - visual_video_set_palette (transform, actor->ditherpal); - visual_video_depth_transform (video, transform); - } - } else { - if (fitting != NULL && (fitting->width != video->width || fitting->height != video->height)) { - actplugin->render (plugin, fitting, audio); - visual_video_blit_overlay (video, fitting, 0, 0, FALSE); - } else { - actplugin->render (plugin, video, audio); - } - } - - return VISUAL_OK; -} - -/** - * @} - */ -
--- a/libvisual/lv_actor.h Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,102 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _LV_ACTOR_H -#define _LV_ACTOR_H - -#include <libvisual/lv_audio.h> -#include <libvisual/lv_video.h> -#include <libvisual/lv_palette.h> -#include <libvisual/lv_plugin.h> -#include <libvisual/lv_songinfo.h> -#include <libvisual/lv_event.h> - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#define VISUAL_ACTOR(obj) (VISUAL_CHECK_CAST ((obj), 0, VisActor)) - -typedef struct _VisActor VisActor; - -/** - * The VisActor structure encapsulates the actor plugin and provides - * abstract interfaces to the actor. The VisActor system - * it's methods are also capable of doing automatic size fitting - * and depth transformations, and it keeps track on songinfo and events. - * - * Members in the structure shouldn't be accessed directly but instead - * it's adviced to use the methods provided. - * - * @see visual_actor_new - */ -struct _VisActor { - VisObject object; /**< The VisObject data. */ - - VisPluginData *plugin; /**< Pointer to the plugin itself. */ - - /* Video management and fake environments when needed */ - VisVideo *video; /**< Pointer to the target display video. - * @see visual_actor_set_video */ - VisVideo *transform; /**< Private member which is used for depth transformation. */ - VisVideo *fitting; /**< Private member which is used to fit the plugin. */ - VisPalette *ditherpal; /**< Private member in which a palette is set when transforming - * depth from true color to indexed. - * @see visual_actor_get_palette */ - - /* Songinfo management */ - VisSongInfo songcompare; /**< Private member which is used to compare with new songinfo - * to check if a new song event should be emitted. */ -}; - -/* prototypes */ -VisPluginData *visual_actor_get_plugin (VisActor *actor); - -VisList *visual_actor_get_list (void); -const char *visual_actor_get_next_by_name_gl (const char *name); -const char *visual_actor_get_prev_by_name_gl (const char *name); -const char *visual_actor_get_next_by_name_nogl (const char *name); -const char *visual_actor_get_prev_by_name_nogl (const char *name); -const char *visual_actor_get_next_by_name (const char *name); -const char *visual_actor_get_prev_by_name (const char *name); -int visual_actor_valid_by_name (const char *name); - -VisActor *visual_actor_new (const char *actorname); - -int visual_actor_realize (VisActor *actor); - -VisSongInfo *visual_actor_get_songinfo (VisActor *actor); -VisPalette *visual_actor_get_palette (VisActor *actor); - -int visual_actor_video_negotiate (VisActor *actor, int rundepth, int noevent, int forced); -int visual_actor_get_supported_depth (VisActor *actor); - -int visual_actor_set_video (VisActor *actor, VisVideo *video); - -int visual_actor_run (VisActor *actor, VisAudio *audio); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _LV_ACTOR_H */
--- a/libvisual/lv_audio.c Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,187 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include <unistd.h> -#include <stdlib.h> -#include <string.h> -#include <math.h> - -#include "lv_common.h" -#include "lv_audio.h" - -static int audio_dtor (VisObject *object); - -static int audio_band_total (VisAudio *audio, int begin, int end); -static int audio_band_energy (VisAudio *audio, int band, int length); - -static int audio_dtor (VisObject *object) -{ - VisAudio *audio = VISUAL_AUDIO (object); - - visual_object_unref (VISUAL_OBJECT (audio->fft_state)); - - return VISUAL_OK; -} - -static int audio_band_total (VisAudio *audio, int begin, int end) -{ - int bpmtotal = 0; - int i; - - for (i = begin; i < end; i++) - bpmtotal += audio->freq[2][i]; - - if (bpmtotal > 0) - return bpmtotal / (end - begin); - else - return 0; -} - -static int audio_band_energy (VisAudio *audio, int band, int length) -{ - int energytotal = 0; - int i; - - for (i = 0; i < length; i++) - energytotal += audio->bpmhistory[i][band]; - - if (energytotal > 0) - return energytotal / length; - else - return 0; -} - -/** - * @defgroup VisAudio VisAudio - * @{ - */ - -/** - * Creates a new VisAudio structure. - * - * @return A newly allocated VisAudio, or NULL on failure. - */ -VisAudio *visual_audio_new () -{ - VisAudio *audio; - - audio = visual_mem_new0 (VisAudio, 1); - - /* Do the VisObject initialization */ - visual_object_initialize (VISUAL_OBJECT (audio), TRUE, audio_dtor); - - return audio; -} - -/** - * This function analyzes the VisAudio, the FFT frequency magic gets done here, also - * the audio energy is calculated and some other magic to provide the developer more - * information about the current sample and the stream. - * - * For every sample that is being retrieved this needs to be called. However keep in mind - * that the VisBin runs it automaticly. - * - * @param audio Pointer to a VisAudio that needs to be analyzed. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_AUDIO_NULL on failure. - */ -int visual_audio_analyze (VisAudio *audio) -{ - float tmp_out[256]; - double scale; - int i, j, y; - - visual_log_return_val_if_fail (audio != NULL, -VISUAL_ERROR_AUDIO_NULL); - - /* Load the pcm data */ - for (i = 0; i < 512; i++) { - audio->pcm[0][i] = audio->plugpcm[0][i]; - audio->pcm[1][i] = audio->plugpcm[1][i]; - audio->pcm[2][i] = (audio->plugpcm[0][i] + audio->plugpcm[1][i]) >> 1; - } - - /* Initialize fft if not yet initialized */ - if (audio->fft_state == NULL) - audio->fft_state = visual_fft_init (); - - /* FFT analyze the pcm data */ - visual_fft_perform (audio->plugpcm[0], tmp_out, audio->fft_state); - - for (i = 0; i < 256; i++) - audio->freq[0][i] = ((int) sqrt (tmp_out[i + 1])) >> 8; - - visual_fft_perform (audio->plugpcm[1], tmp_out, audio->fft_state); - - for (i = 0; i < 256; i++) - audio->freq[1][i] = ((int) sqrt (tmp_out[i + 1])) >> 8; - - for (i = 0; i < 256; i++) - audio->freq[2][i] = (audio->freq[0][i] + audio->freq[1][i]) >> 1; - - /* Normalized frequency analyzer */ - /** @todo FIXME Not sure if this is totally correct */ - for (i = 0; i < 3; i++) { - for (j = 0; j < 256; j++) { - /* (Height / log (256)) */ - scale = 256 / log (256); - - y = audio->freq[i][j]; - y = log (y) * scale; - - if (y < 0) - y = 0; - - audio->freqnorm[i][j] = y; - } - } - - - /* BPM stuff, used for the audio energy only right now */ - for (i = 1023; i > 0; i--) { - visual_mem_copy (&audio->bpmhistory[i], &audio->bpmhistory[i - 1], 6 * sizeof (short int)); - visual_mem_copy (&audio->bpmdata[i], &audio->bpmdata[i - 1], 6 * sizeof (short int)); - } - - /* Calculate the audio energy */ - audio->energy = 0; - - for (i = 0; i < 6; i++) { - audio->bpmhistory[0][i] = audio_band_total (audio, i * 2, (i * 2) + 3); - audio->bpmenergy[i] = audio_band_energy (audio, i, 10); - - audio->bpmdata[0][i] = audio->bpmhistory[0][i] - audio->bpmenergy[i]; - - audio->energy += audio_band_energy(audio, i, 50); - } - - audio->energy >>= 7; - - if (audio->energy > 100) - audio->energy = 100; - - return VISUAL_OK; -} - -/** - * @} - */
--- a/libvisual/lv_audio.h Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,71 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _LV_AUDIO_H -#define _LV_AUDIO_H - -#include <libvisual/lv_fft.h> - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#define VISUAL_AUDIO(obj) (VISUAL_CHECK_CAST ((obj), 0, VisAudio)) - -typedef struct _VisAudio VisAudio; - -/** - * The VisAudio structure contains the sample and extra information - * about the sample like a 256 bands analyzer, sound energy and - * in the future BPM detection. - * - * @see visual_audio_new - */ -struct _VisAudio { - VisObject object; /**< The VisObject data. */ - - short plugpcm[2][512]; /**< PCM data that comes from the input plugin - * or a callback function. */ - short pcm[3][512]; /**< PCM data that should be used within plugins - * pcm[0][x] is the left channel, pcm[1][x] is the right - * channel and pcm[2][x] is an average of both channels. */ - short freq[3][256]; /**< Frequency data as a 256 bands analyzer, with the channels - * like with the pcm element. */ - short freqnorm[3][256]; /**< Frequency data like the freq member, however this time the bands - * are normalized. */ - VisFFTState *fft_state; /**< Private member that contains context information for the FFT engine. */ - - short int bpmhistory[1024][6]; /**< Private member for BPM detection, not implemented right now. */ - short int bpmdata[1024][6]; /**< Private member for BPM detection, not implemented right now. */ - short int bpmenergy[6]; /**< Private member for BPM detection, not implemented right now. */ - int energy; /**< Audio energy level. */ -}; - -VisAudio *visual_audio_new (void); -int visual_audio_analyze (VisAudio *audio); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _LV_AUDIO_H */
--- a/libvisual/lv_bin.c Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,898 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> - -/* - * lvconfig.h must be included in order to show correct log messages - */ -#include "lvconfig.h" -#include "lv_log.h" - -#include "lv_list.h" -#include "lv_input.h" -#include "lv_actor.h" -#include "lv_bin.h" -#include "lv_bin.h" - -/* WARNING: Utterly shit ahead, i've screwed up on this and i need to - * rewrite it. And i can't say i feel like it at the moment so be - * patient :) */ - -static int bin_dtor (VisObject *object); - -static void fix_depth_with_bin (VisBin *bin, VisVideo *video, int depth); -static int bin_get_depth_using_preferred (VisBin *bin, int depthflag); - -static int bin_dtor (VisObject *object) -{ - VisBin *bin = VISUAL_BIN (object); - - visual_log_return_val_if_fail (bin != NULL, -1); - - if (bin->actor != NULL) - visual_object_unref (VISUAL_OBJECT (bin->actor)); - - if (bin->input != NULL) - visual_object_unref (VISUAL_OBJECT (bin->input)); - - if (bin->morph != NULL) - visual_object_unref (VISUAL_OBJECT (bin->morph)); - - if (bin->actmorphmanaged == TRUE) { - if (bin->actmorph != NULL) - visual_object_unref (VISUAL_OBJECT (bin->actmorph)); - - if (bin->actmorphvideo != NULL) - visual_object_unref (VISUAL_OBJECT (bin->actmorphvideo)); - } - - if (bin->privvid != NULL) - visual_object_unref (VISUAL_OBJECT (bin->privvid)); - - bin->actor = NULL; - bin->input = NULL; - bin->morph = NULL; - bin->actmorph = NULL; - bin->actmorphvideo = NULL; - bin->privvid = NULL; - - return VISUAL_OK; -} - -static void fix_depth_with_bin (VisBin *bin, VisVideo *video, int depth) -{ - /* Is supported within bin natively */ - if ((bin->depthflag & depth) > 0) { - visual_video_set_depth (video, depth); - } else { - /* Not supported by the bin, taking the highest depth from the bin */ - visual_video_set_depth (video, - visual_video_depth_get_highest_nogl (bin->depthflag)); - } -} - -static int bin_get_depth_using_preferred (VisBin *bin, int depthflag) -{ - if (bin->depthpreferred == VISUAL_BIN_DEPTH_LOWEST) - return visual_video_depth_get_lowest (depthflag); - else - return visual_video_depth_get_highest (depthflag); -} - -/** - * @defgroup VisBin VisBin - * @{ - */ - -VisBin *visual_bin_new () -{ - VisBin *bin; - - bin = visual_mem_new0 (VisBin, 1); - - /* VisObject stuff.. */ - visual_object_initialize (VISUAL_OBJECT (bin), TRUE, bin_dtor); - - bin->morphautomatic = TRUE; - - bin->morphmode = VISUAL_MORPH_MODE_TIME; - visual_time_set (&bin->morphtime, 4, 0); - - bin->depthpreferred = VISUAL_BIN_DEPTH_HIGHEST; - - return bin; -} - -int visual_bin_realize (VisBin *bin) -{ - visual_log_return_val_if_fail (bin != NULL, -1); - - if (bin->actor != NULL) - visual_actor_realize (bin->actor); - - if (bin->input != NULL) - visual_input_realize (bin->input); - - if (bin->morph != NULL) - visual_morph_realize (bin->morph); - - return 0; -} - -int visual_bin_set_actor (VisBin *bin, VisActor *actor) -{ - visual_log_return_val_if_fail (bin != NULL, -1); - - bin->actor = actor; - - bin->managed = FALSE; - - return 0; -} - -VisActor *visual_bin_get_actor (VisBin *bin) -{ - visual_log_return_val_if_fail (bin != NULL, NULL); - - return bin->actor; -} - -int visual_bin_set_input (VisBin *bin, VisInput *input) -{ - visual_log_return_val_if_fail (bin != NULL, -1); - - bin->input = input; - - bin->inputmanaged = FALSE; - - return 0; -} - -VisInput *visual_bin_get_input (VisBin *bin) -{ - visual_log_return_val_if_fail (bin != NULL, NULL); - - return bin->input; -} - -int visual_bin_set_morph (VisBin *bin, VisMorph *morph) -{ - visual_log_return_val_if_fail (bin != NULL, -1); - - bin->morph = morph; - - bin->morphmanaged = FALSE; - - return 0; -} - -int visual_bin_set_morph_by_name (VisBin *bin, char *morphname) -{ - VisMorph *morph; - int depthflag; - - visual_log_return_val_if_fail (bin != NULL, -1); - - if (bin->morph != NULL) - visual_object_unref (VISUAL_OBJECT (bin->morph)); - - morph = visual_morph_new (morphname); - - bin->morph = morph; - bin->morphmanaged = TRUE; - - visual_log_return_val_if_fail (morph->plugin != NULL, -1); - - depthflag = visual_morph_get_supported_depth (morph); - - if (visual_video_depth_is_supported (depthflag, bin->actvideo->depth) <= 0) { - visual_object_unref (VISUAL_OBJECT (morph)); - bin->morph = NULL; - - return -2; - } - - return 0; -} - -VisMorph *visual_bin_get_morph (VisBin *bin) -{ - visual_log_return_val_if_fail (bin != NULL, NULL); - - return bin->morph; -} - -int visual_bin_connect (VisBin *bin, VisActor *actor, VisInput *input) -{ - visual_log_return_val_if_fail (bin != NULL, -1); - - visual_bin_set_actor (bin, actor); - visual_bin_set_input (bin, input); - - return 0; -} - -int visual_bin_connect_by_names (VisBin *bin, char *actname, char *inname) -{ - VisActor *actor; - VisInput *input; - int depthflag; - int depth; - - visual_log_return_val_if_fail (bin != NULL, -1); - - /* Create the actor */ - actor = visual_actor_new (actname); - visual_log_return_val_if_fail (actor != NULL, -1); - - /* Check and set required depth */ - depthflag = visual_actor_get_supported_depth (actor); - - /* GL plugin, and ONLY a GL plugin */ - if (depthflag == VISUAL_VIDEO_DEPTH_GL) - visual_bin_set_depth (bin, VISUAL_VIDEO_DEPTH_GL); - else { - depth = bin_get_depth_using_preferred (bin, depthflag); - - /* Is supported within bin natively */ - if ((bin->depthflag & depth) > 0) { - visual_bin_set_depth (bin, depth); - } else { - /* Not supported by the bin, taking the highest depth from the bin */ - visual_bin_set_depth (bin, - visual_video_depth_get_highest_nogl (bin->depthflag)); - } - } - - /* Initialize the managed depth */ - bin->depthforcedmain = bin->depth; - - /* Create the input */ - input = visual_input_new (inname); - visual_log_return_val_if_fail (input != NULL, -1); - - /* Connect */ - visual_bin_connect (bin, actor, input); - - bin->managed = TRUE; - bin->inputmanaged = TRUE; - - return 0; -} - -int visual_bin_sync (VisBin *bin, int noevent) -{ - VisVideo *video; - VisVideo *actvideo; - - visual_log_return_val_if_fail (bin != NULL, -1); - - visual_log (VISUAL_LOG_DEBUG, "starting sync"); - - /* Sync the actor regarding morph */ - if (bin->morphing == TRUE && bin->morphstyle == VISUAL_SWITCH_STYLE_MORPH && - bin->actvideo->depth != VISUAL_VIDEO_DEPTH_GL && - bin->depthfromGL != TRUE) { - visual_morph_set_video (bin->morph, bin->actvideo); - - video = bin->privvid; - if (video == NULL) { - visual_log (VISUAL_LOG_DEBUG, "Private video data NULL"); - return -1; - } - - visual_video_free_buffer (video); - visual_video_clone (video, bin->actvideo); - - visual_log (VISUAL_LOG_DEBUG, "pitches actvideo %d, new video %d", bin->actvideo->pitch, video->pitch); - - visual_log (VISUAL_LOG_DEBUG, "phase1 bin->privvid %p", bin->privvid); - if (bin->actmorph->video->depth == VISUAL_VIDEO_DEPTH_GL) { - visual_video_set_buffer (video, NULL); - video = bin->actvideo; - } else - visual_video_allocate_buffer (video); - - visual_log (VISUAL_LOG_DEBUG, "phase2"); - } else { - video = bin->actvideo; - if (video == NULL) { - visual_log (VISUAL_LOG_DEBUG, "Actor video is NULL"); - return -1; - } - - visual_log (VISUAL_LOG_DEBUG, "setting new video from actvideo %d %d", video->depth, video->bpp); - } - - /* Main actor */ -// visual_actor_realize (bin->actor); - visual_actor_set_video (bin->actor, video); - - visual_log (VISUAL_LOG_DEBUG, "one last video pitch check %d depth old %d forcedmain %d noevent %d", - video->pitch, bin->depthold, - bin->depthforcedmain, noevent); - - if (bin->managed == TRUE) { - if (bin->depthold == VISUAL_VIDEO_DEPTH_GL) - visual_actor_video_negotiate (bin->actor, bin->depthforcedmain, FALSE, TRUE); - else - visual_actor_video_negotiate (bin->actor, bin->depthforcedmain, noevent, TRUE); - } else { - if (bin->depthold == VISUAL_VIDEO_DEPTH_GL) - visual_actor_video_negotiate (bin->actor, 0, FALSE, TRUE); - else - visual_actor_video_negotiate (bin->actor, 0, noevent, FALSE); - } - - visual_log (VISUAL_LOG_DEBUG, "pitch after main actor negotiate %d", video->pitch); - - /* Morphing actor */ - if (bin->actmorphmanaged == TRUE && bin->morphing == TRUE && - bin->morphstyle == VISUAL_SWITCH_STYLE_MORPH) { - - actvideo = bin->actmorphvideo; - if (actvideo == NULL) { - visual_log (VISUAL_LOG_DEBUG, "Morph video is NULL"); - return -1; - } - - visual_video_free_buffer (actvideo); - - visual_video_clone (actvideo, video); - - if (bin->actor->video->depth != VISUAL_VIDEO_DEPTH_GL) - visual_video_allocate_buffer (actvideo); - - visual_actor_realize (bin->actmorph); - - visual_log (VISUAL_LOG_DEBUG, "phase3 pitch of real framebuffer %d", bin->actvideo->pitch); - if (bin->actmorphmanaged == TRUE) - visual_actor_video_negotiate (bin->actmorph, bin->depthforced, FALSE, TRUE); - else - visual_actor_video_negotiate (bin->actmorph, 0, FALSE, FALSE); - } - - visual_log (VISUAL_LOG_DEBUG, "end sync function"); - - return 0; -} - -int visual_bin_set_video (VisBin *bin, VisVideo *video) -{ - visual_log_return_val_if_fail (bin != NULL, -1); - - bin->actvideo = video; - - return 0; -} - -int visual_bin_set_supported_depth (VisBin *bin, int depthflag) -{ - visual_log_return_val_if_fail (bin != NULL, -1); - - bin->depthflag = depthflag; - - return 0; -} - -int visual_bin_set_preferred_depth (VisBin *bin, VisBinDepth depthpreferred) -{ - visual_log_return_val_if_fail (bin != NULL, -1); - - bin->depthpreferred = depthpreferred; - - return 0; -} - -int visual_bin_set_depth (VisBin *bin, int depth) -{ - visual_log_return_val_if_fail (bin != NULL, -1); - - bin->depthold = bin->depth; - - if (visual_video_depth_is_supported (bin->depthflag, depth) != TRUE) - return -2; - - visual_log (VISUAL_LOG_DEBUG, "old: %d new: %d", bin->depth, depth); - if (bin->depth != depth) - bin->depthchanged = TRUE; - - if (bin->depth == VISUAL_VIDEO_DEPTH_GL && bin->depthchanged == TRUE) - bin->depthfromGL = TRUE; - else - bin->depthfromGL = FALSE; - - bin->depth = depth; - - visual_video_set_depth (bin->actvideo, depth); - - return 0; -} - -int visual_bin_get_depth (VisBin *bin) -{ - visual_log_return_val_if_fail (bin != NULL, -1); - - return bin->depth; -} - -int visual_bin_depth_changed (VisBin *bin) -{ - visual_log_return_val_if_fail (bin != NULL, -1); - - if (bin->depthchanged == FALSE) - return FALSE; - - bin->depthchanged = FALSE; - - return TRUE; -} - -VisPalette *visual_bin_get_palette (VisBin *bin) -{ - visual_log_return_val_if_fail (bin != NULL, NULL); - - if (bin->morphing == TRUE) - return visual_morph_get_palette (bin->morph); - else - return visual_actor_get_palette (bin->actor); -} - -int visual_bin_switch_actor_by_name (VisBin *bin, char *actname) -{ - VisActor *actor; - VisVideo *video; - int depthflag; - int depth; - - visual_log_return_val_if_fail (bin != NULL, -1); - visual_log_return_val_if_fail (actname != NULL, -1); - - visual_log (VISUAL_LOG_DEBUG, "switching to a new actor: %s, old actor: %s", actname, bin->actor->plugin->info->name); - - /* Destroy if there already is a managed one */ - if (bin->actmorphmanaged == TRUE) { - if (bin->actmorph != NULL) { - visual_object_unref (VISUAL_OBJECT (bin->actmorph)); - - if (bin->actmorphvideo != NULL) - visual_object_unref (VISUAL_OBJECT (bin->actmorphvideo)); - } - } - - /* Create a new managed actor */ - actor = visual_actor_new (actname); - visual_log_return_val_if_fail (actor != NULL, -1); - - video = visual_video_new (); - - visual_video_clone (video, bin->actvideo); - - depthflag = visual_actor_get_supported_depth (actor); - if (visual_video_depth_is_supported (depthflag, VISUAL_VIDEO_DEPTH_GL) == TRUE) { - visual_log (VISUAL_LOG_INFO, "Switching to Gl mode"); - - bin->depthforced = VISUAL_VIDEO_DEPTH_GL; - bin->depthforcedmain = VISUAL_VIDEO_DEPTH_GL; - - visual_video_set_depth (video, VISUAL_VIDEO_DEPTH_GL); - - visual_bin_set_depth (bin, VISUAL_VIDEO_DEPTH_GL); - bin->depthchanged = TRUE; - - } else { - visual_log (VISUAL_LOG_INFO, "Switching away from Gl mode -- or non Gl switch"); - - - /* Switching from GL */ - depth = bin_get_depth_using_preferred (bin, depthflag); - - fix_depth_with_bin (bin, video, depth); - - visual_log (VISUAL_LOG_DEBUG, "after depth fixating"); - - /* After a depth change, the pitch value needs an update from the client - * if it's different from width * bpp, after a visual_bin_sync - * the issues are fixed again */ - visual_log (VISUAL_LOG_INFO, "video depth (from fixate): %d", video->depth); - - /* FIXME check if there are any unneeded depth transform environments and drop these */ - visual_log (VISUAL_LOG_DEBUG, "checking if we need to drop something: depthforcedmain: %d actvideo->depth %d", - bin->depthforcedmain, bin->actvideo->depth); - - /* Drop a transformation environment when not needed */ - if (bin->depthforcedmain != bin->actvideo->depth) { - visual_actor_video_negotiate (bin->actor, bin->depthforcedmain, TRUE, TRUE); - visual_log (VISUAL_LOG_DEBUG, "[[[[optionally a bogus transform environment, dropping]]]]\n"); - } - - if (bin->actvideo->depth > video->depth - && bin->actvideo->depth != VISUAL_VIDEO_DEPTH_GL - && bin->morphstyle == VISUAL_SWITCH_STYLE_MORPH) { - - visual_log (VISUAL_LOG_INFO, "old depth is higher, video depth %d, depth %d, bin depth %d", video->depth, depth, - bin->depth); - - bin->depthforced = depth; - bin->depthforcedmain = bin->depth; - - visual_bin_set_depth (bin, bin->actvideo->depth); - - visual_video_set_depth (video, bin->actvideo->depth); - - } else if (bin->actvideo->depth != VISUAL_VIDEO_DEPTH_GL) { - - visual_log (VISUAL_LOG_INFO, "new depth is higher, or equal: video depth %d, depth %d bin depth %d", video->depth, depth, - bin->depth); - - visual_log (VISUAL_LOG_DEBUG, "depths i can locate: actvideo: %d bin: %d bin-old: %d", bin->actvideo->depth, - bin->depth, bin->depthold); - - bin->depthforced = video->depth; - bin->depthforcedmain = bin->depth; - - visual_log (VISUAL_LOG_DEBUG, "depthforcedmain in switch by name: %d", bin->depthforcedmain); - visual_log (VISUAL_LOG_DEBUG, "visual_bin_set_depth %d", video->depth); - visual_bin_set_depth (bin, video->depth); - - } else { - /* Don't force ourself into a GL depth, seen we do a direct - * switch in the run */ - bin->depthforced = video->depth; - bin->depthforcedmain = video->depth; - - visual_log (VISUAL_LOG_INFO, "Switching from Gl TO framebuffer for real, framebuffer depth: %d", video->depth); - } - - visual_log (VISUAL_LOG_INFO, "Target depth selected: %d", depth); - visual_video_set_dimension (video, video->width, video->height); - - visual_log (VISUAL_LOG_INFO, "Switch to new pitch: %d", bin->actvideo->pitch); - if (bin->actvideo->depth != VISUAL_VIDEO_DEPTH_GL) - visual_video_set_pitch (video, bin->actvideo->pitch); - - visual_log (VISUAL_LOG_DEBUG, "before allocating buffer"); - visual_video_allocate_buffer (video); - visual_log (VISUAL_LOG_DEBUG, "after allocating buffer"); - } - - visual_log (VISUAL_LOG_INFO, "video pitch of that what connects to the new actor %d", video->pitch); - visual_actor_set_video (actor, video); - - bin->actmorphvideo = video; - bin->actmorphmanaged = TRUE; - - visual_log (VISUAL_LOG_INFO, "switching... ******************************************"); - visual_bin_switch_actor (bin, actor); - - visual_log (VISUAL_LOG_INFO, "end switch actor by name function ******************"); - return 0; -} - -int visual_bin_switch_actor (VisBin *bin, VisActor *actor) -{ - VisVideo *privvid; - - visual_log_return_val_if_fail (bin != NULL, -1); - visual_log_return_val_if_fail (actor != NULL, -1); - - /* Set the new actor */ - bin->actmorph = actor; - - visual_log (VISUAL_LOG_DEBUG, "entering..."); - - /* Free the private video */ - if (bin->privvid != NULL) { - visual_object_unref (VISUAL_OBJECT (bin->privvid)); - - bin->privvid = NULL; - } - - visual_log (VISUAL_LOG_INFO, "depth of the main actor: %d", bin->actor->video->depth); - - /* Starting the morph, but first check if we don't have anything todo with openGL */ - if (bin->morphstyle == VISUAL_SWITCH_STYLE_MORPH && - bin->actor->video->depth != VISUAL_VIDEO_DEPTH_GL && - bin->actmorph->video->depth != VISUAL_VIDEO_DEPTH_GL && - bin->depthfromGL != TRUE) { - - if (bin->morph != NULL && bin->morph->plugin != NULL) { - visual_morph_set_rate (bin->morph, 0); - - visual_morph_set_video (bin->morph, bin->actvideo); - - if (bin->morphautomatic == TRUE) - visual_morph_set_mode (bin->morph, bin->morphmode); - else - visual_morph_set_mode (bin->morph, VISUAL_MORPH_MODE_SET); - - visual_morph_set_time (bin->morph, &bin->morphtime); - visual_morph_set_steps (bin->morph, bin->morphsteps); - } - - bin->morphrate = 0; - bin->morphstepsdone = 0; - - visual_log (VISUAL_LOG_DEBUG, "phase 1"); - /* Allocate a private video for the main actor, so the morph - * can draw to the framebuffer */ - privvid = visual_video_new (); - - visual_log (VISUAL_LOG_DEBUG, "actvideo->depth %d actmorph->video->depth %d", - bin->actvideo->depth, bin->actmorph->video->depth); - - visual_log (VISUAL_LOG_DEBUG, "phase 2"); - visual_video_clone (privvid, bin->actvideo); - visual_log (VISUAL_LOG_DEBUG, "phase 3 pitch privvid %d actvideo %d", privvid->pitch, bin->actvideo->pitch); - - visual_video_allocate_buffer (privvid); - - visual_log (VISUAL_LOG_DEBUG, "phase 4"); - /* Initial privvid initialize */ - - visual_log (VISUAL_LOG_DEBUG, "actmorph->video->depth %d %p", bin->actmorph->video->depth, - bin->actvideo->pixels); - - if (bin->actvideo->pixels != NULL && privvid->pixels != NULL) - visual_mem_copy (privvid->pixels, bin->actvideo->pixels, privvid->size); - else if (privvid->pixels != NULL) - memset (privvid->pixels, 0, privvid->size); - - visual_actor_set_video (bin->actor, privvid); - bin->privvid = privvid; - } else { - visual_log (VISUAL_LOG_DEBUG, "Pointer actvideo->pixels %p", bin->actvideo->pixels); - if (bin->actor->video->depth != VISUAL_VIDEO_DEPTH_GL && - bin->actvideo->pixels != NULL) { - memset (bin->actvideo->pixels, 0, bin->actvideo->size); - } - } - - visual_log (VISUAL_LOG_DEBUG, "Leaving, actor->video->depth: %d actmorph->video->depth: %d", - bin->actor->video->depth, bin->actmorph->video->depth); - - bin->morphing = TRUE; - - return 0; -} - -int visual_bin_switch_finalize (VisBin *bin) -{ - int depthflag; - - visual_log_return_val_if_fail (bin != NULL, -1); - - visual_log (VISUAL_LOG_DEBUG, "Entering..."); - if (bin->managed == TRUE) - visual_object_unref (VISUAL_OBJECT (bin->actor)); - - /* Copy over the depth to be sure, and for GL plugins */ -// bin->actvideo->depth = bin->actmorphvideo->depth; -// visual_video_set_depth (bin->actvideo, bin->actmorphvideo->depth); - - if (bin->actmorphmanaged == TRUE) { - visual_object_unref (VISUAL_OBJECT (bin->actmorphvideo)); - - bin->actmorphvideo = NULL; - } - - if (bin->privvid != NULL) { - visual_object_unref (VISUAL_OBJECT (bin->privvid)); - - bin->privvid = NULL; - } - - bin->actor = bin->actmorph; - bin->actmorph = NULL; - - visual_actor_set_video (bin->actor, bin->actvideo); - - bin->morphing = FALSE; - - if (bin->morphmanaged == TRUE) { - visual_object_unref (VISUAL_OBJECT (bin->morph)); - bin->morph = NULL; - } - - visual_log (VISUAL_LOG_DEBUG, " - in finalize - fscking depth from actvideo: %d %d", bin->actvideo->depth, bin->actvideo->bpp); - - -// visual_bin_set_depth (bin, bin->actvideo->depth); - - depthflag = visual_actor_get_supported_depth (bin->actor); - fix_depth_with_bin (bin, bin->actvideo, bin_get_depth_using_preferred (bin, depthflag)); - visual_bin_set_depth (bin, bin->actvideo->depth); - - bin->depthforcedmain = bin->actvideo->depth; - visual_log (VISUAL_LOG_DEBUG, "bin->depthforcedmain in finalize %d", bin->depthforcedmain); - - // FIXME replace with a depth fixer - if (bin->depthchanged == TRUE) { - visual_log (VISUAL_LOG_INFO, "negotiate without event"); - visual_actor_video_negotiate (bin->actor, bin->depthforcedmain, TRUE, TRUE); - visual_log (VISUAL_LOG_INFO, "end negotiate without event"); - // visual_bin_sync (bin); - } - - visual_log (VISUAL_LOG_DEBUG, "Leaving..."); - - return 0; -} - -int visual_bin_switch_set_style (VisBin *bin, VisBinSwitchStyle style) -{ - visual_log_return_val_if_fail (bin != NULL, -1); - - bin->morphstyle = style; - - return 0; -} - -int visual_bin_switch_set_steps (VisBin *bin, int steps) -{ - visual_log_return_val_if_fail (bin != NULL, -1); - - bin->morphsteps = steps; - - return 0; -} - -int visual_bin_switch_set_automatic (VisBin *bin, int automatic) -{ - visual_log_return_val_if_fail (bin != NULL, -1); - - bin->morphautomatic = automatic; - - return 0; -} - -int visual_bin_switch_set_rate (VisBin *bin, float rate) -{ - visual_log_return_val_if_fail (bin != NULL, -1); - - bin->morphrate = rate; - - return 0; -} - -int visual_bin_switch_set_mode (VisBin *bin, VisMorphMode mode) -{ - visual_log_return_val_if_fail (bin != NULL, -1); - - bin->morphmode = mode; - - return 0; -} - -int visual_bin_switch_set_time (VisBin *bin, long sec, long usec) -{ - visual_log_return_val_if_fail (bin != NULL, -1); - - visual_time_set (&bin->morphtime, sec, usec); - - return 0; -} - - -int visual_bin_run (VisBin *bin) -{ - visual_log_return_val_if_fail (bin != NULL, -1); - visual_log_return_val_if_fail (bin->actor != NULL, -1); - visual_log_return_val_if_fail (bin->input != NULL, -1); - - visual_input_run (bin->input); - - /* If we have a direct switch, do this BEFORE we run the actor, - * else we can get into trouble especially with GL, also when - * switching away from a GL plugin this is needed */ - if (bin->morphing == TRUE) { - /* We realize here, because it doesn't realize - * on switch, the reason for this is so that after a - * switch call, especially in a managed bin the - * depth can be requested and set, this is important - * for openGL plugins, the realize method checks - * for double realize itself so we don't have - * to check this, it's a bit hacky */ - visual_log_return_val_if_fail (bin->actmorph != NULL, -1); - visual_log_return_val_if_fail (bin->actmorph->plugin != NULL, -1); - if (bin->actmorph->plugin->realized == FALSE) { - visual_actor_realize (bin->actmorph); - - if (bin->actmorphmanaged == TRUE) - visual_actor_video_negotiate (bin->actmorph, bin->depthforced, FALSE, TRUE); - else - visual_actor_video_negotiate (bin->actmorph, 0, FALSE, FALSE); - } - - /* When we've got multiple switch events without a sync we need - * to realize the main actor as well */ - visual_log_return_val_if_fail (bin->actor->plugin != NULL, -1); - if (bin->actor->plugin->realized == FALSE) { - visual_actor_realize (bin->actor); - - if (bin->managed == TRUE) - visual_actor_video_negotiate (bin->actor, bin->depthforced, FALSE, TRUE); - else - visual_actor_video_negotiate (bin->actor, 0, FALSE, FALSE); - } - - /* When the style is DIRECT or the context is GL we shouldn't try - * to morph and instead finalize at once */ - visual_log_return_val_if_fail (bin->actor->video != NULL, -1); - if (bin->morphstyle == VISUAL_SWITCH_STYLE_DIRECT || - bin->actor->video->depth == VISUAL_VIDEO_DEPTH_GL) { - - visual_bin_switch_finalize (bin); - - /* We can't start drawing yet, the client needs to catch up with - * the depth change */ - return 0; - } - } - - /* We realize here because in a managed bin the depth for openGL is - * requested after the connect, thus we can realize there yet */ - visual_actor_realize (bin->actor); - - visual_actor_run (bin->actor, bin->input->audio); - - if (bin->morphing == TRUE) { - visual_log_return_val_if_fail (bin->actmorph != NULL, -1); - visual_log_return_val_if_fail (bin->actmorph->video != NULL, -1); - visual_log_return_val_if_fail (bin->actor->video != NULL, -1); - - if (bin->morphstyle == VISUAL_SWITCH_STYLE_MORPH && - bin->actmorph->video->depth != VISUAL_VIDEO_DEPTH_GL && - bin->actor->video->depth != VISUAL_VIDEO_DEPTH_GL) { - - visual_actor_run (bin->actmorph, bin->input->audio); - - if (bin->morph == NULL || bin->morph->plugin == NULL) { - visual_bin_switch_finalize (bin); - - return 0; - } - - /* Same goes for the morph, we realize it here for depth changes - * (especially the openGL case */ - visual_morph_realize (bin->morph); - visual_morph_run (bin->morph, bin->input->audio, bin->actor->video, bin->actmorph->video); - - if (visual_morph_is_done (bin->morph) == TRUE) - visual_bin_switch_finalize (bin); - } else { -// visual_bin_switch_finalize (bin); - } - } - - return 0; -} - -/** - * @} - */ -
--- a/libvisual/lv_bin.h Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,133 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _LV_BIN_H -#define _LV_BIN_H - -#include <libvisual/lv_actor.h> -#include <libvisual/lv_input.h> -#include <libvisual/lv_morph.h> -#include <libvisual/lv_video.h> -#include <libvisual/lv_time.h> - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#define VISUAL_BIN(obj) (VISUAL_CHECK_CAST ((obj), 0, VisBin)) - -typedef enum { - VISUAL_SWITCH_STYLE_DIRECT, - VISUAL_SWITCH_STYLE_MORPH -} VisBinSwitchStyle; - -typedef enum { - VISUAL_BIN_DEPTH_LOWEST, - VISUAL_BIN_DEPTH_HIGHEST -} VisBinDepth; - -typedef struct _VisBin VisBin; - -struct _VisBin { - VisObject object; - - int managed; - VisActor *actor; - VisVideo *actvideo; - VisVideo *privvid; - - int actmorphmanaged; - VisVideo *actmorphvideo; - VisActor *actmorph; - - int inputmanaged; - VisInput *input; - - int morphmanaged; - VisMorph *morph; - int morphstyle; - int morphing; - int morphautomatic; - int morphsteps; - int morphstepsdone; - float morphrate; - VisMorphMode morphmode; - VisTime morphtime; - - int depthpreferred; /* Prefered depth, highest or lowest */ - int depthflag; /* Supported depths */ - int depthold; /* Previous depth */ - int depth; /* Depth we're running in */ - int depthchanged; /* Set TRUE if the depth has changed */ - int depthfromGL; /* Set when switching away from openGL */ - int depthforced; /* Contains forced depth value, for the actmorph so we've got smooth transformations */ - int depthforcedmain; /* Contains forced depth value, for the main actor */ -}; - -/* prototypes */ -VisBin *visual_bin_new (void); - -int visual_bin_realize (VisBin *bin); - -int visual_bin_set_actor (VisBin *bin, VisActor *actor); -VisActor *visual_bin_get_actor (VisBin *bin); - -int visual_bin_set_input (VisBin *bin, VisInput *input); -VisInput *visual_bin_get_input (VisBin *bin); - -int visual_bin_set_morph (VisBin *bin, VisMorph *morph); -int visual_bin_set_morph_by_name (VisBin *bin, char *morphname); -VisMorph *visual_bin_get_morph (VisBin *bin); - -int visual_bin_connect (VisBin *bin, VisActor *actor, VisInput *input); -int visual_bin_connect_by_names (VisBin *bin, char *actname, char *inname); - -int visual_bin_sync (VisBin *bin, int noevent); - -int visual_bin_set_video (VisBin *bin, VisVideo *video); - -int visual_bin_set_supported_depth (VisBin *bin, int depthflag); -int visual_bin_set_preferred_depth (VisBin *bin, VisBinDepth depthpreferred); -int visual_bin_set_depth (VisBin *bin, int depth); -int visual_bin_get_depth (VisBin *bin); -int visual_bin_depth_changed (VisBin *bin); - -VisPalette *visual_bin_get_palette (VisBin *bin); - -int visual_bin_switch_actor_by_name (VisBin *bin, char *actname); -int visual_bin_switch_actor (VisBin *bin, VisActor *actor); -int visual_bin_switch_finalize (VisBin *bin); -int visual_bin_switch_set_style (VisBin *bin, VisBinSwitchStyle style); -int visual_bin_switch_set_steps (VisBin *bin, int steps); -int visual_bin_switch_set_automatic (VisBin *bin, int automatic); -int visual_bin_switch_set_rate (VisBin *bin, float rate); -int visual_bin_switch_set_mode (VisBin *bin, VisMorphMode mode); -int visual_bin_switch_set_time (VisBin *bin, long sec, long usec); - -int visual_bin_run (VisBin *bin); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _LV_BIN_H */
--- a/libvisual/lv_bmp.c Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,289 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include <unistd.h> -#include <stdlib.h> -#include <string.h> -#include <math.h> - -#include <sys/stat.h> -#include <fcntl.h> - -#include "lv_common.h" -#include "lv_log.h" -#include "lv_endianess.h" -#include "lv_bmp.h" - -#define BI_RGB 0 -#define BI_RLE8 1 -#define BI_RLE 2 - -/** - * @defgroup VisBitmap VisBitmap - * @{ - */ - -/** - * Loads a BMP file into a VisVideo. The buffer will be located - * for the VisVideo. - * - * The loader currently only supports uncompressed bitmaps in the form - * of either 8 bits indexed or 24 bits RGB. - * - * Keep in mind that you need to free the palette by hand. - * - * @param video Destination video where the bitmap should be loaded in. - * @param filename The filename of the bitmap to be loaded. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_VIDEO_NULL, -VISUAL_ERROR_BMP_NOT_FOUND, - * -VISUAL_ERROR_BMP_NO_BMP, -VISUAL_ERROR_BMP_NOT_SUPPORTED or -VISUAL_ERROR_BMP_CORRUPTED - * on failure. - */ -int visual_bitmap_load (VisVideo *video, const char *filename) -{ - /* The win32 BMP header */ - char magic[2]; - uint32_t bf_size = 0; - uint32_t bf_bits = 0; - - /* The win32 BITMAPINFOHEADER */ - int32_t bi_size = 0; - int32_t bi_width = 0; - int32_t bi_height = 0; - int16_t bi_bitcount = 0; - uint32_t bi_compression; - uint32_t bi_clrused; - - /* File read vars */ - int fd; - - /* Worker vars */ - uint8_t *data; - int pad; - int i; - - visual_log_return_val_if_fail (video != NULL, -VISUAL_ERROR_VIDEO_NULL); - - fd = open (filename, O_RDONLY); - - if (fd < 0) { - visual_log (VISUAL_LOG_WARNING, "Bitmap file not found: %s", filename); - - return -VISUAL_ERROR_BMP_NOT_FOUND; - } - - /* Read the magic string */ - read (fd, magic, 2); - - if (strncmp (magic, "BM", 2) != 0) { - visual_log (VISUAL_LOG_WARNING, "Not a bitmap file"); - - return -VISUAL_ERROR_BMP_NO_BMP; - } - - /* Read the file size */ - read (fd, &bf_size, 4); - bf_size = VISUAL_ENDIAN_LEI32 (bf_size); - - /* Skip past the reserved bits */ - lseek (fd, 4, SEEK_CUR); - - /* Read the offset bits */ - read (fd, &bf_bits, 4); - bf_bits = VISUAL_ENDIAN_LEI32 (bf_bits); - - /* Read the info structure size */ - read (fd, &bi_size, 4); - bi_size = VISUAL_ENDIAN_LEI32 (bi_size); - - if (bi_size == 12) { - /* And read the width, height */ - read (fd, &bi_width, 2); - read (fd, &bi_height, 2); - bi_width = VISUAL_ENDIAN_LEI16 (bi_width); - bi_height = VISUAL_ENDIAN_LEI16 (bi_height); - - /* Skip over the planet */ - lseek (fd, 2, SEEK_CUR); - - /* Read the bits per pixel */ - read (fd, &bi_bitcount, 2); - bi_bitcount = VISUAL_ENDIAN_LEI16 (bi_bitcount); - - bi_compression = BI_RGB; - } else { - /* And read the width, height */ - read (fd, &bi_width, 4); - read (fd, &bi_height, 4); - bi_width = VISUAL_ENDIAN_LEI16 (bi_width); - bi_height = VISUAL_ENDIAN_LEI16 (bi_height); - - /* Skip over the planet */ - lseek (fd, 2, SEEK_CUR); - - /* Read the bits per pixel */ - read (fd, &bi_bitcount, 2); - bi_bitcount = VISUAL_ENDIAN_LEI16 (bi_bitcount); - - /* Read the compression flag */ - read (fd, &bi_compression, 4); - bi_compression = VISUAL_ENDIAN_LEI32 (bi_compression); - - /* Skip over the nonsense we don't want to know */ - lseek (fd, 12, SEEK_CUR); - - /* Number of colors in palette */ - read (fd, &bi_clrused, 4); - bi_clrused = VISUAL_ENDIAN_LEI32 (bi_clrused); - - /* Skip over the other nonsense */ - lseek (fd, 4, SEEK_CUR); - } - - /* Check if we can handle it */ - if (bi_bitcount != 8 && bi_bitcount != 24) { - visual_log (VISUAL_LOG_CRITICAL, "Only bitmaps with 8 bits or 24 bits per pixel are supported"); - - return -VISUAL_ERROR_BMP_NOT_SUPPORTED; - } - - /* We only handle uncompressed bitmaps */ - if (bi_compression != BI_RGB) { - visual_log (VISUAL_LOG_CRITICAL, "Only uncompressed bitmaps are supported"); - - return -VISUAL_ERROR_BMP_NOT_SUPPORTED; - } - - /* Load the palette */ - if (bi_bitcount == 8) { - if (bi_clrused == 0) - bi_clrused = 256; - - if (video->pal == NULL) - visual_object_unref (VISUAL_OBJECT (video->pal)); - - video->pal = visual_palette_new (bi_clrused); - - if (bi_size == 12) { - for (i = 0; i < bi_clrused; i++) { - read (fd, &video->pal->colors[i].b, 1); - read (fd, &video->pal->colors[i].g, 1); - read (fd, &video->pal->colors[i].r, 1); - } - } else { - for (i = 0; i < bi_clrused; i++) { - read (fd, &video->pal->colors[i].b, 1); - read (fd, &video->pal->colors[i].g, 1); - read (fd, &video->pal->colors[i].r, 1); - lseek (fd, 1, SEEK_CUR); - } - } - } - - /* Make the target VisVideo ready for use */ - visual_video_set_depth (video, visual_video_depth_enum_from_value (bi_bitcount)); - visual_video_set_dimension (video, bi_width, bi_height); - visual_video_allocate_buffer (video); - - /* Set to the beginning of image data, note that MickeySoft likes stuff upside down .. */ - lseek (fd, bf_bits, SEEK_SET); - - pad = ((video->pitch % 4) ? (4 - (video->pitch % 4)) : 0); - - data = video->pixels + (video->height * video->pitch); - while (data > (uint8_t *) video->pixels) { - data -= video->pitch; - - if (read (fd, data, video->pitch) != video->pitch) { - visual_log (VISUAL_LOG_CRITICAL, "Bitmap data is not complete"); - - visual_video_free_buffer (video); - - return -VISUAL_ERROR_BMP_CORRUPTED; - } - -#if !VISUAL_LITTLE_ENDIAN - switch (bi_bitcount) { - case 24: { - int i, p; - for (p=0, i=0; i<bi_width; i++){ -# if VISUAL_BIG_ENDIAN - uint8_t c[2]; - - c[0] = data[p]; - c[1] = data[p+2]; - - data[p] = c[1]; - data[p+2] = c[0]; - - p+=3; -# else -# error todo -# endif - } - break; - } - default: - visual_log (VISUAL_LOG_CRITICAL, "Internal error."); - } -#endif - - if (pad != 0) { - lseek (fd, 4, pad); - } - } - - close (fd); - - return VISUAL_OK; -} - -/** - * Loads a bitmap into a VisVideo and return this, so it's not needed to - * allocate a VisVideo before by hand. - * - * @see visual_bitmap_load - * - * @param filename The filename of the bitmap to be loaded. - * - * @return The VisVideo containing the bitmap or NULL on failure. - */ -VisVideo *visual_bitmap_load_new_video (const char *filename) -{ - VisVideo *video; - - video = visual_video_new (); - - if (visual_bitmap_load (video, filename) < 0) { - visual_object_unref (VISUAL_OBJECT (video)); - - return NULL; - } - - return video; -} - -/** - * @} - */ -
--- a/libvisual/lv_bmp.h Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _LV_BMP_H -#define _LV_BMP_H - -#include <libvisual/lv_video.h> - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -int visual_bitmap_load (VisVideo *video, const char *filename); -VisVideo *visual_bitmap_load_new_video (const char *filename); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _LV_BMP_H */
--- a/libvisual/lv_color.c Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,212 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> - -#include "lv_common.h" -#include "lv_color.h" - -/** - * @defgroup VisColor VisColor - * @{ - */ - -/** - * Creates a new VisColor structure - * - * @return A newly allocated VisColor. - */ -VisColor *visual_color_new () -{ - VisColor *color; - - color = visual_mem_new0 (VisColor, 1); - - /* Do the VisObject initialization */ - visual_object_initialize (VISUAL_OBJECT (color), TRUE, NULL); - - return color; -} - -/** - * Compares two VisColors with each other. If they are not the same, 0 is returned, if the same 1. - * - * @param src1 Pointer to the first VisColor for comparison. - * @param src2 Pointer to the second VisColor for comparison. - * - * @return FALSE on different, TRUE on same, -VISUAL_ERROR_COLOR_NULL on failure. - */ -int visual_color_compare (VisColor *src1, VisColor *src2) -{ - visual_log_return_val_if_fail (src1 != NULL, -VISUAL_ERROR_COLOR_NULL) - visual_log_return_val_if_fail (src2 != NULL, -VISUAL_ERROR_COLOR_NULL) - - if (src1->r != src2->r || src1->g != src2->g || src1->b != src2->b) - return FALSE; - - return TRUE; -} - -/** - * Fills the VisColor it's rgb values from hsv colorspace values. - * - * @param color Pointer to a VisColor which rgb values are filled. - * @param h Hue value for the hsv colorspace, ranging from 0 to 360. - * @param s Saturation value for the hsv colorspace, ranging from 0 to 1. - * @param v Value value for the hsv colorspace, ranging from 0 to 1. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_COLOR_NULL on failure. - */ -int visual_color_from_hsv (VisColor *color, float h, float s, float v) -{ - int i; - float f, w, q, t, r = 0, g = 0, b = 0; - - visual_log_return_val_if_fail (color != NULL, -VISUAL_ERROR_COLOR_NULL); - - if (s == 0.0) - s = 0.000001; - - if (h == 360.0) - h = 0.0; - - h = h / 60.0; - i = (int) h; - f = h - i; - w = v * (1.0 - s); - q = v * (1.0 - (s * f)); - t = v * (1.0 - (s * (1.0 - f))); - - switch (i) { - case 0: r = v; g = t; b = w; break; - case 1: r = q; g = v; b = w; break; - case 2: r = w; g = v; b = t; break; - case 3: r = w; g = q; b = v; break; - case 4: r = t; g = w; b = v; break; - case 5: r = v; g = w; b = q; break; - - default: - break; - } - - color->r = (float) r * 255; - color->g = (float) g * 255; - color->b = (float) b * 255; - - return VISUAL_OK; -} - -/** - * Creates hsv colorspace values from a VisColor - * - * @param color Pointer to a VisColor from which hsv colorspace values are created. - * @param h Float pointer to a hue value for the hsv colorspace, ranging from 0 to 360. - * @param s Float pointer to a saturation value for the hsv colorspace, ranging from 0 to 1. - * @param v Float pointer to a value value for the hsv colorspace, ranging from 0 to 1. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_COLOR_NULL on failure. - */ -int visual_color_to_hsv (VisColor *color, float *h, float *s, float *v) -{ - - float max, min, delta, r, g, b; - - visual_log_return_val_if_fail (color != NULL, -VISUAL_ERROR_COLOR_NULL); - - r = (float) color->r / 255.0; - g = (float) color->g / 255.0; - b = (float) color->b / 255.0; - - max = r; - if (g > max) - max = g; - - if (b > max) - max = b; - - min = r; - if (g < min) - min = g; - - if (b < min) - min = b; - - *v = max; - - if (max != 0.0) - *s = (max - min) / max; - else - *s = 0.0; - - if (*s == 0.0) { - *h = 0.0; - } else { - delta = max - min; - - if (r == max) - *h = (g - b) / delta; - else if (g == max) - *h = 2.0 + (b - r) / delta; - else if (b == max) - *h = 4.0 + (r - g) / delta; - - *h = *h * 60.0; - - if (*h < 0.0) - *h = *h + 360; - } - - - return VISUAL_OK; -} - -/** - * Copies the RGB data of one VisColor into another. - * - * @param dest Pointer to the destination VisColor in which the RGB data is copied. - * @param src Pointer to the source VisColor from which the RGB data is copied. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_COLOR_NULL on failure. - */ -int visual_color_copy (VisColor *dest, VisColor *src) -{ - visual_log_return_val_if_fail (dest != NULL, -VISUAL_ERROR_COLOR_NULL); - visual_log_return_val_if_fail (src != NULL, -VISUAL_ERROR_COLOR_NULL); - - dest->r = src->r; - dest->g = src->g; - dest->b = src->b; - - /* You never know ;) */ - dest->unused = src->unused; - - return VISUAL_OK; -} - -/** - * @} - */ -
--- a/libvisual/lv_color.h Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,59 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _LV_COLOR_H -#define _LV_COLOR_H - -#include <libvisual/lv_common.h> - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#define VISUAL_COLOR(obj) (VISUAL_CHECK_CAST ((obj), 0, VisColor)) - -typedef struct _VisColor VisColor; - -/** - * Data type to describe a palette entry, or a color. The HSV isn't kept in sync with RGB automaticly - * but it's there especially for VisUI. - */ -struct _VisColor { - VisObject object; /**< The VisObject data. */ - uint8_t r; /**< The red channel of this VisColor. */ - uint8_t g; /**< The green channel of this VisColor. */ - uint8_t b; /**< The blue channel of this VisColor. */ - uint8_t unused; /**< Unused. */ -}; - -VisColor *visual_color_new (void); -int visual_color_compare (VisColor *src1, VisColor *src2); -int visual_color_from_hsv (VisColor *color, float h, float s, float v); -int visual_color_to_hsv (VisColor *color, float *h, float *s, float *v); -int visual_color_copy (VisColor *dest, VisColor *src); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _LV_COLOR_H */
--- a/libvisual/lv_common.h Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,62 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _LV_COMMON_H -#define _LV_COMMON_H - -#include <libvisual/lv_mem.h> -#include <libvisual/lv_log.h> -#include <libvisual/lv_error.h> -#include <libvisual/lv_types.h> -#include <libvisual/lv_object.h> - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#ifndef NULL -/** - * NULL define. - */ -#define NULL (0) -#endif - -#ifndef FALSE -/** - * FALSE define. - */ -#define FALSE (0) -#endif - -#ifndef TRUE -/** - * TRUE define. - */ -#define TRUE (!FALSE) -#endif - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _LV_COMMON_H */
--- a/libvisual/lv_cpu.c Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,459 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * Chong Kai Xiong <descender@phreaker.net> - * Eric Anholt <anholt@FreeBSD.org> - * - * Extra Credits: MPlayer cpudetect hackers. - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/* FIXME: clean this entire file up */ - -#include "lvconfig.h" - -#if defined(VISUAL_ARCH_POWERPC) -#if defined(VISUAL_OS_DARWIN) -#include <sys/sysctl.h> -#else -#include <signal.h> -#include <setjmp.h> -#endif -#endif - -#if defined(VISUAL_OS_NETBSD) || defined(VISUAL_OS_OPENBSD) -#include <sys/param.h> -#include <sys/sysctl.h> -#include <machine/cpu.h> -#endif - -#if defined(VISUAL_OS_FREEBSD) -#include <sys/types.h> -#include <sys/sysctl.h> -#endif - -#if defined(VISUAL_OS_LINUX) -#include <signal.h> -#endif - -#if defined(VISUAL_OS_WIN32) -#include <windows.h> -#endif - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> - -#include "lv_log.h" -#include "lv_cpu.h" - -static VisCPU _lv_cpu_caps; -static int _lv_cpu_initialized = FALSE; - -static int has_cpuid (void); -static int cpuid (unsigned int ax, unsigned int *p); - -/* The sigill handlers */ -#if defined(VISUAL_ARCH_X86) //x86 (linux katmai handler check thing) -#if defined(VISUAL_OS_LINUX) && defined(_POSIX_SOURCE) && defined(X86_FXSR_MAGIC) -static void sigill_handler_sse( int signal, struct sigcontext sc ) -{ - /* Both the "xorps %%xmm0,%%xmm0" and "divps %xmm0,%%xmm1" - * instructions are 3 bytes long. We must increment the instruction - * pointer manually to avoid repeated execution of the offending - * instruction. - * - * If the SIGILL is caused by a divide-by-zero when unmasked - * exceptions aren't supported, the SIMD FPU status and control - * word will be restored at the end of the test, so we don't need - * to worry about doing it here. Besides, we may not be able to... - */ - sc.eip += 3; - - _lv_cpu_caps.hasSSE=0; -} - -static void sigfpe_handler_sse( int signal, struct sigcontext sc ) -{ - if ( sc.fpstate->magic != 0xffff ) { - /* Our signal context has the extended FPU state, so reset the - * divide-by-zero exception mask and clear the divide-by-zero - * exception bit. - */ - sc.fpstate->mxcsr |= 0x00000200; - sc.fpstate->mxcsr &= 0xfffffffb; - } else { - /* If we ever get here, we're completely hosed. - */ - } -} -#endif -#endif /* VISUAL_OS_LINUX && _POSIX_SOURCE && X86_FXSR_MAGIC */ - -#if defined(VISUAL_OS_WIN32) -LONG CALLBACK win32_sig_handler_sse(EXCEPTION_POINTERS* ep) -{ - if(ep->ExceptionRecord->ExceptionCode==EXCEPTION_ILLEGAL_INSTRUCTION){ - ep->ContextRecord->Eip +=3; - _lv_cpu_caps.hasSSE=0; - return EXCEPTION_CONTINUE_EXECUTION; - } - return EXCEPTION_CONTINUE_SEARCH; -} -#endif /* VISUAL_OS_WIN32 */ - - -#if defined(VISUAL_ARCH_POWERPC) && !defined(VISUAL_OS_DARWIN) -static sigjmp_buf _lv_powerpc_jmpbuf; -static volatile sig_atomic_t _lv_powerpc_canjump = 0; - -static void sigill_handler (int sig); - -static void sigill_handler (int sig) -{ - if (!_lv_powerpc_canjump) { - signal (sig, SIG_DFL); - raise (sig); - } - - _lv_powerpc_canjump = 0; - siglongjmp (_lv_powerpc_jmpbuf, 1); -} - -static void check_os_altivec_support( void ) -{ -#if defined(VISUAL_OS_DARWIN) - int sels[2] = {CTL_HW, HW_VECTORUNIT}; - int has_vu = 0; - size_t len = sizeof(has_vu); - int err; - - err = sysctl (sels, 2, &has_vu, &len, NULL, 0); - - if (err == 0) - if (has_vu != 0) - _lv_cpu_caps.hasAltiVec = 1; -#else /* !VISUAL_OS_DARWIN */ - /* no Darwin, do it the brute-force way */ - /* this is borrowed from the libmpeg2 library */ - signal (SIGILL, sigill_handler); - if (sigsetjmp (_lv_powerpc_jmpbuf, 1)) { - signal (SIGILL, SIG_DFL); - } else { - _lv_powerpc_canjump = 1; - - asm volatile - ("mtspr 256, %0\n\t" - "vand %%v0, %%v0, %%v0" - : - : "r" (-1)); - - signal (SIGILL, SIG_DFL); - _lv_cpu_caps.hasAltiVec = 1; - } -#endif -} -#endif - -/* If we're running on a processor that can do SSE, let's see if we - * are allowed to or not. This will catch 2.4.0 or later kernels that - * haven't been configured for a Pentium III but are running on one, - * and RedHat patched 2.2 kernels that have broken exception handling - * support for user space apps that do SSE. - */ -static void check_os_katmai_support( void ) -{ -// printf ("omg\n"); -#if defined(VISUAL_ARCH_X86) -#if defined(VISUAL_OS_FREEBSD) - int has_sse=0, ret; - size_t len=sizeof(has_sse); - - ret = sysctlbyname("hw.instruction_sse", &has_sse, &len, NULL, 0); - if (ret || !has_sse) - _lv_cpu_caps.hasSSE=0; - -#elif defined(VISUAL_OS_NETBSD) || defined(VISUAL_OS_OPENBSD) - int has_sse, has_sse2, ret, mib[2]; - size_t varlen; - - mib[0] = CTL_MACHDEP; - mib[1] = CPU_SSE; - varlen = sizeof(has_sse); - - ret = sysctl(mib, 2, &has_sse, &varlen, NULL, 0); - if (ret < 0 || !has_sse) { - _lv_cpu_caps.hasSSE=0; - } else { - _lv_cpu_caps.hasSSE=1; - } - - mib[1] = CPU_SSE2; - varlen = sizeof(has_sse2); - ret = sysctl(mib, 2, &has_sse2, &varlen, NULL, 0); - if (ret < 0 || !has_sse2) { - _lv_cpu_caps.hasSSE2=0; - } else { - _lv_cpu_caps.hasSSE2=1; - } - _lv_cpu_caps.hasSSE = 0; /* FIXME ?!?!? */ - -#elif defined(VISUAL_OS_WIN32) - LPTOP_LEVEL_EXCEPTION_FILTER exc_fil; - if ( _lv_cpu_caps.hasSSE ) { - exc_fil = SetUnhandledExceptionFilter(win32_sig_handler_sse); - __asm __volatile ("xorps %xmm0, %xmm0"); - SetUnhandledExceptionFilter(exc_fil); - } -#elif defined(VISUAL_OS_LINUX) -// printf ("omg1\n"); -// printf ("omg2\n"); - struct sigaction saved_sigill; - struct sigaction saved_sigfpe; - - /* Save the original signal handlers. - */ - sigaction( SIGILL, NULL, &saved_sigill ); - sigaction( SIGFPE, NULL, &saved_sigfpe ); - -#if 0 /* broken :( --nenolod */ - signal( SIGILL, (void (*)(int))sigill_handler_sse ); - signal( SIGFPE, (void (*)(int))sigfpe_handler_sse ); -#endif - - /* Emulate test for OSFXSR in CR4. The OS will set this bit if it - * supports the extended FPU save and restore required for SSE. If - * we execute an SSE instruction on a PIII and get a SIGILL, the OS - * doesn't support Streaming SIMD Exceptions, even if the processor - * does. - */ - if ( _lv_cpu_caps.hasSSE ) { - __asm __volatile ("xorps %xmm1, %xmm0"); - } - - /* Emulate test for OSXMMEXCPT in CR4. The OS will set this bit if - * it supports unmasked SIMD FPU exceptions. If we unmask the - * exceptions, do a SIMD divide-by-zero and get a SIGILL, the OS - * doesn't support unmasked SIMD FPU exceptions. If we get a SIGFPE - * as expected, we're okay but we need to clean up after it. - * - * Are we being too stringent in our requirement that the OS support - * unmasked exceptions? Certain RedHat 2.2 kernels enable SSE by - * setting CR4.OSFXSR but don't support unmasked exceptions. Win98 - * doesn't even support them. We at least know the user-space SSE - * support is good in kernels that do support unmasked exceptions, - * and therefore to be safe I'm going to leave this test in here. - */ - if ( _lv_cpu_caps.hasSSE ) { - // test_os_katmai_exception_support(); - } - - /* Restore the original signal handlers. - */ - sigaction( SIGILL, &saved_sigill, NULL ); - sigaction( SIGFPE, &saved_sigfpe, NULL ); - -#else -// printf ("hier dan3\n"); - /* We can't use POSIX signal handling to test the availability of - * SSE, so we disable it by default. - */ - _lv_cpu_caps.hasSSE=0; -#endif /* __linux__ */ -// printf ("hier dan\n"); -#endif -// printf ("hier dan ha\n"); -} - - -static int has_cpuid (void) -{ -#ifdef VISUAL_ARCH_X86 - int a, c; - - __asm __volatile - ("pushf\n" - "popl %0\n" - "movl %0, %1\n" - "xorl $0x200000, %0\n" - "push %0\n" - "popf\n" - "pushf\n" - "popl %0\n" - : "=a" (a), "=c" (c) - : - : "cc"); - - return a != c; -#else - return 0; -#endif -} - -static int cpuid (unsigned int ax, unsigned int *p) -{ -#ifdef VISUAL_ARCH_X86 - uint32_t flags; - - __asm __volatile - ("movl %%ebx, %%esi\n\t" - "cpuid\n\t" - "xchgl %%ebx, %%esi" - : "=a" (p[0]), "=S" (p[1]), - "=c" (p[2]), "=d" (p[3]) - : "0" (ax)); - - return VISUAL_OK; -#else - return VISUAL_ERROR_CPU_INVALID_CODE; -#endif -} - -/** - * @defgroup VisCPU VisCPU - * @{ - */ - -void visual_cpu_initialize () -{ - uint32_t cpu_flags; - unsigned int regs[4]; - unsigned int regs2[4]; - - memset (&_lv_cpu_caps, 0, sizeof (VisCPU)); - - /* Check for arch type */ -#if defined(VISUAL_ARCH_MIPS) - _lv_cpu_caps.type = VISUAL_CPU_TYPE_MIPS; -#elif defined(VISUAL_ARCH_ALPHA) - _lv_cpu_caps.type = VISUAL_CPU_TYPE_ALPHA; -#elif defined(VISUAL_ARCH_SPARC) - _lv_cpu_caps.type = VISUAL_CPU_TYPE_SPARC; -#elif defined(VISUAL_ARCH_X86) - _lv_cpu_caps.type = VISUAL_CPU_TYPE_X86; -#elif defined(VISUAL_ARCH_POWERPC) - _lv_cpu_caps.type = VISUAL_CPU_TYPE_POWERPC; -#else - _lv_cpu_caps.type = VISUAL_CPU_TYPE_OTHER; -#endif - - /* Count the number of CPUs in system */ -#if !defined(VISUAL_OS_WIN32) && !defined(VISUAL_OS_UNKNOWN) - _lv_cpu_caps.nrcpu = sysconf (_SC_NPROCESSORS_ONLN); - if (_lv_cpu_caps.nrcpu == -1) - _lv_cpu_caps.nrcpu = 1; -#else - _lv_cpu_caps.nrcpu = 1; -#endif - -#if defined(VISUAL_ARCH_X86) - /* No cpuid, old 486 or lower */ - if (has_cpuid () == 0) - return; - - _lv_cpu_caps.cacheline = 32; - - /* Get max cpuid level */ - cpuid (0x00000000, regs); - - if (regs[0] >= 0x00000001) { - unsigned int cacheline; - - cpuid (0x00000001, regs2); - - _lv_cpu_caps.x86cpuType = (regs2[0] >> 8) & 0xf; - if (_lv_cpu_caps.x86cpuType == 0xf) - _lv_cpu_caps.x86cpuType = 8 + ((regs2[0] >> 20) & 255); /* use extended family (P4, IA64) */ - - /* general feature flags */ - _lv_cpu_caps.hasTSC = (regs2[3] & (1 << 8 )) >> 8; /* 0x0000010 */ - _lv_cpu_caps.hasMMX = (regs2[3] & (1 << 23 )) >> 23; /* 0x0800000 */ - _lv_cpu_caps.hasSSE = (regs2[3] & (1 << 25 )) >> 25; /* 0x2000000 */ - _lv_cpu_caps.hasSSE2 = (regs2[3] & (1 << 26 )) >> 26; /* 0x4000000 */ - _lv_cpu_caps.hasMMX2 = _lv_cpu_caps.hasSSE; /* SSE cpus supports mmxext too */ - - cacheline = ((regs2[1] >> 8) & 0xFF) * 8; - if (cacheline > 0) - _lv_cpu_caps.cacheline = cacheline; - } - - cpuid (0x80000000, regs); - - if (regs[0] >= 0x80000001) { - - cpuid (0x80000001, regs2); - - _lv_cpu_caps.hasMMX |= (regs2[3] & (1 << 23 )) >> 23; /* 0x0800000 */ - _lv_cpu_caps.hasMMX2 |= (regs2[3] & (1 << 22 )) >> 22; /* 0x400000 */ - _lv_cpu_caps.has3DNow = (regs2[3] & (1 << 31 )) >> 31; /* 0x80000000 */ - _lv_cpu_caps.has3DNowExt = (regs2[3] & (1 << 30 )) >> 30; - } - - if (regs[0] >= 0x80000006) { - cpuid (0x80000006, regs2); - _lv_cpu_caps.cacheline = regs2[2] & 0xFF; - } - - -#if defined(VISUAL_OS_LINUX) || defined(VISUAL_OS_FREEBSD) || defined(VISUAL_OS_NETBSD) || defined(VISUAL_OS_CYGWIN) || defined(VISUAL_OS_OPENBSD) - if (_lv_cpu_caps.hasSSE) - check_os_katmai_support (); - - if (!_lv_cpu_caps.hasSSE) - _lv_cpu_caps.hasSSE2 = 0; -#else - _lv_cpu_caps.hasSSE=0; - _lv_cpu_caps.hasSSE2 = 0; -#endif -#endif /* VISUAL_ARCH_X86 */ - -#if VISUAL_ARCH_POWERPC - check_os_altivec_support (); -#endif /* VISUAL_ARCH_POWERPC */ - - visual_log (VISUAL_LOG_DEBUG, "CPU: Number of CPUs: %d", _lv_cpu_caps.nrcpu); - visual_log (VISUAL_LOG_DEBUG, "CPU: type %d", _lv_cpu_caps.type); - visual_log (VISUAL_LOG_DEBUG, "CPU: X86 type %d", _lv_cpu_caps.x86cpuType); - visual_log (VISUAL_LOG_DEBUG, "CPU: cacheline %d", _lv_cpu_caps.cacheline); - visual_log (VISUAL_LOG_DEBUG, "CPU: TSC %d", _lv_cpu_caps.hasTSC); - visual_log (VISUAL_LOG_DEBUG, "CPU: MMX %d", _lv_cpu_caps.hasMMX); - visual_log (VISUAL_LOG_DEBUG, "CPU: MMX2 %d", _lv_cpu_caps.hasMMX2); - visual_log (VISUAL_LOG_DEBUG, "CPU: SSE %d", _lv_cpu_caps.hasSSE); - visual_log (VISUAL_LOG_DEBUG, "CPU: SSE2 %d", _lv_cpu_caps.hasSSE2); - visual_log (VISUAL_LOG_DEBUG, "CPU: 3DNow %d", _lv_cpu_caps.has3DNow); - visual_log (VISUAL_LOG_DEBUG, "CPU: 3DNowExt %d", _lv_cpu_caps.has3DNowExt); - visual_log (VISUAL_LOG_DEBUG, "CPU: AltiVec %d", _lv_cpu_caps.hasAltiVec); - - _lv_cpu_initialized = TRUE; -} - -VisCPU *visual_cpu_get_caps () -{ - if (_lv_cpu_initialized == FALSE) - return NULL; - - return &_lv_cpu_caps; -} - -/** - * @} - */ -
--- a/libvisual/lv_cpu.h Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,77 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * Chong Kai Xiong <descender@phreaker.net> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _LV_CPU_H -#define _LV_CPU_H - -#include <libvisual/lvconfig.h> -#include <libvisual/lv_common.h> - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -typedef enum { - VISUAL_CPU_TYPE_MIPS, - VISUAL_CPU_TYPE_ALPHA, - VISUAL_CPU_TYPE_SPARC, - VISUAL_CPU_TYPE_X86, - VISUAL_CPU_TYPE_POWERPC, - VISUAL_CPU_TYPE_OTHER -} VisCPUType; - -typedef struct _VisCPU VisCPU; - -/** - * This VisCPU structure contains information regarding the processor. - * - * @see visual_cpu_get_info - */ -struct _VisCPU { - VisObject object; /**< The VisObject data. */ - VisCPUType type; /**< Contains the CPU/arch type. */ - int nrcpu; /**< Contains the number of CPUs in the system. */ - - /* Feature flags */ - int x86cpuType; - int cacheline; - int hasTSC; - int hasMMX; - int hasMMX2; - int hasSSE; - int hasSSE2; - int has3DNow; - int has3DNowExt; - - int hasAltiVec; -}; - -void visual_cpu_initialize (void); -VisCPU *visual_cpu_get_caps (void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _LV_CPU_H */
--- a/libvisual/lv_endianess.h Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,75 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _LV_ENDIANESS_H -#define _LV_ENDIANESS_H - -#include <libvisual/lvconfig.h> - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/** - * Macros to convert LE <-> BE - * 'I' stands for integer here. - */ -#define VISUAL_ENDIAN_LE_BE_I16(w) (\ - (((w) & 0xff00) >> 8) |\ - (((w) & 0x00ff) << 8) ) - -#define VISUAL_ENDIAN_LE_BE_I32(w) (\ - (((w) & 0x000000ff) << 24) | \ - (((w) & 0x0000ff00) << 8) | \ - (((w) & 0x00ff0000) >> 8) | \ - (((w) & 0xff000000) >> 24) ) - - -#if VISUAL_BIG_ENDIAN & VISUAL_LITTLE_ENDIAN -# error determining system endianess. -#endif - -/** - * Arch. dependant definitions - */ - -#if VISUAL_BIG_ENDIAN -# define VISUAL_ENDIAN_BEI16(x) (x) -# define VISUAL_ENDIAN_BEI32(x) (x) -# define VISUAL_ENDIAN_LEI16(x) VISUAL_ENDIAN_LE_BE_I16(x) -# define VISUAL_ENDIAN_LEI32(x) VISUAL_ENDIAN_LE_BE_I32(x) -#endif - -#if VISUAL_LITTLE_ENDIAN -# define VISUAL_ENDIAN_LEI16(x) (x) -# define VISUAL_ENDIAN_LEI32(x) (x) -# define VISUAL_ENDIAN_BEI16(x) VISUAL_ENDIAN_LE_BE_I16(x) -# define VISUAL_ENDIAN_BEI32(x) VISUAL_ENDIAN_LE_BE_I32(x) -#endif - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _LV_ENDIANESS_H */
--- a/libvisual/lv_error.c Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,223 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include <stdlib.h> -#include <stdio.h> -#include <unistd.h> -#include <string.h> -#include <assert.h> -#include <signal.h> - -#include "lv_log.h" -#include "lv_error.h" - -static const char *__lv_error_human_readable[] = { - "There was no error", /* VISUAL_OK */ - - "General error occurred", /* VISUAL_ERROR_GENERAL */ - "General NULL pointer error", /* VISUAL_ERROR_NULL */ - "An impossible event occurred", /* VISUAL_ERROR_IMPOSSIBLE */ - - "VisActor is NULL", /* VISUAL_ERROR_ACTOR_NULL */ - "VisActor it's video is NULL", /* VISUAL_ERROR_ACTOR_VIDEO_NULL */ - "VisActor it's plugin is NULL", /* VISUAL_ERROR_ACTOR_PLUGIN_NULL */ - "VisActor failed while trying to forcefully negotiate a GL surface", /* VISUAL_ERROR_ACTOR_GL_NEGOTIATE */ - - "VisAudio is NULL", /* VISUAL_ERROR_AUDIO_NULL */ - - "Bitmap is not a bitmap file", /* VISUAL_ERROR_BMP_NO_BMP */ - "Bitmap can not be found", /* VISUAL_ERROR_BMP_NOT_FOUND */ - "Bitmap is not supported", /* VISUAL_ERROR_BMP_NOT_SUPPORTED */ - "Bitmap is corrupted", /* VISUAL_ERROR_BMP_CORRUPTED */ - - "VisColor is NULL", /* VISUAL_ERROR_COLOR_NULL */ - - "The code can not run on this architecture", /* VISUAL_ERROR_CPU_INVALID_CODE */ - - "Global error handler is NULL", /* VISUAL_ERROR_ERROR_HANDLER_NULL */ - - "VisEvent is NULL", /* VISUAL_ERROR_EVENT_NULL */ - "VisEventQueue is NULL", /* VISUAL_ERROR_EVENT_QUEUE_NULL */ - - "VisInput is NULL", /* VISUAL_ERROR_INPUT_NULL */ - "VisInput it's plugin is NULL", /* VISUAL_ERROR_INPUT_PLUGIN_NULL */ - - "No paths were given to seek for plugins", /* VISUAL_ERROR_LIBVISUAL_NO_PATHS */ - "Libvisual is already initialized", /* VISUAL_ERROR_LIBVISUAL_ALREADY_INITIALIZED */ - "Libvisual is not initialized", /* VISUAL_ERROR_LIBVISUAL_NOT_INITIALIZED */ - "Libvisual has not build a plugin registry", /* VISUAL_ERROR_LIBVISUAL_NO_REGISTRY */ - - "VisList is NULL", /* VISUAL_ERROR_LIST_NULL */ - "VisListEntry is NULL", /* VISUAL_ERROR_LIST_ENTRY_NULL */ - "VisListEntry is invalid", /* VISUAL_ERROR_LIST_ENTRY_INVALID */ - - "Given memory pointer is NULL", /* VISUAL_ERROR_MEM_NULL */ - - "VisMorph is NULL", /* VISUAL_ERROR_MORPH_NULL */ - "VisMorph it's plugin is NULL", /* VISUAL_ERROR_MORPH_PLUGIN_NULL */ - - "VisPalette is NULL", /* VISUAL_ERROR_PALETTE_NULL */ - "VisPalette it's size conflicts", /* VISUAL_ERROR_PALETTE_SIZE */ - - "VisParamEntry is NULL", /* VISUAL_ERROR_PARAM_NULL */ - "VisParamContainer is NULL", /* VISUAL_ERROR_PARAM_CONTAINER_NULL */ - "VisParamEntry not found in VisParamContainer", /* VISUAL_ERROR_PARAM_NOT_FOUND */ - "VisParamEntry it's change notify callback is NULL", /* VISUAL_ERROR_PARAM_CALLBACK_NULL */ - "VisParamEntry contains too many change notify callbacks", /* VISUAL_ERROR_PARAM_CALLBACK_TOO_MANY */ - "VisParamEntry is of invalid type", /* VISUAL_ERROR_PARAM_INVALID_TYPE */ - - "VisPluginData is NULL", /* VISUAL_ERROR_PLUGIN_NULL */ - "VisPluginInfo is NULL", /* VISUAL_ERROR_PLUGIN_INFO_NULL */ - "VisPluginRef is NULL", /* VISUAL_ERROR_PLUGIN_REF_NULL */ - "VisPluginEnvironElement is NULL", /* VISUAL_ERROR_PLUGIN_ENVIRON_NULL */ - "Plugin does not have an event handler", /* VISUAL_ERROR_PLUGIN_NO_EVENT_HANDLER */ - "Plugin handle is NULL", /* VISUAL_ERROR_PLUGIN_HANDLE_NULL */ - "Plugin is already realized", /* VISUAL_ERROR_PLUGIN_ALREADY_REALIZED */ - - "VisRandomContext is NULL", /* VISUAL_ERROR_RANDOM_CONTEXT_NULL */ - - "VisSongInfo is NULL", /* VISUAL_ERROR_SONGINFO_NULL */ - - "VisThread is NULL", /* VISUAL_ERROR_THREAD_NULL */ - "Threading is disabled or not supported", /* VISUAL_ERROR_THREAD_NO_THREADING */ - "VisMutex is NULL", /* VISUAL_ERROR_MUTEX_NULL */ - "VisMutex lock failed", /* VISUAL_ERROR_MUTEX_LOCK_FAILURE */ - "VisMutex trylock failed", /* VISUAL_ERROR_MUTEX_TRYLOCK_FAILURE */ - "VisMutex unlock failed", /* VISUAL_ERROR_MUTEX_UNLOCK_FAILURE */ - - "VisTransform is NULL", /* VISUAL_ERROR_TRANSFORM_NULL */ - "The VisTransform negotiate with the target VisVideo failed", /* VISUAL_ERROR_TRANSFORM_NEGOTIATE */ - "The VisTransform it's plugin is NULL", /* VISUAL_ERROR_TRANSFORM_PLUGIN_NULL */ - "The VisTransform it's video is NULL", /* VISUAL_ERROR_TRANSFORM_VIDEO_NULL */ - "The VisTransform it's palette is NULL", /* VISUAL_ERROR_TRANSFORM_PALETTE_NULL */ - - "VisObject destruction failed", /* VISUAL_ERROR_OBJECT_DTOR_FAILED */ - "VisObject is NULL", /* VISUAL_ERROR_OBJECT_NULL */ - "VisObject is not allocated", /* VISUAL_ERROR_OBJECT_NOT_ALLOCATED */ - - "VisTime is NULL", /* VISUAL_ERROR_TIME_NULL */ - "visual_time_usleep() is not supported", /* VISUAL_ERROR_TIME_NO_USLEEP */ - "VisTimer is NULL", /* VISUAL_ERROR_TIMER_NULL */ - - "VisUIWidget is NULL", /* VISUAL_ERROR_UI_WIDGET_NULL */ - "VisUIContainer is NULL", /* VISUAL_ERROR_UI_CONTAINER_NULL */ - "VisUIBox is NULL", /* VISUAL_ERROR_UI_BOX_NULL */ - "VisUITable is NULL", /* VISUAL_ERROR_UI_TABLE_NULL */ - "VisUIFrame is NULL", /* VISUAL_ERROR_UI_FRAME_NULL */ - "VisUILabel is NULL", /* VISUAL_ERROR_UI_LABEL_NULL */ - "VisUIImage is NULL", /* VISUAL_ERROR_UI_IMAGE_NULL */ - "VisUISeparator is NULL", /* VISUAL_ERROR_UI_SEPARATOR_NULL */ - "VisUIMutator is NULL", /* VISUAL_ERROR_UI_MUTATOR_NULL */ - "VisUIRange is NULL", /* VISUAL_ERROR_UI_RANGE_NULL */ - "VisUIEntry is NULL", /* VISUAL_ERROR_UI_ENTRY_NULL */ - "VisUISlider is NULL", /* VISUAL_ERROR_UI_SLIDER_NULL */ - "VisUINumeric is NULL", /* VISUAL_ERROR_UI_NUMERIC_NULL */ - "VisUIColor is NULL", /* VISUAL_ERROR_UI_COLOR_NULL */ - "VisUIChoice is NULL", /* VISUAL_ERROR_UI_CHOICE_NULL */ - "VisUIPopup is NULL", /* VISUAL_ERROR_UI_POPUP_NULL */ - "VisUIList is NULL", /* VISUAL_ERROR_UI_LIST_NULL */ - "VisUIRadio is NULL", /* VISUAL_ERROR_UI_RADIO_NULL */ - "VisUICheckbox is NULL", /* VISUAL_ERROR_UI_CHECKBOX_NULL */ - "VisUIChoiceEntry is NULL", /* VISUAL_ERROR_UI_CHOICE_ENTRY_NULL */ - "No choice in VisUIChoice is activated", /* VISUAL_ERROR_UI_CHOICE_NONE_ACTIVE */ - - "VisVideo is NULL", /* VISUAL_ERROR_VIDEO_NULL */ - "VisVideo has allocated pixel buffer", /* VISUAL_ERROR_VIDEO_HAS_ALLOCATED */ - "VisVideo it's pixel buffer is NULL", /* VISUAL_ERROR_VIDEO_PIXELS_NULL */ - "VisVideo it's pixel buffer is not allocated", /* VISUAL_ERROR_VIDEO_NO_ALLOCATED */ - "VisVideo has pixel buffer", /* VISUAL_ERROR_VIDEO_HAS_PIXELS */ - "VisVideo is of invalid bytes per pixel", /* VISUAL_ERROR_VIDEO_INVALID_BPP */ - "VisVideo is of invalid depth", /* VISUAL_ERROR_VIDEO_INVALID_DEPTH */ - "Invalid scale method given", /* VISUAL_ERROR_VIDEO_INVALID_SCALE_METHOD */ - "Given coordinates are out of bounds", /* VISUAL_ERROR_VIDEO_OUT_OF_BOUNDS */ - "Given VisVideos are not indentical", /* VISUAL_ERROR_VIDEO_NOT_INDENTICAL */ - "VisVideo is not depth transformed as requested" /* VISUAL_ERROR_VIDEO_NOT_TRANSFORMED */ -}; - -static VisErrorHandlerFunc error_handler = NULL; -static void *error_handler_priv = NULL; - -/** - * @defgroup VisError VisError - * @{ - */ - -/** - * Raise a libvisual error. With the standard error handler this will - * do a raise(SIGTRAP). You can set your own error handler function using the - * visual_error_set_handler. - * - * @see visual_error_set_handler - * - * @return Returns the return value from the handler that is set. - */ -int visual_error_raise () -{ - if (error_handler == NULL) { - raise (SIGTRAP); - exit (1); - } - - return error_handler (error_handler_priv); -} - -/** - * Sets the error handler callback. By using this function you - * can override libvisual it's default error handler. - * - * @param handler The error handler which you want to use - * to handle libvisual errors. - * @param priv Optional private data which could be needed in the - * error handler that has been set. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_ERROR_HANDLER_NULL on failure. - */ -int visual_error_set_handler (VisErrorHandlerFunc handler, void *priv) -{ - visual_log_return_val_if_fail (handler != NULL, -VISUAL_ERROR_ERROR_HANDLER_NULL); - - error_handler = handler; - error_handler_priv = priv; - - return VISUAL_OK; -} - -/** - * Translates an error into a human readable string, the returned string should not be freed. - * - * @param err Numeric error value. - * - * @return Human readable string, or NULL on failure. - */ -const char *visual_error_to_string (int err) -{ - if (abs (err) >= VISUAL_ERROR_LIST_END) - return "The error value given to visual_error_to_string() is invalid"; - - return __lv_error_human_readable[abs (err)]; -} - -/** - * @} - */ -
--- a/libvisual/lv_error.h Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,206 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _LV_ERROR_H -#define _LV_ERROR_H - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/* WARNING when you add an new error to this list, make sure that you update lv_error.c it's - * human readable string list as well!!! */ -/** - * Enumerate of all possible numeric error values. - */ -enum { - /* Ok! */ - VISUAL_OK, /**< No error. */ - - /* Standard error entries */ - VISUAL_ERROR_GENERAL, /**< General error. */ - VISUAL_ERROR_NULL, /**< Something is NULL that shouldn't be. */ - VISUAL_ERROR_IMPOSSIBLE, /**< The impossible happened, this should never happen. */ - - /* Error entries for the VisActor system */ - VISUAL_ERROR_ACTOR_NULL, /**< The VisActor is NULL. */ - VISUAL_ERROR_ACTOR_VIDEO_NULL, /**< The VisVideo target member in the VisActor is NULL. */ - VISUAL_ERROR_ACTOR_PLUGIN_NULL, /**< The VisActor plugin in this context is NULL. */ - VISUAL_ERROR_ACTOR_GL_NEGOTIATE, /**< Tried depth forcing a GL VisACtor. */ - - /* Error entries for the VisAudio system */ - VISUAL_ERROR_AUDIO_NULL, /**< The VisAudio is NULL. */ - - /* Error entries for the VisBMP system */ - VISUAL_ERROR_BMP_NO_BMP, /**< Not a bitmap file. */ - VISUAL_ERROR_BMP_NOT_FOUND, /**< File not found. */ - VISUAL_ERROR_BMP_NOT_SUPPORTED, /**< File format not supported. */ - VISUAL_ERROR_BMP_CORRUPTED, /**< Bitmap file is corrupted. */ - - /* Error entries for the VisColor system */ - VISUAL_ERROR_COLOR_NULL, /**< The VisColor is NULL. */ - - /* Error entries for arch related errors and VisCPU system */ - VISUAL_ERROR_CPU_INVALID_CODE, - - /* Error entries for the VisError system */ - VISUAL_ERROR_ERROR_HANDLER_NULL, /**< Error handler is NULL. */ - - /* Error entries for the VisEvent system */ - VISUAL_ERROR_EVENT_NULL, /**< The VisEvent is NULL. */ - VISUAL_ERROR_EVENT_QUEUE_NULL, /**< The VisEventQueue is nULL. */ - - /* Error entries for the VisInput system */ - VISUAL_ERROR_INPUT_NULL, /**< The VisInput is NULL. */ - VISUAL_ERROR_INPUT_PLUGIN_NULL, /**< The VisInputPlugin is NULL. */ - - /* Error entries for the VisLibvisual system */ - VISUAL_ERROR_LIBVISUAL_NO_PATHS, /**< Paths can be added to plugin dir list. */ - VISUAL_ERROR_LIBVISUAL_ALREADY_INITIALIZED, /**< Libvisual is already initialized. */ - VISUAL_ERROR_LIBVISUAL_NOT_INITIALIZED, /**< Libvisual is not initialized. */ - VISUAL_ERROR_LIBVISUAL_NO_REGISTRY, /**< No internal plugin registry is set up. */ - - /* Error entries for the VisList system */ - VISUAL_ERROR_LIST_NULL, /**< The VisList is NULL. */ - VISUAL_ERROR_LIST_ENTRY_NULL, /**< The VisListEntry is NULL. */ - VISUAL_ERROR_LIST_ENTRY_INVALID, /**< The VisListEntry is invalid. */ - - /* Error entries for the VisMem system */ - VISUAL_ERROR_MEM_NULL, /**< The memory pointer given is NULL. */ - - /* Error entries for the VisMorph system */ - VISUAL_ERROR_MORPH_NULL, /**< The VisMorph is NULL. */ - VISUAL_ERROR_MORPH_PLUGIN_NULL, /**< The VisMorphPlugin is NULL. */ - - /* Error entries for the VisPalette system */ - VISUAL_ERROR_PALETTE_NULL, /**< The VisPalette is NULL. */ - VISUAL_ERROR_PALETTE_SIZE, /**< Given VisPalette entries are not of the same size. */ - - /* Error entries for the VisParam system */ - VISUAL_ERROR_PARAM_NULL, /**< The VisParamEntry is NULL. */ - VISUAL_ERROR_PARAM_CONTAINER_NULL, /**< The VisParamContainer is NULL. */ - VISUAL_ERROR_PARAM_NOT_FOUND, /**< The requested VisParamEntry is not found. */ - VISUAL_ERROR_PARAM_CALLBACK_NULL, /**< The given param change callback is NULL. */ - VISUAL_ERROR_PARAM_CALLBACK_TOO_MANY, /**< Too many param change callbacks are registered. */ - VISUAL_ERROR_PARAM_INVALID_TYPE, /**< The VisParamEntry is of invalid type. */ - - /* Error entries for the VisPlugin system */ - VISUAL_ERROR_PLUGIN_NULL, /**< The VisPluginData is NULL. */ - VISUAL_ERROR_PLUGIN_INFO_NULL, /**< The VisPluginInfo is NULL. */ - VISUAL_ERROR_PLUGIN_REF_NULL, /**< The VisPluginRef is NULL. */ - VISUAL_ERROR_PLUGIN_ENVIRON_NULL, /**< The VisPluginEnvironElement is NULL. */ - VISUAL_ERROR_PLUGIN_NO_EVENT_HANDLER, /**< The plugin has no event handler registrated. */ - VISUAL_ERROR_PLUGIN_HANDLE_NULL, /**< The dlopen handle of the plugin is NULL. */ - VISUAL_ERROR_PLUGIN_ALREADY_REALIZED, /**< The plugin is already realized. */ - - /* Error entries for the VisRandom system */ - VISUAL_ERROR_RANDOM_CONTEXT_NULL, /**< The VisRandomContext is NULL. */ - - /* Error entries for the VisSonginfo system */ - VISUAL_ERROR_SONGINFO_NULL, /**< The VisSongInfo is NULL. */ - - /* Error entries for the VisThread system */ - VISUAL_ERROR_THREAD_NULL, /**< The VisThread is NULL. */ - VISUAL_ERROR_THREAD_NO_THREADING, /**< Threading is not supported in this build. */ - VISUAL_ERROR_MUTEX_NULL, /**< The VisMutex is NULL. */ - VISUAL_ERROR_MUTEX_LOCK_FAILURE, /**< Failed locking the VisMutex. */ - VISUAL_ERROR_MUTEX_TRYLOCK_FAILURE, /**< Failed trylocking the VisMutex. */ - VISUAL_ERROR_MUTEX_UNLOCK_FAILURE, /**< Failed unlocking the VisMutex. */ - - /* Error entries for the VisTransform system */ - VISUAL_ERROR_TRANSFORM_NULL, /**< The VisTransform is NULL. */ - VISUAL_ERROR_TRANSFORM_NEGOTIATE, /**< The VisTransform negotiate with the VisVideo failed. */ - VISUAL_ERROR_TRANSFORM_PLUGIN_NULL, /**< The VisTransform plugin in this context is NULL. */ - VISUAL_ERROR_TRANSFORM_VIDEO_NULL, /**< The VisVideo target member in the VisTransform is NULL. */ - VISUAL_ERROR_TRANSFORM_PALETTE_NULL, /**< The VisPalette target member in this VisTransform is NULL. */ - - /* Error entries for the VisObject system */ - VISUAL_ERROR_OBJECT_DTOR_FAILED, /**< The destructor assigned to a VisObject failed destroying the VisObject. */ - VISUAL_ERROR_OBJECT_NULL, /**< The VisObject is NULL. */ - VISUAL_ERROR_OBJECT_NOT_ALLOCATED, /**< The VisObject is not allocated. */ - - /* Error entries for the VisTime system */ - VISUAL_ERROR_TIME_NULL, /**< The VisTime is NULL. */ - VISUAL_ERROR_TIME_NO_USLEEP, /**< visual_time_usleep is not working on this system. */ - VISUAL_ERROR_TIMER_NULL, /**< The VisTimer is NULL. */ - - /* Error entries for the VisUI system */ - VISUAL_ERROR_UI_WIDGET_NULL, /**< The VisUIWidget is NULL. */ - VISUAL_ERROR_UI_CONTAINER_NULL, /**< The VisUIContainer is NULL. */ - VISUAL_ERROR_UI_BOX_NULL, /**< The VisUIBox is NULL. */ - VISUAL_ERROR_UI_TABLE_NULL, /**< The VisUITable is NULL. */ - VISUAL_ERROR_UI_FRAME_NULL, /**< The VisUIFrame is NULL. */ - VISUAL_ERROR_UI_LABEL_NULL, /**< The VisUILabel is NULL. */ - VISUAL_ERROR_UI_IMAGE_NULL, /**< The VisUIImage is NULL. */ - VISUAL_ERROR_UI_SEPARATOR_NULL, /**< The VisUISperator is NULL. */ - VISUAL_ERROR_UI_MUTATOR_NULL, /**< The VisUIMutator is NULL. */ - VISUAL_ERROR_UI_RANGE_NULL, /**< The VisUIRange is NULL. */ - VISUAL_ERROR_UI_ENTRY_NULL, /**< The VisUIEntry is NULL. */ - VISUAL_ERROR_UI_SLIDER_NULL, /**< The VisUISlider is NULL. */ - VISUAL_ERROR_UI_NUMERIC_NULL, /**< The VisUINumeric is NULL. */ - VISUAL_ERROR_UI_COLOR_NULL, /**< The VisUIColor is NULL. */ - VISUAL_ERROR_UI_CHOICE_NULL, /**< The VisUIChoice is NULL. */ - VISUAL_ERROR_UI_POPUP_NULL, /**< The VisUIPopup is NULL. */ - VISUAL_ERROR_UI_LIST_NULL, /**< The VisUIList is NULL. */ - VISUAL_ERROR_UI_RADIO_NULL, /**< The VisUIRadio is NULL. */ - VISUAL_ERROR_UI_CHECKBOX_NULL, /**< The VisUICheckbox is NULL. */ - VISUAL_ERROR_UI_CHOICE_ENTRY_NULL, /**< The VisUIChoiceEntry is NULL. */ - VISUAL_ERROR_UI_CHOICE_NONE_ACTIVE, /**< there is no VisUIChoiceEntry active. */ - - /* Error entries for the VisVideo system */ - VISUAL_ERROR_VIDEO_NULL, /**< The VisVideo is NULL. */ - VISUAL_ERROR_VIDEO_HAS_ALLOCATED, /**< The VisVideo has an allocated buffer. */ - VISUAL_ERROR_VIDEO_PIXELS_NULL, /**< The VisVideo doesn't point to a pixel buffer. */ - VISUAL_ERROR_VIDEO_NO_ALLOCATED, /**< The VisVideo doesn't have an allocated pixel buffer. */ - VISUAL_ERROR_VIDEO_HAS_PIXELS, /**< The VisVideo already points to a pixel buffer. */ - VISUAL_ERROR_VIDEO_INVALID_BPP, /**< The VisVideo it's bytes per pixel is invalid. */ - VISUAL_ERROR_VIDEO_INVALID_DEPTH, /**< The VisVideoDepth value is not valid. */ - VISUAL_ERROR_VIDEO_INVALID_SCALE_METHOD, /**< The VisVideoScaleMethod argument is not valid. */ - VISUAL_ERROR_VIDEO_OUT_OF_BOUNDS, /**< The X or Y value are greater than the VisVideo it's dimension. */ - VISUAL_ERROR_VIDEO_NOT_INDENTICAL, /**< The two VisVideo their configuration are not indentical. */ - VISUAL_ERROR_VIDEO_NOT_TRANSFORMED, /**< Could not depth transform a VisVideo. */ - - VISUAL_ERROR_LIST_END /**< Last entry, to check against for the number of errors. */ -}; - -/** - * Functions that want to handle libvisual errors must match this signature. The standard - * libvisual error handler aborts the program after an error by raise(SIGTRAP). If it's - * desired to override this use visual_set_error_handler to set your own error handler. - * - * @see visual_set_error_handler - * - * @arg priv Private field to be used by the client. The library will never touch this. - */ -typedef int (*VisErrorHandlerFunc) (void *priv); - -int visual_error_raise (void); -int visual_error_set_handler (VisErrorHandlerFunc handler, void *priv); - -const char *visual_error_to_string (int err); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _LV_ERROR_H */
--- a/libvisual/lv_event.c Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,454 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> - -#include "lvconfig.h" -#include "lv_event.h" -#include "lv_log.h" - -static int eventqueue_dtor (VisObject *object); - -static void event_list_destroy (void *data); - -static int eventqueue_dtor (VisObject *object) -{ - VisEventQueue *eventqueue = VISUAL_EVENTQUEUE (object); - - visual_list_destroy_elements (&eventqueue->events); - - return VISUAL_OK; -} - -static void event_list_destroy (void *data) -{ - VisEvent *event = VISUAL_EVENT (data); - - if (event == NULL) - return; - - visual_object_unref (VISUAL_OBJECT (event)); -} - - -/** - * @defgroup VisEvent VisEvent - * @{ - */ - -/** - * Creates a new VisEvent structure. - * - * @see visual_actor_get_eventqueue - * - * @return A newly allocated VisEvent - */ -VisEvent *visual_event_new () -{ - VisEvent *event; - - event = visual_mem_new0 (VisEvent, 1); - - /* Do the VisObject initialization*/ - visual_object_initialize (VISUAL_OBJECT (event), TRUE, NULL); - - return event; -} - -/** - * Creates a new VisEventQueue data structure. - * - * @return Newly allocated VisEventQueue. - */ -VisEventQueue *visual_event_queue_new () -{ - VisEventQueue *eventqueue; - - eventqueue = visual_mem_new0 (VisEventQueue, 1); - - /* Do the VisObject initialization*/ - visual_object_initialize (VISUAL_OBJECT (eventqueue), TRUE, eventqueue_dtor); - - eventqueue->mousestate = VISUAL_MOUSE_UP; - - visual_list_set_destroyer (&eventqueue->events, event_list_destroy); - - return eventqueue; -} - -/** - * Polls for new events. Looks at the event queue for new events and deletes - * them from the queue while loading them into the event argument. - * - * @param eventqueue Pointer to a VisEventQueue from which new events should be taken. - * @param event Pointer to a VisEvent in which the new events should be loaded. - * - * @return TRUE when events are handled and FALSE when the queue is out of events. - */ -int visual_event_queue_poll (VisEventQueue *eventqueue, VisEvent *event) -{ - VisEvent *lev; - VisListEntry *listentry = NULL;; - - visual_log_return_val_if_fail (eventqueue != NULL, FALSE); - visual_log_return_val_if_fail (event != NULL, FALSE); - - if (eventqueue->resizenew == TRUE) { - eventqueue->resizenew = FALSE; - - visual_mem_copy (event, &eventqueue->lastresize, sizeof (VisEvent)); - - return TRUE; - } - - if (eventqueue->eventcount <= 0) - return FALSE; - - lev = visual_list_next (&eventqueue->events, &listentry); - visual_mem_copy (event, lev, sizeof (VisEvent)); - - visual_object_unref (VISUAL_OBJECT (lev)); - - visual_list_delete (&eventqueue->events, &listentry); - - eventqueue->eventcount--; - - return TRUE; -} - -/** - * Adds an event to the event queue. Add new VisEvents into the VisEventQueue. - * - * @param eventqueue Pointer to the VisEventQueue to which new events are added. - * @param event Pointer to a VisEvent that needs to be added to the queue. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_EVENT_QUEUE_NULL or -VISUAL_ERROR_EVENT_NULL - * on failure. - */ -int visual_event_queue_add (VisEventQueue *eventqueue, VisEvent *event) -{ - visual_log_return_val_if_fail (eventqueue != NULL, -VISUAL_ERROR_EVENT_QUEUE_NULL); - visual_log_return_val_if_fail (event != NULL, -VISUAL_ERROR_EVENT_NULL); - - /* We've got way too much on the queue, not adding events, the important - * resize event got data in the event queue structure that makes sure it gets - * looked at */ - if (eventqueue->eventcount > VISUAL_EVENT_MAXEVENTS) { - visual_object_unref (VISUAL_OBJECT (event)); - - return -1; - } - - visual_list_add (&eventqueue->events, event); - - eventqueue->eventcount++; - - return VISUAL_OK; -} - -/** - * Adds a new keyboard event to the event queue. By giving keyboard state information - * a new VisEvent will be created and added to the event queue. - * - * @param eventqueue Pointer to the VisEventQueue to which new events are added. - * @param keysym A keysym from the VisKey enumerate to set the key to which the event relates. - * @param keymod Key modifier information from the VisKeyMod enumerate. - * @param state Contains information about whatever the key is down or up. - * - * return VISUAL_OK on succes -VISUAL_ERROR_EVENT_QUEUE_NULL, -VISUAL_ERROR_EVENT_NULL or error values - * returned by visual_event_queue_add on failure. - */ -int visual_event_queue_add_keyboard (VisEventQueue *eventqueue, VisKey keysym, int keymod, VisKeyState state) -{ - VisEvent *event; - - visual_log_return_val_if_fail (eventqueue != NULL, -VISUAL_ERROR_EVENT_QUEUE_NULL); - - event = visual_event_new (); - if (event == NULL) { - visual_log (VISUAL_LOG_CRITICAL, - "Cannot create a new VisEvent structure"); - - return -VISUAL_ERROR_EVENT_NULL; - } - - /* FIXME name to VISUAL_KEYB_DOWN and KEYB_UP */ - if (state == VISUAL_KEY_DOWN) - event->type = VISUAL_EVENT_KEYDOWN; - else - event->type = VISUAL_EVENT_KEYUP; - - event->keyboard.type = event->type; - event->keyboard.keysym.sym = keysym; - event->keyboard.keysym.mod = keymod; - - return visual_event_queue_add (eventqueue, event); -} - -/** - * Adds a new mouse movement event to the event queue. By giving absolute X and Y coordinates - * for the mouse a new VisEvent will be created and added to the event queue. - * - * @param eventqueue Pointer to the VisEventQueue to which new events are added. - * @param x Absolute X value for the mouse location. - * @param y Absolute Y value for the mouse location. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_EVENT_QUEUE_NULL or error values returned by - * visual_event_queue_add () on failure. - */ -int visual_event_queue_add_mousemotion (VisEventQueue *eventqueue, int x, int y) -{ - VisEvent *event; - - visual_log_return_val_if_fail (eventqueue != NULL, -VISUAL_ERROR_EVENT_QUEUE_NULL); - - event = visual_event_new (); - - event->type = VISUAL_EVENT_MOUSEMOTION; - - event->mousemotion.type = event->type; - - event->mousemotion.state = eventqueue->mousestate; - event->mousemotion.x = x; - event->mousemotion.y = y; - - event->mousemotion.xrel = x - eventqueue->mousex; - event->mousemotion.yrel = y - eventqueue->mousey; - - eventqueue->mousex = x; - eventqueue->mousey = y; - - return visual_event_queue_add (eventqueue, event);; -} - -/** - * Adds a new mouse button event to the event queue. By giving a mouse button index number and - * a mouse button key state a new VisEvent will be created and added to the event queue. - * - * @param eventqueue Pointer to the VisEventQueue to which new events are added. - * @param button Index that indicates to which mouse button the state relates. - * @param state Contains information about whatever the button is down or up - * @param x Absolute X value for the mouse location. - * @param y Absolute Y value for the mouse location. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_EVENT_QUEUE_NULL or error values returned by - * visual_event_queue_add () on failure. - */ -int visual_event_queue_add_mousebutton (VisEventQueue *eventqueue, int button, VisMouseState state, int x, int y) -{ - VisEvent *event; - - visual_log_return_val_if_fail (eventqueue != NULL, -VISUAL_ERROR_EVENT_QUEUE_NULL); - - event = visual_event_new (); - - if (state == VISUAL_MOUSE_DOWN) - event->type = VISUAL_EVENT_MOUSEBUTTONDOWN; - else - event->type = VISUAL_EVENT_MOUSEBUTTONUP; - - event->mousebutton.type = event->type; - - event->mousebutton.button = button; - event->mousebutton.state = state; - - event->mousebutton.x = x; - event->mousebutton.y = y; - - eventqueue->mousestate = state; - - return visual_event_queue_add (eventqueue, event); -} - -/** - * Adds a new dimension change event to the event queue. By giving a pointer to - * the VisVideo containing all the surface information and new width and height - * a new VisEvent will be created and added to the event queue. - * - * @param eventqueue Pointer to the VisEventQueue to which new events are added. - * @param video Pointer to the VisVideo containing all the display information, - * also used for negotiation so values can change within the VisVideo - * structure. - * @param width The width for the new surface. - * @param height The height for the new surface. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_EVENT_QUEUE_NULL on failure. - */ -int visual_event_queue_add_resize (VisEventQueue *eventqueue, VisVideo *video, int width, int height) -{ - VisEvent *event; - - visual_log_return_val_if_fail (eventqueue != NULL, -VISUAL_ERROR_EVENT_QUEUE_NULL); - - event = &eventqueue->lastresize; - - event->type = VISUAL_EVENT_RESIZE; - - event->resize.type = event->type; - - event->resize.video = video; - event->resize.width = width; - event->resize.height = height; - - eventqueue->resizenew = TRUE; - - return VISUAL_OK; -} - -/** - * Adds a new song change event to the event queue. By giving a pointer to the - * new VisSongInfo structure a new VisEvent will be created and added to the event queue. - * - * @param eventqueue Pointer to the VisEventQueue to which new events are added. - * @param songinfo Pointer to the VisSongInfo containing all the new song information. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_EVENT_QUEUE_NULL, -VISUAL_ERROR_SONGINFO_NULL - * or error values returned by visual_event_queue_add () on failure. - */ -int visual_event_queue_add_newsong (VisEventQueue *eventqueue, VisSongInfo *songinfo) -{ - VisEvent *event; - - visual_log_return_val_if_fail (eventqueue != NULL, -VISUAL_ERROR_EVENT_QUEUE_NULL); - visual_log_return_val_if_fail (songinfo != NULL, -VISUAL_ERROR_SONGINFO_NULL); - - event = visual_event_new (); - - event->type = VISUAL_EVENT_NEWSONG; - - event->newsong.type = event->type; - event->newsong.songinfo = songinfo; - - return visual_event_queue_add (eventqueue, event); -} - -/** - * Adds a new parameter change event to the event queue. By giving the pointer to the - * VisParamEntry structure a new VisEvent will be created and added to the event queue. - * - * @param eventqueue Pointer to the VisEventQueue to which new events are added. - * @param param Pointer to the VisParamEntry containing the parameter that has been changed. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_EVENT_QUEUE_NULL, -VISUAL_ERROR_PARAM_NULL - * or error values returned by visual_event_queue_add () on failure. - */ -int visual_event_queue_add_param (VisEventQueue *eventqueue, void *param) -{ - VisEvent *event; - - visual_log_return_val_if_fail (eventqueue != NULL, -VISUAL_ERROR_EVENT_QUEUE_NULL); - visual_log_return_val_if_fail (param != NULL, -VISUAL_ERROR_PARAM_NULL); - - event = visual_event_new (); - event->type = VISUAL_EVENT_PARAM; - - event->param.type = event->type; - event->param.param = param; - - return visual_event_queue_add (eventqueue, event); -} - -/** - * Adds a new quit event to the event queue. - * - * @param eventqueue Pointer to the VisEventQueue to which new events are added. - * @param pass_zero_please Might be used in the future, but for now just pass . - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_EVENT_QUEUE_NULL - * or error values returned by visual_event_queue_add () on failure. - */ -int visual_event_queue_add_quit (VisEventQueue *eventqueue, int pass_zero_please) -{ - VisEvent *event; - - visual_log_return_val_if_fail (eventqueue != NULL, -VISUAL_ERROR_EVENT_QUEUE_NULL); - - event = visual_event_new (); - event->type = VISUAL_EVENT_QUIT; - - event->quit.type = event->type; - - return visual_event_queue_add (eventqueue, event); -} - -/** - * Adds a new visibility event to the event queue. - * - * @param eventqueue Pointer to the VisEventQueue to which new events are added. - * @param is_visible TRUE when visible, FALSE when not visible. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_EVENT_QUEUE_NULL - * or error values returned by visual_event_queue_add () on failure. - */ -int visual_event_queue_add_visibility (VisEventQueue *eventqueue, int is_visible) -{ - VisEvent *event; - - visual_log_return_val_if_fail (eventqueue != NULL, -VISUAL_ERROR_EVENT_QUEUE_NULL); - - event = visual_event_new (); - event->type = VISUAL_EVENT_VISIBILITY; - - event->visibility.type = event->type; - event->visibility.is_visible = is_visible; - - return visual_event_queue_add (eventqueue, event); -} - -/** - * Adds a new generic event to the event queue. - * - * @param eventqueue Pointer to the VisEventQueue to which new events are added. - * @param eid ID of the custom event.. - * @param param_int Integer value for the custom event. - * @param param_ptr Pointer to data for the custom event.. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_EVENT_QUEUE_NULL - * or error values returned by visual_event_queue_add () on failure. - */ - -int visual_event_queue_add_generic (VisEventQueue *eventqueue, int eid, int param_int, void *param_ptr) -{ - VisEvent *event; - - visual_log_return_val_if_fail (eventqueue != NULL, -VISUAL_ERROR_EVENT_QUEUE_NULL); - - event = visual_event_new (); - event->type = VISUAL_EVENT_GENERIC; - - event->generic.type = event->type; - event->generic.event_id = eid; - event->generic.data_int = param_int; - event->generic.data_ptr = param_ptr; - - return visual_event_queue_add (eventqueue, event); -} - - -/** - * @} - */ -
--- a/libvisual/lv_event.h Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,271 +0,0 @@ -#ifndef _LV_EVENT_H -#define _LV_EVENT_H - -#include <libvisual/lv_songinfo.h> -#include <libvisual/lv_video.h> -#include <libvisual/lv_list.h> -#include <libvisual/lv_keysym.h> - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#define VISUAL_EVENT_KEYBOARD(obj) (VISUAL_CHECK_CAST ((obj), 0, VisEventKeyboard)) -#define VISUAL_EVENT_MOUSEMOTION(obj) (VISUAL_CHECK_CAST ((obj), 0, VisEventMouseMotion)) -#define VISUAL_EVENT_MOUSEBUTTON(obj) (VISUAL_CHECK_CAST ((obj), 0, VisEventMouseButton)) -#define VISUAL_EVENT_RESIZE(obj) (VISUAL_CHECK_CAST ((obj), 0, VisEventResize)) -#define VISUAL_EVENT_NEWSONG(obj) (VISUAL_CHECK_CAST ((obj), 0, VisEventNewSong)) -#define VISUAL_EVENT_QUIT(obj) (VISUAL_CHECK_CAST ((obj), 0, VisEventQuit)) -#define VISUAL_EVENT_VISIBILITY(obj) (VISUAL_CHECK_CAST ((obj), 0, VisEventVisibility)) -#define VISUAL_EVENT_GENERIC(obj) (VISUAL_CHECK_CAST ((obj), 0, VisEventGeneric)) -#define VISUAL_EVENT_PARAM(obj) (VISUAL_CHECK_CAST ((obj), 0, VisEventParam)) -#define VISUAL_EVENT(obj) (VISUAL_CHECK_CAST ((obj), 0, VisEvent)) -#define VISUAL_EVENTQUEUE(obj) (VISUAL_CHECK_CAST ((obj), 0, VisEventQueue)) - -/** - * Number of events allowed in the queue - */ -#define VISUAL_EVENT_MAXEVENTS 256 - -/** - * Used to define what kind of event is emitted by the VisEvent system. - */ -typedef enum { - VISUAL_EVENT_NOEVENT, /**< No event. */ - VISUAL_EVENT_KEYDOWN, /**< Keyboard key pressed event. */ - VISUAL_EVENT_KEYUP, /**< Keyboard key released event. */ - VISUAL_EVENT_MOUSEMOTION, /**< Mouse movement event. */ - VISUAL_EVENT_MOUSEBUTTONDOWN, /**< Mouse button pressed event. */ - VISUAL_EVENT_MOUSEBUTTONUP, /**< Mouse button released event. */ - VISUAL_EVENT_NEWSONG, /**< Song change event. */ - VISUAL_EVENT_RESIZE, /**< Window dimension change event. */ - VISUAL_EVENT_PARAM, /**< Param set event, gets emitted when a parameter has been changed. */ - VISUAL_EVENT_QUIT, /**< Quit event, Should get emitted when a program is about to quit. */ - VISUAL_EVENT_GENERIC, /**< A Generic event. Libvisual has nothing to do with it, this can be used for custom events. */ - VISUAL_EVENT_VISIBILITY, /**< A visibility event. Will be emited by lvdisplay (?) or app itself when window becomes (in)visible */ - - VISUAL_EVENT_LAST = 0xffffff, /**< last event number. Libvisual & friends will never use ids greater than this */ -} VisEventType; - -/** - * Used to define key states within the VisEvent system. - */ -typedef enum { - VISUAL_KEY_DOWN, /**< Key is pressed. */ - VISUAL_KEY_UP /**< Key is released. */ -} VisKeyState; - -/** - * Used to define mouse button states within the VisEvent system. - */ -typedef enum { - VISUAL_MOUSE_DOWN, /**< Mouse button is pressed. */ - VISUAL_MOUSE_UP /**< Mouse button is released. */ -} VisMouseState; - - -typedef struct _VisEventKeyboard VisEventKeyboard; -typedef struct _VisEventMouseMotion VisEventMouseMotion; -typedef struct _VisEventMouseButton VisEventMouseButton; -typedef struct _VisEventResize VisEventResize; -typedef struct _VisEventNewSong VisEventNewSong; -typedef struct _VisEventQuit VisEventQuit; -typedef struct _VisEventVisibility VisEventVisibility; -typedef struct _VisEventGeneric VisEventGeneric; -typedef struct _VisEventParam VisEventParam; -typedef union _VisEvent VisEvent; -typedef struct _VisEventQueue VisEventQueue; - -/** - * Keyboard event data structure. - * - * Contains information about keyboard events. - * - * @see visual_event_queue_add_keyboard - */ -struct _VisEventKeyboard { - VisObject object; /**< The VisObject data. */ - VisEventType type; /**< Event type of the event being emitted */ - VisKeySym keysym; /**< A keysym entry that contains which key had an - * event and information about modifier keys. */ -}; - -/** - * Mouse movement event data structure. - * - * Contains information about mouse movement events. - * - * @see visual_event_queue_add_mousemotion - */ -struct _VisEventMouseMotion { - VisObject object; /**< The VisObject data. */ - VisEventType type; /**< Event type of the event being emitted. */ - VisMouseState state; /**< Mouse button state. */ - int x; /**< The absolute mouse X value, where 0 is left of screen. */ - int y; /**< The absolute mouse Y value. where 0 is top of screen. */ - int xrel; /**< Relative X movement to the previous location. */ - int yrel; /**< Relative Y movement to the previous location. */ -}; - -/** - * Mouse button event data structure. - * - * Contains information about mouse button events. - * - * @see visual_event_queue_add_mousebutton - */ -struct _VisEventMouseButton { - VisObject object; /**< The VisObject data. */ - VisEventType type; /**< Event type of the event being emitted. */ - VisMouseState state; /**< Mouse button state. */ - int button; /**< The button the state relates to. */ - int x; /**< The absolute mouse X value. */ - int y; /**< The absolute mouse Y value. */ -}; - -/** - * Dimension change event data structure. - * - * Contains information about screen dimension and depth changes. - * - * @see visual_event_queue_add_resize - */ -struct _VisEventResize { - VisObject object; /**< The VisObject data. */ - VisEventType type; /**< Event type of the event being emitted. */ - VisVideo *video; /**< Pointer to the VisVideo structure containing all the screen information. */ - int width; /**< Width of the surface. */ - int height; /**< Height of the surface. */ -}; - -/** - * Song change event data structure. - * - * Contains information about song changes. - * - * @see visual_event_queue_add_newsong - */ -struct _VisEventNewSong { - VisObject object; /**< The VisObject data. */ - VisEventType type; /**< Event type of the event being emitted. */ - VisSongInfo *songinfo; /**< Pointer to the VisSongInfo structure containing all the information about - * the new song. */ -}; - -/** - * Quit event data structure. - * - * Contains quit request. - * - * @see visual_event_queue_add_quit - */ -struct _VisEventQuit { - VisObject object; /**< The VisObject data. */ - VisEventType type; /**< Event type of the event being emitted. */ - int dummy; /**< some day may contain a request urgency: quit NOW or schedule quit. */ -}; - -/** - * Visibility event data structure. - * - * Contains window's new visibility value. - * - * @see visual_event_queue_add_visibiity - */ -struct _VisEventVisibility { - VisObject object; /**< The VisObject data. */ - VisEventType type; /**< Event type of the event being emitted. */ - int dummy; /**< Some day will contain window ID. very OS-specific. maybe use indices ? */ - int is_visible; /**< Set TRUE or FALSE to indicate visibility. */ -}; - -/** - * Generic event data structure. - * - * Contains pointer to some struct. - * - * @see visual_event_queue_add_generic - */ -struct _VisEventGeneric { - VisObject object; /**< The VisObject data. */ - VisEventType type; /**< Event type of the event being emitted. */ - int event_id; /**< some event id. */ - int data_int; /**< Data in the form of an integer. */ - void *data_ptr; /**< More advanced generic events can use a pointer. */ -}; - -/** - * Param change event data structure. - * - * Contains information about parameter changes. - * - * @see visual_event_queue_add_param - */ -struct _VisEventParam { - VisObject object; /**< The VisObject data. */ - VisEventType type; /**< Event type of the event being emitted. */ - /* FiXME: Having VisEventParam here creates a circulair depency in lv_event.h and lv_param.h */ - void *param; /**< The parameter entry which has been changed. */ -}; - -/** - * The main event data structure. - * - * All events are encapsulated using the VisEvent structure. - * - * @see visual_event_new - */ -union _VisEvent { - VisObject object; /**< The VisObject data. */ - VisEventType type; /**< Event type of the event being emitted. */ - VisEventKeyboard keyboard; /**< Keyboard event. */ - VisEventMouseMotion mousemotion; /**< Mouse movement event. */ - VisEventMouseButton mousebutton; /**< Mouse button event. */ - VisEventResize resize; /**< Dimension change event. */ - VisEventNewSong newsong; /**< Song change event. */ - VisEventQuit quit; /**< Quit event. */ - VisEventVisibility visibility; /**< Plugin visible event. */ - VisEventGeneric generic; /**< Generic event. */ - VisEventParam param; /**< Param change event. */ -}; - -/** - * The event queue data structure. - * - * Used to manage events queues and also provides quick access to - * high piority data from events. - * - * @see visual_event_queue_new - */ -struct _VisEventQueue { - VisObject object; /**< The VisObject data. */ - VisList events; /**< List of VisEvents in the queue. */ - VisEvent lastresize; /**< Last resize event to provide quick access - * to this high piority event. */ - int resizenew; /**< Flag that is set when there is a new resize event. */ - int eventcount; /**< Contains the number of events in queue. */ - - int mousex; /**< Current absolute mouse X value. */ - int mousey; /**< Current absolute mouse Y value. */ - VisMouseState mousestate; /**< Current mouse button state. */ -}; - -VisEvent *visual_event_new (void); -VisEventQueue *visual_event_queue_new (void); -int visual_event_queue_poll (VisEventQueue *eventqueue, VisEvent *event); -int visual_event_queue_add (VisEventQueue *eventqueue, VisEvent *event); -int visual_event_queue_add_keyboard (VisEventQueue *eventqueue, VisKey keysym, int keymod, VisKeyState state); -int visual_event_queue_add_mousemotion (VisEventQueue *eventqueue, int x, int y); -int visual_event_queue_add_mousebutton (VisEventQueue *eventqueue, int button, VisMouseState state, int x, int y); -int visual_event_queue_add_resize (VisEventQueue *eventqueue, VisVideo *video, int width, int height); -int visual_event_queue_add_newsong (VisEventQueue *eventqueue, VisSongInfo *songinfo); -int visual_event_queue_add_param (VisEventQueue *eventqueue, void *param); -int visual_event_queue_add_quit (VisEventQueue *eventqueue, int pass_zero_please); -int visual_event_queue_add_visibility (VisEventQueue *eventqueue, int is_visible); -int visual_event_queue_add_generic (VisEventQueue *eventqueue, int eid, int param_int, void *param_ptr); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _LV_EVENT_H */
--- a/libvisual/lv_fft.c Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,300 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Iterative FFT implementation found in this file is - * Copyright (C) 1999 Richard Boulton <richard@tartarus.org> - * Richard gave permission to relicense the FFT code under the LGPL. - * - * Authors: Richard Boulton <richard@tartarus.org> - * Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/* - * TODO - * Remove compiling in of VISUAL_FFT_BUFFER_SIZE? (Might slow things down, but would - * be nice to be able to change size at runtime.) - * Finish making / checking thread-safety. - * More optimisations. - */ - -#include <stdlib.h> -#include <math.h> -#ifndef PI - #ifdef M_PI - #define PI M_PI - #else - #define PI 3.14159265358979323846 /* pi */ - #endif -#endif - -#include "lv_fft.h" - -static void _lv_fft_prepare (const int16_t *input, float * re, float * im); -static void _lv_fft_calculate (float * re, float * im); -static void _lv_fft_output (const float *re, const float *im, float *output); -static int _reverseBits (unsigned int initial); - -/* #################### */ -/* # Global variables # */ -/* #################### */ - -/* Table to speed up bit reverse copy */ -static unsigned int bitReverse[VISUAL_FFT_BUFFER_SIZE]; - -/* The next two tables could be made to use less space in memory, since they - * overlap hugely, but hey. */ -static float sintable[VISUAL_FFT_BUFFER_SIZE / 2]; -static float costable[VISUAL_FFT_BUFFER_SIZE / 2]; - -/* --------- */ -/* FFT stuff */ -/* --------- */ - -/* - * Initialisation routine - sets up tables and space to work in. - * Returns a pointer to internal state, to be used when performing calls. - * On error, returns NULL. - * The pointer should be freed when it is finished with, by fft_close(). - */ - -/** - * @defgroup VisFFT VisFFT - * @{ - */ - -/** - * Private function that creates and initialize a new VisFFTState that is - * used by the Fast Fourier Transform engine. - * - * @return A newly created VisFFTState to be used for the FFT engine - */ -VisFFTState *visual_fft_init () -{ - VisFFTState *state; - unsigned int i; - - state = visual_mem_new0 (VisFFTState, 1); - - /* Do the VisObject initialization */ - visual_object_initialize (VISUAL_OBJECT (state), TRUE, NULL); - - if (state == NULL) - return NULL; - - for (i = 0; i < VISUAL_FFT_BUFFER_SIZE; i++) { - bitReverse[i] = _reverseBits (i); - } - - for (i = 0; i < VISUAL_FFT_BUFFER_SIZE / 2; i++) { - float j = 2 * PI * i / VISUAL_FFT_BUFFER_SIZE; - costable[i] = cos (j); - sintable[i] = sin (j); - } - - return state; -} - -/* - * Do all the steps of the FFT, taking as input sound data (as described in - * sound.h) and returning the intensities of each frequency as floats in the - * range 0 to ((VISUAL_FFT_BUFFER_SIZE / 2) * 32768) ^ 2 - * - * FIXME - the above range assumes no frequencies present have an amplitude - * larger than that of the sample variation. But this is false: we could have - * a wave such that its maximums are always between samples, and it's just - * inside the representable range at the places samples get taken. - * Question: what _is_ the maximum value possible. Twice that value? Root - * two times that value? Hmmm. Think it depends on the frequency, too. - * - * The input array is assumed to have VISUAL_FFT_BUFFER_SIZE elements, - * and the output array is assumed to have (VISUAL_FFT_BUFFER_SIZE / 2 + 1) elements. - * state is a (non-NULL) pointer returned by fft_init. - */ - -/** - * Private function to perform a FFT calculation which is used within - * libvisual it's audio core. - * - * @param input Sample data which need to be FFT analyzed. - * @param output FFT analyse output. - * @param state Contains the FFT context needed to run the FFT calculation. - */ -void visual_fft_perform (int16_t *input, float *output, VisFFTState *state) -{ - /* Convert data from sound format to be ready for FFT */ - _lv_fft_prepare (input, state->real, state->imag); - - /* Do the actual FFT */ - _lv_fft_calculate (state->real, state->imag); - - /* Convert the FFT output into intensities */ - _lv_fft_output (state->real, state->imag, output); -} - -/* ########################### */ -/* # Locally called routines # */ -/* ########################### */ - -/** - * @} - */ - -/* - * Prepare data to perform a FFT on - */ -static void _lv_fft_prepare (const int16_t *input, float * re, float * im) -{ - unsigned int i; - float *realptr = re; - float *imagptr = im; - - /* Get input, in reverse bit order */ - for (i = 0; i < VISUAL_FFT_BUFFER_SIZE; i++) { - *realptr++ = input[bitReverse[i]]; - *imagptr++ = 0; - } -} - -/* - * Take result of a FFT and calculate the intensities of each frequency - * Note: only produces half as many data points as the input had. - * This is roughly a consequence of the Nyquist sampling theorm thingy. - * (FIXME - make this comment better, and helpful.) - * - * The two divisions by 4 are also a consequence of this: the contributions - * returned for each frequency are split into two parts, one at i in the - * table, and the other at VISUAL_FFT_BUFFER_SIZE - i, except for i = 0 and - * VISUAL_FFT_BUFFER_SIZE which would otherwise get float (and then 4* when squared) - * the contributions. - */ -static void _lv_fft_output (const float * re, const float * im, float *output) -{ - float *outputptr = output; - const float *realptr = re; - const float *imagptr = im; - float *endptr = output + VISUAL_FFT_BUFFER_SIZE / 2; - -#ifdef DEBUG - unsigned int i, j; -#endif - - while (outputptr <= endptr) { - *outputptr = (*realptr * *realptr) + (*imagptr * *imagptr); - outputptr++; realptr++; imagptr++; - } - /* Do divisions to keep the constant and highest frequency terms in scale - * with the other terms. */ - *output /= 4; - *endptr /= 4; - -#ifdef DEBUG - printf ("Recalculated input:\n"); - for(i = 0; i < VISUAL_FFT_BUFFER_SIZE; i++) { - float val_real = 0; - float val_imag = 0; - for (j = 0; j < VISUAL_FFT_BUFFER_SIZE; j++) { - float fact_real = cos (- 2 * j * i * PI / VISUAL_FFT_BUFFER_SIZE); - float fact_imag = sin (- 2 * j * i * PI / VISUAL_FFT_BUFFER_SIZE); - val_real += fact_real * re[j] - fact_imag * im[j]; - val_imag += fact_real * im[j] + fact_imag * re[j]; - } - - printf ("%5d = %8f + i * %8f\n", i, - val_real / VISUAL_FFT_BUFFER_SIZE, - val_imag / VISUAL_FFT_BUFFER_SIZE); - } - printf ("\n"); -#endif -} - -/* - * Actually perform the FFT - */ -static void _lv_fft_calculate (float * re, float * im) -{ - unsigned int i, j, k; - unsigned int exchanges; - float fact_real, fact_imag; - float tmp_real, tmp_imag; - unsigned int factfact; - - /* Set up some variables to reduce calculation in the loops */ - exchanges = 1; - factfact = VISUAL_FFT_BUFFER_SIZE / 2; - - /* Loop through the divide and conquer steps */ - for (i = VISUAL_FFT_BUFFER_SIZE_LOG; i != 0; i--) { - /* In this step, we have 2 ^ (i - 1) exchange groups, each with - * 2 ^ (VISUAL_FFT_BUFFER_SIZE_LOG - i) exchanges - */ - /* Loop through the exchanges in a group */ - for (j = 0; j != exchanges; j++) { - /* Work out factor for this exchange - * factor ^ (exchanges) = -1 - * So, real = cos(j * PI / exchanges), - * imag = sin(j * PI / exchanges) - */ - fact_real = costable[j * factfact]; - fact_imag = sintable[j * factfact]; - - /* Loop through all the exchange groups */ - for (k = j; k < VISUAL_FFT_BUFFER_SIZE; k += exchanges << 1) { - int k1 = k + exchanges; - /* newval[k] := val[k] + factor * val[k1] - * newval[k1] := val[k] - factor * val[k1] - **/ -#ifdef DEBUG - printf("%d %d %d\n", i,j,k); - printf("Exchange %d with %d\n", k, k1); - printf("Factor %9f + i * %8f\n", fact_real, fact_imag); -#endif - /* FIXME - potential scope for more optimization here? */ - tmp_real = fact_real * re[k1] - fact_imag * im[k1]; - tmp_imag = fact_real * im[k1] + fact_imag * re[k1]; - re[k1] = re[k] - tmp_real; - im[k1] = im[k] - tmp_imag; - re[k] += tmp_real; - im[k] += tmp_imag; -#ifdef DEBUG - for (k1 = 0; k1 < VISUAL_FFT_BUFFER_SIZE; k1++) { - printf("%5d = %8f + i * %8f\n", k1, real[k1], imag[k1]); - } -#endif - } - } - - exchanges <<= 1; - factfact >>= 1; - } -} - -static int _reverseBits (unsigned int initial) -{ - unsigned int reversed = 0, loop; - - for (loop = 0; loop < VISUAL_FFT_BUFFER_SIZE_LOG; loop++) { - reversed <<= 1; - reversed += (initial & 1); - initial >>= 1; - } - - return reversed; -} -
--- a/libvisual/lv_fft.h Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Iterative FFT implementation found in this file is - * Copyright (C) 1999 Richard Boulton <richard@tartarus.org> - * Richard gave permission to relicense the FFT code under the LGPL. - * - * Authors: Richard Boulton <richard@tartarus.org> - * Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _LV_FFT_H -#define _LV_FFT_H - -#include <libvisual/lv_common.h> - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#define VISUAL_FFTSTATE(obj) (VISUAL_CHECK_CAST ((obj), 0, VisFFTState)) - -/** - * Private FFT define that contains the log size. - */ -#define VISUAL_FFT_BUFFER_SIZE_LOG 9 - -/** - * Private FFT define that contains the buffer size. - */ -#define VISUAL_FFT_BUFFER_SIZE (1 << VISUAL_FFT_BUFFER_SIZE_LOG) - -typedef struct _VisFFTState VisFFTState; - -/** - * Private structure to contain Fast Fourier Transform states in. - */ -struct _VisFFTState { - VisObject object; /**< The VisObject data. */ - /* Temporary data stores to perform FFT in. */ - float real[VISUAL_FFT_BUFFER_SIZE]; /**< Private data that is used by the FFT engine. */ - float imag[VISUAL_FFT_BUFFER_SIZE]; /**< Private data that is used by the FFT engine. */ -}; - -VisFFTState *visual_fft_init (void); -void visual_fft_perform (int16_t *input, float *output, VisFFTState *state); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _LV_FFT_H */
--- a/libvisual/lv_input.c Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,250 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> - -#include "lv_list.h" -#include "lv_input.h" - -extern VisList *__lv_plugins_input; - -static int input_dtor (VisObject *object); - -static VisInputPlugin *get_input_plugin (VisInput *input); - -static int input_dtor (VisObject *object) -{ - VisInput *input = VISUAL_INPUT (object); - - if (input->plugin != NULL) - visual_plugin_unload (input->plugin); - - if (input->audio != NULL) - visual_object_unref (VISUAL_OBJECT (input->audio)); - - input->plugin = NULL; - input->audio = NULL; - - return VISUAL_OK; -} - -static VisInputPlugin *get_input_plugin (VisInput *input) -{ - VisInputPlugin *inplugin; - - visual_log_return_val_if_fail (input != NULL, NULL); - visual_log_return_val_if_fail (input->plugin != NULL, NULL); - - inplugin = VISUAL_PLUGIN_INPUT (input->plugin->info->plugin); - - return inplugin; -} - -/** - * @defgroup VisInput VisInput - * @{ - */ - -/** - * Gives the encapsulated VisPluginData from a VisInput. - * - * @param input Pointer of a VisInput of which the VisPluginData needs to be returned. - * - * @return VisPluginData that is encapsulated in the VisInput, possibly NULL. - */ -VisPluginData *visual_input_get_plugin (VisInput *input) -{ - return input->plugin; -} - -/** - * Gives a list of input plugins in the current plugin registry. - * - * @return An VisList of VisPluginRef's containing the input plugins in the plugin registry. - */ -VisList *visual_input_get_list () -{ - return __lv_plugins_input; -} - -/** - * Gives the next input plugin based on the name of a plugin. - * - * @see visual_input_get_prev_by_name - * - * @param name The name of the current plugin, or NULL to get the first. - * - * @return The name of the next plugin within the list. - */ -const char *visual_input_get_next_by_name (const char *name) -{ - return visual_plugin_get_next_by_name (visual_input_get_list (), name); -} - -/** - * Gives the previous input plugin based on the name of a plugin. - * - * @see visual_input_get_next_by_name - * - * @param name The name of the current plugin. or NULL to get the last. - * - * @return The name of the previous plugin within the list. - */ -const char *visual_input_get_prev_by_name (const char *name) -{ - return visual_plugin_get_prev_by_name (visual_input_get_list (), name); -} - - -/** - * Checks if the input plugin is in the registry, based on it's name. - * - * @param name The name of the plugin that needs to be checked. - * - * @return TRUE if found, else FALSE. - */ -int visual_input_valid_by_name (const char *name) -{ - if (visual_plugin_find (visual_input_get_list (), name) == NULL) - return FALSE; - else - return TRUE; -} - -/** - * Creates a new VisInput from name, the plugin will be loaded but won't be realized. - * - * @param inputname - * The name of the plugin to load, or NULL to simply allocate a new - * input. - * - * @return A newly allocated VisInput, optionally containing a loaded plugin. Or NULL on failure. - */ -VisInput *visual_input_new (const char *inputname) -{ - VisInput *input; - VisPluginRef *ref; - -// visual_log_return_val_if_fail (__lv_plugins_input != NULL && inputname == NULL, NULL); - - if (__lv_plugins_input == NULL && inputname != NULL) { - visual_log (VISUAL_LOG_CRITICAL, "the plugin list is NULL"); - return NULL; - } - - input = visual_mem_new0 (VisInput, 1); - - input->audio = visual_audio_new (); - - /* Do the VisObject initialization */ - visual_object_initialize (VISUAL_OBJECT (input), TRUE, input_dtor); - - if (inputname == NULL) - return input; - - ref = visual_plugin_find (__lv_plugins_input, inputname); - - input->plugin = visual_plugin_load (ref); - - return input; -} - -/** - * Realize the VisInput. This also calls the plugin init function. - * - * @param input Pointer to a VisInput that needs to be realized. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_INPUT_NULL or error values returned by - * visual_plugin_realize () on failure. - */ -int visual_input_realize (VisInput *input) -{ - visual_log_return_val_if_fail (input != NULL, -VISUAL_ERROR_INPUT_NULL); - - if (input->plugin != NULL && input->callback == NULL) - return visual_plugin_realize (input->plugin); - - return VISUAL_OK; -} - -/** - * Sets a callback function for VisInput. Callback functions can be used instead of plugins. Using - * a callback function you can implement an in app PCM data upload function which is like the - * upload callback that is used for input plugins. - * - * @param input Pointer to a VisInput that to which a callback needs to be set. - * @param callback The in app callback function that should be used instead of a plugin. - * @param priv A private that can be read within the callback function. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_INPUT_NULL on failure. - */ -int visual_input_set_callback (VisInput *input, VisInputUploadCallbackFunc callback, void *priv) -{ - visual_log_return_val_if_fail (input != NULL, -VISUAL_ERROR_INPUT_NULL); - - input->callback = callback; - visual_object_set_private (VISUAL_OBJECT (input), priv); - - return VISUAL_OK; -} - -/** - * This is called to run a VisInput. This function will call the plugin to upload it's samples and run it - * through the visual_audio_analyze function. If a callback is set it will use the callback instead of - * the plugin. - * - * @param input A pointer to a VisInput that needs to be runned. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_INPUT_NULL or -VISUAL_ERROR_INPUT_PLUGIN_NULL on failure. - */ -int visual_input_run (VisInput *input) -{ - VisInputPlugin *inplugin; - - visual_log_return_val_if_fail (input != NULL, -VISUAL_ERROR_INPUT_NULL); - - if (input->callback == NULL) { - inplugin = get_input_plugin (input); - - if (inplugin == NULL) { - visual_log (VISUAL_LOG_CRITICAL, "The input plugin is not loaded correctly."); - - return -VISUAL_ERROR_INPUT_PLUGIN_NULL; - } - - inplugin->upload (input->plugin, input->audio); - } else - input->callback (input, input->audio, visual_object_get_private (VISUAL_OBJECT (input))); - - visual_audio_analyze (input->audio); - - return VISUAL_OK; -} - -/** - * @} - */ -
--- a/libvisual/lv_input.h Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,96 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _LV_INPUT_H -#define _LV_INPUT_H - -#include <libvisual/lv_audio.h> -#include <libvisual/lv_plugin.h> -#include <libvisual/lv_common.h> - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#define VISUAL_INPUT(obj) (VISUAL_CHECK_CAST ((obj), 0, VisInput)) - -typedef struct _VisInput VisInput; - -/** - * Callback function that is set using visual_input_set_callback should use this signature. - * - * @see visual_input_set_callback - * - * @arg input Pointer to the VisInput structure. - * - * @arg audio Pointer to the VisAudio containing all the audio information, and in which - * data needs to be set within the callback. - * - * @arg priv Private field to be used by the client. The library will never touch this. - */ -typedef int (*VisInputUploadCallbackFunc)(VisInput *input, VisAudio *audio, void *priv); - -/** - * The VisInput structure encapsulates the input plugin and provides - * abstract interfaces to the input. The VisInput system provides - * PCM data to the visualisation elements of libvisual. This can be done - * through both plugins and callback functions. - * - * Members in the structure shouldn't be accessed directly but instead - * it's adviced to use the methods provided. - * - * @see visual_input_new - */ -struct _VisInput { - VisObject object; /**< The VisObject data. */ - - VisPluginData *plugin; /**< Pointer to the plugin itself. */ - VisAudio *audio; /**< Pointer to the VisAudio structure - * that contains the audio analyse - * results. - * @see visual_audio_analyse */ - VisInputUploadCallbackFunc callback; /**< Callback function when a callback - * is used instead of a plugin. */ -}; - -/* prototypes */ -VisPluginData *visual_input_get_plugin (VisInput *input); - -VisList *visual_input_get_list (void); -const char *visual_input_get_next_by_name (const char *name); -const char *visual_input_get_prev_by_name (const char *name); -int visual_input_valid_by_name (const char *name); - -VisInput *visual_input_new (const char *inputname); - -int visual_input_realize (VisInput *input); - -int visual_input_set_callback (VisInput *input, VisInputUploadCallbackFunc callback, void *priv); - -int visual_input_run (VisInput *input); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _LV_INPUT_H */
--- a/libvisual/lv_keysym.h Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,235 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _LV_KEYSYM_H -#define _LV_KEYSYM_H - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/** - * Enumerate values used within the libvisual event system for keyboard events. - * - * The table is closely modelled after that of SDL and the SDL1.2 - * SDLK defines can be directly translated to those of libvisual, however - * some keys are left out, but these are rarely or never used. - * - * The basic keys are also mapped as in the ASCII table so basic - * keyboard support is easy to implement within a libvisual client. - * - * @see visual_event_queue_add_keyboard - */ -typedef enum { - VKEY_UNKNOWN = 0, - VKEY_FIRST = 0, - VKEY_BACKSPACE = 8, - VKEY_TAB = 9, - VKEY_CLEAR = 12, - VKEY_RETURN = 13, - VKEY_PAUSE = 19, - VKEY_ESCAPE = 27, - VKEY_SPACE = 32, - VKEY_EXCLAIM = 33, - VKEY_QUOTEDBL = 34, - VKEY_HASH = 35, - VKEY_DOLLAR = 36, - VKEY_AMPERSAND = 38, - VKEY_QUOTE = 39, - VKEY_LEFTPAREN = 40, - VKEY_RIGHTPAREN = 41, - VKEY_ASTERISK = 42, - VKEY_PLUS = 43, - VKEY_COMMA = 44, - VKEY_MINUS = 45, - VKEY_PERIOD = 46, - VKEY_SLASH = 47, - VKEY_0 = 48, - VKEY_1 = 49, - VKEY_2 = 50, - VKEY_3 = 51, - VKEY_4 = 52, - VKEY_5 = 53, - VKEY_6 = 54, - VKEY_7 = 55, - VKEY_8 = 56, - VKEY_9 = 57, - VKEY_COLON = 58, - VKEY_SEMICOLON = 59, - VKEY_LESS = 60, - VKEY_EQUALS = 61, - VKEY_GREATER = 62, - VKEY_QUESTION = 63, - VKEY_AT = 64, - - /* Skip uppercase here because it's done via the VisKeyMod */ - VKEY_LEFTBRACKET = 91, - VKEY_BACKSLASH = 92, - VKEY_RIGHTBRACKET = 93, - VKEY_CARET = 94, - VKEY_UNDERSCORE = 95, - VKEY_BACKQUOTE = 96, - VKEY_a = 97, - VKEY_b = 98, - VKEY_c = 99, - VKEY_d = 100, - VKEY_e = 101, - VKEY_f = 102, - VKEY_g = 103, - VKEY_h = 104, - VKEY_i = 105, - VKEY_j = 106, - VKEY_k = 107, - VKEY_l = 108, - VKEY_m = 109, - VKEY_n = 110, - VKEY_o = 111, - VKEY_p = 112, - VKEY_q = 113, - VKEY_r = 114, - VKEY_s = 115, - VKEY_t = 116, - VKEY_u = 117, - VKEY_v = 118, - VKEY_w = 119, - VKEY_x = 120, - VKEY_y = 121, - VKEY_z = 122, - VKEY_DELETE = 127, - - /* Numeric keypad */ - VKEY_KP0 = 256, - VKEY_KP1 = 257, - VKEY_KP2 = 258, - VKEY_KP3 = 259, - VKEY_KP4 = 260, - VKEY_KP5 = 261, - VKEY_KP6 = 262, - VKEY_KP7 = 263, - VKEY_KP8 = 264, - VKEY_KP9 = 265, - VKEY_KP_PERIOD = 266, - VKEY_KP_DIVIDE = 267, - VKEY_KP_MULTIPLY = 268, - VKEY_KP_MINUS = 269, - VKEY_KP_PLUS = 270, - VKEY_KP_ENTER = 271, - VKEY_KP_EQUALS = 272, - - /* Arrows + Home/End pad */ - VKEY_UP = 273, - VKEY_DOWN = 274, - VKEY_RIGHT = 275, - VKEY_LEFT = 276, - VKEY_INSERT = 277, - VKEY_HOME = 278, - VKEY_END = 279, - VKEY_PAGEUP = 280, - VKEY_PAGEDOWN = 281, - - /* Function keys */ - VKEY_F1 = 282, - VKEY_F2 = 283, - VKEY_F3 = 284, - VKEY_F4 = 285, - VKEY_F5 = 286, - VKEY_F6 = 287, - VKEY_F7 = 288, - VKEY_F8 = 289, - VKEY_F9 = 290, - VKEY_F10 = 291, - VKEY_F11 = 292, - VKEY_F12 = 293, - VKEY_F13 = 294, - VKEY_F14 = 295, - VKEY_F15 = 296, - - /* Key state modifier keys */ - VKEY_NUMLOCK = 300, - VKEY_CAPSLOCK = 301, - VKEY_SCROLLOCK = 302, - VKEY_RSHIFT = 303, - VKEY_LSHIFT = 304, - VKEY_RCTRL = 305, - VKEY_LCTRL = 306, - VKEY_RALT = 307, - VKEY_LALT = 308, - VKEY_RMETA = 309, - VKEY_LMETA = 310, - VKEY_LSUPER = 311, /* Left "Windows" key */ - VKEY_RSUPER = 312, /* Right "Windows" key */ - VKEY_MODE = 313, /* "Alt Gr" key */ - VKEY_COMPOSE = 314, /* Multi-key compose key */ - - /* Miscellaneous function keys */ - VKEY_HELP = 315, - VKEY_PRINT = 316, - VKEY_SYSREQ = 317, - VKEY_BREAK = 318, - VKEY_MENU = 319, - - VKEY_LAST -} VisKey; - -/** - * Enumerate values used within the libvisual event system to set modifier keys. - * - * Values can ben ORred together. - * - * @see visual_event_queue_add_keyboard - */ -typedef enum { - VKMOD_NONE = 0x0000, - VKMOD_LSHIFT = 0x0001, - VKMOD_RSHIFT = 0x0002, - VKMOD_LCTRL = 0x0040, - VKMOD_RCTRL = 0x0080, - VKMOD_LALT = 0x0100, - VKMOD_RALT = 0x0200, - VKMOD_LMETA = 0x0400, - VKMOD_RMETA = 0x0800, - VKMOD_NUM = 0x1000, - VKMOD_CAPS = 0x2000, - VKMOD_MODE = 0x4000, -} VisKeyMod; - -#define VKMOD_CTRL (VKMOD_LCTRL | VKMOD_RCTRL) -#define VKMOD_SHIFT (VKMOD_LSHIFT | VKMOD_RSHIFT) -#define VKMOD_ALT (VKMOD_LALT | VKMOD_RALT) -#define VKMOD_META (VKMOD_LMETA | VKMOD_RMETA) - -typedef struct _VisKeySym VisKeySym; - -/** - * Cantains data about the current keyboard state. - */ -struct _VisKeySym { - VisKey sym; /**< Keyboard key to which everything relates. */ - int mod; /**< Modifier vlags, Using key modifiers from the VisKeyMod enumerate. */ -}; - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _LV_KEYSYM_H */
--- a/libvisual/lv_libvisual.c Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,338 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include <stdlib.h> -#include <stdio.h> -#include <unistd.h> -#include <string.h> - -#include "lvconfig.h" -#include "lv_plugin.h" -#include "lv_libvisual.h" -#include "lv_log.h" -#include "lv_param.h" -#include "config.h" - - -/** Set when libvisual is initialized. */ -int __lv_initialized = FALSE; -/** Set a progname from argv[0] when we're capable of doing so. */ -char *__lv_progname = NULL; - -/** Contains the completely plugin registry after initialize. */ -VisList *__lv_plugins = NULL; -/** Contains all the actor plugins after initialize. */ -VisList *__lv_plugins_actor = NULL; -/** Contains all the input plugins after initialize. */ -VisList *__lv_plugins_input = NULL; -/** Contains all the morph plugins after initialize. */ -VisList *__lv_plugins_morph = NULL; -/** Contains all the transform plugins after initialize. */ -VisList *__lv_plugins_transform = NULL; - -/** The global params container */ -VisParamContainer *__lv_paramcontainer = NULL; - -/** The userinterface for the global params */ -VisUIWidget *__lv_userinterface = NULL; - -/** Contains the number of plugin registry paths. */ -int __lv_plugpath_cnt = 0; -/** Char ** list of all the plugin paths. */ -char **__lv_plugpaths = NULL; - - -static int init_params (VisParamContainer *paramcontainer); -static VisUIWidget *make_userinterface (void); - -static int init_params (VisParamContainer *paramcontainer) -{ - VisParamEntry *param; - - visual_log_return_val_if_fail (paramcontainer != NULL, -1); - - /* Initialize all the global parameters here */ - - /* Song information parameters */ - /* Show songinfo */ - param = visual_param_entry_new ("songinfo show"); - visual_param_entry_set_integer (param, 1); - visual_param_container_add (paramcontainer, param); - - /* Songinfo timeout, in seconds */ - param = visual_param_entry_new ("songinfo timeout"); - visual_param_entry_set_integer (param, 5); - visual_param_container_add (paramcontainer, param); - - /* - * Show songinfo in plugins, plugins that optionally show song - * info should query this parameter - */ - param = visual_param_entry_new ("songinfo in plugin"); - visual_param_entry_set_integer (param, 1); - visual_param_container_add (paramcontainer, param); - - return 0; -} - -static VisUIWidget *make_userinterface () -{ - VisUIWidget *vbox; - VisUIWidget *hbox; - VisUIWidget *label1; - VisUIWidget *label2; - VisUIWidget *checkbox1; - VisUIWidget *checkbox2; - VisUIWidget *numeric; - - vbox = visual_ui_box_new (VISUAL_ORIENT_TYPE_VERTICAL); - hbox = visual_ui_box_new (VISUAL_ORIENT_TYPE_HORIZONTAL); - - label1 = visual_ui_label_new ("Show info for", FALSE); - label2 = visual_ui_label_new ("seconds", FALSE); - - checkbox1 = visual_ui_checkbox_new ("Show song information", TRUE); - visual_ui_mutator_set_param (VISUAL_UI_MUTATOR (checkbox1), - visual_param_container_get (__lv_paramcontainer, "songinfo show")); - - checkbox2 = visual_ui_checkbox_new ("Show song information in plugins", TRUE); - visual_ui_mutator_set_param (VISUAL_UI_MUTATOR (checkbox2), - visual_param_container_get (__lv_paramcontainer, "songinfo in plugin")); - - numeric = visual_ui_numeric_new (); - visual_ui_mutator_set_param (VISUAL_UI_MUTATOR (numeric), - visual_param_container_get (__lv_paramcontainer, "songinfo timeout")); - visual_ui_range_set_properties (VISUAL_UI_RANGE (numeric), 1, 60, 1, 0); - - visual_ui_box_pack (VISUAL_UI_BOX (hbox), label1); - visual_ui_box_pack (VISUAL_UI_BOX (hbox), numeric); - visual_ui_box_pack (VISUAL_UI_BOX (hbox), label2); - - visual_ui_box_pack (VISUAL_UI_BOX (vbox), checkbox1); - visual_ui_box_pack (VISUAL_UI_BOX (vbox), checkbox2); - visual_ui_box_pack (VISUAL_UI_BOX (vbox), hbox); - - return vbox; -} - -/** - * @defgroup Libvisual Libvisual - * @{ - */ - -/** - * Gives the libvisual version. - * - * @return A const char containing the libvisual version. - */ -const char *visual_get_version () -{ - return VERSION; -} - -/** - * Returns a pointer to the libvisual global VisParamContainer. - * - * @return A pointer to the libvisual global VisParamContainer. - */ -VisParamContainer *visual_get_params () -{ - return __lv_paramcontainer; -} - -/** - * Returns a pointer to the top container of libvisual it's configuration userinterface. - * - * @return A pointer to the libvisual configuration VisUIWidget. - */ -VisUIWidget *visual_get_userinterface () -{ - return __lv_userinterface; -} - -/** - * Adds extra plugin registry paths. - * - * @param pathadd A string containing a path where plugins are located. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_LIBVISUAL_NO_PATHS on failure. - */ -int visual_init_path_add (char *pathadd) -{ - __lv_plugpath_cnt++; - __lv_plugpaths = realloc (__lv_plugpaths, sizeof (char *) * __lv_plugpath_cnt); - - visual_log_return_val_if_fail (__lv_plugpaths != NULL, -VISUAL_ERROR_LIBVISUAL_NO_PATHS); - - __lv_plugpaths[__lv_plugpath_cnt - 1] = pathadd; - - return VISUAL_OK; -} - -/** - * Initialize libvisual. Sets up a plugin registry, register the program name and such. - * - * @param argc Pointer to an int containing the number of arguments within argv or NULL. - * @param argv Pointer to a list of strings that make up the argument vector or NULL. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_LIBVISUAL_ALREADY_INITIALIZED, - * -VISUAL_ERROR_LIBVISUAL_NO_REGISTRY or error values returned by visual_init_path_add () on failure. - */ -int visual_init (int *argc, char ***argv) -{ - int ret = 0; - - if (__lv_initialized == TRUE) { - visual_log (VISUAL_LOG_ERROR, "Over initialized"); - return -VISUAL_ERROR_LIBVISUAL_ALREADY_INITIALIZED; - } - - if (argc == NULL || argv == NULL) { - if (argc == NULL && argv == NULL) { - __lv_progname = strdup ("no progname"); - - - if (__lv_progname == NULL) - visual_log (VISUAL_LOG_WARNING, "Could not set program name"); - } else - visual_log (VISUAL_LOG_ERROR, "Initialization failed, bad argv, argc"); - - } else { - /* - * We must copy the argument, to let the client - * call this method from any context. - */ -#ifdef __USE_GNU - __lv_progname = strndup (*argv[0], 1024); -#else - __lv_progname = strdup (*argv[0]); -#endif - if (__lv_progname == NULL) - visual_log (VISUAL_LOG_WARNING, "Could not set program name"); - } - - /* Initialize CPU caps */ - visual_cpu_initialize (); - - /* Add the standard plugin paths */ - ret = visual_init_path_add (PLUGPATH"/actor"); - visual_log_return_val_if_fail (ret == VISUAL_OK, ret); - - ret = visual_init_path_add (PLUGPATH"/input"); - visual_log_return_val_if_fail (ret == VISUAL_OK, ret); - - ret = visual_init_path_add (PLUGPATH"/morph"); - visual_log_return_val_if_fail (ret == VISUAL_OK, ret); - - ret = visual_init_path_add (PLUGPATH"/transform"); - visual_log_return_val_if_fail (ret == VISUAL_OK, ret); - - /* And null terminate the list */ - ret = visual_init_path_add (NULL); - visual_log_return_val_if_fail (ret == VISUAL_OK, ret); - - __lv_plugins = visual_plugin_get_list ((const char**)__lv_plugpaths); - visual_log_return_val_if_fail (__lv_plugins != NULL, -VISUAL_ERROR_LIBVISUAL_NO_REGISTRY); - - __lv_plugins_actor = visual_plugin_registry_filter (__lv_plugins, VISUAL_PLUGIN_TYPE_ACTOR); - __lv_plugins_input = visual_plugin_registry_filter (__lv_plugins, VISUAL_PLUGIN_TYPE_INPUT); - __lv_plugins_morph = visual_plugin_registry_filter (__lv_plugins, VISUAL_PLUGIN_TYPE_MORPH); - __lv_plugins_transform = visual_plugin_registry_filter (__lv_plugins, VISUAL_PLUGIN_TYPE_TRANSFORM); - - __lv_paramcontainer = visual_param_container_new (); - init_params (__lv_paramcontainer); - __lv_userinterface = make_userinterface (); - - __lv_initialized = TRUE; - - return VISUAL_OK; -} - -/* - * Tells whether Libvisual is (correctly) initialized. - * - * @return TRUE if is it is initialized, FALSE otherwise. - */ -int visual_is_initialized () -{ - return __lv_initialized; -} - -/** - * Quits libvisual, destroys all the plugin registries. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_LIBVISUAL_NOT_INITIALIZED on failure. - */ -int visual_quit () -{ - int ret; - - if (__lv_initialized == FALSE) { - visual_log (VISUAL_LOG_WARNING, "Never initialized"); - - return -VISUAL_ERROR_LIBVISUAL_NOT_INITIALIZED; - } - - /* FIXME: Use VisError here, for human readable error strings */ - ret = visual_object_unref (VISUAL_OBJECT (__lv_plugins)); - if (ret < 0) - visual_log (VISUAL_LOG_WARNING, "Plugins references list: destroy failed"); - - ret = visual_object_unref (VISUAL_OBJECT (__lv_plugins_actor)); - if (ret < 0) - visual_log (VISUAL_LOG_WARNING, "Actor plugins list: destroy failed"); - - ret = visual_object_unref (VISUAL_OBJECT (__lv_plugins_input)); - if (ret < 0) - visual_log (VISUAL_LOG_WARNING, "Input plugins list: destroy failed"); - - ret = visual_object_unref (VISUAL_OBJECT (__lv_plugins_morph)); - if (ret < 0) - visual_log (VISUAL_LOG_WARNING, "Morph plugins list: destroy failed"); - - ret = visual_object_unref (VISUAL_OBJECT (__lv_plugins_transform)); - if (ret < 0) - visual_log (VISUAL_LOG_WARNING, "Transform plugins list: destroy failed"); - - ret = visual_object_unref (VISUAL_OBJECT (__lv_paramcontainer)); - if (ret < 0) - visual_log (VISUAL_LOG_WARNING, "Global param container: destroy failed"); - - ret = visual_object_unref (VISUAL_OBJECT (__lv_userinterface)); - if (ret < 0) - visual_log (VISUAL_LOG_WARNING, "Error during UI destroy:"); - - if (__lv_progname != NULL) { - visual_mem_free (__lv_progname); - - __lv_progname = NULL; - } - - __lv_initialized = FALSE; - return VISUAL_OK; -} - -/** - * @} - */ -
--- a/libvisual/lv_libvisual.h Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,46 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _LV_LIBVISUAL_H -#define _LV_LIBVISUAL_H - -#include <libvisual/lv_param.h> -#include <libvisual/lv_ui.h> - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -const char *visual_get_version (void); -VisParamContainer *visual_get_params (void); -VisUIWidget *visual_get_userinterface (void); -int visual_init_path_add (char *pathadd); -int visual_init (int *argc, char ***argv); -int visual_is_initialized (void); -int visual_quit (void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _LV_LIBVISUAL_H */
--- a/libvisual/lv_list.c Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,453 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * List implementation from RCL. - * Copyright (C) 2002, 2003, 2004 - * Dennis Smit <ds@nerds-incorporated.org>, - * Sepp Wijnands <mrrazz@nerds-incorporated.org>, - * Tom Wimmenhove <nohup@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * Sepp Wijnands <mrrazz@nerds-incorporated.org>, - * Tom Wimmenhove <nohup@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> -#include <fcntl.h> - -#include <lvconfig.h> -#include "lv_list.h" -#include "lv_log.h" -#include "lv_mem.h" - -static int list_dtor (VisObject *object); - -static int list_dtor (VisObject *object) -{ - VisList *list = VISUAL_LIST (object); - - visual_list_destroy_elements (list); - - return VISUAL_OK; -} - -/** - * @defgroup VisList VisList - * @{ - */ - -/** - * Creates a new VisList structure. - * The VisList system is a double linked list implementation. - * - * @return A newly allocated VisList. - */ -VisList *visual_list_new (VisListDestroyerFunc destroyer) -{ - VisList *list; - - list = visual_mem_new0 (VisList, 1); - - /* Do the VisObject initialization */ - visual_object_initialize (VISUAL_OBJECT (list), TRUE, list_dtor); - - list->destroyer = destroyer; - - return list; -} - -/** - * Frees the VisList. This frees the VisList data structure. - * - * @param list Pointer to a VisList that needs to be freed. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_LIST_NULL or error values returned by - * visual_mem_free () on failure. - */ -int visual_list_free (VisList *list) -{ - visual_log_return_val_if_fail (list != NULL, -VISUAL_ERROR_LIST_NULL); - - return visual_mem_free (list); -} - -/** - * Destroys the entries that are in a list, but not the list itself. It uses the element - * destroyer set at visual_list_new or visual_list_set_destroyer. - * - * @param list Pointer to a VisList of which the elements need to be destroyed. - * - * @return VISUAL_OK on succes, or -VISUAL_ERROR_LIST_NULL on failure. - */ -int visual_list_destroy_elements (VisList *list) -{ - VisListEntry *le = NULL; - void *elem; - - visual_log_return_val_if_fail (list != NULL, -VISUAL_ERROR_LIST_NULL); - - /* Walk through the given list, possibly calling the destroyer for it */ - if (list->destroyer == NULL) { - while ((elem = visual_list_next (list, &le)) != NULL) - visual_list_delete (list, &le); - } else { - while ((elem = visual_list_next (list, &le)) != NULL) { - list->destroyer (elem); - visual_list_delete (list, &le); - } - } - - return VISUAL_OK; -} - -/** - * Sets a VisListEntry destroyer function a VisList. - * - * @param list Pointer to a VisList to which the VisListDestroyerFunc is set. - * @param destroyer The VisListEntry destroyer function. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_LIST_NULL on failure. - */ -int visual_list_set_destroyer (VisList *list, VisListDestroyerFunc destroyer) -{ - visual_log_return_val_if_fail (list != NULL, -VISUAL_ERROR_LIST_NULL); - - list->destroyer = destroyer; - - return VISUAL_OK; -} - -/** - * Go to the next entry in the list and return it's data element. - * This function will load the next entry in le and return a pointer - * to the data element. - * - * @see visual_list_prev - * - * @param list Pointer to the VisList we're traversing. - * @param le Pointer to a VisListEntry to store the next entry within - * and also to use as a reference to determine at which entry we're - * currently. To begin traversing do: VisListEntry *le = NULL and pass - * it as &le in the argument. - * - * @return The data element of the next entry, or NULL. - */ -void *visual_list_next (VisList *list, VisListEntry **le) -{ - visual_log_return_val_if_fail (list != NULL, NULL); - visual_log_return_val_if_fail (le != NULL, NULL); - - if (*le == NULL) - *le = list->head; - else - *le = (*le)->next; - - if (*le != NULL) - return (*le)->data; - - return NULL; -} - -/** - * Go to the previous entry in the list and return it's data element. - * This function will load the previous entry in le and return a pointer - * to the data element. - * - * @see visual_list_next - * - * @param list Pointer to the VisList we're traversing. - * @param le Pointer to a VisListEntry to store the previous entry within - * and also to use as a reference to determine at which entry we're - * currently. To begin traversing at the end of the list do: - * VisList *le = NULL and pass it as &le in the argument. - * - * @return The data element of the previous entry, or NULL. - */ -void *visual_list_prev (VisList *list, VisListEntry **le) -{ - visual_log_return_val_if_fail (list != NULL, NULL); - visual_log_return_val_if_fail (le != NULL, NULL); - - if (!*le) - *le = list->tail; - else - *le = (*le)->prev; - - if (*le) - return (*le)->data; - - return NULL; -} - -/** - * Get an data entry by index. This will give the pointer to an data - * element based on the index in the list. - * - * @param list Pointer to the VisList of which we want an element. - * @param index Index to determine which entry we want. The index starts at - * 1. - * - * @return The data element of the requested entry, or NULL. - */ -void *visual_list_get (VisList *list, int index) -{ - VisListEntry *le = NULL; - void *data = NULL; - int i, lc; - - visual_log_return_val_if_fail (list != NULL, NULL); - visual_log_return_val_if_fail (index >= 0, NULL); - - lc = visual_list_count (list); - - if (lc - 1 < index) - return NULL; - - for (i = 0; i <= index; i++) { - data = visual_list_next (list, &le); - - if (data == NULL) - return NULL; - } - - return data; -} - -/** - * Adds an entry at the beginning of the list. - * - * @param list Pointer to the VisList to which an entry needs to be added - * at it's head. - * @param data A pointer to the data that needs to be added to the list. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_LIST_NULL on failure. - */ -int visual_list_add_at_begin (VisList *list, void *data) -{ - VisListEntry *current, *next; - - visual_log_return_val_if_fail (list != NULL, -VISUAL_ERROR_LIST_NULL); - - /* Allocate memory for new list entry */ - current = visual_mem_new0 (VisListEntry, 1); - - /* Assign data element */ - current->data = data; - - if (list->head == NULL) { - list->head = current; - list->tail = current; - } else { - next = list->head; - - current->next = next; - list->head = current; - } - - /* Done */ - list->count++; - - return VISUAL_OK; -} - -/** - * Adds an entry at the end of the list. - * - * @param list Pointer to the VisList to which an entry needs to be added - * at it's tail. - * @param data A pointer to the data that needs to be added to the list. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_LIST_NULL on failure. - */ -int visual_list_add (VisList *list, void *data) -{ - VisListEntry *current, *prev; - - visual_log_return_val_if_fail (list != NULL, -VISUAL_ERROR_LIST_NULL); - - current = visual_mem_new0 (VisListEntry, 1); - - /* Assign data element */ - current->data = data; - - /* Add list entry to list */ - /* Is this the first entry for this list ? */ - if (list->head == NULL) { - list->head = current; - list->tail = current; - } else { - /* Nope, add to tail of this list */ - prev = list->tail; - - /* Exchange pointers */ - prev->next = current; - current->prev = prev; - - /* Point tail to new entry */ - list->tail = current; - } - - /* Done */ - list->count++; - - return VISUAL_OK; -} - -/** - * Insert an entry in the middle of a list. By adding it - * after the le entry. - * - * @param list Pointer to the VisList in which an entry needs to be inserted. - * @param le Pointer to a VisListEntry after which the entry needs to be inserted. - * @param data Pointer to the data the new entry represents. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_LIST_NULL, -VISUAL_ERROR_LIST_ENTRY_NULL or - * -VISUAL_ERROR_NULL on failure. - */ -int visual_list_insert (VisList *list, VisListEntry **le, void *data) -{ - VisListEntry *prev, *next, *current; - - visual_log_return_val_if_fail (list != NULL, -VISUAL_ERROR_LIST_NULL); - visual_log_return_val_if_fail (le != NULL, -VISUAL_ERROR_LIST_ENTRY_NULL); - visual_log_return_val_if_fail (data != NULL, -VISUAL_ERROR_NULL); - - current = visual_mem_new0 (VisListEntry, 1); - - /* Assign data element */ - current->data = data; - - /* Add entry to list */ - if (list->head == NULL && *le == NULL) { - /* First entry */ - list->head = current; - list->tail = current; - } else if (*le == NULL) { - /* Insert entry at first position */ - next = list->head; - /* Exchange pointers */ - current->next = next; - next->prev = current; - /* Point head to current pointer */ - list->head = current; - } else { - /* Insert entry at *le's position */ - prev = *le; - next = prev->next; - - current->prev = prev; - current->next = next; - - prev->next = current; - if (next != NULL) - next->prev = current; - else - list->tail = current; - } - - /* Hop to new entry */ - *le = current; - - /* Done */ - list->count++; - - return VISUAL_OK; -} - -/** - * Removes an entry from the list. - * - * @param list A pointer to the VisList in which an entry needs to be deleted. - * @param le A pointer to the entry that needs to be deleted. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_LIST_NULL or -VISUAL_ERROR_LIST_ENTRY_NULL on failure. - */ -int visual_list_delete (VisList *list, VisListEntry **le) -{ - VisListEntry *prev, *current, *next; - - visual_log_return_val_if_fail (list != NULL, -VISUAL_ERROR_LIST_NULL); - visual_log_return_val_if_fail (le != NULL, -VISUAL_ERROR_LIST_ENTRY_NULL); - - prev = current = next = NULL; - - /* Valid list entry ? */ - if (*le == NULL) { - visual_log (VISUAL_LOG_CRITICAL, "There is no list entry to delete"); - - return -VISUAL_ERROR_LIST_ENTRY_INVALID; /* Nope */ - } - - /* Point new to le's previous entry */ - current = *le; - prev = current->prev; - next = current->next; - - /* Does it have a previous entry ? */ - if (prev != NULL) - prev->next = next; - else - list->head = next; - - if (next != NULL) /* It does have a next entry ? */ - next->prev = prev; - else - list->tail = prev; - - /* Point current entry to previous one */ - *le = prev; - - /* Free 'old' pointer */ - list->count--; - visual_mem_free (current); - - return VISUAL_OK; -} - -/** - * Counts the number of entries within the list. - * - * @param list A pointer to the list from which an entry count is needed. - * - * @return The number of elements or -VISUAL_ERROR_LIST_NULL on failure. - */ -int visual_list_count (VisList *list) -{ - VisListEntry *le = NULL; - int count = 0; - - visual_log_return_val_if_fail (list != NULL, -VISUAL_ERROR_LIST_NULL); - - /* Walk through list */ - while (visual_list_next (list, &le) != NULL) - count++; - - list->count = count; - - return count; -} - -/** - * @} - */ -
--- a/libvisual/lv_list.h Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,106 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * List implementation from RCL. - * Copyright (C) 2002, 2003, 2004 - * Dennis Smit <ds@nerds-incorporated.org>, - * Sepp Wijnands <mrrazz@nerds-incorporated.org>, - * Tom Wimmenhove <nohup@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * Sepp Wijnands <mrrazz@nerds-incorporated.org>, - * Tom Wimmenhove <nohup@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _LV_LIST_H -#define _LV_LIST_H - -#include <libvisual/lv_common.h> - -#if defined(__FreeBSD__) || defined(__OpenBSD__) -#include <sys/queue.h> -#endif - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#define VISUAL_LIST(obj) (VISUAL_CHECK_CAST ((obj), 0, VisList)) - -typedef struct _VisListEntry VisListEntry; -typedef struct _VisList VisList; - -/** - * An VisList destroyer function needs this signature. - * - * @arg data The data that was stored in a VisListEntry and thus can be destroyed. - */ -typedef void (*VisListDestroyerFunc)(void *data); - -/** - * The VisListEntry data structure is an entry within the linked list. - * It does contain a pointer to both the previous and next entry in the list and - * a void * to the data. - */ -struct _VisListEntry { - VisListEntry *prev; /**< Previous entry in the list. */ - VisListEntry *next; /**< Next entry in the list. */ - void *data; /**< Pointer to the data for this entry. */ -}; - -/** - * The VisList data structure holds the linked list. - * It contains an entry pointer to both the head and tail of the list as well - * an entry counter. - */ -struct _VisList { - VisObject object; /**< The VisObject data. */ - VisListDestroyerFunc destroyer; /**< The List destroyer function. */ - VisListEntry *head; /**< Pointer to the beginning of the list. */ - VisListEntry *tail; /**< Pointer to the end of the list. */ - int count; /**< Number of entries that are in the list. */ -}; - - -/* prototypes */ -VisList *visual_list_new (VisListDestroyerFunc destroyer); -int visual_list_free (VisList *list); -int visual_list_destroy_elements (VisList *list); - -int visual_list_set_destroyer (VisList *list, VisListDestroyerFunc destroyer); - -void *visual_list_next (VisList *list, VisListEntry **le); -void *visual_list_prev (VisList *list, VisListEntry **le); - -void *visual_list_get (VisList *list, int index); - -int visual_list_add_at_begin (VisList *list, void *data); -int visual_list_add (VisList *list, void *data); - -int visual_list_insert (VisList *list, VisListEntry **le, void *data); -int visual_list_delete (VisList *list, VisListEntry **le); - -int visual_list_count (VisList *list); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _LV_LIST_H */
--- a/libvisual/lv_log.c Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,270 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> -#include <stdarg.h> -#include <assert.h> -#include <signal.h> - -#include "lv_common.h" -#include "lv_error.h" -#include "lv_log.h" - - -static VisLogVerboseness verboseness = VISUAL_LOG_VERBOSENESS_MEDIUM; - -static void default_info_handler (const char *msg, const char *funcname, void *privdata); -static void default_warning_handler (const char *msg, const char *funcname, void *privdata); -static void default_critical_handler (const char *msg, const char *funcname, void *privdata); -static void default_error_handler (const char *msg, const char *funcname, void *privdata); - -static struct _message_handlers { - VisLogMessageHandlerFunc info_handler; - VisLogMessageHandlerFunc warning_handler; - VisLogMessageHandlerFunc critical_handler; - VisLogMessageHandlerFunc error_handler; - - void *info_priv; - void *warning_priv; - void *critical_priv; - void *error_priv; -} message_handlers; - - -/** - * @defgroup VisLog VisLog - * @{ - */ - -/** - * Set the library it's verbosity level. - * - * @param v The verbose level as a VisLogVerboseness enumerate value. - */ -void visual_log_set_verboseness (VisLogVerboseness v) -{ - verboseness = v; -} - -/** - * Get the current library it's verbosity level. - * - * @return The verboseness level as a VisLogVerboseness enumerate value. - */ -VisLogVerboseness visual_log_get_verboseness () -{ - return verboseness; -} - -/** - * Set the callback function that handles info messages. - * - * @param handler The custom message handler callback. - * @param priv Optional private data to pass on to the handler. - */ -void visual_log_set_info_handler (VisLogMessageHandlerFunc handler, void *priv) -{ - visual_log_return_if_fail (handler != NULL); - - message_handlers.info_handler = handler; - - message_handlers.info_priv = priv; -} - -/** - * Set the callback function that handles warning messages. - * - * @param handler The custom message handler callback. - * @param priv Optional private data to pass on to the handler. - */ -void visual_log_set_warning_handler (VisLogMessageHandlerFunc handler, void *priv) -{ - visual_log_return_if_fail (handler != NULL); - - message_handlers.warning_handler = handler; - - message_handlers.warning_priv = priv; -} - -/** - * Set the callback function that handles critical messages. - * - * @param handler The custom message handler callback. - * @param priv Optional private data to pass on to the handler. - */ -void visual_log_set_critical_handler (VisLogMessageHandlerFunc handler, void *priv) -{ - visual_log_return_if_fail (handler != NULL); - - message_handlers.critical_handler = handler; - - message_handlers.critical_priv = priv; -} - -/** - * Set the callback function that handles error messages. After handling the message with - * this function, libvisual will abort the program. This behavior cannot be - * changed. - * - * @param handler The custom message handler callback. - * @param priv Optional private data to pass on to the handler. - */ -void visual_log_set_error_handler (VisLogMessageHandlerFunc handler, void *priv) -{ - visual_log_return_if_fail (handler != NULL); - - message_handlers.error_handler = handler; - - message_handlers.error_priv = priv; -} - -/** - * Set callback the function that handles all the messages. - * - * @param handler The custom message handler callback. - * @param priv Optional private data to pass on to the handler. - */ -void visual_log_set_all_messages_handler (VisLogMessageHandlerFunc handler, void *priv) -{ - visual_log_return_if_fail (handler != NULL); - - message_handlers.info_handler = handler; - message_handlers.warning_handler = handler; - message_handlers.critical_handler = handler; - message_handlers.error_handler = handler; - - message_handlers.info_priv = priv; - message_handlers.warning_priv = priv; - message_handlers.critical_priv = priv; - message_handlers.error_priv = priv; -} - -/** - * Private library call used by the visual_log define to display debug, - * warning and error messages. - * - * @see visual_log - * - * @param severity Severity of the log message. - * @param file Char pointer to a string that contains the source filename. - * @param line Line number for which the log message is. - * @param funcname Function name in which the log message is called. - * @param fmt Format string to display the log message. - */ -void _lv_log (VisLogSeverity severity, const char *file, - int line, const char *funcname, const char *fmt, ...) -{ - char str[1024]; - va_list va; - - assert (fmt != NULL); - - va_start (va, fmt); - vsnprintf (str, 1023, fmt, va); - va_end (va); - - switch (severity) { - case VISUAL_LOG_DEBUG: - if (verboseness == VISUAL_LOG_VERBOSENESS_HIGH) - fprintf (stderr, "libvisual DEBUG: %s: %s() [(%s,%d)]: %s\n", - __lv_progname, funcname, file, line, str); - - break; - case VISUAL_LOG_INFO: - if (!message_handlers.info_handler) - visual_log_set_info_handler (default_info_handler, NULL); - - if (verboseness >= VISUAL_LOG_VERBOSENESS_MEDIUM) - message_handlers.info_handler (str, funcname, message_handlers.info_priv); - - break; - case VISUAL_LOG_WARNING: - if (!message_handlers.warning_handler) - visual_log_set_warning_handler (default_warning_handler, NULL); - - if (verboseness >= VISUAL_LOG_VERBOSENESS_MEDIUM) - message_handlers.warning_handler (str, funcname, message_handlers.warning_priv); - - break; - - case VISUAL_LOG_CRITICAL: - if (!message_handlers.critical_handler) - visual_log_set_critical_handler (default_critical_handler, NULL); - - if (verboseness >= VISUAL_LOG_VERBOSENESS_LOW) - message_handlers.critical_handler (str, funcname, message_handlers.critical_priv); - - break; - - case VISUAL_LOG_ERROR: - if (!message_handlers.error_handler) - visual_log_set_error_handler (default_error_handler, NULL); - - if (verboseness >= VISUAL_LOG_VERBOSENESS_LOW) - message_handlers.error_handler (str, funcname, message_handlers.error_priv); - - visual_error_raise (); - - break; - } -} - -/** - * @} - */ - -static void default_info_handler (const char *msg, const char *funcname, void *privdata) -{ - printf ("libvisual INFO: %s: %s\n", __lv_progname, msg); -} - -static void default_warning_handler (const char *msg, const char *funcname, void *privdata) -{ - if (funcname) - fprintf (stderr, "libvisual WARNING: %s: %s(): %s\n", - __lv_progname, funcname, msg); - else - fprintf (stderr, "libvisual WARNING: %s: %s\n", __lv_progname, msg); -} - -static void default_critical_handler (const char *msg, const char *funcname, void *privdata) -{ - if (funcname) - fprintf (stderr, "libvisual CRITICAL: %s: %s(): %s\n", - __lv_progname, funcname, msg); - else - fprintf (stderr, "libvisual CRITICAL: %s: %s\n", __lv_progname, msg); -} - -static void default_error_handler (const char *msg, const char *funcname, void *privdata) -{ - if (funcname) - fprintf (stderr, "libvisual ERROR: %s: %s(): %s\n", - __lv_progname, funcname, msg); - else - fprintf (stderr, "libvisual ERROR: %s: %s\n", __lv_progname, msg); -} -
--- a/libvisual/lv_log.h Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,313 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _LV_LOG_H -#define _LV_LOG_H - -#include <stdio.h> -#include <string.h> -#include <stdarg.h> -#include <assert.h> - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/* This is read-only */ -extern char *__lv_progname; - -/** - * Used to determine the severity of the log message using the visual_log - * define. - * - * @see visual_log - */ -typedef enum { - VISUAL_LOG_DEBUG, /**< Debug message, to use for debug messages. */ - VISUAL_LOG_INFO, /**< Informative message, can be used for general info. */ - VISUAL_LOG_WARNING, /**< Warning message, use to warn the user. */ - VISUAL_LOG_CRITICAL, /**< Critical message, when a critical situation happens. - * Like a NULL pointer passed to a method. */ - VISUAL_LOG_ERROR /**< Error message, use to notify the user of fatals. - * After the message has been showed, the program is aborted. */ -} VisLogSeverity; - -/** - * Used to determine how much verbose the log system should be. - * - * @see visual_log_set_verboseness - */ -typedef enum { - VISUAL_LOG_VERBOSENESS_NONE, /**< Don't show any message at all. */ - VISUAL_LOG_VERBOSENESS_LOW, /**< Show only VISUAL_LOG_ERROR and - VISUAL_LOG_CRITICAL messages. */ - VISUAL_LOG_VERBOSENESS_MEDIUM, /**< Show all log messages except VISUAL_LOG_DEBUG ones. */ - VISUAL_LOG_VERBOSENESS_HIGH /**< Show all log messages. */ -} VisLogVerboseness; - -/** - * Functions that want to handle messages must match this signature. - * - * @arg message The message that will be shown, exactly the same as that was passed - * to visual_log(), but after formatting. - * - * @arg funcname The name of the function that invokes visual_log(). On non-GNU systems - * this will probably be NULL. - * - * @arg priv Private field to be used by the client. The library will never touch this. - */ -typedef void (*VisLogMessageHandlerFunc) (const char *message, - const char *funcname, void *priv); - -void visual_log_set_verboseness (VisLogVerboseness verboseness); -VisLogVerboseness visual_log_get_verboseness (void); - -void visual_log_set_info_handler (VisLogMessageHandlerFunc handler, void *priv); -void visual_log_set_warning_handler (VisLogMessageHandlerFunc handler, void *priv); -void visual_log_set_critical_handler (VisLogMessageHandlerFunc handler, void *priv); -void visual_log_set_error_handler (VisLogMessageHandlerFunc handler, void *priv); - -void visual_log_set_all_messages_handler (VisLogMessageHandlerFunc handler, void *priv); - -/** - * Used for log messages, this is brought under a define so - * that the __FILE__ and __LINE__ macros (and probably __PRETTY_FUNC__) work, - * and thus provide better information. - * - * @see VisLogSeverity - * - * @param severity Determines the severity of the message using VisLogSeverity. - * @param format The format string of the log message. - */ -#ifdef __GNUC__ - -#ifdef LV_HAVE_ISO_VARARGS -#define visual_log(severity,...) \ - _lv_log (severity, \ - __FILE__, \ - __LINE__, \ - __PRETTY_FUNCTION__, \ - __VA_ARGS__) -#elif defined(LV_HAVE_GNUC_VARARGS) -#define visual_log(severity,format...) \ - _lv_log (severity, \ - __FILE__, \ - __LINE__, \ - __PRETTY_FUNCTION__, \ - format) -#else - -#include <signal.h> - -static void visual_log (VisLogSeverity severity, const char *fmt, ...) -{ - char str[1024]; - va_list va; - char sever_msg[10]; - VisLogVerboseness v; - - assert (fmt != NULL); - - va_start (va, fmt); - vsnprintf (str, 1023, fmt, va); - va_end (va); - - switch (severity) { - case VISUAL_LOG_DEBUG: - strncpy (sever_msg, "DEBUG", 9); - break; - case VISUAL_LOG_INFO: - strncpy (sever_msg, "INFO", 9); - break; - case VISUAL_LOG_WARNING: - strncpy (sever_msg, "WARNING", 9); - break; - case VISUAL_LOG_CRITICAL: - strncpy (sever_msg, "CRITICAL", 9); - break; - case VISUAL_LOG_ERROR: - strncpy (sever_msg, "ERROR", 9); - break; - default: - assert (0); - } - /* - * Sorry, we doesn't have (file,line) information - */ - v = visual_log_get_verboseness (); - switch (severity) { - case VISUAL_LOG_DEBUG: - if (v == VISUAL_LOG_VERBOSENESS_HIGH) - fprintf (stderr, "libvisual %s: %s: %s\n", - sever_msg, __lv_progname, str); - break; - case VISUAL_LOG_INFO: - if (v >= VISUAL_LOG_VERBOSENESS_MEDIUM) - printf ("libvisual %s: %s: %s\n", - sever_msg, __lv_progname, str); - break; - case VISUAL_LOG_WARNING: - if (v >= VISUAL_LOG_VERBOSENESS_MEDIUM) - fprintf (stderr, "libvisual %s: %s: %s\n", - sever_msg, __lv_progname, str); - break; - case VISUAL_LOG_CRITICAL: - if (v >= VISUAL_LOG_VERBOSENESS_LOW) - fprintf (stderr, "libvisual %s: %s: %s\n", - sever_msg, __lv_progname, str); - break; - case VISUAL_LOG_ERROR: - if (v >= VISUAL_LOG_VERBOSENESS_LOW) - printf ("libvisual %s: %s: %s\n", - sever_msg, __lv_progname, str); - visual_error_raise (); - break; - } -} -#endif /* !(ISO_VARARGS || GNUC_VARARGS) */ - -#endif /* __GNUC__ */ - - -#ifndef __GNUC__ - -#ifdef LV_HAVE_ISO_VARARGS -#define visual_log(severity,...) \ - _lv_log (severity, \ - __FILE__, \ - __LINE__, \ - (NULL), \ - __VA_ARGS__) -#else - -#include <signal.h> - -static void visual_log (VisLogSeverity severity, const char *fmt, ...) -{ - char str[1024]; - va_list va; - char sever_msg[10]; - VisLogVerboseness v; - - assert (fmt != NULL); - - va_start (va, fmt); - vsnprintf (str, 1023, fmt, va); - va_end (va); - - switch (severity) { - case VISUAL_LOG_DEBUG: - strncpy (sever_msg, "DEBUG", 9); - break; - case VISUAL_LOG_INFO: - strncpy (sever_msg, "INFO", 9); - break; - case VISUAL_LOG_WARNING: - strncpy (sever_msg, "WARNING", 9); - break; - case VISUAL_LOG_CRITICAL: - strncpy (sever_msg, "CRITICAL", 9); - break; - case VISUAL_LOG_ERROR: - strncpy (sever_msg, "ERROR", 9); - break; - default: - assert (0); - } - /* - * Sorry, we don't have (file,line) information - */ - v = visual_log_get_verboseness (); - switch (severity) { - case VISUAL_LOG_DEBUG: - if (v == VISUAL_LOG_VERBOSENESS_HIGH) - fprintf (stderr, "libvisual %s: %s: %s\n", - sever_msg, __lv_progname, str); - break; - case VISUAL_LOG_INFO: - if (v >= VISUAL_LOG_VERBOSENESS_MEDIUM) - printf ("libvisual %s: %s: %s\n", - sever_msg, __lv_progname, str); - break; - case VISUAL_LOG_WARNING: - if (v >= VISUAL_LOG_VERBOSENESS_MEDIUM) - fprintf (stderr, "libvisual %s: %s: %s\n", - sever_msg, __lv_progname, str); - break; - case VISUAL_LOG_CRITICAL: - if (v >= VISUAL_LOG_VERBOSENESS_LOW) - fprintf (stderr, "libvisual %s: %s: %s\n", - sever_msg, __lv_progname, str); - break; - case VISUAL_LOG_ERROR: - if (v >= VISUAL_LOG_VERBOSENESS_LOW) - printf ("libvisual %s: %s: %s\n", - sever_msg, __lv_progname, str); - visual_error_raise (); - break; - } -} -#endif /* ISO_VARARGS */ - -#endif /* !__GNUC__ */ - -/** - * Return if @a expr is FALSE, showing a critical message with - * useful information. - */ -#define visual_log_return_if_fail(expr) \ - if (expr) { } else \ - { \ - visual_log (VISUAL_LOG_CRITICAL, \ - "assertion `%s' failed", \ - #expr); \ - return; \ - } - -/** - * Return if @a val if @a expr is FALSE, showing a critical message - * with useful information. - */ -#define visual_log_return_val_if_fail(expr, val) \ - if (expr) { } else \ - { \ - visual_log (VISUAL_LOG_CRITICAL, \ - "assertion `%s' failed", \ - #expr); \ - return (val); \ - } - -#if defined __GNUC__ -void _lv_log (VisLogSeverity severity, const char *file, - int line, const char *funcname, const char *fmt, ...) - __attribute__ ((__format__ (__printf__, 5, 6))); -#else -void _lv_log (VisLogSeverity severity, const char *file, - int line, const char *funcname, const char *fmt, ...); -#endif - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _LV_LOG_H */
--- a/libvisual/lv_mem.c Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,155 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include <string.h> -#include <stdlib.h> - -#include "lv_mem.h" -#include "lv_common.h" -#include "lv_log.h" -#include "lv_error.h" -#include "lv_cpu.h" - -/** - * @defgroup VisMem VisMem - * @{ - */ - -/** - * Allocates @a nbytes of memory initialized to 0. - * - * @param nbytes N bytes of mem requested to be allocated. - * - * @return On success, a pointer to a new allocated memory initialized - * to 0 of size @a nbytes, on failure, program is aborted, so you never need - * to check the return value. - */ -void *visual_mem_malloc0 (visual_size_t nbytes) -{ - void *buf = malloc (nbytes); - - visual_log_return_val_if_fail (nbytes > 0, NULL); - - if (buf == NULL) { - visual_log (VISUAL_LOG_ERROR, "Cannot get %" VISUAL_SIZE_T_FORMAT " bytes of memory", nbytes); - return NULL; - } - - memset (buf, 0, nbytes); - - return buf; -} - -/** - * Frees allocated memory. - * - * @param ptr Frees memory to which ptr points to. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_MEM_NULL on failure. - */ -int visual_mem_free (void *ptr) -{ - visual_log_return_val_if_fail (ptr != NULL, -VISUAL_ERROR_MEM_NULL); - - free (ptr); - - return VISUAL_OK; -} - -/** - * Copies a block of mem using optimized methods. - * - * @param dest Pointer to destination. - * @param src Pointer to source. - * @param n The number of bytes to be copied. - * - * @return Pointer to dest. - */ -void *visual_mem_copy (void *dest, const void *src, size_t n) -{ - VisCPU *cpucaps = visual_cpu_get_caps (); - uint32_t *d = dest; - const uint32_t *s = src; - uint8_t *dc = dest; - const uint8_t *sc = src; - - /* FIXME Add mmx,sse versions, optionally with prefetching and such - * with checking for optimal scan lines */ - - /* FIXME #else for the VISUAL_ARCH_X86 */ - - /* FIXME fix this stuff ! */ - return memcpy (dest, src, n); - - if (cpucaps->hasMMX == 1) { -#ifdef VISUAL_ARCH_X86 - while (n > 64) { - __asm __volatile - (//"\n\t prefetch 256(%0)" /* < only use when 3dnow is present */ - //"\n\t prefetch 320(%0)" - "\n\t movq (%0), %%mm0" - "\n\t movq 8(%0), %%mm1" - "\n\t movq 16(%0), %%mm2" - "\n\t movq 24(%0), %%mm3" - "\n\t movq 32(%0), %%mm4" - "\n\t movq 40(%0), %%mm5" - "\n\t movq 48(%0), %%mm6" - "\n\t movq 56(%0), %%mm7" - "\n\t movntq %%mm0, (%1)" - "\n\t movntq %%mm1, 8(%1)" - "\n\t movntq %%mm2, 16(%1)" - "\n\t movntq %%mm3, 24(%1)" - "\n\t movntq %%mm4, 32(%1)" - "\n\t movntq %%mm5, 40(%1)" - "\n\t movntq %%mm6, 48(%1)" - "\n\t movntq %%mm7, 56(%1)" - :: "r" (s), "r" (d) : "memory"); - - - d += 16; - s += 16; - - n -= 64; - } -#endif /* VISUAL_ARCH_X86 */ - } else { - while (n >= 4) { - *d++ = *s++; - n -= 4; - } - - dc = (uint8_t *) d; - sc = (const uint8_t *) s; - - } - - while (n--) - *dc++ = *sc++; - - return dest; -} - -/** - * @} - */ -
--- a/libvisual/lv_mem.h Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _LV_MEM_H -#define _LV_MEM_H - -#include <libvisual/lvconfig.h> - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#ifndef __attribute_malloc__ -#define __attribute_malloc__ -#endif - -void *visual_mem_malloc0 (visual_size_t nbytes) __attribute_malloc__; -int visual_mem_free (void *ptr); - -void *visual_mem_copy (void *dest, const void *src, size_t n); - -/** - * @ingroup VisMem - * - * Convenient macro to request @a n_structs structures of type @a struct_type - * initialized to 0. - */ -#define visual_mem_new0(struct_type, n_structs) \ - ((struct_type *) visual_mem_malloc0 (((visual_size_t) sizeof (struct_type)) * ((visual_size_t) (n_structs)))) - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _LV_MEM_H */
--- a/libvisual/lv_morph.c Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,462 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> - -#include <lvconfig.h> -#include "lv_log.h" -#include "lv_morph.h" -#include "lv_log.h" -#include "lv_mem.h" - -extern VisList *__lv_plugins_morph; - -static int morph_dtor (VisObject *object); - -static VisMorphPlugin *get_morph_plugin (VisMorph *morph); - -static int morph_dtor (VisObject *object) -{ - VisMorph *morph = VISUAL_MORPH (object); - - if (morph->plugin != NULL) - visual_plugin_unload (morph->plugin); - - visual_palette_free_colors (&morph->morphpal); - - morph->plugin = NULL; - - return VISUAL_OK; -} - -static VisMorphPlugin *get_morph_plugin (VisMorph *morph) -{ - VisMorphPlugin *morphplugin; - - visual_log_return_val_if_fail (morph != NULL, NULL); - visual_log_return_val_if_fail (morph->plugin != NULL, NULL); - - morphplugin = VISUAL_PLUGIN_MORPH (morph->plugin->info->plugin); - - return morphplugin; -} - -/** - * @defgroup VisMorph VisMorph - * @{ - */ - -/** - * Gives the encapsulated VisPluginData from a VisMorph. - * - * @param morph Pointer of a VisMorph of which the VisPluginData needs to be returned. - * - * @return VisPluginData that is encapsulated in the VisMorph, possibly NULL. - */ -VisPluginData *visual_morph_get_plugin (VisMorph *morph) -{ - return morph->plugin; -} - -/** - * Gives a list of morph plugins in the current plugin registry. - * - * @return a VisList containing the morph plugins in the plugin registry. - */ -VisList *visual_morph_get_list () -{ - return __lv_plugins_morph; -} - -/** - * Gives the next morph plugin based on the name of a plugin. - * - * @see visual_morph_get_prev_by_name - * - * @param name The name of the current plugin, or NULL to get the first. - * - * @return The name of the next plugin within the list. - */ -const char *visual_morph_get_next_by_name (const char *name) -{ - return visual_plugin_get_next_by_name (visual_morph_get_list (), name); -} - -/** - * Gives the previous morph plugin based on the name of a plugin. - * - * @see visual_morph_get_next_by_name - * - * @param name The name of the current plugin. or NULL to get the last. - * - * @return The name of the previous plugin within the list. - */ -const char *visual_morph_get_prev_by_name (const char *name) -{ - return visual_plugin_get_prev_by_name (visual_morph_get_list (), name); -} - -/** - * Checks if the morph plugin is in the registry, based on it's name. - * - * @param name The name of the plugin that needs to be checked. - * - * @return TRUE if found, else FALSE. - */ -int visual_morph_valid_by_name (const char *name) -{ - if (visual_plugin_find (visual_morph_get_list (), name) == NULL) - return FALSE; - else - return TRUE; -} - -/** - * Creates a new VisMorph from name, the plugin will be loaded but won't be realized. - * - * @param morphname - * The name of the plugin to load, or NULL to simply allocate a new - * morph. - * - * @return A newly allocated VisMorph, optionally containing a loaded plugin. Or NULL on failure. - */ -VisMorph *visual_morph_new (const char *morphname) -{ - VisMorph *morph; - VisPluginRef *ref; - - if (__lv_plugins_morph == NULL && morphname != NULL) { - visual_log (VISUAL_LOG_CRITICAL, "the plugin list is NULL"); - return NULL; - } - - morph = visual_mem_new0 (VisMorph, 1); - - /* Do the VisObject initialization */ - visual_object_initialize (VISUAL_OBJECT (morph), TRUE, morph_dtor); - - visual_palette_allocate_colors (&morph->morphpal, 256); - - visual_morph_set_mode (morph, VISUAL_MORPH_MODE_SET); - - if (morphname == NULL) - return morph; - - ref = visual_plugin_find (__lv_plugins_morph, morphname); - - morph->plugin = visual_plugin_load (ref); - - return morph; -} - -/** - * Realize the VisMorph. This also calls the plugin init function. - * - * @param morph Pointer to a VisMorph that needs to be realized. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_MORPH_NULL, -VISUAL_ERROR_PLUGIN_NULL or error values - * returned by visual_plugin_realize () on failure. - */ -int visual_morph_realize (VisMorph *morph) -{ - visual_log_return_val_if_fail (morph != NULL, -VISUAL_ERROR_MORPH_NULL); - visual_log_return_val_if_fail (morph->plugin != NULL, -VISUAL_ERROR_PLUGIN_NULL); - - return visual_plugin_realize (morph->plugin); -} - -/** - * Gives the by the plugin natively supported depths - * - * @param morph Pointer to a VisMorph of which the supported depth of it's - * encapsulated plugin is requested. - * - * @return an OR value of the VISUAL_VIDEO_CONTEXT_* values which can be checked against using AND on succes, -1 on failure - */ -int visual_morph_get_supported_depth (VisMorph *morph) -{ - VisPluginData *plugin; - VisMorphPlugin *morphplugin; - - visual_log_return_val_if_fail (morph != NULL, -VISUAL_ERROR_MORPH_NULL); - visual_log_return_val_if_fail (morph->plugin != NULL, -VISUAL_ERROR_PLUGIN_NULL); - - morphplugin = get_morph_plugin (morph); - - if (morphplugin == NULL) - return -VISUAL_ERROR_MORPH_PLUGIN_NULL; - - return morphplugin->depth; -} - -/** - * Used to connect the target display, or a buffer it's VisVideo to the VisMorph plugin. - * - * @see visual_video_new - * - * @param morph Pointer to a VisMorph to which the VisVideo needs to be set. - * @param video Pointer to a VisVideo which contains information about the target display and the pointer - * to it's screenbuffer. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_MORPH_NULL or -VISUAL_ERROR_VIDEO_NULL on failure. - */ -int visual_morph_set_video (VisMorph *morph, VisVideo *video) -{ - visual_log_return_val_if_fail (morph != NULL, -VISUAL_ERROR_MORPH_NULL); - visual_log_return_val_if_fail (video != NULL, -VISUAL_ERROR_VIDEO_NULL); - - morph->dest = video; - - return VISUAL_OK; -} - -/** - * Set the time when the morph should be finished morphing. - * The VisMorph keeps a local copy of the given time. - * - * @param morph Pointer to the VisMorph to which finish time is set. - * @param time Pointer to the VisTime that contains the finish time. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_MORPH_NULL, -VISUAL_ERROR_TIME_NULL or error values returned by - * visual_time_copy () on failure. - */ -int visual_morph_set_time (VisMorph *morph, VisTime *time) -{ - visual_log_return_val_if_fail (morph != NULL, -VISUAL_ERROR_MORPH_NULL); - visual_log_return_val_if_fail (time != NULL, -VISUAL_ERROR_TIME_NULL); - - return visual_time_copy (&morph->morphtime, time); -} - -/** - * Used to set the rate of the VisMmorph. The rate ranges from 0 to 1 - * and the content of the result depends on the morph plugin being used. - * - * @param morph Pointer to a VisMorph to which the rate needs to be set. - * @param rate Value that sets the rate of the current morph. The rate - * contains the amount that is currently being morphed and needs to be - * manually adjust. The morph system doesn't increase the rate itself. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_MORPH_NULL on failure. - */ -int visual_morph_set_rate (VisMorph *morph, float rate) -{ - visual_log_return_val_if_fail (morph != NULL, -VISUAL_ERROR_MORPH_NULL); - - morph->rate = rate; - - return VISUAL_OK; -} - -/** - * Used to set the number of steps that a morph will take to finish. - * - * @param morph Pointer to a VisMorph to which the number of morph steps is set. - * @param steps The number of steps that a morph should take. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_MORPH_NULL on failure. - */ -int visual_morph_set_steps (VisMorph *morph, int steps) -{ - visual_log_return_val_if_fail (morph != NULL, -VISUAL_ERROR_MORPH_NULL); - - morph->steps = steps; - - return VISUAL_OK; -} - -/** - * Used to set the method of morphing. - * - * @param morph Pointer to a VisMorph to which the method of morphing is set. - * @param mode Method of morphing that is of type VisMorphMode. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_MORPH_NULL on failure. - */ -int visual_morph_set_mode (VisMorph *morph, VisMorphMode mode) -{ - visual_log_return_val_if_fail (morph != NULL, -VISUAL_ERROR_MORPH_NULL); - - morph->mode = mode; - - return VISUAL_OK; -} - -/** - * Some morph plugins can give a custom palette while morphing two 8 bits plugins. - * - * @param morph Pointer to a VisMorph of which the palette needs to be retrieved. - * - * @return The pointer to the custom palette on succes or NULL on failure. - */ -VisPalette *visual_morph_get_palette (VisMorph *morph) -{ - visual_log_return_val_if_fail (morph != NULL, NULL); - - return &morph->morphpal; -} - -/** - * Function that helps to check if a morph is done with it's morphing. - * - * @param morph Pointer to a VisMorph of which we want to know if it's done yet. - * - * @return TRUE or FALSE, -VISUAL_ERROR_MORPH_NULL on failure. - */ -int visual_morph_is_done (VisMorph *morph) -{ - visual_log_return_val_if_fail (morph != NULL, -VISUAL_ERROR_MORPH_NULL); - - if (morph->mode == VISUAL_MORPH_MODE_SET) - return FALSE; - - if (morph->rate >= 1.0) { - if (morph->mode == VISUAL_MORPH_MODE_TIME) - visual_timer_stop (&morph->timer); - - if (morph->mode == VISUAL_MORPH_MODE_STEPS) - morph->stepsdone = 0; - - return TRUE; - } - - /* Always be sure ;) */ - if (morph->mode == VISUAL_MORPH_MODE_STEPS && morph->steps == morph->stepsdone) - return TRUE; - - return FALSE; -} - -/** - * Some morph plugins request an VisAudio context to draw properly. Using this function - * you can check if the VisMorphPlugin being used in the VisMorph requests this. - * - * @param morph Pointer to a VisMorph of which we want to know if it wants a VisAudio. - * - * @return TRUE or FALSE, -VISUAL_ERROR_MORPH_NULL or -VISUAL_ERROR_MORPH_PLUGIN_NULL on failure. - */ -int visual_morph_requests_audio (VisMorph *morph) -{ - VisMorphPlugin *morphplugin; - - visual_log_return_val_if_fail (morph != NULL, -VISUAL_ERROR_MORPH_NULL); - - morphplugin = get_morph_plugin (morph); - - if (morphplugin == NULL) { - visual_log (VISUAL_LOG_CRITICAL, - "The given morph does not reference any plugin"); - - return -VISUAL_ERROR_MORPH_PLUGIN_NULL; - } - - return morphplugin->requests_audio; -} - -/** - * This is called to run the VisMorph. It will put the result in the buffer that is previously - * set by visual_morph_set_video and also when the morph is being runned in 8 bits mode - * it will automaticly interpolate between the two palettes if the plugin doesn't have - * a method for adjusting the palette. - * - * Note that all the VisVideo structures being used need to be clones. - * - * @param morph Pointer to a VisMorph that needs to be runned. - * @param audio Pointer to a VisAudio which a morph could use for extra effects - * @param src1 Pointer to a VisVideo that acts as the first source for the morph. - * @param src2 Pointer to a VisVideo that acts as the second source for the morph. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_MORPH_NULL, -VISUAL_ERROR_AUDIO_NULL, - * -VISUAL_ERROR_VIDEO_NULL or -VISUAL_ERROR_VIDEO_NULL on failure. - */ -int visual_morph_run (VisMorph *morph, VisAudio *audio, VisVideo *src1, VisVideo *src2) -{ - VisMorphPlugin *morphplugin; - VisTime elapsed; - double usec_elapsed, usec_morph; - - visual_log_return_val_if_fail (morph != NULL, -VISUAL_ERROR_MORPH_NULL); - visual_log_return_val_if_fail (audio != NULL, -VISUAL_ERROR_AUDIO_NULL); - visual_log_return_val_if_fail (src1 != NULL, -VISUAL_ERROR_VIDEO_NULL); - visual_log_return_val_if_fail (src2 != NULL, -VISUAL_ERROR_VIDEO_NULL); - - morphplugin = get_morph_plugin (morph); - - if (morphplugin == NULL) { - visual_log (VISUAL_LOG_CRITICAL, - "The given morph does not reference any plugin"); - - return -VISUAL_ERROR_MORPH_PLUGIN_NULL; - } - - /* If we're morphing using the timer, start the timer. */ - if (visual_timer_is_active (&morph->timer) == FALSE) - visual_timer_start (&morph->timer); - - if (morphplugin->palette != NULL) - morphplugin->palette (morph->plugin, morph->rate, audio, &morph->morphpal, src1, src2); - else { - if (src1->pal != NULL && src2->pal != NULL) - visual_palette_blend (&morph->morphpal, src1->pal, src2->pal, morph->rate); - } - - morphplugin->apply (morph->plugin, morph->rate, audio, morph->dest, src1, src2); - - morph->dest->pal = visual_morph_get_palette (morph); - - /* On automatic morphing increase the rate. */ - if (morph->mode == VISUAL_MORPH_MODE_STEPS) { - morph->rate += (1.000 / morph->steps); - morph->stepsdone++; - - if (morph->rate > 1.0) - morph->rate = 1; - - } else if (morph->mode == VISUAL_MORPH_MODE_TIME) { - visual_timer_elapsed (&morph->timer, &elapsed); - - /** - * @todo: We might want to have a bigger type here, but long longs aren't atomic - * on most architectures, so that won't do for now, maybe when we can lock (for threading) - * we can look into that - */ - usec_elapsed = ((double) elapsed.tv_sec) * VISUAL_USEC_PER_SEC + elapsed.tv_usec; - usec_morph = ((double) morph->morphtime.tv_sec) * VISUAL_USEC_PER_SEC + morph->morphtime.tv_usec; - - morph->rate = usec_elapsed / usec_morph; - - if (morph->rate > 1.0) - morph->rate = 1; - } - - - return VISUAL_OK; -} - -/** - * @} - */ -
--- a/libvisual/lv_morph.h Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,114 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _LV_MORPH_H -#define _LV_MORPH_H - -#include <libvisual/lv_palette.h> -#include <libvisual/lv_plugin.h> -#include <libvisual/lv_list.h> -#include <libvisual/lv_video.h> -#include <libvisual/lv_time.h> - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#define VISUAL_MORPH(obj) (VISUAL_CHECK_CAST ((obj), 0, VisMorph)) - -/** - * Morph morphing methods. - */ -typedef enum { - VISUAL_MORPH_MODE_SET, /**< Morphing is done by a rate set, - * nothing is automated here. */ - VISUAL_MORPH_MODE_STEPS, /**< Morphing is done by setting a number of steps, - * the morph will be automated. */ - VISUAL_MORPH_MODE_TIME /**< Morphing is done by setting a target time when the morph should be done, - * This is as well automated. */ -} VisMorphMode; - -typedef struct _VisMorph VisMorph; - -/** - * The VisMorph structure encapsulates the morph plugin and provides - * abstract interfaces for morphing between actors, or rather between - * two video sources. - * - * Members in the structure shouldn't be accessed directly but instead - * it's adviced to use the methods provided. - * - * @see visual_morph_new - */ -struct _VisMorph { - VisObject object; /**< The VisObject data. */ - VisPluginData *plugin; /**< Pointer to the plugin itself. */ - VisVideo *dest; /**< Destination video, this is where - * the result of the morph gets drawn. */ - float rate; /**< The rate of morph, 0 draws the first video source - * 1 the second video source, 0.5 is a 50/50, final - * content depends on the plugin being used. */ - VisPalette morphpal; /**< Morph plugins can also set a palette for indexed - * color depths. */ - VisTime morphtime; /**< Amount of time which the morphing should take. */ - VisTimer timer; /**< Private entry that holds the time elapsed from - * the beginning of the switch. */ - int steps; /**< Private entry that contains the number of steps - * a morph suppose to take. */ - int stepsdone; /**< Private entry that contains the number of steps done. */ - - VisMorphMode mode; /**< Private entry that holds the mode of morphing. */ -}; - -VisPluginData *visual_morph_get_plugin (VisMorph *morph); - -VisList *visual_morph_get_list (void); -const char *visual_morph_get_next_by_name (const char *name); -const char *visual_morph_get_prev_by_name (const char *name); -int visual_morph_valid_by_name (const char *name); - -VisMorph *visual_morph_new (const char *morphname); - -int visual_morph_realize (VisMorph *morph); - -int visual_morph_get_supported_depth (VisMorph *morph); - -int visual_morph_set_video (VisMorph *morph, VisVideo *video); -int visual_morph_set_time (VisMorph *morph, VisTime *time); -int visual_morph_set_rate (VisMorph *morph, float rate); -int visual_morph_set_steps (VisMorph *morph, int steps); -int visual_morph_set_mode (VisMorph *morph, VisMorphMode mode); - -VisPalette *visual_morph_get_palette (VisMorph *morph); - -int visual_morph_is_done (VisMorph *morph); - -int visual_morph_requests_audio (VisMorph *morph); - -int visual_morph_run (VisMorph *morph, VisAudio *audio, VisVideo *src1, VisVideo *src2); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _LV_MORPH_H */
--- a/libvisual/lv_object.c Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,207 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> - -#include "lv_log.h" -#include "lv_object.h" - - -/** - * @defgroup VisObject VisObject - * @{ - */ - -/** - * This function is a global VisListDestroyerFunc handler that unrefs VisObjects. - * - * @param data Pointer to the VisObject that needs to be unrefed - */ -void visual_object_list_destroyer (void *data) -{ - if (data == NULL) - return; - - visual_object_unref (VISUAL_OBJECT (data)); -} - -/** - * Creates a new VisObject structure. - * - * @return A newly allocated VisObject, or NULL on failure. - */ -VisObject *visual_object_new () -{ - VisObject *object; - - object = visual_mem_new0 (VisObject, 1); - - object->allocated = TRUE; - - visual_object_ref (object); - - return object; -} - -/** - * Frees the VisObject. This does not destroy the object itself but only releases the memory it's using. - * - * @param object Pointer to a VisObject that needs to be freed. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_OBJECT_NULL, -VISUAL_ERROR_OBJECT_NOT_ALLOCATED or error values - * returned by visual_mem_free on failure. - */ -int visual_object_free (VisObject *object) -{ - visual_log_return_val_if_fail (object != NULL, -VISUAL_ERROR_OBJECT_NULL); - visual_log_return_val_if_fail (object->allocated == TRUE, -VISUAL_ERROR_OBJECT_NOT_ALLOCATED); - - return visual_mem_free (object); -} - -/** - * Destroys the VisObject. This does destruct the VisObject - * by using the dtor function if it's set and also frees the memory - * it's using. It's valid to pass non allocated VisObjects, - * the function will recognize this by a flag that is set in the VisObject. - * - * @param object Pointer to a VisObject that needs to be destroyed. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_OBJECT_NULL or error values returned byvisual_object_free on failure. - */ -int visual_object_destroy (VisObject *object) -{ - visual_log_return_val_if_fail (object != NULL, -VISUAL_ERROR_OBJECT_NULL); - - if (object->dtor != NULL) - object->dtor (object); - - if (object->allocated == TRUE) - return visual_object_free (object); - - return VISUAL_OK; -} - -/** - * Initializes a VisObject for usage. This also ups the refcount by one, so this function really is for initial object - * creation. - * - * @param object Pointer to a VisObject that is initialized. - * @param allocated Flag to indicate if the VisObject itself is an allocated piece of memory. - * @param dtor The destructor function, that is used to destroy the VisObject when it loses all references or when it's - * being destroyed. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_OBJECT_NULL on failure. - */ -int visual_object_initialize (VisObject *object, int allocated, VisObjectDtorFunc dtor) -{ - visual_log_return_val_if_fail (object != NULL, -VISUAL_ERROR_OBJECT_NULL); - - object->allocated = allocated; - object->dtor = dtor; - - visual_object_ref (object); - - return VISUAL_OK; -} - -/** - * Increases the reference counter for a VisObject. - * - * @param object Pointer to a VisObject in which the reference count is increased. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_OBJECT_NULL on failure. - */ -int visual_object_ref (VisObject *object) -{ - visual_log_return_val_if_fail (object != NULL, -VISUAL_ERROR_OBJECT_NULL); - - object->refcount++; - - return VISUAL_OK; -} - -/** - * Decreases the reference counter for a VisObject. If the reference counter hits zero it will - * destruct the object using visual_object_destroy. - * - * @see visual_object_destroy - * - * @param object Pointer to a VisObject in which the reference count is decreased. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_OBJECT_NULL or error values returned by - * visual_object_destroy on failure. - */ -int visual_object_unref (VisObject *object) -{ - visual_log_return_val_if_fail (object != NULL, -VISUAL_ERROR_OBJECT_NULL); - - object->refcount--; - - /* No reference left, start dtoring of this VisObject */ - if (object->refcount <= 0) { - object->refcount = 0; - - return visual_object_destroy (object); - } - return VISUAL_OK; -} - -/** - * Sets the private data pointer to a VisObject. - * - * @param object Pointer to a VisObject to which the private data is set. - * @param priv Pointer to the private data that is set to the VisObject. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_OBJECT_NULL on failure. - */ -int visual_object_set_private (VisObject *object, void *priv) -{ - visual_log_return_val_if_fail (object != NULL, -VISUAL_ERROR_OBJECT_NULL); - - object->priv = priv; - - return VISUAL_OK; -} - -/** - * Retrieves the private data from a VisObject. - * - * @param object Pointer to a VisObject from which the private data is requested. - * - * @return Pointer to the private data or NULL. - */ -void *visual_object_get_private (VisObject *object) -{ - visual_log_return_val_if_fail (object != NULL, NULL); - - return object->priv; -} - -/** - * @} - */ -
--- a/libvisual/lv_object.h Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,86 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _LV_OBJECT_H -#define _LV_OBJECT_H - -#include <libvisual/lv_common.h> - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#define VISUAL_OBJECT(obj) (VISUAL_CHECK_CAST ((obj), 0, VisObject)) - -typedef struct _VisObject VisObject; - -/** - * The function defination for an object destructor. This can be assigned to any VisObject - * and is mostly used for internal usage or by support libraries. Keep in mind that this should not free - * the VisObject itself. This is done in the visual_object_destroy function itself. - * - * The destructor function should be safe to enter more than once, the object always contains the object - * however make sure that freed members are set to NULL and that it's checked. - * - * @arg object The VisObject that is passed to the destructor. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_OBJECT_DTOR_FAILED on failure. - */ -typedef int (*VisObjectDtorFunc)(VisObject *object); - -/** - * The VisObject structure contains all the VisObject housekeeping data like refcounting and a pointer - * to the VisObjectDtorFunc. Also it's possible to set private data on a VisObject. - * - * Nearly all libvisual structures inherent from a VisObject. - */ -struct _VisObject { - int allocated; /**< Set to TRUE if this object is allocated and should be freed completely. - * if set to FALSE, it will run the VisObjectDtorFunc but won't free the VisObject - * itself when refcount reaches 0. */ - int refcount; /**< Contains the number of references to this object. */ - VisObjectDtorFunc dtor; /**< Pointer to the object destruction function. */ - - void *priv; /**< Private which can be used by application or plugin developers - * depending on the sub class object. */ -}; - -void visual_object_list_destroyer (void *data); - -VisObject *visual_object_new (void); -int visual_object_free (VisObject *object); -int visual_object_destroy (VisObject *object); - -int visual_object_initialize (VisObject *object, int allocated, VisObjectDtorFunc dtor); - -int visual_object_ref (VisObject *object); -int visual_object_unref (VisObject *object); - -int visual_object_set_private (VisObject *object, void *priv); -void *visual_object_get_private (VisObject *object); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _LV_OBJECT_H */
--- a/libvisual/lv_palette.c Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,210 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> - -#include "lv_common.h" -#include "lv_palette.h" - -static int palette_dtor (VisObject *object); - -static int palette_dtor (VisObject *object) -{ - VisPalette *pal = VISUAL_PALETTE (object); - - if (pal->colors != NULL) - visual_palette_free_colors (pal); - - pal->colors = NULL; - - return VISUAL_OK; -} - -/** - * @defgroup VisPalette VisPalette - * @{ - */ - -/** - * Creates a new VisPalette. - * - * @return A newly allocated VisPalette. - */ -VisPalette *visual_palette_new (int ncolors) -{ - VisPalette *pal; - - pal = visual_mem_new0 (VisPalette, 1); - - /* Do the VisObject initialization */ - visual_object_initialize (VISUAL_OBJECT (pal), TRUE, palette_dtor); - - visual_palette_allocate_colors (pal, ncolors); - - return pal; -} - -/** - * Copies the colors from one VisPalette to another. - * - * @param dest Pointer to the destination VisPalette. - * @param src Pointer to the source VisPalette from which colors are copied into the destination VisPalette. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_PALETTE_NULL or -VISUAL_ERROR_PALETTE_SIZE on failure. - */ -int visual_palette_copy (VisPalette *dest, VisPalette *src) -{ - visual_log_return_val_if_fail (dest != NULL, -VISUAL_ERROR_PALETTE_NULL); - visual_log_return_val_if_fail (src != NULL, -VISUAL_ERROR_PALETTE_NULL); - visual_log_return_val_if_fail (dest->ncolors == src->ncolors, -VISUAL_ERROR_PALETTE_SIZE); - - visual_mem_copy (dest->colors, src->colors, sizeof (VisColor) * dest->ncolors); - - return VISUAL_OK; -} - -/** - * Allocate an amount of colors for a VisPalette. - * - * @param pal Pointer to the VisPalette for which colors are allocated. - * @param ncolors The number of colors allocated for the VisPalette. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_PALETTE_NULL on failure. - */ -int visual_palette_allocate_colors (VisPalette *pal, int ncolors) -{ - visual_log_return_val_if_fail (pal != NULL, -VISUAL_ERROR_PALETTE_NULL); - - pal->colors = visual_mem_new0 (VisColor, ncolors); - pal->ncolors = ncolors; - - return VISUAL_OK; -} - -/** - * Frees allocated colors from a VisPalette. - * - * @param pal Pointer to the VisPalette from which colors need to be freed. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_PALETTE_NULL on failure. - */ -int visual_palette_free_colors (VisPalette *pal) -{ - visual_log_return_val_if_fail (pal != NULL, -VISUAL_ERROR_PALETTE_NULL); - - if (pal->colors != NULL) - visual_mem_free (pal->colors); - - pal->colors = NULL; - pal->ncolors = 0; - - return VISUAL_OK; -} - -/** - * This function is capable of morphing from one palette to another. - * - * @param dest Pointer to the destination VisPalette, this is where the result of the morph - * is put. - * @param src1 Pointer to a VisPalette that acts as the first source for the morph. - * @param src2 Pointer to a VisPalette that acts as the second source for the morph. - * @param rate Value that sets the rate of the morph, which is valid between 0 and 1. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_PALETTE_NULL or -VISUAL_ERROR_PALETTE_SIZE on failure. - */ -int visual_palette_blend (VisPalette *dest, VisPalette *src1, VisPalette *src2, float rate) -{ - int i; - - visual_log_return_val_if_fail (dest != NULL, -VISUAL_ERROR_PALETTE_NULL); - visual_log_return_val_if_fail (src1 != NULL, -VISUAL_ERROR_PALETTE_NULL); - visual_log_return_val_if_fail (src2 != NULL, -VISUAL_ERROR_PALETTE_NULL); - - if (src1->ncolors != src2->ncolors) - return -VISUAL_ERROR_PALETTE_SIZE; - - if (dest->ncolors != src1->ncolors) - return -VISUAL_ERROR_PALETTE_SIZE; - - for (i = 0; i < dest->ncolors; i++) { - dest->colors[i].r = src1->colors[i].r + ((src2->colors[i].r - src1->colors[i].r) * rate); - dest->colors[i].g = src1->colors[i].g + ((src2->colors[i].g - src1->colors[i].g) * rate); - dest->colors[i].b = src1->colors[i].b + ((src2->colors[i].b - src1->colors[i].b) * rate); - } - - return VISUAL_OK; -} - -/** - * Can be used to cycle through the colors of a VisPalette and blend between elements. The rate is from 0.0 to number of - * VisColors in the VisPalette. The VisColor is newly allocated so you have to unref it. The last VisColor in the VisPalette is - * morphed with the first. - * - * @param pal Pointer to the VisPalette in which the VisColors are cycled. - * @param rate Selection of the VisColor from the VisPalette, goes from 0.0 to number of VisColors in the VisPalette - * and morphs between colors if needed. - * - * @return A new VisColor, possibly a morph between two VisColors, NULL on failure. - */ -VisColor *visual_palette_color_cycle (VisPalette *pal, float rate) -{ - VisColor *color, *tmp1, *tmp2; - int irate = (int) rate; - unsigned char alpha; - float rdiff = rate - irate; - - visual_log_return_val_if_fail (pal != NULL, NULL); - - irate = irate % pal->ncolors; - alpha = rdiff * 255; - - color = visual_color_new (); - - /* If rate is exactly an item, return that item */ - if (rdiff == 0) { - visual_color_copy (color, &pal->colors[irate]); - - return color; - } - - tmp1 = &pal->colors[irate]; - - if (irate == pal->ncolors - 1) - tmp2 = &pal->colors[0]; - else - tmp2 = &pal->colors[irate + 1]; - - color->r = ((alpha * (tmp1->r - tmp2->r) >> 8) + tmp2->r); - color->g = ((alpha * (tmp1->g - tmp2->g) >> 8) + tmp2->g); - color->b = ((alpha * (tmp1->b - tmp2->b) >> 8) + tmp2->b); - - return color; -} - -/** - * @} - */ -
--- a/libvisual/lv_palette.h Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,63 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _LV_PALETTE_H -#define _LV_PALETTE_H - -#include <libvisual/lv_common.h> -#include <libvisual/lv_color.h> - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#define VISUAL_PALETTE(obj) (VISUAL_CHECK_CAST ((obj), 0, VisPalette)) - -typedef struct _VisPalette VisPalette; - -/** - * Data type to describe the palette for an 8 bits screen depth. - * - * To access the RGB value of a certain indexed color simply do: - * pal->colors[index].(r,g,b) - * - * @see visual_palette_new - */ -struct _VisPalette { - VisObject object; /**< The VisObject data. */ - int ncolors; /**< Number of color entries in palette. */ - VisColor *colors; /**< Pointer to the colors. */ -}; - -VisPalette *visual_palette_new (int ncolors); -int visual_palette_copy (VisPalette *dest, VisPalette *src); -int visual_palette_allocate_colors (VisPalette *pal, int ncolors); -int visual_palette_free_colors (VisPalette *pal); -int visual_palette_blend (VisPalette *dest, VisPalette *src1, VisPalette *src2, float rate); -VisColor *visual_palette_color_cycle (VisPalette *pal, float rate); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _LV_PALETTE_H */
--- a/libvisual/lv_param.c Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1029 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> - -#include "lv_log.h" -#include "lv_param.h" - -static int paramcontainer_dtor (VisObject *object); -static int paramentry_dtor (VisObject *object); - -static int get_next_pcall_id (VisList *callbacks); - -static int paramcontainer_dtor (VisObject *object) -{ - VisParamContainer *paramcontainer = VISUAL_PARAMCONTAINER (object); - - visual_list_destroy_elements (¶mcontainer->entries); - - return VISUAL_OK; -} - -static int paramentry_dtor (VisObject *object) -{ - VisParamEntry *param = VISUAL_PARAMENTRY (object); - - if (param->string != NULL) - visual_mem_free (param->string); - - if (param->name != NULL) - visual_mem_free (param->name); - - if (param->objdata != NULL) - visual_object_unref (param->objdata); - - visual_palette_free_colors (¶m->pal); - - visual_list_destroy_elements (¶m->callbacks); - - param->string = NULL; - param->name = NULL; - param->objdata = NULL; - - return VISUAL_OK; -} - -static int get_next_pcall_id (VisList *callbacks) -{ - VisListEntry *le = NULL; - VisParamEntryCallback *pcall; - int found = FALSE; - int i; - - /* Walk through all possible ids */ - for (i = 0; i < VISUAL_PARAM_CALLBACK_ID_MAX; i++) { - - found = FALSE; - /* Check all the callbacks if the id is used */ - while ((pcall = visual_list_next (callbacks, &le)) != NULL) { - - /* Found the ID, break and get ready for the next iterate */ - if (pcall->id == i) { - found = TRUE; - - break; - } - } - - /* The id has NOT been found, thus is an original, and we return this as the next id */ - if (found == FALSE) - return i; - } - - /* This is virtually impossible, or something very wrong is going ok, but no id seems to be left */ - return -1; -} - - -/** - * @defgroup VisParam VisParam - * @{ - */ - -/** - * Creates a new VisParamContainer structure. - * - * @return A newly allocated VisParamContainer structure. - */ -VisParamContainer *visual_param_container_new () -{ - VisParamContainer *paramcontainer; - - paramcontainer = visual_mem_new0 (VisParamContainer, 1); - - /* Do the VisObject initialization */ - visual_object_initialize (VISUAL_OBJECT (paramcontainer), TRUE, paramcontainer_dtor); - - visual_list_set_destroyer (¶mcontainer->entries, visual_object_list_destroyer); - - return paramcontainer; -} - -/** - * Sets the eventqueue in the VisParamContainer, so events can be emitted on param changes. - * - * @param paramcontainer A pointer to the VisParamContainer to which the VisEventQueue needs to be set. - * @param eventqueue A Pointer to the VisEventQueue that is used for the events the VisParamContainer can emit. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_PARAM_CONTAINER_NULL on failure. - */ -int visual_param_container_set_eventqueue (VisParamContainer *paramcontainer, VisEventQueue *eventqueue) -{ - visual_log_return_val_if_fail (paramcontainer != NULL, -VISUAL_ERROR_PARAM_CONTAINER_NULL); - - paramcontainer->eventqueue = eventqueue; - - return VISUAL_OK; -} - -/** - * Get the pointer to the VisEventQueue the VisParamContainer is emitting events to. - * - * @param paramcontainer A pointer to the VisParamContainer from which the VisEventQueue is requested. - * - * @return Pointer to the VisEventQueue possibly NULL, NULL on failure. - */ -VisEventQueue *visual_param_container_get_eventqueue (VisParamContainer *paramcontainer) -{ - visual_log_return_val_if_fail (paramcontainer != NULL, NULL); - - return paramcontainer->eventqueue; -} - -/** - * Adds a VisParamEntry to a VisParamContainer. - * - * @param paramcontainer A pointer to the VisParamContainer in which the VisParamEntry is added. - * @param param A pointer to the VisParamEntry that is added to the VisParamContainer. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_PARAM_CONTAINER_NULL, -VISUAL_ERROR_PARAM_NULL or - * error values returned by visual_list_add () on failure. - */ -int visual_param_container_add (VisParamContainer *paramcontainer, VisParamEntry *param) -{ - visual_log_return_val_if_fail (paramcontainer != NULL, -VISUAL_ERROR_PARAM_CONTAINER_NULL); - visual_log_return_val_if_fail (param != NULL, -VISUAL_ERROR_PARAM_NULL); - - param->parent = paramcontainer; - - /* On container add, we always set changed once, so vars can be synchronised in the plugin - * it's event loop */ - visual_param_entry_changed (param); - - return visual_list_add (¶mcontainer->entries, param); -} - -/** - * Adds a list of VisParamEntry elements, the list is terminated by an entry of type VISUAL_PARAM_ENTRY_TYPE_END. - * All the elements are reallocated, so this function can be used for static param lists. - * - * @param paramcontainer A pointer to the VisParamContainer in which the VisParamEntry elements are added. - * @param params A pointer to the VisParamEntry elements that are added to the VisParamContainer. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_PARAM_CONTAINER_NULL or -VISUAL_ERROR_PARAM_NULL on failure. - */ -int visual_param_container_add_many (VisParamContainer *paramcontainer, VisParamEntry *params) -{ - VisParamEntry *pnew; - int i = 0; - - visual_log_return_val_if_fail (paramcontainer != NULL, -VISUAL_ERROR_PARAM_CONTAINER_NULL); - visual_log_return_val_if_fail (params != NULL, -VISUAL_ERROR_PARAM_NULL); - - while (params[i].type != VISUAL_PARAM_ENTRY_TYPE_END) { - pnew = visual_param_entry_new (visual_param_entry_get_name (¶ms[i])); - visual_param_entry_set_from_param (pnew, ¶ms[i]); - - visual_param_container_add (paramcontainer, pnew); - - i++; - } - - return VISUAL_OK; -} - -/** - * Removes a VisParamEntry from the VisParamContainer by giving the name of the VisParamEntry that needs - * to be removed. - * - * @param paramcontainer A pointer to the VisParamContainer from which a VisParamEntry needs to be removed. - * @param name The name of the VisParamEntry that needs to be removed from the VisParamContainer. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_PARAM_CONTAINER_NULL, -VISUAL_ERROR_NULL - * or -VISUAL_ERROR_PARAM_NOT_FOUND on failure. - */ -int visual_param_container_remove (VisParamContainer *paramcontainer, const char *name) -{ - VisListEntry *le = NULL; - VisParamEntry *param; - - visual_log_return_val_if_fail (paramcontainer != NULL, -VISUAL_ERROR_PARAM_CONTAINER_NULL); - visual_log_return_val_if_fail (name != NULL, -VISUAL_ERROR_NULL); - - while ((param = visual_list_next (¶mcontainer->entries, &le)) != NULL) { - - if (strcmp (param->name, name) == 0) { - visual_list_delete (¶mcontainer->entries, &le); - - return VISUAL_OK; - } - } - - return -VISUAL_ERROR_PARAM_NOT_FOUND; -} - -/** - * Clones the source VisParamContainer into the destination VisParamContainer. When an entry with a certain name - * already exists in the destination container, it will be overwritten with a new value. - * - * @param destcont A pointer to the VisParamContainer in which the VisParamEntry values are copied. - * @param srccont A pointer to the VisParamContainer from which the VisParamEntry values are copied. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_PARAM_CONTAINER_NULL, on failure. - */ -int visual_param_container_copy (VisParamContainer *destcont, VisParamContainer *srccont) -{ - VisListEntry *le = NULL; - VisParamEntry *destparam; - VisParamEntry *srcparam; - VisParamEntry *tempparam; - - visual_log_return_val_if_fail (destcont != NULL, -VISUAL_ERROR_PARAM_CONTAINER_NULL); - visual_log_return_val_if_fail (srccont != NULL, -VISUAL_ERROR_PARAM_CONTAINER_NULL); - - while ((srcparam = visual_list_next (&srccont->entries, &le)) != NULL) { - tempparam = visual_param_container_get (destcont, visual_param_entry_get_name (srcparam)); - - /* Already exists, overwrite */ - if (tempparam != NULL) { - visual_param_entry_set_from_param (tempparam, srcparam); - - continue; - } - - /* Does not yet exist, create a new entry */ - destparam = visual_param_entry_new (visual_param_entry_get_name (srcparam)); - visual_param_entry_set_from_param (destparam, srcparam); - - visual_param_container_add (destcont, destparam); - } - - return VISUAL_OK; -} - -/** - * Copies matching VisParamEntry elements from srccont into destcont, matching on the name. - * - * @param destcont A pointer to the VisParamContainer in which the VisParamEntry values are copied. - * @param srccont A pointer to the VisParamContainer from which the VisParamEntry values are copied. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_PARAM_CONTAINER_NULL, on failure. - */ -int visual_param_container_copy_match (VisParamContainer *destcont, VisParamContainer *srccont) -{ - VisListEntry *le = NULL; - VisParamEntry *destparam; - VisParamEntry *srcparam; - - visual_log_return_val_if_fail (destcont != NULL, -VISUAL_ERROR_PARAM_CONTAINER_NULL); - visual_log_return_val_if_fail (srccont != NULL, -VISUAL_ERROR_PARAM_CONTAINER_NULL); - - while ((destparam = visual_list_next (&destcont->entries, &le)) != NULL) { - srcparam = visual_param_container_get (srccont, visual_param_entry_get_name (destparam)); - - if (srcparam != NULL) - visual_param_entry_set_from_param (destparam, srcparam); - } - - return VISUAL_OK; -} - -/** - * Retrieve a VisParamEntry from a VisParamContainer by giving the name of the VisParamEntry that is requested. - * - * @param paramcontainer A pointer to the VisParamContainer from which a VisParamEntry is requested. - * @param name The name of the VisParamEntry that is requested from the VisParamContainer. - * - * @return Pointer to the VisParamEntry, or NULL. - */ -VisParamEntry *visual_param_container_get (VisParamContainer *paramcontainer, const char *name) -{ - VisListEntry *le = NULL; - VisParamEntry *param; - - visual_log_return_val_if_fail (paramcontainer != NULL, NULL); - visual_log_return_val_if_fail (name != NULL, NULL); - - while ((param = visual_list_next (¶mcontainer->entries, &le)) != NULL) { - param = le->data; - - if (strcmp (param->name, name) == 0) - return param; - } - - return NULL; -} - -/** - * Creates a new VisParamEntry structure. - * - * @param name The name that is assigned to the VisParamEntry. - * - * @return A newly allocated VisParamEntry structure. - */ -VisParamEntry *visual_param_entry_new (char *name) -{ - VisParamEntry *param; - - param = visual_mem_new0 (VisParamEntry, 1); - - /* Do the VisObject initialization */ - visual_object_initialize (VISUAL_OBJECT (param), TRUE, paramentry_dtor); - - visual_param_entry_set_name (param, name); - - visual_list_set_destroyer (¶m->callbacks, visual_object_list_destroyer); - - return param; -} - -/** - * Adds a change notification callback, this shouldn't be used to get notificated within a plugin, but is for - * things like VisUI. - * - * @param param Pointer to the VisParamEntry to which a change notification callback is added. - * @param callback The notification callback, which is called on changes in the VisParamEntry. - * @param priv A private that can be used in the callback function. - * - * return callback id in the form of a positive value on succes, - * -VISUAL_ERROR_PARAM_NULL, -VISUAL_ERROR_PARAM_CALLBACK_NULL or - * -VISUAL_ERROR_PARAM_CALLBACK_TOO_MANY on failure. - */ -int visual_param_entry_add_callback (VisParamEntry *param, VisParamChangedCallbackFunc callback, void *priv) -{ - VisParamEntryCallback *pcall; - int id; - - visual_log_return_val_if_fail (param != NULL, -VISUAL_ERROR_PARAM_NULL); - visual_log_return_val_if_fail (callback != NULL, -VISUAL_ERROR_PARAM_CALLBACK_NULL); - - id = get_next_pcall_id (¶m->callbacks); - - visual_log_return_val_if_fail (id >= 0, -VISUAL_ERROR_PARAM_CALLBACK_TOO_MANY); - - pcall = visual_mem_new0 (VisParamEntryCallback, 1); - - /* Do the VisObject initialization for the VisParamEntryCallback */ - visual_object_initialize (VISUAL_OBJECT (pcall), TRUE, NULL); - - pcall->id = id; - pcall->callback = callback; - visual_object_set_private (VISUAL_OBJECT (pcall), priv); - - visual_list_add (¶m->callbacks, pcall); - - return id; -} - -/** - * Removes a change notification callback from the list of callbacks. - * - * @param param Pointer to the VisParamEntry from which a change notification callback is removed. - * @param id The callback ID that was given by the visual_param_entry_add_callback method. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_PARAM_NULL on failure. - */ -int visual_param_entry_remove_callback (VisParamEntry *param, int id) -{ - VisListEntry *le = NULL; - VisParamEntryCallback *pcall; - - visual_log_return_val_if_fail (param != NULL, -VISUAL_ERROR_PARAM_NULL); - - while ((pcall = visual_list_next (¶m->callbacks, &le)) != NULL) { - - if (id == pcall->id) { - visual_list_delete (¶m->callbacks, &le); - - visual_object_unref (VISUAL_OBJECT (pcall)); - - return VISUAL_OK; - } - } - - return VISUAL_OK; -} - -/** - * Notifies all the callbacks for the given VisParamEntry parameter. - * - * @param param Pointer to the VisParamEntry of which all the change notification - * callbacks need to be called. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_PARAM_NULL on failure. - */ -int visual_param_entry_notify_callbacks (VisParamEntry *param) -{ - VisListEntry *le = NULL; - VisParamEntryCallback *pcall; - - visual_log_return_val_if_fail (param != NULL, -VISUAL_ERROR_PARAM_NULL); - - while ((pcall = visual_list_next (¶m->callbacks, &le)) != NULL) - pcall->callback (param, visual_object_get_private (VISUAL_OBJECT (pcall))); - - return VISUAL_OK; -} - -/** - * Checks if the VisParamEntry it's name is the given name. - * - * @param param Pointer to the VisParamEntry of which we want to check the name. - * @param name The name we want to check against. - * - * @return TRUE if the VisParamEntry is the one we requested, or FALSE if not. - */ -int visual_param_entry_is (VisParamEntry *param, const char *name) -{ - visual_log_return_val_if_fail (param != NULL, -VISUAL_ERROR_PARAM_NULL); - - if (strcmp (param->name, name) == 0) - return TRUE; - - return FALSE; -} - -/** - * When called, emits an event in the VisParamContainer it's VisEventQueue when the VisEventQueue - * is set. - * - * @param param Pointer to the VisParamEntry that is changed. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_PARAM_NULL on failure. - */ -int visual_param_entry_changed (VisParamEntry *param) -{ - VisEventQueue *eventqueue; - - visual_log_return_val_if_fail (param != NULL, -VISUAL_ERROR_PARAM_NULL); - - if (param->parent == NULL) - return VISUAL_OK; - - eventqueue = param->parent->eventqueue; - - if (eventqueue != NULL) - visual_event_queue_add_param (eventqueue, param); - - visual_param_entry_notify_callbacks (param); - - return VISUAL_OK; -} - -/** - * Retrieves the VisParamEntryType from a VisParamEntry. - * - * @param param Pointer to the VisParamEntry from which the VisParamEntryType is requested. - * - * @return The VisParamEntryType on succes, -VISUAL_ERROR_PARAM_NULL on failure. - */ -VisParamEntryType visual_param_entry_get_type (VisParamEntry *param) -{ - visual_log_return_val_if_fail (param != NULL, -VISUAL_ERROR_PARAM_NULL); - - return param->type; -} - -/** - * Compares two parameters with each other, When they are the same, TRUE is returned, if not FALSE. - * Keep in mind that FALSE is always returned for VISUAL_PARAM_ENTRY_TYPE_PALETTE and VISUAL_PARAM_ENTRY_TYPE_OBJECT. - * - * @param src1 Pointer to the first VisParamEntry for comparison. - * @param src2 Pointer to the second VisParamEntry for comparison. - * - * @return TRUE if the same, FALSE if not the same, - * -VISUAL_ERROR_PARAM_NULL, -VISUAL_ERROR_PARAM_INVALID_TYPE or -VISUAL_ERROR_IMPOSSIBLE on failure. - */ -int visual_param_entry_compare (VisParamEntry *src1, VisParamEntry *src2) -{ - visual_log_return_val_if_fail (src1 != NULL, -VISUAL_ERROR_PARAM_NULL); - visual_log_return_val_if_fail (src2 != NULL, -VISUAL_ERROR_PARAM_NULL); - - if (src1->type != src2->type) - return FALSE; - - switch (src1->type) { - case VISUAL_PARAM_ENTRY_TYPE_NULL: - return TRUE; - - break; - - case VISUAL_PARAM_ENTRY_TYPE_STRING: - if (!strcmp (src1->string, src2->string)) - return TRUE; - - break; - - case VISUAL_PARAM_ENTRY_TYPE_INTEGER: - if (src1->numeric.integer == src2->numeric.integer) - return TRUE; - - break; - - case VISUAL_PARAM_ENTRY_TYPE_FLOAT: - if (src1->numeric.floating == src2->numeric.floating) - return TRUE; - - break; - - case VISUAL_PARAM_ENTRY_TYPE_DOUBLE: - if (src1->numeric.doubleflt == src2->numeric.doubleflt) - return TRUE; - - break; - - case VISUAL_PARAM_ENTRY_TYPE_COLOR: - return visual_color_compare (&src1->color, &src2->color); - - break; - - case VISUAL_PARAM_ENTRY_TYPE_PALETTE: - return FALSE; - - break; - - case VISUAL_PARAM_ENTRY_TYPE_OBJECT: - return FALSE; - - break; - - default: - visual_log (VISUAL_LOG_CRITICAL, "param type is not valid"); - - return -VISUAL_ERROR_PARAM_INVALID_TYPE; - - break; - } - - return -VISUAL_ERROR_IMPOSSIBLE; -} - -/** - * Copies the value of the src param into the param. Also sets the param to the type of which the - * source param is. - * - * @param param Pointer to the VisParamEntry to which a parameter is set. - * @param src Pointer to the VisParamEntry from which the value is retrieved. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_PARAM_NULL, -VISUAL_ERROR_PARAM_INVALID_TYPE on failure. - */ -int visual_param_entry_set_from_param (VisParamEntry *param, VisParamEntry *src) -{ - visual_log_return_val_if_fail (param != NULL, -VISUAL_ERROR_PARAM_NULL); - visual_log_return_val_if_fail (src != NULL, -VISUAL_ERROR_PARAM_NULL); - - switch (src->type) { - case VISUAL_PARAM_ENTRY_TYPE_NULL: - - break; - - case VISUAL_PARAM_ENTRY_TYPE_STRING: - visual_param_entry_set_string (param, visual_param_entry_get_string (src)); - break; - - case VISUAL_PARAM_ENTRY_TYPE_INTEGER: - visual_param_entry_set_integer (param, visual_param_entry_get_integer (src)); - - break; - - case VISUAL_PARAM_ENTRY_TYPE_FLOAT: - visual_param_entry_set_float (param, visual_param_entry_get_float (src)); - - break; - - case VISUAL_PARAM_ENTRY_TYPE_DOUBLE: - visual_param_entry_set_double (param, visual_param_entry_get_double (src)); - - break; - - case VISUAL_PARAM_ENTRY_TYPE_COLOR: - visual_param_entry_set_color_by_color (param, visual_param_entry_get_color (src)); - - break; - - case VISUAL_PARAM_ENTRY_TYPE_PALETTE: - visual_param_entry_set_palette (param, visual_param_entry_get_palette (src)); - - break; - - case VISUAL_PARAM_ENTRY_TYPE_OBJECT: - visual_param_entry_set_object (param, visual_param_entry_get_object (src)); - - break; - - default: - visual_log (VISUAL_LOG_CRITICAL, "param type is not valid"); - - return -VISUAL_ERROR_PARAM_INVALID_TYPE; - - break; - } - - return VISUAL_OK; -} - -/** - * Set the name for a VisParamEntry. - * - * @param param Pointer to the VisParamEntry to which the name is set. - * @param name The name that is set to the VisParamEntry. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_PARAM_NULL on failure. - */ -int visual_param_entry_set_name (VisParamEntry *param, char *name) -{ - visual_log_return_val_if_fail (param != NULL, -VISUAL_ERROR_PARAM_NULL); - - if (param->name != NULL) - visual_mem_free (param->name); - - param->name = NULL; - - if (name != NULL) - param->name = strdup (name); - - return VISUAL_OK; -} - -/** - * Sets the VisParamEntry to VISUAL_PARAM_ENTRY_TYPE_STRING and assigns the string given as argument to it. - * - * @param param Pointer to the VisParamEntry to which a parameter is set. - * @param string The string for this parameter. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_PARAM_NULL on failure. - */ -int visual_param_entry_set_string (VisParamEntry *param, char *string) -{ - visual_log_return_val_if_fail (param != NULL, -VISUAL_ERROR_PARAM_NULL); - - param->type = VISUAL_PARAM_ENTRY_TYPE_STRING; - - if (string == NULL && param->string == NULL) - return VISUAL_OK; - - if (string == NULL && param->string != NULL) { - visual_mem_free (param->string); - param->string = NULL; - - visual_param_entry_changed (param); - - } else if (param->string == NULL && string != NULL) { - param->string = strdup (string); - - visual_param_entry_changed (param); - - } else if (strcmp (string, param->string) != 0) { - visual_mem_free (param->string); - - param->string = strdup (string); - - visual_param_entry_changed (param); - } - - return VISUAL_OK; -} - -/** - * Sets the VisParamEntry to VISUAL_PARAM_ENTRY_TYPE_INTEGER and assigns the integer given as argument to it. - * - * @param param Pointer to the VisParamEntry to which a parameter is set. - * @param integer The integer value for this parameter. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_PARAM_NULL on failure. - */ -int visual_param_entry_set_integer (VisParamEntry *param, int integer) -{ - visual_log_return_val_if_fail (param != NULL, -VISUAL_ERROR_PARAM_NULL); - - param->type = VISUAL_PARAM_ENTRY_TYPE_INTEGER; - - if (param->numeric.integer != integer) { - param->numeric.integer = integer; - - visual_param_entry_changed (param); - } - - return VISUAL_OK; -} - -/** - * Sets the VisParamEntry to VISUAL_PARAM_ENTRY_TYPE_FLOAT and assigns the float given as argument to it. - * - * @param param Pointer to the VisParamEntry to which a parameter is set. - * @param floating The float value for this parameter. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_PARAM_NULL on failure. - */ -int visual_param_entry_set_float (VisParamEntry *param, float floating) -{ - visual_log_return_val_if_fail (param != NULL, -VISUAL_ERROR_PARAM_NULL); - - param->type = VISUAL_PARAM_ENTRY_TYPE_FLOAT; - - if (param->numeric.floating != floating) { - param->numeric.floating = floating; - - visual_param_entry_changed (param); - } - - return VISUAL_OK; -} - -/** - * Sets the VisParamEntry to VISUAL_PARAM_ENTRY_TYPE_DOUBLE and assigns the double given as argument to it. - * - * @param param Pointer to the VisParamEntry to which a parameter is set. - * @param doubleflt The double value for this parameter. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_PARAM_NULL on failure. - */ -int visual_param_entry_set_double (VisParamEntry *param, double doubleflt) -{ - visual_log_return_val_if_fail (param != NULL, -VISUAL_ERROR_PARAM_NULL); - - param->type = VISUAL_PARAM_ENTRY_TYPE_DOUBLE; - - if (param->numeric.doubleflt != doubleflt) { - param->numeric.doubleflt = doubleflt; - - visual_param_entry_changed (param); - } - - return VISUAL_OK; -} - -/** - * Sets the VisParamEntry to VISUAL_PARAM_ENTRY_TYPE_COLOR and assigns the rgb values given as arguments to it. - * - * @param param Pointer to the VisParamEntry to which a parameter is set. - * @param r The red value for this color parameter. - * @param g The green value for this color parameter. - * @param b The blue value for this color parameter. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_PARAM_NULL on failure. - */ -int visual_param_entry_set_color (VisParamEntry *param, uint8_t r, uint8_t g, uint8_t b) -{ - visual_log_return_val_if_fail (param != NULL, -VISUAL_ERROR_PARAM_NULL); - - param->type = VISUAL_PARAM_ENTRY_TYPE_COLOR; - - if (param->color.r != r || param->color.g != g || param->color.b != b) { - param->color.r = r; - param->color.g = g; - param->color.b = b; - - visual_param_entry_changed (param); - } - - return VISUAL_OK; -} - -/** - * Sets the VisParamEntry to VISUAL_PARAM_ENTRY_TYPE_COLOR and assigns the rgb values from the given VisColor as argument to it. - * - * @param param Pointer to the VisParamEntry to which a parameter is set. - * @param color Pointer to the VisColor from which the rgb values are copied into the parameter. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_PARAM_NULL on failure. - */ -int visual_param_entry_set_color_by_color (VisParamEntry *param, VisColor *color) -{ - visual_log_return_val_if_fail (param != NULL, -VISUAL_ERROR_PARAM_NULL); - - param->type = VISUAL_PARAM_ENTRY_TYPE_COLOR; - - if (visual_color_compare (¶m->color, color) == FALSE) { - visual_color_copy (¶m->color, color); - - visual_param_entry_changed (param); - } - - return VISUAL_OK; -} - -/** - * Sets the VisParamEntry to VISUAL_PARAM_ENTRY_TYPE_PALETTE and assigns a VisPalette to the VisParamEntry. - * This function does not check if there is a difference between the prior set palette and the new one, and always - * emits the changed event. so watch out with usage. - * - * @param param Pointer to the VisParamEntry to which a parameter is set. - * @param pal Pointer to the VisPalette from which the palette data is retrieved for the VisParamEntry. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_PARAM_NULL on failure. - */ -int visual_param_entry_set_palette (VisParamEntry *param, VisPalette *pal) -{ - visual_log_return_val_if_fail (param != NULL, -VISUAL_ERROR_PARAM_NULL); - - param->type = VISUAL_PARAM_ENTRY_TYPE_PALETTE; - - visual_palette_free_colors (¶m->pal); - - if (pal != NULL) { - visual_palette_allocate_colors (¶m->pal, pal->ncolors); - - visual_palette_copy (¶m->pal, pal); - } - - visual_param_entry_changed (param); - - return VISUAL_OK; -} - -/** - * Sets the VisParamEntry to VISUAL_PARAM_ENTRY_TYPE_OBJECT and assigns a VisObject to the VisParamEntry. - * With a VisObject VisParamEntry, the VisObject is referenced, not cloned. - * - * @param param Pointer to the VisParamEntry to which a parameter is set. - * @param object Pointer to the VisObject that is linked to the VisParamEntry. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_PARAM_NULL on failure. - */ -int visual_param_entry_set_object (VisParamEntry *param, VisObject *object) -{ - visual_log_return_val_if_fail (param != NULL, -VISUAL_ERROR_PARAM_NULL); - - param->type = VISUAL_PARAM_ENTRY_TYPE_OBJECT; - - if (param->objdata != NULL) - visual_object_unref (param->objdata); - - param->objdata = object; - - if (param->objdata != NULL) - visual_object_ref (param->objdata); - - visual_param_entry_changed (param); - - return VISUAL_OK; -} - -/** - * Get the name of the VisParamEntry. - * - * @param param Pointer to the VisParamEntry from which the name is requested. - * - * @return The name of the VisParamEntry or NULL. - */ -char *visual_param_entry_get_name (VisParamEntry *param) -{ - visual_log_return_val_if_fail (param != NULL, NULL); - - return param->name; -} - -/** - * Get the string parameter from a VisParamEntry. - * - * @param param Pointer to the VisParamEntry from which the string parameter is requested. - * - * @return The string parameter from the VisParamEntry or NULL. - */ -char *visual_param_entry_get_string (VisParamEntry *param) -{ - visual_log_return_val_if_fail (param != NULL, NULL); - - if (param->type != VISUAL_PARAM_ENTRY_TYPE_STRING) { - visual_log (VISUAL_LOG_WARNING, "Requesting string from a non string param"); - - return NULL; - } - - return param->string; -} - -/** - * Get the integer parameter from a VisParamEntry. - * - * @param param Pointer to the VisParamEntry from which the integer parameter is requested. - * - * @return The integer parameter from the VisParamEntry. - */ -int visual_param_entry_get_integer (VisParamEntry *param) -{ - visual_log_return_val_if_fail (param != NULL, 0); - - if (param->type != VISUAL_PARAM_ENTRY_TYPE_INTEGER) - visual_log (VISUAL_LOG_WARNING, "Requesting integer from a non integer param"); - - return param->numeric.integer; -} - -/** - * Get the float parameter from a VisParamEntry. - * - * @param param Pointer to the VisParamEntry from which the float parameter is requested. - * - * @return The float parameter from the VisParamEntry. - */ -float visual_param_entry_get_float (VisParamEntry *param) -{ - visual_log_return_val_if_fail (param != NULL, 0); - - if (param->type != VISUAL_PARAM_ENTRY_TYPE_FLOAT) - visual_log (VISUAL_LOG_WARNING, "Requesting float from a non float param"); - - return param->numeric.floating; -} - -/** - * Get the double parameter from a VisParamEntry. - * - * @param param Pointer to the VisParamEntry from which the double parameter is requested. - * - * @return The double parameter from the VisParamEntry. - */ -double visual_param_entry_get_double (VisParamEntry *param) -{ - visual_log_return_val_if_fail (param != NULL, 0); - - if (param->type != VISUAL_PARAM_ENTRY_TYPE_DOUBLE) - visual_log (VISUAL_LOG_WARNING, "Requesting double from a non double param"); - - return param->numeric.doubleflt; -} - -/** - * Get the color parameter from a VisParamEntry. - * - * @param param Pointer to the VisParamEntry from which the color parameter is requested. - * - * @return Pointer to the VisColor parameter from the VisParamEntry. It's adviced to - * use the VisColor that is returned as read only seen changing it directly won't emit events and - * can cause synchronous problems between the plugin and the parameter system. Instead use the - * visual_param_entry_set_color* methods to change the parameter value. - */ -VisColor *visual_param_entry_get_color (VisParamEntry *param) -{ - visual_log_return_val_if_fail (param != NULL, NULL); - - if (param->type != VISUAL_PARAM_ENTRY_TYPE_COLOR) { - visual_log (VISUAL_LOG_WARNING, "Requesting color from a non color param"); - - return NULL; - } - - return ¶m->color; -} - -/** - * Get the palette parameter from a VisParamEntry. - * - * @param param Pointer to the VisParamEntry from which the palette parameter is requested. - * - * @return Pointer to the VisPalette parameter from the VisParamEntry. The returned VisPalette - * should be exclusively used as read only. - */ -VisPalette *visual_param_entry_get_palette (VisParamEntry *param) -{ - visual_log_return_val_if_fail (param != NULL, NULL); - - if (param->type != VISUAL_PARAM_ENTRY_TYPE_PALETTE) { - visual_log (VISUAL_LOG_WARNING, "Requested palette from a non palette param\n"); - - return NULL; - } - - return ¶m->pal; -} - -/** - * Get the object parameter from a VisParamEntry. - * - * @param param Pointer to the VisParamEntry from which the object parameter is requested. - * - * @return Pointer to the VisObject parameter from the VisParamEntry. - */ -VisObject *visual_param_entry_get_object (VisParamEntry *param) -{ - visual_log_return_val_if_fail (param != NULL, NULL); - - if (param->type != VISUAL_PARAM_ENTRY_TYPE_OBJECT) { - visual_log (VISUAL_LOG_WARNING, "Requested object from a non object param\n"); - - return NULL; - } - - return param->objdata; -} - -/** - * @} - */ -
--- a/libvisual/lv_param.h Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,174 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _LV_PARAM_H -#define _LV_PARAM_H - -#include <libvisual/lv_common.h> -#include <libvisual/lv_color.h> -#include <libvisual/lv_palette.h> -#include <libvisual/lv_list.h> -#include <libvisual/lv_event.h> - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#define VISUAL_PARAMCONTAINER(obj) (VISUAL_CHECK_CAST ((obj), 0, VisParamContainer)) -#define VISUAL_PARAMENTRY_CALLBACK(obj) (VISUAL_CHECK_CAST ((obj), 0, VisParamEntryCallback)) -#define VISUAL_PARAMENTRY(obj) (VISUAL_CHECK_CAST ((obj), 0, VisParamEntry)) - -#define VISUAL_PARAM_LIST_ENTRY(name) { {}, NULL, name, VISUAL_PARAM_ENTRY_TYPE_NULL } -#define VISUAL_PARAM_LIST_ENTRY_STRING(name, string) { {}, NULL, name, VISUAL_PARAM_ENTRY_TYPE_STRING, string, {0, 0, 0}} -#define VISUAL_PARAM_LIST_ENTRY_INTEGER(name, val) { {}, NULL, name, VISUAL_PARAM_ENTRY_TYPE_INTEGER, NULL, {val, 0, 0}} -#define VISUAL_PARAM_LIST_ENTRY_FLOAT(name, val) { {}, NULL, name, VISUAL_PARAM_ENTRY_TYPE_FLOAT, NULL, {0, val, 0}} -#define VISUAL_PARAM_LIST_ENTRY_DOUBLE(name, val) { {}, NULL, name, VISUAL_PARAM_ENTRY_TYPE_DOUBLE, NULL, {0, 0, val}} -#define VISUAL_PARAM_LIST_ENTRY_COLOR(name, r, g, b) { {}, NULL, name, VISUAL_PARAM_ENTRY_TYPE_COLOR, NULL, {0, 0, 0}, {{}, r, g, b, 0}} -#define VISUAL_PARAM_LIST_END { {}, NULL, NULL, VISUAL_PARAM_ENTRY_TYPE_END } - -#define VISUAL_PARAM_CALLBACK_ID_MAX 2147483647 - -/** - * Different types of parameters that can be used. - */ -typedef enum { - VISUAL_PARAM_ENTRY_TYPE_NULL, /**< No parameter. */ - VISUAL_PARAM_ENTRY_TYPE_STRING, /**< String parameter. */ - VISUAL_PARAM_ENTRY_TYPE_INTEGER, /**< Integer parameter. */ - VISUAL_PARAM_ENTRY_TYPE_FLOAT, /**< Floating point parameter. */ - VISUAL_PARAM_ENTRY_TYPE_DOUBLE, /**< Double floating point parameter. */ - VISUAL_PARAM_ENTRY_TYPE_COLOR, /**< VisColor parameter. */ - VISUAL_PARAM_ENTRY_TYPE_PALETTE, /**< VisPalette parameter. */ - VISUAL_PARAM_ENTRY_TYPE_OBJECT, /**< VisObject parameter. */ - VISUAL_PARAM_ENTRY_TYPE_END /**< List end, and used as terminator for VisParamEntry lists. */ -} VisParamEntryType; - -typedef struct _VisParamContainer VisParamContainer; -typedef struct _VisParamEntryCallback VisParamEntryCallback; -typedef struct _VisParamEntry VisParamEntry; - -/** - * The param changed callback is used to be able to notify of changes within parameters. This should - * not be used within the plugin itself, instead use the event queue there. This is so it's possible to - * notify of changes outside the plugin. For example, this is needed by VisUI. - * - * @arg param Pointer to the param that has been changed, and to which the callback was set. - * @arg priv Private argument, that can be set when adding the callback to the callback list. - */ -typedef void (*VisParamChangedCallbackFunc)(VisParamEntry *param, void *priv); - - -/** - * Parameter container, is the container for a set of parameters. - * - * All members should never be accessed directly, instead methods should be used. - */ -struct _VisParamContainer { - VisObject object; /**< The VisObject data. */ - VisList entries; /**< The list that contains all the parameters. */ - VisEventQueue *eventqueue; /**< Pointer to an optional eventqueue to which events can be emitted - * on parameter changes. */ -}; - -/** - * A parameter callback entry, used for change notification callbacks. - */ -struct _VisParamEntryCallback { - VisObject object; /**< The VisObject data. */ - int id; /**< Callback ID. */ - VisParamChangedCallbackFunc callback; /**< The param change callback function. */ -}; - -/** - * A parameter entry, used for plugin parameters and such. - * - * All members should never be accessed directly, instead methods should be used. - */ -struct _VisParamEntry { - VisObject object; /**< The VisObject data. */ - VisParamContainer *parent; /**< Parameter container in which the param entry is encapsulated. */ - char *name; /**< Parameter name. */ - VisParamEntryType type; /**< Parameter type. */ - - char *string; /**< String data. */ - - /* No union, we can't choose a member of the union using static initializers */ - struct { - int integer; /**< Integer data. */ - float floating; /**< Floating point data. */ - double doubleflt; /**< Double floating point data. */ - } numeric; - - VisColor color; /**< VisColor data. */ - VisPalette pal; /**< VisPalette data. */ - VisObject *objdata; /**< VisObject data for a VisObject parameter. */ - - VisList callbacks; /**< The change notify callbacks. */ -}; - -/* prototypes */ -VisParamContainer *visual_param_container_new (void); -int visual_param_container_set_eventqueue (VisParamContainer *paramcontainer, VisEventQueue *eventqueue); -VisEventQueue *visual_param_container_get_eventqueue (VisParamContainer *paramcontainer); - -int visual_param_container_add (VisParamContainer *paramcontainer, VisParamEntry *param); -int visual_param_container_add_many (VisParamContainer *paramcontainer, VisParamEntry *params); -int visual_param_container_remove (VisParamContainer *paramcontainer, const char *name); -int visual_param_container_copy (VisParamContainer *destcont, VisParamContainer *srccont); -int visual_param_container_copy_match (VisParamContainer *destcont, VisParamContainer *srccont); -VisParamEntry *visual_param_container_get (VisParamContainer *paramcontainer, const char *name); - -VisParamEntry *visual_param_entry_new (char *name); -int visual_param_entry_add_callback (VisParamEntry *param, VisParamChangedCallbackFunc callback, void *priv); -int visual_param_entry_remove_callback (VisParamEntry *param, int id); -int visual_param_entry_notify_callbacks (VisParamEntry *param); -int visual_param_entry_is (VisParamEntry *param, const char *name); -int visual_param_entry_compare (VisParamEntry *src1, VisParamEntry *src2); -int visual_param_entry_changed (VisParamEntry *param); -VisParamEntryType visual_param_entry_get_type (VisParamEntry *param); - -int visual_param_entry_set_from_param (VisParamEntry *param, VisParamEntry *src); -int visual_param_entry_set_name (VisParamEntry *param, char *name); -int visual_param_entry_set_string (VisParamEntry *param, char *string); -int visual_param_entry_set_integer (VisParamEntry *param, int integer); -int visual_param_entry_set_float (VisParamEntry *param, float floating); -int visual_param_entry_set_double (VisParamEntry *param, double doubleflt); -int visual_param_entry_set_color (VisParamEntry *param, uint8_t r, uint8_t g, uint8_t b); -int visual_param_entry_set_color_by_color (VisParamEntry *param, VisColor *color); -int visual_param_entry_set_palette (VisParamEntry *param, VisPalette *pal); -int visual_param_entry_set_object (VisParamEntry *param, VisObject *object); - -char *visual_param_entry_get_name (VisParamEntry *param); -char *visual_param_entry_get_string (VisParamEntry *param); -int visual_param_entry_get_integer (VisParamEntry *param); -float visual_param_entry_get_float (VisParamEntry *param); -double visual_param_entry_get_double (VisParamEntry *param); -VisColor *visual_param_entry_get_color (VisParamEntry *param); -VisPalette *visual_param_entry_get_palette (VisParamEntry *param); -VisObject *visual_param_entry_get_object (VisParamEntry *param); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _LV_PARAM_H */
--- a/libvisual/lv_plugin.c Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1088 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> -#include <dlfcn.h> -#include <dirent.h> - -#include "lvconfig.h" -#include "lv_libvisual.h" -#include "lv_plugin.h" -#include "lv_log.h" -#include "lv_mem.h" - -extern VisList *__lv_plugins; - -static int plugin_info_dtor (VisObject *object); -static int plugin_ref_dtor (VisObject *object); -static int plugin_environ_dtor (VisObject *object); -static int plugin_dtor (VisObject *object); - -static int plugin_add_dir_to_list (VisList *list, const char *dir); -static char *get_delim_node (const char *str, char delim, int index); - -static int plugin_info_dtor (VisObject *object) -{ - VisPluginInfo *pluginfo = VISUAL_PLUGININFO (object); - - if (pluginfo->plugname != NULL) - visual_mem_free (pluginfo->plugname); - - if (pluginfo->type != NULL) - visual_mem_free (pluginfo->type); - - if (pluginfo->name != NULL) - visual_mem_free (pluginfo->name); - - if (pluginfo->author != NULL) - visual_mem_free (pluginfo->author); - - if (pluginfo->version != NULL) - visual_mem_free (pluginfo->version); - - if (pluginfo->about != NULL) - visual_mem_free (pluginfo->about); - - if (pluginfo->help != NULL) - visual_mem_free (pluginfo->help); - - pluginfo->plugname = NULL; - pluginfo->type = NULL; - pluginfo->name = NULL; - pluginfo->author = NULL; - pluginfo->version = NULL; - pluginfo->about = NULL; - pluginfo->help = NULL; - - return VISUAL_OK; -} - -static int plugin_ref_dtor (VisObject *object) -{ - VisPluginRef *ref = VISUAL_PLUGINREF (object); - - if (ref->file != NULL) - visual_mem_free (ref->file); - - if (ref->usecount > 0) - visual_log (VISUAL_LOG_CRITICAL, "A plugin reference with %d instances has been destroyed.", ref->usecount); - - if (ref->info != NULL) - visual_object_unref (VISUAL_OBJECT (ref->info)); - - ref->file = NULL; - ref->info = NULL; - - return VISUAL_OK; -} - -static int plugin_environ_dtor (VisObject *object) -{ - VisPluginEnviron *enve = VISUAL_PLUGINENVIRON (object); - - if (enve->environ != NULL) - visual_object_unref (enve->environ); - - enve->environ = NULL; - - return VISUAL_OK; -} - -static int plugin_dtor (VisObject *object) -{ - VisPluginData *plugin = VISUAL_PLUGINDATA (object); - - if (plugin->ref != NULL) - visual_object_unref (VISUAL_OBJECT (plugin->ref)); - - if (plugin->params != NULL) - visual_object_unref (VISUAL_OBJECT (plugin->params)); - - visual_list_destroy_elements (&plugin->environ); - - plugin->ref = NULL; - plugin->params = NULL; - - return VISUAL_OK; -} - -static char *get_delim_node (const char *str, char delim, int index) -{ - char *buf; - const char *start; - const char *end = str; - int i = 0; - - do { - start = end; - - end = strchr (start + 1, delim); - - if (i == index) { - /* Last section doesn't contain a delim */ - if (end == NULL) - end = str + strlen (str); - - /* Cut off the delim that is in front */ - if (i > 0) - start++; - - break; - } - - i++; - - } while (end != NULL); - - if (end == NULL) - return NULL; - - buf = visual_mem_malloc0 ((end - start) + 1); - strncpy (buf, start, end - start); - - return buf; -} - -/** - * @defgroup VisPlugin VisPlugin - * @{ - */ - -/** - * Creates a new VisPluginInfo structure. - * - * @return A newly allocated VisPluginInfo - */ -VisPluginInfo *visual_plugin_info_new () -{ - VisPluginInfo *pluginfo; - - pluginfo = visual_mem_new0 (VisPluginInfo, 1); - - /* Do the VisObject initialization */ - visual_object_initialize (VISUAL_OBJECT (pluginfo), TRUE, plugin_info_dtor); - - return pluginfo; -} - -/** - * Copies data from one VisPluginInfo to another, this does not copy everything - * but only things that are needed in the local copy for the plugin registry. - * - * @param dest Pointer to the destination VisPluginInfo in which some data is copied. - * @param src Pointer to the source VisPluginInfo from which some data is copied. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_PLUGIN_INFO_NULL on failure. - */ -int visual_plugin_info_copy (VisPluginInfo *dest, VisPluginInfo *src) -{ - visual_log_return_val_if_fail (dest != NULL, -VISUAL_ERROR_PLUGIN_INFO_NULL); - visual_log_return_val_if_fail (src != NULL, -VISUAL_ERROR_PLUGIN_INFO_NULL); - - visual_mem_copy (dest, src, sizeof (VisPluginInfo)); - - dest->plugname = strdup (src->plugname); - dest->type = strdup (src->type); - dest->name = strdup (src->name); - dest->author = strdup (src->author); - dest->version = strdup (src->version); - dest->about = strdup (src->about); - dest->help = strdup (src->help); - - return VISUAL_OK; -} - -/** - * Pumps the queued events into the plugin it's event handler if it has one. - * - * @param plugin Pointer to a VisPluginData of which the events need to be pumped into - * the handler. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_PLUGIN_NULL or -VISUAL_ERROR_PLUGIN_NO_EVENT_HANDLER on failure. - */ -int visual_plugin_events_pump (VisPluginData *plugin) -{ - visual_log_return_val_if_fail (plugin != NULL, -VISUAL_ERROR_PLUGIN_NULL); - - if (plugin->info->events != NULL) { - plugin->info->events (plugin, &plugin->eventqueue); - - return VISUAL_OK; - } - - return -VISUAL_ERROR_PLUGIN_NO_EVENT_HANDLER; -} - -/** - * Gives the event queue from a VisPluginData. This queue needs to be used - * when you want to send events to the plugin. - * - * @see visual_plugin_events_pump - * - * @param plugin Pointer to the VisPluginData from which we want the queue. - * - * @return A pointer to the requested VisEventQueue or NULL on failure. - */ -VisEventQueue *visual_plugin_get_eventqueue (VisPluginData *plugin) -{ - visual_log_return_val_if_fail (plugin != NULL, NULL); - - return &plugin->eventqueue; -} - -/** - * Sets a VisUIWidget as top user interface widget for the plugin. When a VisUI - * tree is requested by a client, to render a configuration userinterface, this - * VisUIWidget is used as top widget. - * - * @param plugin Pointer to the VisPluginData to which we set the VisUIWidget as top widget. - * @param widget Pointer to the VisUIWidget that we use as top widget for the user interface. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_PLUGIN_NULL on failure. - */ -int visual_plugin_set_userinterface (VisPluginData *plugin, VisUIWidget *widget) -{ - visual_log_return_val_if_fail (plugin != NULL, -VISUAL_ERROR_PLUGIN_NULL); - - plugin->userinterface = widget; - - return VISUAL_OK; -} - -/** - * Retrieves the VisUI top widget for the plugin. - * - * @param plugin Pointer to the VisPluginData of which we request the VisUIWidget that serves as top widget. - * - * @return Pointer to the VisUIWidget that serves as top widget, possibly NULL. - */ -VisUIWidget *visual_plugin_get_userinterface (VisPluginData *plugin) -{ - visual_log_return_val_if_fail (plugin != NULL, NULL); - - return plugin->userinterface; -} - -/** - * Gives the VisPluginInfo related to a VisPluginData. - * - * @param plugin The VisPluginData of which the VisPluginInfo is requested. - * - * @return The VisPluginInfo within the VisPluginData, or NULL on failure. - */ -VisPluginInfo *visual_plugin_get_info (VisPluginData *plugin) -{ - visual_log_return_val_if_fail (plugin != NULL, NULL); - - return plugin->info; -} - -/** - * Gives the VisParamContainer related to a VisPluginData. - * - * @param plugin The VisPluginData of which the VisParamContainer is requested. - * - * @return The VisParamContainer within the VisPluginData, or NULL on failure. - */ -VisParamContainer *visual_plugin_get_params (VisPluginData *plugin) -{ - visual_log_return_val_if_fail (plugin != NULL, NULL); - - return plugin->params; -} - -/** - * Gives the VisRandomContext related to a VisPluginData. - * - * @param plugin The VisPluginData of which the VisRandomContext is requested. - * - * @return The VisRandomContext within the VisPluginDAta, or NULL on failure. - */ -VisRandomContext *visual_plugin_get_random_context (VisPluginData *plugin) -{ - visual_log_return_val_if_fail (plugin != NULL, NULL); - - return &plugin->random; -} - -/** - * Retrieves the plugin specific part of a plugin. - * - * @see VISUAL_PLUGIN_ACTOR - * @see VISUAL_PLUGIN_INPUT - * @see VISUAL_PLUGIN_MORPH - * - * @param plugin The pointer to the VisPluginData from which we want the plugin specific part. - * - * @return Void * pointing to the plugin specific part which can be cast. - */ -void *visual_plugin_get_specific (VisPluginData *plugin) -{ - VisPluginInfo *pluginfo; - - visual_log_return_val_if_fail (plugin != NULL, NULL); - - pluginfo = visual_plugin_get_info (plugin); - visual_log_return_val_if_fail (pluginfo != NULL, NULL); - - return pluginfo->plugin; -} - -/** - * Creates a new VisPluginRef structure. - * - * The VisPluginRef contains data for the plugin loader. - * - * @return Newly allocated VisPluginRef. - */ -VisPluginRef *visual_plugin_ref_new () -{ - VisPluginRef *ref; - - ref = visual_mem_new0 (VisPluginRef, 1); - - /* Do the VisObject initialization */ - visual_object_initialize (VISUAL_OBJECT (ref), TRUE, plugin_ref_dtor); - - return ref; -} - -/** - * Creates a new VisPluginData structure. - * - * @return A newly allocated VisPluginData. - */ -VisPluginData *visual_plugin_new () -{ - VisPluginData *plugin; - - plugin = visual_mem_new0 (VisPluginData, 1); - - /* Do the VisObject initialization */ - visual_object_initialize (VISUAL_OBJECT (plugin), TRUE, plugin_dtor); - - plugin->params = visual_param_container_new (); - - return plugin; -} - -/** - * Gives a VisList that contains references to all the plugins in the registry. - * - * @see VisPluginRef - * - * @return VisList of references to all the libvisual plugins. - */ -VisList *visual_plugin_get_registry () -{ - return __lv_plugins; -} - -/** - * Gives a newly allocated VisList with references for one plugin type. - * - * @see VisPluginRef - * - * @param pluglist Pointer to the VisList that contains the plugin registry. - * @param domain The plugin type that is filtered for. - * - * @return Newly allocated VisList that is a filtered version of the plugin registry. - */ -VisList *visual_plugin_registry_filter (VisList *pluglist, const char *domain) -{ - VisList *list; - VisListEntry *entry = NULL; - VisPluginRef *ref; - - visual_log_return_val_if_fail (pluglist != NULL, NULL); - - list = visual_list_new (visual_object_list_destroyer); - - if (list == NULL) { - visual_log (VISUAL_LOG_CRITICAL, "Cannot create a new list"); - - return NULL; - } - - while ((ref = visual_list_next (pluglist, &entry)) != NULL) { - - if (visual_plugin_type_member_of (ref->info->type, domain)) { - visual_object_ref (VISUAL_OBJECT (ref)); - - visual_list_add (list, ref); - } - } - - return list; -} - -/** - * Get the next plugin based on it's name. - * - * @see visual_plugin_registry_filter - * - * @param list Pointer to the VisList containing the plugins. Adviced is to filter - * this list first using visual_plugin_registry_filter. - * @param name Name of a plugin entry of which we want the next entry or NULL to get - * the first entry. - * - * @return The name of the next plugin or NULL on failure. - */ -const char *visual_plugin_get_next_by_name (VisList *list, const char *name) -{ - VisListEntry *entry = NULL; - VisPluginRef *ref; - int tagged = FALSE; - - visual_log_return_val_if_fail (list != NULL, NULL); - - while ((ref = visual_list_next (list, &entry)) != NULL) { - if (name == NULL) - return ref->info->plugname; - - if (tagged == TRUE) - return ref->info->plugname; - - if (strcmp (name, ref->info->plugname) == 0) - tagged = TRUE; - } - - return NULL; -} - -/** - * Get the previous plugin based on it's name. - * - * @see visual_plugin_registry_filter - * - * @param list Pointer to the VisList containing the plugins. Adviced is to filter - * this list first using visual_plugin_registry_filter. - * @param name Name of a plugin entry of which we want the previous entry or NULL to get - * the last entry. - * - * @return The name of the next plugin or NULL on failure. - */ -const char *visual_plugin_get_prev_by_name (VisList *list, const char *name) -{ - VisListEntry *entry = NULL; - VisPluginRef *ref, *pref = NULL; - - visual_log_return_val_if_fail (list != NULL, NULL); - - if (name == NULL) { - ref = visual_list_get (list, visual_list_count (list) - 1); - - if (ref == NULL) - return NULL; - - return ref->info->plugname; - } - - while ((ref = visual_list_next (list, &entry)) != NULL) { - if (strcmp (name, ref->info->plugname) == 0) { - if (pref != NULL) - return pref->info->plugname; - else - return NULL; - } - - pref = ref; - } - - return NULL; -} - -static int plugin_add_dir_to_list (VisList *list, const char *dir) -{ - VisPluginRef **ref; - char temp[1024]; - struct dirent **namelist; - int i, j, n, len; - int cnt = 0; - - n = scandir (dir, &namelist, 0, alphasort); - - if (n < 0) - return -1; - - /* Free the . and .. entries */ - visual_mem_free (namelist[0]); - visual_mem_free (namelist[1]); - - for (i = 2; i < n; i++) { - ref = NULL; - - snprintf (temp, 1023, "%s/%s", dir, namelist[i]->d_name); - - len = strlen (temp); - if (len > 3 && (strncmp (&temp[len - 3], ".so", 3)) == 0) - ref = visual_plugin_get_references (temp, &cnt); - - if (ref != NULL) { - for (j = 0; j < cnt; j++) - visual_list_add (list, ref[j]); - - /* This is the pointer pointer pointer, not a ref itself */ - visual_mem_free (ref); - } - - visual_mem_free (namelist[i]); - } - - visual_mem_free (namelist); - - return 0; -} - -/** - * Private function to unload a plugin. After calling this function the - * given argument is no longer usable. - * - * @param plugin Pointer to the VisPluginData that needs to be unloaded. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_PLUGIN_NULL, -VISUAL_ERROR_PLUGIN_HANDLE_NULL or - * -VISUAL_ERROR_PLUGIN_REF_NULL on failure. - */ -int visual_plugin_unload (VisPluginData *plugin) -{ - VisPluginRef *ref; - - visual_log_return_val_if_fail (plugin != NULL, -VISUAL_ERROR_PLUGIN_NULL); - - ref = plugin->ref; - - /* Not loaded */ - if (plugin->handle == NULL) { - visual_object_unref (VISUAL_OBJECT (plugin)); - - visual_log (VISUAL_LOG_CRITICAL, "Tried unloading a plugin that never has been loaded."); - - return -VISUAL_ERROR_PLUGIN_HANDLE_NULL; - } - - if (plugin->realized == TRUE) - plugin->info->cleanup (plugin); - - if (plugin->info->plugin != NULL) - visual_object_unref (VISUAL_OBJECT (plugin->info->plugin)); - - if (plugin->info != NULL) - visual_object_unref (VISUAL_OBJECT (plugin->info)); - - dlclose (plugin->handle); - plugin->info = NULL; - - if (ref != NULL) { - if (ref->usecount > 0) - ref->usecount--; - } - - visual_param_container_set_eventqueue (plugin->params, NULL); - - visual_object_unref (VISUAL_OBJECT (plugin)); - - return VISUAL_OK; -} - -/** - * Private function to load a plugin. - * - * @param ref Pointer to the VisPluginRef containing information about - * the plugin that needs to be loaded. - * - * @return A newly created and loaded VisPluginData. - */ -VisPluginData *visual_plugin_load (VisPluginRef *ref) -{ - VisPluginData *plugin; - VisTime time_; - VisPluginInfo *pluginfo; - VisPluginGetInfoFunc get_plugin_info; - void *handle; - int cnt; - - visual_log_return_val_if_fail (ref != NULL, NULL); - visual_log_return_val_if_fail (ref->info != NULL, NULL); - - /* Check if this plugin is reentrant */ - if (ref->usecount > 0 && (ref->info->flags & VISUAL_PLUGIN_FLAG_NOT_REENTRANT)) { - visual_log (VISUAL_LOG_CRITICAL, "Cannot load plugin %s, the plugin is already loaded and is not reentrant.", - ref->info->plugname); - - return NULL; - } - - handle = dlopen (ref->file, RTLD_LAZY); - - if (handle == NULL) { - visual_log (VISUAL_LOG_CRITICAL, "Cannot load plugin: %s", dlerror ()); - - return NULL; - } - - get_plugin_info = (VisPluginGetInfoFunc) dlsym (handle, "get_plugin_info"); - - if (get_plugin_info == NULL) { - visual_log (VISUAL_LOG_CRITICAL, "Cannot initialize plugin: %s", dlerror ()); - - dlclose (handle); - - return NULL; - } - - pluginfo = VISUAL_PLUGININFO (get_plugin_info (&cnt)); - - if (pluginfo == NULL) { - visual_log (VISUAL_LOG_CRITICAL, "Cannot get plugin info while loading."); - - dlclose (handle); - - return NULL; - } - - plugin = visual_plugin_new (); - plugin->ref = ref; - plugin->info = &pluginfo[ref->index]; - - visual_object_ref (VISUAL_OBJECT (ref)); - - ref->usecount++; - plugin->realized = FALSE; - plugin->handle = handle; - - /* Now the plugin is set up and ready to be realized, also random seed it's random context */ - visual_time_get (&time_); - visual_random_context_set_seed (&plugin->random, time_.tv_usec); - - return plugin; -} - -/** - * Private function to realize the plugin. This initializes the plugin. - * - * @param plugin Pointer to the VisPluginData that needs to be realized. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_PLUGIN_NULL or -VISUAL_ERROR_PLUGIN_ALREADY_REALIZED on failure. - */ -int visual_plugin_realize (VisPluginData *plugin) -{ - VisParamContainer *paramcontainer; - - visual_log_return_val_if_fail (plugin != NULL, -VISUAL_ERROR_PLUGIN_NULL); - - if (plugin->realized == TRUE) - return -VISUAL_ERROR_PLUGIN_ALREADY_REALIZED; - - paramcontainer = visual_plugin_get_params (plugin); - visual_param_container_set_eventqueue (paramcontainer, &plugin->eventqueue); - - plugin->info->init (plugin); - plugin->realized = TRUE; - - return VISUAL_OK; -} - -/** - * Private function to create VisPluginRefs from plugins. - * - * @param pluginpath The full path and filename to the plugin of which a reference - * needs to be obtained. - * @param count Int pointer that will contain the number of VisPluginRefs returned. - * - * @return The optionally newly allocated VisPluginRefs for the plugin. - */ -VisPluginRef **visual_plugin_get_references (const char *pluginpath, int *count) -{ - VisPluginRef **ref; - VisPluginInfo *plug_info; - VisPluginInfo *dup_info; - const char *plug_name; - VisPluginGetInfoFunc get_plugin_info; - void *handle; - int cnt = 1, i; - - visual_log_return_val_if_fail (pluginpath != NULL, NULL); - - handle = dlopen (pluginpath, RTLD_LAZY); - - if (handle == NULL) { - visual_log (VISUAL_LOG_CRITICAL, "Cannot load plugin: %s", dlerror ()); - - return NULL; - } - - get_plugin_info = (VisPluginGetInfoFunc) dlsym (handle, "get_plugin_info"); - - if (get_plugin_info == NULL) { - visual_log (VISUAL_LOG_CRITICAL, "Cannot initialize plugin: %s", dlerror ()); - - dlclose (handle); - - return NULL; - } - - plug_info = VISUAL_PLUGININFO (get_plugin_info (&cnt)); - - if (plug_info == NULL) { - visual_log (VISUAL_LOG_CRITICAL, "Cannot get plugin info"); - - dlclose (handle); - - return NULL; - } - - /* FIXME we do leak the object when it fails the sanity check, tho - * it is not always safe (with VERY stuff laying around) to unref it. */ - - /* Check for API and struct size */ - if (plug_info[0].struct_size != sizeof (VisPluginInfo) || - plug_info[0].api_version != VISUAL_PLUGIN_API_VERSION) { - - visual_log (VISUAL_LOG_CRITICAL, "Plugin %s is not compatible with version %s of libvisual", - pluginpath, visual_get_version ()); - - dlclose (handle); - - return NULL; - } - - ref = visual_mem_new0 (VisPluginRef *, cnt); - - for (i = 0; i < cnt; i++) { - ref[i] = visual_plugin_ref_new (); - - dup_info = visual_plugin_info_new (); - visual_plugin_info_copy (dup_info, &plug_info[i]); - - ref[i]->index = i; - ref[i]->info = dup_info; - ref[i]->file = strdup (pluginpath); - - visual_object_unref (plug_info[i].plugin); - visual_object_unref (VISUAL_OBJECT (&plug_info[i])); - } - - dlclose (handle); - - *count = cnt; - - return ref; -} - -/** - * Private function to create the complete plugin registry from a set of paths. - * - * @param paths A pointer list to a set of paths. - * - * @return A newly allocated VisList containing the plugin registry for the set of paths. - */ -VisList *visual_plugin_get_list (const char **paths) -{ - VisList *list; - int i = 0; - - list = visual_list_new (visual_object_list_destroyer); - - while (paths[i] != NULL) { - if (plugin_add_dir_to_list (list, paths[i]) < 0) { - visual_log (VISUAL_LOG_WARNING, "Failed to add the %s directory to the plugin registry", - paths[i]); - } - - i++; - } - - return list; -} - -/** - * Private function to find a plugin in a plugin registry. - * - * @param list Pointer to a VisList containing VisPluginRefs in which - * the search is done. - * @param name The name of the plugin we're looking for. - * - * @return The VisPluginRef for the plugin if found, or NULL when not found. - */ -VisPluginRef *visual_plugin_find (VisList *list, const char *name) -{ - VisListEntry *entry = NULL; - VisPluginRef *ref; - - while ((ref = visual_list_next (list, &entry)) != NULL) { - - if (ref->info->plugname == NULL) - continue; - - if (strcmp (name, ref->info->plugname) == 0) - return ref; - } - - return NULL; -} - -/** - * Gives the VISUAL_PLUGIN_API_VERSION value for which the library is compiled. - * This can be used to check against for API/ABI compatibility check. - * - * @return The VISUAL_PLUGIN_API_VERSION define value. - */ -int visual_plugin_get_api_version () -{ - return VISUAL_PLUGIN_API_VERSION; -} - -/** - * Retrieves the VisSongInfo from a VisActorPlugin. - * - * @param actplugin Pointer to the VisActorPlugin from which the VisSongInfo is requested. - * - * @return The requested VisSongInfo or NULL on failure. - */ -VisSongInfo *visual_plugin_actor_get_songinfo (VisActorPlugin *actplugin) -{ - visual_log_return_val_if_fail (actplugin != NULL, NULL); - - return &actplugin->songinfo; -} - -/** - * Get the domain part from a plugin type string. - * - * @param type The type string. - * - * @return A newly allocated string containing the domain part of this plugin type, or NULL on failure. - */ -const char *visual_plugin_type_get_domain (const char *type) -{ - visual_log_return_val_if_fail (type != NULL, NULL); - - return get_delim_node (type, ':', 0); -} - -/** - * Get the package part from a plugin type string. - * - * @param type The type string. - * - * @return A newly allocated string containing the package part of this plugin type, or NULL on failure. - */ -const char *visual_plugin_type_get_package (const char *type) -{ - visual_log_return_val_if_fail (type != NULL, NULL); - - return get_delim_node (type, ':', 1); -} - -/** - * Get the type part from a plugin type string. - * - * @param type The type string. - * - * @return A newly allocated string containing the type part of this plugin type, or NULL on failure. - */ -const char *visual_plugin_type_get_type (const char *type) -{ - visual_log_return_val_if_fail (type != NULL, NULL); - - return get_delim_node (type, ':', 2); -} - -/** - * Get the depth of a plugin type string. - * - * @param type The type string. - * - * @return A VisPluginTypeDepth enum value that describes out of how many parts this plugin - * type string consists, -VISUAL_ERROR_NULL on failure. - */ -VisPluginTypeDepth visual_plugin_type_get_depth (const char *type) -{ - int i = 0; - - visual_log_return_val_if_fail (type != NULL, -VISUAL_ERROR_NULL); - - while (i < VISUAL_PLUGIN_TYPE_DEPTH_TYPE) { - char *part; - - part = get_delim_node (type, ':', i); - - if (part == NULL) - break; - - i++; - - visual_mem_free (part); - } - - return i; -} - -/** - * Check if a certain plugin type string falls within the domain of the other. - * - * @param domain The domain in which the type string should fall. - * @param type The type string that is checked against the given domain. - * - * @return TRUE if it falls within the domain, FALSE when not, -VISUAL_ERROR_NULL on failure - */ -int visual_plugin_type_member_of (const char *domain, const char *type) -{ - char *comp1; - char *comp2; - int diff = 0; - int i = 0; - - visual_log_return_val_if_fail (type != NULL, -VISUAL_ERROR_NULL); - - while (i < visual_plugin_type_get_depth (domain)) { - comp1 = get_delim_node (domain, ':', i); - comp2 = get_delim_node (type, ':', i); - - if (comp1 == NULL) - return FALSE; - - if (comp2 == NULL) - return FALSE; - - if (strcmp (comp1, comp2) != 0) - diff++; - - visual_mem_free (comp1); - visual_mem_free (comp2); - - i++; - } - - if (diff > 0) - return FALSE; - - return TRUE; -} - -/** - * Creates a VisPluginEnviron structure. - * - * @param type The Environ type that is requested. - * @param envobj The VisObject connected to this Environ type. - * - * @return A newly allocated VisPluginEnviron, or NULL on failure. - */ -VisPluginEnviron *visual_plugin_environ_new (const char *type, VisObject *envobj) -{ - VisPluginEnviron *enve; - - enve = visual_mem_new0 (VisPluginEnviron, 1); - - /* Do the VisObject initialization */ - visual_object_initialize (VISUAL_OBJECT (enve), TRUE, plugin_environ_dtor); - - enve->type = type; - enve->environ = envobj; - - return enve; -} - -/** - * Adds a VisPluginEnviron to the plugin it's environment list. - * - * @param plugin Pointer to the VisPluginData to which the VisPluginEnviron is added. - * @param enve Pointer to the VisPluginEnviron that is added to the VisPluginData. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_PLUGIN_NULL, -VISUAL_ERROR_PLUGIN_ENVIRON_NULL, - * -VISUAL_ERROR_NULL or error values returned by visual_list_add() on failure. - */ -int visual_plugin_environ_add (VisPluginData *plugin, VisPluginEnviron *enve) -{ - visual_log_return_val_if_fail (plugin != NULL, -VISUAL_ERROR_PLUGIN_NULL); - visual_log_return_val_if_fail (enve != NULL, -VISUAL_ERROR_PLUGIN_ENVIRON_NULL); - visual_log_return_val_if_fail (enve->type != NULL, -VISUAL_ERROR_NULL); - - visual_plugin_environ_remove (plugin, enve->type); - - return visual_list_add (&plugin->environ, enve); -} - -/** - * Removes a VisPluginEnviron from the plugin it's environment list. - * - * @param plugin Pointer to the VisPluginData from which the VisPluginEnviron is removed. - * @param type The Environ type that is removed. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_PLUGIN_NULL or -VISUAL_ERROR_NULL on failure. - */ -int visual_plugin_environ_remove (VisPluginData *plugin, const char *type) -{ - VisPluginEnviron *enve; - VisListEntry *le = NULL; - - visual_log_return_val_if_fail (plugin != NULL, -VISUAL_ERROR_PLUGIN_NULL); - visual_log_return_val_if_fail (type != NULL, -VISUAL_ERROR_NULL); - - while ((enve = visual_list_next (&plugin->environ, &le)) != NULL) { - - /* Remove from list */ - if (strcmp (enve->type, type) == 0) { - visual_list_delete (&plugin->environ, &le); - - visual_object_unref (VISUAL_OBJECT (enve)); - - return VISUAL_OK; - } - } - - return VISUAL_OK; -} - -/** - * Retrieves a VisPluginEnviron from the plugin it's environment list. - * - * @param plugin Pointer to the VisPluginData from which the VisPluginEnviron is requested. - * @param type The Environ type that is requested. - * - * @return The requested VisPluginEnviron it's environ specific VisObject, or NULL on failure - */ -VisObject *visual_plugin_environ_get (VisPluginData *plugin, const char *type) -{ - VisPluginEnviron *enve; - VisListEntry *le = NULL; - - visual_log_return_val_if_fail (plugin != NULL, NULL); - visual_log_return_val_if_fail (type != NULL, NULL); - - while ((enve = visual_list_next (&plugin->environ, &le)) != NULL) { - - if (strcmp (enve->type, type) == 0) - return enve->environ; - } - - return NULL; -} - -/** - * @} - */ -
--- a/libvisual/lv_plugin.h Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,509 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _LV_PLUGIN_H -#define _LV_PLUGIN_H - -#include <libvisual/lv_video.h> -#include <libvisual/lv_audio.h> -#include <libvisual/lv_palette.h> -#include <libvisual/lv_list.h> -#include <libvisual/lv_songinfo.h> -#include <libvisual/lv_event.h> -#include <libvisual/lv_param.h> -#include <libvisual/lv_ui.h> -#include <libvisual/lv_random.h> -#include <libvisual/lv_types.h> - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#define VISUAL_PLUGINREF(obj) (VISUAL_CHECK_CAST ((obj), 0, VisPluginRef)) -#define VISUAL_PLUGININFO(obj) (VISUAL_CHECK_CAST ((obj), 0, VisPluginInfo)) -#define VISUAL_PLUGINDATA(obj) (VISUAL_CHECK_CAST ((obj), 0, VisPluginData)) -#define VISUAL_PLUGINENVIRON(obj) (VISUAL_CHECK_CAST ((obj), 0, VisPluginEnviron)) - -#define VISUAL_PLUGIN_ACTOR(obj) (VISUAL_CHECK_CAST ((obj), VISUAL_PLUGIN_TYPE_ACTOR_ENUM, VisActorPlugin)) -#define VISUAL_PLUGIN_INPUT(obj) (VISUAL_CHECK_CAST ((obj), VISUAL_PLUGIN_TYPE_INPUT_ENUM, VisInputPlugin)) -#define VISUAL_PLUGIN_MORPH(obj) (VISUAL_CHECK_CAST ((obj), VISUAL_PLUGIN_TYPE_MORPH_ENUM, VisMorphPlugin)) -#define VISUAL_PLUGIN_TRANSFORM(obj) (VISUAL_CHECK_CAST ((obj), VISUAL_PLUGIN_TYPE_TRANSFORM_ENUM, VisTransformPlugin)) - -/** - * Indicates at which version the plugin API is. - */ -#define VISUAL_PLUGIN_API_VERSION 2 - -/** - * Type defination that should be used in plugins to set the plugin type for a NULL plugin. - */ -#define VISUAL_PLUGIN_TYPE_NULL "Libvisual:core:null" -/** - * Type defination that should be used in plugins to set the plugin type for an actor plugin. - */ -#define VISUAL_PLUGIN_TYPE_ACTOR "Libvisual:core:actor" -/** - * Type defination that should be used in plugins to set the plugin type for an input plugin. - */ -#define VISUAL_PLUGIN_TYPE_INPUT "Libvisual:core:input" -/** - * Type defination that should be used in plugins to set the plugin type for a morph plugin. - */ -#define VISUAL_PLUGIN_TYPE_MORPH "Libvisual:core:morph" -/** - * Type defination that should be used in plugins to set the plugin type for a transform plugin. - */ -#define VISUAL_PLUGIN_TYPE_TRANSFORM "Libvisual:core:transform" - -/** - * Enumerate to define the plugin type. Especially used - * within the VisPlugin system and for type checking within the core library itself. - * - * For plugin type defination use the VISUAL_PLUGIN_TYPE_NULL, VISUAL_PLUGIN_TYPE_ACTOR - * VISUAL_PLUGIN_TYPE_INPUT or VISUAL_PLUGIN_TYPE_MORPH defines that contain the domain string. - * - * There are three different plugins being: - * -# Actor plugins: These are the actual - * visualisation plugins. - * -# Input plugins: These can be used to obtain - * PCM data through, for example different sound servers. - * -# Morph plugins: These are capable of morphing - * between different plugins. - * -# Transform plugins: These are capable of transforming a video or palette - * into something new. - */ -typedef enum { - VISUAL_PLUGIN_TYPE_NULL_ENUM, /**< Used when there is no plugin. */ - VISUAL_PLUGIN_TYPE_ACTOR_ENUM, /**< Used when the plugin is an actor plugin. */ - VISUAL_PLUGIN_TYPE_INPUT_ENUM, /**< Used when the plugin is an input plugin. */ - VISUAL_PLUGIN_TYPE_MORPH_ENUM, /**< Used when the plugin is a morph plugin. */ - VISUAL_PLUGIN_TYPE_TRANSFORM_ENUM /**< Used when the plugin is a transform plugin. */ -} VisPluginType; - -/** - * Enumerate to define the plugin flags. Plugin flags can be used to - * define some of the plugin it's behavior. - */ -typedef enum { - VISUAL_PLUGIN_FLAG_NONE = 0, /**< Used to set no flags. */ - VISUAL_PLUGIN_FLAG_NOT_REENTRANT = 1, /**< Used to tell the plugin loader that this plugin - * is not reentrant, and can be loaded only once. */ - VISUAL_PLUGIN_FLAG_SPECIAL = 2 /**< Used to tell the plugin loader that this plugin has - * special purpose, like the GdkPixbuf plugin, or a webcam - * plugin. */ -} VisPluginFlags; - -/** - * Enumerate to check the depth of the type wildcard/defination used, used together with the visual_plugin_type functions. - */ -typedef enum { - VISUAL_PLUGIN_TYPE_DEPTH_NONE = 0, /**< No type found.*/ - VISUAL_PLUGIN_TYPE_DEPTH_DOMAIN = 1, /**< Only domain in type. */ - VISUAL_PLUGIN_TYPE_DEPTH_PACKAGE = 2, /**< Domain and package in type. */ - VISUAL_PLUGIN_TYPE_DEPTH_TYPE = 3, /**< Domain, package and type found in type. */ -} VisPluginTypeDepth; - -typedef struct _VisPluginRef VisPluginRef; -typedef struct _VisPluginInfo VisPluginInfo; -typedef struct _VisPluginData VisPluginData; -typedef struct _VisPluginEnviron VisPluginEnviron; - -typedef struct _VisActorPlugin VisActorPlugin; -typedef struct _VisInputPlugin VisInputPlugin; -typedef struct _VisMorphPlugin VisMorphPlugin; -typedef struct _VisTransformPlugin VisTransformPlugin; - -/* Actor plugin methods */ - -/** - * An actor plugin needs this signature for the requisition function. The requisition function - * is used to determine the size required by the plugin for a given width/height value. - * - * @arg plugin Pointer to the VisPluginData instance structure. - * @arg width Pointer to an int containing the width requested, will be altered to the nearest - * supported width. - * @arg height Pointer to an int containing the height requested, will be altered to the nearest - * supported height. - * - * @return 0 on succes -1 on error. - */ -typedef int (*VisPluginActorRequisitionFunc)(VisPluginData *plugin, int *width, int *height); - -/** - * An actor plugin needs this signature for the palette function. The palette function - * is used to retrieve the desired palette from the plugin. - * - * @arg plugin Pointer to the VisPluginData instance structure. - * - * @return Pointer to the VisPalette used by the plugin, this should be a VisPalette with 256 - * VisColor entries, NULL is also allowed to be returned. - */ -typedef VisPalette *(*VisPluginActorPaletteFunc)(VisPluginData *plugin); - -/** - * An actor plugin needs this signature for the render function. The render function - * is used to render the frame for the visualisation. - * - * @arg plugin Pointer to the VisPluginData instance structure. - * @arg video Pointer to the VisVideo containing all information about the display surface. - * Params like height and width won't suddenly change, this is always notified as an event - * so the plugin can adjust to the new dimension. - * @arg audio Pointer to the VisAudio containing all the data regarding the current audio sample. - * - * @return 0 on succes -1 on error. - */ -typedef int (*VisPluginActorRenderFunc)(VisPluginData *plugin, VisVideo *video, VisAudio *audio); - -/* Input plugin methods */ - -/** - * An input plugin needs this signature for the sample upload function. The sample upload function - * is used to retrieve sample information when a input is being used to retrieve the - * audio sample. - * - * @arg plugin Pointer to the VisPluginData instance structure. - * @arg audio Pointer to the VisAudio in which the new sample data is set. - * - * @return 0 on succes -1 on error. - */ -typedef int (*VisPluginInputUploadFunc)(VisPluginData *plugin, VisAudio *audio); - -/* Morph plugin methods */ - -/** - * A morph plugin needs this signature for the palette function. The palette function - * is used to give a palette for the morph. The palette function isn't mandatory and the - * VisMorph system will interpolate between the two palettes in VISUAL_VIDEO_DEPTH_8BIT when - * a palette function isn't set. - * - * @arg plugin Pointer to the VisPluginData instance structure. - * @arg rate A float between 0.0 and 1.0 that tells how far the morph has proceeded. - * @arg audio Pointer to the VisAudio containing all the data regarding the current audio sample. - * @arg pal A pointer to the target VisPalette in which the morph between the two palettes is saved. Should have - * 256 VisColor entries. - * @arg src1 A pointer to the first VisVideo source. - * @arg src2 A pointer to the second VisVideo source. - * - * @return 0 on succes -1 on error. - */ -typedef int (*VisPluginMorphPaletteFunc)(VisPluginData *plugin, float rate, VisAudio *audio, VisPalette *pal, - VisVideo *src1, VisVideo *src2); - -/** - * A morph plugin needs this signature for the apply function. The apply function - * is used to execute a morph between two VisVideo sources. It's the 'render' function of - * the morph plugin and here is the morphing done. - * - * @arg plugin Pointer to the VisPluginData instance structure. - * @arg rate A float between 0.0 and 1.0 that tells how far the morph has proceeded. - * @arg audio Pointer to the VisAudio containing all the data regarding the current audio sample. - * @arg src1 A pointer to the first VisVideo source. - * @arg src2 A pointer to the second VisVideo source. - * - * @return 0 on succes -1 on error. - */ -typedef int (*VisPluginMorphApplyFunc)(VisPluginData *plugin, float rate, VisAudio *audio, VisVideo *dest, - VisVideo *src1, VisVideo *src2); - -/* Transform plugin methodes */ - -/** - * A transform plugin needs this signature to transform VisPalettes. - * - * @arg plugin Pointer to the VisPluginData instance structure. - * @arg pal Pointer to the VisPalette that is to be morphed. - * Only 256 entry VisPalettes have to be supported. - * @arg audio Optionally a pointer to the VisAudio, when requested. - * - * @return 0 on succes -1 on error. - */ -typedef int (*VisPluginTransformPaletteFunc)(VisPluginData *plugin, VisPalette *pal, VisAudio *audio); - -/** - * A transform plugin needs this signature to transform VisVideos. - * - * @arg plugin Pointer to the VisPluginData instance structure. - * @arg video Pointer to the VisVideo that needs to be transformed. - * @arg audio Optionally a pointer to the VisAudio, when requested. - * - * @return 0 on succes -1 on error. - */ -typedef int (*VisPluginTransformVideoFunc)(VisPluginData *plugin, VisVideo *video, VisAudio *audio); - -/* Plugin standard get_plugin_info method */ -/** - * This is the signature for the 'get_plugin_info' function every libvisual plugin needs to have. The - * 'get_plugin_info' function provides libvisual plugin data and all the detailed information regarding - * the plugin. This function is compulsory without it libvisual won't load the plugin. - * - * @arg count An int pointer in which the number of VisPluginData entries within the plugin. Plugins can have - * multiple 'features' and thus the count is needed. - * - * @return Pointer to the VisPluginInfo array which contains information about the plugin. - */ -typedef const VisPluginInfo *(*VisPluginGetInfoFunc)(int *count); - -/* Standard plugin methods */ - -/** - * Every libvisual plugin that is loaded by the libvisual plugin loader needs this signature for it's - * intialize function. - * - * @arg plugin Pointer to the VisPluginData instance structure. - * - * @return 0 on succes -1 on error. - */ -typedef int (*VisPluginInitFunc)(VisPluginData *plugin); - -/** - * Every libvisual plugin that is loaded by the libvisual plugin loader needs this signature for it's - * cleanup function. - * - * @arg plugin Pointer to the VisPluginData instance structure. - * - * @return 0 on succes -1 on error. - */ -typedef int (*VisPluginCleanupFunc)(VisPluginData *plugin); - -/** - * This is the signature for the event handler within libvisual plugins. An event handler is not mandatory because - * it has no use in some plugin classes but some plugin types require it nonetheless. - * - * @arg plugin Pointer to the VisPluginData instance structure. - * @arg events Pointer to the VisEventQueue that might contain events that need to be handled. - * - * @return 0 on succes -1 on error. - */ -typedef int (*VisPluginEventsFunc)(VisPluginData *plugin, VisEventQueue *events); - -/** - * The VisPluginRef data structure contains information about the plugins - * and does refcounting. It is also used as entries in the plugin registry. - */ -struct _VisPluginRef { - VisObject object; /**< The VisObject data. */ - - char *file; /**< The file location of the plugin. */ - int index; /**< Contains the index number for the entry in the VisPluginInfo table. */ - int usecount; /**< The use count, this indicates how many instances are loaded. */ - VisPluginInfo *info; /**< A copy of the VisPluginInfo structure. */ -}; - -/** - * The VisPluginInfo data structure contains information about a plugin - * and is filled within the plugin itself. - */ -struct _VisPluginInfo { - VisObject object; /**< The VisObject data. */ - - uint32_t struct_size; /**< Struct size, should always be set for compatability checks. */ - uint32_t api_version; /**< API version, compile plugins always with .api_version = VISUAL_PLUGIN_API_VERSION. */ - char *type; /**< Plugin type, in the format of "domain:package:type", as example, - * this could be "Libvisual:core:actor". It's adviced to use the defination macros here - * instead of filling in the string yourself. */ - char *plugname; /**< The plugin name as it's saved in the registry. */ - - char *name; /**< Long name */ - char *author; /**< Author */ - char *version; /**< Version */ - char *about; /**< About */ - char *help; /**< Help */ - - VisPluginInitFunc init; /**< The standard init function, every plugin has to implement this. */ - VisPluginCleanupFunc cleanup; /**< The standard cleanup function, every plugin has to implement this. */ - VisPluginEventsFunc events; /**< The standard event function, implementation is optional. */ - - int flags; /**< Plugin flags from the VisPluginFlags enumerate. */ - - VisObject *plugin; /**< Pointer to the plugin specific data structures. */ -}; - -/** - * The VisPluginData structure is the main plugin structure, every plugin - * is encapsulated in this. - */ -struct _VisPluginData { - VisObject object; /**< The VisObject data. */ - - VisPluginRef *ref; /**< Pointer to the plugin references corresponding to this VisPluginData. */ - - VisPluginInfo *info; /**< Pointer to the VisPluginInfo that is obtained from the plugin. */ - - VisEventQueue eventqueue; /**< The plugin it's VisEventQueue for queueing events. */ - VisParamContainer *params; /**< The plugin it's VisParamContainer in which VisParamEntries can be placed. */ - VisUIWidget *userinterface; /**< The plugin it's top level VisUIWidget, this acts as the container for the - * rest of the user interface. */ - - int plugflags; /**< Plugin flags, currently unused but will be used in the future. */ - - VisRandomContext random; /**< Pointer to the plugin it's private random context. It's highly adviced to use - * the plugin it's randomize functions. The reason is so more advanced apps can - * semi reproduce visuals. */ - - int realized; /**< Flag that indicates if the plugin is realized. */ - void *handle; /**< The dlopen handle */ - VisList environ; /**< Misc environment specific data. */ -}; - -/** - * The VisPluginEnviron is used to setup a pre realize/init environment for plugins. - * Some types of plugins might need this internally and thus this system provides this function. - */ -struct _VisPluginEnviron { - VisObject object; /**< The VisObject data. */ - const char *type; /**< Almost the same as _VisPluginInfo.type. */ - VisObject *environ; /**< VisObject that contains environ specific data. */ -}; - -/** - * The VisActorPlugin structure is the main data structure - * for the actor (visualisation) plugin. - * - * The actor plugin is the visualisation plugin. - */ -struct _VisActorPlugin { - VisObject object; /**< The VisObject data. */ - VisPluginActorRequisitionFunc requisition; /**< The requisition function. This is used to - * get the desired VisVideo surface size of the plugin. */ - VisPluginActorPaletteFunc palette; /**< Used to retrieve the desired palette from the plugin. */ - VisPluginActorRenderFunc render; /**< The main render loop. This is called to draw a frame. */ - - VisSongInfo songinfo; /**< Pointer to VisSongInfo that contains information about - *the current playing song. This can be NULL. */ - - int depth; /**< The depth flag for the VisActorPlugin. This contains an ORred - * value of depths that are supported by the plugin. */ -}; - -/** - * The VisInputPlugin structure is the main data structure - * for the input plugin. - * - * The input plugin is used to retrieve PCM samples from - * certain sources. - */ -struct _VisInputPlugin { - VisObject object; /**< The VisObject data. */ - VisPluginInputUploadFunc upload; /**< The sample upload function. This is the main function - * of the plugin which uploads sample data into - * libvisual. */ -}; - -/** - * The VisMorphPlugin structure is the main data structure - * for the morph plugin. - * - * The morph plugin is capable of morphing between two VisVideo - * sources, and thus is capable of morphing between two - * VisActors. - */ -struct _VisMorphPlugin { - VisObject object; /**< The VisObject data. */ - VisPluginMorphPaletteFunc palette; /**< The plugin's palette function. This can be used - * to obtain a palette for VISUAL_VIDEO_DEPTH_8BIT surfaces. - * However the function may be set to NULL. In this case the - * VisMorph system morphs between palettes itself. */ - VisPluginMorphApplyFunc apply; /**< The plugin it's main function. This is used to morph - * between two VisVideo sources. */ - int depth; /**< The depth flag for the VisMorphPlugin. This contains an ORred - * value of depths that are supported by the plugin. */ - int requests_audio;/**< When set on TRUE this will indicate that the Morph plugin - * requires an VisAudio context in order to render properly. */ -}; - -/** - * The VisTransformPlugin structure is the main data structure - * for the transform plugin. - * - * The transform plugin is used to transform videos and palettes - * and can be used in visualisation pipelines. - */ -struct _VisTransformPlugin { - VisObject object; /**< The VisObject data. */ - VisPluginTransformPaletteFunc palette; /**< Used to transform a VisPalette. Writes directly into the source. */ - VisPluginTransformVideoFunc video; /**< Used to transform a VisVideo. Writes directly into the source. */ - - int depth; /**< The depth flag for the VisActorPlugin. This contains an ORred - * value of depths that are supported by the plugin. */ - int requests_audio;/**< When set on TRUE this will indicate that the Morph plugin - * requires an VisAudio context in order to render properly. */ -}; - - -/* prototypes */ -VisPluginInfo *visual_plugin_info_new (void); -int visual_plugin_info_copy (VisPluginInfo *dest, VisPluginInfo *src); - -int visual_plugin_events_pump (VisPluginData *plugin); -VisEventQueue *visual_plugin_get_eventqueue (VisPluginData *plugin); -int visual_plugin_set_userinterface (VisPluginData *plugin, VisUIWidget *widget); -VisUIWidget *visual_plugin_get_userinterface (VisPluginData *plugin); - -VisPluginInfo *visual_plugin_get_info (VisPluginData *plugin); - -VisParamContainer *visual_plugin_get_params (VisPluginData *plugin); - -VisRandomContext *visual_plugin_get_random_context (VisPluginData *plugin); - -void *visual_plugin_get_specific (VisPluginData *plugin); - -VisPluginRef *visual_plugin_ref_new (void); - -VisPluginData *visual_plugin_new (void); - -VisList *visual_plugin_get_registry (void); -VisList *visual_plugin_registry_filter (VisList *pluglist, const char *domain); - -const char *visual_plugin_get_next_by_name (VisList *list, const char *name); -const char *visual_plugin_get_prev_by_name (VisList *list, const char *name); - -int visual_plugin_unload (VisPluginData *plugin); -VisPluginData *visual_plugin_load (VisPluginRef *ref); -int visual_plugin_realize (VisPluginData *plugin); - -VisPluginRef **visual_plugin_get_references (const char *pluginpath, int *count); -VisList *visual_plugin_get_list (const char **paths); - -VisPluginRef *visual_plugin_find (VisList *list, const char *name); - -int visual_plugin_get_api_version (void); - -VisSongInfo *visual_plugin_actor_get_songinfo (VisActorPlugin *actplugin); - -const char *visual_plugin_type_get_domain (const char *type); -const char *visual_plugin_type_get_package (const char *type); -const char *visual_plugin_type_get_type (const char *type); -VisPluginTypeDepth visual_plugin_type_get_depth (const char *type); -int visual_plugin_type_member_of (const char *domain, const char *type); - -VisPluginEnviron *visual_plugin_environ_new (const char *type, VisObject *environ); -int visual_plugin_environ_add (VisPluginData *plugin, VisPluginEnviron *penve); -int visual_plugin_environ_remove (VisPluginData *plugin, const char *type); -VisObject *visual_plugin_environ_get (VisPluginData *plugin, const char *type); - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _LV_PLUGIN_H */
--- a/libvisual/lv_random.c Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,248 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * Vitaly V. Bursov <vitalyvb@ukr.net> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> - -#include "lv_random.h" - -/* Thanks Burkhard Plaum <plaum@ipf.uni-stuttgart.de> for these values and some other hints */ -#define val_a 1664525L /* As suggested by Knuth */ -#define val_c 1013904223L /* As suggested by H.W. Lewis and is a prime close to 2^32 * (sqrt(5) - 2)) */ - - -/** - * @defgroup VisRandom VisRandom - * @{ - */ - -/** - * Creates a new VisRandomContext data structure. - * - * @param seed The seed to be used to initialize the VisRandomContext with. - * - * @return A newly allocated VisRandomContext, or NULL on failure. - */ -VisRandomContext *visual_random_context_new (uint32_t seed) -{ - VisRandomContext *rcontext; - - rcontext = visual_mem_new0 (VisRandomContext, 1); - - /* Do the VisObject initialization */ - visual_object_initialize (VISUAL_OBJECT (rcontext), TRUE, NULL); - - visual_random_context_set_seed (rcontext, seed); - - return rcontext; -} - -/** - * Set the seed to for a VisRandomContext. - * - * @param rcontext Pointer to the VisRandomContext for which the seed it set. - * @param seed The seed which is set in the VisRandomContext. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_RANDOM_CONTEXT_NULL on failure. - */ -int visual_random_context_set_seed (VisRandomContext *rcontext, uint32_t seed) -{ - visual_log_return_val_if_fail (rcontext != NULL, -VISUAL_ERROR_RANDOM_CONTEXT_NULL); - - rcontext->seed = seed; - rcontext->seed_state = seed; - - return VISUAL_OK; -} - -/** - * Get the seed that has been set to the VisRandomContext. This returns - * the initial seed. Not the state seed. - * - * @see visual_random_context_get_seed_state - * - * @param rcontext The pointer to the VisRandomContext of which the initial random seed is requested. - * - * @return The initial random seed. - */ -uint32_t visual_random_context_get_seed (VisRandomContext *rcontext) -{ - visual_log_return_val_if_fail (rcontext != NULL, 0); - - return rcontext->seed; -} - -/** - * Get the current state seed for the VisRandomContext. - * - * @see visual_random_context_get_seed - * - * @param rcontext The pointer to the VisRandomContext of which the state seed is requested. - * - * @return The current state seed for the randomizer. - */ -uint32_t visual_random_context_get_seed_state (VisRandomContext *rcontext) -{ - visual_log_return_val_if_fail (rcontext != NULL, 0); - - return rcontext->seed_state; -} - -/** - * Gives a random integer using the VisRandomContext as context for the randomizer. - * - * @param rcontext The pointer to the VisRandomContext in which the state of the randomizer is set. - * - * @return A pseudo random integer. - */ -uint32_t visual_random_context_int (VisRandomContext *rcontext) -{ - visual_log_return_val_if_fail (rcontext != NULL, 0); - - return (rcontext->seed_state = val_a * rcontext->seed_state + val_c); -} - -/** - * Gives a random integer ranging between min and max using the VisRandomContext as context - * for the randomizer. - * This function may use floating point instructions. Remeber, this will break - * things if used inside of MMX code. - * - * @param rcontext The pointer to the VisRandomContext in which the state of the randomizer is set. - * @param min The minimum for the output. - * @param max The maximum for the output. - * - * @return A pseudo random integer confirm to the minimum and maximum. - */ -uint32_t visual_random_context_int_range (VisRandomContext *rcontext, int min, int max) -{ -#if VISUAL_RANDOM_FAST_FP_RND - /* Uses fast floating number generator and two divisions elimitated. - * More than 2 times faster than original. - */ - float fm = min; /* +10% speedup... */ - - visual_log_return_val_if_fail (rcontext != NULL, 0); - - return visual_random_context_float (rcontext) * (max - min + 1) + fm; -#else - visual_log_return_val_if_fail (rcontext != NULL, 0); - - return (visual_random_context_int (rcontext) / (VISUAL_RANDOM_MAX / (max - min + 1))) + min; -#endif -} - -/** - * Gives a random double precision floating point value - * using the VisRandomContext as context for the randomizer. - * - * @param rcontext The pointer to the VisRandomContext in which the state of the randomizer is set. - * - * @return A pseudo random integer. - */ -double visual_random_context_double (VisRandomContext *rcontext) -{ -#if VISUAL_RANDOM_FAST_FP_RND - union { - unsigned int i[2]; - double d; - } value; -#endif - uint32_t irnd; - - visual_log_return_val_if_fail (rcontext != NULL, -1); - - irnd = (rcontext->seed_state = val_a * rcontext->seed_state + val_c); -#if VISUAL_RANDOM_FAST_FP_RND - /* This saves floating point division (20 clocks on AXP, - * 38 on P4) and introduces store-to-load data size mismatch penalty - * and substraction op. - * Faster on AXP anyway :) - */ - - value.i[0] = (irnd << 20); - value.i[1] = 0x3ff00000 | (irnd >> 12); - - return value.d - 1.0; -#else - return (double) irnd / VISUAL_RANDOM_MAX; -#endif -} - -/** - * Gives a random single precision floating point value - * using the VisRandomContext as context for the randomizer. - * - * @param rcontext The pointer to the VisRandomContext in which the state of the randomizer is set. - * - * @return A pseudo random integer. - */ -float visual_random_context_float (VisRandomContext *rcontext) -{ -#if VISUAL_RANDOM_FAST_FP_RND - union { - unsigned int i; - float f; - } value; -#endif - uint32_t irnd; - - visual_log_return_val_if_fail (rcontext != NULL, -1); - - irnd = (rcontext->seed_state = val_a * rcontext->seed_state + val_c); -#if VISUAL_RANDOM_FAST_FP_RND - /* Saves floating point division. Introduces substraction. - * Yet faster! :) - */ - - value.i = 0x3f800000 | (t >> 9); - - return value.f - 1.0f; -#else - return (float) irnd / VISUAL_RANDOM_MAX; -#endif -} - -/** - * Function which returns 1 with a propability of p (0.0 <= p <= 1.0) using the VisRandomContext - * as context for the randomizer. - * - * @param rcontext The pointer to the VisRandomContext in which the state of the randomizer is set. - * @param a The float to be used in the decide. - * - * @returns 0 or 1, -VISUAL_ERROR_RANDOM_CONTEXT_NULL on failure. - */ -int visual_random_context_decide (VisRandomContext *rcontext, float a) -{ - visual_log_return_val_if_fail (rcontext != NULL, -VISUAL_ERROR_RANDOM_CONTEXT_NULL); - - return visual_random_context_float (rcontext) <= a; -} - -/** - * @} - */ -
--- a/libvisual/lv_random.h Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,81 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * Vitaly V. Bursov <vitalyvb@ukr.net> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _LV_RANDOM_H -#define _LV_RANDOM_H - -#include <libvisual/lv_common.h> - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#define VISUAL_RANDOMCONTEXT(obj) (VISUAL_CHECK_CAST ((obj), 0, VisRandomContext)) - -/** - * The highest random nummer. - */ -#define VISUAL_RANDOM_MAX 4294967295U - -typedef struct _VisRandomContext VisRandomContext; - -/** - * The VisRandomContext data structure is used to keep track of - * the randomizer it's state. When state tracking is used you need - * to use the visual_random_context_* functions. - */ -struct _VisRandomContext { - VisObject object; /**< The VisObject data. */ - uint32_t seed; /**< The initial random seed. */ - uint32_t seed_state; /**< The current state seed. */ -}; - -/* Non context random macros */ -extern VisRandomContext __lv_internal_random_context; -#define visual_random_set_seed(a) visual_random_context_set_seed(__lv_internal_random_context, a) -#define visual_random_get_seed() visual_random_context_get_seed(__lv_internal_random_context) -#define visual_random_int() visual_random_context_int(__lv_internal_random_context) -#define visual_random_int_range(a, b) visual_random_context_int(__lv_internal_random_context, a, b) -#define visual_random_double () visual_random_context_double(__lv_internal_random_context); -#define visual_random_float () visual_random_context_float(__lv_internal_random_context); -#define visual_random_decide(a) visual_random_int(__lv_internal_random_context, a) - -/* Context management */ -VisRandomContext *visual_random_context_new (uint32_t seed); -int visual_random_context_set_seed (VisRandomContext *rcontext, uint32_t seed); -uint32_t visual_random_context_get_seed (VisRandomContext *rcontext); -uint32_t visual_random_context_get_seed_state (VisRandomContext *rcontext); - -/* Context random functions */ -uint32_t visual_random_context_int (VisRandomContext *rcontext); -uint32_t visual_random_context_int_range (VisRandomContext *rcontext, int min, int max); -double visual_random_context_double (VisRandomContext *rcontext); -float visual_random_context_float (VisRandomContext *rcontext); -int visual_random_context_decide (VisRandomContext *rcontext, float a); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _LV_RANDOM_H */
--- a/libvisual/lv_songinfo.c Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,425 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> - -#include "lv_common.h" -#include "lv_songinfo.h" - -static int songinfo_dtor (VisObject *object) -{ - VisSongInfo *songinfo = VISUAL_SONGINFO (object); - - visual_songinfo_free_strings (songinfo); - - if (songinfo->cover != NULL) - visual_object_unref (VISUAL_OBJECT (songinfo->cover)); - - songinfo->cover = NULL; - - return VISUAL_OK; -} - -/** - * @defgroup VisSongInfo VisSongInfo - * @{ - */ - -/** - * Creates a new VisSongInfo structure. - * - * @param type Type of interface being used. - * - * @return 0 on succes -1 on failure. - */ -VisSongInfo *visual_songinfo_new (VisSongInfoType type) -{ - VisSongInfo *songinfo; - - songinfo = visual_mem_new0 (VisSongInfo, 1); - - /* Do the VisObject initialization */ - visual_object_initialize (VISUAL_OBJECT (songinfo), TRUE, songinfo_dtor); - - songinfo->type = type; - - return songinfo; -} - -/** - * Frees all the strings within the structure. This frees all the - * strings used by the structure. - * - * @param songinfo Pointer to a VisSongInfo of which the strings need to - * freed. - * - * @return 0 on succes -1 on failure. - */ -int visual_songinfo_free_strings (VisSongInfo *songinfo) -{ - visual_log_return_val_if_fail (songinfo != NULL, -VISUAL_ERROR_SONGINFO_NULL); - - if (songinfo->songname != NULL) - visual_mem_free (songinfo->songname); - - if (songinfo->artist != NULL) - visual_mem_free (songinfo->artist); - - if (songinfo->album != NULL) - visual_mem_free (songinfo->album); - - if (songinfo->song != NULL) - visual_mem_free (songinfo->song); - - songinfo->songname = NULL; - songinfo->artist = NULL; - songinfo->album = NULL; - songinfo->song = NULL; - - return VISUAL_OK; -} - -/** - * Sets the interface type to a VisSongInfo. Used to set the interface - * type to the VisSongInfo structure. The interface type defines if we're - * providing a simple string containing the song name or an separated - * set of data containing all the information about a song. - * - * @param songinfo Pointer to a VisSongInfo to which the interface type is set. - * @param type Interface type that is set against the VisSongInfo. - * - * @return 0 on succes -1 on failure. - */ -int visual_songinfo_set_type (VisSongInfo *songinfo, VisSongInfoType type) -{ - visual_log_return_val_if_fail (songinfo != NULL, -VISUAL_ERROR_SONGINFO_NULL); - - songinfo->type = type; - - return VISUAL_OK; -} - -/** - * Sets the length of a song. Used to set the length of a song when the - * advanced interface is being used. - * - * @param songinfo Pointer to a VisSongInfo to which the song length is set. - * @param length The length in seconds. - * - * @return 0 on succes -1 on failure. - */ -int visual_songinfo_set_length (VisSongInfo *songinfo, int length) -{ - visual_log_return_val_if_fail (songinfo != NULL, -VISUAL_ERROR_SONGINFO_NULL); - - songinfo->length = length; - - return VISUAL_OK; -} - -/** - * Sets the elapsed time of a song. Used to set the elapsed time of a song when - * the advanced interface is being used. - * - * @param songinfo Pointer to a VisSongInfo to which the elapsed time is set. - * @param elapsed The elapsed time in seconds. - * - * @return 0 on succes -1 on failure. - */ -int visual_songinfo_set_elapsed (VisSongInfo *songinfo, int elapsed) -{ - visual_log_return_val_if_fail (songinfo != NULL, -VISUAL_ERROR_SONGINFO_NULL); - - songinfo->elapsed = elapsed; - - return VISUAL_OK; -} - -/** - * Sets a simple song name. Used when the simple interface is being used - * to set a song name. - * - * @param songinfo Pointer to a VisSongInfo to which the simple song name is set. - * @param name The simple song name. - * - * @return 0 on succes -1 on failure. - */ -int visual_songinfo_set_simple_name (VisSongInfo *songinfo, char *name) -{ - visual_log_return_val_if_fail (songinfo != NULL, -VISUAL_ERROR_SONGINFO_NULL); - - if (songinfo->songname != NULL) - visual_mem_free (songinfo->songname); - - songinfo->songname = strdup (name); - - return VISUAL_OK; -} - -/** - * Sets the artist name. Used to set the artist name when the advanced - * interface is being used. - * - * @param songinfo Pointer to a VisSongInfo to which the artist name is set. - * @param artist The artist name. - * - * @return 0 on succes -1 on failure. - */ -int visual_songinfo_set_artist (VisSongInfo *songinfo, char *artist) -{ - visual_log_return_val_if_fail (songinfo != NULL, -VISUAL_ERROR_SONGINFO_NULL); - - if (songinfo->artist != NULL) - visual_mem_free (songinfo->artist); - - songinfo->artist = strdup (artist); - - return VISUAL_OK; -} - -/** - * Sets the album name. Used to set the album name when the advanced - * interface is being used. - * - * @param songinfo Pointer to a VisSongInfo to which the album name is set. - * @param album The album name. - * - * @return 0 on succes -1 on failure. - */ -int visual_songinfo_set_album (VisSongInfo *songinfo, char *album) -{ - visual_log_return_val_if_fail (songinfo != NULL, -VISUAL_ERROR_SONGINFO_NULL); - - if (songinfo->album != NULL) - visual_mem_free (songinfo->album); - - songinfo->album = strdup (album); - - return VISUAL_OK; -} - -/** - * Sets the song name. Used to set the song name when the advanced - * interface is being used. - * - * @param songinfo Pointer to a VisSongInfo to which the song name is set. - * @param song The song name. - * - * @return 0 on succes -1 on failure. - */ -int visual_songinfo_set_song (VisSongInfo *songinfo, char *song) -{ - visual_log_return_val_if_fail (songinfo != NULL, -VISUAL_ERROR_SONGINFO_NULL); - - if (songinfo->song != NULL) - visual_mem_free (songinfo->song); - - songinfo->song = strdup (song); - - return VISUAL_OK; -} - -/** - * Sets the cover art. Used to set the cover art when the advanced - * interface is being used. - * - * @param songinfo Pointer to a VisSongInfo to which the cover art is set. - * @param cover Pointer to a VisVideo containing the cover art. - * - * @return 0 on succes -1 on failure. - */ -int visual_songinfo_set_cover (VisSongInfo *songinfo, VisVideo *cover) -{ - VisVideo dtransform; - - visual_log_return_val_if_fail (songinfo != NULL, -VISUAL_ERROR_SONGINFO_NULL); - - if (songinfo->cover != NULL) - visual_object_unref (VISUAL_OBJECT (songinfo->cover)); - - /* The coverart image */ - songinfo->cover = visual_video_new (); - visual_video_set_depth (songinfo->cover, VISUAL_VIDEO_DEPTH_32BIT); - visual_video_set_dimension (songinfo->cover, 64, 64); - visual_video_allocate_buffer (songinfo->cover); - - /* The temp depth transform video */ - memset (&dtransform, 0, sizeof (VisVideo)); - - visual_video_set_depth (&dtransform, VISUAL_VIDEO_DEPTH_32BIT); - visual_video_set_dimension (&dtransform, cover->width, cover->height); - visual_video_allocate_buffer (&dtransform); - - visual_video_depth_transform (&dtransform, cover); - - /* Now scale it */ - /* FIXME make cover image size settable ??? */ - visual_video_scale (songinfo->cover, &dtransform, VISUAL_VIDEO_SCALE_BILINEAR); - - /* Unref the depth transform video */ - visual_object_unref (VISUAL_OBJECT (&dtransform)); - - return VISUAL_OK; -} - -/** - * Resets the age timer. Used to timestamp a song to the current - * time. - * - * @param songinfo Pointer to a VisSongInfo that is timestamped. - * - * @return 0 on succes -1 on failure. - */ -int visual_songinfo_mark (VisSongInfo *songinfo) -{ - visual_log_return_val_if_fail (songinfo != NULL, -VISUAL_ERROR_SONGINFO_NULL); - - visual_timer_start (&songinfo->timer); - - return VISUAL_OK; -} - -/** - * Gives the age of the VisSongInfo. Returns the age in seconds - * stored in a long. - * - * @param songinfo Pointer to a VisSongInfo of which the age is requested. - * - * @return The age in seconds. - */ - -long visual_songinfo_age (VisSongInfo *songinfo) -{ - VisTime cur; - - visual_time_get (&cur); - - /* Clock has been changed into the past */ - if (cur.tv_sec < songinfo->timer.start.tv_sec) - visual_songinfo_mark (songinfo); - - visual_time_difference (&cur, &songinfo->timer.start, &cur); - - return cur.tv_sec; -} - -/** - * Copies the content of a VisSongInfo. Used to copy the content of - * a VisSongInfo in that of another. - * - * @param dest Pointer to the destination VisSongInfo. - * @param src Pointer to the source VisSongInfo. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_SONGINFO_NULL on failure. - */ -int visual_songinfo_copy (VisSongInfo *dest, VisSongInfo *src) -{ - visual_log_return_val_if_fail (dest != NULL, -VISUAL_ERROR_SONGINFO_NULL); - visual_log_return_val_if_fail (src != NULL, -VISUAL_ERROR_SONGINFO_NULL); - - dest->type = src->type; - dest->length = src->length; - dest->elapsed = src->elapsed; - - visual_mem_copy (&dest->timer, &src->timer, sizeof (VisTimer)); - - if (src->songname != NULL) - dest->songname = strdup (src->songname); - - if (src->artist != NULL) - dest->artist = strdup (src->artist); - - if (src->album != NULL) - dest->album = strdup (src->album); - - if (src->song != NULL) - dest->song = strdup (src->song); - - /* Point the coverart VisVideo to that of the original and up it's refcount */ - dest->cover = src->cover; - - if (src->cover != NULL) - visual_object_ref (VISUAL_OBJECT (src->cover)); - - return VISUAL_OK; -} - -/** - * Compares the VisSongInfo strings. Used to compare the content - * of two VisSongInfos by comparing their strings. This can be used - * to detect if there is a song change. - * - * @param s1 Pointer to the first VisSongInfo. - * @param s2 Pointer to the second VisSongInfo. - * - * @return FALSE on different, TRUE on same, -VISUAL_ERROR_SONGINFO_NULL on failure. - */ -int visual_songinfo_compare (VisSongInfo *s1, VisSongInfo *s2) -{ - int diff = 0; - - visual_log_return_val_if_fail (s1 != NULL, -VISUAL_ERROR_SONGINFO_NULL); - visual_log_return_val_if_fail (s2 != NULL, -VISUAL_ERROR_SONGINFO_NULL); - - if (s1->songname != NULL && s2->songname != NULL) { - if (strcmp (s1->songname, s2->songname) != 0) - diff++; - } else if ((s1->songname == NULL || s2->songname == NULL) && - !(s1->songname == NULL && s2->songname == NULL)) { - diff++; - } - - if (s1->artist != NULL && s2->artist != NULL) { - if (strcmp (s1->artist, s2->artist) != 0) - diff++; - } else if ((s1->artist == NULL || s2->artist == NULL) && - !(s1->artist == NULL && s2->artist == NULL)) { - diff++; - } - - if (s1->album != NULL && s2->album != NULL) { - if (strcmp (s1->album, s2->album) != 0) - diff++; - } else if ((s1->album == NULL || s2->album == NULL) && - !(s1->album == NULL && s2->album == NULL)) { - diff++; - } - - if (s1->song != NULL && s2->song != NULL) { - if (strcmp (s1->song, s2->song) != 0) - diff++; - } else if ((s1->song == NULL || s2->song == NULL) && - !(s1->song == NULL && s2->song == NULL)) { - diff++; - } - - return (diff > 0 ? FALSE : TRUE); -} - -/** - * @} - */ -
--- a/libvisual/lv_songinfo.h Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,103 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _LV_SONGINFO_H -#define _LV_SONGINFO_H - -#include <libvisual/lv_time.h> -#include <libvisual/lv_video.h> - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#define VISUAL_SONGINFO(obj) (VISUAL_CHECK_CAST ((obj), 0, VisSongInfo)) - -/** - * Used to define the type of song info being used. - * There are two interfaces to notify libvisual of song - * information, being a simple and a advanced interface. - */ -typedef enum { - VISUAL_SONGINFO_TYPE_NULL, /**< No song info is given. */ - VISUAL_SONGINFO_TYPE_SIMPLE, /**< Simple interface only sets a songname. */ - VISUAL_SONGINFO_TYPE_ADVANCED /**< Advanced interface splits all the stats - * in separated entries */ -} VisSongInfoType; - -typedef struct _VisSongInfo VisSongInfo; - -/** - * Song info data structure. - * - * Contains information about the current played song. Information like - * artist, album, song, elapsed time and even coverart can be set using the - * methods of the VisSongInfo system. - */ -struct _VisSongInfo { - VisObject object; /**< The VisObject data. */ - VisSongInfoType type; /**< Sets the interface type. */ - - /* In seconds */ - int length; /**< Total length of the song playing. */ - int elapsed; /**< Elapsed time of the song playing. */ - - /* Simple type */ - char *songname; /**< A string containing the song name using - * the simple interface. */ - - /* Advanced type */ - char *artist; /**< A string containing the artist name using - * the advanced interface. */ - char *album; /**< A string containing the album name using - * the advanced interface. */ - char *song; /**< A string containing the song name using - * the advanced interface. */ - - /* Timing */ - VisTimer timer; /**< Used to internal timing to keep track on the - * age of the record. */ - /* Cover art */ - VisVideo *cover; /**< Pointer to a VisVideo that contains the cover art. */ -}; - -VisSongInfo *visual_songinfo_new (VisSongInfoType type); -int visual_songinfo_free_strings (VisSongInfo *songinfo); -int visual_songinfo_set_type (VisSongInfo *songinfo, VisSongInfoType type); -int visual_songinfo_set_length (VisSongInfo *songinfo, int length); -int visual_songinfo_set_elapsed (VisSongInfo *songinfo, int elapsed); -int visual_songinfo_set_simple_name (VisSongInfo *songinfo, char *name); -int visual_songinfo_set_artist (VisSongInfo *songinfo, char *artist); -int visual_songinfo_set_album (VisSongInfo *songinfo, char *album); -int visual_songinfo_set_song (VisSongInfo *songinfo, char *song); -int visual_songinfo_set_cover (VisSongInfo *songinfo, VisVideo *cover); -int visual_songinfo_mark (VisSongInfo *songinfo); -long visual_songinfo_age (VisSongInfo *songinfo); -int visual_songinfo_copy (VisSongInfo *dest, VisSongInfo *src); -int visual_songinfo_compare (VisSongInfo *s1, VisSongInfo *s2); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _LV_SONGINFO_H */
--- a/libvisual/lv_thread.c Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,381 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> - -#include "lv_log.h" -#include "lv_thread.h" - -static int __lv_thread_enabled = TRUE; - -/* FIXME add more threading backends here: - * glib (could proof to be a nice fallback when needed) - * native windows (says nuff) - * what is used on Mac os X ? - */ - - -/** - * @defgroup VisThread VisThread - * @{ - */ - -/** - * Enable or disable threading support. This can be used to disallow threads, which might be needed in some environments. - * - * @see visual_thread_is_enabled - * - * @param enabled TRUE to enable threads, FALSE to disable threads. - */ -void visual_thread_enable (int enabled) -{ - __lv_thread_enabled = enabled > 0 ? TRUE : FALSE; -} - -/** - * Request if threads are enabled or not. This function should not be confused with visual_thread_is_supported(). - * - * @return TRUE if enabled, FALSE if disabled. - */ -int visual_thread_is_enabled (void) -{ - return __lv_thread_enabled; -} - -/** - * Is used to check if threading is supported. When threading is used this should always - * be checked, it's possible to disable threads from within the code, so no #ifdefs should - * be used. - * - * @return TRUE if threading is supported or FALSE if not. - */ -int visual_thread_is_supported () -{ -#ifdef VISUAL_HAVE_THREADS -#ifdef VISUAL_THREAD_MODEL_POSIX - return TRUE; -#else /* !VISUAL_THREAD_MODEL_POSIX */ - return FALSE; -#endif -#else - return FALSE; -#endif /* VISUAL_HAVE_THREADS */ -} - -/** - * Creates a new VisThread that is used in threading. - * - * @param func The threading function. - * @param data The private data that is send to the threading function. - * @param joinable Flag that contains whatever the thread can be joined or not. - * - * @return A newly allocated VisThread, or NULL on failure. - */ -VisThread *visual_thread_create (VisThreadFunc func, void *data, int joinable) -{ -#ifdef VISUAL_HAVE_THREADS -#ifdef VISUAL_THREAD_MODEL_POSIX - VisThread *thread; - pthread_attr_t attr; - int res; - - if (visual_thread_is_enabled () == FALSE) - return NULL; - - thread = visual_mem_new0 (VisThread, 1); - - pthread_attr_init(&attr); - - if (joinable == TRUE) - pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_JOINABLE); - else - pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED); - - res = pthread_create (&thread->thread, &attr, func, data); - - pthread_attr_destroy (&attr); - - if (res != 0) { - visual_log (VISUAL_LOG_CRITICAL, "Error while creating thread"); - - visual_mem_free (thread); - - return NULL; - } - - return thread; -#else /* !VISUAL_THREAD_MODEL_POSIX */ - return NULL; -#endif -#else - return NULL; -#endif /* VISUAL_HAVE_THREADS */ -} - -/** - * After a VisThread is not needed anylonger it needs to be freed using this function. - * - * @param thread The VisThread that needs to be freed. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_THREAD_NULL, -VISUAL_ERROR_THREAD_NO_THREADING or - * error values returned by visual_mem_free on failure. - */ -int visual_thread_free (VisThread *thread) -{ -#ifdef VISUAL_HAVE_THREADS - visual_log_return_val_if_fail (thread != NULL, -VISUAL_ERROR_THREAD_NULL); - - return visual_mem_free (thread); -#else - return -VISUAL_ERROR_THREAD_NO_THREADING; -#endif /* VISUAL_HAVE_THREADS */ -} - -/** - * Joins a VisThread with another. - * - * @param thread The VisThread that is about to be joined. - * - * @return Possible result that was passed to visual_thread_exit as retval or - * NULL. - */ -void *visual_thread_join (VisThread *thread) -{ -#ifdef VISUAL_HAVE_THREADS -#ifdef VISUAL_THREAD_MODEL_POSIX - void *result; - - if (thread == NULL) - return NULL; - - if (pthread_join (thread->thread, &result) < 0) { - visual_log (VISUAL_LOG_CRITICAL, "Error while joining thread"); - - return NULL; - } - - return result; -#else /* !VISUAL_THREAD_MODEL_POSIX */ - return NULL; -#endif -#else - return NULL; -#endif /* VISUAL_HAVE_THREADS */ -} - -/** - * Exits a VisThread, this will terminate the thread. - * - * @param retval The return value that is catched by the visual_thread_join function. - */ -void visual_thread_exit (void *retval) -{ -#ifdef VISUAL_HAVE_THREADS -#ifdef VISUAL_THREAD_MODEL_POSIX - pthread_exit (retval); -#else /* !VISUAL_THREAD_MODEL_POSIX */ - -#endif -#endif /* VISUAL_HAVE_THREADS */ -} - -/** - * Yield the current VisThread so another gets time. - */ -void visual_thread_yield () -{ -#ifdef VISUAL_HAVE_THREADS -#ifdef VISUAL_THREAD_MODEL_POSIX - sched_yield (); -#else /* !VISUAL_THREAD_MODEL_POSIX */ - -#endif -#endif /* VISUAL_HAVE_THREADS */ -} - -/** - * Creates a new VisMutex that is used to do thread locking so data can be synchronized. - * - * @return A newly allocated VisMutex that can be used with the visual_mutex_lock and - * visual_mutex_unlock functions or NULL on failure. - */ -VisMutex *visual_mutex_new () -{ -#ifdef VISUAL_HAVE_THREADS -#ifdef VISUAL_THREAD_MODEL_POSIX - VisMutex *mutex; - - if (visual_thread_is_enabled () == FALSE) - return NULL; - - mutex = visual_mem_new0 (VisMutex, 1); - - pthread_mutex_init (&mutex->mutex, NULL); - - return mutex; -#else /* !VISUAL_THREAD_MODEL_POSIX */ - return NULL; -#endif -#else - return NULL; -#endif /* VISUAL_HAVE_THREADS */ -} - -/** - * A VisMutex is allocated to have more flexibility with the actual thread backend. Thus they need - * to be freed as well. - * - * @param mutex Pointer to the VisMutex that needs to be freed. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_MUTEX_NULL or -VISUAL_ERROR_THREAD_NO_THREADING on failure. - */ -int visual_mutex_free (VisMutex *mutex) -{ -#ifdef VISUAL_HAVE_THREADS -#ifdef VISUAL_THREAD_MODEL_POSIX - visual_log_return_val_if_fail (mutex != NULL, -VISUAL_ERROR_MUTEX_NULL); - - return visual_mem_free (mutex); -#else /* !VISUAL_THREAD_MODEL_POSIX */ - return -VISUAL_ERROR_THREAD_NO_THREADING; -#endif -#else - return -VISUAL_ERROR_THREAD_NO_THREADING; -#endif /* VISUAL_HAVE_THREADS */ -} - -/** - * A VisMutex that has not been allocated using visual_mutex_new () can be initialized using this function. You can - * use non allocated VisMutex variables in this context by giving a reference to them. - * - * @param mutex Pointer to the VisMutex which needs to be initialized. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_MUTEX_NULL or -VISUAL_ERROR_THREAD_NO_THREADING on failure. - */ -int visual_mutex_init (VisMutex *mutex) -{ -#ifdef VISUAL_HAVE_THREADS -#ifdef VISUAL_THREAD_MODEL_POSIX - visual_log_return_val_if_fail (mutex != NULL, -VISUAL_ERROR_MUTEX_NULL); - - memset (mutex, 0, sizeof (VisMutex)); - - pthread_mutex_init (&mutex->mutex, NULL); - - return VISUAL_OK; -#else /* !VISUAL_THREAD_MODEL_POSIX */ - return -VISUAL_ERROR_THREAD_NO_THREADING; -#endif -#else - return -VISUAL_ERROR_THREAD_NO_THREADING; -#endif /* VISUAL_HAVE_THREADS */ - -} - -/** - * Locks a VisMutex, with the VisMutex locks checked right, only one thread can access the area at once. - * This will block if the thread is already locked. - * - * @param mutex Pointer to the VisMutex to register the lock. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_MUTEX_NULL, -VISUAL_ERROR_MUTEX_LOCK_FAILURE or - * -VISUAL_ERROR_THREAD_NO_THREADING on failure. - */ -int visual_mutex_lock (VisMutex *mutex) -{ -#ifdef VISUAL_HAVE_THREADS -#ifdef VISUAL_THREAD_MODEL_POSIX - visual_log_return_val_if_fail (mutex != NULL, -VISUAL_ERROR_MUTEX_NULL); - - if (pthread_mutex_lock (&mutex->mutex) < 0) - return -VISUAL_ERROR_MUTEX_LOCK_FAILURE; - - return VISUAL_OK; -#else /* !VISUAL_THREAD_MODEL_POSIX */ - return -VISUAL_ERROR_THREAD_NO_THREADING; -#endif -#else - return -VISUAL_ERROR_THREAD_NO_THREADING; -#endif /* VISUAL_HAVE_THREADS */ -} - -/** - * Tries to lock a VisMutex, however instead of visual_mutex_lock it does not block on failure. but returns - * instead with -VISUAL_ERROR_MUTEX_TRYLOCK_FAILURE as error value. - * - * @param mutex Pointer to the VisMutex that needs to be locked. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_MUTEX_NULL, -VISUAL_ERROR_MUTEX_TRYLOCK_FAILURE or - * -VISUAL_ERROR_THREAD_NO_THREADING on failure. - */ -int visual_mutex_trylock (VisMutex *mutex) -{ -#ifdef VISUAL_HAVE_THREADS -#ifdef VISUAL_THREAD_MODEL_POSIX - visual_log_return_val_if_fail (mutex != NULL, -VISUAL_ERROR_MUTEX_NULL); - - if (pthread_mutex_trylock (&mutex->mutex) < 0) - return -VISUAL_ERROR_MUTEX_TRYLOCK_FAILURE; - - return VISUAL_OK; -#else /* !VISUAL_THREAD_MODEL_POSIX */ - return -VISUAL_ERROR_THREAD_NO_THREADING; -#endif -#else - return -VISUAL_ERROR_THREAD_NO_THREADING; -#endif /* VISUAL_HAVE_THREADS */ -} - -/** - * Unlocks a VisMutex so other threads that use the same lock can now enter the critical area. - * - * @param mutex Pointer to the VisMutex that is unlocked. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_MUTEX_NULL, -VISUAL_ERROR_MUTEX_UNLOCK_FAILURE or - * -VISUAL_ERROR_THREAD_NO_THREADING on failure. - */ -int visual_mutex_unlock (VisMutex *mutex) -{ -#ifdef VISUAL_HAVE_THREADS -#ifdef VISUAL_THREAD_MODEL_POSIX - visual_log_return_val_if_fail (mutex != NULL, -VISUAL_ERROR_MUTEX_NULL); - - if (pthread_mutex_unlock (&mutex->mutex) < 0) - return -VISUAL_ERROR_MUTEX_UNLOCK_FAILURE; - - return VISUAL_OK; -#else /* !VISUAL_THREAD_MODEL_POSIX */ - return -VISUAL_ERROR_THREAD_NO_THREADING; -#endif -#else - return -VISUAL_ERROR_THREAD_NO_THREADING; -#endif /* VISUAL_HAVE_THREADS */ -} - -/** - * @} - */ -
--- a/libvisual/lv_thread.h Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,84 +0,0 @@ -#ifndef _LV_THREAD_H -#define _LV_THREAD_H - -#include <libvisual/lvconfig.h> -#include <libvisual/lv_common.h> - -#ifdef VISUAL_HAVE_THREADS -#ifdef VISUAL_THREAD_MODEL_POSIX -#include <pthread.h> -#else /* !VISUAL_THREAD_MODEL_POSIX */ - -#endif -#endif /* VISUAL_HAVE_THREADS */ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -typedef struct _VisThread VisThread; -typedef struct _VisMutex VisMutex; - -/** - * The function defination for a function that forms the base of a new VisThread when - * visual_thread_create is used. - * - * @see visual_thread_create - * - * @arg data Pointer that can contains the private data from the visual_thread_create function. - * - * @return Pointer to the data when a thread is joined. - */ -typedef void *(*VisThreadFunc)(void *data); - -/** - * The VisThread data structure and the VisThread subsystem is a wrapper system for native - * threading implementations. - */ -struct _VisThread { -#ifdef VISUAL_HAVE_THREADS -#ifdef VISUAL_THREAD_MODEL_POSIX - pthread_t thread; /**< Private used for the pthread implementation. */ -#else /* !VISUAL_THREAD_MODEL_POSIX */ - -#endif -#endif /* VISUAL_HAVE_THREADS */ -}; - -/** - * The VisMutex data structure and the VisMutex subsystem is a wrapper system for native - * thread locking implementations. - */ -struct _VisMutex { -#ifdef VISUAL_HAVE_THREADS -#ifdef VISUAL_THREAD_MODEL_POSIX - pthread_mutex_t mutex; /**< Private used for the pthreads implementation. */ -#else /* !VISUAL_THREAD_MODEL_POSIX */ - -#endif -#endif /* VISUAL_HAVE_THREADS */ -}; - -void visual_thread_enable (int enabled); -int visual_thread_is_enabled (void); - -int visual_thread_is_supported (void); -VisThread *visual_thread_create (VisThreadFunc func, void *data, int joinable); -int visual_thread_free (VisThread *thread); -void *visual_thread_join (VisThread *thread); -void visual_thread_exit (void *retval); -void visual_thread_yield (void); -VisThread *visual_thread_self (void); - -VisMutex *visual_mutex_new (void); -int visual_mutex_free (VisMutex *mutex); -int visual_mutex_init (VisMutex *mutex); -int visual_mutex_lock (VisMutex *mutex); -int visual_mutex_trylock (VisMutex *mutex); -int visual_mutex_unlock (VisMutex *mutex); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _LV_THREAD_H */
--- a/libvisual/lv_time.c Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,362 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <errno.h> -#include <string.h> - -#include "config.h" -#include "lv_common.h" -#include "lv_thread.h" -#include "lv_time.h" - -/** - * @defgroup VisTime VisTime - * @{ - */ - -/** - * Creates a new VisTime structure. - * - * @return A newly allocated VisTime. - */ -VisTime *visual_time_new () -{ - VisTime *time_; - - time_ = visual_mem_new0 (VisTime, 1); - - /* Do the VisObject initialization */ - visual_object_initialize (VISUAL_OBJECT (time_), TRUE, NULL); - - return time_; -} - -/** - * Loads the current time into the VisTime structure. - * - * @param time_ Pointer to the VisTime in which the current time needs to be set. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_TIME_NULL on failure. - */ -int visual_time_get (VisTime *time_) -{ - struct timeval tv; - - visual_log_return_val_if_fail (time_ != NULL, -VISUAL_ERROR_TIME_NULL); - - gettimeofday (&tv, NULL); - - visual_time_set (time_, tv.tv_sec, tv.tv_usec); - - return VISUAL_OK; -} - -/** - * Sets the time by sec, usec in a VisTime structure. - * - * @param time_ Pointer to the VisTime in which the time is set. - * @param sec The seconds. - * @param usec The microseconds. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_TIME_NULL on failure. - */ -int visual_time_set (VisTime *time_, long sec, long usec) -{ - visual_log_return_val_if_fail (time_ != NULL, -VISUAL_ERROR_TIME_NULL); - - time_->tv_sec = sec; - time_->tv_usec = usec; - - return VISUAL_OK; -} - -/** - * Copies ine VisTime into another. - * - * @param dest Pointer to the destination VisTime in which the source VisTime is copied. - * @param src Pointer to the source VisTime that is copied to the destination VisTime. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_TIME_NULL on failure. - */ -int visual_time_copy (VisTime *dest, VisTime *src) -{ - visual_log_return_val_if_fail (dest != NULL, -VISUAL_ERROR_TIME_NULL); - visual_log_return_val_if_fail (src != NULL, -VISUAL_ERROR_TIME_NULL); - - dest->tv_sec = src->tv_sec; - dest->tv_usec = src->tv_usec; - - return VISUAL_OK; -} - -/** - * Calculates the difference between two VisTime structures. - * - * @param dest Pointer to the VisTime that contains the difference between time1 and time2. - * @param time1 Pointer to the first VisTime. - * @param time2 Pointer to the second VisTime from which the first is substracted to generate a result. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_TIME_NULL on failure. - */ -int visual_time_difference (VisTime *dest, VisTime *time1, VisTime *time2) -{ - visual_log_return_val_if_fail (dest != NULL, -VISUAL_ERROR_TIME_NULL); - visual_log_return_val_if_fail (time1 != NULL, -VISUAL_ERROR_TIME_NULL); - visual_log_return_val_if_fail (time2 != NULL, -VISUAL_ERROR_TIME_NULL); - - dest->tv_usec = time2->tv_usec - time1->tv_usec; - dest->tv_sec = time2->tv_sec - time1->tv_sec; - - if (dest->tv_usec < 0) { - dest->tv_usec = VISUAL_USEC_PER_SEC + dest->tv_usec; - dest->tv_sec--; - } - - return VISUAL_OK; -} - -/** - * Sleeps an certain amount of microseconds. - * - * @param microseconds The amount of microseconds we're going to sleep. To sleep a certain amount of - * seconds you can call this function with visual_time_usleep (VISUAL_USEC_PER_SEC * seconds). - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_TIME_NO_USLEEP or -1 on failure. - */ -int visual_time_usleep (unsigned long microseconds) -{ -#ifdef HAVE_NANOSLEEP - struct timespec request, remaining; - request.tv_sec = microseconds / VISUAL_USEC_PER_SEC; - request.tv_nsec = 1000 * (microseconds % VISUAL_USEC_PER_SEC); - while (nanosleep (&request, &remaining) == EINTR) - request = remaining; -#elif HAVE_SELECT - struct timeval tv; - tv.tv_sec = microseconds / VISUAL_USEC_PER_SEC; - tv.tv_usec = microseconds % VISUAL_USEC_PER_SEC; - select (0, NULL, NULL, NULL, &tv); -#elif HAVE_USLEEP - return usleep (microseconds); -#else -#warning visual_time_usleep() will does not work! - return -VISUAL_ERROR_TIME_NO_USLEEP; -#endif - return VISUAL_OK; -} - -/** - * Creates a new VisTimer structure. - * - * @return A newly allocated VisTimer. - */ -VisTimer *visual_timer_new () -{ - VisTimer *timer; - - timer = visual_mem_new0 (VisTimer, 1); - - /* Do the VisObject initialization */ - visual_object_initialize (VISUAL_OBJECT (timer), TRUE, NULL); - - return timer; -} - -/** - * Checks if the timer is active. - * - * @param timer Pointer to the VisTimer of which we want to know if it's active. - * - * @return TRUE or FALSE, -VISUAL_ERROR_TIMER_NULL on failure. - */ -int visual_timer_is_active (VisTimer *timer) -{ - visual_log_return_val_if_fail (timer != NULL, -VISUAL_ERROR_TIMER_NULL); - - return timer->active; -} - -/** - * Starts a timer. - * - * @param timer Pointer to the VisTimer in which we start the timer. - * - * return VISUAL_OK on succes, -VISUAL_ERROR_TIMER_NULL on failure. - */ -int visual_timer_start (VisTimer *timer) -{ - visual_log_return_val_if_fail (timer != NULL, -VISUAL_ERROR_TIMER_NULL); - - visual_time_get (&timer->start); - - timer->active = TRUE; - - return VISUAL_OK; -} - -/** - * Stops a timer. - * - * @param timer Pointer to the VisTimer that is stopped. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_TIMER_NULL on failure. - */ -int visual_timer_stop (VisTimer *timer) -{ - visual_log_return_val_if_fail (timer != NULL, -VISUAL_ERROR_TIMER_NULL); - - visual_time_get (&timer->stop); - - timer->active = FALSE; - - return VISUAL_OK; -} - -/** - * Continues a stopped timer. The timer needs to be stopped before continueing. - * - * @param timer Pointer to the VisTimer that is continued. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_TIMER_NULL on failure. - */ -int visual_timer_continue (VisTimer *timer) -{ - VisTime elapsed; - - visual_log_return_val_if_fail (timer != NULL, -VISUAL_ERROR_TIMER_NULL); - visual_log_return_val_if_fail (timer->active != FALSE, -VISUAL_ERROR_TIMER_NULL); - - visual_time_difference (&elapsed, &timer->start, &timer->stop); - - visual_time_get (&timer->start); - - if (timer->start.tv_usec < elapsed.tv_usec) { - timer->start.tv_usec += VISUAL_USEC_PER_SEC; - timer->start.tv_sec--; - } - - timer->start.tv_sec -= elapsed.tv_sec; - timer->start.tv_usec -= elapsed.tv_usec; - - timer->active = TRUE; - - return VISUAL_OK; -} - -/** - * Retrieve the amount of time passed since the timer has started. - * - * @param timer Pointer to the VisTimer from which we want to know the amount of time passed. - * @param time_ Pointer to the VisTime in which we put the amount of time passed. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_TIMER_NULL or -VISUAL_ERROR_TIME_NULL on failure. - */ -int visual_timer_elapsed (VisTimer *timer, VisTime *time_) -{ - VisTime cur; - - visual_log_return_val_if_fail (timer != NULL, -VISUAL_ERROR_TIMER_NULL); - visual_log_return_val_if_fail (time_ != NULL, -VISUAL_ERROR_TIME_NULL); - - visual_time_get (&cur); - - if (timer->active == TRUE) - visual_time_difference (time_, &timer->start, &cur); - else - visual_time_difference (time_, &timer->start, &timer->stop); - - - return VISUAL_OK; -} - -/** - * Returns the amount of milliseconds passed since the timer has started. - * Be aware to not confuse milliseconds with microseconds. - * - * @param timer Pointer to the VisTimer from which we want to know the amount of milliseconds passed since activation. - * - * @return The amount of milliseconds passed, or -1 on error, this function is not clockscrew safe. - */ -int visual_timer_elapsed_msecs (VisTimer *timer) -{ - VisTime cur; - - visual_log_return_val_if_fail (timer != NULL, -1); - - visual_timer_elapsed (timer, &cur); - - return (cur.tv_sec * 1000) + (cur.tv_usec / 1000); -} - -/** - * Checks if the timer has passed a certain age. - * - * @param timer Pointer to the VisTimer which we check for age. - * @param time_ Pointer to the VisTime containing the age we check against. - * - * @return TRUE on passed, FALSE if not passed, -VISUAL_ERROR_TIMER_NULL or -VISUAL_ERROR_TIME_NULL on failure. - */ -int visual_timer_has_passed (VisTimer *timer, VisTime *time_) -{ - VisTime elapsed; - - visual_log_return_val_if_fail (timer != NULL, -VISUAL_ERROR_TIMER_NULL); - visual_log_return_val_if_fail (time_ != NULL, -VISUAL_ERROR_TIME_NULL); - - visual_timer_elapsed (timer, &elapsed); - - if (time_->tv_sec == elapsed.tv_sec && time_->tv_usec <= elapsed.tv_usec) - return TRUE; - else if (time_->tv_sec < elapsed.tv_sec) - return TRUE; - - return FALSE; -} - -/** - * Checks if the timer has passed a certain age by values. - * - * @param timer Pointer to the VisTimer which we check for age. - * @param sec The number of seconds we check against. - * @param usec The number of microseconds we check against. - * - * @return TRUE on passed, FALSE if not passed, -VISUAL_ERROR_TIMER_NULL on failure. - */ -int visual_timer_has_passed_by_values (VisTimer *timer, long sec, long usec) -{ - VisTime passed; - - visual_log_return_val_if_fail (timer != NULL, -VISUAL_ERROR_TIMER_NULL); - - visual_time_set (&passed, sec, usec); - - return visual_timer_has_passed (timer, &passed); -} - -/** - * @} - */ -
--- a/libvisual/lv_time.h Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,84 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _LV_TIME_H -#define _LV_TIME_H - -#include <sys/time.h> -#include <time.h> - -#include <libvisual/lv_common.h> - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#define VISUAL_USEC_PER_SEC 1000000 - -typedef struct _VisTime VisTime; -typedef struct _VisTimer VisTimer; - -/** - * The VisTime structure can contain seconds and microseconds for timing purpose. - */ -struct _VisTime { - VisObject object; /**< The VisObject data. */ - long tv_sec; /**< seconds. */ - long tv_usec; /**< microseconds. */ -}; - -/** - * The VisTimer structure is used for timing using the visual_timer_* methods. - */ -struct _VisTimer { - VisObject object; /**< The VisObject data. */ - VisTime start; /**< Private entry to indicate the starting point, - * Shouldn't be read for reliable starting point because - * the visual_timer_continue method changes it's value. */ - VisTime stop; /**< Private entry to indicate the stopping point. */ - - int active; /**< Private entry to indicate if the timer is currently active or inactive. */ -}; - -VisTime *visual_time_new (void); -int visual_time_get (VisTime *time_); -int visual_time_set (VisTime *time_, long sec, long usec); -int visual_time_difference (VisTime *dest, VisTime *time1, VisTime *time2); -int visual_time_copy (VisTime *dest, VisTime *src); -int visual_time_usleep (unsigned long microseconds); - -VisTimer *visual_timer_new (void); -int visual_timer_is_active (VisTimer *timer); -int visual_timer_start (VisTimer *timer); -int visual_timer_stop (VisTimer *timer); -int visual_timer_continue (VisTimer *timer); -int visual_timer_elapsed (VisTimer *timer, VisTime *time_); -int visual_timer_elapsed_msecs (VisTimer *timer); -int visual_timer_has_passed (VisTimer *timer, VisTime *time_); -int visual_timer_has_passed_by_values (VisTimer *timer, long sec, long usec); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _LV_TIME_H */
--- a/libvisual/lv_transform.c Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,398 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> - -#include "lvconfig.h" -#include "lv_log.h" -#include "lv_list.h" -#include "lv_transform.h" -#include "lv_mem.h" - -extern VisList *__lv_plugins_transform; - -static int transform_dtor (VisObject *object); - -static VisTransformPlugin *get_transform_plugin (VisTransform *transform); - - -static int transform_dtor (VisObject *object) -{ - VisTransform *transform = VISUAL_TRANSFORM (object); - - if (transform->plugin != NULL) - visual_plugin_unload (transform->plugin); - - transform->plugin = NULL; - - return VISUAL_OK; -} - -static VisTransformPlugin *get_transform_plugin (VisTransform *transform) -{ - VisTransformPlugin *transplugin; - - visual_log_return_val_if_fail (transform != NULL, NULL); - visual_log_return_val_if_fail (transform->plugin != NULL, NULL); - - transplugin = VISUAL_PLUGIN_TRANSFORM (transform->plugin->info->plugin); - - return transplugin; -} - -/** - * @defgroup VisTransform VisTransform - * @{ - */ - -/** - * Gives the encapsulated VisPluginData from a VisTransform. - * - * @param transform Pointer of a VisTransform of which the VisPluginData needs to be returned. - * - * @return VisPluginData that is encapsulated in the VisTransform, possibly NULL. - */ -VisPluginData *visual_transform_get_plugin (VisTransform *transform) -{ - return transform->plugin; -} - -/** - * Gives a list of VisTransforms in the current plugin registry. - * - * @return An VisList containing the VisTransforms in the plugin registry. - */ -VisList *visual_transform_get_list () -{ - return __lv_plugins_transform; -} - -/** - * Gives the next transform plugin based on the name of a plugin. - * - * @see visual_transform_get_prev_by_name - * - * @param name The name of the current plugin, or NULL to get the first. - * - * @return The name of the next plugin within the list. - */ -const char *visual_transform_get_next_by_name (const char *name) -{ - return visual_plugin_get_next_by_name (visual_transform_get_list (), name); -} - -/** - * Gives the previous transform plugin based on the name of a plugin. - * - * @see visual_transform_get_next_by_name - * - * @param name The name of the current plugin. or NULL to get the last. - * - * @return The name of the previous plugin within the list. - */ -const char *visual_transform_get_prev_by_name (const char *name) -{ - return visual_plugin_get_prev_by_name (visual_transform_get_list (), name); -} - -/** - * Checks if the transform plugin is in the registry, based on it's name. - * - * @param name The name of the plugin that needs to be checked. - * - * @return TRUE if found, else FALSE. - */ -int visual_transform_valid_by_name (const char *name) -{ - if (visual_plugin_find (visual_transform_get_list (), name) == NULL) - return FALSE; - else - return TRUE; -} - -/** - * Creates a new transform from name, the plugin will be loaded but won't be realized. - * - * @param transformname - * The name of the plugin to load, or NULL to simply allocate a new - * transform. - * - * @return A newly allocated VisTransform, optionally containing a loaded plugin. Or NULL on failure. - */ -VisTransform *visual_transform_new (const char *transformname) -{ - VisTransform *transform; - VisPluginRef *ref; - - if (__lv_plugins_transform == NULL && transformname != NULL) { - visual_log (VISUAL_LOG_CRITICAL, "the plugin list is NULL"); - return NULL; - } - - transform = visual_mem_new0 (VisTransform, 1); - - /* Do the VisObject initialization */ - visual_object_initialize (VISUAL_OBJECT (transform), TRUE, transform_dtor); - - if (transformname == NULL) - return transform; - - ref = visual_plugin_find (__lv_plugins_transform, transformname); - - transform->plugin = visual_plugin_load (ref); - - return transform; -} - -/** - * Realize the VisTransform. This also calls the plugin init function. - * - * @param transform Pointer to a VisTransform that needs to be realized. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_TRANSFORM_NULL, -VISUAL_ERROR_PLUGIN_NULL or - * error values returned by visual_plugin_realize () on failure. - * - */ -int visual_transform_realize (VisTransform *transform) -{ - visual_log_return_val_if_fail (transform != NULL, -VISUAL_ERROR_TRANSFORM_NULL); - visual_log_return_val_if_fail (transform->plugin != NULL, -VISUAL_ERROR_PLUGIN_NULL); - - return visual_plugin_realize (transform->plugin); -} - -/** - * This function negotiates the VisTransform with it's target video that is set by visual_transform_set_video. - * When needed it also sets up size fitting environment and depth transformation environment. - * - * @param transform Pointer to a VisTransform that needs negotiation. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_TRANSFORM_NULL, -VISUAL_ERROR_PLUGIN_NULL, -VISUAL_ERROR_PLUGIN_REF_NULL - * or -VISUAL_ERROR_TRANSFORM_NEGOTIATE on failure. - */ -int visual_transform_video_negotiate (VisTransform *transform) -{ - int depthflag; - - visual_log_return_val_if_fail (transform != NULL, -VISUAL_ERROR_TRANSFORM_NULL); - visual_log_return_val_if_fail (transform->plugin != NULL, -VISUAL_ERROR_PLUGIN_NULL); - visual_log_return_val_if_fail (transform->plugin->ref != NULL, -VISUAL_ERROR_PLUGIN_REF_NULL); - - depthflag = visual_transform_get_supported_depth (transform); - - if (visual_video_depth_is_supported (depthflag, transform->video->depth) == FALSE) - return -VISUAL_ERROR_TRANSFORM_NEGOTIATE; - - visual_event_queue_add_resize (&transform->plugin->eventqueue, transform->video, - transform->video->width, transform->video->height); - - visual_plugin_events_pump (transform->plugin); - - return -VISUAL_OK; -} - -/** - * Gives the by the plugin natively supported depths - * - * @param transform Pointer to a VisTransform of which the supported depth of it's - * encapsulated plugin is requested. - * - * @return an OR value of the VISUAL_VIDEO_DEPTH_* values which can be checked against using AND on succes, - * -VISUAL_ERROR_TRANSFORM_NULL, -VISUAL_ERROR_PLUGIN_NULL or -VISUAL_ERROR_TRANSFORM_PLUGIN_NULL on failure. - */ -int visual_transform_get_supported_depth (VisTransform *transform) -{ - VisTransformPlugin *transplugin; - - visual_log_return_val_if_fail (transform != NULL, -VISUAL_ERROR_TRANSFORM_NULL); - visual_log_return_val_if_fail (transform->plugin != NULL, -VISUAL_ERROR_PLUGIN_NULL); - - transplugin = get_transform_plugin (transform); - - if (transplugin == NULL) - return -VISUAL_ERROR_TRANSFORM_PLUGIN_NULL; - - return transplugin->depth; -} - -/** - * Used to connect the target display it's VisVideo structure to the VisTransform. - * - * Using the visual_video methods the screenbuffer, it's depth and dimension and optionally it's pitch - * can be set so the transform plugins know about their graphical environment and have a place to draw. - * - * After this function it's most likely that visual_transform_video_negotiate needs to be called. - * - * @see visual_video_new - * @see visual_transform_video_negotiate - * - * @param transform Pointer to a VisTransform to which the VisVideo needs to be set. - * @param video Pointer to a VisVideo which contains information about the target display and the pointer - * to it's screenbuffer. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_TRANSFORM_NULL on failure. - */ -int visual_transform_set_video (VisTransform *transform, VisVideo *video) -{ - visual_log_return_val_if_fail (transform != NULL, -VISUAL_ERROR_TRANSFORM_NULL); - - transform->video = video; - - if (video != NULL) - transform->pal = video->pal; - else - transform->pal = NULL; - - return VISUAL_OK; -} - -/** - * Used to override the palette that is extracted from the VisVideo that is given using - * visual_transform_set_video. Always call this function after visual_transform_set_video is called. - * - * @see visual_transform_set_video - * - * @param transform Pointer to a VisTransform to which the VisVideo needs to be set. - * @param palette Pointer to the VisPalette which is used to override the palette in the VisTransform. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_TRANSFORM_NULL on failure. - */ -int visual_transform_set_palette (VisTransform *transform, VisPalette *palette) -{ - visual_log_return_val_if_fail (transform != NULL, -VISUAL_ERROR_TRANSFORM_NULL); - - transform->pal = palette; - - return VISUAL_OK; -} - - -/** - * This is called to run a VisTransform. - * - * @see visual_transform_run_video - * @see visual_transform_run_palette - * - * @param transform Pointer to a VisTransform that needs to be runned. - * @param audio Pointer to a VisAudio that contains all the audio data. - * - * return VISUAL_OK on succes, -VISUAL_ERROR_TRANSFORM_NULL or error values returned by - * either visual_transform_run_video or visual_transform_run_palette on failure. - */ -int visual_transform_run (VisTransform *transform, VisAudio *audio) -{ - int ret; - visual_log_return_val_if_fail (transform != NULL, -VISUAL_ERROR_TRANSFORM_NULL); - - if (transform->video != NULL) { - if ((ret = visual_transform_run_video (transform, audio)) != VISUAL_OK) - return ret; - } - - if (transform->pal != NULL) { - if ((ret = visual_transform_run_palette (transform, audio)) != VISUAL_OK) - return ret; - } - - return VISUAL_OK; -} - -/** - * This is called to run the video part of a VisTransform. - * - * @see visual_transform_run - * - * @param transform Pointer to a VisTransform that needs to be runned. - * @param audio Pointer to a VisAudio that contains all the audio data. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_TRANSFORM_NULL, -VISUAL_ERROR_TRANSFORM_VIDEO_NULL - * or -VISUAL_ERROR_TRANSFORM_PLUGIN_NULL on failure. - */ -int visual_transform_run_video (VisTransform *transform, VisAudio *audio) -{ - VisTransformPlugin *transplugin; - VisPluginData *plugin; - - visual_log_return_val_if_fail (transform != NULL, -VISUAL_ERROR_TRANSFORM_NULL); - visual_log_return_val_if_fail (transform->video != NULL, -VISUAL_ERROR_TRANSFORM_VIDEO_NULL); - - transplugin = get_transform_plugin (transform); - plugin = visual_transform_get_plugin (transform); - - if (transplugin == NULL) { - visual_log (VISUAL_LOG_CRITICAL, - "The given transform does not reference any transform plugin"); - - return -VISUAL_ERROR_TRANSFORM_PLUGIN_NULL; - } - - visual_plugin_events_pump (plugin); - - transplugin->video (plugin, transform->video, audio); - - return VISUAL_OK; -} - -/** - * This is called to run the palette part of a VisTransform. - * - * @see visual_transform_run - * - * @param transform Pointer to a VisTransform that needs to be runned. - * @param audio Pointer to a VisAudio that contains all the audio data. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_TRANSFORM_NULL, -VISUAL_ERROR_TRANSFORM_PALETTE_NULL - * or -VISUAL_ERROR_TRANSFORM_PLUGIN_NULL on failure. - */ -int visual_transform_run_palette (VisTransform *transform, VisAudio *audio) -{ - VisTransformPlugin *transplugin; - VisPluginData *plugin; - - visual_log_return_val_if_fail (transform != NULL, -VISUAL_ERROR_TRANSFORM_NULL); - visual_log_return_val_if_fail (transform->pal != NULL, -VISUAL_ERROR_TRANSFORM_PALETTE_NULL); - - transplugin = get_transform_plugin (transform); - plugin = visual_transform_get_plugin (transform); - - if (transplugin == NULL) { - visual_log (VISUAL_LOG_CRITICAL, - "The given transform does not reference any transform plugin"); - - return -VISUAL_ERROR_TRANSFORM_PLUGIN_NULL; - } - - visual_plugin_events_pump (plugin); - - transplugin->palette (plugin, transform->pal, audio); - - return VISUAL_OK; -} - -/** - * @} - */ -
--- a/libvisual/lv_transform.h Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,89 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _LV_TRANSFORM_H -#define _LV_TRANSFORM_H - -#include <libvisual/lv_audio.h> -#include <libvisual/lv_video.h> -#include <libvisual/lv_palette.h> -#include <libvisual/lv_plugin.h> -#include <libvisual/lv_songinfo.h> -#include <libvisual/lv_event.h> - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#define VISUAL_TRANSFORM(obj) (VISUAL_CHECK_CAST ((obj), 0, VisTransform)) - -typedef struct _VisTransform VisTransform; - -/** - * The VisTransform structure encapsulates the transform plugin and provides - * abstract interfaces to the transform. - * - * Members in the structure shouldn't be accessed directly but instead - * it's adviced to use the methods provided. - * - * @see visual_transform_new - */ -struct _VisTransform { - VisObject object; /**< The VisObject data. */ - - VisPluginData *plugin; /**< Pointer to the plugin itself. */ - - /* Video management and fake environments when needed */ - VisVideo *video; /**< Pointer to the target display video. - * @see visual_transform_set_video */ - VisPalette *pal; /**< Pointer to the VisPalette that is to be transformed. - * @see visual_transform_set_palette */ -}; - -/* prototypes */ -VisPluginData *visual_transform_get_plugin (VisTransform *transform); - -VisList *visual_transform_get_list (void); -const char *visual_transform_get_next_by_name (const char *name); -const char *visual_transform_get_prev_by_name (const char *name); -int visual_transform_valid_by_name (const char *name); - -VisTransform *visual_transform_new (const char *transformname); - -int visual_transform_realize (VisTransform *transform); - -int visual_transform_video_negotiate (VisTransform *transform); -int visual_transform_get_supported_depth (VisTransform *transform); - -int visual_transform_set_video (VisTransform *transform, VisVideo *video); -int visual_transform_set_palette (VisTransform *transform, VisPalette *palette); - -int visual_transform_run (VisTransform *transform, VisAudio *audio); -int visual_transform_run_video (VisTransform *transform, VisAudio *audio); -int visual_transform_run_palette (VisTransform *transform, VisAudio *audio); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _LV_TRANSFORM_H */
--- a/libvisual/lv_types.h Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,51 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _LV_TYPES_H -#define _LV_TYPES_H - -#include <sys/types.h> - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#define VISUAL_CHECK_CAST(uiobj, cast_type, cast) ((cast*) (uiobj)) - -#ifndef uint8_t -#define uint8_t u_int8_t -#endif - -#ifndef uint16_t -#define uint16_t u_int16_t -#endif - -#ifndef uint32_t -#define uint32_t u_int32_t -#endif - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _LV_TYPES_H */
--- a/libvisual/lv_ui.c Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1169 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <errno.h> -#include <string.h> - -#include "lv_log.h" -#include "lv_ui.h" - -static int box_dtor (VisObject *object); -static int table_dtor (VisObject *object); -static int table_entry_dtor (VisObject *object); -static int frame_dtor (VisObject *object); -static int choice_dtor (VisObject *object); -static int widget_dtor (VisObject *object); - -static int box_dtor (VisObject *object) -{ - VisUIBox *box = VISUAL_UI_BOX (object); - - visual_list_destroy_elements (&box->childs); - - widget_dtor (object); - - return VISUAL_OK; -} - -static int table_dtor (VisObject *object) -{ - VisUITable *table = VISUAL_UI_TABLE (object); - - visual_list_destroy_elements (&table->childs); - - widget_dtor (object); - - return VISUAL_OK; -} - -static int table_entry_dtor (VisObject *object) -{ - VisUITableEntry *tentry = VISUAL_UI_TABLE_ENTRY (object); - - if (tentry->widget != NULL) - visual_object_unref (VISUAL_OBJECT (tentry->widget)); - - tentry->widget = NULL; - - return VISUAL_OK; -} - -static int frame_dtor (VisObject *object) -{ - VisUIContainer *container = VISUAL_UI_CONTAINER (object); - - if (container->child != NULL) - visual_object_unref (VISUAL_OBJECT (container->child)); - - container->child = NULL; - - widget_dtor (object); - - return VISUAL_OK; -} - - -static int choice_dtor (VisObject *object) -{ - visual_ui_choice_free_choices (VISUAL_UI_CHOICE (object)); - - widget_dtor (object); - - return VISUAL_OK; -} - -static int widget_dtor (VisObject *object) -{ - VisUIWidget *widget = VISUAL_UI_WIDGET (object); - - if (widget->tooltip != NULL) - visual_mem_free ((char *) widget->tooltip); - - widget->tooltip = NULL; - - return VISUAL_OK; -} - -/** - * @defgroup VisUI VisUI - * @{ - */ - -/** - * Creates a new VisUIWidget structure. - * - * @return A newly allocated VisUIWidget, or NULL on failure. - */ -VisUIWidget *visual_ui_widget_new () -{ - VisUIWidget *widget; - - widget = visual_mem_new0 (VisUIWidget, 1); - widget->type = VISUAL_WIDGET_TYPE_NULL; - - /* Do the VisObject initialization */ - visual_object_initialize (VISUAL_OBJECT (widget), TRUE, widget_dtor); - - visual_ui_widget_set_size_request (VISUAL_UI_WIDGET (widget), -1, -1); - - return widget; -} - -/** - * Sets a request for size to a VisUIWidget, to be used to request a certain dimension. - * - * @param widget Pointer to the VisUIWidget to which the size request is set. - * @param width The width in pixels of the size requested. - * @param height The height in pixels of the size requested. - * - * @return VISUAL_OK on succes, or -VISUAL_ERROR_UI_WIDGET_NULL on failure. - */ -int visual_ui_widget_set_size_request (VisUIWidget *widget, int width, int height) -{ - visual_log_return_val_if_fail (widget != NULL, -VISUAL_ERROR_UI_WIDGET_NULL); - - widget->width = width; - widget->height = height; - - return VISUAL_OK; -} - -/** - * Sets a tooltip to a VisUIWidget. - * - * @param widget Pointer to the VisUIWidget to which the tooltip is set. - * @param tooltip A string containing the tooltip text. - * - * @return VISUAL_OK on succes, or -VISUAL_ERROR_UI_WIDGET_NULL on failure. - */ -int visual_ui_widget_set_tooltip (VisUIWidget *widget, const char *tooltip) -{ - visual_log_return_val_if_fail (widget != NULL, -VISUAL_ERROR_UI_WIDGET_NULL); - - if (widget->tooltip != NULL) - visual_mem_free ((char *) widget->tooltip); - - widget->tooltip = strdup (tooltip); - - return VISUAL_OK; -} - -/** - * Retrieves the tooltip that is set to a VisUIWidget. - * - * @param widget Pointer to the VisUIWidget from which the tooltip is requested. - * - * @return The tooltip, possibly NULL, NULL on failure. - */ -const char *visual_ui_widget_get_tooltip (VisUIWidget *widget) -{ - visual_log_return_val_if_fail (widget != NULL, NULL); - - return widget->tooltip; -} - -/** - * Gets the top VisUIWidget from a VisUIWidget, this means that it will retrieve - * the widget that is the parent of all underlaying widgets. - * - * @param widget Pointer to the VisUIWidget of which we want to have the top VisUIWidget. - * - * @return Pointer to the top VisUIWidget, or NULL on failure. - */ -VisUIWidget *visual_ui_widget_get_top (VisUIWidget *widget) -{ - VisUIWidget *above; - VisUIWidget *prev = widget; - - visual_log_return_val_if_fail (widget != NULL, NULL); - - while ((above = visual_ui_widget_get_parent (widget)) != NULL) { - prev = widget; - } - - return prev; -} - -/** - * Gets the parent VisUIWidget from a VisUIWidget, this retrieves the parent of the given - * widget. - * - * @param widget Pointer to the VisUIWidget of which the parent is requested. - * - * @return Pointer to the parent VisUIWidget, or NULL on failure. - */ -VisUIWidget *visual_ui_widget_get_parent (VisUIWidget *widget) -{ - visual_log_return_val_if_fail (widget != NULL, NULL); - - return widget->parent; -} - -/** - * Gets the VisUIWidgetType type from a VisUIWidget, this contains what kind of widget the given - * VisUIWidget is. - * - * @param widget Pointer to the VisUIWidget of which the type is requested. - * - * @return The VisUIWidgetType of the given VisUIWidget. - */ -VisUIWidgetType visual_ui_widget_get_type (VisUIWidget *widget) -{ - visual_log_return_val_if_fail (widget != NULL, VISUAL_WIDGET_TYPE_NULL); - - return widget->type; -} - -/** - * Adds a VisUIWidget to a VisUIContainer. - * - * @see visual_ui_box_pack - * @see visual_ui_table_attach - * - * @param container Pointer to the VisUIContainer in which a VisUIWidget is put. - * @param widget Pointer to the VisUIWidget that is been put in the VisUIContainer. - * - * @return VISUAL_OK on succes, or -VISUAL_ERROR_UI_CONTAINER_NULL, -VISUAL_ERROR_UI_WIDGET_NULL on failure. - */ -int visual_ui_container_add (VisUIContainer *container, VisUIWidget *widget) -{ - visual_log_return_val_if_fail (container != NULL, -VISUAL_ERROR_UI_CONTAINER_NULL); - visual_log_return_val_if_fail (widget != NULL, -VISUAL_ERROR_UI_WIDGET_NULL); - - container->child = widget; - - return VISUAL_OK; -} - -/** - * Gets the child VisUIWidget from a VisUIContainer. - * - * @param container Pointer to the VisUIContainer of which we want the child VisUIWidget. - * - * @return The child VisUIWidget, or NULL on failure. - */ -VisUIWidget *visual_ui_container_get_child (VisUIContainer *container) -{ - visual_log_return_val_if_fail (container != NULL, NULL); - - return container->child; -} - -/** - * Creates a new VisUIBox, that can be used to pack VisUIWidgets in. - * - * @param orient Indicates the orientation style of the box, being either - * VISUAL_ORIENT_TYPE_HORIZONTAL or VISUAL_ORIENT_TYPE_VERTICAL. - * - * @return The newly created VisUIBox in the form of a VisUIWidget. - */ -VisUIWidget *visual_ui_box_new (VisUIOrientType orient) -{ - VisUIBox *box; - - box = visual_mem_new0 (VisUIBox, 1); - - /* Do the VisObject initialization */ - visual_object_initialize (VISUAL_OBJECT (box), TRUE, box_dtor); - - VISUAL_UI_WIDGET (box)->type = VISUAL_WIDGET_TYPE_BOX; - - box->orient = orient; - - visual_ui_widget_set_size_request (VISUAL_UI_WIDGET (box), -1, -1); - - visual_list_set_destroyer (&box->childs, visual_object_list_destroyer); - - return VISUAL_UI_WIDGET (box); -} - -/** - * Packs VisUIWidgets into a VisUIBox, this can be used to pack widgets either vertically or horizontally, - * depending on the type of box. - * - * @param box Pointer to the VisUIBox in which the widget is packed. - * @param widget Pointer to the VisUIWidget which is packed in the box. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_UI_BOX_NULL, -VISUAL_ERROR_UI_WIDGET_NULL or - * error values returned by visual_list_add () on failure. - */ -int visual_ui_box_pack (VisUIBox *box, VisUIWidget *widget) -{ - visual_log_return_val_if_fail (box != NULL, -VISUAL_ERROR_UI_BOX_NULL); - visual_log_return_val_if_fail (widget != NULL, -VISUAL_ERROR_UI_WIDGET_NULL); - - return visual_list_add (&box->childs, widget); -} - -/** - * Retrieve a VisList of VisUIWidget elements, being the childs of the VisUIBox. - * - * @param box Pointer to the VisUIBox from which the childs are requested. - * - * @return VisList containing the childs of the VisUIBox or NULL on failure. - */ -VisList *visual_ui_box_get_childs (VisUIBox *box) -{ - VisUIWidget *next; - VisListEntry *le = NULL; - - visual_log_return_val_if_fail (box != NULL, NULL); - - return &box->childs; -} - -/** - * Get the VisUIOrientType value from a VisUIBox. - * - * @param box VisUIBox from which the VisUIOrientType is requested. - * - * @return VisUIOrientType containing the orientation style for this VisUIBox. - */ -VisUIOrientType visual_ui_box_get_orient (VisUIBox *box) -{ - visual_log_return_val_if_fail (box != NULL, VISUAL_ORIENT_TYPE_NONE); - - return box->orient; -} - -/** - * Creates a new VisUITable, that can be used to attach VisUIWidgets to cells in the table. - * - * @param rows The number of rows in the table. - * @param cols The number of columns in the table. - * - * @return The newly created VisUITable in the form of a VisUIWidget. - */ -VisUIWidget *visual_ui_table_new (int rows, int cols) -{ - VisUITable *table; - - table = visual_mem_new0 (VisUITable, 1); - - /* Do the VisObject initialization */ - visual_object_initialize (VISUAL_OBJECT (table), TRUE, table_dtor); - - VISUAL_UI_WIDGET (table)->type = VISUAL_WIDGET_TYPE_TABLE; - - table->rows = rows; - table->cols = cols; - - visual_ui_widget_set_size_request (VISUAL_UI_WIDGET (table), -1, -1); - - visual_list_set_destroyer (&table->childs, visual_object_list_destroyer); - - return VISUAL_UI_WIDGET (table); -} - -/** - * Creates a new VisUITableEntry. You probably never need this function, but it's used internally. - * - * @param widget Pointer to the VisUIWidget of which a VisUITableEntry is created. - * @param row The row this entry will be placed. - * @param col The column this entry will be placed. - * - * @return A newly allocated VisUITableEntry, NULL on failure. - */ -VisUITableEntry *visual_ui_table_entry_new (VisUIWidget *widget, int row, int col) -{ - VisUITableEntry *tentry; - - visual_log_return_val_if_fail (widget != NULL, NULL); - - tentry = visual_mem_new0 (VisUITableEntry, 1); - - /* Do the VisObject initialization */ - visual_object_initialize (VISUAL_OBJECT (tentry), TRUE, table_entry_dtor); - - tentry->row = row; - tentry->col = col; - - tentry->widget = widget; - - return tentry; -} - -/** - * Attaches a VisUIWidget to a cell within a VisUITable. - * - * @param table Pointer to the VisUITable to which a VisUiWidget is attached. - * @param widget Pointer to the VisUIWidget that is being attached to the VisUITable. - * @param row The row number starting at 0. - * @param col The column number starting at 0. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_UI_TABLE_NULL, -VISUAL_ERROR_UI_WIDGET_NULL or - * error values returned by visual_list_add () on failure. - */ -int visual_ui_table_attach (VisUITable *table, VisUIWidget *widget, int row, int col) -{ - VisUITableEntry *tentry; - - visual_log_return_val_if_fail (table != NULL, -VISUAL_ERROR_UI_TABLE_NULL); - visual_log_return_val_if_fail (widget != NULL, -VISUAL_ERROR_UI_WIDGET_NULL); - - tentry = visual_ui_table_entry_new (widget, row, col); - - return visual_list_add (&table->childs, tentry); -} - -/** - * Retrieve a VisList containing VisUITableEntry elements, in which the child VisUIWidget and it's place - * in the VisUITable is stored. - * - * @param table Pointer to the VisUITable from which the childs are requested. - * - * @return VisList containing the childs of the VisUITable, or NULL on failure. - */ -VisList *visual_ui_table_get_childs (VisUITable *table) -{ - visual_log_return_val_if_fail (table != NULL, NULL); - - return &table->childs; -} - -/** - * Creates a new VisUIFrame, which can be used to put a frame around a VisUIWidget. - * - * @param name The name of this frame. - * - * @return The newly created VisUIFrame in the form of a VisUIWidget. - */ -VisUIWidget *visual_ui_frame_new (const char *name) -{ - VisUIFrame *frame; - - frame = visual_mem_new0 (VisUIFrame, 1); - - /* Do the VisObject initialization */ - visual_object_initialize (VISUAL_OBJECT (frame), TRUE, frame_dtor); - - VISUAL_UI_WIDGET (frame)->type = VISUAL_WIDGET_TYPE_FRAME; - - frame->name = name; - - visual_ui_widget_set_size_request (VISUAL_UI_WIDGET (frame), -1, -1); - - return VISUAL_UI_WIDGET (frame); -} - -/** - * Creates a new VisUILabel, which can be used as a one line piece of text in an user interface. - * - * @param text Text of which the label consists. - * @param bold Flag that indicates if a label should be drawn bold or not. - * - * @return The newly created VisUILabel in the form of a VisUIWidget. - */ -VisUIWidget *visual_ui_label_new (const char *text, int bold) -{ - VisUILabel *label; - - label = visual_mem_new0 (VisUILabel, 1); - - /* Do the VisObject initialization */ - visual_object_initialize (VISUAL_OBJECT (label), TRUE, widget_dtor); - - VISUAL_UI_WIDGET (label)->type = VISUAL_WIDGET_TYPE_LABEL; - - label->text = text; - label->bold = bold; - - visual_ui_widget_set_size_request (VISUAL_UI_WIDGET (label), -1, -1); - - return VISUAL_UI_WIDGET (label); -} - -/** - * Sets the bold flag for a VisUILabel. - * - * @param label Pointer to the VisUILabel of which the bold flag is set, or unset. - * @param bold Flag that indicates if a label should be drawn bold or not. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_UI_LABEL_NULL on failure. - */ -int visual_ui_label_set_bold (VisUILabel *label, int bold) -{ - visual_log_return_val_if_fail (label != NULL, -VISUAL_ERROR_UI_LABEL_NULL); - - label->bold = bold; - - return VISUAL_OK; -} - -/** - * Sets the text for a VisUILabel. - * - * @param label Pointer to the VisUILabel to which text is being set. - * @param text The text that is being set to the VisUILabel. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_UI_LABEL_NULL on failure. - */ -int visual_ui_label_set_text (VisUILabel *label, const char *text) -{ - visual_log_return_val_if_fail (label != NULL, -VISUAL_ERROR_UI_LABEL_NULL); - - label->text = text; - - return VISUAL_OK; -} - -/** - * Retrieve the text from a VisUILabel. - * - * @param label Pointer to the VisUILabel from which the text is being requested. - * - * return The text contained in the label, NULL on failure. - */ -const char *visual_ui_label_get_text (VisUILabel *label) -{ - visual_log_return_val_if_fail (label != NULL, NULL); - - return label->text; -} - -/** - * Creates a new VisUIImage, which can contain an image, loaded from a VisVideo. - * - * @param video The VisVideo containing the image to be displayed. - * - * @return The newly created VisUIImage in the form of a VisUIWidget. - */ -VisUIWidget *visual_ui_image_new (VisVideo *video) -{ - VisUIImage *image; - - image = visual_mem_new0 (VisUIImage, 1); - - /* Do the VisObject initialization */ - visual_object_initialize (VISUAL_OBJECT (image), TRUE, widget_dtor); - - VISUAL_UI_WIDGET (image)->type = VISUAL_WIDGET_TYPE_IMAGE; - - image->image = video; - - visual_ui_widget_set_size_request (VISUAL_UI_WIDGET (image), -1, -1); - - return VISUAL_UI_WIDGET (image); -} - -/** - * Sets a VisVideo to a VisUIImage. The VisVideo contains the content of the image. - * - * @param image Pointer to the VisUIImage to which the VisVideo is set. - * @param video Pointer to the VisVideo that is set to the VisUIImage. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_UI_IMAGE_NULL on failure. - */ -int visual_ui_image_set_video (VisUIImage *image, VisVideo *video) -{ - visual_log_return_val_if_fail (image != NULL, -VISUAL_ERROR_UI_IMAGE_NULL); - - image->image = video; - - return VISUAL_OK; -} - -/** - * Retrieves the VisVideo from a VisUIImage. - * - * @param image Pointer to the VisUIImage from which the VisVideo is requested. - * - * return The VisVideo that is connected to the VisUIImage. - */ -VisVideo *visual_ui_image_get_video (VisUIImage *image) -{ - visual_log_return_val_if_fail (image != NULL, NULL); - - return image->image; -} - -/** - * Creates a new VisUISeparator, which can function as a separation item between other VisUIWidgets. - * - * @param orient Indicates the orientation style of the separator, being either - * VISUAL_ORIENT_TYPE_HORIZONTAL or VISUAL_ORIENT_TYPE_VERTICAL. - * - * @return The newly created VisUISeparator in the form of a VisUIWidget. - */ -VisUIWidget *visual_ui_separator_new (VisUIOrientType orient) -{ - VisUISeparator *separator; - - separator = visual_mem_new0 (VisUISeparator, 1); - - /* Do the VisObject initialization */ - visual_object_initialize (VISUAL_OBJECT (separator), TRUE, widget_dtor); - - VISUAL_UI_WIDGET (separator)->type = VISUAL_WIDGET_TYPE_SEPARATOR; - - separator->orient = orient; - - visual_ui_widget_set_size_request (VISUAL_UI_WIDGET (separator), -1, -1); - - return VISUAL_UI_WIDGET (separator); -} - -/** - * Get the VisUIOrientType value from a VisUISeparator. - * - * @param separator VisUISeparator from which the VisUIOrientType is requested. - * - * @return VisUIOrientType containing the orientation style for this VisUISeparator. - */ -VisUIOrientType visual_ui_separator_get_orient (VisUISeparator *separator) -{ - visual_log_return_val_if_fail (separator != NULL, VISUAL_ORIENT_TYPE_NONE); - - return separator->orient; -} - -/** - * Links a VisParamEntry to a VisUIMutator type. - * - * @param mutator Pointer to the VisUIMutator to which the VisParamEntry is linked. - * @param param Pointer to the VisParamEntry that is linked to the VisUIMutator. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_UI_MUTATOR_NULL or -VISUAL_ERROR_PARAM_NULL on failure. - */ -int visual_ui_mutator_set_param (VisUIMutator *mutator, VisParamEntry *param) -{ - visual_log_return_val_if_fail (mutator != NULL, -VISUAL_ERROR_UI_MUTATOR_NULL); - visual_log_return_val_if_fail (param != NULL, -VISUAL_ERROR_PARAM_NULL); - - /* FIXME Check if param is valid with mutator type, if not, give a critical */ - - mutator->param = param; - - return VISUAL_OK; -} - -/** - * Request the VisParamEntry that is linked to a VisUIMutator. - * - * @param mutator Pointer to the VisUIMutator from which the VisParamEntry is requested. - * - * return The VisParamEntry that links to the VisUIMutator, or NULL on failure. - */ -VisParamEntry *visual_ui_mutator_get_param (VisUIMutator *mutator) -{ - visual_log_return_val_if_fail (mutator != NULL, NULL); - - return mutator->param; -} - -/** - * Set the properties for a VisUIRange. - * - * @param range Pointer to the VisUIRange to which the properties are set. - * @param min The minimal value. - * @param max The maximal value. - * @param step The increase/decrease step value. - * @param precision The precision in numbers behind the comma. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_UI_RANGE_NULL on failure. - */ -int visual_ui_range_set_properties (VisUIRange *range, double min, double max, double step, int precision) -{ - visual_log_return_val_if_fail (range != NULL, -VISUAL_ERROR_UI_RANGE_NULL); - - range->min = min; - range->max = max; - range->step = step; - range->precision = precision; - - return VISUAL_OK; -} - -/** - * Sets the maximal value for a VisUIRange. - * - * @param range Pointer to the VisUIRange to which the maximum value is set. - * @param max The maximal value. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_UI_RANGE_NULL on failure. - */ -int visual_ui_range_set_max (VisUIRange *range, double max) -{ - visual_log_return_val_if_fail (range != NULL, -VISUAL_ERROR_UI_RANGE_NULL); - - range->max = max; - - return VISUAL_OK; -} - -/** - * Sets the minimal value for a VisUIRange. - * - * @param range Pointer to the VisUIRange to which the minimal value is set. - * @param min The minimal value. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_UI_RANGE_NULL on failure. - */ -int visual_ui_range_set_min (VisUIRange *range, double min) -{ - visual_log_return_val_if_fail (range != NULL, -VISUAL_ERROR_UI_RANGE_NULL); - - range->min = min; - - return VISUAL_OK; -} - -/** - * Sets the increase/decrease step size for a VisUIRange. - * - * @param range Pointer to the VisUIRange to which the step size value is set. - * @param step The increase/decrase step value. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_UI_RANGE_NULL on failure. - */ -int visual_ui_range_set_step (VisUIRange *range, double step) -{ - visual_log_return_val_if_fail (range != NULL, -VISUAL_ERROR_UI_RANGE_NULL); - - range->step = step; - - return VISUAL_OK; -} - -/** - * Sets the precision for a VisUIRange. - * - * @param range Pointer to the VisUIRange to which the step size value is set. - * @param precision The precision in numbers behind the comma. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_UI_RANGE_NULL on failure. - */ -int visual_ui_range_set_precision (VisUIRange *range, int precision) -{ - visual_log_return_val_if_fail (range != NULL, -VISUAL_ERROR_UI_RANGE_NULL); - - range->precision = precision; - - return VISUAL_OK; -} - -/** - * Creates a new VisUIEntry, which can be used to enter text. - * - * @return The newly created VisUIEntry in the form of a VisUIWidget. - */ -VisUIWidget *visual_ui_entry_new () -{ - VisUIEntry *entry; - - entry = visual_mem_new0 (VisUIEntry, 1); - - /* Do the VisObject initialization */ - visual_object_initialize (VISUAL_OBJECT (entry), TRUE, widget_dtor); - - VISUAL_UI_WIDGET (entry)->type = VISUAL_WIDGET_TYPE_ENTRY; - - visual_ui_widget_set_size_request (VISUAL_UI_WIDGET (entry), -1, -1); - - return VISUAL_UI_WIDGET (entry); -} - -/** - * Sets the maximum length for the text in a VisUIEntry. - * - * @param entry Pointer to the VisUIEntry to which the maximum text length is set. - * @param length The maximum text length for the VisUIEntry. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_UI_ENTRY_NULL on failure. - */ -int visual_ui_entry_set_length (VisUIEntry *entry, int length) -{ - visual_log_return_val_if_fail (entry != NULL, -VISUAL_ERROR_UI_ENTRY_NULL); - - entry->length = length; - - return VISUAL_OK; -} - -/** - * Creates a new VisUISlider, which can be used as a VisUIRange type, in the form of a slider. - * - * @param showvalue Show the value of the slider place. - * - * @return The newly created VisUISlider in the form of a VisUIWidget. - */ -VisUIWidget *visual_ui_slider_new (int showvalue) -{ - VisUISlider *slider; - - slider = visual_mem_new0 (VisUISlider, 1); - - /* Do the VisObject initialization */ - visual_object_initialize (VISUAL_OBJECT (slider), TRUE, widget_dtor); - - VISUAL_UI_WIDGET (slider)->type = VISUAL_WIDGET_TYPE_SLIDER; - - slider->showvalue = showvalue; - - visual_ui_widget_set_size_request (VISUAL_UI_WIDGET (slider), -1, -1); - - return VISUAL_UI_WIDGET (slider); -} - -/** - * Creates a new VisUINumerici, which can be used as a VisUIRange type, in the form of a numeric spinbutton. - * - * @return The newly created VisUINumeric in the form of a VisUIWidget. - */ -VisUIWidget *visual_ui_numeric_new () -{ - VisUINumeric *numeric; - - numeric = visual_mem_new0 (VisUINumeric, 1); - - /* Do the VisObject initialization */ - visual_object_initialize (VISUAL_OBJECT (numeric), TRUE, widget_dtor); - - VISUAL_UI_WIDGET (numeric)->type = VISUAL_WIDGET_TYPE_NUMERIC; - - visual_ui_widget_set_size_request (VISUAL_UI_WIDGET (numeric), -1, -1); - - return VISUAL_UI_WIDGET (numeric); -} - -/** - * Creates a new VisUIColor, which can be used to select a color. - * - * @return The newly created VisUIColor in the form of a VisUIWidget. - */ -VisUIWidget *visual_ui_color_new () -{ - VisUIColor *color; - - color = visual_mem_new0 (VisUIColor, 1); - - /* Do the VisObject initialization */ - visual_object_initialize (VISUAL_OBJECT (color), TRUE, widget_dtor); - - VISUAL_UI_WIDGET (color)->type = VISUAL_WIDGET_TYPE_COLOR; - - visual_ui_widget_set_size_request (VISUAL_UI_WIDGET (color), -1, -1); - - return VISUAL_UI_WIDGET (color); -} - -/** - * Creates a new VisUIChoiceEntry, this is an entry in an entry in VisUIChoiceList, that is used - * by the different VisUIChoice inherentence. - * - * @param name The name ofe the choice. - * @param value The VisParamEntry associated with this choice. - * - * @return The newly created VisUIChoiceEntry. - */ -VisUIChoiceEntry *visual_ui_choice_entry_new (const char *name, VisParamEntry *value) -{ - VisUIChoiceEntry *centry; - - visual_log_return_val_if_fail (name != NULL, NULL); - visual_log_return_val_if_fail (value != NULL, NULL); - - centry = visual_mem_new0 (VisUIChoiceEntry, 1); - - /* Do the VisObject initialization */ - visual_object_initialize (VISUAL_OBJECT (centry), TRUE, NULL); - - centry->name = name; - centry->value = value; - - return centry; -} - -/** - * Add a VisParamEntry as a choice for a VisUIWidget that inherents from VisUIChoice. - * - * @param choice Pointer to the VisUIChoice widget to which the choice is added. - * @param name The name of this choice. - * @param value Pointer to the VisParamEntry that is associated with this choice. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_UI_CHOICE_NULL, -VISUAL_ERROR_NULL - * or -VISUAL_ERROR_PARAM_NULL on failure. - */ -int visual_ui_choice_add (VisUIChoice *choice, const char *name, VisParamEntry *value) -{ - VisUIChoiceEntry *centry; - - visual_log_return_val_if_fail (choice != NULL, -VISUAL_ERROR_UI_CHOICE_NULL); - visual_log_return_val_if_fail (name != NULL, -VISUAL_ERROR_NULL); - visual_log_return_val_if_fail (value != NULL, -VISUAL_ERROR_PARAM_NULL); - - centry = visual_ui_choice_entry_new (name, value); - - choice->choices.count++; - - visual_list_add (&choice->choices.choices, centry); - - return VISUAL_OK; -} - -/** - * Add many choices using a VisParamEntry array. - * - * @see visual_ui_choice_add - * - * @param choice Pointer to the VisUIChoice widget to which the choices are added. - * @param paramchoices Pointer to the array of VisParamEntries that are added to the internal - * VisUIChoiceList of the VisUIChoice widget. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_UI_CHOICE_NULL or -VISUAL_ERROR_PARAM_NULL on failure. - */ -int visual_ui_choice_add_many (VisUIChoice *choice, VisParamEntry *paramchoices) -{ - VisUIChoiceEntry *centry; - int i = 0; - - visual_log_return_val_if_fail (choice != NULL, -VISUAL_ERROR_UI_CHOICE_NULL); - visual_log_return_val_if_fail (paramchoices != NULL, -VISUAL_ERROR_PARAM_NULL); - - while (paramchoices[i].type != VISUAL_PARAM_ENTRY_TYPE_END) { - visual_ui_choice_add (choice, paramchoices[i].name, ¶mchoices[i]); - - i++; - } - - return VISUAL_OK; -} - -/** - * Frees all the memory used by the VisUIChoiceList and it's entries for the given VisUIChoice. - * - * @param choice Pointer to the VisUIChoice for which the VisUIChoiceList and it's entries - * are being freed. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_UI_CHOICE_NULL on failure. - */ -int visual_ui_choice_free_choices (VisUIChoice *choice) -{ - visual_log_return_val_if_fail (choice != NULL, -VISUAL_ERROR_UI_CHOICE_NULL); - - visual_list_set_destroyer (&choice->choices.choices, visual_object_list_destroyer); - visual_list_destroy_elements (&choice->choices.choices); - - return VISUAL_OK; -} - -/** - * Sets the active choice for a VisUIChoice widget. - * - * @param choice Pointer to the VisUIChoice widget for which an entry is being activated. - * @param index Index containing which choice needs to be activated, counting starts at 0. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_UI_CHOICE_NULL, -VISUAL_ERROR_UI_CHOICE_ENTRY_NULL or - * error values returned by visual_ui_mutator_get_param () on failure. - */ -int visual_ui_choice_set_active (VisUIChoice *choice, int index) -{ - VisUIChoiceEntry *centry; - VisParamEntry *param; - VisParamEntry *newparam; - - visual_log_return_val_if_fail (choice != NULL, -VISUAL_ERROR_UI_CHOICE_NULL); - - centry = visual_ui_choice_get_choice (choice, index); - visual_log_return_val_if_fail (centry != NULL, -VISUAL_ERROR_UI_CHOICE_ENTRY_NULL); - - param = visual_ui_mutator_get_param (VISUAL_UI_MUTATOR (choice)); - - newparam = (VisParamEntry *) centry->value; - - return visual_param_entry_set_from_param (param, newparam); -} - -/** - * Retrieves the index of the current active choice. - * - * @param choice Pointer to the VisUIChoice widget from which the active choice is requested. - * - * @return Index of the active choice entry. - */ -int visual_ui_choice_get_active (VisUIChoice *choice) -{ - VisListEntry *le = NULL; - VisUIChoiceEntry *centry; - VisParamEntry *param; - int i = 0; - - visual_log_return_val_if_fail (choice != NULL, -VISUAL_ERROR_UI_CHOICE_NULL); - - param = visual_ui_mutator_get_param (VISUAL_UI_MUTATOR (choice)); - - while ((centry = visual_list_next (&choice->choices.choices, &le)) != NULL) { - VisParamEntry *cparam; - - cparam = centry->value; - - if (visual_param_entry_compare (param, cparam) == TRUE) - return i; - - i++; - } - - return -VISUAL_ERROR_UI_CHOICE_NONE_ACTIVE; -} - -/** - * Retrieves a VisUIChoiceEntry from a VisUIChoice based on the index. - * - * @param choice Pointer to the VisUIChoice widget from which a VisUIChoiceEntry is requested. - * @param index Index of the requested VisUIChoiceEntry. - * - * @return The VisUIChoiceEntry that is located on the given index, or NULL on failure. - */ -VisUIChoiceEntry *visual_ui_choice_get_choice (VisUIChoice *choice, int index) -{ - visual_log_return_val_if_fail (choice != NULL, NULL); - - return visual_list_get (&choice->choices.choices, index); -} - -/** - * Retrvies the VisUIChoiceList from a VisUIChoice widget. - * - * @param choice Pointer to the VisUIChoice widget from which the VisUIChoiceList is requested. - * - * @return The VisUIChoiceList that is associated to the VisUIChoice. - */ -VisUIChoiceList *visual_ui_choice_get_choices (VisUIChoice *choice) -{ - visual_log_return_val_if_fail (choice != NULL, NULL); - - return &choice->choices; -} - -/** - * Creates a new VisUIPopup. This can be used to show a popup list containing items from which - * can be choosen. - * - * @return The newly created VisUIPopup in the form of a VisUIWidget. - */ -VisUIWidget *visual_ui_popup_new () -{ - VisUIPopup *popup; - - popup = visual_mem_new0 (VisUIPopup, 1); - - /* Do the VisObject initialization */ - visual_object_initialize (VISUAL_OBJECT (popup), TRUE, choice_dtor); - - VISUAL_UI_WIDGET (popup)->type = VISUAL_WIDGET_TYPE_POPUP; - - visual_ui_widget_set_size_request (VISUAL_UI_WIDGET (popup), -1, -1); - - return VISUAL_UI_WIDGET (popup); -} - -/** - * Creates a new VisUIList. This can be used to show a list containing items from which - * can be choosen. - * - * @return The newly created VisUIList in the form of a VisUIWidget. - */ -VisUIWidget *visual_ui_list_new () -{ - VisUIList *list; - - list = visual_mem_new0 (VisUIList, 1); - - /* Do the VisObject initialization */ - visual_object_initialize (VISUAL_OBJECT (list), TRUE, choice_dtor); - - VISUAL_UI_WIDGET (list)->type = VISUAL_WIDGET_TYPE_LIST; - - visual_ui_widget_set_size_request (VISUAL_UI_WIDGET (list), -1, -1); - - return VISUAL_UI_WIDGET (list); -} - -/** - * Creates a new VisUIRadio. This can be used to show a list of radio buttons containing items from which - * can be choosen. - * - * @param orient The orientation of the radio button layout. - * - * @return The newly created VisUIRadio in the form of a VisUIWidget. - */ -VisUIWidget *visual_ui_radio_new (VisUIOrientType orient) -{ - VisUIRadio *radio; - - radio = visual_mem_new0 (VisUIRadio, 1); - - /* Do the VisObject initialization */ - visual_object_initialize (VISUAL_OBJECT (radio), TRUE, choice_dtor); - - VISUAL_UI_WIDGET (radio)->type = VISUAL_WIDGET_TYPE_RADIO; - - radio->orient = orient; - - visual_ui_widget_set_size_request (VISUAL_UI_WIDGET (radio), -1, -1); - - return VISUAL_UI_WIDGET (radio); -} - -/** - * Creates a new VisUICheckbox. This can be used to show a checkbox that can be toggled and untoggled. - * - * @param name The text behind the checkbox. - * @param boolcheck Automaticly set a boolean, TRUE and FALSE VisUIChoiceList on the VisUICheckbox. - * - * @return The newly created VisUICheckbox in the form of a VisUIWidget. - */ -VisUIWidget *visual_ui_checkbox_new (const char *name, int boolcheck) -{ - VisUICheckbox *checkbox; - static VisParamEntry truefalse[] = { - VISUAL_PARAM_LIST_ENTRY_INTEGER ("false", FALSE), - VISUAL_PARAM_LIST_ENTRY_INTEGER ("true", TRUE), - VISUAL_PARAM_LIST_END - }; - - checkbox = visual_mem_new0 (VisUICheckbox, 1); - - /* Do the VisObject initialization */ - visual_object_initialize (VISUAL_OBJECT (checkbox), TRUE, choice_dtor); - - VISUAL_UI_WIDGET (checkbox)->type = VISUAL_WIDGET_TYPE_CHECKBOX; - - checkbox->name = name; - - /* Boolean checkbox, generate a FALSE, TRUE choicelist ourself */ - if (boolcheck == TRUE) - visual_ui_choice_add_many (VISUAL_UI_CHOICE (checkbox), truefalse); - - visual_ui_widget_set_size_request (VISUAL_UI_WIDGET (checkbox), -1, -1); - - return VISUAL_UI_WIDGET (checkbox); -} - -/** - * @} - */ -
--- a/libvisual/lv_ui.h Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,472 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _LV_UI_H -#define _LV_UI_H - -#include <libvisual/lv_list.h> -#include <libvisual/lv_param.h> -#include <libvisual/lv_video.h> -#include <libvisual/lv_common.h> - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#define VISUAL_UI_WIDGET(obj) (VISUAL_CHECK_CAST ((obj), VISUAL_WIDGET_TYPE_WIDGET, VisUIWidget)) -#define VISUAL_UI_CONTAINER(obj) (VISUAL_CHECK_CAST ((obj), VISUAL_WIDGET_TYPE_CONTAINER, VisUIContainer)) -#define VISUAL_UI_BOX(obj) (VISUAL_CHECK_CAST ((obj), VISUAL_WIDGET_TYPE_BOX, VisUIBox)) -#define VISUAL_UI_TABLE_ENTRY(obj) (VISUAL_CHECK_CAST ((obj), VISUAL_WIDGET_TYPE_TABLE, VisUITableEntry)) -#define VISUAL_UI_TABLE(obj) (VISUAL_CHECK_CAST ((obj), VISUAL_WIDGET_TYPE_TABLE, VisUITable)) -#define VISUAL_UI_FRAME(obj) (VISUAL_CHECK_CAST ((obj), VISUAL_WIDGET_TYPE_FRAME, VisUIFrame)) -#define VISUAL_UI_LABEL(obj) (VISUAL_CHECK_CAST ((obj), VISUAL_WIDGET_TYPE_LABEL, VisUILabel)) -#define VISUAL_UI_IMAGE(obj) (VISUAL_CHECK_CAST ((obj), VISUAL_WIDGET_TYPE_IMAGE, VisUIImage)) -#define VISUAL_UI_SEPARATOR(obj) (VISUAL_CHECK_CAST ((obj), VISUAL_WIDGET_TYPE_SEPARATOR, VisUISeparator)) -#define VISUAL_UI_MUTATOR(obj) (VISUAL_CHECK_CAST ((obj), VISUAL_WIDGET_TYPE_MUTATOR, VisUIMutator)) -#define VISUAL_UI_RANGE(obj) (VISUAL_CHECK_CAST ((obj), VISUAL_WIDGET_TYPE_RANGE, VisUIRange)) -#define VISUAL_UI_ENTRY(obj) (VISUAL_CHECK_CAST ((obj), VISUAL_WIDGET_TYPE_ENTRY, VisUIEntry)) -#define VISUAL_UI_SLIDER(obj) (VISUAL_CHECK_CAST ((obj), VISUAL_WIDGET_TYPE_SLIDER, VisUISlider)) -#define VISUAL_UI_NUMERIC(obj) (VISUAL_CHECK_CAST ((obj), VISUAL_WIDGET_TYPE_NUMERIC, VisUINumeric)) -#define VISUAL_UI_COLOR(obj) (VISUAL_CHECK_CAST ((obj), VISUAL_WIDGET_TYPE_COLOR, VisUIColor)) -#define VISUAL_UI_CHOICE_ENTRY(obj) (VISUAL_CHECK_CAST ((obj), VISUAL_WIDGET_TYPE_CHOICE, VisUIChoiceEntry)) -#define VISUAL_UI_CHOICE(obj) (VISUAL_CHECK_CAST ((obj), VISUAL_WIDGET_TYPE_CHOICE, VisUIChoice)) -#define VISUAL_UI_POPUP(obj) (VISUAL_CHECK_CAST ((obj), VISUAL_WIDGET_TYPE_POPUP, VisUIPopup)) -#define VISUAL_UI_LIST(obj) (VISUAL_CHECK_CAST ((obj), VISUAL_WIDGET_TYPE_LIST, VisUIList)) -#define VISUAL_UI_RADIO(obj) (VISUAL_CHECK_CAST ((obj), VISUAL_WIDGET_TYPE_RADIO, VisUIRadio)) -#define VISUAL_UI_CHECKBOX(obj) (VISUAL_CHECK_CAST ((obj), VISUAL_WIDGET_TYPE_CHECKBOX, VisUICheckbox)) - -/** - * Enumerate to define the different types of VisUIWidgets. - */ -typedef enum { - VISUAL_WIDGET_TYPE_NULL, /**< NULL widget */ - VISUAL_WIDGET_TYPE_WIDGET, /**< Base widget: \a VisUIWidget. */ - VISUAL_WIDGET_TYPE_CONTAINER, /**< Container widget: \a VisUIContainer. */ - VISUAL_WIDGET_TYPE_BOX, /**< Box widget: \a VisUIBox. */ - VISUAL_WIDGET_TYPE_TABLE, /**< Table widget: \a VisUITable. */ - VISUAL_WIDGET_TYPE_FRAME, /**< Frame widget: \a VisUIFrame. */ - VISUAL_WIDGET_TYPE_LABEL, /**< Label widget: \a VisUILabel. */ - VISUAL_WIDGET_TYPE_IMAGE, /**< Image widget: \a VisUIImage. */ - VISUAL_WIDGET_TYPE_SEPARATOR, /**< Separator widget: \a VisUISeparator. */ - VISUAL_WIDGET_TYPE_MUTATOR, /**< Mutator base widget: \a VisUIMutator. */ - VISUAL_WIDGET_TYPE_RANGE, /**< Range base widget: \a VisUIRange. */ - VISUAL_WIDGET_TYPE_ENTRY, /**< Entry box widget: \a VisUIEntry. */ - VISUAL_WIDGET_TYPE_SLIDER, /**< Slider widget: \a VisUISlider. */ - VISUAL_WIDGET_TYPE_NUMERIC, /**< Numeric widget: \a VisUINumeric. */ - VISUAL_WIDGET_TYPE_COLOR, /**< Color widget: \a VisUIColor. */ - VISUAL_WIDGET_TYPE_CHOICE, /**< Choice base widget: \a VisUIChoice. */ - VISUAL_WIDGET_TYPE_POPUP, /**< Popup widget: \a VisUIPopup. */ - VISUAL_WIDGET_TYPE_LIST, /**< List widget: \a VisUIList. */ - VISUAL_WIDGET_TYPE_RADIO, /**< Radio widget: \a VisUIRadio. */ - VISUAL_WIDGET_TYPE_CHECKBOX /**< Checkbox widget: \a VisUICheckbox. */ -} VisUIWidgetType; - -/** - * Enumerate to define the different types of widget orientation. This is used - * by a few widgets that can be aligned both vertical and horizontal. - */ -typedef enum { - VISUAL_ORIENT_TYPE_NONE, /**< No orientation, use the default. */ - VISUAL_ORIENT_TYPE_HORIZONTAL, /**< Horizontal orientation. */ - VISUAL_ORIENT_TYPE_VERTICAL /**< Vertical orientation. */ -} VisUIOrientType; - -typedef struct _VisUIWidget VisUIWidget; -typedef struct _VisUIContainer VisUIContainer; -typedef struct _VisUIBox VisUIBox; -typedef struct _VisUITableEntry VisUITableEntry; -typedef struct _VisUITable VisUITable; -typedef struct _VisUIFrame VisUIFrame; -typedef struct _VisUILabel VisUILabel; -typedef struct _VisUIImage VisUIImage; -typedef struct _VisUISeparator VisUISeparator; -typedef struct _VisUIMutator VisUIMutator; -typedef struct _VisUIRange VisUIRange; -typedef struct _VisUIEntry VisUIEntry; -typedef struct _VisUISlider VisUISlider; -typedef struct _VisUINumeric VisUINumeric; -typedef struct _VisUIColor VisUIColor; -typedef struct _VisUIChoiceList VisUIChoiceList; -typedef struct _VisUIChoiceEntry VisUIChoiceEntry; -typedef struct _VisUIChoice VisUIChoice; -typedef struct _VisUIPopup VisUIPopup; -typedef struct _VisUIList VisUIList; -typedef struct _VisUIRadio VisUIRadio; -typedef struct _VisUICheckbox VisUICheckbox; - -/* FIXME, fix the links, they are screwed up because of the typedefs, there is some way around it - * but hey. */ -/** - * - * The super class for al VisUIWidgets. All the typical VisUIWidgets - * derive from this. VisUIWidget is used as an intermediate user interface - * description. Mainly to set up configuration dialogs for plugins that - * are not widget set dependant. - * - * The VisUIWidget class hierarchy looks like following: - * - \a _VisUIWidget - * - \a VisUILabel - * - \a VisUIImage - * - \a VisUIContainer - * - \a VisUIBox - * - \a VisUITable - * - \a VisUIFrame - * - \a VisUIMutator - * - \a VisUIText - * - \a VisUIColor - * - \a VisUIRange - * - \a VisUISlider - * - \a VisUINumeric - * - \a VisUIChoice - * - \a VisUIPopup - * - \a VisUIList - * - \a VisUIRadio - * - \a VisUICheckbox - */ -struct _VisUIWidget { - VisObject object; /**< The VisObject data. */ - - VisUIWidget *parent; /**< Parent in which this VisUIWidget is packed. - * This is possibly NULL. */ - - VisUIWidgetType type; /**< Type of VisUIWidget. */ - - const char *tooltip; /**< Optional tooltip text, this can be used to - * give the user some extra explanation about the - * user interface. */ - - int width; /**< When size requisition is used, the width value will - * be stored in this. */ - int height; /**< When size requisition is used. the height value will - * be stored in this. When size requisition is not being - * done both width and height will contain of -1. */ -}; - -/** - * The VisUIContainer is a VisUIWidget that is used to pack other widgets in. - * A basic container can contain just one VisUIWidget, however when VisUIBox or - * VisUITable is used, it's possible to add more elements. - */ -struct _VisUIContainer { - VisUIWidget widget; /**< The VisUIWidget data. */ - - VisUIWidget *child; /**< Pointer to the child VisUIWidget that is packed in this VisUIContainer. */ -}; - -/** - * The VisUIBox inherents from VisUIContainer, but is capable to contain more childeren. - * The VisUIBox is used as a box of VisUIWidgets, packed vertical or horizontal. - */ -struct _VisUIBox { - VisUIContainer container; /**< The VisUIContainer data. */ - - VisUIOrientType orient; /**< Orientation, whatever the box packs the item in a vertical - * order or in a horizontal order. */ - - VisList childs; /**< A list of all child VisUIWidgets. */ -}; - -/** - * VisUITableEntry is an entry in a VisUITable. the VisUITableEntry is not a VisUIWidget on - * itself. Instead it rembers the cell in which a VisUIWidget is placed in VisUITable and - * also has a reference to the VisUIWidget. - */ -struct _VisUITableEntry { - VisObject object; /**< The VisObject data. */ - - int row; /**< Row to which the VisUITableEntry is associated. */ - int col; /**< Column to which the VisUITableEntry is associated. */ - - VisUIWidget *widget; /**< The VisUIWidget that is connected to this entry in the VisUITable. */ -}; - -/** - * The VisUITable inherents from VisUIContainer, but is capable of placing VisUIWidgets in an aligned grid. - */ -struct _VisUITable { - VisUIContainer container; /**< The VisUIContainer data. */ - - int rows; /**< The number of rows in this VisUITable. */ - int cols; /**< The number of columns in this VisUITable. */ - - VisList childs; /**< A list of all VisUITableEntry items that are related to - * this table. */ -}; - -/** - * The VisUIFrame inherents from VisUIContainer, it's used to put a frame with a label around a VisUIWidget. - */ -struct _VisUIFrame { - VisUIContainer container; /**< The VisUIContainer data. */ - - const char *name; /**< The frame label text. */ -}; - -/** - * The VisUILabel inherents from a VisUIWidget, it's used to as a label item in the user interface. - */ -struct _VisUILabel { - VisUIWidget widget; /**< The VisUIWidget data. */ - - const char *text; /**< The label text. */ - int bold; /**< Whatever the label is being printed in bold or not. */ -}; - -/** - * The VisUIImage inherents from a VisUIWidget, it's used to display a VisVideo within the user interface. For - * example it can be used to show a picture. - */ -struct _VisUIImage { - VisUIWidget widget; /**< The VisUIWidget data. */ - - VisVideo *image; /**< The VisUIImage containing the image data. */ -}; - -/** - * The VisUISeparator inherents from a VisUIWidget, it's used to display a separator between different user interface - * elements. - */ -struct _VisUISeparator { - VisUIWidget widget; /**< The VisUIWidget data. */ - - VisUIOrientType orient; /**< The orientation, whatever the separator is drawn in vertical - * or horizontal style. */ -}; - -/** - * The VisUIMutator inherents from a VisUIWidget, it's used as a super class for different type of mutator VisUIWidgets. - * Mutator VisUIWidgets are used to change a value in a VisParamEntry. - */ -struct _VisUIMutator { - VisUIWidget widget; /**< The VisUIWidget data. */ - - VisParamEntry *param; /**< The VisParamEntry parameter that is associated with this - * VisUIMutator. */ -}; - -/** - * The VisUIRange inherents from a VisUIMutator, it's a type of mutator widget that focus on numeric input and - * numeric adjustment within a range. - */ -struct _VisUIRange { - VisUIMutator mutator; /**< The VisUIMutator data. */ - - double min; /**< The minimal value. */ - double max; /**< The maximal value. */ - double step; /**< Increase / decrease steps. */ - - int precision; /**< Precision, in the fashion of how many numbers behind - * the point. */ -}; - -/** - * The VisUIEntry inherents from a VisUIMutator, it's used as a way to input text. - */ -struct _VisUIEntry { - VisUIMutator mutator; /**< The VisUIMutator data. */ - - int length; /**< Maximal length for the text. */ -}; - -/** - * The VisUISlider inherents from a VisUIRange, it's used to display a slider which can be used - * to adjust a numeric value. - */ -struct _VisUISlider { - VisUIRange range; /**< The VisUIRange data. */ - - int showvalue; /**< Don't show just the slider, but also the value it - * represents at it's current position. */ -}; - -/** - * The VisUINumeric inherents from a VisUIRange, it's used to display a numeric spin button that - * can be used to adjust a numeric value. A numeric spin button contains out of a small text field - * displaying the actual value, followed by two buttons which are used to increase or decrease the value. - * - * In most VisUI native implementations it's also possible to adjust the text field directly using - * the keyboard. - */ -struct _VisUINumeric { - VisUIRange range; /**< The VisUIRange data. */ -}; - -/** - * The VisUIColor inherents from a VisUIMutator, it's used to adjust the color that is encapsulated by - * a VisParamEntry. - */ -struct _VisUIColor { - VisUIMutator mutator; /**< The VisUIMutator data. */ -}; - -/** - * The VisUIChoiceList is not a VisUIWidget, but it's used by the different types of VisUIChoice widgets to - * store information about choices. - */ -struct _VisUIChoiceList { - VisObject object; /**< The VisObject data. */ - - int count; /**< The amount of choices that are present. */ - VisList choices; /**< A list of VisUIChoiceEntry elements. */ -}; - -/** - * The VisUIChoiceEntry is not a VisUIWidget, but it's used by the different types of VisUIChoice widgets to - * store information regarding a choice within a VisUIChoiceList. - */ -struct _VisUIChoiceEntry { - VisObject object; /**< The VisObject data. */ - - const char *name; /**< Name of this VisChoiceEntry. */ - - VisParamEntry *value; /**< Link to the VisParamEntry that contains the value - * for this VisChoiceEntry. */ -}; - -/** - * The VisUIChoice inherents from a VisUIMutator, it's used as a super class for the different types of - * VisUIChoice VisUIWidgets. - */ -struct _VisUIChoice { - VisUIMutator mutator; /**< The VisUIMutator data. */ - - VisParamEntry *param; /**< Pointer to the VisParamEntry that is the target to - * contain the actual value. */ - - VisUIChoiceList choices; /**< The different choices present. */ -}; - -/** - * The VisUIPopup inherents from a VisUIChoice, it's used to represent choices in a popup fashion, where you - * can select an item. - */ -struct _VisUIPopup { - VisUIChoice choice; /**< The VisUIChoice data. */ -}; - -/** - * The VisUIList inherents from a VisUIChoice, it's used to represent choices in a list fashion. - */ -struct _VisUIList { - VisUIChoice choice; /**< The VisUIChoice data. */ -}; - -/** - * The VisUIRadio inherents from a VisUIChoice, it's used to represent choices in the fashion of radio buttons. These - * are a grouped type of checkboxes where only one item can be active at once. - */ -struct _VisUIRadio { - VisUIChoice choice; /**< The VisUIChoice data. */ - - VisUIOrientType orient; /**< Orientation of how the different radio buttons in the VisUIRadio button - * group is ordered. */ -}; - -/** - * The VisUICheckbox inherents from a VisUIChoice, it's used to represent one single checkbox widget. For this reason it - * can only represent two choices. One for the toggled state and one for the untoggled state. - */ -struct _VisUICheckbox { - VisUIChoice choice; /**< The VisUIChoice data. */ - - const char *name; /**< Optional text behind the textbox. */ -}; - -/* prototypes */ -VisUIWidget *visual_ui_widget_new (void); -int visual_ui_widget_set_size_request (VisUIWidget *widget, int width, int height); -int visual_ui_widget_set_tooltip (VisUIWidget *widget, const char *tooltip); -const char *visual_ui_widget_get_tooltip (VisUIWidget *widget); -VisUIWidget *visual_ui_widget_get_top (VisUIWidget *widget); -VisUIWidget *visual_ui_widget_get_parent (VisUIWidget *widget); -VisUIWidgetType visual_ui_widget_get_type (VisUIWidget *widget); - -int visual_ui_container_add (VisUIContainer *container, VisUIWidget *widget); -VisUIWidget *visual_ui_container_get_child (VisUIContainer *container); - -VisUIWidget *visual_ui_box_new (VisUIOrientType orient); -int visual_ui_box_pack (VisUIBox *box, VisUIWidget *widget); -VisList *visual_ui_box_get_childs (VisUIBox *box); -VisUIOrientType visual_ui_box_get_orient (VisUIBox *box); - -VisUIWidget *visual_ui_table_new (int rows, int cols); -VisUITableEntry *visual_ui_table_entry_new (VisUIWidget *widget, int row, int col); -int visual_ui_table_attach (VisUITable *table, VisUIWidget *widget, int row, int col); -VisList *visual_ui_table_get_childs (VisUITable *table); - -VisUIWidget *visual_ui_frame_new (const char *name); - -VisUIWidget *visual_ui_label_new (const char *text, int bold); -int visual_ui_label_set_text (VisUILabel *label, const char *text); -int visual_ui_label_set_bold (VisUILabel *label, int bold); -const char *visual_ui_label_get_text (VisUILabel *label); - -VisUIWidget *visual_ui_image_new (VisVideo *video); -int visual_ui_image_set_video (VisUIImage *image, VisVideo *video); -VisVideo *visual_ui_image_get_video (VisUIImage *image); - -VisUIWidget *visual_ui_separator_new (VisUIOrientType orient); -VisUIOrientType visual_ui_separator_get_orient (VisUISeparator *separator); - -int visual_ui_mutator_set_param (VisUIMutator *mutator, VisParamEntry *param); -VisParamEntry *visual_ui_mutator_get_param (VisUIMutator *mutator); - -int visual_ui_range_set_properties (VisUIRange *range, double min, double max, double step, int precision); -int visual_ui_range_set_max (VisUIRange *range, double max); -int visual_ui_range_set_min (VisUIRange *range, double min); -int visual_ui_range_set_step (VisUIRange *range, double step); -int visual_ui_range_set_precision (VisUIRange *range, int precision); - -VisUIWidget *visual_ui_entry_new (void); -int visual_ui_entry_set_length (VisUIEntry *entry, int length); - -VisUIWidget *visual_ui_slider_new (int showvalue); - -VisUIWidget *visual_ui_numeric_new (void); - -VisUIWidget *visual_ui_color_new (void); - -VisUIChoiceEntry *visual_ui_choice_entry_new (const char *name, VisParamEntry *value); -int visual_ui_choice_add (VisUIChoice *choice, const char *name, VisParamEntry *value); -int visual_ui_choice_add_many (VisUIChoice *choice, VisParamEntry *paramchoices); -int visual_ui_choice_free_choices (VisUIChoice *choice); -int visual_ui_choice_set_active (VisUIChoice *choice, int index); -int visual_ui_choice_get_active (VisUIChoice *choice); -VisUIChoiceEntry *visual_ui_choice_get_choice (VisUIChoice *choice, int index); -VisUIChoiceList *visual_ui_choice_get_choices (VisUIChoice *choice); - -/* FIXME look at lists with multiple selections... */ - -VisUIWidget *visual_ui_popup_new (void); - -VisUIWidget *visual_ui_list_new (void); - -VisUIWidget *visual_ui_radio_new (VisUIOrientType orient); - -VisUIWidget *visual_ui_checkbox_new (const char *name, int boolcheck); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _LV_UI_H */
--- a/libvisual/lv_video.c Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1934 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * Duilio J. Protti <dprotti@users.sourceforge.net> - * Chong Kai Xiong <descender@phreaker.net> - * Jean-Christophe Hoelt <jeko@ios-software.com> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> - -#include <lvconfig.h> -#include "lv_common.h" -#include "lv_video.h" -#include "lv_cpu.h" -#include "lv_log.h" -#include "lv_mem.h" - -#define HAVE_ALLOCATED_BUFFER(video) ((video)->flags & VISUAL_VIDEO_FLAG_ALLOCATED_BUFFER) -#define HAVE_EXTERNAL_BUFFER(video) ((video)->flags & VISUAL_VIDEO_FLAG_EXTERNAL_BUFFER) - - -typedef struct { - uint16_t b:5, g:6, r:5; -} _color16; - -typedef struct { - uint8_t r; - uint8_t g; - uint8_t b; -} _color24; - -/* The VisVideo dtor function */ -static int video_dtor (VisObject *object); - -/* Precomputation functions */ -static void precompute_row_table (VisVideo *video); - -/* Blit overlay functions */ -static int blit_overlay_noalpha (VisVideo *dest, const VisVideo *src, int x, int y); -static int blit_overlay_alpha32 (VisVideo *dest, const VisVideo *src, int x, int y); - -/* Depth conversions */ -static int depth_transform_8_to_16_c (uint8_t *dest, uint8_t *src, int width, int height, int pitch, VisPalette *pal); -static int depth_transform_8_to_24_c (uint8_t *dest, uint8_t *src, int width, int height, int pitch, VisPalette *pal); -static int depth_transform_8_to_32_c (uint8_t *dest, uint8_t *src, int width, int height, int pitch, VisPalette *pal); - -static int depth_transform_16_to_8_c (uint8_t *dest, uint8_t *src, int width, int height, int pitch, VisPalette *pal); -static int depth_transform_16_to_24_c (uint8_t *dest, uint8_t *src, int width, int height, int pitch, VisPalette *pal); -static int depth_transform_16_to_32_c (uint8_t *dest, uint8_t *src, int width, int height, int pitch, VisPalette *pal); - -static int depth_transform_24_to_8_c (uint8_t *dest, uint8_t *src, int width, int height, int pitch, VisPalette *pal); -static int depth_transform_24_to_16_c (uint8_t *dest, uint8_t *src, int width, int height, int pitch, VisPalette *pal); -static int depth_transform_24_to_32_c (uint8_t *dest, uint8_t *src, int width, int height, int pitch, VisPalette *pal); - -static int depth_transform_32_to_8_c (uint8_t *dest, uint8_t *src, int width, int height, int pitch, VisPalette *pal); -static int depth_transform_32_to_16_c (uint8_t *dest, uint8_t *src, int width, int height, int pitch, VisPalette *pal); -static int depth_transform_32_to_24_c (uint8_t *dest, uint8_t *src, int width, int height, int pitch, VisPalette *pal); - -/* BGR to RGB conversions */ -static int bgr_to_rgb16 (VisVideo *dest, const VisVideo *src); -static int bgr_to_rgb24 (VisVideo *dest, const VisVideo *src); -static int bgr_to_rgb32 (VisVideo *dest, const VisVideo *src); - -/* Scaling functions */ -static int scale_nearest_8 (VisVideo *dest, const VisVideo *src); -static int scale_nearest_16 (VisVideo *dest, const VisVideo *src); -static int scale_nearest_24 (VisVideo *dest, const VisVideo *src); -static int scale_nearest_32 (VisVideo *dest, const VisVideo *src); - -/* Bilinear filter functions */ -static int scale_bilinear_8 (VisVideo *dest, const VisVideo *src); -static int scale_bilinear_16 (VisVideo *dest, const VisVideo *src); -static int scale_bilinear_24 (VisVideo *dest, const VisVideo *src); -static int scale_bilinear_32 (VisVideo *dest, const VisVideo *src); - -static int video_dtor (VisObject *object) -{ - VisVideo *video = VISUAL_VIDEO (object); - - if (HAVE_ALLOCATED_BUFFER (video)) { - if (video->pixels != NULL) - visual_video_free_buffer (video); - - video->pixels = NULL; - } - - video->pixel_rows = NULL; - - return VISUAL_OK; -} - - -/** - * @defgroup VisVideo VisVideo - * @{ - */ - -/** - * Creates a new VisVideo structure, without an associated screen buffer. - * - * @return A newly allocated VisVideo. - */ -VisVideo *visual_video_new () -{ - VisVideo *video; - - video = visual_mem_new0 (VisVideo, 1); - - /* Do the VisObject initialization */ - visual_object_initialize (VISUAL_OBJECT (video), TRUE, video_dtor); - - video->pixels = NULL; - - /* - * By default, we suppose an external buffer will be used. - */ - video->flags = VISUAL_VIDEO_FLAG_EXTERNAL_BUFFER; - - return video; -} - -/** - * Creates a new VisVideo and also allocates a buffer. - * - * @param width The width for the new buffer. - * @param height The height for the new buffer. - * @param depth The depth being used. - * - * @return A newly allocates VisVideo with a buffer allocated. - */ -VisVideo *visual_video_new_with_buffer (int width, int height, VisVideoDepth depth) -{ - VisVideo *video; - int ret; - - video = visual_video_new (); - - visual_video_set_depth (video, depth); - visual_video_set_dimension (video, width, height); - - video->pixels = NULL; - ret = visual_video_allocate_buffer (video); - - if (ret < 0) { - /* - * Restore the flag set by visual_video_new(). - */ - video->flags = VISUAL_VIDEO_FLAG_EXTERNAL_BUFFER; - visual_object_unref (VISUAL_OBJECT (video)); - - return NULL; - } - - return video; -} - -/** - * Frees the buffer that relates to the VisVideo. - * - * @param video Pointer to a VisVideo of which the buffer needs to be freed. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_VIDEO_NULL, -VISUAL_ERROR_VIDEO_PIXELS_NULL or -VISUAL_ERROR_VIDEO_NO_ALLOCATED - * on failure. - */ -int visual_video_free_buffer (VisVideo *video) -{ - visual_log_return_val_if_fail (video != NULL, -VISUAL_ERROR_VIDEO_NULL); - visual_log_return_val_if_fail (video->pixels != NULL, -VISUAL_ERROR_VIDEO_PIXELS_NULL); - - if (HAVE_ALLOCATED_BUFFER (video)) { - if (video->pixel_rows != NULL) - visual_mem_free (video->pixel_rows); - - visual_mem_free (video->pixels); - - } else { - return -VISUAL_ERROR_VIDEO_NO_ALLOCATED; - } - - video->pixel_rows = NULL; - video->pixels = NULL; - - video->flags = VISUAL_VIDEO_FLAG_NONE; - - return VISUAL_OK; -} - -/** - * Allocates a buffer for the VisVideo. Allocates based on the - * VisVideo it's information about the screen dimension and depth. - * - * @param video Pointer to a VisVideo that needs an allocated buffer. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_VIDEO_NULL or -VISUAL_ERROR_VIDEO_HAS_PIXELS on failure. - */ -int visual_video_allocate_buffer (VisVideo *video) -{ - visual_log_return_val_if_fail (video != NULL, -VISUAL_ERROR_VIDEO_NULL); - - if (video->pixels != NULL) { - if (HAVE_ALLOCATED_BUFFER (video)) { - visual_video_free_buffer (video); - } else { - visual_log (VISUAL_LOG_CRITICAL, "Trying to allocate an screen buffer on " - "a VisVideo structure which points to an external screen buffer"); - - return -VISUAL_ERROR_VIDEO_HAS_PIXELS; - } - } - - if (video->size == 0) { - video->pixels = NULL; - video->flags = VISUAL_VIDEO_FLAG_NONE; - - return VISUAL_OK; - } - - video->pixels = visual_mem_malloc0 (video->size); - - video->pixel_rows = visual_mem_new0 (void *, video->height); - precompute_row_table (video); - - video->flags = VISUAL_VIDEO_FLAG_ALLOCATED_BUFFER; - - return VISUAL_OK; -} - -/** - * Checks if the given VisVideo has a private allocated buffer. - * - * @param video Pointer to the VisVideo of which we want to know if it has a private allocated buffer. - * - * @return TRUE if the VisVideo has an allocated buffer, or FALSE if not. - */ -int visual_video_have_allocated_buffer (const VisVideo *video) -{ - visual_log_return_val_if_fail (video != NULL, FALSE); - - if (HAVE_ALLOCATED_BUFFER (video)) - return TRUE; - - return FALSE; -} - -static void precompute_row_table (VisVideo *video) -{ - void **table, *row; - int y; - - visual_log_return_if_fail (video->pixel_rows != NULL); - - table = video->pixel_rows; - - for (y = 0, row = video->pixels; y < video->height; y++, row += video->pitch) - *table++ = row; -} - -/** - * Clones the information from a VisVideo to another. - * This will clone the depth, dimension and screen pitch into another VisVideo. - * It doesn't clone the palette or buffer. - * - * @param dest Pointer to a destination VisVideo in which the information needs to - * be placed. - * @param src Pointer to a source VisVideo from which the information needs to - * be obtained. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_VIDEO_NULL on failure. - */ -int visual_video_clone (VisVideo *dest, const VisVideo *src) -{ - visual_log_return_val_if_fail (dest != NULL, -VISUAL_ERROR_VIDEO_NULL); - visual_log_return_val_if_fail (src != NULL, -VISUAL_ERROR_VIDEO_NULL); - - visual_video_set_depth (dest, src->depth); - visual_video_set_dimension (dest, src->width, src->height); - visual_video_set_pitch (dest, src->pitch); - - dest->flags = src->flags; - - return VISUAL_OK; -} - -/** - * Checks if two VisVideo objects are the same depth, pitch and dimension wise. - * - * @param src1 Pointer to the first VisVideo that is used in the compare. - * @param src2 Pointer to the second VisVideo that is used in the compare. - * - * @return FALSE on different, TRUE on same, -VISUAL_ERROR_VIDEO_NULL on failure. - */ -int visual_video_compare (const VisVideo *src1, const VisVideo *src2) -{ - visual_log_return_val_if_fail (src1 != NULL, -VISUAL_ERROR_VIDEO_NULL); - visual_log_return_val_if_fail (src2 != NULL, -VISUAL_ERROR_VIDEO_NULL); - - if (src1->depth != src2->depth) - return FALSE; - - if (src1->width != src2->width) - return FALSE; - - if (src1->height != src2->height) - return FALSE; - - if (src1->pitch != src2->pitch) - return FALSE; - - /* We made it to the end, the VisVideos are likewise in depth, pitch, dimensions */ - return TRUE; -} - - -/** - * Sets a palette to a VisVideo. Links a VisPalette to the - * VisVideo. - * - * @param video Pointer to a VisVideo to which a VisPalette needs to be linked. - * @param pal Pointer to a Vispalette that needs to be linked with the VisVideo. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_VIDEO_NULL on failure. - */ -int visual_video_set_palette (VisVideo *video, VisPalette *pal) -{ - visual_log_return_val_if_fail (video != NULL, -VISUAL_ERROR_VIDEO_NULL); - - video->pal = pal; - - return VISUAL_OK; -} - -/** - * Sets a buffer to a VisVideo. Links a sreenbuffer to the - * VisVideo. - * - * @warning The given @a video must be one previously created with visual_video_new(), - * and not with visual_video_new_with_buffer(). - * - * @param video Pointer to a VisVideo to which a buffer needs to be linked. - * @param buffer Pointer to a buffer that needs to be linked with the VisVideo. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_VIDEO_NULL or -VISUAL_ERROR_VIDEO_HAS_ALLOCATED on failure. - */ -int visual_video_set_buffer (VisVideo *video, void *buffer) -{ - visual_log_return_val_if_fail (video != NULL, -VISUAL_ERROR_VIDEO_NULL); - - if (HAVE_ALLOCATED_BUFFER (video)) { - visual_log (VISUAL_LOG_CRITICAL, "Trying to set a screen buffer on " - "a VisVideo structure which points to an allocated screen buffer"); - - return -VISUAL_ERROR_VIDEO_HAS_ALLOCATED; - } - - video->pixels = buffer; - - if (video->pixel_rows != NULL) - visual_mem_free (video->pixel_rows); - - video->pixel_rows = visual_mem_new0 (void *, video->height); - precompute_row_table (video); - - return VISUAL_OK; -} - -/** - * Sets the dimension for a VisVideo. Used to set the dimension for a - * surface. - * - * @param video Pointer to a VisVideo to which the dimension is set. - * @param width The width of the surface. - * @param height The height of the surface. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_VIDEO_NULL on failure. - */ -int visual_video_set_dimension (VisVideo *video, int width, int height) -{ - visual_log_return_val_if_fail (video != NULL, -VISUAL_ERROR_VIDEO_NULL); - - video->width = width; - video->height = height; - - video->pitch = video->width * video->bpp; - video->size = video->pitch * video->height; - - return VISUAL_OK; -} - -/** - * Sets the pitch for a VisVideo. Used to set the screen - * pitch for a surface. If the pitch doesn't differ from the - * screen width * bpp you only need to call the - * visual_video_set_dimension method. - * - * @param video Pointer to a VisVideo to which the pitch is set. - * @param pitch The screen pitch in bytes per line. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_VIDEO_NULL or -VISUAL_ERROR_VIDEO_INVALID_BPP on failure. - */ -int visual_video_set_pitch (VisVideo *video, int pitch) -{ - visual_log_return_val_if_fail (video != NULL, -VISUAL_ERROR_VIDEO_NULL); - - if (video->bpp <= 0) - return -VISUAL_ERROR_VIDEO_INVALID_BPP; - - video->pitch = pitch; - video->size = video->pitch * video->height; - - return VISUAL_OK; -} - -/** - * Sets the depth for a VisVideo. Used to set the depth for - * a surface. This will also define the number of bytes per pixel. - * - * @param video Pointer to a VisVideo to which the depth is set. - * @param depth The depth choosen from the VisVideoDepth enumerate. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_VIDEO_NULL on failure. - */ -int visual_video_set_depth (VisVideo *video, VisVideoDepth depth) -{ - visual_log_return_val_if_fail (video != NULL, -VISUAL_ERROR_VIDEO_NULL); - - video->depth = depth; - video->bpp = visual_video_bpp_from_depth (video->depth); - - return VISUAL_OK; -} - -/** - * Checks if a certain depth is supported by checking against an ORred depthflag. - * - * @param depthflag The ORred depthflag that we check against. - * @param depth The depth that we want to test. - * - * @return TRUE when supported, FALSE when unsupported and -VISUAL_ERROR_VIDEO_INVALID_DEPTH on failure. - */ -int visual_video_depth_is_supported (int depthflag, VisVideoDepth depth) -{ - if (visual_video_depth_is_sane (depth) == 0) - return -VISUAL_ERROR_VIDEO_INVALID_DEPTH; - - if ((depth & depthflag) > 0) - return TRUE; - - return FALSE; -} - -/** - * Get the next depth from the ORred depthflag. By giving a depth and a depthflag - * this returns the next supported depth checked from the depthflag. - * - * @see visual_video_depth_get_prev - * - * @param depthflag The ORred depthflag that we check against. - * @param depth The depth of which we want the next supported depth. - * - * @return The next supported depth or VISUAL_VIDEO_DEPTH_ERROR on failure. - */ -VisVideoDepth visual_video_depth_get_next (int depthflag, VisVideoDepth depth) -{ - int i = depth; - - if (visual_video_depth_is_sane (depth) == 0) - return VISUAL_VIDEO_DEPTH_ERROR; - - if (i == VISUAL_VIDEO_DEPTH_NONE) { - i = VISUAL_VIDEO_DEPTH_8BIT; - - if ((i & depthflag) > 0) - return i; - } - - while (i < VISUAL_VIDEO_DEPTH_GL) { - i *= 2; - - if ((i & depthflag) > 0) - return i; - } - - return depth; -} - -/** - * Get the previous depth from the ORred depthflag. By giving a depth and a depthflag - * this returns the previous supported depth checked from the depthflag. - * - * @see visual_video_depth_get_next - * - * @param depthflag The ORred depthflag that we check against. - * @param depth The depth of which we want the previous supported depth. - * - * @return The previous supported depth or VISUAL_VIDEO_DEPTH_ERROR on failure. - */ -VisVideoDepth visual_video_depth_get_prev (int depthflag, VisVideoDepth depth) -{ - int i = depth; - - if (visual_video_depth_is_sane (depth) == 0) - return VISUAL_VIDEO_DEPTH_ERROR; - - if (i == VISUAL_VIDEO_DEPTH_NONE) - return VISUAL_VIDEO_DEPTH_NONE; - - while (i > VISUAL_VIDEO_DEPTH_NONE) { - i >>= 1; - - if ((i & depthflag) > 0) - return i; - } - - return depth; -} - -/** - * Return the lowest supported graphical depth from the ORred depthflag. - * - * @param depthflag The ORred depthflag that we check against. - * - * @return The lowest supported depth or VISUAL_VIDEO_DEPTH_ERROR on failure. - */ -VisVideoDepth visual_video_depth_get_lowest (int depthflag) -{ - return visual_video_depth_get_next (depthflag, VISUAL_VIDEO_DEPTH_NONE); -} - -/** - * Return the highest supported graphical depth from the ORred depthflag. - * - * @param depthflag The ORred depthflag that we check against. - * - * @return The highest supported depth or VISUAL_VIDEO_DEPTH_ERROR on failure. - */ -VisVideoDepth visual_video_depth_get_highest (int depthflag) -{ - VisVideoDepth highest = VISUAL_VIDEO_DEPTH_NONE; - VisVideoDepth i = 0; - int firstentry = TRUE; - - while (highest != i || firstentry == TRUE) { - highest = i; - - i = visual_video_depth_get_next (depthflag, i); - - firstentry = FALSE; - } - - return highest; -} - -/** - * Return the highest supported depth that is NOT openGL. - * - * @param depthflag The ORred depthflag that we check against. - * - * @return The highest supported depth that is not openGL or - * VISUAL_VIDEO_DEPTH_ERROR on failure. - */ -VisVideoDepth visual_video_depth_get_highest_nogl (int depthflag) -{ - VisVideoDepth depth; - - depth = visual_video_depth_get_highest (depthflag); - - /* Get previous depth if the highest is openGL */ - if (depth == VISUAL_VIDEO_DEPTH_GL) { - depth = visual_video_depth_get_prev (depthflag, depth); - - /* Is it still on openGL ? Return an error */ - if (depth == VISUAL_VIDEO_DEPTH_GL) - return VISUAL_VIDEO_DEPTH_ERROR; - - } else { - return depth; - } - - return -VISUAL_ERROR_IMPOSSIBLE; -} - -/** - * Checks if a certain value is a sane depth. - * - * @param depth Depth to be checked if it's sane. - * - * @return TRUE if the depth is sane, FALSE if the depth is not sane. - */ -int visual_video_depth_is_sane (VisVideoDepth depth) -{ - int count = 0; - int i = 1; - - if (depth == VISUAL_VIDEO_DEPTH_NONE) - return TRUE; - - if (depth >= VISUAL_VIDEO_DEPTH_ENDLIST) - return FALSE; - - while (i < VISUAL_VIDEO_DEPTH_ENDLIST) { - if ((i & depth) > 0) - count++; - - if (count > 1) - return FALSE; - - i <<= 1; - } - - return TRUE; -} - -/** - * Returns the number of bits per pixel from a VisVideoDepth enumerate value. - * - * @param depth The VisVideodepth enumerate value from which the bits per pixel - * needs to be returned. - * - * @return The bits per pixel or -VISUAL_ERROR_VIDEO_INVALID_DEPTH on failure. - */ -int visual_video_depth_value_from_enum (VisVideoDepth depth) -{ - switch (depth) { - case VISUAL_VIDEO_DEPTH_8BIT: - return 8; - - case VISUAL_VIDEO_DEPTH_16BIT: - return 16; - - case VISUAL_VIDEO_DEPTH_24BIT: - return 24; - - case VISUAL_VIDEO_DEPTH_32BIT: - return 32; - - default: - return -VISUAL_ERROR_VIDEO_INVALID_DEPTH; - } - - return -VISUAL_ERROR_VIDEO_INVALID_DEPTH; -} - -/** - * Returns a VisVideoDepth enumerate value from bits per pixel. - * - * @param depthvalue Integer containing the number of bits per pixel. - * - * @return The corespondending enumerate value or VISUAL_VIDEO_DEPTH_ERROR on failure. - */ -VisVideoDepth visual_video_depth_enum_from_value (int depthvalue) -{ - switch (depthvalue) { - case 8: - return VISUAL_VIDEO_DEPTH_8BIT; - - case 16: - return VISUAL_VIDEO_DEPTH_16BIT; - - case 24: - return VISUAL_VIDEO_DEPTH_24BIT; - - case 32: - return VISUAL_VIDEO_DEPTH_32BIT; - - default: - return VISUAL_VIDEO_DEPTH_ERROR; - - } - - return -VISUAL_ERROR_IMPOSSIBLE; -} - -/** - * Returns the number of bytes per pixel from the VisVideoDepth enumerate. - * - * @param depth The VisVideodepth enumerate value from which the bytes per pixel - * needs to be returned. - * - * @return The number of bytes per pixel, -VISUAL_ERROR_VIDEO_INVALID_DEPTH on failure. - */ -int visual_video_bpp_from_depth (VisVideoDepth depth) -{ - switch (depth) { - case VISUAL_VIDEO_DEPTH_8BIT: - return 1; - - case VISUAL_VIDEO_DEPTH_16BIT: - return 2; - - case VISUAL_VIDEO_DEPTH_24BIT: - return 3; - - case VISUAL_VIDEO_DEPTH_32BIT: - return 4; - - case VISUAL_VIDEO_DEPTH_GL: - return 0; - - default: - return -VISUAL_ERROR_VIDEO_INVALID_DEPTH; - } - - return -VISUAL_ERROR_IMPOSSIBLE; -} - -/** - * This function blits a VisVideo into another VisVideo. Placement can be done and there - * is support for the alpha channel. - * - * @param dest Pointer to the destination VisVideo in which the source is overlayed. - * @param src Pointer to the source VisVideo which is overlayed in the destination. - * @param x Horizontal placement offset. - * @param y Vertical placement offset. - * @param alpha Sets if we want to check the alpha channel. Use FALSE or TRUE here. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_VIDEO_INVALID_DEPTH or -VISUAL_ERROR_VIDEO_OUT_OF_BOUNDS on failure. - */ -int visual_video_blit_overlay (VisVideo *dest, const VisVideo *src, int x, int y, int alpha) -{ - VisVideo *transform = NULL; - VisCPU *cpucaps; - const VisVideo *srcp = NULL; - - /* We can't overlay GL surfaces so don't even try */ - visual_log_return_val_if_fail (dest->depth != VISUAL_VIDEO_DEPTH_GL || - src->depth != VISUAL_VIDEO_DEPTH_GL, -VISUAL_ERROR_VIDEO_INVALID_DEPTH); - - cpucaps = visual_cpu_get_caps (); - - /* Placement is outside dest buffer, no use to continue */ - if (x > dest->width) - return -VISUAL_ERROR_VIDEO_OUT_OF_BOUNDS; - - if (y > dest->height) - return -VISUAL_ERROR_VIDEO_OUT_OF_BOUNDS; - - /* We're not the same depth, converting */ - if (dest->depth != src->depth) { - transform = visual_video_new (); - - visual_video_set_depth (transform, dest->depth); - visual_video_set_dimension (transform, src->width, src->height); - - visual_video_allocate_buffer (transform); - - visual_video_depth_transform (transform, src); - } - - /* Setting all the pointers right */ - if (transform != NULL) - srcp = transform; - else - srcp = src; - - /* We're looking at exactly the same types of VisVideo objects */ - if (visual_video_compare (dest, src) == TRUE && alpha == FALSE && x == 0 && y == 0) - visual_mem_copy (dest->pixels, src->pixels, dest->size); - else if (alpha == FALSE || src->depth != VISUAL_VIDEO_DEPTH_32BIT) - blit_overlay_noalpha (dest, srcp, x, y); - else { - if (cpucaps->hasMMX != 0) - _lv_blit_overlay_alpha32_mmx (dest, srcp, x, y); - else - blit_overlay_alpha32 (dest, srcp, x, y); - } - - - if (transform != NULL) - visual_object_unref (VISUAL_OBJECT (transform)); - - return VISUAL_OK; -} - -static int blit_overlay_noalpha (VisVideo *dest, const VisVideo *src, int x, int y) -{ - uint8_t *destbuf; - uint8_t *srcbuf; - int destp = dest->pitch; - int srcp = src->pitch; - int lwidth = (x + src->width); - int lheight = (y + src->height); - int ya, xa; - - if (lwidth > dest->width) - lwidth += dest->width - lwidth; - - if (lheight > dest->height) - lheight += dest->height - lheight; - - destbuf = dest->pixels; - srcbuf = src->pixels; - - if (lwidth < 0) - return VISUAL_OK; - - xa = x > 0 ? x : 0; - for (ya = y > 0 ? y : 0; ya < lheight; ya++) { - visual_mem_copy (destbuf + ((ya * destp) + (xa * dest->bpp)), - srcbuf + (((ya - y) * srcp) + ((xa - x) * dest->bpp)), - (lwidth - (x > 0 ? x : 0)) * dest->bpp); - } - - return VISUAL_OK; -} - -static int blit_overlay_alpha32 (VisVideo *dest, const VisVideo *src, int x, int y) -{ - uint8_t *destbuf; - uint8_t *srcbuf; - int lwidth = (x + src->width); - int lwidth4; - int lheight = (y + src->height); - int ya, xa; - uint8_t alpha; - - if (lwidth > dest->width) - lwidth += dest->width - lwidth; - - if (lheight > dest->height) - lheight += dest->height - lheight; - - destbuf = dest->pixels; - srcbuf = src->pixels; - - if (lwidth < 0) - return VISUAL_OK; - - lwidth4 = lwidth * 4; - - destbuf += ((y > 0 ? y : 0) * dest->pitch) + (x > 0 ? x * 4 : 0); - srcbuf += ((y < 0 ? abs(y) : 0) * src->pitch) + (x < 0 ? abs(x) * 4 : 0); - for (ya = y > 0 ? y : 0; ya < lheight; ya++) { - for (xa = x > 0 ? x * 4 : 0; xa < lwidth4; xa += 4) { - alpha = *(srcbuf + 3); - - *destbuf = ((alpha * (*srcbuf - *destbuf) >> 8) + *destbuf); - *(destbuf + 1) = ((alpha * (*(srcbuf + 1) - *(destbuf + 1)) >> 8) + *(destbuf + 1)); - *(destbuf + 2) = ((alpha * (*(srcbuf + 2) - *(destbuf + 2)) >> 8) + *(destbuf + 2)); - - destbuf += 4; - srcbuf += 4; - } - - destbuf += (dest->pitch - ((lwidth - x) * 4)) - (x < 0 ? x * 4 : 0); - srcbuf += x < 0 ? abs(x) * 4 : 0; - srcbuf += x + src->width > dest->width ? ((x + (src->pitch / 4)) - dest->width) * 4 : 0; - } - - return VISUAL_OK; -} - -/** - * Sets a certain color as the alpha channel and the density for the non alpha channel - * colors. This function can be only used on VISUAL_VIDEO_DEPTH_32BIT surfaces. - * - * @param video Pointer to the VisVideo in which the alpha channel is made. - * @param r The red value for the alpha channel color. - * @param g The green value for the alpha channel color. - * @param b The blue value for the alpha channel color. - * @param density The alpha density for the other colors. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_VIDEO_NULL or -VISUAL_ERROR_VIDEO_INVALID_DEPTH on failure. - */ -int visual_video_alpha_color (VisVideo *video, uint8_t r, uint8_t g, uint8_t b, uint8_t density) -{ - int col = 0; - int i; - uint32_t *vidbuf; - - visual_log_return_val_if_fail (video != NULL, -VISUAL_ERROR_VIDEO_NULL); - visual_log_return_val_if_fail (video->depth == VISUAL_VIDEO_DEPTH_32BIT, -VISUAL_ERROR_VIDEO_INVALID_DEPTH); - - col = (r << 16 | g << 8 | b); - - vidbuf = video->pixels; - - for (i = 0; i < video->size / video->bpp; i++) { - if ((vidbuf[i] & 0x00ffffff) == col) - vidbuf[i] = col; - else - vidbuf[i] += (density << 24); - } - - return VISUAL_OK; -} - -/** - * Sets a certain alpha value for the complete buffer in the VisVideo. This function - * can be only used on VISUAL_VIDEO_DEPTH_32BIT surfaces. - * - * @param video Pointer to the VisVideo in which the alpha channel density is set. - * @param density The alpha density that is to be set. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_VIDEO_NULL, -VISUAL_ERROR_VIDEO_INVALID_DEPTH on failure. - */ -int visual_video_alpha_fill (VisVideo *video, uint8_t density) -{ - int i; - uint8_t *vidbuf; - - visual_log_return_val_if_fail (video != NULL, -VISUAL_ERROR_VIDEO_NULL); - visual_log_return_val_if_fail (video->depth == VISUAL_VIDEO_DEPTH_32BIT, -VISUAL_ERROR_VIDEO_INVALID_DEPTH); - - /* FIXME byte order sensitive */ - vidbuf = video->pixels + 3; - - i = video->size; - while (i -= 4) - *(vidbuf += 4) = density; - - return VISUAL_OK; -} - -/** - * Video color transforms one VisVideo bgr pixel ordering into bgr pixel ordering. - * - * @param dest Pointer to the destination VisVideo, which should be a clone of the source VisVideo - * depth, pitch, dimension wise. - * @param src Pointer to the source VisVideo from which the bgr data is read. - * - * @return VISUAL_OK on succes, -VISUAL_ERROR_VIDEO_NOT_INDENTICAL, -VISUAL_ERROR_VIDEO_PIXELS_NULL or - * -VISUAL_ERROR_VIDEO_INVALID_DEPTH on failure. - */ -int visual_video_color_bgr_to_rgb (VisVideo *dest, const VisVideo *src) -{ - visual_log_return_val_if_fail (visual_video_compare (dest, src) == TRUE, -VISUAL_ERROR_VIDEO_NOT_INDENTICAL); - visual_log_return_val_if_fail (dest->pixels != NULL, -VISUAL_ERROR_VIDEO_PIXELS_NULL); - visual_log_return_val_if_fail (src->pixels != NULL, -VISUAL_ERROR_VIDEO_PIXELS_NULL); - visual_log_return_val_if_fail (dest->depth != VISUAL_VIDEO_DEPTH_8BIT, -VISUAL_ERROR_VIDEO_INVALID_DEPTH); - - if (dest->depth == VISUAL_VIDEO_DEPTH_16BIT) - bgr_to_rgb16 (dest, src); - else if (dest->depth == VISUAL_VIDEO_DEPTH_24BIT) - bgr_to_rgb24 (dest, src); - else if (dest->depth == VISUAL_VIDEO_DEPTH_32BIT) - bgr_to_rgb32 (dest, src); - - return VISUAL_OK; -} - -/** - * Video depth transforms one VisVideo into another using the depth information - * stored within the VisVideos. The dimension should be equal however the pitch - * value of the destination may be set. - * - * @param viddest Pointer to the destination VisVideo to which the source - * VisVideo is transformed. - * @param vidsrc Pointer to the source VisVideo. - * - * @return VISUAL_OK on succes, error values returned by visual_video_blit_overlay or - * visual_video_depth_transform_to_buffer on failure. - */ -int visual_video_depth_transform (VisVideo *viddest, const VisVideo *vidsrc) -{ - /* We blit overlay it instead of just visual_mem_copy because the pitch can still be different */ - if (viddest->depth == vidsrc->depth) - return visual_video_blit_overlay (viddest, vidsrc, 0, 0, FALSE); - - return visual_video_depth_transform_to_buffer (viddest->pixels, - vidsrc, vidsrc->pal, viddest->depth, viddest->pitch); -} - -/** - * Less abstract video depth transform used by visual_video_depth_transform. - * - * @see visual_video_depth_transform - * - * @param dest Destination buffer. - * @param video Source VisVideo. - * @param pal Pointer to a VisPalette that can be set by full color to indexed color transforms. - * @param destdepth The destination depth. - * @param pitch The destination number of bytes per line. - * - * return VISUAL_OK on succes -VISUAL_ERROR_VIDEO_NULL, -VISUAL_ERROR_PALETTE_NULL, -VISUAL_ERROR_PALETTE_SIZE - * or -VISUAL_ERROR_VIDEO_NOT_TRANSFORMED on failure. - */ -int visual_video_depth_transform_to_buffer (uint8_t *dest, const VisVideo *video, - VisPalette *pal, VisVideoDepth destdepth, int pitch) -{ - uint8_t *srcbuf = video->pixels; - int width = video->width; - int height = video->height; - - visual_log_return_val_if_fail (video != NULL, -VISUAL_ERROR_VIDEO_NULL); - - if (destdepth == VISUAL_VIDEO_DEPTH_8BIT || video->depth == VISUAL_VIDEO_DEPTH_8BIT) { - visual_log_return_val_if_fail (pal != NULL, -VISUAL_ERROR_PALETTE_NULL); - visual_log_return_val_if_fail (pal->ncolors == 256, -VISUAL_ERROR_PALETTE_SIZE); - } - - /* Destdepth is equal to sourcedepth case */ - if (video->depth == destdepth) { - visual_mem_copy (dest, video->pixels, video->width * video->height * video->bpp); - - return VISUAL_OK; - } - - if (video->depth == VISUAL_VIDEO_DEPTH_8BIT) { - - if (destdepth == VISUAL_VIDEO_DEPTH_16BIT) - return depth_transform_8_to_16_c (dest, srcbuf, width, height, pitch, pal); - - if (destdepth == VISUAL_VIDEO_DEPTH_24BIT) - return depth_transform_8_to_24_c (dest, srcbuf, width, height, pitch, pal); - - if (destdepth == VISUAL_VIDEO_DEPTH_32BIT) - return depth_transform_8_to_32_c (dest, srcbuf, width, height, pitch, pal); - - } else if (video->depth == VISUAL_VIDEO_DEPTH_16BIT) { - - if (destdepth == VISUAL_VIDEO_DEPTH_8BIT) - return depth_transform_16_to_8_c (dest, srcbuf, width, height, pitch, pal); - - if (destdepth == VISUAL_VIDEO_DEPTH_24BIT) - return depth_transform_16_to_24_c (dest, srcbuf, width, height, pitch, NULL); - - if (destdepth == VISUAL_VIDEO_DEPTH_32BIT) - return depth_transform_16_to_32_c (dest, srcbuf, width, height, pitch, NULL); - - } else if (video->depth == VISUAL_VIDEO_DEPTH_24BIT) { - - if (destdepth == VISUAL_VIDEO_DEPTH_8BIT) - return depth_transform_24_to_8_c (dest, srcbuf, width, height, pitch, pal); - - if (destdepth == VISUAL_VIDEO_DEPTH_16BIT) - return depth_transform_24_to_16_c (dest, srcbuf, width, height, pitch, NULL); - - if (destdepth == VISUAL_VIDEO_DEPTH_32BIT) - return depth_transform_24_to_32_c (dest, srcbuf, width, height, pitch, NULL); - - } else if (video->depth == VISUAL_VIDEO_DEPTH_32BIT) { - - if (destdepth == VISUAL_VIDEO_DEPTH_8BIT) - return depth_transform_32_to_8_c (dest, srcbuf, width, height, pitch, pal); - - if (destdepth == VISUAL_VIDEO_DEPTH_16BIT) - return depth_transform_32_to_16_c (dest, srcbuf, width, height, pitch, NULL); - - if (destdepth == VISUAL_VIDEO_DEPTH_24BIT) - return depth_transform_32_to_24_c (dest, srcbuf, width, height, pitch, NULL); - } - - return -VISUAL_ERROR_VIDEO_NOT_TRANSFORMED; -} - -/** - * @} - */ - -/* Depth transform C code */ -/* FIXME TODO depths: c sse mmx altivec - * 8 - 16 x - * 8 - 24 x - * 8 - 32 x - * 16 - 8 x - * 16 - 24 x - * 16 - 32 x - * 24 - 8 x - * 24 - 16 x - * 24 - 32 x - * 32 - 8 x - * 32 - 24 x - * 32 - 16 x - */ - -static int depth_transform_8_to_16_c (uint8_t *dest, uint8_t *src, int width, int height, int pitch, VisPalette *pal) -{ - int x, y; - int i; - _color16 *destr = (_color16 *) dest; - int pitchdiff = (pitch - (width * 2)) >> 1; - _color16 colors[256]; - - for (i = 0; i < 256; i++) { - colors[i].r = pal->colors[i].r >> 3; - colors[i].g = pal->colors[i].g >> 2; - colors[i].b = pal->colors[i].b >> 3; - } - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) - *destr++ = colors[*src++]; - - destr += pitchdiff; - } - - return VISUAL_OK; -} - -static int depth_transform_8_to_24_c (uint8_t *dest, uint8_t *src, int width, int height, int pitch, VisPalette *pal) -{ - int x, y; - int pitchdiff = pitch - (width * 3); - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - *(dest++) = pal->colors[*(src)].r; - *(dest++) = pal->colors[*(src)].g; - *(dest++) = pal->colors[*(src)].b; - src++; - } - - dest += pitchdiff; - } - - return VISUAL_OK; -} - -static int depth_transform_8_to_32_c (uint8_t *dest, uint8_t *src, int width, int height, int pitch, VisPalette *pal) -{ - int x, y, i; - uint32_t *destr = (uint32_t *) dest; - uint32_t col; - int pitchdiff = (pitch - (width * 4)) >> 2; - - uint32_t colors[256]; - - for (i = 0; i < 256; i++) { - colors[i] = - pal->colors[i].r << 16 | - pal->colors[i].g << 8 | - pal->colors[i].b; - } - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) - *destr++ = colors[*src++]; - - destr += pitchdiff; - } - - return VISUAL_OK; -} - -static int depth_transform_16_to_8_c (uint8_t *dest, uint8_t *src, int width, int height, int pitch, VisPalette *pal) -{ - int x, y; - int i = 0, j = 0; - _color16 *srcr = (_color16 *) src; - uint8_t r, g, b; - uint8_t col; - int pitchdiff = pitch - width; - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - r = srcr[j].r << 3; - g = srcr[j].g << 2; - b = srcr[j].b << 3; - j++; - - /* FIXME optimize */ - col = (r + g + b) / 3; - - pal->colors[col].r = r; - pal->colors[col].g = g; - pal->colors[col].b = b; - - dest[i++] = col; - } - - i += pitchdiff; - } - - return VISUAL_OK; -} - -static int depth_transform_16_to_24_c (uint8_t *dest, uint8_t *src, int width, int height, int pitch, VisPalette *pal) -{ - int x, y; - int i = 0, j = 0; - _color16 *srcr = (_color16 *) src; - int pitchdiff = pitch - (width * 3); - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - dest[j++] = srcr[i].r << 3; - dest[j++] = srcr[i].g << 2; - dest[j++] = srcr[i].b << 3; - i++; - } - - j += pitchdiff; - } - - return VISUAL_OK; -} - -static int depth_transform_16_to_32_c (uint8_t *dest, uint8_t *src, int width, int height, int pitch, VisPalette *pal) -{ - int x, y; - int i = 0, j = 0; - _color16 *srcr = (_color16 *) src; - int pitchdiff = pitch - (width * 4); - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - dest[j++] = srcr[i].b << 3; - dest[j++] = srcr[i].g << 2; - dest[j++] = srcr[i].r << 3; - dest[j++] = 0; - i++; - } - - j += pitchdiff; - } - - return VISUAL_OK; -} - -static int depth_transform_24_to_8_c (uint8_t *dest, uint8_t *src, int width, int height, int pitch, VisPalette *pal) -{ - int x, y; - int i = 0, j = 0; - uint8_t r, g, b; - uint8_t col; - int pitchdiff = pitch - width; - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - b = src[j++]; - g = src[j++]; - r = src[j++]; - - /* FIXME optimize */ - col = (b + g + r) / 3; - - pal->colors[col].r = r; - pal->colors[col].g = g; - pal->colors[col].b = b; - - dest[i++] = col; - } - - i += pitchdiff; - } - - return VISUAL_OK; -} - -static int depth_transform_24_to_16_c (uint8_t *dest, uint8_t *src, int width, int height, int pitch, VisPalette *pal) -{ - int x, y; - int i = 0, j = 0; - _color16 *destr = (_color16 *) dest; - int pitchdiff = (pitch - (width * 2)) >> 1; - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - destr[i].b = src[j++] >> 3; - destr[i].g = src[j++] >> 2; - destr[i].r = src[j++] >> 3; - i++; - } - - i += pitchdiff; - } - - return VISUAL_OK; -} - -static int depth_transform_24_to_32_c (uint8_t *dest, uint8_t *src, int width, int height, int pitch, VisPalette *pal) -{ - int x, y; - int i = 0, j = 0; - int pitchdiff = pitch - (width * 4); - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - dest[j++] = src[i++]; - dest[j++] = src[i++]; - dest[j++] = src[i++]; - dest[j++] = 0; - } - - j += pitchdiff; - } - - return VISUAL_OK; -} - -static int depth_transform_32_to_8_c (uint8_t *dest, uint8_t *src, int width, int height, int pitch, VisPalette *pal) -{ - int x, y; - int i = 0, j = 0; - uint8_t r, g, b; - uint8_t col; - int pitchdiff = pitch - width; - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - r = src[j++]; - g = src[j++]; - b = src[j++]; - j++; - - /* FIXME optimize */ - col = (r + g + b) / 3; - - pal->colors[col].r = r; - pal->colors[col].g = g; - pal->colors[col].b = b; - - dest[i++] = col; - } - - i += pitchdiff; - } - - return VISUAL_OK; -} - -static int depth_transform_32_to_16_c (uint8_t *dest, uint8_t *src, int width, int height, int pitch, VisPalette *pal) -{ - int x, y; - int i = 0, j = 0; - _color16 *destr = (_color16 *) dest; - int pitchdiff = (pitch - (width * 2)) >> 1; - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - destr[i].r = src[j++] >> 3; - destr[i].g = src[j++] >> 2; - destr[i].b = src[j++] >> 3; - j++; - i++; - } - - i += pitchdiff; - } - - return VISUAL_OK; -} - -static int depth_transform_32_to_24_c (uint8_t *dest, uint8_t *src, int width, int height, int pitch, VisPalette *pal) -{ - int x, y; - int i = 0, j = 0; - int pitchdiff = pitch - (width * 3); - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - dest[i++] = src[j++]; - dest[i++] = src[j++]; - dest[i++] = src[j++]; - j++; - } - - i += pitchdiff; - } - - return VISUAL_OK; -} - -static int bgr_to_rgb16 (VisVideo *dest, const VisVideo *src) -{ - _color16 *destbuf, *srcbuf; - int x, y; - int i = 0; - int pitchdiff = (dest->pitch - (dest->width * 2)) >> 1; - - destbuf = (_color16 *) dest->pixels; - srcbuf = (_color16 *) src->pixels; - - for (y = 0; y < dest->height; y++) { - for (x = 0; x < dest->width; x++) { - destbuf[i].b = srcbuf[i].r; - destbuf[i].g = srcbuf[i].g; - destbuf[i].r = srcbuf[i].b; - i++; - } - - i += pitchdiff; - } - - return VISUAL_OK; -} - -static int bgr_to_rgb24 (VisVideo *dest, const VisVideo *src) -{ - uint8_t *destbuf, *srcbuf; - int x, y; - int i = 0; - int pitchdiff = dest->pitch - (dest->width * 3); - - destbuf = dest->pixels; - srcbuf = src->pixels; - - for (y = 0; y < dest->height; y++) { - for (x = 0; x < dest->width; x++) { - destbuf[i + 2] = srcbuf[i]; - destbuf[i + 1] = srcbuf[i + 1]; - destbuf[i] = srcbuf[i + 2]; - - i += 3; - } - - i += pitchdiff; - } - - return VISUAL_OK; -} - -static int bgr_to_rgb32 (VisVideo *dest, const VisVideo *src) -{ - uint8_t *destbuf, *srcbuf; - int x, y; - int i = 0; - int pitchdiff = dest->pitch - (dest->width * 4); - - destbuf = dest->pixels; - srcbuf = src->pixels; - - for (y = 0; y < dest->height; y++) { - for (x = 0; x < dest->width; x++) { - destbuf[i + 2] = srcbuf[i]; - destbuf[i + 1] = srcbuf[i + 1]; - destbuf[i] = srcbuf[i + 2]; - - destbuf[i + 3] = srcbuf[i + 3]; - - i += 4; - } - - i += pitchdiff; - } - - return VISUAL_OK; -} - -/** - * Scale video. - * - * @param dest Pointer to VisVideo object for storing scaled image. - * @param src Pointer to VisVideo object whose image is to be scaled. - * @param scale_method Scaling method to use. - * - * @return VISUAL_OK on success, -VISUAL_ERROR_VIDEO_NULL or -VISUAL_ERROR_VIDEO_INVALID_DEPTH on failure. - */ -int visual_video_scale (VisVideo *dest, const VisVideo *src, VisVideoScaleMethod scale_method) -{ - VisCPU *cpucaps; - - visual_log_return_val_if_fail (dest != NULL, -VISUAL_ERROR_VIDEO_NULL); - visual_log_return_val_if_fail (src != NULL, -VISUAL_ERROR_VIDEO_NULL); - visual_log_return_val_if_fail (dest->depth == src->depth, -VISUAL_ERROR_VIDEO_INVALID_DEPTH); - visual_log_return_val_if_fail (scale_method == VISUAL_VIDEO_SCALE_NEAREST || - scale_method == VISUAL_VIDEO_SCALE_BILINEAR, -VISUAL_ERROR_VIDEO_INVALID_SCALE_METHOD); - - cpucaps = visual_cpu_get_caps (); - - switch (dest->depth) { - case VISUAL_VIDEO_DEPTH_8BIT: - if (scale_method == VISUAL_VIDEO_SCALE_NEAREST) - scale_nearest_8 (dest, src); - else if (scale_method == VISUAL_VIDEO_SCALE_BILINEAR) - scale_bilinear_8 (dest, src); - - break; - - case VISUAL_VIDEO_DEPTH_16BIT: - if (scale_method == VISUAL_VIDEO_SCALE_NEAREST) - scale_nearest_16 (dest, src); - else if (scale_method == VISUAL_VIDEO_SCALE_BILINEAR) - scale_bilinear_16 (dest, src); - - break; - - case VISUAL_VIDEO_DEPTH_24BIT: - if (scale_method == VISUAL_VIDEO_SCALE_NEAREST) - scale_nearest_24 (dest, src); - else if (scale_method == VISUAL_VIDEO_SCALE_BILINEAR) - scale_bilinear_24 (dest, src); - - break; - - case VISUAL_VIDEO_DEPTH_32BIT: - if (scale_method == VISUAL_VIDEO_SCALE_NEAREST) - scale_nearest_32 (dest, src); - else if (scale_method == VISUAL_VIDEO_SCALE_BILINEAR) { - if (cpucaps->hasMMX != 0) - _lv_scale_bilinear_32_mmx (dest, src); - else - scale_bilinear_32 (dest, src); - } - - break; - - default: - visual_log (VISUAL_LOG_CRITICAL, "Invalid depth passed to the scaler"); - - return -VISUAL_ERROR_VIDEO_INVALID_DEPTH; - - break; - } - - return VISUAL_OK; -} - -static int scale_nearest_8 (VisVideo *dest, const VisVideo *src) -{ - int x, y; - uint32_t u, v, du, dv; /* fixed point 16.16 */ - uint8_t *dest_pixel, *src_pixel_row; - - du = (src->width << 16) / dest->width; - dv = (src->height << 16) / dest->height; - v = 0; - - dest_pixel = dest->pixels; - - for (y = 0; y < dest->height; y++, v += dv) { - src_pixel_row = (uint8_t *) src->pixel_rows[v >> 16]; - - if (v >> 16 >= src->height) - v -= 0x10000; - - u = 0; - for (x = 0; x < dest->width; x++, u += du) - *dest_pixel++ = src_pixel_row[u >> 16]; - - dest_pixel += dest->pitch - dest->width; - } - - return VISUAL_OK; -} - -static int scale_nearest_16 (VisVideo *dest, const VisVideo *src) -{ - int x, y; - uint32_t u, v, du, dv; /* fixed point 16.16 */ - uint16_t *dest_pixel, *src_pixel_row; - - du = (src->width << 16) / dest->width; - dv = (src->height << 16) / dest->height; - v = 0; - - dest_pixel = dest->pixels; - - for (y = 0; y < dest->height; y++, v += dv) { - src_pixel_row = (uint16_t *) src->pixel_rows[v >> 16]; - - if (v >> 16 >= src->height) - v -= 0x10000; - - u = 0; - for (x = 0; x < dest->width; x++, u += du) - *dest_pixel++ = src_pixel_row[u >> 16]; - - dest_pixel += (dest->pitch / 2) - dest->width; - } - - return VISUAL_OK; -} - -/* FIXME this version is of course butt ugly */ -/* IF color24 is allowed use it here as well */ -static int scale_nearest_24 (VisVideo *dest, const VisVideo *src) -{ - int x, y; - uint32_t u, v, du, dv; /* fixed point 16.16 */ - _color24 *dest_pixel, *src_pixel_row; - - du = (src->width << 16) / dest->width; - dv = (src->height << 16) / dest->height; - v = 0; - - dest_pixel = dest->pixels; - - for (y = 0; y < dest->height; y++, v += dv) { - src_pixel_row = (_color24 *) src->pixel_rows[v >> 16]; - - if (v >> 16 >= src->height) - v -= 0x10000; - - u = 0; - for (x = 0; x < dest->width; x++, u += du) - *dest_pixel++ = src_pixel_row[u >> 16]; - - dest_pixel += (dest->pitch / 3) - dest->width; - } - - return VISUAL_OK; -} - -static int scale_nearest_32 (VisVideo *dest, const VisVideo *src) -{ - int x, y; - uint32_t u, v, du, dv; /* fixed point 16.16 */ - uint32_t *dest_pixel, *src_pixel_row; - - du = (src->width << 16) / dest->width; - dv = (src->height << 16) / dest->height; - v = 0; - - dest_pixel = dest->pixels; - - for (y = 0; y < dest->height; y++, v += dv) { - src_pixel_row = (uint32_t *) src->pixel_rows[v >> 16]; - - if (v >> 16 >= src->height) - v -= 0x10000; - - u = 0; - for (x = 0; x < dest->width; x++, u += du) - *dest_pixel++ = src_pixel_row[u >> 16]; - - dest_pixel += (dest->pitch / 4) - dest->width; - } - - return VISUAL_OK; -} - -static int scale_bilinear_8 (VisVideo *dest, const VisVideo *src) -{ - uint32_t y; - uint32_t u, v, du, dv; /* fixed point 16.16 */ - uint8_t *dest_pixel, *src_pixel_rowu, *src_pixel_rowl; - - dest_pixel = dest->pixels; - - du = ((src->width - 1) << 16) / dest->width; - dv = ((src->height - 1) << 16) / dest->height; - v = 0; - - for (y = dest->height; y--; v += dv) { - uint32_t x; - uint32_t fracU, fracV; /* fixed point 24.8 [0,1[ */ - - if (v >> 16 >= src->height - 1) - v -= 0x10000; - - src_pixel_rowu = (uint8_t *) src->pixel_rows[v >> 16]; - src_pixel_rowl = (uint8_t *) src->pixel_rows[(v >> 16) + 1]; - - /* fracV = frac(v) = v & 0xffff */ - /* fixed point format convertion: fracV >>= 8) */ - fracV = (v & 0xffff) >> 8; - u = 0; - - for (x = dest->width - 1; x--; u += du) { - uint8_t cul, cll, cur, clr, b; - uint32_t ul, ll, ur, lr; /* fixed point 16.16 [0,1[ */ - uint32_t b0; /* fixed point 16.16 [0,255[ */ - - /* fracU = frac(u) = u & 0xffff */ - /* fixed point format convertion: fracU >>= 8) */ - fracU = (u & 0xffff) >> 8; - - /* notice 0x100 = 1.0 (fixed point 24.8) */ - ul = (0x100 - fracU) * (0x100 - fracV); - ll = (0x100 - fracU) * fracV; - ur = fracU * (0x100 - fracV); - lr = fracU * fracV; - - cul = src_pixel_rowu[u >> 16]; - cll = src_pixel_rowl[u >> 16]; - cur = src_pixel_rowu[(u >> 16) + 1]; - clr = src_pixel_rowl[(u >> 16) + 1]; - - b0 = ul * cul; - b0 += ll * cll; - b0 += ur * cur; - b0 += lr * clr; - - *dest_pixel++ = b0 >> 16; - } - - memset (dest_pixel, 0, dest->pitch - (dest->width - 1)); - dest_pixel += dest->pitch - (dest->width - 1); - - } - - return VISUAL_OK; -} - -static int scale_bilinear_16 (VisVideo *dest, const VisVideo *src) -{ - uint32_t y; - uint32_t u, v, du, dv; /* fixed point 16.16 */ - _color16 *dest_pixel, *src_pixel_rowu, *src_pixel_rowl; - dest_pixel = dest->pixels; - - du = ((src->width - 1) << 16) / dest->width; - dv = ((src->height - 1) << 16) / dest->height; - v = 0; - - for (y = dest->height; y--; v += dv) { - uint32_t x; - uint32_t fracU, fracV; /* fixed point 24.8 [0,1[ */ - - if (v >> 16 >= src->height - 1) - v -= 0x10000; - - src_pixel_rowu = (_color16 *) src->pixel_rows[v >> 16]; - src_pixel_rowl = (_color16 *) src->pixel_rows[(v >> 16) + 1]; - - /* fracV = frac(v) = v & 0xffff */ - /* fixed point format convertion: fracV >>= 8) */ - fracV = (v & 0xffff) >> 8; - u = 0.0; - - for (x = dest->width - 1; x--; u += du) { - _color16 cul, cll, cur, clr, b; - uint32_t ul, ll, ur, lr; /* fixed point 16.16 [0,1[ */ - uint32_t b3, b2, b1, b0; /* fixed point 16.16 [0,255[ */ - - /* fracU = frac(u) = u & 0xffff */ - /* fixed point format convertion: fracU >>= 8) */ - fracU = (u & 0xffff) >> 8; - - /* notice 0x100 = 1.0 (fixed point 24.8) */ - ul = (0x100 - fracU) * (0x100 - fracV); - ll = (0x100 - fracU) * fracV; - ur = fracU * (0x100 - fracV); - lr = fracU * fracV; - - cul = src_pixel_rowu[u >> 16]; - cll = src_pixel_rowl[u >> 16]; - cur = src_pixel_rowu[(u >> 16) + 1]; - clr = src_pixel_rowl[(u >> 16) + 1]; - - b0 = ul * cul.r; - b1 = ul * cul.g; - b2 = ul * cul.b; - - b0 += ll * cll.r; - b1 += ll * cll.g; - b2 += ll * cll.b; - - b0 += ur * cur.r; - b1 += ur * cur.g; - b2 += ur * cur.b; - - b0 += lr * clr.r; - b1 += lr * clr.g; - b2 += lr * clr.b; - - b.r = b0 >> 16; - b.g = b1 >> 16; - b.b = b2 >> 16; - - *dest_pixel++ = b; - } - - memset (dest_pixel, 0, (dest->pitch - ((dest->width - 1) * 2))); - dest_pixel += (dest->pitch / 2) - ((dest->width - 1)); - } - - return VISUAL_OK; -} - -static int scale_bilinear_24 (VisVideo *dest, const VisVideo *src) -{ - uint32_t y; - uint32_t u, v, du, dv; /* fixed point 16.16 */ - _color24 *dest_pixel, *src_pixel_rowu, *src_pixel_rowl; - dest_pixel = dest->pixels; - - du = ((src->width - 1) << 16) / dest->width; - dv = ((src->height - 1) << 16) / dest->height; - v = 0; - - for (y = dest->height; y--; v += dv) { - uint32_t x; - uint32_t fracU, fracV; /* fixed point 24.8 [0,1[ */ - - if (v >> 16 >= src->height - 1) - v -= 0x10000; - - src_pixel_rowu = (_color24 *) src->pixel_rows[v >> 16]; - src_pixel_rowl = (_color24 *) src->pixel_rows[(v >> 16) + 1]; - - /* fracV = frac(v) = v & 0xffff */ - /* fixed point format convertion: fracV >>= 8) */ - fracV = (v & 0xffff) >> 8; - u = 0; - - for (x = dest->width - 1; x--; u += du) { - _color24 cul, cll, cur, clr, b; - uint32_t ul, ll, ur, lr; /* fixed point 16.16 [0,1[ */ - uint32_t b3, b2, b1, b0; /* fixed point 16.16 [0,255[ */ - - /* fracU = frac(u) = u & 0xffff */ - /* fixed point format convertion: fracU >>= 8) */ - fracU = (u & 0xffff) >> 8; - - /* notice 0x100 = 1.0 (fixed point 24.8) */ - ul = (0x100 - fracU) * (0x100 - fracV); - ll = (0x100 - fracU) * fracV; - ur = fracU * (0x100 - fracV); - lr = fracU * fracV; - - cul = src_pixel_rowu[u >> 16]; - cll = src_pixel_rowl[u >> 16]; - cur = src_pixel_rowu[(u >> 16) + 1]; - clr = src_pixel_rowl[(u >> 16) + 1]; - - b0 = ul * cul.r; - b1 = ul * cul.g; - b2 = ul * cul.b; - - b0 += ll * cll.r; - b1 += ll * cll.g; - b2 += ll * cll.b; - - b0 += ur * cur.r; - b1 += ur * cur.g; - b2 += ur * cur.b; - - b0 += lr * clr.r; - b1 += lr * clr.g; - b2 += lr * clr.b; - - b.r = b0 >> 16; - b.g = b1 >> 16; - b.b = b2 >> 16; - - *dest_pixel++ = b; - } - - memset (dest_pixel, 0, (dest->pitch - ((dest->width - 1) * 3))); - dest_pixel += (dest->pitch / 3) - ((dest->width - 1)); - } - - return VISUAL_OK; -} - -static int scale_bilinear_32 (VisVideo *dest, const VisVideo *src) -{ - uint32_t y; - uint32_t u, v, du, dv; /* fixed point 16.16 */ - uint32_t *dest_pixel, *src_pixel_rowu, *src_pixel_rowl; - - dest_pixel = dest->pixels; - - du = ((src->width - 1) << 16) / dest->width; - dv = ((src->height - 1) << 16) / dest->height; - v = 0; - - for (y = dest->height; y--; v += dv) { - uint32_t x; - uint32_t fracU, fracV; /* fixed point 24.8 [0,1[ */ - - if (v >> 16 >= src->height - 1) - v -= 0x10000; - - src_pixel_rowu = (uint32_t *) src->pixel_rows[v >> 16]; - src_pixel_rowl = (uint32_t *) src->pixel_rows[(v >> 16) + 1]; - - /* fracV = frac(v) = v & 0xffff */ - /* fixed point format convertion: fracV >>= 8) */ - fracV = (v & 0xffff) >> 8; - u = 0; - - for (x = dest->width - 1; x--; u += du) { - union { - uint8_t c8[4]; - uint32_t c32; - } cul, cll, cur, clr, b; - uint32_t ul, ll, ur, lr; /* fixed point 16.16 [0,1[ */ - uint32_t b3, b2, b1, b0; /* fixed point 16.16 [0,255[ */ - - /* fracU = frac(u) = u & 0xffff */ - /* fixed point format convertion: fracU >>= 8) */ - fracU = (u & 0xffff) >> 8; - - /* notice 0x100 = 1.0 (fixed point 24.8) */ - ul = (0x100 - fracU) * (0x100 - fracV); - ll = (0x100 - fracU) * fracV; - ur = fracU * (0x100 - fracV); - lr = fracU * fracV; - - cul.c32 = src_pixel_rowu[u >> 16]; - cll.c32 = src_pixel_rowl[u >> 16]; - cur.c32 = src_pixel_rowu[(u >> 16) + 1]; - clr.c32 = src_pixel_rowl[(u >> 16) + 1]; - - b0 = ul * cul.c8[0]; - b1 = ul * cul.c8[1]; - b2 = ul * cul.c8[2]; - b3 = ul * cul.c8[3]; - - b0 += ll * cll.c8[0]; - b1 += ll * cll.c8[1]; - b2 += ll * cll.c8[2]; - b3 += ll * cll.c8[3]; - - b0 += ur * cur.c8[0]; - b1 += ur * cur.c8[1]; - b2 += ur * cur.c8[2]; - b3 += ur * cur.c8[3]; - - b0 += lr * clr.c8[0]; - b1 += lr * clr.c8[1]; - b2 += lr * clr.c8[2]; - b3 += lr * clr.c8[3]; - - b.c8[0] = b0 >> 16; - b.c8[1] = b1 >> 16; - b.c8[2] = b2 >> 16; - b.c8[3] = b3 >> 16; - - *dest_pixel++ = b.c32; - } - - memset (dest_pixel, 0, (dest->pitch - ((dest->width - 1) * 4))); - dest_pixel += (dest->pitch / 4) - ((dest->width - 1)); - - } - - return VISUAL_OK; -} -
--- a/libvisual/lv_video.h Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,155 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * Duilio J. Protti <dprotti@users.sourceforge.net> - * Chong Kai Xiong <descender@phreaker.net> - * Jean-Christophe Hoelt <jeko@ios-software.com> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _LV_VIDEO_H -#define _LV_VIDEO_H - -#include <libvisual/lv_common.h> -#include <libvisual/lv_palette.h> - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#define VISUAL_VIDEO(obj) (VISUAL_CHECK_CAST ((obj), 0, VisVideo)) - -/* NOTE: The depth find helper code in lv_actor depends on an arrangment from low to high */ - -/** - * Video flags, for internal use only. - */ -typedef enum { - VISUAL_VIDEO_FLAG_NONE = 0, /**< No flags. */ - VISUAL_VIDEO_FLAG_ALLOCATED_BUFFER = 1, /**< Libvisual allocated this buffer. */ - VISUAL_VIDEO_FLAG_EXTERNAL_BUFFER = 2, /**< External allocated buffer. */ -} VisVideoFlags; - -/** - * Enumerate that defines video depths for use within plugins, libvisual functions, etc. - */ -typedef enum { - VISUAL_VIDEO_DEPTH_NONE = 0, /**< No video surface flag. */ - VISUAL_VIDEO_DEPTH_8BIT = 1, /**< 8 bits indexed surface flag. */ - VISUAL_VIDEO_DEPTH_16BIT = 2, /**< 16 bits 5-6-5 surface flag. */ - VISUAL_VIDEO_DEPTH_24BIT = 4, /**< 24 bits surface flag. */ - VISUAL_VIDEO_DEPTH_32BIT = 8, /**< 32 bits surface flag. */ - VISUAL_VIDEO_DEPTH_GL = 16, /**< openGL surface flag. */ - VISUAL_VIDEO_DEPTH_ENDLIST = 32, /**< Used to mark the end of the depth list. */ - VISUAL_VIDEO_DEPTH_ERROR = -1, /**< Used when there is an error. */ - VISUAL_VIDEO_DEPTH_ALL = VISUAL_VIDEO_DEPTH_8BIT | \ - VISUAL_VIDEO_DEPTH_16BIT | \ - VISUAL_VIDEO_DEPTH_24BIT | \ - VISUAL_VIDEO_DEPTH_32BIT | \ - VISUAL_VIDEO_DEPTH_GL /**< All graphical depths. */ -} VisVideoDepth; - -/** - * Enumerate that defines the different methods of scaling within VisVideo. - */ -typedef enum { - VISUAL_VIDEO_SCALE_NEAREST = 0, /**< Nearest neighbour. */ - VISUAL_VIDEO_SCALE_BILINEAR = 1 /**< Bilinearly interpolated. */ -} VisVideoScaleMethod; - - -typedef struct _VisVideo VisVideo; - -/** - * Data structure that contains all the information about a screen surface. - * Contains all the information regarding a screen surface like the current depth it's in, - * width, height, bpp, the size in bytes it's pixel buffer is and the screen pitch. - * - * It also contains a pointer to the pixels and an optional pointer to the palette. - * - * Elements within the structure should be set using the VisVideo system it's methods. - */ -struct _VisVideo { - VisObject object; /**< The VisObject data. */ - - VisVideoDepth depth; /**< Surface it's depth. */ - int width; /**< Surface it's width. */ - int height; /**< Surface it's height. */ - int bpp; /**< Surface it's bytes per pixel. */ - int size; /**< Surface it's screen buffer size in bytes. */ - int pitch; /**< Surface it's pitch value. Value contains - * the number of bytes per line. */ - void *pixels; /**< Pointer to the pixels. */ - void **pixel_rows; /**< Pixel row start pointer table. */ - VisPalette *pal; /**< Optional pointer to the palette. */ - - VisVideoFlags flags; /**< Private field */ -}; - -/* prototypes */ -VisVideo *visual_video_new (void); -VisVideo *visual_video_new_with_buffer (int width, int height, VisVideoDepth depth); -int visual_video_free_buffer (VisVideo *video); -int visual_video_allocate_buffer (VisVideo *video); -int visual_video_have_allocated_buffer (const VisVideo *video); -int visual_video_clone (VisVideo *dest, const VisVideo *src); -int visual_video_compare (const VisVideo *src1, const VisVideo *src2); - -int visual_video_set_palette (VisVideo *video, VisPalette *pal); -int visual_video_set_buffer (VisVideo *video, void *buffer); -int visual_video_set_dimension (VisVideo *video, int width, int height); -int visual_video_set_pitch (VisVideo *video, int pitch); -int visual_video_set_depth (VisVideo *video, VisVideoDepth depth); - -int visual_video_depth_is_supported (int depthflag, VisVideoDepth depth); -VisVideoDepth visual_video_depth_get_next (int depthflag, VisVideoDepth depth); -VisVideoDepth visual_video_depth_get_prev (int depthflag, VisVideoDepth depth); -VisVideoDepth visual_video_depth_get_lowest (int depthflag); -VisVideoDepth visual_video_depth_get_highest (int depthflag); -VisVideoDepth visual_video_depth_get_highest_nogl (int depthflag); -int visual_video_depth_is_sane (VisVideoDepth depth); -int visual_video_depth_value_from_enum (VisVideoDepth depth); -VisVideoDepth visual_video_depth_enum_from_value (int depthvalue); - -int visual_video_bpp_from_depth (VisVideoDepth depth); - -int visual_video_blit_overlay (VisVideo *dest, const VisVideo *src, int x, int y, int alpha); - -int visual_video_alpha_color (VisVideo *video, uint8_t r, uint8_t g, uint8_t b, uint8_t density); -int visual_video_alpha_fill (VisVideo *video, uint8_t density); - -int visual_video_color_bgr_to_rgb (VisVideo *dest, const VisVideo *src); - -int visual_video_depth_transform (VisVideo *viddest, const VisVideo *vidsrc); -int visual_video_depth_transform_to_buffer (uint8_t *dest, const VisVideo *video, - VisPalette *pal, VisVideoDepth destdepth, int pitch); - -int visual_video_scale (VisVideo *dest, const VisVideo *src, VisVideoScaleMethod scale_method); - -/* Optimized versions of performance sensitive routines */ -/* mmx from lv_video_mmx.c */ /* FIXME can we do this nicer ? */ -int _lv_blit_overlay_alpha32_mmx (VisVideo *dest, const VisVideo *src, int x, int y); -int _lv_scale_bilinear_32_mmx (VisVideo *dest, const VisVideo *src); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _LV_VIDEO_H */
--- a/libvisual/lv_video_mmx.c Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,257 +0,0 @@ -/* Libvisual - The audio visualisation framework. - * - * Copyright (C) 2004, 2005 Dennis Smit <ds@nerds-incorporated.org> - * - * Authors: Dennis Smit <ds@nerds-incorporated.org> - * Jean-Christophe Hoelt <jeko@ios-software.com> - * - * $Id: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> - -#include <lvconfig.h> -#include "lv_common.h" -#include "lv_video.h" - -int _lv_blit_overlay_alpha32_mmx (VisVideo *dest, const VisVideo *src, int x, int y) -{ -#ifdef VISUAL_ARCH_X86 - uint8_t *destbuf; - uint8_t *srcbuf; - int lwidth = (x + src->width); - int lwidth4; - int lheight = (y + src->height); - int ya, xa; - uint8_t alpha; - - if (lwidth > dest->width) - lwidth += dest->width - lwidth; - - if (lheight > dest->height) - lheight += dest->height - lheight; - - destbuf = dest->pixels; - srcbuf = src->pixels; - - if (lwidth < 0) - return VISUAL_OK; - - lwidth4 = lwidth * 4; - - /* Reset some regs */ - __asm __volatile - ("\n\t pxor %%mm6, %%mm6" - ::: "mm6"); - - destbuf += ((y > 0 ? y : 0) * dest->pitch) + (x > 0 ? x * 4 : 0); - srcbuf += ((y < 0 ? abs(y) : 0) * src->pitch) + (x < 0 ? abs(x) * 4 : 0); - for (ya = y > 0 ? y : 0; ya < lheight; ya++) { - for (xa = x > 0 ? x * 4 : 0; xa < lwidth4; xa += 4) { - /* pixel = ((alpha * ((src - dest)) / 255) + dest) */ - __asm __volatile - ("\n\t movd %[spix], %%mm0" - "\n\t movd %[dpix], %%mm1" - "\n\t movq %%mm0, %%mm2" - "\n\t movq %%mm0, %%mm3" - "\n\t psrlq $24, %%mm2" /* The alpha */ - "\n\t movq %%mm0, %%mm4" - "\n\t psrld $24, %%mm3" - "\n\t psrld $24, %%mm4" - "\n\t psllq $32, %%mm2" - "\n\t psllq $16, %%mm3" - "\n\t por %%mm4, %%mm2" - "\n\t punpcklbw %%mm6, %%mm0" /* interleaving dest */ - "\n\t por %%mm3, %%mm2" - "\n\t punpcklbw %%mm6, %%mm1" /* interleaving source */ - "\n\t psubsw %%mm1, %%mm0" /* (src - dest) part */ - "\n\t pmullw %%mm2, %%mm0" /* alpha * (src - dest) */ - "\n\t psrlw $8, %%mm0" /* / 256 */ - "\n\t paddb %%mm1, %%mm0" /* + dest */ - "\n\t packuswb %%mm0, %%mm0" - "\n\t movd %%mm0, %[dest]" - : [dest] "=m" (*destbuf) - : [dpix] "m" (*destbuf) - , [spix] "m" (*srcbuf) - : "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7"); - - destbuf += 4; - srcbuf += 4; - } - - destbuf += (dest->pitch - ((lwidth - x) * 4)) - (x < 0 ? x * 4 : 0); - srcbuf += x < 0 ? abs(x) * 4 : 0; - srcbuf += x + src->width > dest->width ? ((x + (src->pitch / 4)) - dest->width) * 4 : 0; - } - - __asm __volatile - ("\n\t emms"); - - return VISUAL_OK; -#else /* !VISUAL_ARCH_X86 */ - return VISUAL_ERROR_CPU_INVALID_CODE; -#endif -} - -int _lv_scale_bilinear_32_mmx (VisVideo *dest, const VisVideo *src) -{ -#ifdef VISUAL_ARCH_X86 - uint32_t y; - uint32_t u, v, du, dv; /* fixed point 16.16 */ - uint32_t *dest_pixel, *src_pixel_rowu, *src_pixel_rowl; - - dest_pixel = dest->pixels; - - du = ((src->width - 1) << 16) / dest->width; - dv = ((src->height - 1) << 16) / dest->height; - v = 0; - - __asm__ __volatile__ ("\n\temms"); - - for (y = dest->height; y--; v += dv) { - uint32_t x; - uint32_t fracU, fracV; /* fixed point 28.4 [0,1[ */ - - if (v >> 16 >= src->height - 1) - v -= 0x10000; - - src_pixel_rowu = (src->pixel_rows[v >> 16]); - src_pixel_rowl = (src->pixel_rows[(v >> 16) + 1]); - - /* fracV = frac(v) = v & 0xffff */ - /* fixed point format convertion: fracV >>= 8) */ - fracV = ((v & 0xffff) >> 12) | 0x100000; - u = 0; - - - for (x = dest->width - 1; x--; u += du) { - - /* fracU = frac(u) = u & 0xffff */ - /* fixed point format convertion: fracU >>= 8) */ - fracU = ((u & 0xffff) >> 12) | 0x100000; - - __asm__ __volatile__ - ("\n\t pxor %%mm7, %%mm7" - /* Prefetching does not show improvement on my Duron (maybe due to its small cache?) */ - /*"\n\t prefetch 64%[pixel_l]" / * only work on 3now!/SSE cpu */ - /*"\n\t prefetchw 64%[output]" / * only work on 3now!/SSE cpu */ - - /* Computing coefs values (Thread #1 and #2) => ends on #C - * - * notice 0x10 = 1.0 (fixed point 28.4 - like fracU and fracV) - * - * coef[0] = (0x10 - fracU) * (0x10 - fracV); * UL=0 * - * coef[1] = (0x10 - fracU) * fracV; * LL=1 * - * coef[2] = fracU * (0x10 - fracV); * UR=2 * - * coef[3] = fracU * fracV; * LR=3 * - */ - - /* - * Unpacking colors (Thread #3 and #4) - */ - /* - * Multiplying colors by coefs (Threads #5 and #6) - */ - /* - * Adding colors together. (Thread #7) - */ - - "#1\n\t movd %[fracu], %%mm4" /* mm4 = [ 0 | 0 | 0x10 | fracU ] */ - "#2\n\t movd %[fracv], %%mm6" /* mm6 = [ 0 | 0 | 0x10 | fracV ] */ - - "#1\n\t punpcklwd %%mm4, %%mm4" /* mm4 = [ 0x10 | 0x10 | fracU | fracU ] */ - "#2\n\t movq %%mm6, %%mm3" - - "#1\n\t pxor %%mm5, %%mm5" - "#2\n\t punpckldq %%mm6, %%mm6" /* mm6 = [ 0x10 | fracv | 0x10 | fracV ] */ - "#3\n\t movq %[pixel_u], %%mm0" /* mm0 = [ col[0] | col[2] ] */ - - "#1\n\t punpckldq %%mm4, %%mm5" /* mm5 = [ fracU | fracU | 0 | 0 ] */ - "#2\n\t punpcklwd %%mm7, %%mm3" /* mm3 = [ 0 | 0x10 | 0 | fracV ] */ - "#3\n\t movq %%mm0, %%mm2" - - "#1\n\t psubusw %%mm5, %%mm4" /* mm4 = [ 0x10-fracU | 0x10-fracU | fracU | fracU ] */ - "#2\n\t punpckldq %%mm3, %%mm3" /* mm3 = [ 0 | fracV | 0 | fracV ] */ - "#4\n\t movq %[pixel_l], %%mm1" /* mm1 = [ col[1] | col[3] ] */ - - "#2\n\t pslld $16, %%mm3" /* mm3 = [ fracV | 0 | fracV | 0 ] */ - "#3\n\t punpcklbw %%mm7, %%mm0" /* mm0 = [ col[0] unpacked ] */ - - "#2\n\t psubusw %%mm3, %%mm6" /* mm6 = [ 0x10-fracV | fracV | 0x10-fracV | fracV ] */ - "#4\n\t movq %%mm1, %%mm3" - - "#C\n\t pmullw %%mm6, %%mm4" /* mm4 = [ coef[0]|coef[1]|coef[2]|coef[3] ] */ - "#5\n\t movq %%mm4, %%mm5" - - "#4\n\t punpcklbw %%mm7, %%mm1" /* mm1 = [ col[1] unpacked ] */ - "#6\n\t punpckhwd %%mm4, %%mm4" /* mm4 = [ coef[1]|coef[1]|coef[0]|coef[0] ] */ - - "#3\n\t punpckhbw %%mm7, %%mm2" /* mm2 = [ col[2] unpacked ] */ - "#5\n\t punpcklwd %%mm5, %%mm5" /* mm5 = [ coef[2]|coef[2]|coef[3]|coef[3] ] */ - - "#4\n\t punpckhbw %%mm7, %%mm3" /* mm3 = [ col[3] unpacked ] */ - "#5\n\t movq %%mm5, %%mm6" - - "#6\n\t movq %%mm4, %%mm7" - "#5\n\t punpcklwd %%mm6, %%mm6" /* mm6 = [ coef[3]|coef[3]|coef[3]|coef[3] ] */ - - "#6\n\t punpcklwd %%mm7, %%mm7" /* mm6 = [ coef[1]|coef[1]|coef[1]|coef[1] ] */ - "#5\n\t pmullw %%mm6, %%mm3" /* mm3 = [ coef[3] * col[3] unpacked ] */ - - "#5\n\t punpckhwd %%mm5, %%mm5" /* mm5 = [ coef[2]|coef[2]|coef[2]|coef[2] ] */ - "#6\n\t pmullw %%mm7, %%mm1" /* mm1 = [ coef[1] * col[1] unpacked ] */ - - "#5\n\t pmullw %%mm5, %%mm2" /* mm2 = [ coef[2] * col[2] unpacked ] */ - "#6\n\t punpckhwd %%mm4, %%mm4" /* mm4 = [ coef[0]|coef[0]|coef[0]|coef[0] ] */ - - "#6\n\t pmullw %%mm4, %%mm0" /* mm0 = [ coef[0] * col[0] unpacked ] */ - "#7\n\t paddw %%mm2, %%mm3" - "#7\n\t paddw %%mm1, %%mm0" - - "#7\n\t paddw %%mm3, %%mm0" - "#7\n\t psrlw $8, %%mm0" - - /* Unpacking the resulting pixel */ - "\n\t packuswb %%mm7, %%mm0" - "\n\t movd %%mm0, %[output]" - - : [output] "=m"(*dest_pixel) - : [pixel_u] "m"(src_pixel_rowu[u>>16]) - , [pixel_l] "m"(src_pixel_rowl[u>>16]) - , [fracu] "g"(fracU) - , [fracv] "g"(fracV) - : "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7"); - - ++dest_pixel; - } - - memset (dest_pixel, 0, (dest->pitch - ((dest->width - 1) * 4))); - dest_pixel += (dest->pitch / 4) - ((dest->width - 1)); - - } - - __asm__ __volatile__ ("\n\temms"); - - return VISUAL_OK; -#else /* !VISUAL_ARCH_X86 */ - return VISUAL_ERROR_CPU_INVALID_CODE; -#endif -} -
--- a/libvisual/lvconfig.h Tue Oct 25 22:53:38 2005 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,39 +0,0 @@ -/* lvconfig.h - * - * This is a generated file. Please modify 'configure.ac' - */ - -#ifndef __LV_CONFIG_H__ -#define __LV_CONFIG_H__ - -#ifndef __cplusplus -# define LV_HAVE_ISO_VARARGS (1) -#endif - -/* gcc-2.95.x supports both gnu style and ISO varargs, but if -ansi - * is passed ISO vararg support is turned off, and there is no work - * around to turn it on, so we unconditionally turn it off. - */ -#if __GNUC__ == 2 && __GNUC_MINOR__ == 95 -# undef LV_HAVE_ISO_VARARGS -#endif - -#define LV_HAVE_GNUC_VARARGS (1) - -#define VISUAL_BIG_ENDIAN (0) -#define VISUAL_LITTLE_ENDIAN (1) - -typedef unsigned int visual_size_t; -#define VISUAL_SIZE_T_FORMAT "u" - -#define VISUAL_ARCH_X86 - -#define VISUAL_OS_LINUX - -#define VISUAL_HAVE_THREADS - -#define VISUAL_THREAD_MODEL_POSIX - - -#endif /* LV_CONFIG_H */ -