Mercurial > audlegacy
diff libvisual/lv_input.c @ 23:0db4a1dc75c4 trunk
[svn] libvisual.
P3 detection appears to be borked. I'll work on it later.
author | nenolod |
---|---|
date | Mon, 24 Oct 2005 23:13:56 -0700 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libvisual/lv_input.c Mon Oct 24 23:13:56 2005 -0700 @@ -0,0 +1,250 @@ +/* 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; +} + +/** + * @} + */ +