/* Libvisual - The audio visualisation framework. * * Copyright (C) 2004, 2005, 2006 Dennis Smit * * Authors: Dennis Smit * * $Id: lv_libvisual.c,v 1.39 2006/01/22 13:23:37 synap Exp $ * * 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 #include #include #include #include #include #include "lvconfig.h" #include "lv_plugin.h" #include "lv_actor.h" #include "lv_input.h" #include "lv_morph.h" #include "lv_transform.h" #include "lv_libvisual.h" #include "lv_log.h" #include "lv_param.h" #include "lv_thread.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 free_plugpaths (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); /* Cover art dimension */ param = visual_param_entry_new ("songinfo cover size x"); visual_param_entry_set_integer (param, 128); visual_param_container_add (paramcontainer, param); param = visual_param_entry_new ("songinfo cover size y"); visual_param_entry_set_integer (param, 128); visual_param_container_add (paramcontainer, param); return 0; } static VisUIWidget *make_userinterface () { VisUIWidget *vbox; VisUIWidget *hbox1; VisUIWidget *hbox2; VisUIWidget *hbox3; VisUIWidget *label1; VisUIWidget *label2; VisUIWidget *label3; VisUIWidget *label4; VisUIWidget *checkbox1; VisUIWidget *checkbox2; VisUIWidget *numeric1; VisUIWidget *numeric2; VisUIWidget *numeric3; vbox = visual_ui_box_new (VISUAL_ORIENT_TYPE_VERTICAL); hbox1 = visual_ui_box_new (VISUAL_ORIENT_TYPE_HORIZONTAL); hbox2 = visual_ui_box_new (VISUAL_ORIENT_TYPE_HORIZONTAL); hbox3 = visual_ui_box_new (VISUAL_ORIENT_TYPE_HORIZONTAL); label1 = visual_ui_label_new (_("Show info for"), FALSE); label2 = visual_ui_label_new (_("seconds"), FALSE); label3 = visual_ui_label_new (_("cover art width"), FALSE); label4 = visual_ui_label_new (_("cover art height"), 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")); numeric1 = visual_ui_numeric_new (); visual_ui_mutator_set_param (VISUAL_UI_MUTATOR (numeric1), visual_param_container_get (__lv_paramcontainer, "songinfo timeout")); visual_ui_range_set_properties (VISUAL_UI_RANGE (numeric1), 1, 60, 1, 0); numeric2 = visual_ui_numeric_new (); visual_ui_mutator_set_param (VISUAL_UI_MUTATOR (numeric2), visual_param_container_get (__lv_paramcontainer, "songinfo cover size x")); visual_ui_range_set_properties (VISUAL_UI_RANGE (numeric2), 32, 256, 2, 0); numeric3 = visual_ui_numeric_new (); visual_ui_mutator_set_param (VISUAL_UI_MUTATOR (numeric3), visual_param_container_get (__lv_paramcontainer, "songinfo cover size y")); visual_ui_range_set_properties (VISUAL_UI_RANGE (numeric3), 32, 256, 2, 0); visual_ui_box_pack (VISUAL_UI_BOX (hbox1), label1); visual_ui_box_pack (VISUAL_UI_BOX (hbox1), numeric1); visual_ui_box_pack (VISUAL_UI_BOX (hbox1), label2); visual_ui_box_pack (VISUAL_UI_BOX (hbox2), label3); visual_ui_box_pack (VISUAL_UI_BOX (hbox2), numeric2); visual_ui_box_pack (VISUAL_UI_BOX (hbox3), label4); visual_ui_box_pack (VISUAL_UI_BOX (hbox3), numeric3); 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), hbox1); visual_ui_box_pack (VISUAL_UI_BOX (vbox), hbox2); visual_ui_box_pack (VISUAL_UI_BOX (vbox), hbox3); return vbox; } static int free_plugpaths () { int i; if (__lv_plugpaths == NULL) return VISUAL_OK; for (i = 0; i < __lv_plugpath_cnt - 1; i++) visual_mem_free (__lv_plugpaths[i]); free (__lv_plugpaths); } /** * @defgroup Libvisual Libvisual * @{ */ /** * Gives the libvisual version. * * @return A const char containing the libvisual version. */ const char *visual_get_version () { return VERSION; } /** * Gives the libvisual API verison. Can be used to compare against the * compile time VISUAL_API_VERSION to validate if the API is at the right version. * * @return A const integer equal to VISUAL_API_VERSION. */ int visual_get_api_version () { return VISUAL_API_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); if (pathadd == NULL) __lv_plugpaths[__lv_plugpath_cnt - 1] = NULL; else __lv_plugpaths[__lv_plugpath_cnt - 1] = strdup (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) { char temppluginpath[FILENAME_MAX+1]; char *homedir = NULL; int ret = 0; #if ENABLE_NLS bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); #endif 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 (); /* Initialize Mem system */ visual_mem_initialize (); /* Initialize Thread system */ visual_thread_initialize (); /* Initialize FFT system */ visual_fourier_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); #if !defined(VISUAL_OS_WIN32) /* Add homedirectory plugin paths */ homedir = getenv ("HOME"); if (homedir != NULL) { temppluginpath[sizeof (temppluginpath) - 1] = 0; snprintf (temppluginpath, sizeof (temppluginpath) - 1, "%s/.libvisual/actor", homedir); ret = visual_init_path_add (temppluginpath); visual_log_return_val_if_fail (ret == VISUAL_OK, ret); snprintf (temppluginpath, sizeof (temppluginpath) - 1, "%s/.libvisual/input", homedir); ret = visual_init_path_add (temppluginpath); visual_log_return_val_if_fail (ret == VISUAL_OK, ret); snprintf (temppluginpath, sizeof (temppluginpath) - 1, "%s/.libvisual/morph", homedir); ret = visual_init_path_add (temppluginpath); visual_log_return_val_if_fail (ret == VISUAL_OK, ret); snprintf (temppluginpath, sizeof (temppluginpath) - 1, "%s/.libvisual/transform", homedir); ret = visual_init_path_add (temppluginpath); visual_log_return_val_if_fail (ret == VISUAL_OK, ret); } #endif /* 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, TRUE); 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; /* Free the strdupped plugpaths */ free_plugpaths (); 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; } if (visual_fourier_is_initialized () == TRUE) visual_fourier_deinitialize (); ret = visual_object_unref (VISUAL_OBJECT (__lv_plugins)); if (ret < 0) visual_log (VISUAL_LOG_WARNING, _("Plugins references list: destroy failed: %s"), visual_error_to_string (ret)); ret = visual_object_unref (VISUAL_OBJECT (__lv_plugins_actor)); if (ret < 0) visual_log (VISUAL_LOG_WARNING, _("Actor plugins list: destroy failed: %s"), visual_error_to_string (ret)); ret = visual_object_unref (VISUAL_OBJECT (__lv_plugins_input)); if (ret < 0) visual_log (VISUAL_LOG_WARNING, _("Input plugins list: destroy failed: %s"), visual_error_to_string (ret)); ret = visual_object_unref (VISUAL_OBJECT (__lv_plugins_morph)); if (ret < 0) visual_log (VISUAL_LOG_WARNING, _("Morph plugins list: destroy failed: %s"), visual_error_to_string (ret)); ret = visual_object_unref (VISUAL_OBJECT (__lv_plugins_transform)); if (ret < 0) visual_log (VISUAL_LOG_WARNING, _("Transform plugins list: destroy failed: %s"), visual_error_to_string (ret)); ret = visual_object_unref (VISUAL_OBJECT (__lv_paramcontainer)); if (ret < 0) visual_log (VISUAL_LOG_WARNING, _("Global param container: destroy failed: %s"), visual_error_to_string (ret)); ret = visual_object_unref (VISUAL_OBJECT (__lv_userinterface)); if (ret < 0) visual_log (VISUAL_LOG_WARNING, _("Error during UI destroy: %s"), visual_error_to_string (ret)); if (__lv_progname != NULL) { visual_mem_free (__lv_progname); __lv_progname = NULL; } __lv_initialized = FALSE; return VISUAL_OK; } /** * @} */