diff options
Diffstat (limited to 'sound/core/seq')
-rw-r--r-- | sound/core/seq/Kconfig | 68 | ||||
-rw-r--r-- | sound/core/seq/Makefile | 21 | ||||
-rw-r--r-- | sound/core/seq/oss/Makefile | 2 | ||||
-rw-r--r-- | sound/core/seq/seq_device.c | 315 |
4 files changed, 65 insertions, 341 deletions
diff --git a/sound/core/seq/Kconfig b/sound/core/seq/Kconfig index b851fd890a89..a536760a94c2 100644 --- a/sound/core/seq/Kconfig +++ b/sound/core/seq/Kconfig @@ -1,16 +1,62 @@ -# define SND_XXX_SEQ to min(SND_SEQUENCER,SND_XXX) +config SND_SEQUENCER + tristate "Sequencer support" + select SND_TIMER + select SND_SEQ_DEVICE + help + Say Y or M to enable MIDI sequencer and router support. This + feature allows routing and enqueueing of MIDI events. Events + can be processed at a given time. -config SND_RAWMIDI_SEQ - def_tristate SND_SEQUENCER && SND_RAWMIDI + Many programs require this feature, so you should enable it + unless you know what you're doing. -config SND_OPL3_LIB_SEQ - def_tristate SND_SEQUENCER && SND_OPL3_LIB +if SND_SEQUENCER -config SND_OPL4_LIB_SEQ - def_tristate SND_SEQUENCER && SND_OPL4_LIB +config SND_SEQ_DUMMY + tristate "Sequencer dummy client" + help + Say Y here to enable the dummy sequencer client. This client + is a simple MIDI-through client: all normal input events are + redirected to the output port immediately. -config SND_SBAWE_SEQ - def_tristate SND_SEQUENCER && SND_SBAWE + You don't need this unless you want to connect many MIDI + devices or applications together. -config SND_EMU10K1_SEQ - def_tristate SND_SEQUENCER && SND_EMU10K1 + To compile this driver as a module, choose M here: the module + will be called snd-seq-dummy. + +config SND_SEQUENCER_OSS + tristate "OSS Sequencer API" + depends on SND_OSSEMUL + select SND_SEQ_MIDI_EVENT + help + Say Y here to enable OSS sequencer emulation (both + /dev/sequencer and /dev/music interfaces). + + Many programs still use the OSS API, so say Y. + + To compile this driver as a module, choose M here: the module + will be called snd-seq-oss. + +config SND_SEQ_HRTIMER_DEFAULT + bool "Use HR-timer as default sequencer timer" + depends on SND_HRTIMER + default y + help + Say Y here to use the HR-timer backend as the default sequencer + timer. + +config SND_SEQ_MIDI_EVENT + def_tristate SND_RAWMIDI + +config SND_SEQ_MIDI + tristate + select SND_SEQ_MIDI_EVENT + +config SND_SEQ_MIDI_EMUL + tristate + +config SND_SEQ_VIRMIDI + tristate + +endif # SND_SEQUENCER diff --git a/sound/core/seq/Makefile b/sound/core/seq/Makefile index b65fa5a1943b..68fd367ac39c 100644 --- a/sound/core/seq/Makefile +++ b/sound/core/seq/Makefile @@ -3,7 +3,6 @@ # Copyright (c) 1999 by Jaroslav Kysela <perex@perex.cz> # -snd-seq-device-objs := seq_device.o snd-seq-objs := seq.o seq_lock.o seq_clientmgr.o seq_memory.o seq_queue.o \ seq_fifo.o seq_prioq.o seq_timer.o \ seq_system.o seq_ports.o @@ -14,17 +13,11 @@ snd-seq-midi-event-objs := seq_midi_event.o snd-seq-dummy-objs := seq_dummy.o snd-seq-virmidi-objs := seq_virmidi.o -obj-$(CONFIG_SND_SEQUENCER) += snd-seq.o snd-seq-device.o -ifeq ($(CONFIG_SND_SEQUENCER_OSS),y) - obj-$(CONFIG_SND_SEQUENCER) += snd-seq-midi-event.o - obj-$(CONFIG_SND_SEQUENCER) += oss/ -endif -obj-$(CONFIG_SND_SEQ_DUMMY) += snd-seq-dummy.o +obj-$(CONFIG_SND_SEQUENCER) += snd-seq.o +obj-$(CONFIG_SND_SEQUENCER_OSS) += oss/ -# Toplevel Module Dependency -obj-$(CONFIG_SND_VIRMIDI) += snd-seq-virmidi.o snd-seq-midi-event.o -obj-$(CONFIG_SND_RAWMIDI_SEQ) += snd-seq-midi.o snd-seq-midi-event.o -obj-$(CONFIG_SND_OPL3_LIB_SEQ) += snd-seq-midi-event.o snd-seq-midi-emul.o -obj-$(CONFIG_SND_OPL4_LIB_SEQ) += snd-seq-midi-event.o snd-seq-midi-emul.o -obj-$(CONFIG_SND_SBAWE_SEQ) += snd-seq-midi-emul.o snd-seq-virmidi.o -obj-$(CONFIG_SND_EMU10K1_SEQ) += snd-seq-midi-emul.o snd-seq-virmidi.o +obj-$(CONFIG_SND_SEQ_DUMMY) += snd-seq-dummy.o +obj-$(CONFIG_SND_SEQ_MIDI) += snd-seq-midi.o +obj-$(CONFIG_SND_SEQ_MIDI_EMUL) += snd-seq-midi-emul.o +obj-$(CONFIG_SND_SEQ_MIDI_EVENT) += snd-seq-midi-event.o +obj-$(CONFIG_SND_SEQ_VIRMIDI) += snd-seq-virmidi.o diff --git a/sound/core/seq/oss/Makefile b/sound/core/seq/oss/Makefile index b38406b8463c..4ea4e3eea6b7 100644 --- a/sound/core/seq/oss/Makefile +++ b/sound/core/seq/oss/Makefile @@ -7,4 +7,4 @@ snd-seq-oss-objs := seq_oss.o seq_oss_init.o seq_oss_timer.o seq_oss_ioctl.o \ seq_oss_event.o seq_oss_rw.o seq_oss_synth.o \ seq_oss_midi.o seq_oss_readq.o seq_oss_writeq.o -obj-$(CONFIG_SND_SEQUENCER) += snd-seq-oss.o +obj-$(CONFIG_SND_SEQUENCER_OSS) += snd-seq-oss.o diff --git a/sound/core/seq/seq_device.c b/sound/core/seq/seq_device.c deleted file mode 100644 index c4acf17e9f5e..000000000000 --- a/sound/core/seq/seq_device.c +++ /dev/null @@ -1,315 +0,0 @@ -/* - * ALSA sequencer device management - * Copyright (c) 1999 by Takashi Iwai <tiwai@suse.de> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 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 General Public License for more details. - * - * You should have received a copy of the GNU 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 - * - * - *---------------------------------------------------------------- - * - * This device handler separates the card driver module from sequencer - * stuff (sequencer core, synth drivers, etc), so that user can avoid - * to spend unnecessary resources e.g. if he needs only listening to - * MP3s. - * - * The card (or lowlevel) driver creates a sequencer device entry - * via snd_seq_device_new(). This is an entry pointer to communicate - * with the sequencer device "driver", which is involved with the - * actual part to communicate with the sequencer core. - * Each sequencer device entry has an id string and the corresponding - * driver with the same id is loaded when required. For example, - * lowlevel codes to access emu8000 chip on sbawe card are included in - * emu8000-synth module. To activate this module, the hardware - * resources like i/o port are passed via snd_seq_device argument. - * - */ - -#include <linux/device.h> -#include <linux/init.h> -#include <linux/module.h> -#include <sound/core.h> -#include <sound/info.h> -#include <sound/seq_device.h> -#include <sound/seq_kernel.h> -#include <sound/initval.h> -#include <linux/kmod.h> -#include <linux/slab.h> -#include <linux/mutex.h> - -MODULE_AUTHOR("Takashi Iwai <tiwai@suse.de>"); -MODULE_DESCRIPTION("ALSA sequencer device management"); -MODULE_LICENSE("GPL"); - -/* - * bus definition - */ -static int snd_seq_bus_match(struct device *dev, struct device_driver *drv) -{ - struct snd_seq_device *sdev = to_seq_dev(dev); - struct snd_seq_driver *sdrv = to_seq_drv(drv); - - return strcmp(sdrv->id, sdev->id) == 0 && - sdrv->argsize == sdev->argsize; -} - -static struct bus_type snd_seq_bus_type = { - .name = "snd_seq", - .match = snd_seq_bus_match, -}; - -/* - * proc interface -- just for compatibility - */ -#ifdef CONFIG_SND_PROC_FS -static struct snd_info_entry *info_entry; - -static int print_dev_info(struct device *dev, void *data) -{ - struct snd_seq_device *sdev = to_seq_dev(dev); - struct snd_info_buffer *buffer = data; - - snd_iprintf(buffer, "snd-%s,%s,%d\n", sdev->id, - dev->driver ? "loaded" : "empty", - dev->driver ? 1 : 0); - return 0; -} - -static void snd_seq_device_info(struct snd_info_entry *entry, - struct snd_info_buffer *buffer) -{ - bus_for_each_dev(&snd_seq_bus_type, NULL, buffer, print_dev_info); -} -#endif - -/* - * load all registered drivers (called from seq_clientmgr.c) - */ - -#ifdef CONFIG_MODULES -/* flag to block auto-loading */ -static atomic_t snd_seq_in_init = ATOMIC_INIT(1); /* blocked as default */ - -static int request_seq_drv(struct device *dev, void *data) -{ - struct snd_seq_device *sdev = to_seq_dev(dev); - - if (!dev->driver) - request_module("snd-%s", sdev->id); - return 0; -} - -static void autoload_drivers(struct work_struct *work) -{ - /* avoid reentrance */ - if (atomic_inc_return(&snd_seq_in_init) == 1) - bus_for_each_dev(&snd_seq_bus_type, NULL, NULL, - request_seq_drv); - atomic_dec(&snd_seq_in_init); -} - -static DECLARE_WORK(autoload_work, autoload_drivers); - -static void queue_autoload_drivers(void) -{ - schedule_work(&autoload_work); -} - -void snd_seq_autoload_init(void) -{ - atomic_dec(&snd_seq_in_init); -#ifdef CONFIG_SND_SEQUENCER_MODULE - /* initial autoload only when snd-seq is a module */ - queue_autoload_drivers(); -#endif -} -EXPORT_SYMBOL(snd_seq_autoload_init); - -void snd_seq_autoload_exit(void) -{ - atomic_inc(&snd_seq_in_init); -} -EXPORT_SYMBOL(snd_seq_autoload_exit); - -void snd_seq_device_load_drivers(void) -{ - queue_autoload_drivers(); - flush_work(&autoload_work); -} -EXPORT_SYMBOL(snd_seq_device_load_drivers); -#else -#define queue_autoload_drivers() /* NOP */ -#endif - -/* - * device management - */ -static int snd_seq_device_dev_free(struct snd_device *device) -{ - struct snd_seq_device *dev = device->device_data; - - put_device(&dev->dev); - return 0; -} - -static int snd_seq_device_dev_register(struct snd_device *device) -{ - struct snd_seq_device *dev = device->device_data; - int err; - - err = device_add(&dev->dev); - if (err < 0) - return err; - if (!dev->dev.driver) - queue_autoload_drivers(); - return 0; -} - -static int snd_seq_device_dev_disconnect(struct snd_device *device) -{ - struct snd_seq_device *dev = device->device_data; - - device_del(&dev->dev); - return 0; -} - -static void snd_seq_dev_release(struct device *dev) -{ - struct snd_seq_device *sdev = to_seq_dev(dev); - - if (sdev->private_free) - sdev->private_free(sdev); - kfree(sdev); -} - -/* - * register a sequencer device - * card = card info - * device = device number (if any) - * id = id of driver - * result = return pointer (NULL allowed if unnecessary) - */ -int snd_seq_device_new(struct snd_card *card, int device, const char *id, - int argsize, struct snd_seq_device **result) -{ - struct snd_seq_device *dev; - int err; - static struct snd_device_ops dops = { - .dev_free = snd_seq_device_dev_free, - .dev_register = snd_seq_device_dev_register, - .dev_disconnect = snd_seq_device_dev_disconnect, - }; - - if (result) - *result = NULL; - - if (snd_BUG_ON(!id)) - return -EINVAL; - - dev = kzalloc(sizeof(*dev) + argsize, GFP_KERNEL); - if (!dev) - return -ENOMEM; - - /* set up device info */ - dev->card = card; - dev->device = device; - dev->id = id; - dev->argsize = argsize; - - device_initialize(&dev->dev); - dev->dev.parent = &card->card_dev; - dev->dev.bus = &snd_seq_bus_type; - dev->dev.release = snd_seq_dev_release; - dev_set_name(&dev->dev, "%s-%d-%d", dev->id, card->number, device); - - /* add this device to the list */ - err = snd_device_new(card, SNDRV_DEV_SEQUENCER, dev, &dops); - if (err < 0) { - put_device(&dev->dev); - return err; - } - - if (result) - *result = dev; - - return 0; -} -EXPORT_SYMBOL(snd_seq_device_new); - -/* - * driver registration - */ -int __snd_seq_driver_register(struct snd_seq_driver *drv, struct module *mod) -{ - if (WARN_ON(!drv->driver.name || !drv->id)) - return -EINVAL; - drv->driver.bus = &snd_seq_bus_type; - drv->driver.owner = mod; - return driver_register(&drv->driver); -} -EXPORT_SYMBOL_GPL(__snd_seq_driver_register); - -void snd_seq_driver_unregister(struct snd_seq_driver *drv) -{ - driver_unregister(&drv->driver); -} -EXPORT_SYMBOL_GPL(snd_seq_driver_unregister); - -/* - * module part - */ - -static int __init seq_dev_proc_init(void) -{ -#ifdef CONFIG_SND_PROC_FS - info_entry = snd_info_create_module_entry(THIS_MODULE, "drivers", - snd_seq_root); - if (info_entry == NULL) - return -ENOMEM; - info_entry->content = SNDRV_INFO_CONTENT_TEXT; - info_entry->c.text.read = snd_seq_device_info; - if (snd_info_register(info_entry) < 0) { - snd_info_free_entry(info_entry); - return -ENOMEM; - } -#endif - return 0; -} - -static int __init alsa_seq_device_init(void) -{ - int err; - - err = bus_register(&snd_seq_bus_type); - if (err < 0) - return err; - err = seq_dev_proc_init(); - if (err < 0) - bus_unregister(&snd_seq_bus_type); - return err; -} - -static void __exit alsa_seq_device_exit(void) -{ -#ifdef CONFIG_MODULES - cancel_work_sync(&autoload_work); -#endif -#ifdef CONFIG_SND_PROC_FS - snd_info_free_entry(info_entry); -#endif - bus_unregister(&snd_seq_bus_type); -} - -subsys_initcall(alsa_seq_device_init) -module_exit(alsa_seq_device_exit) |