diff options
Diffstat (limited to 'sound/core/seq')
53 files changed, 2009 insertions, 3942 deletions
diff --git a/sound/core/seq/Kconfig b/sound/core/seq/Kconfig new file mode 100644 index 00000000000..b851fd890a8 --- /dev/null +++ b/sound/core/seq/Kconfig @@ -0,0 +1,16 @@ +# define SND_XXX_SEQ to min(SND_SEQUENCER,SND_XXX) + +config SND_RAWMIDI_SEQ + def_tristate SND_SEQUENCER && SND_RAWMIDI + +config SND_OPL3_LIB_SEQ + def_tristate SND_SEQUENCER && SND_OPL3_LIB + +config SND_OPL4_LIB_SEQ + def_tristate SND_SEQUENCER && SND_OPL4_LIB + +config SND_SBAWE_SEQ + def_tristate SND_SEQUENCER && SND_SBAWE + +config SND_EMU10K1_SEQ + def_tristate SND_SEQUENCER && SND_EMU10K1 diff --git a/sound/core/seq/Makefile b/sound/core/seq/Makefile index 402e2b4a34c..941f64a853e 100644 --- a/sound/core/seq/Makefile +++ b/sound/core/seq/Makefile @@ -1,13 +1,8 @@ # # Makefile for ALSA -# Copyright (c) 1999 by Jaroslav Kysela <perex@suse.cz> +# Copyright (c) 1999 by Jaroslav Kysela <perex@perex.cz> # -obj-$(CONFIG_SND) += instr/ -ifeq ($(CONFIG_SND_SEQUENCER_OSS),y) - obj-$(CONFIG_SND_SEQUENCER) += oss/ -endif - 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 \ @@ -15,30 +10,20 @@ snd-seq-objs := seq.o seq_lock.o seq_clientmgr.o seq_memory.o seq_queue.o \ snd-seq-midi-objs := seq_midi.o snd-seq-midi-emul-objs := seq_midi_emul.o snd-seq-midi-event-objs := seq_midi_event.o -snd-seq-instr-objs := seq_instr.o snd-seq-dummy-objs := seq_dummy.o snd-seq-virmidi-objs := seq_virmidi.o -# -# this function returns: -# "m" - CONFIG_SND_SEQUENCER is m -# <empty string> - CONFIG_SND_SEQUENCER is undefined -# otherwise parameter #1 value -# -sequencer = $(if $(subst y,,$(CONFIG_SND_SEQUENCER)),$(if $(1),m),$(if $(CONFIG_SND_SEQUENCER),$(1))) - 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) += snd-seq-midi-event.o + obj-$(CONFIG_SND_SEQUENCER) += oss/ endif obj-$(CONFIG_SND_SEQ_DUMMY) += snd-seq-dummy.o # Toplevel Module Dependency obj-$(CONFIG_SND_VIRMIDI) += snd-seq-virmidi.o snd-seq-midi-event.o -obj-$(call sequencer,$(CONFIG_SND_RAWMIDI)) += snd-seq-midi.o snd-seq-midi-event.o -obj-$(call sequencer,$(CONFIG_SND_OPL3_LIB)) += snd-seq-midi-event.o snd-seq-midi-emul.o snd-seq-instr.o -obj-$(call sequencer,$(CONFIG_SND_OPL4_LIB)) += snd-seq-midi-event.o snd-seq-midi-emul.o snd-seq-instr.o -obj-$(call sequencer,$(CONFIG_SND_GUS_SYNTH)) += snd-seq-midi-emul.o snd-seq-instr.o -obj-$(call sequencer,$(CONFIG_SND_SBAWE)) += snd-seq-midi-emul.o snd-seq-virmidi.o -obj-$(call sequencer,$(CONFIG_SND_EMU10K1)) += snd-seq-midi-emul.o snd-seq-virmidi.o -obj-$(call sequencer,$(CONFIG_SND_TRIDENT)) += snd-seq-midi-emul.o snd-seq-instr.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 diff --git a/sound/core/seq/instr/Makefile b/sound/core/seq/instr/Makefile deleted file mode 100644 index 69138f30a29..00000000000 --- a/sound/core/seq/instr/Makefile +++ /dev/null @@ -1,23 +0,0 @@ -# -# Makefile for ALSA -# Copyright (c) 1999 by Jaroslav Kysela <perex@suse.cz> -# - -snd-ainstr-fm-objs := ainstr_fm.o -snd-ainstr-simple-objs := ainstr_simple.o -snd-ainstr-gf1-objs := ainstr_gf1.o -snd-ainstr-iw-objs := ainstr_iw.o - -# -# this function returns: -# "m" - CONFIG_SND_SEQUENCER is m -# <empty string> - CONFIG_SND_SEQUENCER is undefined -# otherwise parameter #1 value -# -sequencer = $(if $(subst y,,$(CONFIG_SND_SEQUENCER)),$(if $(1),m),$(if $(CONFIG_SND_SEQUENCER),$(1))) - -# Toplevel Module Dependency -obj-$(call sequencer,$(CONFIG_SND_OPL3_LIB)) += snd-ainstr-fm.o -obj-$(call sequencer,$(CONFIG_SND_OPL4_LIB)) += snd-ainstr-fm.o -obj-$(call sequencer,$(CONFIG_SND_GUS_SYNTH)) += snd-ainstr-gf1.o snd-ainstr-simple.o snd-ainstr-iw.o -obj-$(call sequencer,$(CONFIG_SND_TRIDENT)) += snd-ainstr-simple.o diff --git a/sound/core/seq/instr/ainstr_fm.c b/sound/core/seq/instr/ainstr_fm.c deleted file mode 100644 index 5c671e69884..00000000000 --- a/sound/core/seq/instr/ainstr_fm.c +++ /dev/null @@ -1,156 +0,0 @@ -/* - * FM (OPL2/3) Instrument routines - * Copyright (c) 2000 Uros Bizjak <uros@kss-loka.si> - * - * 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 - * - */ - -#include <sound/driver.h> -#include <linux/init.h> -#include <linux/sched.h> -#include <sound/core.h> -#include <sound/ainstr_fm.h> -#include <sound/initval.h> -#include <asm/uaccess.h> - -MODULE_AUTHOR("Uros Bizjak <uros@kss-loka.si>"); -MODULE_DESCRIPTION("Advanced Linux Sound Architecture FM Instrument support."); -MODULE_LICENSE("GPL"); - -static int snd_seq_fm_put(void *private_data, snd_seq_kinstr_t *instr, - char __user *instr_data, long len, int atomic, int cmd) -{ - fm_instrument_t *ip; - fm_xinstrument_t ix; - int idx; - - if (cmd != SNDRV_SEQ_INSTR_PUT_CMD_CREATE) - return -EINVAL; - /* copy instrument data */ - if (len < (long)sizeof(ix)) - return -EINVAL; - if (copy_from_user(&ix, instr_data, sizeof(ix))) - return -EFAULT; - if (ix.stype != FM_STRU_INSTR) - return -EINVAL; - ip = (fm_instrument_t *)KINSTR_DATA(instr); - ip->share_id[0] = le32_to_cpu(ix.share_id[0]); - ip->share_id[1] = le32_to_cpu(ix.share_id[1]); - ip->share_id[2] = le32_to_cpu(ix.share_id[2]); - ip->share_id[3] = le32_to_cpu(ix.share_id[3]); - ip->type = ix.type; - for (idx = 0; idx < 4; idx++) { - ip->op[idx].am_vib = ix.op[idx].am_vib; - ip->op[idx].ksl_level = ix.op[idx].ksl_level; - ip->op[idx].attack_decay = ix.op[idx].attack_decay; - ip->op[idx].sustain_release = ix.op[idx].sustain_release; - ip->op[idx].wave_select = ix.op[idx].wave_select; - } - for (idx = 0; idx < 2; idx++) { - ip->feedback_connection[idx] = ix.feedback_connection[idx]; - } - ip->echo_delay = ix.echo_delay; - ip->echo_atten = ix.echo_atten; - ip->chorus_spread = ix.chorus_spread; - ip->trnsps = ix.trnsps; - ip->fix_dur = ix.fix_dur; - ip->modes = ix.modes; - ip->fix_key = ix.fix_key; - return 0; -} - -static int snd_seq_fm_get(void *private_data, snd_seq_kinstr_t *instr, - char __user *instr_data, long len, int atomic, - int cmd) -{ - fm_instrument_t *ip; - fm_xinstrument_t ix; - int idx; - - if (cmd != SNDRV_SEQ_INSTR_GET_CMD_FULL) - return -EINVAL; - if (len < (long)sizeof(ix)) - return -ENOMEM; - memset(&ix, 0, sizeof(ix)); - ip = (fm_instrument_t *)KINSTR_DATA(instr); - ix.stype = FM_STRU_INSTR; - ix.share_id[0] = cpu_to_le32(ip->share_id[0]); - ix.share_id[1] = cpu_to_le32(ip->share_id[1]); - ix.share_id[2] = cpu_to_le32(ip->share_id[2]); - ix.share_id[3] = cpu_to_le32(ip->share_id[3]); - ix.type = ip->type; - for (idx = 0; idx < 4; idx++) { - ix.op[idx].am_vib = ip->op[idx].am_vib; - ix.op[idx].ksl_level = ip->op[idx].ksl_level; - ix.op[idx].attack_decay = ip->op[idx].attack_decay; - ix.op[idx].sustain_release = ip->op[idx].sustain_release; - ix.op[idx].wave_select = ip->op[idx].wave_select; - } - for (idx = 0; idx < 2; idx++) { - ix.feedback_connection[idx] = ip->feedback_connection[idx]; - } - if (copy_to_user(instr_data, &ix, sizeof(ix))) - return -EFAULT; - ix.echo_delay = ip->echo_delay; - ix.echo_atten = ip->echo_atten; - ix.chorus_spread = ip->chorus_spread; - ix.trnsps = ip->trnsps; - ix.fix_dur = ip->fix_dur; - ix.modes = ip->modes; - ix.fix_key = ip->fix_key; - return 0; -} - -static int snd_seq_fm_get_size(void *private_data, snd_seq_kinstr_t *instr, - long *size) -{ - *size = sizeof(fm_xinstrument_t); - return 0; -} - -int snd_seq_fm_init(snd_seq_kinstr_ops_t *ops, - snd_seq_kinstr_ops_t *next) -{ - memset(ops, 0, sizeof(*ops)); - // ops->private_data = private_data; - ops->add_len = sizeof(fm_instrument_t); - ops->instr_type = SNDRV_SEQ_INSTR_ID_OPL2_3; - ops->put = snd_seq_fm_put; - ops->get = snd_seq_fm_get; - ops->get_size = snd_seq_fm_get_size; - // ops->remove = snd_seq_fm_remove; - // ops->notify = snd_seq_fm_notify; - ops->next = next; - return 0; -} - -/* - * Init part - */ - -static int __init alsa_ainstr_fm_init(void) -{ - return 0; -} - -static void __exit alsa_ainstr_fm_exit(void) -{ -} - -module_init(alsa_ainstr_fm_init) -module_exit(alsa_ainstr_fm_exit) - -EXPORT_SYMBOL(snd_seq_fm_init); diff --git a/sound/core/seq/instr/ainstr_gf1.c b/sound/core/seq/instr/ainstr_gf1.c deleted file mode 100644 index 0e4df8826ee..00000000000 --- a/sound/core/seq/instr/ainstr_gf1.c +++ /dev/null @@ -1,360 +0,0 @@ -/* - * GF1 (GUS) Patch - Instrument routines - * Copyright (c) 1999 by Jaroslav Kysela <perex@suse.cz> - * - * 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 - * - */ - -#include <sound/driver.h> -#include <linux/init.h> -#include <linux/sched.h> -#include <linux/slab.h> -#include <sound/core.h> -#include <sound/ainstr_gf1.h> -#include <sound/initval.h> -#include <asm/uaccess.h> - -MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>"); -MODULE_DESCRIPTION("Advanced Linux Sound Architecture GF1 (GUS) Patch support."); -MODULE_LICENSE("GPL"); - -static unsigned int snd_seq_gf1_size(unsigned int size, unsigned int format) -{ - unsigned int result = size; - - if (format & GF1_WAVE_16BIT) - result <<= 1; - if (format & GF1_WAVE_STEREO) - result <<= 1; - return format; -} - -static int snd_seq_gf1_copy_wave_from_stream(snd_gf1_ops_t *ops, - gf1_instrument_t *ip, - char __user **data, - long *len, - int atomic) -{ - gf1_wave_t *wp, *prev; - gf1_xwave_t xp; - int err; - gfp_t gfp_mask; - unsigned int real_size; - - gfp_mask = atomic ? GFP_ATOMIC : GFP_KERNEL; - if (*len < (long)sizeof(xp)) - return -EINVAL; - if (copy_from_user(&xp, *data, sizeof(xp))) - return -EFAULT; - *data += sizeof(xp); - *len -= sizeof(xp); - wp = kzalloc(sizeof(*wp), gfp_mask); - if (wp == NULL) - return -ENOMEM; - wp->share_id[0] = le32_to_cpu(xp.share_id[0]); - wp->share_id[1] = le32_to_cpu(xp.share_id[1]); - wp->share_id[2] = le32_to_cpu(xp.share_id[2]); - wp->share_id[3] = le32_to_cpu(xp.share_id[3]); - wp->format = le32_to_cpu(xp.format); - wp->size = le32_to_cpu(xp.size); - wp->start = le32_to_cpu(xp.start); - wp->loop_start = le32_to_cpu(xp.loop_start); - wp->loop_end = le32_to_cpu(xp.loop_end); - wp->loop_repeat = le16_to_cpu(xp.loop_repeat); - wp->flags = xp.flags; - wp->sample_rate = le32_to_cpu(xp.sample_rate); - wp->low_frequency = le32_to_cpu(xp.low_frequency); - wp->high_frequency = le32_to_cpu(xp.high_frequency); - wp->root_frequency = le32_to_cpu(xp.root_frequency); - wp->tune = le16_to_cpu(xp.tune); - wp->balance = xp.balance; - memcpy(wp->envelope_rate, xp.envelope_rate, 6); - memcpy(wp->envelope_offset, xp.envelope_offset, 6); - wp->tremolo_sweep = xp.tremolo_sweep; - wp->tremolo_rate = xp.tremolo_rate; - wp->tremolo_depth = xp.tremolo_depth; - wp->vibrato_sweep = xp.vibrato_sweep; - wp->vibrato_rate = xp.vibrato_rate; - wp->vibrato_depth = xp.vibrato_depth; - wp->scale_frequency = le16_to_cpu(xp.scale_frequency); - wp->scale_factor = le16_to_cpu(xp.scale_factor); - real_size = snd_seq_gf1_size(wp->size, wp->format); - if ((long)real_size > *len) { - kfree(wp); - return -ENOMEM; - } - if (ops->put_sample) { - err = ops->put_sample(ops->private_data, wp, - *data, real_size, atomic); - if (err < 0) { - kfree(wp); - return err; - } - } - *data += real_size; - *len -= real_size; - prev = ip->wave; - if (prev) { - while (prev->next) prev = prev->next; - prev->next = wp; - } else { - ip->wave = wp; - } - return 0; -} - -static void snd_seq_gf1_wave_free(snd_gf1_ops_t *ops, - gf1_wave_t *wave, - int atomic) -{ - if (ops->remove_sample) - ops->remove_sample(ops->private_data, wave, atomic); - kfree(wave); -} - -static void snd_seq_gf1_instr_free(snd_gf1_ops_t *ops, - gf1_instrument_t *ip, - int atomic) -{ - gf1_wave_t *wave; - - while ((wave = ip->wave) != NULL) { - ip->wave = wave->next; - snd_seq_gf1_wave_free(ops, wave, atomic); - } -} - -static int snd_seq_gf1_put(void *private_data, snd_seq_kinstr_t *instr, - char __user *instr_data, long len, int atomic, - int cmd) -{ - snd_gf1_ops_t *ops = (snd_gf1_ops_t *)private_data; - gf1_instrument_t *ip; - gf1_xinstrument_t ix; - int err; - gfp_t gfp_mask; - - if (cmd != SNDRV_SEQ_INSTR_PUT_CMD_CREATE) - return -EINVAL; - gfp_mask = atomic ? GFP_ATOMIC : GFP_KERNEL; - /* copy instrument data */ - if (len < (long)sizeof(ix)) - return -EINVAL; - if (copy_from_user(&ix, instr_data, sizeof(ix))) - return -EFAULT; - if (ix.stype != GF1_STRU_INSTR) - return -EINVAL; - instr_data += sizeof(ix); - len -= sizeof(ix); - ip = (gf1_instrument_t *)KINSTR_DATA(instr); - ip->exclusion = le16_to_cpu(ix.exclusion); - ip->exclusion_group = le16_to_cpu(ix.exclusion_group); - ip->effect1 = ix.effect1; - ip->effect1_depth = ix.effect1_depth; - ip->effect2 = ix.effect2; - ip->effect2_depth = ix.effect2_depth; - /* copy layers */ - while (len > (long)sizeof(__u32)) { - __u32 stype; - - if (copy_from_user(&stype, instr_data, sizeof(stype))) - return -EFAULT; - if (stype != GF1_STRU_WAVE) { - snd_seq_gf1_instr_free(ops, ip, atomic); - return -EINVAL; - } - err = snd_seq_gf1_copy_wave_from_stream(ops, - ip, - &instr_data, - &len, - atomic); - if (err < 0) { - snd_seq_gf1_instr_free(ops, ip, atomic); - return err; - } - } - return 0; -} - -static int snd_seq_gf1_copy_wave_to_stream(snd_gf1_ops_t *ops, - gf1_instrument_t *ip, - char __user **data, - long *len, - int atomic) -{ - gf1_wave_t *wp; - gf1_xwave_t xp; - int err; - unsigned int real_size; - - for (wp = ip->wave; wp; wp = wp->next) { - if (*len < (long)sizeof(xp)) - return -ENOMEM; - memset(&xp, 0, sizeof(xp)); - xp.stype = GF1_STRU_WAVE; - xp.share_id[0] = cpu_to_le32(wp->share_id[0]); - xp.share_id[1] = cpu_to_le32(wp->share_id[1]); - xp.share_id[2] = cpu_to_le32(wp->share_id[2]); - xp.share_id[3] = cpu_to_le32(wp->share_id[3]); - xp.format = cpu_to_le32(wp->format); - xp.size = cpu_to_le32(wp->size); - xp.start = cpu_to_le32(wp->start); - xp.loop_start = cpu_to_le32(wp->loop_start); - xp.loop_end = cpu_to_le32(wp->loop_end); - xp.loop_repeat = cpu_to_le32(wp->loop_repeat); - xp.flags = wp->flags; - xp.sample_rate = cpu_to_le32(wp->sample_rate); - xp.low_frequency = cpu_to_le32(wp->low_frequency); - xp.high_frequency = cpu_to_le32(wp->high_frequency); - xp.root_frequency = cpu_to_le32(wp->root_frequency); - xp.tune = cpu_to_le16(wp->tune); - xp.balance = wp->balance; - memcpy(xp.envelope_rate, wp->envelope_rate, 6); - memcpy(xp.envelope_offset, wp->envelope_offset, 6); - xp.tremolo_sweep = wp->tremolo_sweep; - xp.tremolo_rate = wp->tremolo_rate; - xp.tremolo_depth = wp->tremolo_depth; - xp.vibrato_sweep = wp->vibrato_sweep; - xp.vibrato_rate = wp->vibrato_rate; - xp.vibrato_depth = wp->vibrato_depth; - xp.scale_frequency = cpu_to_le16(wp->scale_frequency); - xp.scale_factor = cpu_to_le16(wp->scale_factor); - if (copy_to_user(*data, &xp, sizeof(xp))) - return -EFAULT; - *data += sizeof(xp); - *len -= sizeof(xp); - real_size = snd_seq_gf1_size(wp->size, wp->format); - if (*len < (long)real_size) - return -ENOMEM; - if (ops->get_sample) { - err = ops->get_sample(ops->private_data, wp, - *data, real_size, atomic); - if (err < 0) - return err; - } - *data += wp->size; - *len -= wp->size; - } - return 0; -} - -static int snd_seq_gf1_get(void *private_data, snd_seq_kinstr_t *instr, - char __user *instr_data, long len, int atomic, - int cmd) -{ - snd_gf1_ops_t *ops = (snd_gf1_ops_t *)private_data; - gf1_instrument_t *ip; - gf1_xinstrument_t ix; - - if (cmd != SNDRV_SEQ_INSTR_GET_CMD_FULL) - return -EINVAL; - if (len < (long)sizeof(ix)) - return -ENOMEM; - memset(&ix, 0, sizeof(ix)); - ip = (gf1_instrument_t *)KINSTR_DATA(instr); - ix.stype = GF1_STRU_INSTR; - ix.exclusion = cpu_to_le16(ip->exclusion); - ix.exclusion_group = cpu_to_le16(ip->exclusion_group); - ix.effect1 = cpu_to_le16(ip->effect1); - ix.effect1_depth = cpu_to_le16(ip->effect1_depth); - ix.effect2 = ip->effect2; - ix.effect2_depth = ip->effect2_depth; - if (copy_to_user(instr_data, &ix, sizeof(ix))) - return -EFAULT; - instr_data += sizeof(ix); - len -= sizeof(ix); - return snd_seq_gf1_copy_wave_to_stream(ops, - ip, - &instr_data, - &len, - atomic); -} - -static int snd_seq_gf1_get_size(void *private_data, snd_seq_kinstr_t *instr, - long *size) -{ - long result; - gf1_instrument_t *ip; - gf1_wave_t *wp; - - *size = 0; - ip = (gf1_instrument_t *)KINSTR_DATA(instr); - result = sizeof(gf1_xinstrument_t); - for (wp = ip->wave; wp; wp = wp->next) { - result += sizeof(gf1_xwave_t); - result += wp->size; - } - *size = result; - return 0; -} - -static int snd_seq_gf1_remove(void *private_data, - snd_seq_kinstr_t *instr, - int atomic) -{ - snd_gf1_ops_t *ops = (snd_gf1_ops_t *)private_data; - gf1_instrument_t *ip; - - ip = (gf1_instrument_t *)KINSTR_DATA(instr); - snd_seq_gf1_instr_free(ops, ip, atomic); - return 0; -} - -static void snd_seq_gf1_notify(void *private_data, - snd_seq_kinstr_t *instr, - int what) -{ - snd_gf1_ops_t *ops = (snd_gf1_ops_t *)private_data; - - if (ops->notify) - ops->notify(ops->private_data, instr, what); -} - -int snd_seq_gf1_init(snd_gf1_ops_t *ops, - void *private_data, - snd_seq_kinstr_ops_t *next) -{ - memset(ops, 0, sizeof(*ops)); - ops->private_data = private_data; - ops->kops.private_data = ops; - ops->kops.add_len = sizeof(gf1_instrument_t); - ops->kops.instr_type = SNDRV_SEQ_INSTR_ID_GUS_PATCH; - ops->kops.put = snd_seq_gf1_put; - ops->kops.get = snd_seq_gf1_get; - ops->kops.get_size = snd_seq_gf1_get_size; - ops->kops.remove = snd_seq_gf1_remove; - ops->kops.notify = snd_seq_gf1_notify; - ops->kops.next = next; - return 0; -} - -/* - * Init part - */ - -static int __init alsa_ainstr_gf1_init(void) -{ - return 0; -} - -static void __exit alsa_ainstr_gf1_exit(void) -{ -} - -module_init(alsa_ainstr_gf1_init) -module_exit(alsa_ainstr_gf1_exit) - -EXPORT_SYMBOL(snd_seq_gf1_init); diff --git a/sound/core/seq/instr/ainstr_iw.c b/sound/core/seq/instr/ainstr_iw.c deleted file mode 100644 index 7c19fbbc5d0..00000000000 --- a/sound/core/seq/instr/ainstr_iw.c +++ /dev/null @@ -1,624 +0,0 @@ -/* - * IWFFFF - AMD InterWave (tm) - Instrument routines - * Copyright (c) 1999 by Jaroslav Kysela <perex@suse.cz> - * - * 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 - * - */ - -#include <sound/driver.h> -#include <linux/init.h> -#include <linux/sched.h> -#include <linux/slab.h> -#include <sound/core.h> -#include <sound/ainstr_iw.h> -#include <sound/initval.h> -#include <asm/uaccess.h> - -MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>"); -MODULE_DESCRIPTION("Advanced Linux Sound Architecture IWFFFF support."); -MODULE_LICENSE("GPL"); - -static unsigned int snd_seq_iwffff_size(unsigned int size, unsigned int format) -{ - unsigned int result = size; - - if (format & IWFFFF_WAVE_16BIT) - result <<= 1; - if (format & IWFFFF_WAVE_STEREO) - result <<= 1; - return result; -} - -static void snd_seq_iwffff_copy_lfo_from_stream(iwffff_lfo_t *fp, - iwffff_xlfo_t *fx) -{ - fp->freq = le16_to_cpu(fx->freq); - fp->depth = le16_to_cpu(fx->depth); - fp->sweep = le16_to_cpu(fx->sweep); - fp->shape = fx->shape; - fp->delay = fx->delay; -} - -static int snd_seq_iwffff_copy_env_from_stream(__u32 req_stype, - iwffff_layer_t *lp, - iwffff_env_t *ep, - iwffff_xenv_t *ex, - char __user **data, - long *len, - gfp_t gfp_mask) -{ - __u32 stype; - iwffff_env_record_t *rp, *rp_last; - iwffff_xenv_record_t rx; - iwffff_env_point_t *pp; - iwffff_xenv_point_t px; - int points_size, idx; - - ep->flags = ex->flags; - ep->mode = ex->mode; - ep->index = ex->index; - rp_last = NULL; - while (1) { - if (*len < (long)sizeof(__u32)) - return -EINVAL; - if (copy_from_user(&stype, *data, sizeof(stype))) - return -EFAULT; - if (stype == IWFFFF_STRU_WAVE) - return 0; - if (req_stype != stype) { - if (stype == IWFFFF_STRU_ENV_RECP || - stype == IWFFFF_STRU_ENV_RECV) - return 0; - } - if (*len < (long)sizeof(rx)) - return -EINVAL; - if (copy_from_user(&rx, *data, sizeof(rx))) - return -EFAULT; - *data += sizeof(rx); - *len -= sizeof(rx); - points_size = (le16_to_cpu(rx.nattack) + le16_to_cpu(rx.nrelease)) * 2 * sizeof(__u16); - if (points_size > *len) - return -EINVAL; - rp = kzalloc(sizeof(*rp) + points_size, gfp_mask); - if (rp == NULL) - return -ENOMEM; - rp->nattack = le16_to_cpu(rx.nattack); - rp->nrelease = le16_to_cpu(rx.nrelease); - rp->sustain_offset = le16_to_cpu(rx.sustain_offset); - rp->sustain_rate = le16_to_cpu(rx.sustain_rate); - rp->release_rate = le16_to_cpu(rx.release_rate); - rp->hirange = rx.hirange; - pp = (iwffff_env_point_t *)(rp + 1); - for (idx = 0; idx < rp->nattack + rp->nrelease; idx++) { - if (copy_from_user(&px, *data, sizeof(px))) - return -EFAULT; - *data += sizeof(px); - *len -= sizeof(px); - pp->offset = le16_to_cpu(px.offset); - pp->rate = le16_to_cpu(px.rate); - } - if (ep->record == NULL) { - ep->record = rp; - } else { - rp_last = rp; - } - rp_last = rp; - } - return 0; -} - -static int snd_seq_iwffff_copy_wave_from_stream(snd_iwffff_ops_t *ops, - iwffff_layer_t *lp, - char __user **data, - long *len, - int atomic) -{ - iwffff_wave_t *wp, *prev; - iwffff_xwave_t xp; - int err; - gfp_t gfp_mask; - unsigned int real_size; - - gfp_mask = atomic ? GFP_ATOMIC : GFP_KERNEL; - if (*len < (long)sizeof(xp)) - return -EINVAL; - if (copy_from_user(&xp, *data, sizeof(xp))) - return -EFAULT; - *data += sizeof(xp); - *len -= sizeof(xp); - wp = kzalloc(sizeof(*wp), gfp_mask); - if (wp == NULL) - return -ENOMEM; - wp->share_id[0] = le32_to_cpu(xp.share_id[0]); - wp->share_id[1] = le32_to_cpu(xp.share_id[1]); - wp->share_id[2] = le32_to_cpu(xp.share_id[2]); - wp->share_id[3] = le32_to_cpu(xp.share_id[3]); - wp->format = le32_to_cpu(xp.format); - wp->address.memory = le32_to_cpu(xp.offset); - wp->size = le32_to_cpu(xp.size); - wp->start = le32_to_cpu(xp.start); - wp->loop_start = le32_to_cpu(xp.loop_start); - wp->loop_end = le32_to_cpu(xp.loop_end); - wp->loop_repeat = le16_to_cpu(xp.loop_repeat); - wp->sample_ratio = le32_to_cpu(xp.sample_ratio); - wp->attenuation = xp.attenuation; - wp->low_note = xp.low_note; - wp->high_note = xp.high_note; - real_size = snd_seq_iwffff_size(wp->size, wp->format); - if (!(wp->format & IWFFFF_WAVE_ROM)) { - if ((long)real_size > *len) { - kfree(wp); - return -ENOMEM; - } - } - if (ops->put_sample) { - err = ops->put_sample(ops->private_data, wp, - *data, real_size, atomic); - if (err < 0) { - kfree(wp); - return err; - } - } - if (!(wp->format & IWFFFF_WAVE_ROM)) { - *data += real_size; - *len -= real_size; - } - prev = lp->wave; - if (prev) { - while (prev->next) prev = prev->next; - prev->next = wp; - } else { - lp->wave = wp; - } - return 0; -} - -static void snd_seq_iwffff_env_free(snd_iwffff_ops_t *ops, - iwffff_env_t *env, - int atomic) -{ - iwffff_env_record_t *rec; - - while ((rec = env->record) != NULL) { - env->record = rec->next; - kfree(rec); - } -} - -static void snd_seq_iwffff_wave_free(snd_iwffff_ops_t *ops, - iwffff_wave_t *wave, - int atomic) -{ - if (ops->remove_sample) - ops->remove_sample(ops->private_data, wave, atomic); - kfree(wave); -} - -static void snd_seq_iwffff_instr_free(snd_iwffff_ops_t *ops, - iwffff_instrument_t *ip, - int atomic) -{ - iwffff_layer_t *layer; - iwffff_wave_t *wave; - - while ((layer = ip->layer) != NULL) { - ip->layer = layer->next; - snd_seq_iwffff_env_free(ops, &layer->penv, atomic); - snd_seq_iwffff_env_free(ops, &layer->venv, atomic); - while ((wave = layer->wave) != NULL) { - layer->wave = wave->next; - snd_seq_iwffff_wave_free(ops, wave, atomic); - } - kfree(layer); - } -} - -static int snd_seq_iwffff_put(void *private_data, snd_seq_kinstr_t *instr, - char __user *instr_data, long len, int atomic, - int cmd) -{ - snd_iwffff_ops_t *ops = (snd_iwffff_ops_t *)private_data; - iwffff_instrument_t *ip; - iwffff_xinstrument_t ix; - iwffff_layer_t *lp, *prev_lp; - iwffff_xlayer_t lx; - int err; - gfp_t gfp_mask; - - if (cmd != SNDRV_SEQ_INSTR_PUT_CMD_CREATE) - return -EINVAL; - gfp_mask = atomic ? GFP_ATOMIC : GFP_KERNEL; - /* copy instrument data */ - if (len < (long)sizeof(ix)) - return -EINVAL; - if (copy_from_user(&ix, instr_data, sizeof(ix))) - return -EFAULT; - if (ix.stype != IWFFFF_STRU_INSTR) - return -EINVAL; - instr_data += sizeof(ix); - len -= sizeof(ix); - ip = (iwffff_instrument_t *)KINSTR_DATA(instr); - ip->exclusion = le16_to_cpu(ix.exclusion); - ip->layer_type = le16_to_cpu(ix.layer_type); - ip->exclusion_group = le16_to_cpu(ix.exclusion_group); - ip->effect1 = ix.effect1; - ip->effect1_depth = ix.effect1_depth; - ip->effect2 = ix.effect2; - ip->effect2_depth = ix.effect2_depth; - /* copy layers */ - prev_lp = NULL; - while (len > 0) { - if (len < (long)sizeof(iwffff_xlayer_t)) { - snd_seq_iwffff_instr_free(ops, ip, atomic); - return -EINVAL; - } - if (copy_from_user(&lx, instr_data, sizeof(lx))) - return -EFAULT; - instr_data += sizeof(lx); - len -= sizeof(lx); - if (lx.stype != IWFFFF_STRU_LAYER) { - snd_seq_iwffff_instr_free(ops, ip, atomic); - return -EINVAL; - } - lp = kzalloc(sizeof(*lp), gfp_mask); - if (lp == NULL) { - snd_seq_iwffff_instr_free(ops, ip, atomic); - return -ENOMEM; - } - if (prev_lp) { - prev_lp->next = lp; - } else { - ip->layer = lp; - } - prev_lp = lp; - lp->flags = lx.flags; - lp->velocity_mode = lx.velocity_mode; - lp->layer_event = lx.layer_event; - lp->low_range = lx.low_range; - lp->high_range = lx.high_range; - lp->pan = lx.pan; - lp->pan_freq_scale = lx.pan_freq_scale; - lp->attenuation = lx.attenuation; - snd_seq_iwffff_copy_lfo_from_stream(&lp->tremolo, &lx.tremolo); - snd_seq_iwffff_copy_lfo_from_stream(&lp->vibrato, &lx.vibrato); - lp->freq_scale = le16_to_cpu(lx.freq_scale); - lp->freq_center = lx.freq_center; - err = snd_seq_iwffff_copy_env_from_stream(IWFFFF_STRU_ENV_RECP, - lp, - &lp->penv, &lx.penv, - &instr_data, &len, - gfp_mask); - if (err < 0) { - snd_seq_iwffff_instr_free(ops, ip, atomic); - return err; - } - err = snd_seq_iwffff_copy_env_from_stream(IWFFFF_STRU_ENV_RECV, - lp, - &lp->venv, &lx.venv, - &instr_data, &len, - gfp_mask); - if (err < 0) { - snd_seq_iwffff_instr_free(ops, ip, atomic); - return err; - } - while (len > (long)sizeof(__u32)) { - __u32 stype; - - if (copy_from_user(&stype, instr_data, sizeof(stype))) - return -EFAULT; - if (stype != IWFFFF_STRU_WAVE) - break; - err = snd_seq_iwffff_copy_wave_from_stream(ops, - lp, - &instr_data, - &len, - atomic); - if (err < 0) { - snd_seq_iwffff_instr_free(ops, ip, atomic); - return err; - } - } - } - return 0; -} - -static void snd_seq_iwffff_copy_lfo_to_stream(iwffff_xlfo_t *fx, - iwffff_lfo_t *fp) -{ - fx->freq = cpu_to_le16(fp->freq); - fx->depth = cpu_to_le16(fp->depth); - fx->sweep = cpu_to_le16(fp->sweep); - fp->shape = fx->shape; - fp->delay = fx->delay; -} - -static int snd_seq_iwffff_copy_env_to_stream(__u32 req_stype, - iwffff_layer_t *lp, - iwffff_xenv_t *ex, - iwffff_env_t *ep, - char __user **data, - long *len) -{ - iwffff_env_record_t *rp; - iwffff_xenv_record_t rx; - iwffff_env_point_t *pp; - iwffff_xenv_point_t px; - int points_size, idx; - - ex->flags = ep->flags; - ex->mode = ep->mode; - ex->index = ep->index; - for (rp = ep->record; rp; rp = rp->next) { - if (*len < (long)sizeof(rx)) - return -ENOMEM; - memset(&rx, 0, sizeof(rx)); - rx.stype = req_stype; - rx.nattack = cpu_to_le16(rp->nattack); - rx.nrelease = cpu_to_le16(rp->nrelease); - rx.sustain_offset = cpu_to_le16(rp->sustain_offset); - rx.sustain_rate = cpu_to_le16(rp->sustain_rate); - rx.release_rate = cpu_to_le16(rp->release_rate); - rx.hirange = cpu_to_le16(rp->hirange); - if (copy_to_user(*data, &rx, sizeof(rx))) - return -EFAULT; - *data += sizeof(rx); - *len -= sizeof(rx); - points_size = (rp->nattack + rp->nrelease) * 2 * sizeof(__u16); - if (*len < points_size) - return -ENOMEM; - pp = (iwffff_env_point_t *)(rp + 1); - for (idx = 0; idx < rp->nattack + rp->nrelease; idx++) { - px.offset = cpu_to_le16(pp->offset); - px.rate = cpu_to_le16(pp->rate); - if (copy_to_user(*data, &px, sizeof(px))) - return -EFAULT; - *data += sizeof(px); - *len -= sizeof(px); - } - } - return 0; -} - -static int snd_seq_iwffff_copy_wave_to_stream(snd_iwffff_ops_t *ops, - iwffff_layer_t *lp, - char __user **data, - long *len, - int atomic) -{ - iwffff_wave_t *wp; - iwffff_xwave_t xp; - int err; - unsigned int real_size; - - for (wp = lp->wave; wp; wp = wp->next) { - if (*len < (long)sizeof(xp)) - return -ENOMEM; - memset(&xp, 0, sizeof(xp)); - xp.stype = IWFFFF_STRU_WAVE; - xp.share_id[0] = cpu_to_le32(wp->share_id[0]); - xp.share_id[1] = cpu_to_le32(wp->share_id[1]); - xp.share_id[2] = cpu_to_le32(wp->share_id[2]); - xp.share_id[3] = cpu_to_le32(wp->share_id[3]); - xp.format = cpu_to_le32(wp->format); - if (wp->format & IWFFFF_WAVE_ROM) - xp.offset = cpu_to_le32(wp->address.memory); - xp.size = cpu_to_le32(wp->size); - xp.start = cpu_to_le32(wp->start); - xp.loop_start = cpu_to_le32(wp->loop_start); - xp.loop_end = cpu_to_le32(wp->loop_end); - xp.loop_repeat = cpu_to_le32(wp->loop_repeat); - xp.sample_ratio = cpu_to_le32(wp->sample_ratio); - xp.attenuation = wp->attenuation; - xp.low_note = wp->low_note; - xp.high_note = wp->high_note; - if (copy_to_user(*data, &xp, sizeof(xp))) - return -EFAULT; - *data += sizeof(xp); - *len -= sizeof(xp); - real_size = snd_seq_iwffff_size(wp->size, wp->format); - if (!(wp->format & IWFFFF_WAVE_ROM)) { - if (*len < (long)real_size) - return -ENOMEM; - } - if (ops->get_sample) { - err = ops->get_sample(ops->private_data, wp, - *data, real_size, atomic); - if (err < 0) - return err; - } - if (!(wp->format & IWFFFF_WAVE_ROM)) { - *data += real_size; - *len -= real_size; - } - } - return 0; -} - -static int snd_seq_iwffff_get(void *private_data, snd_seq_kinstr_t *instr, - char __user *instr_data, long len, int atomic, int cmd) -{ - snd_iwffff_ops_t *ops = (snd_iwffff_ops_t *)private_data; - iwffff_instrument_t *ip; - iwffff_xinstrument_t ix; - iwffff_layer_t *lp; - iwffff_xlayer_t lx; - char __user *layer_instr_data; - int err; - - if (cmd != SNDRV_SEQ_INSTR_GET_CMD_FULL) - return -EINVAL; - if (len < (long)sizeof(ix)) - return -ENOMEM; - memset(&ix, 0, sizeof(ix)); - ip = (iwffff_instrument_t *)KINSTR_DATA(instr); - ix.stype = IWFFFF_STRU_INSTR; - ix.exclusion = cpu_to_le16(ip->exclusion); - ix.layer_type = cpu_to_le16(ip->layer_type); - ix.exclusion_group = cpu_to_le16(ip->exclusion_group); - ix.effect1 = cpu_to_le16(ip->effect1); - ix.effect1_depth = cpu_to_le16(ip->effect1_depth); - ix.effect2 = ip->effect2; - ix.effect2_depth = ip->effect2_depth; - if (copy_to_user(instr_data, &ix, sizeof(ix))) - return -EFAULT; - instr_data += sizeof(ix); - len -= sizeof(ix); - for (lp = ip->layer; lp; lp = lp->next) { - if (len < (long)sizeof(lx)) - return -ENOMEM; - memset(&lx, 0, sizeof(lx)); - lx.stype = IWFFFF_STRU_LAYER; - lx.flags = lp->flags; - lx.velocity_mode = lp->velocity_mode; - lx.layer_event = lp->layer_event; - lx.low_range = lp->low_range; - lx.high_range = lp->high_range; - lx.pan = lp->pan; - lx.pan_freq_scale = lp->pan_freq_scale; - lx.attenuation = lp->attenuation; - snd_seq_iwffff_copy_lfo_to_stream(&lx.tremolo, &lp->tremolo); - snd_seq_iwffff_copy_lfo_to_stream(&lx.vibrato, &lp->vibrato); - layer_instr_data = instr_data; - instr_data += sizeof(lx); - len -= sizeof(lx); - err = snd_seq_iwffff_copy_env_to_stream(IWFFFF_STRU_ENV_RECP, - lp, - &lx.penv, &lp->penv, - &instr_data, &len); - if (err < 0) - return err; - err = snd_seq_iwffff_copy_env_to_stream(IWFFFF_STRU_ENV_RECV, - lp, - &lx.venv, &lp->venv, - &instr_data, &len); - if (err < 0) - return err; - /* layer structure updating is now finished */ - if (copy_to_user(layer_instr_data, &lx, sizeof(lx))) - return -EFAULT; - err = snd_seq_iwffff_copy_wave_to_stream(ops, - lp, - &instr_data, - &len, - atomic); - if (err < 0) - return err; - } - return 0; -} - -static long snd_seq_iwffff_env_size_in_stream(iwffff_env_t *ep) -{ - long result = 0; - iwffff_env_record_t *rp; - - for (rp = ep->record; rp; rp = rp->next) { - result += sizeof(iwffff_xenv_record_t); - result += (rp->nattack + rp->nrelease) * 2 * sizeof(__u16); - } - return 0; -} - -static long snd_seq_iwffff_wave_size_in_stream(iwffff_layer_t *lp) -{ - long result = 0; - iwffff_wave_t *wp; - - for (wp = lp->wave; wp; wp = wp->next) { - result += sizeof(iwffff_xwave_t); - if (!(wp->format & IWFFFF_WAVE_ROM)) - result += wp->size; - } - return result; -} - -static int snd_seq_iwffff_get_size(void *private_data, snd_seq_kinstr_t *instr, - long *size) -{ - long result; - iwffff_instrument_t *ip; - iwffff_layer_t *lp; - - *size = 0; - ip = (iwffff_instrument_t *)KINSTR_DATA(instr); - result = sizeof(iwffff_xinstrument_t); - for (lp = ip->layer; lp; lp = lp->next) { - result += sizeof(iwffff_xlayer_t); - result += snd_seq_iwffff_env_size_in_stream(&lp->penv); - result += snd_seq_iwffff_env_size_in_stream(&lp->venv); - result += snd_seq_iwffff_wave_size_in_stream(lp); - } - *size = result; - return 0; -} - -static int snd_seq_iwffff_remove(void *private_data, - snd_seq_kinstr_t *instr, - int atomic) -{ - snd_iwffff_ops_t *ops = (snd_iwffff_ops_t *)private_data; - iwffff_instrument_t *ip; - - ip = (iwffff_instrument_t *)KINSTR_DATA(instr); - snd_seq_iwffff_instr_free(ops, ip, atomic); - return 0; -} - -static void snd_seq_iwffff_notify(void *private_data, - snd_seq_kinstr_t *instr, - int what) -{ - snd_iwffff_ops_t *ops = (snd_iwffff_ops_t *)private_data; - - if (ops->notify) - ops->notify(ops->private_data, instr, what); -} - -int snd_seq_iwffff_init(snd_iwffff_ops_t *ops, - void *private_data, - snd_seq_kinstr_ops_t *next) -{ - memset(ops, 0, sizeof(*ops)); - ops->private_data = private_data; - ops->kops.private_data = ops; - ops->kops.add_len = sizeof(iwffff_instrument_t); - ops->kops.instr_type = SNDRV_SEQ_INSTR_ID_INTERWAVE; - ops->kops.put = snd_seq_iwffff_put; - ops->kops.get = snd_seq_iwffff_get; - ops->kops.get_size = snd_seq_iwffff_get_size; - ops->kops.remove = snd_seq_iwffff_remove; - ops->kops.notify = snd_seq_iwffff_notify; - ops->kops.next = next; - return 0; -} - -/* - * Init part - */ - -static int __init alsa_ainstr_iw_init(void) -{ - return 0; -} - -static void __exit alsa_ainstr_iw_exit(void) -{ -} - -module_init(alsa_ainstr_iw_init) -module_exit(alsa_ainstr_iw_exit) - -EXPORT_SYMBOL(snd_seq_iwffff_init); diff --git a/sound/core/seq/instr/ainstr_simple.c b/sound/core/seq/instr/ainstr_simple.c deleted file mode 100644 index 17ab94e7607..00000000000 --- a/sound/core/seq/instr/ainstr_simple.c +++ /dev/null @@ -1,216 +0,0 @@ -/* - * Simple (MOD player) - Instrument routines - * Copyright (c) 1999 by Jaroslav Kysela <perex@suse.cz> - * - * 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 - * - */ - -#include <sound/driver.h> -#include <linux/init.h> -#include <linux/sched.h> -#include <linux/slab.h> -#include <sound/core.h> -#include <sound/ainstr_simple.h> -#include <sound/initval.h> -#include <asm/uaccess.h> - -MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>"); -MODULE_DESCRIPTION("Advanced Linux Sound Architecture Simple Instrument support."); -MODULE_LICENSE("GPL"); - -static unsigned int snd_seq_simple_size(unsigned int size, unsigned int format) -{ - unsigned int result = size; - - if (format & SIMPLE_WAVE_16BIT) - result <<= 1; - if (format & SIMPLE_WAVE_STEREO) - result <<= 1; - return result; -} - -static void snd_seq_simple_instr_free(snd_simple_ops_t *ops, - simple_instrument_t *ip, - int atomic) -{ - if (ops->remove_sample) - ops->remove_sample(ops->private_data, ip, atomic); -} - -static int snd_seq_simple_put(void *private_data, snd_seq_kinstr_t *instr, - char __user *instr_data, long len, - int atomic, int cmd) -{ - snd_simple_ops_t *ops = (snd_simple_ops_t *)private_data; - simple_instrument_t *ip; - simple_xinstrument_t ix; - int err; - gfp_t gfp_mask; - unsigned int real_size; - - if (cmd != SNDRV_SEQ_INSTR_PUT_CMD_CREATE) - return -EINVAL; - gfp_mask = atomic ? GFP_ATOMIC : GFP_KERNEL; - /* copy instrument data */ - if (len < (long)sizeof(ix)) - return -EINVAL; - if (copy_from_user(&ix, instr_data, sizeof(ix))) - return -EFAULT; - if (ix.stype != SIMPLE_STRU_INSTR) - return -EINVAL; - instr_data += sizeof(ix); - len -= sizeof(ix); - ip = (simple_instrument_t *)KINSTR_DATA(instr); - ip->share_id[0] = le32_to_cpu(ix.share_id[0]); - ip->share_id[1] = le32_to_cpu(ix.share_id[1]); - ip->share_id[2] = le32_to_cpu(ix.share_id[2]); - ip->share_id[3] = le32_to_cpu(ix.share_id[3]); - ip->format = le32_to_cpu(ix.format); - ip->size = le32_to_cpu(ix.size); - ip->start = le32_to_cpu(ix.start); - ip->loop_start = le32_to_cpu(ix.loop_start); - ip->loop_end = le32_to_cpu(ix.loop_end); - ip->loop_repeat = le16_to_cpu(ix.loop_repeat); - ip->effect1 = ix.effect1; - ip->effect1_depth = ix.effect1_depth; - ip->effect2 = ix.effect2; - ip->effect2_depth = ix.effect2_depth; - real_size = snd_seq_simple_size(ip->size, ip->format); - if (len < (long)real_size) - return -EINVAL; - if (ops->put_sample) { - err = ops->put_sample(ops->private_data, ip, - instr_data, real_size, atomic); - if (err < 0) - return err; - } - return 0; -} - -static int snd_seq_simple_get(void *private_data, snd_seq_kinstr_t *instr, - char __user *instr_data, long len, - int atomic, int cmd) -{ - snd_simple_ops_t *ops = (snd_simple_ops_t *)private_data; - simple_instrument_t *ip; - simple_xinstrument_t ix; - int err; - unsigned int real_size; - - if (cmd != SNDRV_SEQ_INSTR_GET_CMD_FULL) - return -EINVAL; - if (len < (long)sizeof(ix)) - return -ENOMEM; - memset(&ix, 0, sizeof(ix)); - ip = (simple_instrument_t *)KINSTR_DATA(instr); - ix.stype = SIMPLE_STRU_INSTR; - ix.share_id[0] = cpu_to_le32(ip->share_id[0]); - ix.share_id[1] = cpu_to_le32(ip->share_id[1]); - ix.share_id[2] = cpu_to_le32(ip->share_id[2]); - ix.share_id[3] = cpu_to_le32(ip->share_id[3]); - ix.format = cpu_to_le32(ip->format); - ix.size = cpu_to_le32(ip->size); - ix.start = cpu_to_le32(ip->start); - ix.loop_start = cpu_to_le32(ip->loop_start); - ix.loop_end = cpu_to_le32(ip->loop_end); - ix.loop_repeat = cpu_to_le32(ip->loop_repeat); - ix.effect1 = cpu_to_le16(ip->effect1); - ix.effect1_depth = cpu_to_le16(ip->effect1_depth); - ix.effect2 = ip->effect2; - ix.effect2_depth = ip->effect2_depth; - if (copy_to_user(instr_data, &ix, sizeof(ix))) - return -EFAULT; - instr_data += sizeof(ix); - len -= sizeof(ix); - real_size = snd_seq_simple_size(ip->size, ip->format); - if (len < (long)real_size) - return -ENOMEM; - if (ops->get_sample) { - err = ops->get_sample(ops->private_data, ip, - instr_data, real_size, atomic); - if (err < 0) - return err; - } - return 0; -} - -static int snd_seq_simple_get_size(void *private_data, snd_seq_kinstr_t *instr, - long *size) -{ - simple_instrument_t *ip; - - ip = (simple_instrument_t *)KINSTR_DATA(instr); - *size = sizeof(simple_xinstrument_t) + snd_seq_simple_size(ip->size, ip->format); - return 0; -} - -static int snd_seq_simple_remove(void *private_data, - snd_seq_kinstr_t *instr, - int atomic) -{ - snd_simple_ops_t *ops = (snd_simple_ops_t *)private_data; - simple_instrument_t *ip; - - ip = (simple_instrument_t *)KINSTR_DATA(instr); - snd_seq_simple_instr_free(ops, ip, atomic); - return 0; -} - -static void snd_seq_simple_notify(void *private_data, - snd_seq_kinstr_t *instr, - int what) -{ - snd_simple_ops_t *ops = (snd_simple_ops_t *)private_data; - - if (ops->notify) - ops->notify(ops->private_data, instr, what); -} - -int snd_seq_simple_init(snd_simple_ops_t *ops, - void *private_data, - snd_seq_kinstr_ops_t *next) -{ - memset(ops, 0, sizeof(*ops)); - ops->private_data = private_data; - ops->kops.private_data = ops; - ops->kops.add_len = sizeof(simple_instrument_t); - ops->kops.instr_type = SNDRV_SEQ_INSTR_ID_SIMPLE; - ops->kops.put = snd_seq_simple_put; - ops->kops.get = snd_seq_simple_get; - ops->kops.get_size = snd_seq_simple_get_size; - ops->kops.remove = snd_seq_simple_remove; - ops->kops.notify = snd_seq_simple_notify; - ops->kops.next = next; - return 0; -} - -/* - * Init part - */ - -static int __init alsa_ainstr_simple_init(void) -{ - return 0; -} - -static void __exit alsa_ainstr_simple_exit(void) -{ -} - -module_init(alsa_ainstr_simple_init) -module_exit(alsa_ainstr_simple_exit) - -EXPORT_SYMBOL(snd_seq_simple_init); diff --git a/sound/core/seq/oss/Makefile b/sound/core/seq/oss/Makefile index a37ddedf710..b38406b8463 100644 --- a/sound/core/seq/oss/Makefile +++ b/sound/core/seq/oss/Makefile @@ -1,6 +1,6 @@ # # Makefile for ALSA -# Copyright (c) 1999 by Jaroslav Kysela <perex@suse.cz> +# Copyright (c) 1999 by Jaroslav Kysela <perex@perex.cz> # snd-seq-oss-objs := seq_oss.o seq_oss_init.o seq_oss_timer.o seq_oss_ioctl.o \ diff --git a/sound/core/seq/oss/seq_oss.c b/sound/core/seq/oss/seq_oss.c index 4c0558c0a8b..16d42679e43 100644 --- a/sound/core/seq/oss/seq_oss.c +++ b/sound/core/seq/oss/seq_oss.c @@ -20,10 +20,9 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include <sound/driver.h> #include <linux/init.h> -#include <linux/smp_lock.h> -#include <linux/moduleparam.h> +#include <linux/module.h> +#include <linux/mutex.h> #include <sound/core.h> #include <sound/minors.h> #include <sound/initval.h> @@ -40,20 +39,19 @@ MODULE_LICENSE("GPL"); MODULE_ALIAS_SNDRV_MINOR(SNDRV_MINOR_OSS_SEQUENCER); MODULE_ALIAS_SNDRV_MINOR(SNDRV_MINOR_OSS_MUSIC); -#ifdef SNDRV_SEQ_OSS_DEBUG -module_param(seq_oss_debug, int, 0644); -MODULE_PARM_DESC(seq_oss_debug, "debug option"); -int seq_oss_debug = 0; -#endif - /* * prototypes */ static int register_device(void); static void unregister_device(void); +#ifdef CONFIG_PROC_FS static int register_proc(void); static void unregister_proc(void); +#else +static inline int register_proc(void) { return 0; } +static inline void unregister_proc(void) {} +#endif static int odev_open(struct inode *inode, struct file *file); static int odev_release(struct inode *inode, struct file *file); @@ -61,9 +59,6 @@ static ssize_t odev_read(struct file *file, char __user *buf, size_t count, loff static ssize_t odev_write(struct file *file, const char __user *buf, size_t count, loff_t *offset); static long odev_ioctl(struct file *file, unsigned int cmd, unsigned long arg); static unsigned int odev_poll(struct file *file, poll_table * wait); -#ifdef CONFIG_PROC_FS -static void info_read(snd_info_entry_t *entry, snd_info_buffer_t *buf); -#endif /* @@ -73,7 +68,7 @@ static void info_read(snd_info_entry_t *entry, snd_info_buffer_t *buf); static int __init alsa_seq_oss_init(void) { int rc; - static snd_seq_dev_ops_t ops = { + static struct snd_seq_dev_ops ops = { snd_seq_oss_synth_register, snd_seq_oss_synth_unregister, }; @@ -92,7 +87,7 @@ static int __init alsa_seq_oss_init(void) } if ((rc = snd_seq_device_register_driver(SNDRV_SEQ_DEV_ID_OSS, &ops, - sizeof(snd_seq_oss_reg_t))) < 0) { + sizeof(struct snd_seq_oss_reg))) < 0) { snd_seq_oss_delete_client(); unregister_proc(); unregister_device(); @@ -122,7 +117,7 @@ module_exit(alsa_seq_oss_exit) * ALSA minor device interface */ -static DECLARE_MUTEX(register_mutex); +static DEFINE_MUTEX(register_mutex); static int odev_open(struct inode *inode, struct file *file) @@ -134,9 +129,9 @@ odev_open(struct inode *inode, struct file *file) else level = SNDRV_SEQ_OSS_MODE_SYNTH; - down(®ister_mutex); + mutex_lock(®ister_mutex); rc = snd_seq_oss_open(file, level); - up(®ister_mutex); + mutex_unlock(®ister_mutex); return rc; } @@ -144,16 +139,16 @@ odev_open(struct inode *inode, struct file *file) static int odev_release(struct inode *inode, struct file *file) { - seq_oss_devinfo_t *dp; + struct seq_oss_devinfo *dp; if ((dp = file->private_data) == NULL) return 0; snd_seq_oss_drain_write(dp); - down(®ister_mutex); + mutex_lock(®ister_mutex); snd_seq_oss_release(dp); - up(®ister_mutex); + mutex_unlock(®ister_mutex); return 0; } @@ -161,9 +156,10 @@ odev_release(struct inode *inode, struct file *file) static ssize_t odev_read(struct file *file, char __user *buf, size_t count, loff_t *offset) { - seq_oss_devinfo_t *dp; + struct seq_oss_devinfo *dp; dp = file->private_data; - snd_assert(dp != NULL, return -EIO); + if (snd_BUG_ON(!dp)) + return -ENXIO; return snd_seq_oss_read(dp, buf, count); } @@ -171,18 +167,20 @@ odev_read(struct file *file, char __user *buf, size_t count, loff_t *offset) static ssize_t odev_write(struct file *file, const char __user *buf, size_t count, loff_t *offset) { - seq_oss_devinfo_t *dp; + struct seq_oss_devinfo *dp; dp = file->private_data; - snd_assert(dp != NULL, return -EIO); + if (snd_BUG_ON(!dp)) + return -ENXIO; return snd_seq_oss_write(dp, buf, count, file); } static long odev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { - seq_oss_devinfo_t *dp; + struct seq_oss_devinfo *dp; dp = file->private_data; - snd_assert(dp != NULL, return -EIO); + if (snd_BUG_ON(!dp)) + return -ENXIO; return snd_seq_oss_ioctl(dp, cmd, arg); } @@ -195,9 +193,10 @@ odev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) static unsigned int odev_poll(struct file *file, poll_table * wait) { - seq_oss_devinfo_t *dp; + struct seq_oss_devinfo *dp; dp = file->private_data; - snd_assert(dp != NULL, return 0); + if (snd_BUG_ON(!dp)) + return -ENXIO; return snd_seq_oss_poll(dp, file, wait); } @@ -205,7 +204,7 @@ odev_poll(struct file *file, poll_table * wait) * registration of sequencer minor device */ -static struct file_operations seq_oss_f_ops = +static const struct file_operations seq_oss_f_ops = { .owner = THIS_MODULE, .read = odev_read, @@ -215,11 +214,7 @@ static struct file_operations seq_oss_f_ops = .poll = odev_poll, .unlocked_ioctl = odev_ioctl, .compat_ioctl = odev_ioctl_compat, -}; - -static snd_minor_t seq_oss_reg = { - .comment = "sequencer", - .f_ops = &seq_oss_f_ops, + .llseek = noop_llseek, }; static int __init @@ -227,39 +222,35 @@ register_device(void) { int rc; - down(®ister_mutex); + mutex_lock(®ister_mutex); if ((rc = snd_register_oss_device(SNDRV_OSS_DEVICE_TYPE_SEQUENCER, NULL, 0, - &seq_oss_reg, - SNDRV_SEQ_OSS_DEVNAME)) < 0) { - snd_printk(KERN_ERR "can't register device seq\n"); - up(®ister_mutex); + &seq_oss_f_ops, NULL)) < 0) { + pr_err("ALSA: seq_oss: can't register device seq\n"); + mutex_unlock(®ister_mutex); return rc; } if ((rc = snd_register_oss_device(SNDRV_OSS_DEVICE_TYPE_MUSIC, NULL, 0, - &seq_oss_reg, - SNDRV_SEQ_OSS_DEVNAME)) < 0) { - snd_printk(KERN_ERR "can't register device music\n"); + &seq_oss_f_ops, NULL)) < 0) { + pr_err("ALSA: seq_oss: can't register device music\n"); snd_unregister_oss_device(SNDRV_OSS_DEVICE_TYPE_SEQUENCER, NULL, 0); - up(®ister_mutex); + mutex_unlock(®ister_mutex); return rc; } - debug_printk(("device registered\n")); - up(®ister_mutex); + mutex_unlock(®ister_mutex); return 0; } static void unregister_device(void) { - down(®ister_mutex); - debug_printk(("device unregistered\n")); + mutex_lock(®ister_mutex); if (snd_unregister_oss_device(SNDRV_OSS_DEVICE_TYPE_MUSIC, NULL, 0) < 0) - snd_printk(KERN_ERR "error unregister device music\n"); + pr_err("ALSA: seq_oss: error unregister device music\n"); if (snd_unregister_oss_device(SNDRV_OSS_DEVICE_TYPE_SEQUENCER, NULL, 0) < 0) - snd_printk(KERN_ERR "error unregister device seq\n"); - up(®ister_mutex); + pr_err("ALSA: seq_oss: error unregister device seq\n"); + mutex_unlock(®ister_mutex); } /* @@ -268,26 +259,24 @@ unregister_device(void) #ifdef CONFIG_PROC_FS -static snd_info_entry_t *info_entry; +static struct snd_info_entry *info_entry; static void -info_read(snd_info_entry_t *entry, snd_info_buffer_t *buf) +info_read(struct snd_info_entry *entry, struct snd_info_buffer *buf) { - down(®ister_mutex); + mutex_lock(®ister_mutex); snd_iprintf(buf, "OSS sequencer emulation version %s\n", SNDRV_SEQ_OSS_VERSION_STR); snd_seq_oss_system_info_read(buf); snd_seq_oss_synth_info_read(buf); snd_seq_oss_midi_info_read(buf); - up(®ister_mutex); + mutex_unlock(®ister_mutex); } -#endif /* CONFIG_PROC_FS */ static int __init register_proc(void) { -#ifdef CONFIG_PROC_FS - snd_info_entry_t *entry; + struct snd_info_entry *entry; entry = snd_info_create_module_entry(THIS_MODULE, SNDRV_SEQ_OSS_PROCNAME, snd_seq_root); if (entry == NULL) @@ -295,23 +284,19 @@ register_proc(void) entry->content = SNDRV_INFO_CONTENT_TEXT; entry->private_data = NULL; - entry->c.text.read_size = 1024; entry->c.text.read = info_read; if (snd_info_register(entry) < 0) { snd_info_free_entry(entry); return -ENOMEM; } info_entry = entry; -#endif return 0; } static void unregister_proc(void) { -#ifdef CONFIG_PROC_FS - if (info_entry) - snd_info_unregister(info_entry); + snd_info_free_entry(info_entry); info_entry = NULL; -#endif } +#endif /* CONFIG_PROC_FS */ diff --git a/sound/core/seq/oss/seq_oss_device.h b/sound/core/seq/oss/seq_oss_device.h index 973786758c5..b4392432524 100644 --- a/sound/core/seq/oss/seq_oss_device.h +++ b/sound/core/seq/oss/seq_oss_device.h @@ -21,7 +21,6 @@ #ifndef __SEQ_OSS_DEVICE_H #define __SEQ_OSS_DEVICE_H -#include <sound/driver.h> #include <linux/time.h> #include <linux/wait.h> #include <linux/slab.h> @@ -32,9 +31,6 @@ #include <sound/seq_kernel.h> #include <sound/info.h> -/* enable debug print */ -#define SNDRV_SEQ_OSS_DEBUG - /* max. applications */ #define SNDRV_SEQ_OSS_MAX_CLIENTS 16 #define SNDRV_SEQ_OSS_MAX_SYNTH_DEVS 16 @@ -47,7 +43,6 @@ #define SNDRV_SEQ_OSS_VERSION_STR "0.1.8" /* device and proc interface name */ -#define SNDRV_SEQ_OSS_DEVNAME "seq_oss" #define SNDRV_SEQ_OSS_PROCNAME "oss" @@ -55,32 +50,24 @@ * type definitions */ -typedef struct seq_oss_devinfo_t seq_oss_devinfo_t; -typedef struct seq_oss_writeq_t seq_oss_writeq_t; -typedef struct seq_oss_readq_t seq_oss_readq_t; -typedef struct seq_oss_timer_t seq_oss_timer_t; -typedef struct seq_oss_synthinfo_t seq_oss_synthinfo_t; -typedef struct seq_oss_synth_sysex_t seq_oss_synth_sysex_t; -typedef struct seq_oss_chinfo_t seq_oss_chinfo_t; typedef unsigned int reltime_t; typedef unsigned int abstime_t; -typedef union evrec_t evrec_t; /* * synthesizer channel information */ -struct seq_oss_chinfo_t { +struct seq_oss_chinfo { int note, vel; }; /* * synthesizer information */ -struct seq_oss_synthinfo_t { - snd_seq_oss_arg_t arg; - seq_oss_chinfo_t *ch; - seq_oss_synth_sysex_t *sysex; +struct seq_oss_synthinfo { + struct snd_seq_oss_arg arg; + struct seq_oss_chinfo *ch; + struct seq_oss_synth_sysex *sysex; int nr_voices; int opened; int is_midi; @@ -92,14 +79,14 @@ struct seq_oss_synthinfo_t { * sequencer client information */ -struct seq_oss_devinfo_t { +struct seq_oss_devinfo { int index; /* application index */ int cseq; /* sequencer client number */ int port; /* sequencer port number */ int queue; /* sequencer queue number */ - snd_seq_addr_t addr; /* address of this device */ + struct snd_seq_addr addr; /* address of this device */ int seq_mode; /* sequencer mode */ int file_mode; /* file access */ @@ -109,17 +96,17 @@ struct seq_oss_devinfo_t { /* synth device table */ int max_synthdev; - seq_oss_synthinfo_t synths[SNDRV_SEQ_OSS_MAX_SYNTH_DEVS]; + struct seq_oss_synthinfo synths[SNDRV_SEQ_OSS_MAX_SYNTH_DEVS]; int synth_opened; /* output queue */ - seq_oss_writeq_t *writeq; + struct seq_oss_writeq *writeq; /* midi input queue */ - seq_oss_readq_t *readq; + struct seq_oss_readq *readq; /* timer */ - seq_oss_timer_t *timer; + struct seq_oss_timer *timer; }; @@ -133,24 +120,24 @@ int snd_seq_oss_delete_client(void); /* device file interface */ int snd_seq_oss_open(struct file *file, int level); -void snd_seq_oss_release(seq_oss_devinfo_t *dp); -int snd_seq_oss_ioctl(seq_oss_devinfo_t *dp, unsigned int cmd, unsigned long arg); -int snd_seq_oss_read(seq_oss_devinfo_t *dev, char __user *buf, int count); -int snd_seq_oss_write(seq_oss_devinfo_t *dp, const char __user *buf, int count, struct file *opt); -unsigned int snd_seq_oss_poll(seq_oss_devinfo_t *dp, struct file *file, poll_table * wait); +void snd_seq_oss_release(struct seq_oss_devinfo *dp); +int snd_seq_oss_ioctl(struct seq_oss_devinfo *dp, unsigned int cmd, unsigned long arg); +int snd_seq_oss_read(struct seq_oss_devinfo *dev, char __user *buf, int count); +int snd_seq_oss_write(struct seq_oss_devinfo *dp, const char __user *buf, int count, struct file *opt); +unsigned int snd_seq_oss_poll(struct seq_oss_devinfo *dp, struct file *file, poll_table * wait); -void snd_seq_oss_reset(seq_oss_devinfo_t *dp); -void snd_seq_oss_drain_write(seq_oss_devinfo_t *dp); +void snd_seq_oss_reset(struct seq_oss_devinfo *dp); +void snd_seq_oss_drain_write(struct seq_oss_devinfo *dp); /* */ -void snd_seq_oss_process_queue(seq_oss_devinfo_t *dp, abstime_t time); +void snd_seq_oss_process_queue(struct seq_oss_devinfo *dp, abstime_t time); /* proc interface */ -void snd_seq_oss_system_info_read(snd_info_buffer_t *buf); -void snd_seq_oss_midi_info_read(snd_info_buffer_t *buf); -void snd_seq_oss_synth_info_read(snd_info_buffer_t *buf); -void snd_seq_oss_readq_info_read(seq_oss_readq_t *q, snd_info_buffer_t *buf); +void snd_seq_oss_system_info_read(struct snd_info_buffer *buf); +void snd_seq_oss_midi_info_read(struct snd_info_buffer *buf); +void snd_seq_oss_synth_info_read(struct snd_info_buffer *buf); +void snd_seq_oss_readq_info_read(struct seq_oss_readq *q, struct snd_info_buffer *buf); /* file mode macros */ #define is_read_mode(mode) ((mode) & SNDRV_SEQ_OSS_FILE_READ) @@ -159,21 +146,21 @@ void snd_seq_oss_readq_info_read(seq_oss_readq_t *q, snd_info_buffer_t *buf); /* dispatch event */ static inline int -snd_seq_oss_dispatch(seq_oss_devinfo_t *dp, snd_seq_event_t *ev, int atomic, int hop) +snd_seq_oss_dispatch(struct seq_oss_devinfo *dp, struct snd_seq_event *ev, int atomic, int hop) { return snd_seq_kernel_client_dispatch(dp->cseq, ev, atomic, hop); } /* ioctl */ static inline int -snd_seq_oss_control(seq_oss_devinfo_t *dp, unsigned int type, void *arg) +snd_seq_oss_control(struct seq_oss_devinfo *dp, unsigned int type, void *arg) { return snd_seq_kernel_client_ctl(dp->cseq, type, arg); } /* fill the addresses in header */ static inline void -snd_seq_oss_fill_addr(seq_oss_devinfo_t *dp, snd_seq_event_t *ev, +snd_seq_oss_fill_addr(struct seq_oss_devinfo *dp, struct snd_seq_event *ev, int dest_client, int dest_port) { ev->queue = dp->queue; @@ -186,13 +173,4 @@ snd_seq_oss_fill_addr(seq_oss_devinfo_t *dp, snd_seq_event_t *ev, /* misc. functions for proc interface */ char *enabled_str(int bool); - -/* for debug */ -#ifdef SNDRV_SEQ_OSS_DEBUG -extern int seq_oss_debug; -#define debug_printk(x) do { if (seq_oss_debug > 0) snd_printk x; } while (0) -#else -#define debug_printk(x) /**/ -#endif - #endif /* __SEQ_OSS_DEVICE_H */ diff --git a/sound/core/seq/oss/seq_oss_event.c b/sound/core/seq/oss/seq_oss_event.c index 58e52ddd292..c3908862bc8 100644 --- a/sound/core/seq/oss/seq_oss_event.c +++ b/sound/core/seq/oss/seq_oss_event.c @@ -31,17 +31,17 @@ /* * prototypes */ -static int extended_event(seq_oss_devinfo_t *dp, evrec_t *q, snd_seq_event_t *ev); -static int chn_voice_event(seq_oss_devinfo_t *dp, evrec_t *event_rec, snd_seq_event_t *ev); -static int chn_common_event(seq_oss_devinfo_t *dp, evrec_t *event_rec, snd_seq_event_t *ev); -static int timing_event(seq_oss_devinfo_t *dp, evrec_t *event_rec, snd_seq_event_t *ev); -static int local_event(seq_oss_devinfo_t *dp, evrec_t *event_rec, snd_seq_event_t *ev); -static int old_event(seq_oss_devinfo_t *dp, evrec_t *q, snd_seq_event_t *ev); -static int note_on_event(seq_oss_devinfo_t *dp, int dev, int ch, int note, int vel, snd_seq_event_t *ev); -static int note_off_event(seq_oss_devinfo_t *dp, int dev, int ch, int note, int vel, snd_seq_event_t *ev); -static int set_note_event(seq_oss_devinfo_t *dp, int dev, int type, int ch, int note, int vel, snd_seq_event_t *ev); -static int set_control_event(seq_oss_devinfo_t *dp, int dev, int type, int ch, int param, int val, snd_seq_event_t *ev); -static int set_echo_event(seq_oss_devinfo_t *dp, evrec_t *rec, snd_seq_event_t *ev); +static int extended_event(struct seq_oss_devinfo *dp, union evrec *q, struct snd_seq_event *ev); +static int chn_voice_event(struct seq_oss_devinfo *dp, union evrec *event_rec, struct snd_seq_event *ev); +static int chn_common_event(struct seq_oss_devinfo *dp, union evrec *event_rec, struct snd_seq_event *ev); +static int timing_event(struct seq_oss_devinfo *dp, union evrec *event_rec, struct snd_seq_event *ev); +static int local_event(struct seq_oss_devinfo *dp, union evrec *event_rec, struct snd_seq_event *ev); +static int old_event(struct seq_oss_devinfo *dp, union evrec *q, struct snd_seq_event *ev); +static int note_on_event(struct seq_oss_devinfo *dp, int dev, int ch, int note, int vel, struct snd_seq_event *ev); +static int note_off_event(struct seq_oss_devinfo *dp, int dev, int ch, int note, int vel, struct snd_seq_event *ev); +static int set_note_event(struct seq_oss_devinfo *dp, int dev, int type, int ch, int note, int vel, struct snd_seq_event *ev); +static int set_control_event(struct seq_oss_devinfo *dp, int dev, int type, int ch, int param, int val, struct snd_seq_event *ev); +static int set_echo_event(struct seq_oss_devinfo *dp, union evrec *rec, struct snd_seq_event *ev); /* @@ -51,7 +51,7 @@ static int set_echo_event(seq_oss_devinfo_t *dp, evrec_t *rec, snd_seq_event_t * */ int -snd_seq_oss_process_event(seq_oss_devinfo_t *dp, evrec_t *q, snd_seq_event_t *ev) +snd_seq_oss_process_event(struct seq_oss_devinfo *dp, union evrec *q, struct snd_seq_event *ev) { switch (q->s.code) { case SEQ_EXTENDED: @@ -104,7 +104,7 @@ snd_seq_oss_process_event(seq_oss_devinfo_t *dp, evrec_t *q, snd_seq_event_t *ev /* old type events: mode1 only */ static int -old_event(seq_oss_devinfo_t *dp, evrec_t *q, snd_seq_event_t *ev) +old_event(struct seq_oss_devinfo *dp, union evrec *q, struct snd_seq_event *ev) { switch (q->s.code) { case SEQ_NOTEOFF: @@ -130,7 +130,7 @@ old_event(seq_oss_devinfo_t *dp, evrec_t *q, snd_seq_event_t *ev) /* 8bytes extended event: mode1 only */ static int -extended_event(seq_oss_devinfo_t *dp, evrec_t *q, snd_seq_event_t *ev) +extended_event(struct seq_oss_devinfo *dp, union evrec *q, struct snd_seq_event *ev) { int val; @@ -184,7 +184,7 @@ extended_event(seq_oss_devinfo_t *dp, evrec_t *q, snd_seq_event_t *ev) /* channel voice events: mode1 and 2 */ static int -chn_voice_event(seq_oss_devinfo_t *dp, evrec_t *q, snd_seq_event_t *ev) +chn_voice_event(struct seq_oss_devinfo *dp, union evrec *q, struct snd_seq_event *ev) { if (q->v.chn >= 32) return -EINVAL; @@ -205,7 +205,7 @@ chn_voice_event(seq_oss_devinfo_t *dp, evrec_t *q, snd_seq_event_t *ev) /* channel common events: mode1 and 2 */ static int -chn_common_event(seq_oss_devinfo_t *dp, evrec_t *q, snd_seq_event_t *ev) +chn_common_event(struct seq_oss_devinfo *dp, union evrec *q, struct snd_seq_event *ev) { if (q->l.chn >= 32) return -EINVAL; @@ -232,14 +232,14 @@ chn_common_event(seq_oss_devinfo_t *dp, evrec_t *q, snd_seq_event_t *ev) /* timer events: mode1 and mode2 */ static int -timing_event(seq_oss_devinfo_t *dp, evrec_t *q, snd_seq_event_t *ev) +timing_event(struct seq_oss_devinfo *dp, union evrec *q, struct snd_seq_event *ev) { switch (q->t.cmd) { case TMR_ECHO: if (dp->seq_mode == SNDRV_SEQ_OSS_MODE_MUSIC) return set_echo_event(dp, q, ev); else { - evrec_t tmp; + union evrec tmp; memset(&tmp, 0, sizeof(tmp)); /* XXX: only for little-endian! */ tmp.echo = (q->t.time << 8) | SEQ_ECHO; @@ -267,7 +267,7 @@ timing_event(seq_oss_devinfo_t *dp, evrec_t *q, snd_seq_event_t *ev) /* local events: mode1 and 2 */ static int -local_event(seq_oss_devinfo_t *dp, evrec_t *q, snd_seq_event_t *ev) +local_event(struct seq_oss_devinfo *dp, union evrec *q, struct snd_seq_event *ev) { return -EINVAL; } @@ -283,9 +283,14 @@ local_event(seq_oss_devinfo_t *dp, evrec_t *q, snd_seq_event_t *ev) * Use key-pressure if note >= 128 */ static int -note_on_event(seq_oss_devinfo_t *dp, int dev, int ch, int note, int vel, snd_seq_event_t *ev) +note_on_event(struct seq_oss_devinfo *dp, int dev, int ch, int note, int vel, struct snd_seq_event *ev) { - seq_oss_synthinfo_t *info = &dp->synths[dev]; + struct seq_oss_synthinfo *info; + + if (!snd_seq_oss_synth_is_valid(dp, dev)) + return -ENXIO; + + info = &dp->synths[dev]; switch (info->arg.event_passing) { case SNDRV_SEQ_OSS_PROCESS_EVENTS: if (! info->ch || ch < 0 || ch >= info->nr_voices) { @@ -338,9 +343,14 @@ note_on_event(seq_oss_devinfo_t *dp, int dev, int ch, int note, int vel, snd_seq * process note-off event for OSS synth */ static int -note_off_event(seq_oss_devinfo_t *dp, int dev, int ch, int note, int vel, snd_seq_event_t *ev) +note_off_event(struct seq_oss_devinfo *dp, int dev, int ch, int note, int vel, struct snd_seq_event *ev) { - seq_oss_synthinfo_t *info = &dp->synths[dev]; + struct seq_oss_synthinfo *info; + + if (!snd_seq_oss_synth_is_valid(dp, dev)) + return -ENXIO; + + info = &dp->synths[dev]; switch (info->arg.event_passing) { case SNDRV_SEQ_OSS_PROCESS_EVENTS: if (! info->ch || ch < 0 || ch >= info->nr_voices) { @@ -369,7 +379,7 @@ note_off_event(seq_oss_devinfo_t *dp, int dev, int ch, int note, int vel, snd_se * create a note event */ static int -set_note_event(seq_oss_devinfo_t *dp, int dev, int type, int ch, int note, int vel, snd_seq_event_t *ev) +set_note_event(struct seq_oss_devinfo *dp, int dev, int type, int ch, int note, int vel, struct snd_seq_event *ev) { if (! snd_seq_oss_synth_is_valid(dp, dev)) return -ENXIO; @@ -387,7 +397,7 @@ set_note_event(seq_oss_devinfo_t *dp, int dev, int type, int ch, int note, int v * create a control event */ static int -set_control_event(seq_oss_devinfo_t *dp, int dev, int type, int ch, int param, int val, snd_seq_event_t *ev) +set_control_event(struct seq_oss_devinfo *dp, int dev, int type, int ch, int param, int val, struct snd_seq_event *ev) { if (! snd_seq_oss_synth_is_valid(dp, dev)) return -ENXIO; @@ -405,7 +415,7 @@ set_control_event(seq_oss_devinfo_t *dp, int dev, int type, int ch, int param, i * create an echo event */ static int -set_echo_event(seq_oss_devinfo_t *dp, evrec_t *rec, snd_seq_event_t *ev) +set_echo_event(struct seq_oss_devinfo *dp, union evrec *rec, struct snd_seq_event *ev) { ev->type = SNDRV_SEQ_EVENT_ECHO; /* echo back to itself */ @@ -419,11 +429,11 @@ set_echo_event(seq_oss_devinfo_t *dp, evrec_t *rec, snd_seq_event_t *ev) * the echo event is processed here. */ int -snd_seq_oss_event_input(snd_seq_event_t *ev, int direct, void *private_data, +snd_seq_oss_event_input(struct snd_seq_event *ev, int direct, void *private_data, int atomic, int hop) { - seq_oss_devinfo_t *dp = (seq_oss_devinfo_t *)private_data; - evrec_t *rec; + struct seq_oss_devinfo *dp = (struct seq_oss_devinfo *)private_data; + union evrec *rec; if (ev->type != SNDRV_SEQ_EVENT_ECHO) return snd_seq_oss_midi_input(ev, direct, private_data); @@ -431,7 +441,7 @@ snd_seq_oss_event_input(snd_seq_event_t *ev, int direct, void *private_data, if (ev->source.client != dp->cseq) return 0; /* ignored */ - rec = (evrec_t*)&ev->data; + rec = (union evrec*)&ev->data; if (rec->s.code == SEQ_SYNCTIMER) { /* sync echo back */ snd_seq_oss_writeq_wakeup(dp->writeq, rec->t.time); diff --git a/sound/core/seq/oss/seq_oss_event.h b/sound/core/seq/oss/seq_oss_event.h index bf1d4d3f53c..9a4d9adb7b8 100644 --- a/sound/core/seq/oss/seq_oss_event.h +++ b/sound/core/seq/oss/seq_oss_event.h @@ -29,74 +29,74 @@ #define LONG_EVENT_SIZE 8 /* short event (4bytes) */ -typedef struct evrec_short_t { +struct evrec_short { unsigned char code; unsigned char parm1; unsigned char dev; unsigned char parm2; -} evrec_short_t; +}; /* short note events (4bytes) */ -typedef struct evrec_note_t { +struct evrec_note { unsigned char code; unsigned char chn; unsigned char note; unsigned char vel; -} evrec_note_t; +}; /* long timer events (8bytes) */ -typedef struct evrec_timer_t { +struct evrec_timer { unsigned char code; unsigned char cmd; unsigned char dummy1, dummy2; unsigned int time; -} evrec_timer_t; +}; /* long extended events (8bytes) */ -typedef struct evrec_extended_t { +struct evrec_extended { unsigned char code; unsigned char cmd; unsigned char dev; unsigned char chn; unsigned char p1, p2, p3, p4; -} evrec_extended_t; +}; /* long channel events (8bytes) */ -typedef struct evrec_long_t { +struct evrec_long { unsigned char code; unsigned char dev; unsigned char cmd; unsigned char chn; unsigned char p1, p2; unsigned short val; -} evrec_long_t; +}; /* channel voice events (8bytes) */ -typedef struct evrec_voice_t { +struct evrec_voice { unsigned char code; unsigned char dev; unsigned char cmd; unsigned char chn; unsigned char note, parm; unsigned short dummy; -} evrec_voice_t; +}; /* sysex events (8bytes) */ -typedef struct evrec_sysex_t { +struct evrec_sysex { unsigned char code; unsigned char dev; unsigned char buf[6]; -} evrec_sysex_t; +}; /* event record */ -union evrec_t { - evrec_short_t s; - evrec_note_t n; - evrec_long_t l; - evrec_voice_t v; - evrec_timer_t t; - evrec_extended_t e; - evrec_sysex_t x; +union evrec { + struct evrec_short s; + struct evrec_note n; + struct evrec_long l; + struct evrec_voice v; + struct evrec_timer t; + struct evrec_extended e; + struct evrec_sysex x; unsigned int echo; unsigned char c[LONG_EVENT_SIZE]; }; @@ -104,9 +104,9 @@ union evrec_t { #define ev_is_long(ev) ((ev)->s.code >= 128) #define ev_length(ev) ((ev)->s.code >= 128 ? LONG_EVENT_SIZE : SHORT_EVENT_SIZE) -int snd_seq_oss_process_event(seq_oss_devinfo_t *dp, evrec_t *q, snd_seq_event_t *ev); -int snd_seq_oss_process_timer_event(seq_oss_timer_t *rec, evrec_t *q); -int snd_seq_oss_event_input(snd_seq_event_t *ev, int direct, void *private_data, int atomic, int hop); +int snd_seq_oss_process_event(struct seq_oss_devinfo *dp, union evrec *q, struct snd_seq_event *ev); +int snd_seq_oss_process_timer_event(struct seq_oss_timer *rec, union evrec *q); +int snd_seq_oss_event_input(struct snd_seq_event *ev, int direct, void *private_data, int atomic, int hop); #endif /* __SEQ_OSS_EVENT_H */ diff --git a/sound/core/seq/oss/seq_oss_init.c b/sound/core/seq/oss/seq_oss_init.c index 1ab1cf8158c..b9184d20c39 100644 --- a/sound/core/seq/oss/seq_oss_init.c +++ b/sound/core/seq/oss/seq_oss_init.c @@ -28,7 +28,10 @@ #include "seq_oss_timer.h" #include "seq_oss_event.h" #include <linux/init.h> +#include <linux/export.h> #include <linux/moduleparam.h> +#include <linux/slab.h> +#include <linux/workqueue.h> /* * common variables @@ -41,23 +44,31 @@ static int system_client = -1; /* ALSA sequencer client number */ static int system_port = -1; static int num_clients; -static seq_oss_devinfo_t *client_table[SNDRV_SEQ_OSS_MAX_CLIENTS]; +static struct seq_oss_devinfo *client_table[SNDRV_SEQ_OSS_MAX_CLIENTS]; /* * prototypes */ -static int receive_announce(snd_seq_event_t *ev, int direct, void *private, int atomic, int hop); +static int receive_announce(struct snd_seq_event *ev, int direct, void *private, int atomic, int hop); static int translate_mode(struct file *file); -static int create_port(seq_oss_devinfo_t *dp); -static int delete_port(seq_oss_devinfo_t *dp); -static int alloc_seq_queue(seq_oss_devinfo_t *dp); +static int create_port(struct seq_oss_devinfo *dp); +static int delete_port(struct seq_oss_devinfo *dp); +static int alloc_seq_queue(struct seq_oss_devinfo *dp); static int delete_seq_queue(int queue); static void free_devinfo(void *private); #define call_ctl(type,rec) snd_seq_kernel_client_ctl(system_client, type, rec) +/* call snd_seq_oss_midi_lookup_ports() asynchronously */ +static void async_call_lookup_ports(struct work_struct *work) +{ + snd_seq_oss_midi_lookup_ports(system_client); +} + +static DECLARE_WORK(async_lookup_work, async_call_lookup_ports); + /* * create sequencer client for OSS sequencer */ @@ -65,42 +76,22 @@ int __init snd_seq_oss_create_client(void) { int rc; - snd_seq_client_callback_t callback; - snd_seq_client_info_t *info; - snd_seq_port_info_t *port; - snd_seq_port_callback_t port_callback; + struct snd_seq_port_info *port; + struct snd_seq_port_callback port_callback; - info = kmalloc(sizeof(*info), GFP_KERNEL); port = kmalloc(sizeof(*port), GFP_KERNEL); - if (!info || !port) { + if (!port) { rc = -ENOMEM; goto __error; } /* create ALSA client */ - memset(&callback, 0, sizeof(callback)); - - callback.private_data = NULL; - callback.allow_input = 1; - callback.allow_output = 1; - - rc = snd_seq_create_kernel_client(NULL, SNDRV_SEQ_CLIENT_OSS, &callback); + rc = snd_seq_create_kernel_client(NULL, SNDRV_SEQ_CLIENT_OSS, + "OSS sequencer"); if (rc < 0) goto __error; system_client = rc; - debug_printk(("new client = %d\n", rc)); - - /* set client information */ - memset(info, 0, sizeof(*info)); - info->client = system_client; - info->type = KERNEL_CLIENT; - strcpy(info->name, "OSS sequencer"); - - rc = call_ctl(SNDRV_SEQ_IOCTL_SET_CLIENT_INFO, info); - - /* look up midi devices */ - snd_seq_oss_midi_lookup_ports(system_client); /* create annoucement receiver port */ memset(port, 0, sizeof(*port)); @@ -118,7 +109,7 @@ snd_seq_oss_create_client(void) call_ctl(SNDRV_SEQ_IOCTL_CREATE_PORT, port); if ((system_port = port->addr.port) >= 0) { - snd_seq_port_subscribe_t subs; + struct snd_seq_port_subscribe subs; memset(&subs, 0, sizeof(subs)); subs.sender.client = SNDRV_SEQ_CLIENT_SYSTEM; @@ -129,9 +120,11 @@ snd_seq_oss_create_client(void) } rc = 0; + /* look up midi devices */ + schedule_work(&async_lookup_work); + __error: kfree(port); - kfree(info); return rc; } @@ -140,9 +133,9 @@ snd_seq_oss_create_client(void) * receive annoucement from system port, and check the midi device */ static int -receive_announce(snd_seq_event_t *ev, int direct, void *private, int atomic, int hop) +receive_announce(struct snd_seq_event *ev, int direct, void *private, int atomic, int hop) { - snd_seq_port_info_t pinfo; + struct snd_seq_port_info pinfo; if (atomic) return 0; /* it must not happen */ @@ -175,6 +168,7 @@ receive_announce(snd_seq_event_t *ev, int direct, void *private, int atomic, int int snd_seq_oss_delete_client(void) { + cancel_work_sync(&async_lookup_work); if (system_client >= 0) snd_seq_delete_kernel_client(system_client); @@ -191,51 +185,50 @@ int snd_seq_oss_open(struct file *file, int level) { int i, rc; - seq_oss_devinfo_t *dp; + struct seq_oss_devinfo *dp; - if ((dp = kzalloc(sizeof(*dp), GFP_KERNEL)) == NULL) { - snd_printk(KERN_ERR "can't malloc device info\n"); + dp = kzalloc(sizeof(*dp), GFP_KERNEL); + if (!dp) { + pr_err("ALSA: seq_oss: can't malloc device info\n"); return -ENOMEM; } - debug_printk(("oss_open: dp = %p\n", dp)); + + dp->cseq = system_client; + dp->port = -1; + dp->queue = -1; for (i = 0; i < SNDRV_SEQ_OSS_MAX_CLIENTS; i++) { if (client_table[i] == NULL) break; } - if (i >= SNDRV_SEQ_OSS_MAX_CLIENTS) { - snd_printk(KERN_ERR "too many applications\n"); - kfree(dp); - return -ENOMEM; - } dp->index = i; - dp->cseq = system_client; - dp->port = -1; - dp->queue = -1; - dp->readq = NULL; - dp->writeq = NULL; + if (i >= SNDRV_SEQ_OSS_MAX_CLIENTS) { + pr_err("ALSA: seq_oss: too many applications\n"); + rc = -ENOMEM; + goto _error; + } /* look up synth and midi devices */ snd_seq_oss_synth_setup(dp); snd_seq_oss_midi_setup(dp); if (dp->synth_opened == 0 && dp->max_mididev == 0) { - /* snd_printk(KERN_ERR "no device found\n"); */ + /* pr_err("ALSA: seq_oss: no device found\n"); */ rc = -ENODEV; goto _error; } /* create port */ - debug_printk(("create new port\n")); - if ((rc = create_port(dp)) < 0) { - snd_printk(KERN_ERR "can't create port\n"); + rc = create_port(dp); + if (rc < 0) { + pr_err("ALSA: seq_oss: can't create port\n"); goto _error; } /* allocate queue */ - debug_printk(("allocate queue\n")); - if ((rc = alloc_seq_queue(dp)) < 0) + rc = alloc_seq_queue(dp); + if (rc < 0) goto _error; /* set address */ @@ -250,32 +243,30 @@ snd_seq_oss_open(struct file *file, int level) dp->file_mode = translate_mode(file); /* initialize read queue */ - debug_printk(("initialize read queue\n")); if (is_read_mode(dp->file_mode)) { - if ((dp->readq = snd_seq_oss_readq_new(dp, maxqlen)) == NULL) { + dp->readq = snd_seq_oss_readq_new(dp, maxqlen); + if (!dp->readq) { rc = -ENOMEM; goto _error; } } /* initialize write queue */ - debug_printk(("initialize write queue\n")); if (is_write_mode(dp->file_mode)) { dp->writeq = snd_seq_oss_writeq_new(dp, maxqlen); - if (dp->writeq == NULL) { + if (!dp->writeq) { rc = -ENOMEM; goto _error; } } /* initialize timer */ - debug_printk(("initialize timer\n")); - if ((dp->timer = snd_seq_oss_timer_new(dp)) == NULL) { - snd_printk(KERN_ERR "can't alloc timer\n"); + dp->timer = snd_seq_oss_timer_new(dp); + if (!dp->timer) { + pr_err("ALSA: seq_oss: can't alloc timer\n"); rc = -ENOMEM; goto _error; } - debug_printk(("timer initialized\n")); /* set private data pointer */ file->private_data = dp; @@ -289,15 +280,13 @@ snd_seq_oss_open(struct file *file, int level) client_table[dp->index] = dp; num_clients++; - debug_printk(("open done\n")); return 0; _error: snd_seq_oss_synth_cleanup(dp); snd_seq_oss_midi_cleanup(dp); - i = dp->queue; + delete_seq_queue(dp->queue); delete_port(dp); - delete_seq_queue(i); return rc; } @@ -323,11 +312,11 @@ translate_mode(struct file *file) * create sequencer port */ static int -create_port(seq_oss_devinfo_t *dp) +create_port(struct seq_oss_devinfo *dp) { int rc; - snd_seq_port_info_t port; - snd_seq_port_callback_t callback; + struct snd_seq_port_info port; + struct snd_seq_port_callback callback; memset(&port, 0, sizeof(port)); port.addr.client = dp->cseq; @@ -349,7 +338,6 @@ create_port(seq_oss_devinfo_t *dp) return rc; dp->port = port.addr.port; - debug_printk(("new port = %d\n", port.addr.port)); return 0; } @@ -358,12 +346,13 @@ create_port(seq_oss_devinfo_t *dp) * delete ALSA port */ static int -delete_port(seq_oss_devinfo_t *dp) +delete_port(struct seq_oss_devinfo *dp) { - if (dp->port < 0) + if (dp->port < 0) { + kfree(dp); return 0; + } - debug_printk(("delete_port %i\n", dp->port)); return snd_seq_event_port_detach(dp->cseq, dp->port); } @@ -371,9 +360,9 @@ delete_port(seq_oss_devinfo_t *dp) * allocate a queue */ static int -alloc_seq_queue(seq_oss_devinfo_t *dp) +alloc_seq_queue(struct seq_oss_devinfo *dp) { - snd_seq_queue_info_t qinfo; + struct snd_seq_queue_info qinfo; int rc; memset(&qinfo, 0, sizeof(qinfo)); @@ -392,7 +381,7 @@ alloc_seq_queue(seq_oss_devinfo_t *dp) static int delete_seq_queue(int queue) { - snd_seq_queue_info_t qinfo; + struct snd_seq_queue_info qinfo; int rc; if (queue < 0) @@ -401,7 +390,7 @@ delete_seq_queue(int queue) qinfo.queue = queue; rc = call_ctl(SNDRV_SEQ_IOCTL_DELETE_QUEUE, &qinfo); if (rc < 0) - printk(KERN_ERR "seq-oss: unable to delete queue %d (%d)\n", queue, rc); + pr_err("ALSA: seq_oss: unable to delete queue %d (%d)\n", queue, rc); return rc; } @@ -412,7 +401,7 @@ delete_seq_queue(int queue) static void free_devinfo(void *private) { - seq_oss_devinfo_t *dp = (seq_oss_devinfo_t *)private; + struct seq_oss_devinfo *dp = (struct seq_oss_devinfo *)private; if (dp->timer) snd_seq_oss_timer_delete(dp->timer); @@ -431,28 +420,23 @@ free_devinfo(void *private) * close sequencer device */ void -snd_seq_oss_release(seq_oss_devinfo_t *dp) +snd_seq_oss_release(struct seq_oss_devinfo *dp) { int queue; client_table[dp->index] = NULL; num_clients--; - debug_printk(("resetting..\n")); snd_seq_oss_reset(dp); - debug_printk(("cleaning up..\n")); snd_seq_oss_synth_cleanup(dp); snd_seq_oss_midi_cleanup(dp); /* clear slot */ - debug_printk(("releasing resource..\n")); queue = dp->queue; if (dp->port >= 0) delete_port(dp); delete_seq_queue(queue); - - debug_printk(("release done\n")); } @@ -460,13 +444,12 @@ snd_seq_oss_release(seq_oss_devinfo_t *dp) * Wait until the queue is empty (if we don't have nonblock) */ void -snd_seq_oss_drain_write(seq_oss_devinfo_t *dp) +snd_seq_oss_drain_write(struct seq_oss_devinfo *dp) { if (! dp->timer->running) return; if (is_write_mode(dp->file_mode) && !is_nonblock_mode(dp->file_mode) && dp->writeq) { - debug_printk(("syncing..\n")); while (snd_seq_oss_writeq_sync(dp->writeq)) ; } @@ -477,7 +460,7 @@ snd_seq_oss_drain_write(seq_oss_devinfo_t *dp) * reset sequencer devices */ void -snd_seq_oss_reset(seq_oss_devinfo_t *dp) +snd_seq_oss_reset(struct seq_oss_devinfo *dp) { int i; @@ -502,6 +485,7 @@ snd_seq_oss_reset(seq_oss_devinfo_t *dp) } +#ifdef CONFIG_PROC_FS /* * misc. functions for proc interface */ @@ -525,10 +509,10 @@ filemode_str(int val) * proc interface */ void -snd_seq_oss_system_info_read(snd_info_buffer_t *buf) +snd_seq_oss_system_info_read(struct snd_info_buffer *buf) { int i; - seq_oss_devinfo_t *dp; + struct seq_oss_devinfo *dp; snd_iprintf(buf, "ALSA client number %d\n", system_client); snd_iprintf(buf, "ALSA receiver port %d\n", system_port); @@ -552,4 +536,4 @@ snd_seq_oss_system_info_read(snd_info_buffer_t *buf) snd_seq_oss_readq_info_read(dp->readq, buf); } } - +#endif /* CONFIG_PROC_FS */ diff --git a/sound/core/seq/oss/seq_oss_ioctl.c b/sound/core/seq/oss/seq_oss_ioctl.c index e86f18d00f3..5b8520177b0 100644 --- a/sound/core/seq/oss/seq_oss_ioctl.c +++ b/sound/core/seq/oss/seq_oss_ioctl.c @@ -28,7 +28,7 @@ #include "seq_oss_midi.h" #include "seq_oss_event.h" -static int snd_seq_oss_synth_info_user(seq_oss_devinfo_t *dp, void __user *arg) +static int snd_seq_oss_synth_info_user(struct seq_oss_devinfo *dp, void __user *arg) { struct synth_info info; @@ -41,7 +41,7 @@ static int snd_seq_oss_synth_info_user(seq_oss_devinfo_t *dp, void __user *arg) return 0; } -static int snd_seq_oss_midi_info_user(seq_oss_devinfo_t *dp, void __user *arg) +static int snd_seq_oss_midi_info_user(struct seq_oss_devinfo *dp, void __user *arg) { struct midi_info info; @@ -54,24 +54,24 @@ static int snd_seq_oss_midi_info_user(seq_oss_devinfo_t *dp, void __user *arg) return 0; } -static int snd_seq_oss_oob_user(seq_oss_devinfo_t *dp, void __user *arg) +static int snd_seq_oss_oob_user(struct seq_oss_devinfo *dp, void __user *arg) { unsigned char ev[8]; - snd_seq_event_t tmpev; + struct snd_seq_event tmpev; if (copy_from_user(ev, arg, 8)) return -EFAULT; memset(&tmpev, 0, sizeof(tmpev)); snd_seq_oss_fill_addr(dp, &tmpev, dp->addr.port, dp->addr.client); tmpev.time.tick = 0; - if (! snd_seq_oss_process_event(dp, (evrec_t*)ev, &tmpev)) { + if (! snd_seq_oss_process_event(dp, (union evrec *)ev, &tmpev)) { snd_seq_oss_dispatch(dp, &tmpev, 0, 0); } return 0; } int -snd_seq_oss_ioctl(seq_oss_devinfo_t *dp, unsigned int cmd, unsigned long carg) +snd_seq_oss_ioctl(struct seq_oss_devinfo *dp, unsigned int cmd, unsigned long carg) { int dev, val; void __user *arg = (void __user *)carg; @@ -90,12 +90,10 @@ snd_seq_oss_ioctl(seq_oss_devinfo_t *dp, unsigned int cmd, unsigned long carg) return snd_seq_oss_timer_ioctl(dp->timer, cmd, arg); case SNDCTL_SEQ_PANIC: - debug_printk(("panic\n")); snd_seq_oss_reset(dp); return -EINVAL; case SNDCTL_SEQ_SYNC: - debug_printk(("sync\n")); if (! is_write_mode(dp->file_mode) || dp->writeq == NULL) return 0; while (snd_seq_oss_writeq_sync(dp->writeq)) @@ -105,55 +103,45 @@ snd_seq_oss_ioctl(seq_oss_devinfo_t *dp, unsigned int cmd, unsigned long carg) return 0; case SNDCTL_SEQ_RESET: - debug_printk(("reset\n")); snd_seq_oss_reset(dp); return 0; case SNDCTL_SEQ_TESTMIDI: - debug_printk(("test midi\n")); if (get_user(dev, p)) return -EFAULT; return snd_seq_oss_midi_open(dp, dev, dp->file_mode); case SNDCTL_SEQ_GETINCOUNT: - debug_printk(("get in count\n")); if (dp->readq == NULL || ! is_read_mode(dp->file_mode)) return 0; return put_user(dp->readq->qlen, p) ? -EFAULT : 0; case SNDCTL_SEQ_GETOUTCOUNT: - debug_printk(("get out count\n")); if (! is_write_mode(dp->file_mode) || dp->writeq == NULL) return 0; return put_user(snd_seq_oss_writeq_get_free_size(dp->writeq), p) ? -EFAULT : 0; case SNDCTL_SEQ_GETTIME: - debug_printk(("get time\n")); return put_user(snd_seq_oss_timer_cur_tick(dp->timer), p) ? -EFAULT : 0; case SNDCTL_SEQ_RESETSAMPLES: - debug_printk(("reset samples\n")); if (get_user(dev, p)) return -EFAULT; return snd_seq_oss_synth_ioctl(dp, dev, cmd, carg); case SNDCTL_SEQ_NRSYNTHS: - debug_printk(("nr synths\n")); return put_user(dp->max_synthdev, p) ? -EFAULT : 0; case SNDCTL_SEQ_NRMIDIS: - debug_printk(("nr midis\n")); return put_user(dp->max_mididev, p) ? -EFAULT : 0; case SNDCTL_SYNTH_MEMAVL: - debug_printk(("mem avail\n")); if (get_user(dev, p)) return -EFAULT; val = snd_seq_oss_synth_ioctl(dp, dev, cmd, carg); return put_user(val, p) ? -EFAULT : 0; case SNDCTL_FM_4OP_ENABLE: - debug_printk(("4op\n")); if (get_user(dev, p)) return -EFAULT; snd_seq_oss_synth_ioctl(dp, dev, cmd, carg); @@ -161,19 +149,15 @@ snd_seq_oss_ioctl(seq_oss_devinfo_t *dp, unsigned int cmd, unsigned long carg) case SNDCTL_SYNTH_INFO: case SNDCTL_SYNTH_ID: - debug_printk(("synth info\n")); return snd_seq_oss_synth_info_user(dp, arg); case SNDCTL_SEQ_OUTOFBAND: - debug_printk(("out of band\n")); return snd_seq_oss_oob_user(dp, arg); case SNDCTL_MIDI_INFO: - debug_printk(("midi info\n")); return snd_seq_oss_midi_info_user(dp, arg); case SNDCTL_SEQ_THRESHOLD: - debug_printk(("threshold\n")); if (! is_write_mode(dp->file_mode)) return 0; if (get_user(val, p)) @@ -186,7 +170,6 @@ snd_seq_oss_ioctl(seq_oss_devinfo_t *dp, unsigned int cmd, unsigned long carg) return 0; case SNDCTL_MIDI_PRETIME: - debug_printk(("pretime\n")); if (dp->readq == NULL || !is_read_mode(dp->file_mode)) return 0; if (get_user(val, p)) @@ -199,7 +182,6 @@ snd_seq_oss_ioctl(seq_oss_devinfo_t *dp, unsigned int cmd, unsigned long carg) return put_user(val, p) ? -EFAULT : 0; default: - debug_printk(("others\n")); if (! is_write_mode(dp->file_mode)) return -EIO; return snd_seq_oss_synth_ioctl(dp, 0, cmd, carg); diff --git a/sound/core/seq/oss/seq_oss_midi.c b/sound/core/seq/oss/seq_oss_midi.c index f0e95c8f2ee..3a4569669ef 100644 --- a/sound/core/seq/oss/seq_oss_midi.c +++ b/sound/core/seq/oss/seq_oss_midi.c @@ -20,6 +20,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include <sound/asoundef.h> #include "seq_oss_midi.h" #include "seq_oss_readq.h" #include "seq_oss_timer.h" @@ -27,6 +28,7 @@ #include <sound/seq_midi_event.h> #include "../seq_lock.h" #include <linux/init.h> +#include <linux/slab.h> /* @@ -37,15 +39,15 @@ /* * definition of midi device record */ -struct seq_oss_midi_t { +struct seq_oss_midi { int seq_device; /* device number */ int client; /* sequencer client number */ int port; /* sequencer port number */ unsigned int flags; /* port capability */ int opened; /* flag for opening */ unsigned char name[SNDRV_SEQ_OSS_MAX_MIDI_NAME]; - snd_midi_event_t *coder; /* MIDI event coder */ - seq_oss_devinfo_t *devinfo; /* assigned OSSseq device */ + struct snd_midi_event *coder; /* MIDI event coder */ + struct seq_oss_devinfo *devinfo; /* assigned OSSseq device */ snd_use_lock_t use_lock; }; @@ -54,27 +56,27 @@ struct seq_oss_midi_t { * midi device table */ static int max_midi_devs; -static seq_oss_midi_t *midi_devs[SNDRV_SEQ_OSS_MAX_MIDI_DEVS]; +static struct seq_oss_midi *midi_devs[SNDRV_SEQ_OSS_MAX_MIDI_DEVS]; static DEFINE_SPINLOCK(register_lock); /* * prototypes */ -static seq_oss_midi_t *get_mdev(int dev); -static seq_oss_midi_t *get_mididev(seq_oss_devinfo_t *dp, int dev); -static int send_synth_event(seq_oss_devinfo_t *dp, snd_seq_event_t *ev, int dev); -static int send_midi_event(seq_oss_devinfo_t *dp, snd_seq_event_t *ev, seq_oss_midi_t *mdev); +static struct seq_oss_midi *get_mdev(int dev); +static struct seq_oss_midi *get_mididev(struct seq_oss_devinfo *dp, int dev); +static int send_synth_event(struct seq_oss_devinfo *dp, struct snd_seq_event *ev, int dev); +static int send_midi_event(struct seq_oss_devinfo *dp, struct snd_seq_event *ev, struct seq_oss_midi *mdev); /* * look up the existing ports * this looks a very exhausting job. */ -int __init +int snd_seq_oss_midi_lookup_ports(int client) { - snd_seq_client_info_t *clinfo; - snd_seq_port_info_t *pinfo; + struct snd_seq_client_info *clinfo; + struct snd_seq_port_info *pinfo; clinfo = kzalloc(sizeof(*clinfo), GFP_KERNEL); pinfo = kzalloc(sizeof(*pinfo), GFP_KERNEL); @@ -100,10 +102,10 @@ snd_seq_oss_midi_lookup_ports(int client) /* */ -static seq_oss_midi_t * +static struct seq_oss_midi * get_mdev(int dev) { - seq_oss_midi_t *mdev; + struct seq_oss_midi *mdev; unsigned long flags; spin_lock_irqsave(®ister_lock, flags); @@ -117,11 +119,11 @@ get_mdev(int dev) /* * look for the identical slot */ -static seq_oss_midi_t * +static struct seq_oss_midi * find_slot(int client, int port) { int i; - seq_oss_midi_t *mdev; + struct seq_oss_midi *mdev; unsigned long flags; spin_lock_irqsave(®ister_lock, flags); @@ -145,13 +147,12 @@ find_slot(int client, int port) * register a new port if it doesn't exist yet */ int -snd_seq_oss_midi_check_new_port(snd_seq_port_info_t *pinfo) +snd_seq_oss_midi_check_new_port(struct snd_seq_port_info *pinfo) { int i; - seq_oss_midi_t *mdev; + struct seq_oss_midi *mdev; unsigned long flags; - debug_printk(("check for MIDI client %d port %d\n", pinfo->addr.client, pinfo->addr.port)); /* the port must include generic midi */ if (! (pinfo->type & SNDRV_SEQ_PORT_TYPE_MIDI_GENERIC)) return 0; @@ -173,7 +174,7 @@ snd_seq_oss_midi_check_new_port(snd_seq_port_info_t *pinfo) * allocate midi info record */ if ((mdev = kzalloc(sizeof(*mdev), GFP_KERNEL)) == NULL) { - snd_printk(KERN_ERR "can't malloc midi info\n"); + pr_err("ALSA: seq_oss: can't malloc midi info\n"); return -ENOMEM; } @@ -189,7 +190,7 @@ snd_seq_oss_midi_check_new_port(snd_seq_port_info_t *pinfo) /* create MIDI coder */ if (snd_midi_event_new(MAX_MIDI_EVENT_BUF, &mdev->coder) < 0) { - snd_printk(KERN_ERR "can't malloc midi coder\n"); + pr_err("ALSA: seq_oss: can't malloc midi coder\n"); kfree(mdev); return -ENOMEM; } @@ -226,7 +227,7 @@ snd_seq_oss_midi_check_new_port(snd_seq_port_info_t *pinfo) int snd_seq_oss_midi_check_exit_port(int client, int port) { - seq_oss_midi_t *mdev; + struct seq_oss_midi *mdev; unsigned long flags; int index; @@ -258,7 +259,7 @@ void snd_seq_oss_midi_clear_all(void) { int i; - seq_oss_midi_t *mdev; + struct seq_oss_midi *mdev; unsigned long flags; spin_lock_irqsave(®ister_lock, flags); @@ -279,7 +280,7 @@ snd_seq_oss_midi_clear_all(void) * set up midi tables */ void -snd_seq_oss_midi_setup(seq_oss_devinfo_t *dp) +snd_seq_oss_midi_setup(struct seq_oss_devinfo *dp) { dp->max_mididev = max_midi_devs; } @@ -288,7 +289,7 @@ snd_seq_oss_midi_setup(seq_oss_devinfo_t *dp) * clean up midi tables */ void -snd_seq_oss_midi_cleanup(seq_oss_devinfo_t *dp) +snd_seq_oss_midi_cleanup(struct seq_oss_devinfo *dp) { int i; for (i = 0; i < dp->max_mididev; i++) @@ -301,7 +302,7 @@ snd_seq_oss_midi_cleanup(seq_oss_devinfo_t *dp) * open all midi devices. ignore errors. */ void -snd_seq_oss_midi_open_all(seq_oss_devinfo_t *dp, int file_mode) +snd_seq_oss_midi_open_all(struct seq_oss_devinfo *dp, int file_mode) { int i; for (i = 0; i < dp->max_mididev; i++) @@ -312,8 +313,8 @@ snd_seq_oss_midi_open_all(seq_oss_devinfo_t *dp, int file_mode) /* * get the midi device information */ -static seq_oss_midi_t * -get_mididev(seq_oss_devinfo_t *dp, int dev) +static struct seq_oss_midi * +get_mididev(struct seq_oss_devinfo *dp, int dev) { if (dev < 0 || dev >= dp->max_mididev) return NULL; @@ -325,11 +326,11 @@ get_mididev(seq_oss_devinfo_t *dp, int dev) * open the midi device if not opened yet */ int -snd_seq_oss_midi_open(seq_oss_devinfo_t *dp, int dev, int fmode) +snd_seq_oss_midi_open(struct seq_oss_devinfo *dp, int dev, int fmode) { int perm; - seq_oss_midi_t *mdev; - snd_seq_port_subscribe_t subs; + struct seq_oss_midi *mdev; + struct snd_seq_port_subscribe subs; if ((mdev = get_mididev(dp, dev)) == NULL) return -ENODEV; @@ -392,10 +393,10 @@ snd_seq_oss_midi_open(seq_oss_devinfo_t *dp, int dev, int fmode) * close the midi device if already opened */ int -snd_seq_oss_midi_close(seq_oss_devinfo_t *dp, int dev) +snd_seq_oss_midi_close(struct seq_oss_devinfo *dp, int dev) { - seq_oss_midi_t *mdev; - snd_seq_port_subscribe_t subs; + struct seq_oss_midi *mdev; + struct snd_seq_port_subscribe subs; if ((mdev = get_mididev(dp, dev)) == NULL) return -ENODEV; @@ -404,7 +405,6 @@ snd_seq_oss_midi_close(seq_oss_devinfo_t *dp, int dev) return 0; } - debug_printk(("closing client %d port %d mode %d\n", mdev->client, mdev->port, mdev->opened)); memset(&subs, 0, sizeof(subs)); if (mdev->opened & PERM_WRITE) { subs.sender = dp->addr; @@ -430,9 +430,9 @@ snd_seq_oss_midi_close(seq_oss_devinfo_t *dp, int dev) * change seq capability flags to file mode flags */ int -snd_seq_oss_midi_filemode(seq_oss_devinfo_t *dp, int dev) +snd_seq_oss_midi_filemode(struct seq_oss_devinfo *dp, int dev) { - seq_oss_midi_t *mdev; + struct seq_oss_midi *mdev; int mode; if ((mdev = get_mididev(dp, dev)) == NULL) @@ -453,9 +453,9 @@ snd_seq_oss_midi_filemode(seq_oss_devinfo_t *dp, int dev) * so far, only close the device. */ void -snd_seq_oss_midi_reset(seq_oss_devinfo_t *dp, int dev) +snd_seq_oss_midi_reset(struct seq_oss_devinfo *dp, int dev) { - seq_oss_midi_t *mdev; + struct seq_oss_midi *mdev; if ((mdev = get_mididev(dp, dev)) == NULL) return; @@ -465,10 +465,9 @@ snd_seq_oss_midi_reset(seq_oss_devinfo_t *dp, int dev) } if (mdev->opened & PERM_WRITE) { - snd_seq_event_t ev; + struct snd_seq_event ev; int c; - debug_printk(("resetting client %d port %d\n", mdev->client, mdev->port)); memset(&ev, 0, sizeof(ev)); ev.dest.client = mdev->client; ev.dest.port = mdev->port; @@ -476,19 +475,20 @@ snd_seq_oss_midi_reset(seq_oss_devinfo_t *dp, int dev) ev.source.port = dp->port; if (dp->seq_mode == SNDRV_SEQ_OSS_MODE_SYNTH) { ev.type = SNDRV_SEQ_EVENT_SENSING; - snd_seq_oss_dispatch(dp, &ev, 0, 0); /* active sensing */ + snd_seq_oss_dispatch(dp, &ev, 0, 0); } for (c = 0; c < 16; c++) { ev.type = SNDRV_SEQ_EVENT_CONTROLLER; ev.data.control.channel = c; - ev.data.control.param = 123; - snd_seq_oss_dispatch(dp, &ev, 0, 0); /* all notes off */ + ev.data.control.param = MIDI_CTL_ALL_NOTES_OFF; + snd_seq_oss_dispatch(dp, &ev, 0, 0); if (dp->seq_mode == SNDRV_SEQ_OSS_MODE_MUSIC) { - ev.data.control.param = 121; - snd_seq_oss_dispatch(dp, &ev, 0, 0); /* reset all controllers */ + ev.data.control.param = + MIDI_CTL_RESET_CONTROLLERS; + snd_seq_oss_dispatch(dp, &ev, 0, 0); ev.type = SNDRV_SEQ_EVENT_PITCHBEND; ev.data.control.value = 0; - snd_seq_oss_dispatch(dp, &ev, 0, 0); /* bender off */ + snd_seq_oss_dispatch(dp, &ev, 0, 0); } } } @@ -501,9 +501,9 @@ snd_seq_oss_midi_reset(seq_oss_devinfo_t *dp, int dev) * get client/port of the specified MIDI device */ void -snd_seq_oss_midi_get_addr(seq_oss_devinfo_t *dp, int dev, snd_seq_addr_t *addr) +snd_seq_oss_midi_get_addr(struct seq_oss_devinfo *dp, int dev, struct snd_seq_addr *addr) { - seq_oss_midi_t *mdev; + struct seq_oss_midi *mdev; if ((mdev = get_mididev(dp, dev)) == NULL) return; @@ -517,10 +517,10 @@ snd_seq_oss_midi_get_addr(seq_oss_devinfo_t *dp, int dev, snd_seq_addr_t *addr) * input callback - this can be atomic */ int -snd_seq_oss_midi_input(snd_seq_event_t *ev, int direct, void *private_data) +snd_seq_oss_midi_input(struct snd_seq_event *ev, int direct, void *private_data) { - seq_oss_devinfo_t *dp = (seq_oss_devinfo_t *)private_data; - seq_oss_midi_t *mdev; + struct seq_oss_devinfo *dp = (struct seq_oss_devinfo *)private_data; + struct seq_oss_midi *mdev; int rc; if (dp->readq == NULL) @@ -545,9 +545,9 @@ snd_seq_oss_midi_input(snd_seq_event_t *ev, int direct, void *private_data) * convert ALSA sequencer event to OSS synth event */ static int -send_synth_event(seq_oss_devinfo_t *dp, snd_seq_event_t *ev, int dev) +send_synth_event(struct seq_oss_devinfo *dp, struct snd_seq_event *ev, int dev) { - evrec_t ossev; + union evrec ossev; memset(&ossev, 0, sizeof(ossev)); @@ -606,7 +606,7 @@ send_synth_event(seq_oss_devinfo_t *dp, snd_seq_event_t *ev, int dev) * decode event and send MIDI bytes to read queue */ static int -send_midi_event(seq_oss_devinfo_t *dp, snd_seq_event_t *ev, seq_oss_midi_t *mdev) +send_midi_event(struct seq_oss_devinfo *dp, struct snd_seq_event *ev, struct seq_oss_midi *mdev) { char msg[32]; int len; @@ -634,9 +634,9 @@ send_midi_event(seq_oss_devinfo_t *dp, snd_seq_event_t *ev, seq_oss_midi_t *mdev * non-zero : invalid - ignored */ int -snd_seq_oss_midi_putc(seq_oss_devinfo_t *dp, int dev, unsigned char c, snd_seq_event_t *ev) +snd_seq_oss_midi_putc(struct seq_oss_devinfo *dp, int dev, unsigned char c, struct snd_seq_event *ev) { - seq_oss_midi_t *mdev; + struct seq_oss_midi *mdev; if ((mdev = get_mididev(dp, dev)) == NULL) return -ENODEV; @@ -653,9 +653,9 @@ snd_seq_oss_midi_putc(seq_oss_devinfo_t *dp, int dev, unsigned char c, snd_seq_e * create OSS compatible midi_info record */ int -snd_seq_oss_midi_make_info(seq_oss_devinfo_t *dp, int dev, struct midi_info *inf) +snd_seq_oss_midi_make_info(struct seq_oss_devinfo *dp, int dev, struct midi_info *inf) { - seq_oss_midi_t *mdev; + struct seq_oss_midi *mdev; if ((mdev = get_mididev(dp, dev)) == NULL) return -ENXIO; @@ -668,6 +668,7 @@ snd_seq_oss_midi_make_info(seq_oss_devinfo_t *dp, int dev, struct midi_info *inf } +#ifdef CONFIG_PROC_FS /* * proc interface */ @@ -686,10 +687,10 @@ capmode_str(int val) } void -snd_seq_oss_midi_info_read(snd_info_buffer_t *buf) +snd_seq_oss_midi_info_read(struct snd_info_buffer *buf) { int i; - seq_oss_midi_t *mdev; + struct seq_oss_midi *mdev; snd_iprintf(buf, "\nNumber of MIDI devices: %d\n", max_midi_devs); for (i = 0; i < max_midi_devs; i++) { @@ -707,4 +708,4 @@ snd_seq_oss_midi_info_read(snd_info_buffer_t *buf) snd_use_lock_free(&mdev->use_lock); } } - +#endif /* CONFIG_PROC_FS */ diff --git a/sound/core/seq/oss/seq_oss_midi.h b/sound/core/seq/oss/seq_oss_midi.h index 462484b2b6f..84eb866ba58 100644 --- a/sound/core/seq/oss/seq_oss_midi.h +++ b/sound/core/seq/oss/seq_oss_midi.h @@ -26,24 +26,23 @@ #include "seq_oss_device.h" #include <sound/seq_oss_legacy.h> -typedef struct seq_oss_midi_t seq_oss_midi_t; - int snd_seq_oss_midi_lookup_ports(int client); -int snd_seq_oss_midi_check_new_port(snd_seq_port_info_t *pinfo); +int snd_seq_oss_midi_check_new_port(struct snd_seq_port_info *pinfo); int snd_seq_oss_midi_check_exit_port(int client, int port); void snd_seq_oss_midi_clear_all(void); -void snd_seq_oss_midi_setup(seq_oss_devinfo_t *dp); -void snd_seq_oss_midi_cleanup(seq_oss_devinfo_t *dp); +void snd_seq_oss_midi_setup(struct seq_oss_devinfo *dp); +void snd_seq_oss_midi_cleanup(struct seq_oss_devinfo *dp); -int snd_seq_oss_midi_open(seq_oss_devinfo_t *dp, int dev, int file_mode); -void snd_seq_oss_midi_open_all(seq_oss_devinfo_t *dp, int file_mode); -int snd_seq_oss_midi_close(seq_oss_devinfo_t *dp, int dev); -void snd_seq_oss_midi_reset(seq_oss_devinfo_t *dp, int dev); -int snd_seq_oss_midi_putc(seq_oss_devinfo_t *dp, int dev, unsigned char c, snd_seq_event_t *ev); -int snd_seq_oss_midi_input(snd_seq_event_t *ev, int direct, void *private); -int snd_seq_oss_midi_filemode(seq_oss_devinfo_t *dp, int dev); -int snd_seq_oss_midi_make_info(seq_oss_devinfo_t *dp, int dev, struct midi_info *inf); -void snd_seq_oss_midi_get_addr(seq_oss_devinfo_t *dp, int dev, snd_seq_addr_t *addr); +int snd_seq_oss_midi_open(struct seq_oss_devinfo *dp, int dev, int file_mode); +void snd_seq_oss_midi_open_all(struct seq_oss_devinfo *dp, int file_mode); +int snd_seq_oss_midi_close(struct seq_oss_devinfo *dp, int dev); +void snd_seq_oss_midi_reset(struct seq_oss_devinfo *dp, int dev); +int snd_seq_oss_midi_putc(struct seq_oss_devinfo *dp, int dev, unsigned char c, + struct snd_seq_event *ev); +int snd_seq_oss_midi_input(struct snd_seq_event *ev, int direct, void *private); +int snd_seq_oss_midi_filemode(struct seq_oss_devinfo *dp, int dev); +int snd_seq_oss_midi_make_info(struct seq_oss_devinfo *dp, int dev, struct midi_info *inf); +void snd_seq_oss_midi_get_addr(struct seq_oss_devinfo *dp, int dev, struct snd_seq_addr *addr); #endif diff --git a/sound/core/seq/oss/seq_oss_readq.c b/sound/core/seq/oss/seq_oss_readq.c index 55571e15cd3..654d17a5023 100644 --- a/sound/core/seq/oss/seq_oss_readq.c +++ b/sound/core/seq/oss/seq_oss_readq.c @@ -25,6 +25,7 @@ #include <sound/seq_oss_legacy.h> #include "../seq_lock.h" #include <linux/wait.h> +#include <linux/slab.h> /* * constants @@ -41,18 +42,18 @@ /* * create a read queue */ -seq_oss_readq_t * -snd_seq_oss_readq_new(seq_oss_devinfo_t *dp, int maxlen) +struct seq_oss_readq * +snd_seq_oss_readq_new(struct seq_oss_devinfo *dp, int maxlen) { - seq_oss_readq_t *q; + struct seq_oss_readq *q; if ((q = kzalloc(sizeof(*q), GFP_KERNEL)) == NULL) { - snd_printk(KERN_ERR "can't malloc read queue\n"); + pr_err("ALSA: seq_oss: can't malloc read queue\n"); return NULL; } - if ((q->q = kcalloc(maxlen, sizeof(evrec_t), GFP_KERNEL)) == NULL) { - snd_printk(KERN_ERR "can't malloc read queue buffer\n"); + if ((q->q = kcalloc(maxlen, sizeof(union evrec), GFP_KERNEL)) == NULL) { + pr_err("ALSA: seq_oss: can't malloc read queue buffer\n"); kfree(q); return NULL; } @@ -72,7 +73,7 @@ snd_seq_oss_readq_new(seq_oss_devinfo_t *dp, int maxlen) * delete the read queue */ void -snd_seq_oss_readq_delete(seq_oss_readq_t *q) +snd_seq_oss_readq_delete(struct seq_oss_readq *q) { if (q) { kfree(q->q); @@ -84,7 +85,7 @@ snd_seq_oss_readq_delete(seq_oss_readq_t *q) * reset the read queue */ void -snd_seq_oss_readq_clear(seq_oss_readq_t *q) +snd_seq_oss_readq_clear(struct seq_oss_readq *q) { if (q->qlen) { q->qlen = 0; @@ -100,9 +101,9 @@ snd_seq_oss_readq_clear(seq_oss_readq_t *q) * put a midi byte */ int -snd_seq_oss_readq_puts(seq_oss_readq_t *q, int dev, unsigned char *data, int len) +snd_seq_oss_readq_puts(struct seq_oss_readq *q, int dev, unsigned char *data, int len) { - evrec_t rec; + union evrec rec; int result; memset(&rec, 0, sizeof(rec)); @@ -123,7 +124,7 @@ snd_seq_oss_readq_puts(seq_oss_readq_t *q, int dev, unsigned char *data, int len * return zero if enqueued */ int -snd_seq_oss_readq_put_event(seq_oss_readq_t *q, evrec_t *ev) +snd_seq_oss_readq_put_event(struct seq_oss_readq *q, union evrec *ev) { unsigned long flags; @@ -152,7 +153,7 @@ snd_seq_oss_readq_put_event(seq_oss_readq_t *q, evrec_t *ev) * caller must hold lock */ int -snd_seq_oss_readq_pick(seq_oss_readq_t *q, evrec_t *rec) +snd_seq_oss_readq_pick(struct seq_oss_readq *q, union evrec *rec) { if (q->qlen == 0) return -EAGAIN; @@ -164,7 +165,7 @@ snd_seq_oss_readq_pick(seq_oss_readq_t *q, evrec_t *rec) * sleep until ready */ void -snd_seq_oss_readq_wait(seq_oss_readq_t *q) +snd_seq_oss_readq_wait(struct seq_oss_readq *q) { wait_event_interruptible_timeout(q->midi_sleep, (q->qlen > 0 || q->head == q->tail), @@ -176,7 +177,7 @@ snd_seq_oss_readq_wait(seq_oss_readq_t *q) * caller must hold lock */ void -snd_seq_oss_readq_free(seq_oss_readq_t *q) +snd_seq_oss_readq_free(struct seq_oss_readq *q) { if (q->qlen > 0) { q->head = (q->head + 1) % q->maxlen; @@ -189,7 +190,7 @@ snd_seq_oss_readq_free(seq_oss_readq_t *q) * return non-zero if readq is not empty. */ unsigned int -snd_seq_oss_readq_poll(seq_oss_readq_t *q, struct file *file, poll_table *wait) +snd_seq_oss_readq_poll(struct seq_oss_readq *q, struct file *file, poll_table *wait) { poll_wait(file, &q->midi_sleep, wait); return q->qlen; @@ -199,10 +200,10 @@ snd_seq_oss_readq_poll(seq_oss_readq_t *q, struct file *file, poll_table *wait) * put a timestamp */ int -snd_seq_oss_readq_put_timestamp(seq_oss_readq_t *q, unsigned long curt, int seq_mode) +snd_seq_oss_readq_put_timestamp(struct seq_oss_readq *q, unsigned long curt, int seq_mode) { if (curt != q->input_time) { - evrec_t rec; + union evrec rec; memset(&rec, 0, sizeof(rec)); switch (seq_mode) { case SNDRV_SEQ_OSS_MODE_SYNTH: @@ -222,13 +223,15 @@ snd_seq_oss_readq_put_timestamp(seq_oss_readq_t *q, unsigned long curt, int seq_ } +#ifdef CONFIG_PROC_FS /* * proc interface */ void -snd_seq_oss_readq_info_read(seq_oss_readq_t *q, snd_info_buffer_t *buf) +snd_seq_oss_readq_info_read(struct seq_oss_readq *q, struct snd_info_buffer *buf) { snd_iprintf(buf, " read queue [%s] length = %d : tick = %ld\n", (waitqueue_active(&q->midi_sleep) ? "sleeping":"running"), q->qlen, q->input_time); } +#endif /* CONFIG_PROC_FS */ diff --git a/sound/core/seq/oss/seq_oss_readq.h b/sound/core/seq/oss/seq_oss_readq.h index 303b9298f20..f1463f1f449 100644 --- a/sound/core/seq/oss/seq_oss_readq.h +++ b/sound/core/seq/oss/seq_oss_readq.h @@ -28,8 +28,8 @@ /* * definition of read queue */ -struct seq_oss_readq_t { - evrec_t *q; +struct seq_oss_readq { + union evrec *q; int qlen; int maxlen; int head, tail; @@ -39,16 +39,16 @@ struct seq_oss_readq_t { spinlock_t lock; }; -seq_oss_readq_t *snd_seq_oss_readq_new(seq_oss_devinfo_t *dp, int maxlen); -void snd_seq_oss_readq_delete(seq_oss_readq_t *q); -void snd_seq_oss_readq_clear(seq_oss_readq_t *readq); -unsigned int snd_seq_oss_readq_poll(seq_oss_readq_t *readq, struct file *file, poll_table *wait); -int snd_seq_oss_readq_puts(seq_oss_readq_t *readq, int dev, unsigned char *data, int len); -int snd_seq_oss_readq_put_event(seq_oss_readq_t *readq, evrec_t *ev); -int snd_seq_oss_readq_put_timestamp(seq_oss_readq_t *readq, unsigned long curt, int seq_mode); -int snd_seq_oss_readq_pick(seq_oss_readq_t *q, evrec_t *rec); -void snd_seq_oss_readq_wait(seq_oss_readq_t *q); -void snd_seq_oss_readq_free(seq_oss_readq_t *q); +struct seq_oss_readq *snd_seq_oss_readq_new(struct seq_oss_devinfo *dp, int maxlen); +void snd_seq_oss_readq_delete(struct seq_oss_readq *q); +void snd_seq_oss_readq_clear(struct seq_oss_readq *readq); +unsigned int snd_seq_oss_readq_poll(struct seq_oss_readq *readq, struct file *file, poll_table *wait); +int snd_seq_oss_readq_puts(struct seq_oss_readq *readq, int dev, unsigned char *data, int len); +int snd_seq_oss_readq_put_event(struct seq_oss_readq *readq, union evrec *ev); +int snd_seq_oss_readq_put_timestamp(struct seq_oss_readq *readq, unsigned long curt, int seq_mode); +int snd_seq_oss_readq_pick(struct seq_oss_readq *q, union evrec *rec); +void snd_seq_oss_readq_wait(struct seq_oss_readq *q); +void snd_seq_oss_readq_free(struct seq_oss_readq *q); #define snd_seq_oss_readq_lock(q, flags) spin_lock_irqsave(&(q)->lock, flags) #define snd_seq_oss_readq_unlock(q, flags) spin_unlock_irqrestore(&(q)->lock, flags) diff --git a/sound/core/seq/oss/seq_oss_rw.c b/sound/core/seq/oss/seq_oss_rw.c index 1d8fbd22e3e..6a7b6aceeca 100644 --- a/sound/core/seq/oss/seq_oss_rw.c +++ b/sound/core/seq/oss/seq_oss_rw.c @@ -33,7 +33,7 @@ /* * protoypes */ -static int insert_queue(seq_oss_devinfo_t *dp, evrec_t *rec, struct file *opt); +static int insert_queue(struct seq_oss_devinfo *dp, union evrec *rec, struct file *opt); /* @@ -41,12 +41,12 @@ static int insert_queue(seq_oss_devinfo_t *dp, evrec_t *rec, struct file *opt); */ int -snd_seq_oss_read(seq_oss_devinfo_t *dp, char __user *buf, int count) +snd_seq_oss_read(struct seq_oss_devinfo *dp, char __user *buf, int count) { - seq_oss_readq_t *readq = dp->readq; + struct seq_oss_readq *readq = dp->readq; int result = 0, err = 0; int ev_len; - evrec_t rec; + union evrec rec; unsigned long flags; if (readq == NULL || ! is_read_mode(dp->file_mode)) @@ -93,11 +93,11 @@ snd_seq_oss_read(seq_oss_devinfo_t *dp, char __user *buf, int count) */ int -snd_seq_oss_write(seq_oss_devinfo_t *dp, const char __user *buf, int count, struct file *opt) +snd_seq_oss_write(struct seq_oss_devinfo *dp, const char __user *buf, int count, struct file *opt) { int result = 0, err = 0; int ev_size, fmt; - evrec_t rec; + union evrec rec; if (! is_write_mode(dp->file_mode) || dp->writeq == NULL) return -ENXIO; @@ -161,10 +161,10 @@ snd_seq_oss_write(seq_oss_devinfo_t *dp, const char __user *buf, int count, stru * return: 0 = OK, non-zero = NG */ static int -insert_queue(seq_oss_devinfo_t *dp, evrec_t *rec, struct file *opt) +insert_queue(struct seq_oss_devinfo *dp, union evrec *rec, struct file *opt) { int rc = 0; - snd_seq_event_t event; + struct snd_seq_event event; /* if this is a timing event, process the current time */ if (snd_seq_oss_process_timer_event(dp->timer, rec)) @@ -197,7 +197,7 @@ insert_queue(seq_oss_devinfo_t *dp, evrec_t *rec, struct file *opt) */ unsigned int -snd_seq_oss_poll(seq_oss_devinfo_t *dp, struct file *file, poll_table * wait) +snd_seq_oss_poll(struct seq_oss_devinfo *dp, struct file *file, poll_table * wait) { unsigned int mask = 0; diff --git a/sound/core/seq/oss/seq_oss_synth.c b/sound/core/seq/oss/seq_oss_synth.c index 8257fce2ca1..701feb71b70 100644 --- a/sound/core/seq/oss/seq_oss_synth.c +++ b/sound/core/seq/oss/seq_oss_synth.c @@ -24,6 +24,8 @@ #include "seq_oss_midi.h" #include "../seq_lock.h" #include <linux/init.h> +#include <linux/module.h> +#include <linux/slab.h> /* * constants @@ -37,14 +39,14 @@ */ /* sysex buffer */ -struct seq_oss_synth_sysex_t { +struct seq_oss_synth_sysex { int len; int skip; unsigned char buf[MAX_SYSEX_BUFLEN]; }; /* synth info */ -struct seq_oss_synth_t { +struct seq_oss_synth { int seq_device; /* for synth_info */ @@ -53,7 +55,7 @@ struct seq_oss_synth_t { int nr_voices; char name[SNDRV_SEQ_OSS_MAX_SYNTH_NAME]; - snd_seq_oss_callback_t oper; + struct snd_seq_oss_callback oper; int opened; @@ -66,8 +68,8 @@ struct seq_oss_synth_t { * device table */ static int max_synth_devs; -static seq_oss_synth_t *synth_devs[SNDRV_SEQ_OSS_MAX_SYNTH_DEVS]; -static seq_oss_synth_t midi_synth_dev = { +static struct seq_oss_synth *synth_devs[SNDRV_SEQ_OSS_MAX_SYNTH_DEVS]; +static struct seq_oss_synth midi_synth_dev = { -1, /* seq_device */ SYNTH_TYPE_MIDI, /* synth_type */ 0, /* synth_subtype */ @@ -80,8 +82,8 @@ static DEFINE_SPINLOCK(register_lock); /* * prototypes */ -static seq_oss_synth_t *get_synthdev(seq_oss_devinfo_t *dp, int dev); -static void reset_channels(seq_oss_synthinfo_t *info); +static struct seq_oss_synth *get_synthdev(struct seq_oss_devinfo *dp, int dev); +static void reset_channels(struct seq_oss_synthinfo *info); /* * global initialization @@ -96,15 +98,15 @@ snd_seq_oss_synth_init(void) * registration of the synth device */ int -snd_seq_oss_synth_register(snd_seq_device_t *dev) +snd_seq_oss_synth_register(struct snd_seq_device *dev) { int i; - seq_oss_synth_t *rec; - snd_seq_oss_reg_t *reg = SNDRV_SEQ_DEVICE_ARGPTR(dev); + struct seq_oss_synth *rec; + struct snd_seq_oss_reg *reg = SNDRV_SEQ_DEVICE_ARGPTR(dev); unsigned long flags; if ((rec = kzalloc(sizeof(*rec), GFP_KERNEL)) == NULL) { - snd_printk(KERN_ERR "can't malloc synth info\n"); + pr_err("ALSA: seq_oss: can't malloc synth info\n"); return -ENOMEM; } rec->seq_device = -1; @@ -128,7 +130,7 @@ snd_seq_oss_synth_register(snd_seq_device_t *dev) if (i >= max_synth_devs) { if (max_synth_devs >= SNDRV_SEQ_OSS_MAX_SYNTH_DEVS) { spin_unlock_irqrestore(®ister_lock, flags); - snd_printk(KERN_ERR "no more synth slot\n"); + pr_err("ALSA: seq_oss: no more synth slot\n"); kfree(rec); return -ENOMEM; } @@ -136,7 +138,6 @@ snd_seq_oss_synth_register(snd_seq_device_t *dev) } rec->seq_device = i; synth_devs[i] = rec; - debug_printk(("synth %s registered %d\n", rec->name, i)); spin_unlock_irqrestore(®ister_lock, flags); dev->driver_data = rec; #ifdef SNDRV_OSS_INFO_DEV_SYNTH @@ -148,10 +149,10 @@ snd_seq_oss_synth_register(snd_seq_device_t *dev) int -snd_seq_oss_synth_unregister(snd_seq_device_t *dev) +snd_seq_oss_synth_unregister(struct snd_seq_device *dev) { int index; - seq_oss_synth_t *rec = dev->driver_data; + struct seq_oss_synth *rec = dev->driver_data; unsigned long flags; spin_lock_irqsave(®ister_lock, flags); @@ -161,7 +162,7 @@ snd_seq_oss_synth_unregister(snd_seq_device_t *dev) } if (index >= max_synth_devs) { spin_unlock_irqrestore(®ister_lock, flags); - snd_printk(KERN_ERR "can't unregister synth\n"); + pr_err("ALSA: seq_oss: can't unregister synth\n"); return -EINVAL; } synth_devs[index] = NULL; @@ -187,10 +188,10 @@ snd_seq_oss_synth_unregister(snd_seq_device_t *dev) /* */ -static seq_oss_synth_t * +static struct seq_oss_synth * get_sdev(int dev) { - seq_oss_synth_t *rec; + struct seq_oss_synth *rec; unsigned long flags; spin_lock_irqsave(®ister_lock, flags); @@ -207,11 +208,11 @@ get_sdev(int dev) */ void -snd_seq_oss_synth_setup(seq_oss_devinfo_t *dp) +snd_seq_oss_synth_setup(struct seq_oss_devinfo *dp) { int i; - seq_oss_synth_t *rec; - seq_oss_synthinfo_t *info; + struct seq_oss_synth *rec; + struct seq_oss_synthinfo *info; dp->max_synthdev = max_synth_devs; dp->synth_opened = 0; @@ -244,12 +245,16 @@ snd_seq_oss_synth_setup(seq_oss_devinfo_t *dp) } info->nr_voices = rec->nr_voices; if (info->nr_voices > 0) { - info->ch = kcalloc(info->nr_voices, sizeof(seq_oss_chinfo_t), GFP_KERNEL); - if (!info->ch) - BUG(); + info->ch = kcalloc(info->nr_voices, sizeof(struct seq_oss_chinfo), GFP_KERNEL); + if (!info->ch) { + pr_err("ALSA: seq_oss: Cannot malloc voices\n"); + rec->oper.close(&info->arg); + module_put(rec->oper.owner); + snd_use_lock_free(&rec->use_lock); + continue; + } reset_channels(info); } - debug_printk(("synth %d assigned\n", i)); info->opened++; rec->opened++; dp->synth_opened++; @@ -263,7 +268,7 @@ snd_seq_oss_synth_setup(seq_oss_devinfo_t *dp) */ void -snd_seq_oss_synth_setup_midi(seq_oss_devinfo_t *dp) +snd_seq_oss_synth_setup_midi(struct seq_oss_devinfo *dp) { int i; @@ -271,7 +276,7 @@ snd_seq_oss_synth_setup_midi(seq_oss_devinfo_t *dp) return; for (i = 0; i < dp->max_mididev; i++) { - seq_oss_synthinfo_t *info; + struct seq_oss_synthinfo *info; info = &dp->synths[dp->max_synthdev]; if (snd_seq_oss_midi_open(dp, i, dp->file_mode) < 0) continue; @@ -297,13 +302,14 @@ snd_seq_oss_synth_setup_midi(seq_oss_devinfo_t *dp) */ void -snd_seq_oss_synth_cleanup(seq_oss_devinfo_t *dp) +snd_seq_oss_synth_cleanup(struct seq_oss_devinfo *dp) { int i; - seq_oss_synth_t *rec; - seq_oss_synthinfo_t *info; + struct seq_oss_synth *rec; + struct seq_oss_synthinfo *info; - snd_assert(dp->max_synthdev <= SNDRV_SEQ_OSS_MAX_SYNTH_DEVS, return); + if (snd_BUG_ON(dp->max_synthdev >= SNDRV_SEQ_OSS_MAX_SYNTH_DEVS)) + return; for (i = 0; i < dp->max_synthdev; i++) { info = &dp->synths[i]; if (! info->opened) @@ -318,7 +324,6 @@ snd_seq_oss_synth_cleanup(seq_oss_devinfo_t *dp) if (rec == NULL) continue; if (rec->opened > 0) { - debug_printk(("synth %d closed\n", i)); rec->oper.close(&info->arg); module_put(rec->oper.owner); rec->opened = 0; @@ -338,7 +343,7 @@ snd_seq_oss_synth_cleanup(seq_oss_devinfo_t *dp) * check if the specified device is MIDI mapped device */ static int -is_midi_dev(seq_oss_devinfo_t *dp, int dev) +is_midi_dev(struct seq_oss_devinfo *dp, int dev) { if (dev < 0 || dev >= dp->max_synthdev) return 0; @@ -350,10 +355,10 @@ is_midi_dev(seq_oss_devinfo_t *dp, int dev) /* * return synth device information pointer */ -static seq_oss_synth_t * -get_synthdev(seq_oss_devinfo_t *dp, int dev) +static struct seq_oss_synth * +get_synthdev(struct seq_oss_devinfo *dp, int dev) { - seq_oss_synth_t *rec; + struct seq_oss_synth *rec; if (dev < 0 || dev >= dp->max_synthdev) return NULL; if (! dp->synths[dev].opened) @@ -374,7 +379,7 @@ get_synthdev(seq_oss_devinfo_t *dp, int dev) * reset note and velocity on each channel. */ static void -reset_channels(seq_oss_synthinfo_t *info) +reset_channels(struct seq_oss_synthinfo *info) { int i; if (info->ch == NULL || ! info->nr_voices) @@ -392,12 +397,13 @@ reset_channels(seq_oss_synthinfo_t *info) * event to the corresponding port. */ void -snd_seq_oss_synth_reset(seq_oss_devinfo_t *dp, int dev) +snd_seq_oss_synth_reset(struct seq_oss_devinfo *dp, int dev) { - seq_oss_synth_t *rec; - seq_oss_synthinfo_t *info; + struct seq_oss_synth *rec; + struct seq_oss_synthinfo *info; - snd_assert(dev >= 0 && dev < dp->max_synthdev, return); + if (snd_BUG_ON(dev < 0 || dev >= dp->max_synthdev)) + return; info = &dp->synths[dev]; if (! info->opened) return; @@ -428,7 +434,7 @@ snd_seq_oss_synth_reset(seq_oss_devinfo_t *dp, int dev) if (rec->oper.reset) { rec->oper.reset(&info->arg); } else { - snd_seq_event_t ev; + struct snd_seq_event ev; memset(&ev, 0, sizeof(ev)); snd_seq_oss_fill_addr(dp, &ev, info->arg.addr.client, info->arg.addr.port); @@ -444,10 +450,10 @@ snd_seq_oss_synth_reset(seq_oss_devinfo_t *dp, int dev) * call load_patch callback function */ int -snd_seq_oss_synth_load_patch(seq_oss_devinfo_t *dp, int dev, int fmt, +snd_seq_oss_synth_load_patch(struct seq_oss_devinfo *dp, int dev, int fmt, const char __user *buf, int p, int c) { - seq_oss_synth_t *rec; + struct seq_oss_synth *rec; int rc; if (dev < 0 || dev >= dp->max_synthdev) @@ -470,9 +476,9 @@ snd_seq_oss_synth_load_patch(seq_oss_devinfo_t *dp, int dev, int fmt, * check if the device is valid synth device */ int -snd_seq_oss_synth_is_valid(seq_oss_devinfo_t *dp, int dev) +snd_seq_oss_synth_is_valid(struct seq_oss_devinfo *dp, int dev) { - seq_oss_synth_t *rec; + struct seq_oss_synth *rec; rec = get_synthdev(dp, dev); if (rec) { snd_use_lock_free(&rec->use_lock); @@ -488,11 +494,11 @@ snd_seq_oss_synth_is_valid(seq_oss_devinfo_t *dp, int dev) * (0xff). */ int -snd_seq_oss_synth_sysex(seq_oss_devinfo_t *dp, int dev, unsigned char *buf, snd_seq_event_t *ev) +snd_seq_oss_synth_sysex(struct seq_oss_devinfo *dp, int dev, unsigned char *buf, struct snd_seq_event *ev) { int i, send; unsigned char *dest; - seq_oss_synth_sysex_t *sysex; + struct seq_oss_synth_sysex *sysex; if (! snd_seq_oss_synth_is_valid(dp, dev)) return -ENXIO; @@ -545,7 +551,7 @@ snd_seq_oss_synth_sysex(seq_oss_devinfo_t *dp, int dev, unsigned char *buf, snd_ * fill the event source/destination addresses */ int -snd_seq_oss_synth_addr(seq_oss_devinfo_t *dp, int dev, snd_seq_event_t *ev) +snd_seq_oss_synth_addr(struct seq_oss_devinfo *dp, int dev, struct snd_seq_event *ev) { if (! snd_seq_oss_synth_is_valid(dp, dev)) return -EINVAL; @@ -559,9 +565,9 @@ snd_seq_oss_synth_addr(seq_oss_devinfo_t *dp, int dev, snd_seq_event_t *ev) * OSS compatible ioctl */ int -snd_seq_oss_synth_ioctl(seq_oss_devinfo_t *dp, int dev, unsigned int cmd, unsigned long addr) +snd_seq_oss_synth_ioctl(struct seq_oss_devinfo *dp, int dev, unsigned int cmd, unsigned long addr) { - seq_oss_synth_t *rec; + struct seq_oss_synth *rec; int rc; if (is_midi_dev(dp, dev)) @@ -581,7 +587,7 @@ snd_seq_oss_synth_ioctl(seq_oss_devinfo_t *dp, int dev, unsigned int cmd, unsign * send OSS raw events - SEQ_PRIVATE and SEQ_VOLUME */ int -snd_seq_oss_synth_raw_event(seq_oss_devinfo_t *dp, int dev, unsigned char *data, snd_seq_event_t *ev) +snd_seq_oss_synth_raw_event(struct seq_oss_devinfo *dp, int dev, unsigned char *data, struct snd_seq_event *ev) { if (! snd_seq_oss_synth_is_valid(dp, dev) || is_midi_dev(dp, dev)) return -ENXIO; @@ -595,9 +601,12 @@ snd_seq_oss_synth_raw_event(seq_oss_devinfo_t *dp, int dev, unsigned char *data, * create OSS compatible synth_info record */ int -snd_seq_oss_synth_make_info(seq_oss_devinfo_t *dp, int dev, struct synth_info *inf) +snd_seq_oss_synth_make_info(struct seq_oss_devinfo *dp, int dev, struct synth_info *inf) { - seq_oss_synth_t *rec; + struct seq_oss_synth *rec; + + if (dev < 0 || dev >= dp->max_synthdev) + return -ENXIO; if (dp->synths[dev].is_midi) { struct midi_info minf; @@ -621,14 +630,15 @@ snd_seq_oss_synth_make_info(seq_oss_devinfo_t *dp, int dev, struct synth_info *i } +#ifdef CONFIG_PROC_FS /* * proc interface */ void -snd_seq_oss_synth_info_read(snd_info_buffer_t *buf) +snd_seq_oss_synth_info_read(struct snd_info_buffer *buf) { int i; - seq_oss_synth_t *rec; + struct seq_oss_synth *rec; snd_iprintf(buf, "\nNumber of synth devices: %d\n", max_synth_devs); for (i = 0; i < max_synth_devs; i++) { @@ -648,4 +658,4 @@ snd_seq_oss_synth_info_read(snd_info_buffer_t *buf) snd_use_lock_free(&rec->use_lock); } } - +#endif /* CONFIG_PROC_FS */ diff --git a/sound/core/seq/oss/seq_oss_synth.h b/sound/core/seq/oss/seq_oss_synth.h index 07bc0e2cfb8..dbdfcbb80ea 100644 --- a/sound/core/seq/oss/seq_oss_synth.h +++ b/sound/core/seq/oss/seq_oss_synth.h @@ -27,23 +27,25 @@ #include <sound/seq_oss_legacy.h> #include <sound/seq_device.h> -typedef struct seq_oss_synth_t seq_oss_synth_t; - void snd_seq_oss_synth_init(void); -int snd_seq_oss_synth_register(snd_seq_device_t *dev); -int snd_seq_oss_synth_unregister(snd_seq_device_t *dev); -void snd_seq_oss_synth_setup(seq_oss_devinfo_t *dp); -void snd_seq_oss_synth_setup_midi(seq_oss_devinfo_t *dp); -void snd_seq_oss_synth_cleanup(seq_oss_devinfo_t *dp); +int snd_seq_oss_synth_register(struct snd_seq_device *dev); +int snd_seq_oss_synth_unregister(struct snd_seq_device *dev); +void snd_seq_oss_synth_setup(struct seq_oss_devinfo *dp); +void snd_seq_oss_synth_setup_midi(struct seq_oss_devinfo *dp); +void snd_seq_oss_synth_cleanup(struct seq_oss_devinfo *dp); -void snd_seq_oss_synth_reset(seq_oss_devinfo_t *dp, int dev); -int snd_seq_oss_synth_load_patch(seq_oss_devinfo_t *dp, int dev, int fmt, const char __user *buf, int p, int c); -int snd_seq_oss_synth_is_valid(seq_oss_devinfo_t *dp, int dev); -int snd_seq_oss_synth_sysex(seq_oss_devinfo_t *dp, int dev, unsigned char *buf, snd_seq_event_t *ev); -int snd_seq_oss_synth_addr(seq_oss_devinfo_t *dp, int dev, snd_seq_event_t *ev); -int snd_seq_oss_synth_ioctl(seq_oss_devinfo_t *dp, int dev, unsigned int cmd, unsigned long addr); -int snd_seq_oss_synth_raw_event(seq_oss_devinfo_t *dp, int dev, unsigned char *data, snd_seq_event_t *ev); +void snd_seq_oss_synth_reset(struct seq_oss_devinfo *dp, int dev); +int snd_seq_oss_synth_load_patch(struct seq_oss_devinfo *dp, int dev, int fmt, + const char __user *buf, int p, int c); +int snd_seq_oss_synth_is_valid(struct seq_oss_devinfo *dp, int dev); +int snd_seq_oss_synth_sysex(struct seq_oss_devinfo *dp, int dev, unsigned char *buf, + struct snd_seq_event *ev); +int snd_seq_oss_synth_addr(struct seq_oss_devinfo *dp, int dev, struct snd_seq_event *ev); +int snd_seq_oss_synth_ioctl(struct seq_oss_devinfo *dp, int dev, unsigned int cmd, + unsigned long addr); +int snd_seq_oss_synth_raw_event(struct seq_oss_devinfo *dp, int dev, + unsigned char *data, struct snd_seq_event *ev); -int snd_seq_oss_synth_make_info(seq_oss_devinfo_t *dp, int dev, struct synth_info *inf); +int snd_seq_oss_synth_make_info(struct seq_oss_devinfo *dp, int dev, struct synth_info *inf); #endif diff --git a/sound/core/seq/oss/seq_oss_timer.c b/sound/core/seq/oss/seq_oss_timer.c index 64d594b3170..4f24ea9fad9 100644 --- a/sound/core/seq/oss/seq_oss_timer.c +++ b/sound/core/seq/oss/seq_oss_timer.c @@ -23,6 +23,7 @@ #include "seq_oss_timer.h" #include "seq_oss_event.h" #include <sound/seq_oss_legacy.h> +#include <linux/slab.h> /* */ @@ -33,18 +34,18 @@ /* */ -static void calc_alsa_tempo(seq_oss_timer_t *timer); -static int send_timer_event(seq_oss_devinfo_t *dp, int type, int value); +static void calc_alsa_tempo(struct seq_oss_timer *timer); +static int send_timer_event(struct seq_oss_devinfo *dp, int type, int value); /* * create and register a new timer. * if queue is not started yet, start it. */ -seq_oss_timer_t * -snd_seq_oss_timer_new(seq_oss_devinfo_t *dp) +struct seq_oss_timer * +snd_seq_oss_timer_new(struct seq_oss_devinfo *dp) { - seq_oss_timer_t *rec; + struct seq_oss_timer *rec; rec = kzalloc(sizeof(*rec), GFP_KERNEL); if (rec == NULL) @@ -67,7 +68,7 @@ snd_seq_oss_timer_new(seq_oss_devinfo_t *dp) * if no more timer exists, stop the queue. */ void -snd_seq_oss_timer_delete(seq_oss_timer_t *rec) +snd_seq_oss_timer_delete(struct seq_oss_timer *rec) { if (rec) { snd_seq_oss_timer_stop(rec); @@ -82,7 +83,7 @@ snd_seq_oss_timer_delete(seq_oss_timer_t *rec) * 0 : not a timer event -- enqueue this event */ int -snd_seq_oss_process_timer_event(seq_oss_timer_t *rec, evrec_t *ev) +snd_seq_oss_process_timer_event(struct seq_oss_timer *rec, union evrec *ev) { abstime_t parm = ev->t.time; @@ -125,7 +126,7 @@ snd_seq_oss_process_timer_event(seq_oss_timer_t *rec, evrec_t *ev) * convert tempo units */ static void -calc_alsa_tempo(seq_oss_timer_t *timer) +calc_alsa_tempo(struct seq_oss_timer *timer) { timer->tempo = (60 * 1000000) / timer->oss_tempo; timer->ppq = timer->oss_timebase; @@ -136,9 +137,9 @@ calc_alsa_tempo(seq_oss_timer_t *timer) * dispatch a timer event */ static int -send_timer_event(seq_oss_devinfo_t *dp, int type, int value) +send_timer_event(struct seq_oss_devinfo *dp, int type, int value) { - snd_seq_event_t ev; + struct snd_seq_event ev; memset(&ev, 0, sizeof(ev)); ev.type = type; @@ -156,10 +157,10 @@ send_timer_event(seq_oss_devinfo_t *dp, int type, int value) * set queue tempo and start queue */ int -snd_seq_oss_timer_start(seq_oss_timer_t *timer) +snd_seq_oss_timer_start(struct seq_oss_timer *timer) { - seq_oss_devinfo_t *dp = timer->dp; - snd_seq_queue_tempo_t tmprec; + struct seq_oss_devinfo *dp = timer->dp; + struct snd_seq_queue_tempo tmprec; if (timer->running) snd_seq_oss_timer_stop(timer); @@ -181,7 +182,7 @@ snd_seq_oss_timer_start(seq_oss_timer_t *timer) * stop queue */ int -snd_seq_oss_timer_stop(seq_oss_timer_t *timer) +snd_seq_oss_timer_stop(struct seq_oss_timer *timer) { if (! timer->running) return 0; @@ -195,7 +196,7 @@ snd_seq_oss_timer_stop(seq_oss_timer_t *timer) * continue queue */ int -snd_seq_oss_timer_continue(seq_oss_timer_t *timer) +snd_seq_oss_timer_continue(struct seq_oss_timer *timer) { if (timer->running) return 0; @@ -209,7 +210,7 @@ snd_seq_oss_timer_continue(seq_oss_timer_t *timer) * change queue tempo */ int -snd_seq_oss_timer_tempo(seq_oss_timer_t *timer, int value) +snd_seq_oss_timer_tempo(struct seq_oss_timer *timer, int value) { if (value < MIN_OSS_TEMPO) value = MIN_OSS_TEMPO; @@ -227,12 +228,11 @@ snd_seq_oss_timer_tempo(seq_oss_timer_t *timer, int value) * ioctls */ int -snd_seq_oss_timer_ioctl(seq_oss_timer_t *timer, unsigned int cmd, int __user *arg) +snd_seq_oss_timer_ioctl(struct seq_oss_timer *timer, unsigned int cmd, int __user *arg) { int value; if (cmd == SNDCTL_SEQ_CTRLRATE) { - debug_printk(("ctrl rate\n")); /* if *arg == 0, just return the current rate */ if (get_user(value, arg)) return -EFAULT; @@ -247,21 +247,16 @@ snd_seq_oss_timer_ioctl(seq_oss_timer_t *timer, unsigned int cmd, int __user *ar switch (cmd) { case SNDCTL_TMR_START: - debug_printk(("timer start\n")); return snd_seq_oss_timer_start(timer); case SNDCTL_TMR_STOP: - debug_printk(("timer stop\n")); return snd_seq_oss_timer_stop(timer); case SNDCTL_TMR_CONTINUE: - debug_printk(("timer continue\n")); return snd_seq_oss_timer_continue(timer); case SNDCTL_TMR_TEMPO: - debug_printk(("timer tempo\n")); if (get_user(value, arg)) return -EFAULT; return snd_seq_oss_timer_tempo(timer, value); case SNDCTL_TMR_TIMEBASE: - debug_printk(("timer timebase\n")); if (get_user(value, arg)) return -EFAULT; if (value < MIN_OSS_TIMEBASE) @@ -275,7 +270,6 @@ snd_seq_oss_timer_ioctl(seq_oss_timer_t *timer, unsigned int cmd, int __user *ar case SNDCTL_TMR_METRONOME: case SNDCTL_TMR_SELECT: case SNDCTL_TMR_SOURCE: - debug_printk(("timer XXX\n")); /* not supported */ return 0; } diff --git a/sound/core/seq/oss/seq_oss_timer.h b/sound/core/seq/oss/seq_oss_timer.h index 6e4dbd8504c..b995bd68ad1 100644 --- a/sound/core/seq/oss/seq_oss_timer.h +++ b/sound/core/seq/oss/seq_oss_timer.h @@ -27,8 +27,8 @@ /* * timer information definition */ -struct seq_oss_timer_t { - seq_oss_devinfo_t *dp; +struct seq_oss_timer { + struct seq_oss_devinfo *dp; reltime_t cur_tick; int realtime; int running; @@ -37,22 +37,22 @@ struct seq_oss_timer_t { }; -seq_oss_timer_t *snd_seq_oss_timer_new(seq_oss_devinfo_t *dp); -void snd_seq_oss_timer_delete(seq_oss_timer_t *dp); +struct seq_oss_timer *snd_seq_oss_timer_new(struct seq_oss_devinfo *dp); +void snd_seq_oss_timer_delete(struct seq_oss_timer *dp); -int snd_seq_oss_timer_start(seq_oss_timer_t *timer); -int snd_seq_oss_timer_stop(seq_oss_timer_t *timer); -int snd_seq_oss_timer_continue(seq_oss_timer_t *timer); -int snd_seq_oss_timer_tempo(seq_oss_timer_t *timer, int value); +int snd_seq_oss_timer_start(struct seq_oss_timer *timer); +int snd_seq_oss_timer_stop(struct seq_oss_timer *timer); +int snd_seq_oss_timer_continue(struct seq_oss_timer *timer); +int snd_seq_oss_timer_tempo(struct seq_oss_timer *timer, int value); #define snd_seq_oss_timer_reset snd_seq_oss_timer_start -int snd_seq_oss_timer_ioctl(seq_oss_timer_t *timer, unsigned int cmd, int __user *arg); +int snd_seq_oss_timer_ioctl(struct seq_oss_timer *timer, unsigned int cmd, int __user *arg); /* * get current processed time */ static inline abstime_t -snd_seq_oss_timer_cur_tick(seq_oss_timer_t *timer) +snd_seq_oss_timer_cur_tick(struct seq_oss_timer *timer) { return timer->cur_tick; } @@ -62,7 +62,7 @@ snd_seq_oss_timer_cur_tick(seq_oss_timer_t *timer) * is realtime event? */ static inline int -snd_seq_oss_timer_is_realtime(seq_oss_timer_t *timer) +snd_seq_oss_timer_is_realtime(struct seq_oss_timer *timer) { return timer->realtime; } diff --git a/sound/core/seq/oss/seq_oss_writeq.c b/sound/core/seq/oss/seq_oss_writeq.c index b2037802454..d50338bbc21 100644 --- a/sound/core/seq/oss/seq_oss_writeq.c +++ b/sound/core/seq/oss/seq_oss_writeq.c @@ -27,16 +27,17 @@ #include "../seq_lock.h" #include "../seq_clientmgr.h" #include <linux/wait.h> +#include <linux/slab.h> /* * create a write queue record */ -seq_oss_writeq_t * -snd_seq_oss_writeq_new(seq_oss_devinfo_t *dp, int maxlen) +struct seq_oss_writeq * +snd_seq_oss_writeq_new(struct seq_oss_devinfo *dp, int maxlen) { - seq_oss_writeq_t *q; - snd_seq_client_pool_t pool; + struct seq_oss_writeq *q; + struct snd_seq_client_pool pool; if ((q = kzalloc(sizeof(*q), GFP_KERNEL)) == NULL) return NULL; @@ -61,10 +62,12 @@ snd_seq_oss_writeq_new(seq_oss_devinfo_t *dp, int maxlen) * delete the write queue */ void -snd_seq_oss_writeq_delete(seq_oss_writeq_t *q) +snd_seq_oss_writeq_delete(struct seq_oss_writeq *q) { - snd_seq_oss_writeq_clear(q); /* to be sure */ - kfree(q); + if (q) { + snd_seq_oss_writeq_clear(q); /* to be sure */ + kfree(q); + } } @@ -72,9 +75,9 @@ snd_seq_oss_writeq_delete(seq_oss_writeq_t *q) * reset the write queue */ void -snd_seq_oss_writeq_clear(seq_oss_writeq_t *q) +snd_seq_oss_writeq_clear(struct seq_oss_writeq *q) { - snd_seq_remove_events_t reset; + struct snd_seq_remove_events reset; memset(&reset, 0, sizeof(reset)); reset.remove_mode = SNDRV_SEQ_REMOVE_OUTPUT; /* remove all */ @@ -88,9 +91,9 @@ snd_seq_oss_writeq_clear(seq_oss_writeq_t *q) * wait until the write buffer has enough room */ int -snd_seq_oss_writeq_sync(seq_oss_writeq_t *q) +snd_seq_oss_writeq_sync(struct seq_oss_writeq *q) { - seq_oss_devinfo_t *dp = q->dp; + struct seq_oss_devinfo *dp = q->dp; abstime_t time; time = snd_seq_oss_timer_cur_tick(dp->timer); @@ -98,8 +101,8 @@ snd_seq_oss_writeq_sync(seq_oss_writeq_t *q) return 0; /* already finished */ if (! q->sync_event_put) { - snd_seq_event_t ev; - evrec_t *rec; + struct snd_seq_event ev; + union evrec *rec; /* put echoback event */ memset(&ev, 0, sizeof(ev)); @@ -108,7 +111,7 @@ snd_seq_oss_writeq_sync(seq_oss_writeq_t *q) ev.time.tick = time; /* echo back to itself */ snd_seq_oss_fill_addr(dp, &ev, dp->addr.client, dp->addr.port); - rec = (evrec_t*)&ev.data; + rec = (union evrec *)&ev.data; rec->t.code = SEQ_SYNCTIMER; rec->t.time = time; q->sync_event_put = 1; @@ -128,7 +131,7 @@ snd_seq_oss_writeq_sync(seq_oss_writeq_t *q) * wake up sync - echo event was catched */ void -snd_seq_oss_writeq_wakeup(seq_oss_writeq_t *q, abstime_t time) +snd_seq_oss_writeq_wakeup(struct seq_oss_writeq *q, abstime_t time) { unsigned long flags; @@ -146,9 +149,9 @@ snd_seq_oss_writeq_wakeup(seq_oss_writeq_t *q, abstime_t time) * return the unused pool size */ int -snd_seq_oss_writeq_get_free_size(seq_oss_writeq_t *q) +snd_seq_oss_writeq_get_free_size(struct seq_oss_writeq *q) { - snd_seq_client_pool_t pool; + struct snd_seq_client_pool pool; pool.client = q->dp->cseq; snd_seq_oss_control(q->dp, SNDRV_SEQ_IOCTL_GET_CLIENT_POOL, &pool); return pool.output_free; @@ -159,9 +162,9 @@ snd_seq_oss_writeq_get_free_size(seq_oss_writeq_t *q) * set output threshold size from ioctl */ void -snd_seq_oss_writeq_set_output(seq_oss_writeq_t *q, int val) +snd_seq_oss_writeq_set_output(struct seq_oss_writeq *q, int val) { - snd_seq_client_pool_t pool; + struct snd_seq_client_pool pool; pool.client = q->dp->cseq; snd_seq_oss_control(q->dp, SNDRV_SEQ_IOCTL_GET_CLIENT_POOL, &pool); pool.output_room = val; diff --git a/sound/core/seq/oss/seq_oss_writeq.h b/sound/core/seq/oss/seq_oss_writeq.h index 6a13c85e239..c469d296756 100644 --- a/sound/core/seq/oss/seq_oss_writeq.h +++ b/sound/core/seq/oss/seq_oss_writeq.h @@ -25,8 +25,8 @@ #include "seq_oss_device.h" -struct seq_oss_writeq_t { - seq_oss_devinfo_t *dp; +struct seq_oss_writeq { + struct seq_oss_devinfo *dp; int maxlen; abstime_t sync_time; int sync_event_put; @@ -38,13 +38,13 @@ struct seq_oss_writeq_t { /* * seq_oss_writeq.c */ -seq_oss_writeq_t *snd_seq_oss_writeq_new(seq_oss_devinfo_t *dp, int maxlen); -void snd_seq_oss_writeq_delete(seq_oss_writeq_t *q); -void snd_seq_oss_writeq_clear(seq_oss_writeq_t *q); -int snd_seq_oss_writeq_sync(seq_oss_writeq_t *q); -void snd_seq_oss_writeq_wakeup(seq_oss_writeq_t *q, abstime_t time); -int snd_seq_oss_writeq_get_free_size(seq_oss_writeq_t *q); -void snd_seq_oss_writeq_set_output(seq_oss_writeq_t *q, int size); +struct seq_oss_writeq *snd_seq_oss_writeq_new(struct seq_oss_devinfo *dp, int maxlen); +void snd_seq_oss_writeq_delete(struct seq_oss_writeq *q); +void snd_seq_oss_writeq_clear(struct seq_oss_writeq *q); +int snd_seq_oss_writeq_sync(struct seq_oss_writeq *q); +void snd_seq_oss_writeq_wakeup(struct seq_oss_writeq *q, abstime_t time); +int snd_seq_oss_writeq_get_free_size(struct seq_oss_writeq *q); +void snd_seq_oss_writeq_set_output(struct seq_oss_writeq *q, int size); #endif diff --git a/sound/core/seq/seq.c b/sound/core/seq/seq.c index 24644150f24..71211056108 100644 --- a/sound/core/seq/seq.c +++ b/sound/core/seq/seq.c @@ -19,9 +19,9 @@ * */ -#include <sound/driver.h> #include <linux/init.h> -#include <linux/moduleparam.h> +#include <linux/module.h> +#include <linux/device.h> #include <sound/core.h> #include <sound/initval.h> @@ -33,18 +33,21 @@ #include "seq_timer.h" #include "seq_system.h" #include "seq_info.h" +#include <sound/minors.h> #include <sound/seq_device.h> #if defined(CONFIG_SND_SEQ_DUMMY_MODULE) -int seq_client_load[64] = {[0] = SNDRV_SEQ_CLIENT_DUMMY, [1 ... 63] = -1}; +int seq_client_load[15] = {[0] = SNDRV_SEQ_CLIENT_DUMMY, [1 ... 14] = -1}; #else -int seq_client_load[64] = {[0 ... 63] = -1}; +int seq_client_load[15] = {[0 ... 14] = -1}; #endif int seq_default_timer_class = SNDRV_TIMER_CLASS_GLOBAL; int seq_default_timer_sclass = SNDRV_TIMER_SCLASS_NONE; int seq_default_timer_card = -1; int seq_default_timer_device = -#ifdef CONFIG_SND_SEQ_RTCTIMER_DEFAULT +#ifdef CONFIG_SND_SEQ_HRTIMER_DEFAULT + SNDRV_TIMER_GLOBAL_HRTIMER +#elif defined(CONFIG_SND_SEQ_RTCTIMER_DEFAULT) SNDRV_TIMER_GLOBAL_RTC #else SNDRV_TIMER_GLOBAL_SYSTEM @@ -53,7 +56,7 @@ int seq_default_timer_device = int seq_default_timer_subdevice = 0; int seq_default_timer_resolution = 0; /* Hz */ -MODULE_AUTHOR("Frank van de Pol <fvdpol@coil.demon.nl>, Jaroslav Kysela <perex@suse.cz>"); +MODULE_AUTHOR("Frank van de Pol <fvdpol@coil.demon.nl>, Jaroslav Kysela <perex@perex.cz>"); MODULE_DESCRIPTION("Advanced Linux Sound Architecture sequencer."); MODULE_LICENSE("GPL"); @@ -72,6 +75,9 @@ MODULE_PARM_DESC(seq_default_timer_subdevice, "The default timer subdevice numbe module_param(seq_default_timer_resolution, int, 0644); MODULE_PARM_DESC(seq_default_timer_resolution, "The default timer resolution in Hz."); +MODULE_ALIAS_CHARDEV(CONFIG_SND_MAJOR, SNDRV_MINOR_SEQUENCER); +MODULE_ALIAS("devname:snd/seq"); + /* * INIT PART */ @@ -129,25 +135,3 @@ static void __exit alsa_seq_exit(void) module_init(alsa_seq_init) module_exit(alsa_seq_exit) - - /* seq_clientmgr.c */ -EXPORT_SYMBOL(snd_seq_create_kernel_client); -EXPORT_SYMBOL(snd_seq_delete_kernel_client); -EXPORT_SYMBOL(snd_seq_kernel_client_enqueue); -EXPORT_SYMBOL(snd_seq_kernel_client_enqueue_blocking); -EXPORT_SYMBOL(snd_seq_kernel_client_dispatch); -EXPORT_SYMBOL(snd_seq_kernel_client_ctl); -EXPORT_SYMBOL(snd_seq_kernel_client_write_poll); -EXPORT_SYMBOL(snd_seq_set_queue_tempo); - /* seq_memory.c */ -EXPORT_SYMBOL(snd_seq_expand_var_event); -EXPORT_SYMBOL(snd_seq_dump_var_event); - /* seq_ports.c */ -EXPORT_SYMBOL(snd_seq_event_port_attach); -EXPORT_SYMBOL(snd_seq_event_port_detach); - /* seq_lock.c */ -#if defined(CONFIG_SMP) || defined(CONFIG_SND_DEBUG) -/*EXPORT_SYMBOL(snd_seq_sleep_in_lock);*/ -/*EXPORT_SYMBOL(snd_seq_sleep_timeout_in_lock);*/ -EXPORT_SYMBOL(snd_use_lock_sync_helper); -#endif diff --git a/sound/core/seq/seq_clientmgr.c b/sound/core/seq/seq_clientmgr.c index a886db94b1f..225c73152ee 100644 --- a/sound/core/seq/seq_clientmgr.c +++ b/sound/core/seq/seq_clientmgr.c @@ -1,7 +1,7 @@ /* * ALSA sequencer Client Manager * Copyright (c) 1998-2001 by Frank van de Pol <fvdpol@coil.demon.nl> - * Jaroslav Kysela <perex@suse.cz> + * Jaroslav Kysela <perex@perex.cz> * Takashi Iwai <tiwai@suse.de> * * @@ -21,9 +21,8 @@ * */ -#include <sound/driver.h> #include <linux/init.h> -#include <linux/smp_lock.h> +#include <linux/export.h> #include <linux/slab.h> #include <sound/core.h> #include <sound/minors.h> @@ -47,25 +46,44 @@ * */ +/* + * There are four ranges of client numbers (last two shared): + * 0..15: global clients + * 16..127: statically allocated client numbers for cards 0..27 + * 128..191: dynamically allocated client numbers for cards 28..31 + * 128..191: dynamically allocated client numbers for applications + */ + +/* number of kernel non-card clients */ +#define SNDRV_SEQ_GLOBAL_CLIENTS 16 +/* clients per cards, for static clients */ +#define SNDRV_SEQ_CLIENTS_PER_CARD 4 +/* dynamically allocated client numbers (both kernel drivers and user space) */ +#define SNDRV_SEQ_DYNAMIC_CLIENTS_BEGIN 128 + #define SNDRV_SEQ_LFLG_INPUT 0x0001 #define SNDRV_SEQ_LFLG_OUTPUT 0x0002 #define SNDRV_SEQ_LFLG_OPEN (SNDRV_SEQ_LFLG_INPUT|SNDRV_SEQ_LFLG_OUTPUT) static DEFINE_SPINLOCK(clients_lock); -static DECLARE_MUTEX(register_mutex); +static DEFINE_MUTEX(register_mutex); /* * client table */ static char clienttablock[SNDRV_SEQ_MAX_CLIENTS]; -static client_t *clienttab[SNDRV_SEQ_MAX_CLIENTS]; -static usage_t client_usage; +static struct snd_seq_client *clienttab[SNDRV_SEQ_MAX_CLIENTS]; +static struct snd_seq_usage client_usage; /* * prototypes */ -static int bounce_error_event(client_t *client, snd_seq_event_t *event, int err, int atomic, int hop); -static int snd_seq_deliver_single_event(client_t *client, snd_seq_event_t *event, int filter, int atomic, int hop); +static int bounce_error_event(struct snd_seq_client *client, + struct snd_seq_event *event, + int err, int atomic, int hop); +static int snd_seq_deliver_single_event(struct snd_seq_client *client, + struct snd_seq_event *event, + int filter, int atomic, int hop); /* */ @@ -96,30 +114,30 @@ static inline unsigned short snd_seq_file_flags(struct file *file) } } -static inline int snd_seq_write_pool_allocated(client_t *client) +static inline int snd_seq_write_pool_allocated(struct snd_seq_client *client) { return snd_seq_total_cells(client->pool) > 0; } /* return pointer to client structure for specified id */ -static client_t *clientptr(int clientid) +static struct snd_seq_client *clientptr(int clientid) { if (clientid < 0 || clientid >= SNDRV_SEQ_MAX_CLIENTS) { - snd_printd("Seq: oops. Trying to get pointer to client %d\n", clientid); + pr_debug("ALSA: seq: oops. Trying to get pointer to client %d\n", + clientid); return NULL; } return clienttab[clientid]; } -extern int seq_client_load[]; - -client_t *snd_seq_client_use_ptr(int clientid) +struct snd_seq_client *snd_seq_client_use_ptr(int clientid) { unsigned long flags; - client_t *client; + struct snd_seq_client *client; if (clientid < 0 || clientid >= SNDRV_SEQ_MAX_CLIENTS) { - snd_printd("Seq: oops. Trying to get pointer to client %d\n", clientid); + pr_debug("ALSA: seq: oops. Trying to get pointer to client %d\n", + clientid); return NULL; } spin_lock_irqsave(&clients_lock, flags); @@ -131,26 +149,28 @@ client_t *snd_seq_client_use_ptr(int clientid) return NULL; } spin_unlock_irqrestore(&clients_lock, flags); -#ifdef CONFIG_KMOD - if (!in_interrupt() && current->fs->root) { - static char client_requested[64]; +#ifdef CONFIG_MODULES + if (!in_interrupt()) { + static char client_requested[SNDRV_SEQ_GLOBAL_CLIENTS]; static char card_requested[SNDRV_CARDS]; - if (clientid < 64) { + if (clientid < SNDRV_SEQ_GLOBAL_CLIENTS) { int idx; - if (! client_requested[clientid] && current->fs->root) { + if (!client_requested[clientid]) { client_requested[clientid] = 1; - for (idx = 0; idx < 64; idx++) { + for (idx = 0; idx < 15; idx++) { if (seq_client_load[idx] < 0) break; if (seq_client_load[idx] == clientid) { - request_module("snd-seq-client-%i", clientid); + request_module("snd-seq-client-%i", + clientid); break; } } } - } else if (clientid >= 64 && clientid < 128) { - int card = (clientid - 64) / 8; + } else if (clientid < SNDRV_SEQ_DYNAMIC_CLIENTS_BEGIN) { + int card = (clientid - SNDRV_SEQ_GLOBAL_CLIENTS) / + SNDRV_SEQ_CLIENTS_PER_CARD; if (card < snd_ecards_limit) { if (! card_requested[card]) { card_requested[card] = 1; @@ -174,14 +194,14 @@ client_t *snd_seq_client_use_ptr(int clientid) return client; } -static void usage_alloc(usage_t * res, int num) +static void usage_alloc(struct snd_seq_usage *res, int num) { res->cur += num; if (res->cur > res->peak) res->peak = res->cur; } -static void usage_free(usage_t * res, int num) +static void usage_free(struct snd_seq_usage *res, int num) { res->cur -= num; } @@ -196,11 +216,11 @@ int __init client_init_data(void) } -static client_t *seq_create_client1(int client_index, int poolsize) +static struct snd_seq_client *seq_create_client1(int client_index, int poolsize) { unsigned long flags; int c; - client_t *client; + struct snd_seq_client *client; /* init client data */ client = kzalloc(sizeof(*client), GFP_KERNEL); @@ -214,13 +234,15 @@ static client_t *seq_create_client1(int client_index, int poolsize) client->type = NO_CLIENT; snd_use_lock_init(&client->use_lock); rwlock_init(&client->ports_lock); - init_MUTEX(&client->ports_mutex); + mutex_init(&client->ports_mutex); INIT_LIST_HEAD(&client->ports_list_head); /* find free slot in the client table */ spin_lock_irqsave(&clients_lock, flags); if (client_index < 0) { - for (c = 128; c < SNDRV_SEQ_MAX_CLIENTS; c++) { + for (c = SNDRV_SEQ_DYNAMIC_CLIENTS_BEGIN; + c < SNDRV_SEQ_MAX_CLIENTS; + c++) { if (clienttab[c] || clienttablock[c]) continue; clienttab[client->number = c] = client; @@ -241,11 +263,12 @@ static client_t *seq_create_client1(int client_index, int poolsize) } -static int seq_free_client1(client_t *client) +static int seq_free_client1(struct snd_seq_client *client) { unsigned long flags; - snd_assert(client != NULL, return -EINVAL); + if (!client) + return 0; snd_seq_delete_all_ports(client); snd_seq_queue_client_leave(client->number); spin_lock_irqsave(&clients_lock, flags); @@ -263,12 +286,13 @@ static int seq_free_client1(client_t *client) } -static void seq_free_client(client_t * client) +static void seq_free_client(struct snd_seq_client * client) { - down(®ister_mutex); + mutex_lock(®ister_mutex); switch (client->type) { case NO_CLIENT: - snd_printk(KERN_WARNING "Seq: Trying to free unused client %d\n", client->number); + pr_warn("ALSA: seq: Trying to free unused client %d\n", + client->number); break; case USER_CLIENT: case KERNEL_CLIENT: @@ -277,9 +301,10 @@ static void seq_free_client(client_t * client) break; default: - snd_printk(KERN_ERR "Seq: Trying to free client %d with undefined type = %d\n", client->number, client->type); + pr_err("ALSA: seq: Trying to free client %d with undefined type = %d\n", + client->number, client->type); } - up(®ister_mutex); + mutex_unlock(®ister_mutex); snd_seq_system_client_ev_client_exit(client->number); } @@ -292,14 +317,19 @@ static void seq_free_client(client_t * client) static int snd_seq_open(struct inode *inode, struct file *file) { int c, mode; /* client id */ - client_t *client; - user_client_t *user; + struct snd_seq_client *client; + struct snd_seq_user_client *user; + int err; + + err = nonseekable_open(inode, file); + if (err < 0) + return err; - if (down_interruptible(®ister_mutex)) + if (mutex_lock_interruptible(®ister_mutex)) return -ERESTARTSYS; client = seq_create_client1(-1, SNDRV_SEQ_DEFAULT_EVENTS); if (client == NULL) { - up(®ister_mutex); + mutex_unlock(®ister_mutex); return -ENOMEM; /* failure code */ } @@ -319,14 +349,14 @@ static int snd_seq_open(struct inode *inode, struct file *file) if (user->fifo == NULL) { seq_free_client1(client); kfree(client); - up(®ister_mutex); + mutex_unlock(®ister_mutex); return -ENOMEM; } } usage_alloc(&client_usage, 1); client->type = USER_CLIENT; - up(®ister_mutex); + mutex_unlock(®ister_mutex); c = client->number; file->private_data = client; @@ -344,7 +374,7 @@ static int snd_seq_open(struct inode *inode, struct file *file) /* delete a user client */ static int snd_seq_release(struct inode *inode, struct file *file) { - client_t *client = (client_t *) file->private_data; + struct snd_seq_client *client = file->private_data; if (client) { seq_free_client(client); @@ -364,13 +394,14 @@ static int snd_seq_release(struct inode *inode, struct file *file) * -EINVAL no enough user-space buffer to write the whole event * -EFAULT seg. fault during copy to user space */ -static ssize_t snd_seq_read(struct file *file, char __user *buf, size_t count, loff_t *offset) +static ssize_t snd_seq_read(struct file *file, char __user *buf, size_t count, + loff_t *offset) { - client_t *client = (client_t *) file->private_data; - fifo_t *fifo; + struct snd_seq_client *client = file->private_data; + struct snd_seq_fifo *fifo; int err; long result = 0; - snd_seq_event_cell_t *cell; + struct snd_seq_event_cell *cell; if (!(snd_seq_file_flags(file) & SNDRV_SEQ_LFLG_INPUT)) return -ENXIO; @@ -379,7 +410,8 @@ static ssize_t snd_seq_read(struct file *file, char __user *buf, size_t count, l return -EFAULT; /* check client structures are in place */ - snd_assert(client != NULL, return -ENXIO); + if (snd_BUG_ON(!client)) + return -ENXIO; if (!client->accept_input || (fifo = client->data.user.fifo) == NULL) return -ENXIO; @@ -396,7 +428,7 @@ static ssize_t snd_seq_read(struct file *file, char __user *buf, size_t count, l snd_seq_fifo_lock(fifo); /* while data available in queue */ - while (count >= sizeof(snd_seq_event_t)) { + while (count >= sizeof(struct snd_seq_event)) { int nonblock; nonblock = (file->f_flags & O_NONBLOCK) || result > 0; @@ -404,34 +436,34 @@ static ssize_t snd_seq_read(struct file *file, char __user *buf, size_t count, l break; } if (snd_seq_ev_is_variable(&cell->event)) { - snd_seq_event_t tmpev; + struct snd_seq_event tmpev; tmpev = cell->event; tmpev.data.ext.len &= ~SNDRV_SEQ_EXT_MASK; - if (copy_to_user(buf, &tmpev, sizeof(snd_seq_event_t))) { + if (copy_to_user(buf, &tmpev, sizeof(struct snd_seq_event))) { err = -EFAULT; break; } - count -= sizeof(snd_seq_event_t); - buf += sizeof(snd_seq_event_t); + count -= sizeof(struct snd_seq_event); + buf += sizeof(struct snd_seq_event); err = snd_seq_expand_var_event(&cell->event, count, (char __force *)buf, 0, - sizeof(snd_seq_event_t)); + sizeof(struct snd_seq_event)); if (err < 0) break; result += err; count -= err; buf += err; } else { - if (copy_to_user(buf, &cell->event, sizeof(snd_seq_event_t))) { + if (copy_to_user(buf, &cell->event, sizeof(struct snd_seq_event))) { err = -EFAULT; break; } - count -= sizeof(snd_seq_event_t); - buf += sizeof(snd_seq_event_t); + count -= sizeof(struct snd_seq_event); + buf += sizeof(struct snd_seq_event); } snd_seq_cell_free(cell); cell = NULL; /* to be sure */ - result += sizeof(snd_seq_event_t); + result += sizeof(struct snd_seq_event); } if (err < 0) { @@ -449,7 +481,7 @@ static ssize_t snd_seq_read(struct file *file, char __user *buf, size_t count, l /* * check access permission to the port */ -static int check_port_perm(client_port_t *port, unsigned int flags) +static int check_port_perm(struct snd_seq_client_port *port, unsigned int flags) { if ((port->capability & flags) != flags) return 0; @@ -460,9 +492,10 @@ static int check_port_perm(client_port_t *port, unsigned int flags) * check if the destination client is available, and return the pointer * if filter is non-zero, client filter bitmap is tested. */ -static client_t *get_event_dest_client(snd_seq_event_t *event, int filter) +static struct snd_seq_client *get_event_dest_client(struct snd_seq_event *event, + int filter) { - client_t *dest; + struct snd_seq_client *dest; dest = snd_seq_client_use_ptr(event->dest.client); if (dest == NULL) @@ -493,10 +526,11 @@ __not_avail: * quoted in SNDRV_SEQ_EVENT_KERNEL_ERROR, since this requires no extra * kmalloc. */ -static int bounce_error_event(client_t *client, snd_seq_event_t *event, +static int bounce_error_event(struct snd_seq_client *client, + struct snd_seq_event *event, int err, int atomic, int hop) { - snd_seq_event_t bounce_ev; + struct snd_seq_event bounce_ev; int result; if (client == NULL || @@ -531,9 +565,10 @@ static int bounce_error_event(client_t *client, snd_seq_event_t *event, * of the given queue. * return non-zero if updated. */ -static int update_timestamp_of_queue(snd_seq_event_t *event, int queue, int real_time) +static int update_timestamp_of_queue(struct snd_seq_event *event, + int queue, int real_time) { - queue_t *q; + struct snd_seq_queue *q; q = queueptr(queue); if (! q) @@ -559,12 +594,12 @@ static int update_timestamp_of_queue(snd_seq_event_t *event, int queue, int real * RETURN VALUE: 0 : if succeeded * <0 : error */ -static int snd_seq_deliver_single_event(client_t *client, - snd_seq_event_t *event, +static int snd_seq_deliver_single_event(struct snd_seq_client *client, + struct snd_seq_event *event, int filter, int atomic, int hop) { - client_t *dest = NULL; - client_port_t *dest_port = NULL; + struct snd_seq_client *dest = NULL; + struct snd_seq_client_port *dest_port = NULL; int result = -ENOENT; int direct; @@ -596,7 +631,9 @@ static int snd_seq_deliver_single_event(client_t *client, case KERNEL_CLIENT: if (dest_port->event_input == NULL) break; - result = dest_port->event_input(event, direct, dest_port->private_data, atomic, hop); + result = dest_port->event_input(event, direct, + dest_port->private_data, + atomic, hop); break; default: break; @@ -618,16 +655,15 @@ static int snd_seq_deliver_single_event(client_t *client, /* * send the event to all subscribers: */ -static int deliver_to_subscribers(client_t *client, - snd_seq_event_t *event, +static int deliver_to_subscribers(struct snd_seq_client *client, + struct snd_seq_event *event, int atomic, int hop) { - subscribers_t *subs; - int err = 0, num_ev = 0; - snd_seq_event_t event_saved; - client_port_t *src_port; - struct list_head *p; - port_subs_info_t *grp; + struct snd_seq_subscribers *subs; + int err, result = 0, num_ev = 0; + struct snd_seq_event event_saved; + struct snd_seq_client_port *src_port; + struct snd_seq_port_subs_info *grp; src_port = snd_seq_port_use_ptr(client, event->source.port); if (src_port == NULL) @@ -641,8 +677,7 @@ static int deliver_to_subscribers(client_t *client, read_lock(&grp->list_lock); else down_read(&grp->list_mutex); - list_for_each(p, &grp->list_head) { - subs = list_entry(p, subscribers_t, src_list); + list_for_each_entry(subs, &grp->list_head, src_list) { event->dest = subs->info.dest; if (subs->info.flags & SNDRV_SEQ_PORT_SUBS_TIMESTAMP) /* convert time according to flag with subscription */ @@ -650,8 +685,12 @@ static int deliver_to_subscribers(client_t *client, subs->info.flags & SNDRV_SEQ_PORT_SUBS_TIME_REAL); err = snd_seq_deliver_single_event(client, event, 0, atomic, hop); - if (err < 0) - break; + if (err < 0) { + /* save first error that occurs and continue */ + if (!result) + result = err; + continue; + } num_ev++; /* restore original event record */ *event = event_saved; @@ -662,7 +701,7 @@ static int deliver_to_subscribers(client_t *client, up_read(&grp->list_mutex); *event = event_saved; /* restore */ snd_seq_port_unlock(src_port); - return (err < 0) ? err : num_ev; + return (result < 0) ? result : num_ev; } @@ -670,46 +709,49 @@ static int deliver_to_subscribers(client_t *client, /* * broadcast to all ports: */ -static int port_broadcast_event(client_t *client, - snd_seq_event_t *event, +static int port_broadcast_event(struct snd_seq_client *client, + struct snd_seq_event *event, int atomic, int hop) { - int num_ev = 0, err = 0; - client_t *dest_client; - struct list_head *p; + int num_ev = 0, err, result = 0; + struct snd_seq_client *dest_client; + struct snd_seq_client_port *port; dest_client = get_event_dest_client(event, SNDRV_SEQ_FILTER_BROADCAST); if (dest_client == NULL) return 0; /* no matching destination */ read_lock(&dest_client->ports_lock); - list_for_each(p, &dest_client->ports_list_head) { - client_port_t *port = list_entry(p, client_port_t, list); + list_for_each_entry(port, &dest_client->ports_list_head, list) { event->dest.port = port->addr.port; /* pass NULL as source client to avoid error bounce */ err = snd_seq_deliver_single_event(NULL, event, SNDRV_SEQ_FILTER_BROADCAST, atomic, hop); - if (err < 0) - break; + if (err < 0) { + /* save first error that occurs and continue */ + if (!result) + result = err; + continue; + } num_ev++; } read_unlock(&dest_client->ports_lock); snd_seq_client_unlock(dest_client); event->dest.port = SNDRV_SEQ_ADDRESS_BROADCAST; /* restore */ - return (err < 0) ? err : num_ev; + return (result < 0) ? result : num_ev; } /* * send the event to all clients: * if destination port is also ADDRESS_BROADCAST, deliver to all ports. */ -static int broadcast_event(client_t *client, - snd_seq_event_t *event, int atomic, int hop) +static int broadcast_event(struct snd_seq_client *client, + struct snd_seq_event *event, int atomic, int hop) { - int err = 0, num_ev = 0; + int err, result = 0, num_ev = 0; int dest; - snd_seq_addr_t addr; + struct snd_seq_addr addr; addr = event->dest; /* save */ @@ -726,20 +768,24 @@ static int broadcast_event(client_t *client, err = snd_seq_deliver_single_event(NULL, event, SNDRV_SEQ_FILTER_BROADCAST, atomic, hop); - if (err < 0) - break; + if (err < 0) { + /* save first error that occurs and continue */ + if (!result) + result = err; + continue; + } num_ev += err; } event->dest = addr; /* restore */ - return (err < 0) ? err : num_ev; + return (result < 0) ? result : num_ev; } /* multicast - not supported yet */ -static int multicast_event(client_t *client, snd_seq_event_t *event, +static int multicast_event(struct snd_seq_client *client, struct snd_seq_event *event, int atomic, int hop) { - snd_printd("seq: multicast not supported yet.\n"); + pr_debug("ALSA: seq: multicast not supported yet.\n"); return 0; /* ignored */ } #endif /* SUPPORT_BROADCAST */ @@ -753,14 +799,14 @@ static int multicast_event(client_t *client, snd_seq_event_t *event, * n == 0 : the event was not passed to any client. * n < 0 : error - event was not processed. */ -static int snd_seq_deliver_event(client_t *client, snd_seq_event_t *event, +static int snd_seq_deliver_event(struct snd_seq_client *client, struct snd_seq_event *event, int atomic, int hop) { int result; hop++; if (hop >= SNDRV_SEQ_MAX_HOPS) { - snd_printd("too long delivery path (%d:%d->%d:%d)\n", + pr_debug("ALSA: seq: too long delivery path (%d:%d->%d:%d)\n", event->source.client, event->source.port, event->dest.client, event->dest.port); return -EMLINK; @@ -794,12 +840,13 @@ static int snd_seq_deliver_event(client_t *client, snd_seq_event_t *event, * n == 0 : the event was not passed to any client. * n < 0 : error - event was not processed. */ -int snd_seq_dispatch_event(snd_seq_event_cell_t *cell, int atomic, int hop) +int snd_seq_dispatch_event(struct snd_seq_event_cell *cell, int atomic, int hop) { - client_t *client; + struct snd_seq_client *client; int result; - snd_assert(cell != NULL, return -EINVAL); + if (snd_BUG_ON(!cell)) + return -EINVAL; client = snd_seq_client_use_ptr(cell->event.source.client); if (client == NULL) { @@ -812,7 +859,7 @@ int snd_seq_dispatch_event(snd_seq_event_cell_t *cell, int atomic, int hop) * the event cell is re-used as a NOTE-OFF event and * enqueued again. */ - snd_seq_event_t tmpev, *ev; + struct snd_seq_event tmpev, *ev; /* reserve this event to enqueue note-off later */ tmpev = cell->event; @@ -865,12 +912,12 @@ int snd_seq_dispatch_event(snd_seq_event_cell_t *cell, int atomic, int hop) * if pool is empty and blocking is TRUE, sleep until a new cell is * available. */ -static int snd_seq_client_enqueue_event(client_t *client, - snd_seq_event_t *event, +static int snd_seq_client_enqueue_event(struct snd_seq_client *client, + struct snd_seq_event *event, struct file *file, int blocking, int atomic, int hop) { - snd_seq_event_cell_t *cell; + struct snd_seq_event_cell *cell; int err; /* special queue values - force direct passing */ @@ -886,7 +933,7 @@ static int snd_seq_client_enqueue_event(client_t *client, #endif if (event->dest.client == SNDRV_SEQ_ADDRESS_SUBSCRIBERS) { /* check presence of source port */ - client_port_t *src_port = snd_seq_port_use_ptr(client, event->source.port); + struct snd_seq_client_port *src_port = snd_seq_port_use_ptr(client, event->source.port); if (src_port == NULL) return -EINVAL; snd_seq_port_unlock(src_port); @@ -924,7 +971,7 @@ static int snd_seq_client_enqueue_event(client_t *client, * check validity of event type and data length. * return non-zero if invalid. */ -static int check_event_type_and_length(snd_seq_event_t *ev) +static int check_event_type_and_length(struct snd_seq_event *ev) { switch (snd_seq_ev_length_type(ev)) { case SNDRV_SEQ_EVENT_LENGTH_FIXED: @@ -937,8 +984,7 @@ static int check_event_type_and_length(snd_seq_event_t *ev) return -EINVAL; break; case SNDRV_SEQ_EVENT_LENGTH_VARUSR: - if (! snd_seq_ev_is_instr_type(ev) || - ! snd_seq_ev_is_direct(ev)) + if (! snd_seq_ev_is_direct(ev)) return -EINVAL; break; } @@ -957,18 +1003,20 @@ static int check_event_type_and_length(snd_seq_event_t *ev) * -EMLINK too many hops * others depends on return value from driver callback */ -static ssize_t snd_seq_write(struct file *file, const char __user *buf, size_t count, loff_t *offset) +static ssize_t snd_seq_write(struct file *file, const char __user *buf, + size_t count, loff_t *offset) { - client_t *client = (client_t *) file->private_data; + struct snd_seq_client *client = file->private_data; int written = 0, len; int err = -EINVAL; - snd_seq_event_t event; + struct snd_seq_event event; if (!(snd_seq_file_flags(file) & SNDRV_SEQ_LFLG_OUTPUT)) return -ENXIO; /* check client structures are in place */ - snd_assert(client != NULL, return -ENXIO); + if (snd_BUG_ON(!client)) + return -ENXIO; if (!client->accept_output || client->pool == NULL) return -ENXIO; @@ -980,7 +1028,7 @@ static ssize_t snd_seq_write(struct file *file, const char __user *buf, size_t c } /* only process whole events */ - while (count >= sizeof(snd_seq_event_t)) { + while (count >= sizeof(struct snd_seq_event)) { /* Read in the event header from the user */ len = sizeof(event); if (copy_from_user(&event, buf, len)) { @@ -1012,12 +1060,12 @@ static ssize_t snd_seq_write(struct file *file, const char __user *buf, size_t c /* set user space pointer */ event.data.ext.len = extlen | SNDRV_SEQ_EXT_USRPTR; event.data.ext.ptr = (char __force *)buf - + sizeof(snd_seq_event_t); + + sizeof(struct snd_seq_event); len += extlen; /* increment data length */ } else { #ifdef CONFIG_COMPAT if (client->convert32 && snd_seq_ev_is_varusr(&event)) { - void *ptr = compat_ptr(event.data.raw32.d[1]); + void *ptr = (void __force *)compat_ptr(event.data.raw32.d[1]); event.data.ext.ptr = ptr; } #endif @@ -1046,11 +1094,12 @@ static ssize_t snd_seq_write(struct file *file, const char __user *buf, size_t c */ static unsigned int snd_seq_poll(struct file *file, poll_table * wait) { - client_t *client = (client_t *) file->private_data; + struct snd_seq_client *client = file->private_data; unsigned int mask = 0; /* check client structures are in place */ - snd_assert(client != NULL, return -ENXIO); + if (snd_BUG_ON(!client)) + return -ENXIO; if ((snd_seq_file_flags(file) & SNDRV_SEQ_LFLG_INPUT) && client->data.user.fifo) { @@ -1076,9 +1125,9 @@ static unsigned int snd_seq_poll(struct file *file, poll_table * wait) /* SYSTEM_INFO ioctl() */ -static int snd_seq_ioctl_system_info(client_t *client, void __user *arg) +static int snd_seq_ioctl_system_info(struct snd_seq_client *client, void __user *arg) { - snd_seq_system_info_t info; + struct snd_seq_system_info info; memset(&info, 0, sizeof(info)); /* fill the info fields */ @@ -1096,10 +1145,10 @@ static int snd_seq_ioctl_system_info(client_t *client, void __user *arg) /* RUNNING_MODE ioctl() */ -static int snd_seq_ioctl_running_mode(client_t *client, void __user *arg) +static int snd_seq_ioctl_running_mode(struct snd_seq_client *client, void __user *arg) { - struct sndrv_seq_running_info info; - client_t *cptr; + struct snd_seq_running_info info; + struct snd_seq_client *cptr; int err = 0; if (copy_from_user(&info, arg, sizeof(info))) @@ -1133,7 +1182,8 @@ static int snd_seq_ioctl_running_mode(client_t *client, void __user *arg) } /* CLIENT_INFO ioctl() */ -static void get_client_info(client_t *cptr, snd_seq_client_info_t *info) +static void get_client_info(struct snd_seq_client *cptr, + struct snd_seq_client_info *info) { info->client = cptr->number; @@ -1147,10 +1197,11 @@ static void get_client_info(client_t *cptr, snd_seq_client_info_t *info) memset(info->reserved, 0, sizeof(info->reserved)); } -static int snd_seq_ioctl_get_client_info(client_t * client, void __user *arg) +static int snd_seq_ioctl_get_client_info(struct snd_seq_client *client, + void __user *arg) { - client_t *cptr; - snd_seq_client_info_t client_info; + struct snd_seq_client *cptr; + struct snd_seq_client_info client_info; if (copy_from_user(&client_info, arg, sizeof(client_info))) return -EFAULT; @@ -1170,9 +1221,10 @@ static int snd_seq_ioctl_get_client_info(client_t * client, void __user *arg) /* CLIENT_INFO ioctl() */ -static int snd_seq_ioctl_set_client_info(client_t * client, void __user *arg) +static int snd_seq_ioctl_set_client_info(struct snd_seq_client *client, + void __user *arg) { - snd_seq_client_info_t client_info; + struct snd_seq_client_info client_info; if (copy_from_user(&client_info, arg, sizeof(client_info))) return -EFAULT; @@ -1199,11 +1251,12 @@ static int snd_seq_ioctl_set_client_info(client_t * client, void __user *arg) /* * CREATE PORT ioctl() */ -static int snd_seq_ioctl_create_port(client_t * client, void __user *arg) +static int snd_seq_ioctl_create_port(struct snd_seq_client *client, + void __user *arg) { - client_port_t *port; - snd_seq_port_info_t info; - snd_seq_port_callback_t *callback; + struct snd_seq_client_port *port; + struct snd_seq_port_info info; + struct snd_seq_port_callback *callback; if (copy_from_user(&info, arg, sizeof(info))) return -EFAULT; @@ -1249,9 +1302,10 @@ static int snd_seq_ioctl_create_port(client_t * client, void __user *arg) /* * DELETE PORT ioctl() */ -static int snd_seq_ioctl_delete_port(client_t * client, void __user *arg) +static int snd_seq_ioctl_delete_port(struct snd_seq_client *client, + void __user *arg) { - snd_seq_port_info_t info; + struct snd_seq_port_info info; int err; /* set passed parameters */ @@ -1272,11 +1326,12 @@ static int snd_seq_ioctl_delete_port(client_t * client, void __user *arg) /* * GET_PORT_INFO ioctl() (on any client) */ -static int snd_seq_ioctl_get_port_info(client_t *client, void __user *arg) +static int snd_seq_ioctl_get_port_info(struct snd_seq_client *client, + void __user *arg) { - client_t *cptr; - client_port_t *port; - snd_seq_port_info_t info; + struct snd_seq_client *cptr; + struct snd_seq_client_port *port; + struct snd_seq_port_info info; if (copy_from_user(&info, arg, sizeof(info))) return -EFAULT; @@ -1304,10 +1359,11 @@ static int snd_seq_ioctl_get_port_info(client_t *client, void __user *arg) /* * SET_PORT_INFO ioctl() (only ports on this/own client) */ -static int snd_seq_ioctl_set_port_info(client_t * client, void __user *arg) +static int snd_seq_ioctl_set_port_info(struct snd_seq_client *client, + void __user *arg) { - client_port_t *port; - snd_seq_port_info_t info; + struct snd_seq_client_port *port; + struct snd_seq_port_info info; if (copy_from_user(&info, arg, sizeof(info))) return -EFAULT; @@ -1329,9 +1385,10 @@ static int snd_seq_ioctl_set_port_info(client_t * client, void __user *arg) #define PERM_RD (SNDRV_SEQ_PORT_CAP_READ|SNDRV_SEQ_PORT_CAP_SUBS_READ) #define PERM_WR (SNDRV_SEQ_PORT_CAP_WRITE|SNDRV_SEQ_PORT_CAP_SUBS_WRITE) -static int check_subscription_permission(client_t *client, client_port_t *sport, - client_port_t *dport, - snd_seq_port_subscribe_t *subs) +static int check_subscription_permission(struct snd_seq_client *client, + struct snd_seq_client_port *sport, + struct snd_seq_client_port *dport, + struct snd_seq_port_subscribe *subs) { if (client->number != subs->sender.client && client->number != subs->dest.client) { @@ -1363,9 +1420,10 @@ static int check_subscription_permission(client_t *client, client_port_t *sport, * client must be user client. */ int snd_seq_client_notify_subscription(int client, int port, - snd_seq_port_subscribe_t *info, int evtype) + struct snd_seq_port_subscribe *info, + int evtype) { - snd_seq_event_t event; + struct snd_seq_event event; memset(&event, 0, sizeof(event)); event.type = evtype; @@ -1379,12 +1437,13 @@ int snd_seq_client_notify_subscription(int client, int port, /* * add to port's subscription list IOCTL interface */ -static int snd_seq_ioctl_subscribe_port(client_t * client, void __user *arg) +static int snd_seq_ioctl_subscribe_port(struct snd_seq_client *client, + void __user *arg) { int result = -EINVAL; - client_t *receiver = NULL, *sender = NULL; - client_port_t *sport = NULL, *dport = NULL; - snd_seq_port_subscribe_t subs; + struct snd_seq_client *receiver = NULL, *sender = NULL; + struct snd_seq_client_port *sport = NULL, *dport = NULL; + struct snd_seq_port_subscribe subs; if (copy_from_user(&subs, arg, sizeof(subs))) return -EFAULT; @@ -1423,12 +1482,13 @@ static int snd_seq_ioctl_subscribe_port(client_t * client, void __user *arg) /* * remove from port's subscription list */ -static int snd_seq_ioctl_unsubscribe_port(client_t * client, void __user *arg) +static int snd_seq_ioctl_unsubscribe_port(struct snd_seq_client *client, + void __user *arg) { int result = -ENXIO; - client_t *receiver = NULL, *sender = NULL; - client_port_t *sport = NULL, *dport = NULL; - snd_seq_port_subscribe_t subs; + struct snd_seq_client *receiver = NULL, *sender = NULL; + struct snd_seq_client_port *sport = NULL, *dport = NULL; + struct snd_seq_port_subscribe subs; if (copy_from_user(&subs, arg, sizeof(subs))) return -EFAULT; @@ -1464,11 +1524,12 @@ static int snd_seq_ioctl_unsubscribe_port(client_t * client, void __user *arg) /* CREATE_QUEUE ioctl() */ -static int snd_seq_ioctl_create_queue(client_t *client, void __user *arg) +static int snd_seq_ioctl_create_queue(struct snd_seq_client *client, + void __user *arg) { - snd_seq_queue_info_t info; + struct snd_seq_queue_info info; int result; - queue_t *q; + struct snd_seq_queue *q; if (copy_from_user(&info, arg, sizeof(info))) return -EFAULT; @@ -1498,9 +1559,10 @@ static int snd_seq_ioctl_create_queue(client_t *client, void __user *arg) } /* DELETE_QUEUE ioctl() */ -static int snd_seq_ioctl_delete_queue(client_t *client, void __user *arg) +static int snd_seq_ioctl_delete_queue(struct snd_seq_client *client, + void __user *arg) { - snd_seq_queue_info_t info; + struct snd_seq_queue_info info; if (copy_from_user(&info, arg, sizeof(info))) return -EFAULT; @@ -1509,10 +1571,11 @@ static int snd_seq_ioctl_delete_queue(client_t *client, void __user *arg) } /* GET_QUEUE_INFO ioctl() */ -static int snd_seq_ioctl_get_queue_info(client_t *client, void __user *arg) +static int snd_seq_ioctl_get_queue_info(struct snd_seq_client *client, + void __user *arg) { - snd_seq_queue_info_t info; - queue_t *q; + struct snd_seq_queue_info info; + struct snd_seq_queue *q; if (copy_from_user(&info, arg, sizeof(info))) return -EFAULT; @@ -1535,10 +1598,11 @@ static int snd_seq_ioctl_get_queue_info(client_t *client, void __user *arg) } /* SET_QUEUE_INFO ioctl() */ -static int snd_seq_ioctl_set_queue_info(client_t *client, void __user *arg) +static int snd_seq_ioctl_set_queue_info(struct snd_seq_client *client, + void __user *arg) { - snd_seq_queue_info_t info; - queue_t *q; + struct snd_seq_queue_info info; + struct snd_seq_queue *q; if (copy_from_user(&info, arg, sizeof(info))) return -EFAULT; @@ -1570,10 +1634,10 @@ static int snd_seq_ioctl_set_queue_info(client_t *client, void __user *arg) } /* GET_NAMED_QUEUE ioctl() */ -static int snd_seq_ioctl_get_named_queue(client_t *client, void __user *arg) +static int snd_seq_ioctl_get_named_queue(struct snd_seq_client *client, void __user *arg) { - snd_seq_queue_info_t info; - queue_t *q; + struct snd_seq_queue_info info; + struct snd_seq_queue *q; if (copy_from_user(&info, arg, sizeof(info))) return -EFAULT; @@ -1593,11 +1657,12 @@ static int snd_seq_ioctl_get_named_queue(client_t *client, void __user *arg) } /* GET_QUEUE_STATUS ioctl() */ -static int snd_seq_ioctl_get_queue_status(client_t * client, void __user *arg) +static int snd_seq_ioctl_get_queue_status(struct snd_seq_client *client, + void __user *arg) { - snd_seq_queue_status_t status; - queue_t *queue; - seq_timer_t *tmr; + struct snd_seq_queue_status status; + struct snd_seq_queue *queue; + struct snd_seq_timer *tmr; if (copy_from_user(&status, arg, sizeof(status))) return -EFAULT; @@ -1626,11 +1691,12 @@ static int snd_seq_ioctl_get_queue_status(client_t * client, void __user *arg) /* GET_QUEUE_TEMPO ioctl() */ -static int snd_seq_ioctl_get_queue_tempo(client_t * client, void __user *arg) +static int snd_seq_ioctl_get_queue_tempo(struct snd_seq_client *client, + void __user *arg) { - snd_seq_queue_tempo_t tempo; - queue_t *queue; - seq_timer_t *tmr; + struct snd_seq_queue_tempo tempo; + struct snd_seq_queue *queue; + struct snd_seq_timer *tmr; if (copy_from_user(&tempo, arg, sizeof(tempo))) return -EFAULT; @@ -1656,17 +1722,20 @@ static int snd_seq_ioctl_get_queue_tempo(client_t * client, void __user *arg) /* SET_QUEUE_TEMPO ioctl() */ -int snd_seq_set_queue_tempo(int client, snd_seq_queue_tempo_t *tempo) +int snd_seq_set_queue_tempo(int client, struct snd_seq_queue_tempo *tempo) { if (!snd_seq_queue_check_access(tempo->queue, client)) return -EPERM; return snd_seq_queue_timer_set_tempo(tempo->queue, client, tempo); } -static int snd_seq_ioctl_set_queue_tempo(client_t * client, void __user *arg) +EXPORT_SYMBOL(snd_seq_set_queue_tempo); + +static int snd_seq_ioctl_set_queue_tempo(struct snd_seq_client *client, + void __user *arg) { int result; - snd_seq_queue_tempo_t tempo; + struct snd_seq_queue_tempo tempo; if (copy_from_user(&tempo, arg, sizeof(tempo))) return -EFAULT; @@ -1677,11 +1746,12 @@ static int snd_seq_ioctl_set_queue_tempo(client_t * client, void __user *arg) /* GET_QUEUE_TIMER ioctl() */ -static int snd_seq_ioctl_get_queue_timer(client_t * client, void __user *arg) +static int snd_seq_ioctl_get_queue_timer(struct snd_seq_client *client, + void __user *arg) { - snd_seq_queue_timer_t timer; - queue_t *queue; - seq_timer_t *tmr; + struct snd_seq_queue_timer timer; + struct snd_seq_queue *queue; + struct snd_seq_timer *tmr; if (copy_from_user(&timer, arg, sizeof(timer))) return -EFAULT; @@ -1690,7 +1760,7 @@ static int snd_seq_ioctl_get_queue_timer(client_t * client, void __user *arg) if (queue == NULL) return -EINVAL; - if (down_interruptible(&queue->timer_mutex)) { + if (mutex_lock_interruptible(&queue->timer_mutex)) { queuefree(queue); return -ERESTARTSYS; } @@ -1703,7 +1773,7 @@ static int snd_seq_ioctl_get_queue_timer(client_t * client, void __user *arg) timer.u.alsa.id = tmr->alsa_id; timer.u.alsa.resolution = tmr->preferred_resolution; } - up(&queue->timer_mutex); + mutex_unlock(&queue->timer_mutex); queuefree(queue); if (copy_to_user(arg, &timer, sizeof(timer))) @@ -1713,10 +1783,11 @@ static int snd_seq_ioctl_get_queue_timer(client_t * client, void __user *arg) /* SET_QUEUE_TIMER ioctl() */ -static int snd_seq_ioctl_set_queue_timer(client_t * client, void __user *arg) +static int snd_seq_ioctl_set_queue_timer(struct snd_seq_client *client, + void __user *arg) { int result = 0; - snd_seq_queue_timer_t timer; + struct snd_seq_queue_timer timer; if (copy_from_user(&timer, arg, sizeof(timer))) return -EFAULT; @@ -1725,13 +1796,13 @@ static int snd_seq_ioctl_set_queue_timer(client_t * client, void __user *arg) return -EINVAL; if (snd_seq_queue_check_access(timer.queue, client->number)) { - queue_t *q; - seq_timer_t *tmr; + struct snd_seq_queue *q; + struct snd_seq_timer *tmr; q = queueptr(timer.queue); if (q == NULL) return -ENXIO; - if (down_interruptible(&q->timer_mutex)) { + if (mutex_lock_interruptible(&q->timer_mutex)) { queuefree(q); return -ERESTARTSYS; } @@ -1743,7 +1814,7 @@ static int snd_seq_ioctl_set_queue_timer(client_t * client, void __user *arg) tmr->preferred_resolution = timer.u.alsa.resolution; } result = snd_seq_queue_timer_open(timer.queue); - up(&q->timer_mutex); + mutex_unlock(&q->timer_mutex); queuefree(q); } else { return -EPERM; @@ -1754,9 +1825,10 @@ static int snd_seq_ioctl_set_queue_timer(client_t * client, void __user *arg) /* GET_QUEUE_CLIENT ioctl() */ -static int snd_seq_ioctl_get_queue_client(client_t * client, void __user *arg) +static int snd_seq_ioctl_get_queue_client(struct snd_seq_client *client, + void __user *arg) { - snd_seq_queue_client_t info; + struct snd_seq_queue_client info; int used; if (copy_from_user(&info, arg, sizeof(info))) @@ -1775,10 +1847,11 @@ static int snd_seq_ioctl_get_queue_client(client_t * client, void __user *arg) /* SET_QUEUE_CLIENT ioctl() */ -static int snd_seq_ioctl_set_queue_client(client_t * client, void __user *arg) +static int snd_seq_ioctl_set_queue_client(struct snd_seq_client *client, + void __user *arg) { int err; - snd_seq_queue_client_t info; + struct snd_seq_queue_client info; if (copy_from_user(&info, arg, sizeof(info))) return -EFAULT; @@ -1794,10 +1867,11 @@ static int snd_seq_ioctl_set_queue_client(client_t * client, void __user *arg) /* GET_CLIENT_POOL ioctl() */ -static int snd_seq_ioctl_get_client_pool(client_t * client, void __user *arg) +static int snd_seq_ioctl_get_client_pool(struct snd_seq_client *client, + void __user *arg) { - snd_seq_client_pool_t info; - client_t *cptr; + struct snd_seq_client_pool info; + struct snd_seq_client *cptr; if (copy_from_user(&info, arg, sizeof(info))) return -EFAULT; @@ -1809,8 +1883,7 @@ static int snd_seq_ioctl_get_client_pool(client_t * client, void __user *arg) info.output_pool = cptr->pool->size; info.output_room = cptr->pool->room; info.output_free = info.output_pool; - if (cptr->pool) - info.output_free = snd_seq_unused_cells(cptr->pool); + info.output_free = snd_seq_unused_cells(cptr->pool); if (cptr->type == USER_CLIENT) { info.input_pool = cptr->data.user.fifo_pool_size; info.input_free = info.input_pool; @@ -1828,9 +1901,10 @@ static int snd_seq_ioctl_get_client_pool(client_t * client, void __user *arg) } /* SET_CLIENT_POOL ioctl() */ -static int snd_seq_ioctl_set_client_pool(client_t * client, void __user *arg) +static int snd_seq_ioctl_set_client_pool(struct snd_seq_client *client, + void __user *arg) { - snd_seq_client_pool_t info; + struct snd_seq_client_pool info; int rc; if (copy_from_user(&info, arg, sizeof(info))) @@ -1872,9 +1946,10 @@ static int snd_seq_ioctl_set_client_pool(client_t * client, void __user *arg) /* REMOVE_EVENTS ioctl() */ -static int snd_seq_ioctl_remove_events(client_t * client, void __user *arg) +static int snd_seq_ioctl_remove_events(struct snd_seq_client *client, + void __user *arg) { - snd_seq_remove_events_t info; + struct snd_seq_remove_events info; if (copy_from_user(&info, arg, sizeof(info))) return -EFAULT; @@ -1901,13 +1976,14 @@ static int snd_seq_ioctl_remove_events(client_t * client, void __user *arg) /* * get subscription info */ -static int snd_seq_ioctl_get_subscription(client_t *client, void __user *arg) +static int snd_seq_ioctl_get_subscription(struct snd_seq_client *client, + void __user *arg) { int result; - client_t *sender = NULL; - client_port_t *sport = NULL; - snd_seq_port_subscribe_t subs; - subscribers_t *p; + struct snd_seq_client *sender = NULL; + struct snd_seq_client_port *sport = NULL; + struct snd_seq_port_subscribe subs; + struct snd_seq_subscribers *p; if (copy_from_user(&subs, arg, sizeof(subs))) return -EFAULT; @@ -1940,13 +2016,14 @@ static int snd_seq_ioctl_get_subscription(client_t *client, void __user *arg) /* * get subscription info - check only its presence */ -static int snd_seq_ioctl_query_subs(client_t *client, void __user *arg) +static int snd_seq_ioctl_query_subs(struct snd_seq_client *client, + void __user *arg) { int result = -ENXIO; - client_t *cptr = NULL; - client_port_t *port = NULL; - snd_seq_query_subs_t subs; - port_subs_info_t *group; + struct snd_seq_client *cptr = NULL; + struct snd_seq_client_port *port = NULL; + struct snd_seq_query_subs subs; + struct snd_seq_port_subs_info *group; struct list_head *p; int i; @@ -1977,12 +2054,12 @@ static int snd_seq_ioctl_query_subs(client_t *client, void __user *arg) list_for_each(p, &group->list_head) { if (i++ == subs.index) { /* found! */ - subscribers_t *s; + struct snd_seq_subscribers *s; if (subs.type == SNDRV_SEQ_QUERY_SUBS_READ) { - s = list_entry(p, subscribers_t, src_list); + s = list_entry(p, struct snd_seq_subscribers, src_list); subs.addr = s->info.dest; } else { - s = list_entry(p, subscribers_t, dest_list); + s = list_entry(p, struct snd_seq_subscribers, dest_list); subs.addr = s->info.sender; } subs.flags = s->info.flags; @@ -2009,10 +2086,11 @@ static int snd_seq_ioctl_query_subs(client_t *client, void __user *arg) /* * query next client */ -static int snd_seq_ioctl_query_next_client(client_t *client, void __user *arg) +static int snd_seq_ioctl_query_next_client(struct snd_seq_client *client, + void __user *arg) { - client_t *cptr = NULL; - snd_seq_client_info_t info; + struct snd_seq_client *cptr = NULL; + struct snd_seq_client_info info; if (copy_from_user(&info, arg, sizeof(info))) return -EFAULT; @@ -2040,11 +2118,12 @@ static int snd_seq_ioctl_query_next_client(client_t *client, void __user *arg) /* * query next port */ -static int snd_seq_ioctl_query_next_port(client_t *client, void __user *arg) +static int snd_seq_ioctl_query_next_port(struct snd_seq_client *client, + void __user *arg) { - client_t *cptr; - client_port_t *port = NULL; - snd_seq_port_info_t info; + struct snd_seq_client *cptr; + struct snd_seq_client_port *port = NULL; + struct snd_seq_port_info info; if (copy_from_user(&info, arg, sizeof(info))) return -EFAULT; @@ -2075,7 +2154,7 @@ static int snd_seq_ioctl_query_next_port(client_t *client, void __user *arg) static struct seq_ioctl_table { unsigned int cmd; - int (*func)(client_t *client, void __user * arg); + int (*func)(struct snd_seq_client *client, void __user * arg); } ioctl_tables[] = { { SNDRV_SEQ_IOCTL_SYSTEM_INFO, snd_seq_ioctl_system_info }, { SNDRV_SEQ_IOCTL_RUNNING_MODE, snd_seq_ioctl_running_mode }, @@ -2109,7 +2188,8 @@ static struct seq_ioctl_table { { 0, NULL }, }; -static int snd_seq_do_ioctl(client_t *client, unsigned int cmd, void __user *arg) +static int snd_seq_do_ioctl(struct snd_seq_client *client, unsigned int cmd, + void __user *arg) { struct seq_ioctl_table *p; @@ -2128,7 +2208,7 @@ static int snd_seq_do_ioctl(client_t *client, unsigned int cmd, void __user *arg if (p->cmd == cmd) return p->func(client, arg); } - snd_printd("seq unknown ioctl() 0x%x (type='%c', number=0x%2x)\n", + pr_debug("ALSA: seq unknown ioctl() 0x%x (type='%c', number=0x%02x)\n", cmd, _IOC_TYPE(cmd), _IOC_NR(cmd)); return -ENOTTY; } @@ -2136,9 +2216,10 @@ static int snd_seq_do_ioctl(client_t *client, unsigned int cmd, void __user *arg static long snd_seq_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { - client_t *client = (client_t *) file->private_data; + struct snd_seq_client *client = file->private_data; - snd_assert(client != NULL, return -ENXIO); + if (snd_BUG_ON(!client)) + return -ENXIO; return snd_seq_do_ioctl(client, cmd, (void __user *) arg); } @@ -2153,41 +2234,47 @@ static long snd_seq_ioctl(struct file *file, unsigned int cmd, unsigned long arg /* exported to kernel modules */ -int snd_seq_create_kernel_client(snd_card_t *card, int client_index, snd_seq_client_callback_t * callback) +int snd_seq_create_kernel_client(struct snd_card *card, int client_index, + const char *name_fmt, ...) { - client_t *client; + struct snd_seq_client *client; + va_list args; - snd_assert(! in_interrupt(), return -EBUSY); + if (snd_BUG_ON(in_interrupt())) + return -EBUSY; - if (callback == NULL) - return -EINVAL; - if (card && client_index > 7) + if (card && client_index >= SNDRV_SEQ_CLIENTS_PER_CARD) return -EINVAL; - if (card == NULL && client_index > 63) + if (card == NULL && client_index >= SNDRV_SEQ_GLOBAL_CLIENTS) return -EINVAL; - if (card) - client_index += 64 + (card->number << 3); - if (down_interruptible(®ister_mutex)) + if (mutex_lock_interruptible(®ister_mutex)) return -ERESTARTSYS; + + if (card) { + client_index += SNDRV_SEQ_GLOBAL_CLIENTS + + card->number * SNDRV_SEQ_CLIENTS_PER_CARD; + if (client_index >= SNDRV_SEQ_DYNAMIC_CLIENTS_BEGIN) + client_index = -1; + } + /* empty write queue as default */ client = seq_create_client1(client_index, 0); if (client == NULL) { - up(®ister_mutex); + mutex_unlock(®ister_mutex); return -EBUSY; /* failure code */ } usage_alloc(&client_usage, 1); - client->accept_input = callback->allow_output; - client->accept_output = callback->allow_input; + client->accept_input = 1; + client->accept_output = 1; - /* fill client data */ - client->data.kernel.card = card; - client->data.kernel.private_data = callback->private_data; - sprintf(client->name, "Client-%d", client->number); + va_start(args, name_fmt); + vsnprintf(client->name, sizeof(client->name), name_fmt, args); + va_end(args); client->type = KERNEL_CLIENT; - up(®ister_mutex); + mutex_unlock(®ister_mutex); /* make others aware this new client */ snd_seq_system_client_ev_client_start(client->number); @@ -2196,12 +2283,15 @@ int snd_seq_create_kernel_client(snd_card_t *card, int client_index, snd_seq_cli return client->number; } +EXPORT_SYMBOL(snd_seq_create_kernel_client); + /* exported to kernel modules */ int snd_seq_delete_kernel_client(int client) { - client_t *ptr; + struct snd_seq_client *ptr; - snd_assert(! in_interrupt(), return -EBUSY); + if (snd_BUG_ON(in_interrupt())) + return -EBUSY; ptr = clientptr(client); if (ptr == NULL) @@ -2212,18 +2302,20 @@ int snd_seq_delete_kernel_client(int client) return 0; } +EXPORT_SYMBOL(snd_seq_delete_kernel_client); /* skeleton to enqueue event, called from snd_seq_kernel_client_enqueue * and snd_seq_kernel_client_enqueue_blocking */ -static int kernel_client_enqueue(int client, snd_seq_event_t *ev, +static int kernel_client_enqueue(int client, struct snd_seq_event *ev, struct file *file, int blocking, int atomic, int hop) { - client_t *cptr; + struct snd_seq_client *cptr; int result; - snd_assert(ev != NULL, return -EINVAL); + if (snd_BUG_ON(!ev)) + return -EINVAL; if (ev->type == SNDRV_SEQ_EVENT_NONE) return 0; /* ignore this */ @@ -2254,24 +2346,27 @@ static int kernel_client_enqueue(int client, snd_seq_event_t *ev, * * RETURN VALUE: zero if succeed, negative if error */ -int snd_seq_kernel_client_enqueue(int client, snd_seq_event_t * ev, +int snd_seq_kernel_client_enqueue(int client, struct snd_seq_event * ev, int atomic, int hop) { return kernel_client_enqueue(client, ev, NULL, 0, atomic, hop); } +EXPORT_SYMBOL(snd_seq_kernel_client_enqueue); + /* * exported, called by kernel clients to enqueue events (with blocking) * * RETURN VALUE: zero if succeed, negative if error */ -int snd_seq_kernel_client_enqueue_blocking(int client, snd_seq_event_t * ev, +int snd_seq_kernel_client_enqueue_blocking(int client, struct snd_seq_event * ev, struct file *file, int atomic, int hop) { return kernel_client_enqueue(client, ev, file, 1, atomic, hop); } +EXPORT_SYMBOL(snd_seq_kernel_client_enqueue_blocking); /* * exported, called by kernel clients to dispatch events directly to other @@ -2280,13 +2375,14 @@ int snd_seq_kernel_client_enqueue_blocking(int client, snd_seq_event_t * ev, * RETURN VALUE: negative = delivery failed, * zero, or positive: the number of delivered events */ -int snd_seq_kernel_client_dispatch(int client, snd_seq_event_t * ev, +int snd_seq_kernel_client_dispatch(int client, struct snd_seq_event * ev, int atomic, int hop) { - client_t *cptr; + struct snd_seq_client *cptr; int result; - snd_assert(ev != NULL, return -EINVAL); + if (snd_BUG_ON(!ev)) + return -EINVAL; /* fill in client number */ ev->queue = SNDRV_SEQ_QUEUE_DIRECT; @@ -2308,6 +2404,7 @@ int snd_seq_kernel_client_dispatch(int client, snd_seq_event_t * ev, return result; } +EXPORT_SYMBOL(snd_seq_kernel_client_dispatch); /* * exported, called by kernel clients to perform same functions as with @@ -2315,7 +2412,7 @@ int snd_seq_kernel_client_dispatch(int client, snd_seq_event_t * ev, */ int snd_seq_kernel_client_ctl(int clientid, unsigned int cmd, void *arg) { - client_t *client; + struct snd_seq_client *client; mm_segment_t fs; int result; @@ -2323,16 +2420,17 @@ int snd_seq_kernel_client_ctl(int clientid, unsigned int cmd, void *arg) if (client == NULL) return -ENXIO; fs = snd_enter_user(); - result = snd_seq_do_ioctl(client, cmd, (void __user *)arg); + result = snd_seq_do_ioctl(client, cmd, (void __force __user *)arg); snd_leave_user(fs); return result; } +EXPORT_SYMBOL(snd_seq_kernel_client_ctl); /* exported (for OSS emulator) */ int snd_seq_kernel_client_write_poll(int clientid, struct file *file, poll_table *wait) { - client_t *client; + struct snd_seq_client *client; client = clientptr(clientid); if (client == NULL) @@ -2345,15 +2443,20 @@ int snd_seq_kernel_client_write_poll(int clientid, struct file *file, poll_table return 0; } +EXPORT_SYMBOL(snd_seq_kernel_client_write_poll); + /*---------------------------------------------------------------------------*/ +#ifdef CONFIG_PROC_FS /* * /proc interface */ -static void snd_seq_info_dump_subscribers(snd_info_buffer_t *buffer, port_subs_info_t *group, int is_src, char *msg) +static void snd_seq_info_dump_subscribers(struct snd_info_buffer *buffer, + struct snd_seq_port_subs_info *group, + int is_src, char *msg) { struct list_head *p; - subscribers_t *s; + struct snd_seq_subscribers *s; int count = 0; down_read(&group->list_mutex); @@ -2364,9 +2467,9 @@ static void snd_seq_info_dump_subscribers(snd_info_buffer_t *buffer, port_subs_i snd_iprintf(buffer, msg); list_for_each(p, &group->list_head) { if (is_src) - s = list_entry(p, subscribers_t, src_list); + s = list_entry(p, struct snd_seq_subscribers, src_list); else - s = list_entry(p, subscribers_t, dest_list); + s = list_entry(p, struct snd_seq_subscribers, dest_list); if (count++) snd_iprintf(buffer, ", "); snd_iprintf(buffer, "%d:%d", @@ -2387,13 +2490,13 @@ static void snd_seq_info_dump_subscribers(snd_info_buffer_t *buffer, port_subs_i #define FLAG_PERM_DUPLEX(perm) ((perm) & SNDRV_SEQ_PORT_CAP_DUPLEX ? 'X' : '-') -static void snd_seq_info_dump_ports(snd_info_buffer_t *buffer, client_t *client) +static void snd_seq_info_dump_ports(struct snd_info_buffer *buffer, + struct snd_seq_client *client) { - struct list_head *l; + struct snd_seq_client_port *p; - down(&client->ports_mutex); - list_for_each(l, &client->ports_list_head) { - client_port_t *p = list_entry(l, client_port_t, list); + mutex_lock(&client->ports_mutex); + list_for_each_entry(p, &client->ports_list_head, list) { snd_iprintf(buffer, " Port %3d : \"%s\" (%c%c%c%c)\n", p->addr.port, p->name, FLAG_PERM_RD(p->capability), @@ -2403,17 +2506,16 @@ static void snd_seq_info_dump_ports(snd_info_buffer_t *buffer, client_t *client) snd_seq_info_dump_subscribers(buffer, &p->c_src, 1, " Connecting To: "); snd_seq_info_dump_subscribers(buffer, &p->c_dest, 0, " Connected From: "); } - up(&client->ports_mutex); + mutex_unlock(&client->ports_mutex); } /* exported to seq_info.c */ -void snd_seq_info_clients_read(snd_info_entry_t *entry, - snd_info_buffer_t * buffer) +void snd_seq_info_clients_read(struct snd_info_entry *entry, + struct snd_info_buffer *buffer) { - extern void snd_seq_info_pool(snd_info_buffer_t * buffer, pool_t * pool, char *space); int c; - client_t *client; + struct snd_seq_client *client; snd_iprintf(buffer, "Client info\n"); snd_iprintf(buffer, " cur clients : %d\n", client_usage.cur); @@ -2447,7 +2549,7 @@ void snd_seq_info_clients_read(snd_info_entry_t *entry, snd_seq_client_unlock(client); } } - +#endif /* CONFIG_PROC_FS */ /*---------------------------------------------------------------------------*/ @@ -2456,25 +2558,19 @@ void snd_seq_info_clients_read(snd_info_entry_t *entry, * REGISTRATION PART */ -static struct file_operations snd_seq_f_ops = +static const struct file_operations snd_seq_f_ops = { .owner = THIS_MODULE, .read = snd_seq_read, .write = snd_seq_write, .open = snd_seq_open, .release = snd_seq_release, + .llseek = no_llseek, .poll = snd_seq_poll, .unlocked_ioctl = snd_seq_ioctl, .compat_ioctl = snd_seq_ioctl_compat, }; -static snd_minor_t snd_seq_reg = -{ - .comment = "sequencer", - .f_ops = &snd_seq_f_ops, -}; - - /* * register sequencer device */ @@ -2482,15 +2578,16 @@ int __init snd_sequencer_device_init(void) { int err; - if (down_interruptible(®ister_mutex)) + if (mutex_lock_interruptible(®ister_mutex)) return -ERESTARTSYS; - if ((err = snd_register_device(SNDRV_DEVICE_TYPE_SEQUENCER, NULL, 0, &snd_seq_reg, "seq")) < 0) { - up(®ister_mutex); + if ((err = snd_register_device(SNDRV_DEVICE_TYPE_SEQUENCER, NULL, 0, + &snd_seq_f_ops, NULL, "seq")) < 0) { + mutex_unlock(®ister_mutex); return err; } - up(®ister_mutex); + mutex_unlock(®ister_mutex); return 0; } diff --git a/sound/core/seq/seq_clientmgr.h b/sound/core/seq/seq_clientmgr.h index 3715c36183d..20f0a725ec7 100644 --- a/sound/core/seq/seq_clientmgr.h +++ b/sound/core/seq/seq_clientmgr.h @@ -30,24 +30,21 @@ /* client manager */ -struct _snd_seq_user_client { +struct snd_seq_user_client { struct file *file; /* file struct of client */ /* ... */ /* fifo */ - fifo_t *fifo; /* queue for incoming events */ + struct snd_seq_fifo *fifo; /* queue for incoming events */ int fifo_pool_size; }; -struct _snd_seq_kernel_client { - snd_card_t *card; - /* pointer to client functions */ - void *private_data; /* private data for client */ +struct snd_seq_kernel_client { /* ... */ }; -struct _snd_seq_client { +struct snd_seq_client { snd_seq_client_type_t type; unsigned int accept_input: 1, accept_output: 1; @@ -61,44 +58,46 @@ struct _snd_seq_client { int num_ports; /* number of ports */ struct list_head ports_list_head; rwlock_t ports_lock; - struct semaphore ports_mutex; + struct mutex ports_mutex; int convert32; /* convert 32->64bit */ /* output pool */ - pool_t *pool; /* memory pool for this client */ + struct snd_seq_pool *pool; /* memory pool for this client */ union { - user_client_t user; - kernel_client_t kernel; + struct snd_seq_user_client user; + struct snd_seq_kernel_client kernel; } data; }; /* usage statistics */ -typedef struct { +struct snd_seq_usage { int cur; int peak; -} usage_t; +}; -extern int client_init_data(void); -extern int snd_sequencer_device_init(void); -extern void snd_sequencer_device_done(void); +int client_init_data(void); +int snd_sequencer_device_init(void); +void snd_sequencer_device_done(void); /* get locked pointer to client */ -extern client_t *snd_seq_client_use_ptr(int clientid); +struct snd_seq_client *snd_seq_client_use_ptr(int clientid); /* unlock pointer to client */ #define snd_seq_client_unlock(client) snd_use_lock_free(&(client)->use_lock) /* dispatch event to client(s) */ -extern int snd_seq_dispatch_event(snd_seq_event_cell_t *cell, int atomic, int hop); +int snd_seq_dispatch_event(struct snd_seq_event_cell *cell, int atomic, int hop); /* exported to other modules */ -extern int snd_seq_register_kernel_client(snd_seq_client_callback_t *callback, void *private_data); -extern int snd_seq_unregister_kernel_client(int client); -extern int snd_seq_kernel_client_enqueue(int client, snd_seq_event_t *ev, int atomic, int hop); -int snd_seq_kernel_client_enqueue_blocking(int client, snd_seq_event_t * ev, struct file *file, int atomic, int hop); +int snd_seq_kernel_client_enqueue(int client, struct snd_seq_event *ev, int atomic, int hop); +int snd_seq_kernel_client_enqueue_blocking(int client, struct snd_seq_event * ev, + struct file *file, int atomic, int hop); int snd_seq_kernel_client_write_poll(int clientid, struct file *file, poll_table *wait); -int snd_seq_client_notify_subscription(int client, int port, snd_seq_port_subscribe_t *info, int evtype); +int snd_seq_client_notify_subscription(int client, int port, + struct snd_seq_port_subscribe *info, int evtype); + +extern int seq_client_load[15]; #endif diff --git a/sound/core/seq/seq_compat.c b/sound/core/seq/seq_compat.c index 902ad8b0c35..81f7c109dc4 100644 --- a/sound/core/seq/seq_compat.c +++ b/sound/core/seq/seq_compat.c @@ -21,9 +21,10 @@ /* This file included from seq.c */ #include <linux/compat.h> +#include <linux/slab.h> -struct sndrv_seq_port_info32 { - struct sndrv_seq_addr addr; /* client/port numbers */ +struct snd_seq_port_info32 { + struct snd_seq_addr addr; /* client/port numbers */ char name[64]; /* port name */ u32 capability; /* port capability bits */ @@ -41,19 +42,18 @@ struct sndrv_seq_port_info32 { char reserved[59]; /* for future use */ }; -static int snd_seq_call_port_info_ioctl(client_t *client, unsigned int cmd, - struct sndrv_seq_port_info32 __user *data32) +static int snd_seq_call_port_info_ioctl(struct snd_seq_client *client, unsigned int cmd, + struct snd_seq_port_info32 __user *data32) { int err = -EFAULT; - snd_seq_port_info_t *data; + struct snd_seq_port_info *data; mm_segment_t fs; - data = kmalloc(sizeof(*data), GFP_KERNEL); - if (! data) - return -ENOMEM; + data = memdup_user(data32, sizeof(*data32)); + if (IS_ERR(data)) + return PTR_ERR(data); - if (copy_from_user(data, data32, sizeof(*data32)) || - get_user(data->flags, &data32->flags) || + if (get_user(data->flags, &data32->flags) || get_user(data->time_queue, &data32->time_queue)) goto error; data->kernel = NULL; @@ -80,19 +80,20 @@ static int snd_seq_call_port_info_ioctl(client_t *client, unsigned int cmd, */ enum { - SNDRV_SEQ_IOCTL_CREATE_PORT32 = _IOWR('S', 0x20, struct sndrv_seq_port_info32), - SNDRV_SEQ_IOCTL_DELETE_PORT32 = _IOW ('S', 0x21, struct sndrv_seq_port_info32), - SNDRV_SEQ_IOCTL_GET_PORT_INFO32 = _IOWR('S', 0x22, struct sndrv_seq_port_info32), - SNDRV_SEQ_IOCTL_SET_PORT_INFO32 = _IOW ('S', 0x23, struct sndrv_seq_port_info32), - SNDRV_SEQ_IOCTL_QUERY_NEXT_PORT32 = _IOWR('S', 0x52, struct sndrv_seq_port_info32), + SNDRV_SEQ_IOCTL_CREATE_PORT32 = _IOWR('S', 0x20, struct snd_seq_port_info32), + SNDRV_SEQ_IOCTL_DELETE_PORT32 = _IOW ('S', 0x21, struct snd_seq_port_info32), + SNDRV_SEQ_IOCTL_GET_PORT_INFO32 = _IOWR('S', 0x22, struct snd_seq_port_info32), + SNDRV_SEQ_IOCTL_SET_PORT_INFO32 = _IOW ('S', 0x23, struct snd_seq_port_info32), + SNDRV_SEQ_IOCTL_QUERY_NEXT_PORT32 = _IOWR('S', 0x52, struct snd_seq_port_info32), }; static long snd_seq_ioctl_compat(struct file *file, unsigned int cmd, unsigned long arg) { - client_t *client = (client_t *) file->private_data; + struct snd_seq_client *client = file->private_data; void __user *argp = compat_ptr(arg); - snd_assert(client != NULL, return -ENXIO); + if (snd_BUG_ON(!client)) + return -ENXIO; switch (cmd) { case SNDRV_SEQ_IOCTL_PVERSION: diff --git a/sound/core/seq/seq_device.c b/sound/core/seq/seq_device.c index 252b5273100..91a786a783e 100644 --- a/sound/core/seq/seq_device.c +++ b/sound/core/seq/seq_device.c @@ -36,8 +36,8 @@ * */ -#include <sound/driver.h> #include <linux/init.h> +#include <linux/module.h> #include <sound/core.h> #include <sound/info.h> #include <sound/seq_device.h> @@ -45,16 +45,12 @@ #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"); -/* - * driver list - */ -typedef struct ops_list ops_list_t; - /* driver state */ #define DRIVER_EMPTY 0 #define DRIVER_LOADED (1<<0) @@ -68,13 +64,13 @@ struct ops_list { int argsize; /* argument size */ /* operators */ - snd_seq_dev_ops_t ops; + struct snd_seq_dev_ops ops; - /* registred devices */ + /* registered devices */ struct list_head dev_list; /* list of devices */ int num_devices; /* number of associated devices */ int num_init_devices; /* number of initialized devices */ - struct semaphore reg_mutex; + struct mutex reg_mutex; struct list_head list; /* next driver */ }; @@ -82,36 +78,38 @@ struct ops_list { static LIST_HEAD(opslist); static int num_ops; -static DECLARE_MUTEX(ops_mutex); -static snd_info_entry_t *info_entry = NULL; +static DEFINE_MUTEX(ops_mutex); +#ifdef CONFIG_PROC_FS +static struct snd_info_entry *info_entry; +#endif /* * prototypes */ -static int snd_seq_device_free(snd_seq_device_t *dev); -static int snd_seq_device_dev_free(snd_device_t *device); -static int snd_seq_device_dev_register(snd_device_t *device); -static int snd_seq_device_dev_disconnect(snd_device_t *device); -static int snd_seq_device_dev_unregister(snd_device_t *device); - -static int init_device(snd_seq_device_t *dev, ops_list_t *ops); -static int free_device(snd_seq_device_t *dev, ops_list_t *ops); -static ops_list_t *find_driver(char *id, int create_if_empty); -static ops_list_t *create_driver(char *id); -static void unlock_driver(ops_list_t *ops); +static int snd_seq_device_free(struct snd_seq_device *dev); +static int snd_seq_device_dev_free(struct snd_device *device); +static int snd_seq_device_dev_register(struct snd_device *device); +static int snd_seq_device_dev_disconnect(struct snd_device *device); + +static int init_device(struct snd_seq_device *dev, struct ops_list *ops); +static int free_device(struct snd_seq_device *dev, struct ops_list *ops); +static struct ops_list *find_driver(char *id, int create_if_empty); +static struct ops_list *create_driver(char *id); +static void unlock_driver(struct ops_list *ops); static void remove_drivers(void); /* * show all drivers and their status */ -static void snd_seq_device_info(snd_info_entry_t *entry, snd_info_buffer_t * buffer) +#ifdef CONFIG_PROC_FS +static void snd_seq_device_info(struct snd_info_entry *entry, + struct snd_info_buffer *buffer) { - struct list_head *head; + struct ops_list *ops; - down(&ops_mutex); - list_for_each(head, &opslist) { - ops_list_t *ops = list_entry(head, ops_list_t, list); + mutex_lock(&ops_mutex); + list_for_each_entry(ops, &opslist, list) { snd_iprintf(buffer, "snd-%s%s%s%s,%d\n", ops->id, ops->driver & DRIVER_LOADED ? ",loaded" : (ops->driver == DRIVER_EMPTY ? ",empty" : ""), @@ -119,14 +117,15 @@ static void snd_seq_device_info(snd_info_entry_t *entry, snd_info_buffer_t * buf ops->driver & DRIVER_LOCKED ? ",locked" : "", ops->num_devices); } - up(&ops_mutex); + mutex_unlock(&ops_mutex); } +#endif /* * load all registered drivers (called from seq_clientmgr.c) */ -#ifdef CONFIG_KMOD +#ifdef CONFIG_MODULES /* avoid auto-loading during module_init() */ static int snd_seq_in_init; void snd_seq_autoload_lock(void) @@ -142,8 +141,8 @@ void snd_seq_autoload_unlock(void) void snd_seq_device_load_drivers(void) { -#ifdef CONFIG_KMOD - struct list_head *head; +#ifdef CONFIG_MODULES + struct ops_list *ops; /* Calling request_module during module_init() * may cause blocking. @@ -151,50 +150,46 @@ void snd_seq_device_load_drivers(void) if (snd_seq_in_init) return; - if (! current->fs->root) - return; - - down(&ops_mutex); - list_for_each(head, &opslist) { - ops_list_t *ops = list_entry(head, ops_list_t, list); + mutex_lock(&ops_mutex); + list_for_each_entry(ops, &opslist, list) { if (! (ops->driver & DRIVER_LOADED) && ! (ops->driver & DRIVER_REQUESTED)) { ops->used++; - up(&ops_mutex); + mutex_unlock(&ops_mutex); ops->driver |= DRIVER_REQUESTED; request_module("snd-%s", ops->id); - down(&ops_mutex); + mutex_lock(&ops_mutex); ops->used--; } } - up(&ops_mutex); + mutex_unlock(&ops_mutex); #endif } /* * register a sequencer device - * card = card info (NULL allowed) + * card = card info * device = device number (if any) * id = id of driver * result = return pointer (NULL allowed if unnecessary) */ -int snd_seq_device_new(snd_card_t *card, int device, char *id, int argsize, - snd_seq_device_t **result) +int snd_seq_device_new(struct snd_card *card, int device, char *id, int argsize, + struct snd_seq_device **result) { - snd_seq_device_t *dev; - ops_list_t *ops; + struct snd_seq_device *dev; + struct ops_list *ops; int err; - static snd_device_ops_t dops = { + 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, - .dev_unregister = snd_seq_device_dev_unregister }; if (result) *result = NULL; - snd_assert(id != NULL, return -EINVAL); + if (snd_BUG_ON(!id)) + return -EINVAL; ops = find_driver(id, 1); if (ops == NULL) @@ -214,10 +209,10 @@ int snd_seq_device_new(snd_card_t *card, int device, char *id, int argsize, dev->status = SNDRV_SEQ_DEVICE_FREE; /* add this device to the list */ - down(&ops->reg_mutex); + mutex_lock(&ops->reg_mutex); list_add_tail(&dev->list, &ops->dev_list); ops->num_devices++; - up(&ops->reg_mutex); + mutex_unlock(&ops->reg_mutex); unlock_driver(ops); @@ -235,21 +230,22 @@ int snd_seq_device_new(snd_card_t *card, int device, char *id, int argsize, /* * free the existing device */ -static int snd_seq_device_free(snd_seq_device_t *dev) +static int snd_seq_device_free(struct snd_seq_device *dev) { - ops_list_t *ops; + struct ops_list *ops; - snd_assert(dev != NULL, return -EINVAL); + if (snd_BUG_ON(!dev)) + return -EINVAL; ops = find_driver(dev->id, 0); if (ops == NULL) return -ENXIO; /* remove the device from the list */ - down(&ops->reg_mutex); + mutex_lock(&ops->reg_mutex); list_del(&dev->list); ops->num_devices--; - up(&ops->reg_mutex); + mutex_unlock(&ops->reg_mutex); free_device(dev, ops); if (dev->private_free) @@ -261,19 +257,19 @@ static int snd_seq_device_free(snd_seq_device_t *dev) return 0; } -static int snd_seq_device_dev_free(snd_device_t *device) +static int snd_seq_device_dev_free(struct snd_device *device) { - snd_seq_device_t *dev = device->device_data; + struct snd_seq_device *dev = device->device_data; return snd_seq_device_free(dev); } /* * register the device */ -static int snd_seq_device_dev_register(snd_device_t *device) +static int snd_seq_device_dev_register(struct snd_device *device) { - snd_seq_device_t *dev = device->device_data; - ops_list_t *ops; + struct snd_seq_device *dev = device->device_data; + struct ops_list *ops; ops = find_driver(dev->id, 0); if (ops == NULL) @@ -292,10 +288,10 @@ static int snd_seq_device_dev_register(snd_device_t *device) /* * disconnect the device */ -static int snd_seq_device_dev_disconnect(snd_device_t *device) +static int snd_seq_device_dev_disconnect(struct snd_device *device) { - snd_seq_device_t *dev = device->device_data; - ops_list_t *ops; + struct snd_seq_device *dev = device->device_data; + struct ops_list *ops; ops = find_driver(dev->id, 0); if (ops == NULL) @@ -308,23 +304,15 @@ static int snd_seq_device_dev_disconnect(snd_device_t *device) } /* - * unregister the existing device - */ -static int snd_seq_device_dev_unregister(snd_device_t *device) -{ - snd_seq_device_t *dev = device->device_data; - return snd_seq_device_free(dev); -} - -/* * register device driver * id = driver id * entry = driver operators - duplicated to each instance */ -int snd_seq_device_register_driver(char *id, snd_seq_dev_ops_t *entry, int argsize) +int snd_seq_device_register_driver(char *id, struct snd_seq_dev_ops *entry, + int argsize) { - struct list_head *head; - ops_list_t *ops; + struct ops_list *ops; + struct snd_seq_device *dev; if (id == NULL || entry == NULL || entry->init_device == NULL || entry->free_device == NULL) @@ -337,24 +325,23 @@ int snd_seq_device_register_driver(char *id, snd_seq_dev_ops_t *entry, int argsi return -ENOMEM; } if (ops->driver & DRIVER_LOADED) { - snd_printk(KERN_WARNING "driver_register: driver '%s' already exists\n", id); + pr_warn("ALSA: seq: driver_register: driver '%s' already exists\n", id); unlock_driver(ops); snd_seq_autoload_unlock(); return -EBUSY; } - down(&ops->reg_mutex); + mutex_lock(&ops->reg_mutex); /* copy driver operators */ ops->ops = *entry; ops->driver |= DRIVER_LOADED; ops->argsize = argsize; /* initialize existing devices if necessary */ - list_for_each(head, &ops->dev_list) { - snd_seq_device_t *dev = list_entry(head, snd_seq_device_t, list); + list_for_each_entry(dev, &ops->dev_list, list) { init_device(dev, ops); } - up(&ops->reg_mutex); + mutex_unlock(&ops->reg_mutex); unlock_driver(ops); snd_seq_autoload_unlock(); @@ -366,28 +353,33 @@ int snd_seq_device_register_driver(char *id, snd_seq_dev_ops_t *entry, int argsi /* * create driver record */ -static ops_list_t * create_driver(char *id) +static struct ops_list * create_driver(char *id) { - ops_list_t *ops; + struct ops_list *ops; - ops = kmalloc(sizeof(*ops), GFP_KERNEL); + ops = kzalloc(sizeof(*ops), GFP_KERNEL); if (ops == NULL) return ops; - memset(ops, 0, sizeof(*ops)); /* set up driver entry */ strlcpy(ops->id, id, sizeof(ops->id)); - init_MUTEX(&ops->reg_mutex); + mutex_init(&ops->reg_mutex); + /* + * The ->reg_mutex locking rules are per-driver, so we create + * separate per-driver lock classes: + */ + lockdep_set_class(&ops->reg_mutex, (struct lock_class_key *)id); + ops->driver = DRIVER_EMPTY; INIT_LIST_HEAD(&ops->dev_list); /* lock this instance */ ops->used = 1; /* register driver entry */ - down(&ops_mutex); + mutex_lock(&ops_mutex); list_add_tail(&ops->list, &opslist); num_ops++; - up(&ops_mutex); + mutex_unlock(&ops_mutex); return ops; } @@ -398,31 +390,32 @@ static ops_list_t * create_driver(char *id) */ int snd_seq_device_unregister_driver(char *id) { - struct list_head *head; - ops_list_t *ops; + struct ops_list *ops; + struct snd_seq_device *dev; ops = find_driver(id, 0); if (ops == NULL) return -ENXIO; if (! (ops->driver & DRIVER_LOADED) || (ops->driver & DRIVER_LOCKED)) { - snd_printk(KERN_ERR "driver_unregister: cannot unload driver '%s': status=%x\n", id, ops->driver); + pr_err("ALSA: seq: driver_unregister: cannot unload driver '%s': status=%x\n", + id, ops->driver); unlock_driver(ops); return -EBUSY; } /* close and release all devices associated with this driver */ - down(&ops->reg_mutex); + mutex_lock(&ops->reg_mutex); ops->driver |= DRIVER_LOCKED; /* do not remove this driver recursively */ - list_for_each(head, &ops->dev_list) { - snd_seq_device_t *dev = list_entry(head, snd_seq_device_t, list); + list_for_each_entry(dev, &ops->dev_list, list) { free_device(dev, ops); } ops->driver = 0; if (ops->num_init_devices > 0) - snd_printk(KERN_ERR "free_driver: init_devices > 0!! (%d)\n", ops->num_init_devices); - up(&ops->reg_mutex); + pr_err("ALSA: seq: free_driver: init_devices > 0!! (%d)\n", + ops->num_init_devices); + mutex_unlock(&ops->reg_mutex); unlock_driver(ops); @@ -440,10 +433,10 @@ static void remove_drivers(void) { struct list_head *head; - down(&ops_mutex); + mutex_lock(&ops_mutex); head = opslist.next; while (head != &opslist) { - ops_list_t *ops = list_entry(head, ops_list_t, list); + struct ops_list *ops = list_entry(head, struct ops_list, list); if (! (ops->driver & DRIVER_LOADED) && ops->used == 0 && ops->num_devices == 0) { head = head->next; @@ -453,27 +446,29 @@ static void remove_drivers(void) } else head = head->next; } - up(&ops_mutex); + mutex_unlock(&ops_mutex); } /* * initialize the device - call init_device operator */ -static int init_device(snd_seq_device_t *dev, ops_list_t *ops) +static int init_device(struct snd_seq_device *dev, struct ops_list *ops) { if (! (ops->driver & DRIVER_LOADED)) return 0; /* driver is not loaded yet */ if (dev->status != SNDRV_SEQ_DEVICE_FREE) return 0; /* already initialized */ if (ops->argsize != dev->argsize) { - snd_printk(KERN_ERR "incompatible device '%s' for plug-in '%s' (%d %d)\n", dev->name, ops->id, ops->argsize, dev->argsize); + pr_err("ALSA: seq: incompatible device '%s' for plug-in '%s' (%d %d)\n", + dev->name, ops->id, ops->argsize, dev->argsize); return -EINVAL; } if (ops->ops.init_device(dev) >= 0) { dev->status = SNDRV_SEQ_DEVICE_REGISTERED; ops->num_init_devices++; } else { - snd_printk(KERN_ERR "init_device failed: %s: %s\n", dev->name, dev->id); + pr_err("ALSA: seq: init_device failed: %s: %s\n", + dev->name, dev->id); } return 0; @@ -482,7 +477,7 @@ static int init_device(snd_seq_device_t *dev, ops_list_t *ops) /* * release the device - call free_device operator */ -static int free_device(snd_seq_device_t *dev, ops_list_t *ops) +static int free_device(struct snd_seq_device *dev, struct ops_list *ops) { int result; @@ -491,7 +486,8 @@ static int free_device(snd_seq_device_t *dev, ops_list_t *ops) if (dev->status != SNDRV_SEQ_DEVICE_REGISTERED) return 0; /* not registered */ if (ops->argsize != dev->argsize) { - snd_printk(KERN_ERR "incompatible device '%s' for plug-in '%s' (%d %d)\n", dev->name, ops->id, ops->argsize, dev->argsize); + pr_err("ALSA: seq: incompatible device '%s' for plug-in '%s' (%d %d)\n", + dev->name, ops->id, ops->argsize, dev->argsize); return -EINVAL; } if ((result = ops->ops.free_device(dev)) >= 0 || result == -ENXIO) { @@ -499,7 +495,8 @@ static int free_device(snd_seq_device_t *dev, ops_list_t *ops) dev->driver_data = NULL; ops->num_init_devices--; } else { - snd_printk(KERN_ERR "free_device failed: %s: %s\n", dev->name, dev->id); + pr_err("ALSA: seq: free_device failed: %s: %s\n", + dev->name, dev->id); } return 0; @@ -508,30 +505,29 @@ static int free_device(snd_seq_device_t *dev, ops_list_t *ops) /* * find the matching driver with given id */ -static ops_list_t * find_driver(char *id, int create_if_empty) +static struct ops_list * find_driver(char *id, int create_if_empty) { - struct list_head *head; + struct ops_list *ops; - down(&ops_mutex); - list_for_each(head, &opslist) { - ops_list_t *ops = list_entry(head, ops_list_t, list); + mutex_lock(&ops_mutex); + list_for_each_entry(ops, &opslist, list) { if (strcmp(ops->id, id) == 0) { ops->used++; - up(&ops_mutex); + mutex_unlock(&ops_mutex); return ops; } } - up(&ops_mutex); + mutex_unlock(&ops_mutex); if (create_if_empty) return create_driver(id); return NULL; } -static void unlock_driver(ops_list_t *ops) +static void unlock_driver(struct ops_list *ops) { - down(&ops_mutex); + mutex_lock(&ops_mutex); ops->used--; - up(&ops_mutex); + mutex_unlock(&ops_mutex); } @@ -541,25 +537,29 @@ static void unlock_driver(ops_list_t *ops) static int __init alsa_seq_device_init(void) { - info_entry = snd_info_create_module_entry(THIS_MODULE, "drivers", snd_seq_root); +#ifdef CONFIG_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_size = 2048; 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 void __exit alsa_seq_device_exit(void) { remove_drivers(); - snd_info_unregister(info_entry); +#ifdef CONFIG_PROC_FS + snd_info_free_entry(info_entry); +#endif if (num_ops) - snd_printk(KERN_ERR "drivers not released (%d)\n", num_ops); + pr_err("ALSA: seq: drivers not released (%d)\n", num_ops); } module_init(alsa_seq_device_init) @@ -569,7 +569,7 @@ EXPORT_SYMBOL(snd_seq_device_load_drivers); EXPORT_SYMBOL(snd_seq_device_new); EXPORT_SYMBOL(snd_seq_device_register_driver); EXPORT_SYMBOL(snd_seq_device_unregister_driver); -#ifdef CONFIG_KMOD +#ifdef CONFIG_MODULES EXPORT_SYMBOL(snd_seq_autoload_lock); EXPORT_SYMBOL(snd_seq_autoload_unlock); #endif diff --git a/sound/core/seq/seq_dummy.c b/sound/core/seq/seq_dummy.c index 5dd0e6a19e5..ec667f158f1 100644 --- a/sound/core/seq/seq_dummy.c +++ b/sound/core/seq/seq_dummy.c @@ -18,10 +18,9 @@ * */ -#include <sound/driver.h> #include <linux/init.h> #include <linux/slab.h> -#include <linux/moduleparam.h> +#include <linux/module.h> #include <sound/core.h> #include "seq_clientmgr.h" #include <sound/initval.h> @@ -47,11 +46,11 @@ The number of ports to be created can be specified via the module parameter "ports". For example, to create four ports, add the - following option in /etc/modprobe.conf: + following option in a configuration file under /etc/modprobe.d/: option snd-seq-dummy ports=4 - The modle option "duplex=1" enables duplex operation to the port. + The model option "duplex=1" enables duplex operation to the port. In duplex mode, a pair of ports are created instead of single port, and events are tunneled between pair-ports. For example, input to port A is sent to output port of another port B and vice versa. @@ -66,19 +65,19 @@ MODULE_LICENSE("GPL"); MODULE_ALIAS("snd-seq-client-" __stringify(SNDRV_SEQ_CLIENT_DUMMY)); static int ports = 1; -static int duplex = 0; +static bool duplex; module_param(ports, int, 0444); MODULE_PARM_DESC(ports, "number of ports to be created"); module_param(duplex, bool, 0444); MODULE_PARM_DESC(duplex, "create DUPLEX ports"); -typedef struct snd_seq_dummy_port { +struct snd_seq_dummy_port { int client; int port; int duplex; int connect; -} snd_seq_dummy_port_t; +}; static int my_client = -1; @@ -88,11 +87,11 @@ static int my_client = -1; * Note: this callback is called only after all subscribers are removed. */ static int -dummy_unuse(void *private_data, snd_seq_port_subscribe_t *info) +dummy_unuse(void *private_data, struct snd_seq_port_subscribe *info) { - snd_seq_dummy_port_t *p; + struct snd_seq_dummy_port *p; int i; - snd_seq_event_t ev; + struct snd_seq_event ev; p = private_data; memset(&ev, 0, sizeof(ev)); @@ -116,10 +115,11 @@ dummy_unuse(void *private_data, snd_seq_port_subscribe_t *info) * event input callback - just redirect events to subscribers */ static int -dummy_input(snd_seq_event_t *ev, int direct, void *private_data, int atomic, int hop) +dummy_input(struct snd_seq_event *ev, int direct, void *private_data, + int atomic, int hop) { - snd_seq_dummy_port_t *p; - snd_seq_event_t tmpev; + struct snd_seq_dummy_port *p; + struct snd_seq_event tmpev; p = private_data; if (ev->source.client == SNDRV_SEQ_CLIENT_SYSTEM || @@ -146,12 +146,12 @@ dummy_free(void *private_data) /* * create a port */ -static snd_seq_dummy_port_t __init * +static struct snd_seq_dummy_port __init * create_port(int idx, int type) { - snd_seq_port_info_t pinfo; - snd_seq_port_callback_t pcb; - snd_seq_dummy_port_t *rec; + struct snd_seq_port_info pinfo; + struct snd_seq_port_callback pcb; + struct snd_seq_dummy_port *rec; if ((rec = kzalloc(sizeof(*rec), GFP_KERNEL)) == NULL) return NULL; @@ -170,7 +170,9 @@ create_port(int idx, int type) pinfo.capability |= SNDRV_SEQ_PORT_CAP_WRITE | SNDRV_SEQ_PORT_CAP_SUBS_WRITE; if (duplex) pinfo.capability |= SNDRV_SEQ_PORT_CAP_DUPLEX; - pinfo.type = SNDRV_SEQ_PORT_TYPE_MIDI_GENERIC; + pinfo.type = SNDRV_SEQ_PORT_TYPE_MIDI_GENERIC + | SNDRV_SEQ_PORT_TYPE_SOFTWARE + | SNDRV_SEQ_PORT_TYPE_PORT; memset(&pcb, 0, sizeof(pcb)); pcb.owner = THIS_MODULE; pcb.unuse = dummy_unuse; @@ -192,31 +194,20 @@ create_port(int idx, int type) static int __init register_client(void) { - snd_seq_client_callback_t cb; - snd_seq_client_info_t cinfo; - snd_seq_dummy_port_t *rec1, *rec2; + struct snd_seq_dummy_port *rec1, *rec2; int i; if (ports < 1) { - snd_printk(KERN_ERR "invalid number of ports %d\n", ports); + pr_err("ALSA: seq_dummy: invalid number of ports %d\n", ports); return -EINVAL; } /* create client */ - memset(&cb, 0, sizeof(cb)); - cb.allow_input = 1; - cb.allow_output = 1; - my_client = snd_seq_create_kernel_client(NULL, SNDRV_SEQ_CLIENT_DUMMY, &cb); + my_client = snd_seq_create_kernel_client(NULL, SNDRV_SEQ_CLIENT_DUMMY, + "Midi Through"); if (my_client < 0) return my_client; - /* set client name */ - memset(&cinfo, 0, sizeof(cinfo)); - cinfo.client = my_client; - cinfo.type = KERNEL_CLIENT; - strcpy(cinfo.name, "Midi Through"); - snd_seq_kernel_client_ctl(my_client, SNDRV_SEQ_IOCTL_SET_CLIENT_INFO, &cinfo); - /* create ports */ for (i = 0; i < ports; i++) { rec1 = create_port(i, 0); diff --git a/sound/core/seq/seq_fifo.c b/sound/core/seq/seq_fifo.c index 4767cfdc361..53a403e17c5 100644 --- a/sound/core/seq/seq_fifo.c +++ b/sound/core/seq/seq_fifo.c @@ -19,7 +19,6 @@ * */ -#include <sound/driver.h> #include <sound/core.h> #include <linux/slab.h> #include "seq_fifo.h" @@ -29,13 +28,13 @@ /* FIFO */ /* create new fifo */ -fifo_t *snd_seq_fifo_new(int poolsize) +struct snd_seq_fifo *snd_seq_fifo_new(int poolsize) { - fifo_t *f; + struct snd_seq_fifo *f; f = kzalloc(sizeof(*f), GFP_KERNEL); if (f == NULL) { - snd_printd("malloc failed for snd_seq_fifo_new() \n"); + pr_debug("ALSA: seq: malloc failed for snd_seq_fifo_new() \n"); return NULL; } @@ -62,13 +61,15 @@ fifo_t *snd_seq_fifo_new(int poolsize) return f; } -void snd_seq_fifo_delete(fifo_t **fifo) +void snd_seq_fifo_delete(struct snd_seq_fifo **fifo) { - fifo_t *f; + struct snd_seq_fifo *f; - snd_assert(fifo != NULL, return); + if (snd_BUG_ON(!fifo)) + return; f = *fifo; - snd_assert(f != NULL, return); + if (snd_BUG_ON(!f)) + return; *fifo = NULL; snd_seq_fifo_clear(f); @@ -88,12 +89,12 @@ void snd_seq_fifo_delete(fifo_t **fifo) kfree(f); } -static snd_seq_event_cell_t *fifo_cell_out(fifo_t *f); +static struct snd_seq_event_cell *fifo_cell_out(struct snd_seq_fifo *f); /* clear queue */ -void snd_seq_fifo_clear(fifo_t *f) +void snd_seq_fifo_clear(struct snd_seq_fifo *f) { - snd_seq_event_cell_t *cell; + struct snd_seq_event_cell *cell; unsigned long flags; /* clear overflow flag */ @@ -110,18 +111,20 @@ void snd_seq_fifo_clear(fifo_t *f) /* enqueue event to fifo */ -int snd_seq_fifo_event_in(fifo_t *f, snd_seq_event_t *event) +int snd_seq_fifo_event_in(struct snd_seq_fifo *f, + struct snd_seq_event *event) { - snd_seq_event_cell_t *cell; + struct snd_seq_event_cell *cell; unsigned long flags; int err; - snd_assert(f != NULL, return -EINVAL); + if (snd_BUG_ON(!f)) + return -EINVAL; snd_use_lock_use(&f->use_lock); err = snd_seq_event_dup(f->pool, event, &cell, 1, NULL); /* always non-blocking */ if (err < 0) { - if (err == -ENOMEM) + if ((err == -ENOMEM) || (err == -EAGAIN)) atomic_inc(&f->overflow); snd_use_lock_free(&f->use_lock); return err; @@ -148,9 +151,9 @@ int snd_seq_fifo_event_in(fifo_t *f, snd_seq_event_t *event) } /* dequeue cell from fifo */ -static snd_seq_event_cell_t *fifo_cell_out(fifo_t *f) +static struct snd_seq_event_cell *fifo_cell_out(struct snd_seq_fifo *f) { - snd_seq_event_cell_t *cell; + struct snd_seq_event_cell *cell; if ((cell = f->head) != NULL) { f->head = cell->next; @@ -167,13 +170,15 @@ static snd_seq_event_cell_t *fifo_cell_out(fifo_t *f) } /* dequeue cell from fifo and copy on user space */ -int snd_seq_fifo_cell_out(fifo_t *f, snd_seq_event_cell_t **cellp, int nonblock) +int snd_seq_fifo_cell_out(struct snd_seq_fifo *f, + struct snd_seq_event_cell **cellp, int nonblock) { - snd_seq_event_cell_t *cell; + struct snd_seq_event_cell *cell; unsigned long flags; wait_queue_t wait; - snd_assert(f != NULL, return -EINVAL); + if (snd_BUG_ON(!f)) + return -EINVAL; *cellp = NULL; init_waitqueue_entry(&wait, current); @@ -202,7 +207,8 @@ int snd_seq_fifo_cell_out(fifo_t *f, snd_seq_event_cell_t **cellp, int nonblock) } -void snd_seq_fifo_cell_putback(fifo_t *f, snd_seq_event_cell_t *cell) +void snd_seq_fifo_cell_putback(struct snd_seq_fifo *f, + struct snd_seq_event_cell *cell) { unsigned long flags; @@ -217,20 +223,22 @@ void snd_seq_fifo_cell_putback(fifo_t *f, snd_seq_event_cell_t *cell) /* polling; return non-zero if queue is available */ -int snd_seq_fifo_poll_wait(fifo_t *f, struct file *file, poll_table *wait) +int snd_seq_fifo_poll_wait(struct snd_seq_fifo *f, struct file *file, + poll_table *wait) { poll_wait(file, &f->input_sleep, wait); return (f->cells > 0); } /* change the size of pool; all old events are removed */ -int snd_seq_fifo_resize(fifo_t *f, int poolsize) +int snd_seq_fifo_resize(struct snd_seq_fifo *f, int poolsize) { unsigned long flags; - pool_t *newpool, *oldpool; - snd_seq_event_cell_t *cell, *next, *oldhead; + struct snd_seq_pool *newpool, *oldpool; + struct snd_seq_event_cell *cell, *next, *oldhead; - snd_assert(f != NULL && f->pool != NULL, return -EINVAL); + if (snd_BUG_ON(!f || !f->pool)) + return -EINVAL; /* allocate new pool */ newpool = snd_seq_pool_new(poolsize); diff --git a/sound/core/seq/seq_fifo.h b/sound/core/seq/seq_fifo.h index d677c261b0a..062c446e786 100644 --- a/sound/core/seq/seq_fifo.h +++ b/sound/core/seq/seq_fifo.h @@ -27,46 +27,46 @@ /* === FIFO === */ -typedef struct { - pool_t *pool; /* FIFO pool */ - snd_seq_event_cell_t* head; /* pointer to head of fifo */ - snd_seq_event_cell_t* tail; /* pointer to tail of fifo */ +struct snd_seq_fifo { + struct snd_seq_pool *pool; /* FIFO pool */ + struct snd_seq_event_cell *head; /* pointer to head of fifo */ + struct snd_seq_event_cell *tail; /* pointer to tail of fifo */ int cells; spinlock_t lock; snd_use_lock_t use_lock; wait_queue_head_t input_sleep; atomic_t overflow; -} fifo_t; +}; /* create new fifo (constructor) */ -extern fifo_t *snd_seq_fifo_new(int poolsize); +struct snd_seq_fifo *snd_seq_fifo_new(int poolsize); /* delete fifo (destructor) */ -extern void snd_seq_fifo_delete(fifo_t **f); +void snd_seq_fifo_delete(struct snd_seq_fifo **f); /* enqueue event to fifo */ -extern int snd_seq_fifo_event_in(fifo_t *f, snd_seq_event_t *event); +int snd_seq_fifo_event_in(struct snd_seq_fifo *f, struct snd_seq_event *event); /* lock fifo from release */ #define snd_seq_fifo_lock(fifo) snd_use_lock_use(&(fifo)->use_lock) #define snd_seq_fifo_unlock(fifo) snd_use_lock_free(&(fifo)->use_lock) /* get a cell from fifo - fifo should be locked */ -int snd_seq_fifo_cell_out(fifo_t *f, snd_seq_event_cell_t **cellp, int nonblock); +int snd_seq_fifo_cell_out(struct snd_seq_fifo *f, struct snd_seq_event_cell **cellp, int nonblock); /* free dequeued cell - fifo should be locked */ -extern void snd_seq_fifo_cell_putback(fifo_t *f, snd_seq_event_cell_t *cell); +void snd_seq_fifo_cell_putback(struct snd_seq_fifo *f, struct snd_seq_event_cell *cell); /* clean up queue */ -extern void snd_seq_fifo_clear(fifo_t *f); +void snd_seq_fifo_clear(struct snd_seq_fifo *f); /* polling */ -extern int snd_seq_fifo_poll_wait(fifo_t *f, struct file *file, poll_table *wait); +int snd_seq_fifo_poll_wait(struct snd_seq_fifo *f, struct file *file, poll_table *wait); /* resize pool in fifo */ -int snd_seq_fifo_resize(fifo_t *f, int poolsize); +int snd_seq_fifo_resize(struct snd_seq_fifo *f, int poolsize); #endif diff --git a/sound/core/seq/seq_info.c b/sound/core/seq/seq_info.c index b50b695c41c..acf7769419f 100644 --- a/sound/core/seq/seq_info.c +++ b/sound/core/seq/seq_info.c @@ -19,30 +19,30 @@ * */ -#include <sound/driver.h> #include <linux/init.h> +#include <linux/export.h> #include <sound/core.h> #include "seq_info.h" #include "seq_clientmgr.h" #include "seq_timer.h" +#ifdef CONFIG_PROC_FS +static struct snd_info_entry *queues_entry; +static struct snd_info_entry *clients_entry; +static struct snd_info_entry *timer_entry; -static snd_info_entry_t *queues_entry; -static snd_info_entry_t *clients_entry; -static snd_info_entry_t *timer_entry; - -static snd_info_entry_t * __init -create_info_entry(char *name, int size, void (*read)(snd_info_entry_t *, snd_info_buffer_t *)) +static struct snd_info_entry * __init +create_info_entry(char *name, void (*read)(struct snd_info_entry *, + struct snd_info_buffer *)) { - snd_info_entry_t *entry; + struct snd_info_entry *entry; entry = snd_info_create_module_entry(THIS_MODULE, name, snd_seq_root); if (entry == NULL) return NULL; entry->content = SNDRV_INFO_CONTENT_TEXT; - entry->c.text.read_size = size; entry->c.text.read = read; if (snd_info_register(entry) < 0) { snd_info_free_entry(entry); @@ -51,25 +51,22 @@ create_info_entry(char *name, int size, void (*read)(snd_info_entry_t *, snd_inf return entry; } - /* create all our /proc entries */ int __init snd_seq_info_init(void) { - queues_entry = create_info_entry("queues", 512 + (256 * SNDRV_SEQ_MAX_QUEUES), + queues_entry = create_info_entry("queues", snd_seq_info_queues_read); - clients_entry = create_info_entry("clients", 512 + (256 * SNDRV_SEQ_MAX_CLIENTS), + clients_entry = create_info_entry("clients", snd_seq_info_clients_read); - timer_entry = create_info_entry("timer", 1024, snd_seq_info_timer_read); + timer_entry = create_info_entry("timer", snd_seq_info_timer_read); return 0; } int __exit snd_seq_info_done(void) { - if (queues_entry) - snd_info_unregister(queues_entry); - if (clients_entry) - snd_info_unregister(clients_entry); - if (timer_entry) - snd_info_unregister(timer_entry); + snd_info_free_entry(queues_entry); + snd_info_free_entry(clients_entry); + snd_info_free_entry(timer_entry); return 0; } +#endif diff --git a/sound/core/seq/seq_info.h b/sound/core/seq/seq_info.h index efd099a858e..4892a7f35c0 100644 --- a/sound/core/seq/seq_info.h +++ b/sound/core/seq/seq_info.h @@ -24,13 +24,17 @@ #include <sound/info.h> #include <sound/seq_kernel.h> -void snd_seq_info_clients_read(snd_info_entry_t *entry, snd_info_buffer_t * buffer); -void snd_seq_info_timer_read(snd_info_entry_t *entry, snd_info_buffer_t * buffer); -void snd_seq_info_queues_read(snd_info_entry_t *entry, snd_info_buffer_t * buffer); +void snd_seq_info_clients_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer); +void snd_seq_info_timer_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer); +void snd_seq_info_queues_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer); +#ifdef CONFIG_PROC_FS int snd_seq_info_init( void ); int snd_seq_info_done( void ); - +#else +static inline int snd_seq_info_init(void) { return 0; } +static inline int snd_seq_info_done(void) { return 0; } +#endif #endif diff --git a/sound/core/seq/seq_instr.c b/sound/core/seq/seq_instr.c deleted file mode 100644 index 019d43a462d..00000000000 --- a/sound/core/seq/seq_instr.c +++ /dev/null @@ -1,653 +0,0 @@ -/* - * Generic Instrument routines for ALSA sequencer - * Copyright (c) 1999 by Jaroslav Kysela <perex@suse.cz> - * - * 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 - * - */ - -#include <sound/driver.h> -#include <linux/init.h> -#include <linux/slab.h> -#include <sound/core.h> -#include "seq_clientmgr.h" -#include <sound/seq_instr.h> -#include <sound/initval.h> - -MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>"); -MODULE_DESCRIPTION("Advanced Linux Sound Architecture sequencer instrument library."); -MODULE_LICENSE("GPL"); - - -static void snd_instr_lock_ops(snd_seq_kinstr_list_t *list) -{ - if (!(list->flags & SNDRV_SEQ_INSTR_FLG_DIRECT)) { - spin_lock_irqsave(&list->ops_lock, list->ops_flags); - } else { - down(&list->ops_mutex); - } -} - -static void snd_instr_unlock_ops(snd_seq_kinstr_list_t *list) -{ - if (!(list->flags & SNDRV_SEQ_INSTR_FLG_DIRECT)) { - spin_unlock_irqrestore(&list->ops_lock, list->ops_flags); - } else { - up(&list->ops_mutex); - } -} - -static snd_seq_kinstr_t *snd_seq_instr_new(int add_len, int atomic) -{ - snd_seq_kinstr_t *instr; - - instr = kzalloc(sizeof(snd_seq_kinstr_t) + add_len, atomic ? GFP_ATOMIC : GFP_KERNEL); - if (instr == NULL) - return NULL; - instr->add_len = add_len; - return instr; -} - -static int snd_seq_instr_free(snd_seq_kinstr_t *instr, int atomic) -{ - int result = 0; - - if (instr == NULL) - return -EINVAL; - if (instr->ops && instr->ops->remove) - result = instr->ops->remove(instr->ops->private_data, instr, 1); - if (!result) - kfree(instr); - return result; -} - -snd_seq_kinstr_list_t *snd_seq_instr_list_new(void) -{ - snd_seq_kinstr_list_t *list; - - list = kzalloc(sizeof(snd_seq_kinstr_list_t), GFP_KERNEL); - if (list == NULL) - return NULL; - spin_lock_init(&list->lock); - spin_lock_init(&list->ops_lock); - init_MUTEX(&list->ops_mutex); - list->owner = -1; - return list; -} - -void snd_seq_instr_list_free(snd_seq_kinstr_list_t **list_ptr) -{ - snd_seq_kinstr_list_t *list; - snd_seq_kinstr_t *instr; - snd_seq_kcluster_t *cluster; - int idx; - unsigned long flags; - - if (list_ptr == NULL) - return; - list = *list_ptr; - *list_ptr = NULL; - if (list == NULL) - return; - - for (idx = 0; idx < SNDRV_SEQ_INSTR_HASH_SIZE; idx++) { - while ((instr = list->hash[idx]) != NULL) { - list->hash[idx] = instr->next; - list->count--; - spin_lock_irqsave(&list->lock, flags); - while (instr->use) { - spin_unlock_irqrestore(&list->lock, flags); - set_current_state(TASK_INTERRUPTIBLE); - schedule_timeout(1); - spin_lock_irqsave(&list->lock, flags); - } - spin_unlock_irqrestore(&list->lock, flags); - if (snd_seq_instr_free(instr, 0)<0) - snd_printk(KERN_WARNING "instrument free problem\n"); - } - while ((cluster = list->chash[idx]) != NULL) { - list->chash[idx] = cluster->next; - list->ccount--; - kfree(cluster); - } - } - kfree(list); -} - -static int instr_free_compare(snd_seq_kinstr_t *instr, - snd_seq_instr_header_t *ifree, - unsigned int client) -{ - switch (ifree->cmd) { - case SNDRV_SEQ_INSTR_FREE_CMD_ALL: - /* all, except private for other clients */ - if ((instr->instr.std & 0xff000000) == 0) - return 0; - if (((instr->instr.std >> 24) & 0xff) == client) - return 0; - return 1; - case SNDRV_SEQ_INSTR_FREE_CMD_PRIVATE: - /* all my private instruments */ - if ((instr->instr.std & 0xff000000) == 0) - return 1; - if (((instr->instr.std >> 24) & 0xff) == client) - return 0; - return 1; - case SNDRV_SEQ_INSTR_FREE_CMD_CLUSTER: - /* all my private instruments */ - if ((instr->instr.std & 0xff000000) == 0) { - if (instr->instr.cluster == ifree->id.cluster) - return 0; - return 1; - } - if (((instr->instr.std >> 24) & 0xff) == client) { - if (instr->instr.cluster == ifree->id.cluster) - return 0; - } - return 1; - } - return 1; -} - -int snd_seq_instr_list_free_cond(snd_seq_kinstr_list_t *list, - snd_seq_instr_header_t *ifree, - int client, - int atomic) -{ - snd_seq_kinstr_t *instr, *prev, *next, *flist; - int idx; - unsigned long flags; - - snd_instr_lock_ops(list); - for (idx = 0; idx < SNDRV_SEQ_INSTR_HASH_SIZE; idx++) { - spin_lock_irqsave(&list->lock, flags); - instr = list->hash[idx]; - prev = flist = NULL; - while (instr) { - while (instr && instr_free_compare(instr, ifree, (unsigned int)client)) { - prev = instr; - instr = instr->next; - } - if (instr == NULL) - continue; - if (instr->ops && instr->ops->notify) - instr->ops->notify(instr->ops->private_data, instr, SNDRV_SEQ_INSTR_NOTIFY_REMOVE); - next = instr->next; - if (prev == NULL) { - list->hash[idx] = next; - } else { - prev->next = next; - } - list->count--; - instr->next = flist; - flist = instr; - instr = next; - } - spin_unlock_irqrestore(&list->lock, flags); - while (flist) { - instr = flist; - flist = instr->next; - while (instr->use) { - set_current_state(TASK_INTERRUPTIBLE); - schedule_timeout(1); - } - if (snd_seq_instr_free(instr, atomic)<0) - snd_printk(KERN_WARNING "instrument free problem\n"); - instr = next; - } - } - snd_instr_unlock_ops(list); - return 0; -} - -static int compute_hash_instr_key(snd_seq_instr_t *instr) -{ - int result; - - result = instr->bank | (instr->prg << 16); - result += result >> 24; - result += result >> 16; - result += result >> 8; - return result & (SNDRV_SEQ_INSTR_HASH_SIZE-1); -} - -#if 0 -static int compute_hash_cluster_key(snd_seq_instr_cluster_t cluster) -{ - int result; - - result = cluster; - result += result >> 24; - result += result >> 16; - result += result >> 8; - return result & (SNDRV_SEQ_INSTR_HASH_SIZE-1); -} -#endif - -static int compare_instr(snd_seq_instr_t *i1, snd_seq_instr_t *i2, int exact) -{ - if (exact) { - if (i1->cluster != i2->cluster || - i1->bank != i2->bank || - i1->prg != i2->prg) - return 1; - if ((i1->std & 0xff000000) != (i2->std & 0xff000000)) - return 1; - if (!(i1->std & i2->std)) - return 1; - return 0; - } else { - unsigned int client_check; - - if (i2->cluster && i1->cluster != i2->cluster) - return 1; - client_check = i2->std & 0xff000000; - if (client_check) { - if ((i1->std & 0xff000000) != client_check) - return 1; - } else { - if ((i1->std & i2->std) != i2->std) - return 1; - } - return i1->bank != i2->bank || i1->prg != i2->prg; - } -} - -snd_seq_kinstr_t *snd_seq_instr_find(snd_seq_kinstr_list_t *list, - snd_seq_instr_t *instr, - int exact, - int follow_alias) -{ - unsigned long flags; - int depth = 0; - snd_seq_kinstr_t *result; - - if (list == NULL || instr == NULL) - return NULL; - spin_lock_irqsave(&list->lock, flags); - __again: - result = list->hash[compute_hash_instr_key(instr)]; - while (result) { - if (!compare_instr(&result->instr, instr, exact)) { - if (follow_alias && (result->type == SNDRV_SEQ_INSTR_ATYPE_ALIAS)) { - instr = (snd_seq_instr_t *)KINSTR_DATA(result); - if (++depth > 10) - goto __not_found; - goto __again; - } - result->use++; - spin_unlock_irqrestore(&list->lock, flags); - return result; - } - result = result->next; - } - __not_found: - spin_unlock_irqrestore(&list->lock, flags); - return NULL; -} - -void snd_seq_instr_free_use(snd_seq_kinstr_list_t *list, - snd_seq_kinstr_t *instr) -{ - unsigned long flags; - - if (list == NULL || instr == NULL) - return; - spin_lock_irqsave(&list->lock, flags); - if (instr->use <= 0) { - snd_printk(KERN_ERR "free_use: fatal!!! use = %i, name = '%s'\n", instr->use, instr->name); - } else { - instr->use--; - } - spin_unlock_irqrestore(&list->lock, flags); -} - -static snd_seq_kinstr_ops_t *instr_ops(snd_seq_kinstr_ops_t *ops, char *instr_type) -{ - while (ops) { - if (!strcmp(ops->instr_type, instr_type)) - return ops; - ops = ops->next; - } - return NULL; -} - -static int instr_result(snd_seq_event_t *ev, - int type, int result, - int atomic) -{ - snd_seq_event_t sev; - - memset(&sev, 0, sizeof(sev)); - sev.type = SNDRV_SEQ_EVENT_RESULT; - sev.flags = SNDRV_SEQ_TIME_STAMP_REAL | SNDRV_SEQ_EVENT_LENGTH_FIXED | - SNDRV_SEQ_PRIORITY_NORMAL; - sev.source = ev->dest; - sev.dest = ev->source; - sev.data.result.event = type; - sev.data.result.result = result; -#if 0 - printk("instr result - type = %i, result = %i, queue = %i, source.client:port = %i:%i, dest.client:port = %i:%i\n", - type, result, - sev.queue, - sev.source.client, sev.source.port, - sev.dest.client, sev.dest.port); -#endif - return snd_seq_kernel_client_dispatch(sev.source.client, &sev, atomic, 0); -} - -static int instr_begin(snd_seq_kinstr_ops_t *ops, - snd_seq_kinstr_list_t *list, - snd_seq_event_t *ev, - int atomic, int hop) -{ - unsigned long flags; - - spin_lock_irqsave(&list->lock, flags); - if (list->owner >= 0 && list->owner != ev->source.client) { - spin_unlock_irqrestore(&list->lock, flags); - return instr_result(ev, SNDRV_SEQ_EVENT_INSTR_BEGIN, -EBUSY, atomic); - } - list->owner = ev->source.client; - spin_unlock_irqrestore(&list->lock, flags); - return instr_result(ev, SNDRV_SEQ_EVENT_INSTR_BEGIN, 0, atomic); -} - -static int instr_end(snd_seq_kinstr_ops_t *ops, - snd_seq_kinstr_list_t *list, - snd_seq_event_t *ev, - int atomic, int hop) -{ - unsigned long flags; - - /* TODO: timeout handling */ - spin_lock_irqsave(&list->lock, flags); - if (list->owner == ev->source.client) { - list->owner = -1; - spin_unlock_irqrestore(&list->lock, flags); - return instr_result(ev, SNDRV_SEQ_EVENT_INSTR_END, 0, atomic); - } - spin_unlock_irqrestore(&list->lock, flags); - return instr_result(ev, SNDRV_SEQ_EVENT_INSTR_END, -EINVAL, atomic); -} - -static int instr_info(snd_seq_kinstr_ops_t *ops, - snd_seq_kinstr_list_t *list, - snd_seq_event_t *ev, - int atomic, int hop) -{ - return -ENXIO; -} - -static int instr_format_info(snd_seq_kinstr_ops_t *ops, - snd_seq_kinstr_list_t *list, - snd_seq_event_t *ev, - int atomic, int hop) -{ - return -ENXIO; -} - -static int instr_reset(snd_seq_kinstr_ops_t *ops, - snd_seq_kinstr_list_t *list, - snd_seq_event_t *ev, - int atomic, int hop) -{ - return -ENXIO; -} - -static int instr_status(snd_seq_kinstr_ops_t *ops, - snd_seq_kinstr_list_t *list, - snd_seq_event_t *ev, - int atomic, int hop) -{ - return -ENXIO; -} - -static int instr_put(snd_seq_kinstr_ops_t *ops, - snd_seq_kinstr_list_t *list, - snd_seq_event_t *ev, - int atomic, int hop) -{ - unsigned long flags; - snd_seq_instr_header_t put; - snd_seq_kinstr_t *instr; - int result = -EINVAL, len, key; - - if ((ev->flags & SNDRV_SEQ_EVENT_LENGTH_MASK) != SNDRV_SEQ_EVENT_LENGTH_VARUSR) - goto __return; - - if (ev->data.ext.len < sizeof(snd_seq_instr_header_t)) - goto __return; - if (copy_from_user(&put, (void __user *)ev->data.ext.ptr, sizeof(snd_seq_instr_header_t))) { - result = -EFAULT; - goto __return; - } - snd_instr_lock_ops(list); - if (put.id.instr.std & 0xff000000) { /* private instrument */ - put.id.instr.std &= 0x00ffffff; - put.id.instr.std |= (unsigned int)ev->source.client << 24; - } - if ((instr = snd_seq_instr_find(list, &put.id.instr, 1, 0))) { - snd_seq_instr_free_use(list, instr); - snd_instr_unlock_ops(list); - result = -EBUSY; - goto __return; - } - ops = instr_ops(ops, put.data.data.format); - if (ops == NULL) { - snd_instr_unlock_ops(list); - goto __return; - } - len = ops->add_len; - if (put.data.type == SNDRV_SEQ_INSTR_ATYPE_ALIAS) - len = sizeof(snd_seq_instr_t); - instr = snd_seq_instr_new(len, atomic); - if (instr == NULL) { - snd_instr_unlock_ops(list); - result = -ENOMEM; - goto __return; - } - instr->ops = ops; - instr->instr = put.id.instr; - strlcpy(instr->name, put.data.name, sizeof(instr->name)); - instr->type = put.data.type; - if (instr->type == SNDRV_SEQ_INSTR_ATYPE_DATA) { - result = ops->put(ops->private_data, - instr, - (void __user *)ev->data.ext.ptr + sizeof(snd_seq_instr_header_t), - ev->data.ext.len - sizeof(snd_seq_instr_header_t), - atomic, - put.cmd); - if (result < 0) { - snd_seq_instr_free(instr, atomic); - snd_instr_unlock_ops(list); - goto __return; - } - } - key = compute_hash_instr_key(&instr->instr); - spin_lock_irqsave(&list->lock, flags); - instr->next = list->hash[key]; - list->hash[key] = instr; - list->count++; - spin_unlock_irqrestore(&list->lock, flags); - snd_instr_unlock_ops(list); - result = 0; - __return: - instr_result(ev, SNDRV_SEQ_EVENT_INSTR_PUT, result, atomic); - return result; -} - -static int instr_get(snd_seq_kinstr_ops_t *ops, - snd_seq_kinstr_list_t *list, - snd_seq_event_t *ev, - int atomic, int hop) -{ - return -ENXIO; -} - -static int instr_free(snd_seq_kinstr_ops_t *ops, - snd_seq_kinstr_list_t *list, - snd_seq_event_t *ev, - int atomic, int hop) -{ - snd_seq_instr_header_t ifree; - snd_seq_kinstr_t *instr, *prev; - int result = -EINVAL; - unsigned long flags; - unsigned int hash; - - if ((ev->flags & SNDRV_SEQ_EVENT_LENGTH_MASK) != SNDRV_SEQ_EVENT_LENGTH_VARUSR) - goto __return; - - if (ev->data.ext.len < sizeof(snd_seq_instr_header_t)) - goto __return; - if (copy_from_user(&ifree, (void __user *)ev->data.ext.ptr, sizeof(snd_seq_instr_header_t))) { - result = -EFAULT; - goto __return; - } - if (ifree.cmd == SNDRV_SEQ_INSTR_FREE_CMD_ALL || - ifree.cmd == SNDRV_SEQ_INSTR_FREE_CMD_PRIVATE || - ifree.cmd == SNDRV_SEQ_INSTR_FREE_CMD_CLUSTER) { - result = snd_seq_instr_list_free_cond(list, &ifree, ev->dest.client, atomic); - goto __return; - } - if (ifree.cmd == SNDRV_SEQ_INSTR_FREE_CMD_SINGLE) { - if (ifree.id.instr.std & 0xff000000) { - ifree.id.instr.std &= 0x00ffffff; - ifree.id.instr.std |= (unsigned int)ev->source.client << 24; - } - hash = compute_hash_instr_key(&ifree.id.instr); - snd_instr_lock_ops(list); - spin_lock_irqsave(&list->lock, flags); - instr = list->hash[hash]; - prev = NULL; - while (instr) { - if (!compare_instr(&instr->instr, &ifree.id.instr, 1)) - goto __free_single; - prev = instr; - instr = instr->next; - } - result = -ENOENT; - spin_unlock_irqrestore(&list->lock, flags); - snd_instr_unlock_ops(list); - goto __return; - - __free_single: - if (prev) { - prev->next = instr->next; - } else { - list->hash[hash] = instr->next; - } - if (instr->ops && instr->ops->notify) - instr->ops->notify(instr->ops->private_data, instr, SNDRV_SEQ_INSTR_NOTIFY_REMOVE); - while (instr->use) { - spin_unlock_irqrestore(&list->lock, flags); - set_current_state(TASK_INTERRUPTIBLE); - schedule_timeout(1); - spin_lock_irqsave(&list->lock, flags); - } - spin_unlock_irqrestore(&list->lock, flags); - result = snd_seq_instr_free(instr, atomic); - snd_instr_unlock_ops(list); - goto __return; - } - - __return: - instr_result(ev, SNDRV_SEQ_EVENT_INSTR_FREE, result, atomic); - return result; -} - -static int instr_list(snd_seq_kinstr_ops_t *ops, - snd_seq_kinstr_list_t *list, - snd_seq_event_t *ev, - int atomic, int hop) -{ - return -ENXIO; -} - -static int instr_cluster(snd_seq_kinstr_ops_t *ops, - snd_seq_kinstr_list_t *list, - snd_seq_event_t *ev, - int atomic, int hop) -{ - return -ENXIO; -} - -int snd_seq_instr_event(snd_seq_kinstr_ops_t *ops, - snd_seq_kinstr_list_t *list, - snd_seq_event_t *ev, - int client, - int atomic, - int hop) -{ - int direct = 0; - - snd_assert(ops != NULL && list != NULL && ev != NULL, return -EINVAL); - if (snd_seq_ev_is_direct(ev)) { - direct = 1; - switch (ev->type) { - case SNDRV_SEQ_EVENT_INSTR_BEGIN: - return instr_begin(ops, list, ev, atomic, hop); - case SNDRV_SEQ_EVENT_INSTR_END: - return instr_end(ops, list, ev, atomic, hop); - } - } - if ((list->flags & SNDRV_SEQ_INSTR_FLG_DIRECT) && !direct) - return -EINVAL; - switch (ev->type) { - case SNDRV_SEQ_EVENT_INSTR_INFO: - return instr_info(ops, list, ev, atomic, hop); - case SNDRV_SEQ_EVENT_INSTR_FINFO: - return instr_format_info(ops, list, ev, atomic, hop); - case SNDRV_SEQ_EVENT_INSTR_RESET: - return instr_reset(ops, list, ev, atomic, hop); - case SNDRV_SEQ_EVENT_INSTR_STATUS: - return instr_status(ops, list, ev, atomic, hop); - case SNDRV_SEQ_EVENT_INSTR_PUT: - return instr_put(ops, list, ev, atomic, hop); - case SNDRV_SEQ_EVENT_INSTR_GET: - return instr_get(ops, list, ev, atomic, hop); - case SNDRV_SEQ_EVENT_INSTR_FREE: - return instr_free(ops, list, ev, atomic, hop); - case SNDRV_SEQ_EVENT_INSTR_LIST: - return instr_list(ops, list, ev, atomic, hop); - case SNDRV_SEQ_EVENT_INSTR_CLUSTER: - return instr_cluster(ops, list, ev, atomic, hop); - } - return -EINVAL; -} - -/* - * Init part - */ - -static int __init alsa_seq_instr_init(void) -{ - return 0; -} - -static void __exit alsa_seq_instr_exit(void) -{ -} - -module_init(alsa_seq_instr_init) -module_exit(alsa_seq_instr_exit) - -EXPORT_SYMBOL(snd_seq_instr_list_new); -EXPORT_SYMBOL(snd_seq_instr_list_free); -EXPORT_SYMBOL(snd_seq_instr_list_free_cond); -EXPORT_SYMBOL(snd_seq_instr_find); -EXPORT_SYMBOL(snd_seq_instr_free_use); -EXPORT_SYMBOL(snd_seq_instr_event); diff --git a/sound/core/seq/seq_lock.c b/sound/core/seq/seq_lock.c index b09cee058fa..3b693e924db 100644 --- a/sound/core/seq/seq_lock.c +++ b/sound/core/seq/seq_lock.c @@ -19,7 +19,7 @@ * */ -#include <sound/driver.h> +#include <linux/export.h> #include <sound/core.h> #include "seq_lock.h" @@ -31,18 +31,19 @@ void snd_use_lock_sync_helper(snd_use_lock_t *lockp, const char *file, int line) int max_count = 5 * HZ; if (atomic_read(lockp) < 0) { - printk(KERN_WARNING "seq_lock: lock trouble [counter = %d] in %s:%d\n", atomic_read(lockp), file, line); + pr_warn("ALSA: seq_lock: lock trouble [counter = %d] in %s:%d\n", atomic_read(lockp), file, line); return; } while (atomic_read(lockp) > 0) { if (max_count == 0) { - snd_printk(KERN_WARNING "seq_lock: timeout [%d left] in %s:%d\n", atomic_read(lockp), file, line); + pr_warn("ALSA: seq_lock: timeout [%d left] in %s:%d\n", atomic_read(lockp), file, line); break; } - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(1); + schedule_timeout_uninterruptible(1); max_count--; } } +EXPORT_SYMBOL(snd_use_lock_sync_helper); + #endif diff --git a/sound/core/seq/seq_memory.c b/sound/core/seq/seq_memory.c index d4d7d326c4b..1e206de0c2d 100644 --- a/sound/core/seq/seq_memory.c +++ b/sound/core/seq/seq_memory.c @@ -1,7 +1,7 @@ /* * ALSA sequencer Memory Manager * Copyright (c) 1998 by Frank van de Pol <fvdpol@coil.demon.nl> - * Jaroslav Kysela <perex@suse.cz> + * Jaroslav Kysela <perex@perex.cz> * 2000 by Takashi Iwai <tiwai@suse.de> * * This program is free software; you can redistribute it and/or modify @@ -20,8 +20,8 @@ * */ -#include <sound/driver.h> #include <linux/init.h> +#include <linux/export.h> #include <linux/slab.h> #include <linux/vmalloc.h> #include <sound/core.h> @@ -32,16 +32,12 @@ #include "seq_info.h" #include "seq_lock.h" -/* semaphore in struct file record */ -#define semaphore_of(fp) ((fp)->f_dentry->d_inode->i_sem) - - -static inline int snd_seq_pool_available(pool_t *pool) +static inline int snd_seq_pool_available(struct snd_seq_pool *pool) { return pool->total_elements - atomic_read(&pool->counter); } -static inline int snd_seq_output_ok(pool_t *pool) +static inline int snd_seq_output_ok(struct snd_seq_pool *pool) { return snd_seq_pool_available(pool) >= pool->room; } @@ -72,7 +68,7 @@ static inline int snd_seq_output_ok(pool_t *pool) * call dump function to expand external data. */ -static int get_var_len(const snd_seq_event_t *event) +static int get_var_len(const struct snd_seq_event *event) { if ((event->flags & SNDRV_SEQ_EVENT_LENGTH_MASK) != SNDRV_SEQ_EVENT_LENGTH_VARIABLE) return -EINVAL; @@ -80,17 +76,18 @@ static int get_var_len(const snd_seq_event_t *event) return event->data.ext.len & ~SNDRV_SEQ_EXT_MASK; } -int snd_seq_dump_var_event(const snd_seq_event_t *event, snd_seq_dump_func_t func, void *private_data) +int snd_seq_dump_var_event(const struct snd_seq_event *event, + snd_seq_dump_func_t func, void *private_data) { int len, err; - snd_seq_event_cell_t *cell; + struct snd_seq_event_cell *cell; if ((len = get_var_len(event)) <= 0) return len; if (event->data.ext.len & SNDRV_SEQ_EXT_USRPTR) { char buf[32]; - char __user *curptr = (char __user *)event->data.ext.ptr; + char __user *curptr = (char __force __user *)event->data.ext.ptr; while (len > 0) { int size = sizeof(buf); if (len < size) @@ -108,9 +105,9 @@ int snd_seq_dump_var_event(const snd_seq_event_t *event, snd_seq_dump_func_t fun return func(private_data, event->data.ext.ptr, len); } - cell = (snd_seq_event_cell_t*)event->data.ext.ptr; + cell = (struct snd_seq_event_cell *)event->data.ext.ptr; for (; len > 0 && cell; cell = cell->next) { - int size = sizeof(snd_seq_event_t); + int size = sizeof(struct snd_seq_event); if (len < size) size = len; err = func(private_data, &cell->event, size); @@ -121,6 +118,8 @@ int snd_seq_dump_var_event(const snd_seq_event_t *event, snd_seq_dump_func_t fun return 0; } +EXPORT_SYMBOL(snd_seq_dump_var_event); + /* * exported: @@ -142,7 +141,8 @@ static int seq_copy_in_user(char __user **bufptr, const void *src, int size) return 0; } -int snd_seq_expand_var_event(const snd_seq_event_t *event, int count, char *buf, int in_kernel, int size_aligned) +int snd_seq_expand_var_event(const struct snd_seq_event *event, int count, char *buf, + int in_kernel, int size_aligned) { int len, newlen; int err; @@ -151,14 +151,14 @@ int snd_seq_expand_var_event(const snd_seq_event_t *event, int count, char *buf, return len; newlen = len; if (size_aligned > 0) - newlen = ((len + size_aligned - 1) / size_aligned) * size_aligned; + newlen = roundup(len, size_aligned); if (count < newlen) return -EAGAIN; if (event->data.ext.len & SNDRV_SEQ_EXT_USRPTR) { if (! in_kernel) return -EINVAL; - if (copy_from_user(buf, (void __user *)event->data.ext.ptr, len)) + if (copy_from_user(buf, (void __force __user *)event->data.ext.ptr, len)) return -EFAULT; return newlen; } @@ -169,32 +169,36 @@ int snd_seq_expand_var_event(const snd_seq_event_t *event, int count, char *buf, return err < 0 ? err : newlen; } +EXPORT_SYMBOL(snd_seq_expand_var_event); /* * release this cell, free extended data if available */ -static inline void free_cell(pool_t *pool, snd_seq_event_cell_t *cell) +static inline void free_cell(struct snd_seq_pool *pool, + struct snd_seq_event_cell *cell) { cell->next = pool->free; pool->free = cell; atomic_dec(&pool->counter); } -void snd_seq_cell_free(snd_seq_event_cell_t * cell) +void snd_seq_cell_free(struct snd_seq_event_cell * cell) { unsigned long flags; - pool_t *pool; + struct snd_seq_pool *pool; - snd_assert(cell != NULL, return); + if (snd_BUG_ON(!cell)) + return; pool = cell->pool; - snd_assert(pool != NULL, return); + if (snd_BUG_ON(!pool)) + return; spin_lock_irqsave(&pool->lock, flags); free_cell(pool, cell); if (snd_seq_ev_is_variable(&cell->event)) { if (cell->event.data.ext.len & SNDRV_SEQ_EXT_CHAINED) { - snd_seq_event_cell_t *curp, *nextptr; + struct snd_seq_event_cell *curp, *nextptr; curp = cell->event.data.ext.ptr; for (; curp; curp = nextptr) { nextptr = curp->next; @@ -215,9 +219,11 @@ void snd_seq_cell_free(snd_seq_event_cell_t * cell) /* * allocate an event cell. */ -static int snd_seq_cell_alloc(pool_t *pool, snd_seq_event_cell_t **cellp, int nonblock, struct file *file) +static int snd_seq_cell_alloc(struct snd_seq_pool *pool, + struct snd_seq_event_cell **cellp, + int nonblock, struct file *file) { - snd_seq_event_cell_t *cell; + struct snd_seq_event_cell *cell; unsigned long flags; int err = -EAGAIN; wait_queue_t wait; @@ -230,7 +236,7 @@ static int snd_seq_cell_alloc(pool_t *pool, snd_seq_event_cell_t **cellp, int no init_waitqueue_entry(&wait, current); spin_lock_irqsave(&pool->lock, flags); if (pool->ptr == NULL) { /* not initialized */ - snd_printd("seq: pool is not initialized\n"); + pr_debug("ALSA: seq: pool is not initialized\n"); err = -EINVAL; goto __error; } @@ -280,11 +286,13 @@ __error: * if the event has external data, the data is decomposed to additional * cells. */ -int snd_seq_event_dup(pool_t *pool, snd_seq_event_t *event, snd_seq_event_cell_t **cellp, int nonblock, struct file *file) +int snd_seq_event_dup(struct snd_seq_pool *pool, struct snd_seq_event *event, + struct snd_seq_event_cell **cellp, int nonblock, + struct file *file) { int ncells, err; unsigned int extlen; - snd_seq_event_cell_t *cell; + struct snd_seq_event_cell *cell; *cellp = NULL; @@ -292,7 +300,7 @@ int snd_seq_event_dup(pool_t *pool, snd_seq_event_t *event, snd_seq_event_cell_t extlen = 0; if (snd_seq_ev_is_variable(event)) { extlen = event->data.ext.len & ~SNDRV_SEQ_EXT_MASK; - ncells = (extlen + sizeof(snd_seq_event_t) - 1) / sizeof(snd_seq_event_t); + ncells = (extlen + sizeof(struct snd_seq_event) - 1) / sizeof(struct snd_seq_event); } if (ncells >= pool->total_elements) return -ENOMEM; @@ -309,18 +317,18 @@ int snd_seq_event_dup(pool_t *pool, snd_seq_event_t *event, snd_seq_event_cell_t int len = extlen; int is_chained = event->data.ext.len & SNDRV_SEQ_EXT_CHAINED; int is_usrptr = event->data.ext.len & SNDRV_SEQ_EXT_USRPTR; - snd_seq_event_cell_t *src, *tmp, *tail; + struct snd_seq_event_cell *src, *tmp, *tail; char *buf; cell->event.data.ext.len = extlen | SNDRV_SEQ_EXT_CHAINED; cell->event.data.ext.ptr = NULL; - src = (snd_seq_event_cell_t*)event->data.ext.ptr; + src = (struct snd_seq_event_cell *)event->data.ext.ptr; buf = (char *)event->data.ext.ptr; tail = NULL; while (ncells-- > 0) { - int size = sizeof(snd_seq_event_t); + int size = sizeof(struct snd_seq_event); if (len < size) size = len; err = snd_seq_cell_alloc(pool, &tmp, nonblock, file); @@ -336,7 +344,7 @@ int snd_seq_event_dup(pool_t *pool, snd_seq_event_t *event, snd_seq_event_cell_t tmp->event = src->event; src = src->next; } else if (is_usrptr) { - if (copy_from_user(&tmp->event, (char __user *)buf, size)) { + if (copy_from_user(&tmp->event, (char __force __user *)buf, size)) { err = -EFAULT; goto __error; } @@ -358,7 +366,8 @@ __error: /* poll wait */ -int snd_seq_pool_poll_wait(pool_t *pool, struct file *file, poll_table *wait) +int snd_seq_pool_poll_wait(struct snd_seq_pool *pool, struct file *file, + poll_table *wait) { poll_wait(file, &pool->output_sleep, wait); return snd_seq_output_ok(pool); @@ -366,19 +375,20 @@ int snd_seq_pool_poll_wait(pool_t *pool, struct file *file, poll_table *wait) /* allocate room specified number of events */ -int snd_seq_pool_init(pool_t *pool) +int snd_seq_pool_init(struct snd_seq_pool *pool) { int cell; - snd_seq_event_cell_t *cellptr; + struct snd_seq_event_cell *cellptr; unsigned long flags; - snd_assert(pool != NULL, return -EINVAL); + if (snd_BUG_ON(!pool)) + return -EINVAL; if (pool->ptr) /* should be atomic? */ return 0; - pool->ptr = vmalloc(sizeof(snd_seq_event_cell_t) * pool->size); + pool->ptr = vmalloc(sizeof(struct snd_seq_event_cell) * pool->size); if (pool->ptr == NULL) { - snd_printd("seq: malloc for sequencer events failed\n"); + pr_debug("ALSA: seq: malloc for sequencer events failed\n"); return -ENOMEM; } @@ -402,13 +412,14 @@ int snd_seq_pool_init(pool_t *pool) } /* remove events */ -int snd_seq_pool_done(pool_t *pool) +int snd_seq_pool_done(struct snd_seq_pool *pool) { unsigned long flags; - snd_seq_event_cell_t *ptr; + struct snd_seq_event_cell *ptr; int max_count = 5 * HZ; - snd_assert(pool != NULL, return -EINVAL); + if (snd_BUG_ON(!pool)) + return -EINVAL; /* wait for closing all threads */ spin_lock_irqsave(&pool->lock, flags); @@ -420,11 +431,10 @@ int snd_seq_pool_done(pool_t *pool) while (atomic_read(&pool->counter) > 0) { if (max_count == 0) { - snd_printk(KERN_WARNING "snd_seq_pool_done timeout: %d cells remain\n", atomic_read(&pool->counter)); + pr_warn("ALSA: snd_seq_pool_done timeout: %d cells remain\n", atomic_read(&pool->counter)); break; } - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(1); + schedule_timeout_uninterruptible(1); max_count--; } @@ -447,14 +457,14 @@ int snd_seq_pool_done(pool_t *pool) /* init new memory pool */ -pool_t *snd_seq_pool_new(int poolsize) +struct snd_seq_pool *snd_seq_pool_new(int poolsize) { - pool_t *pool; + struct snd_seq_pool *pool; /* create pool block */ pool = kzalloc(sizeof(*pool), GFP_KERNEL); if (pool == NULL) { - snd_printd("seq: malloc failed for pool\n"); + pr_debug("ALSA: seq: malloc failed for pool\n"); return NULL; } spin_lock_init(&pool->lock); @@ -473,9 +483,9 @@ pool_t *snd_seq_pool_new(int poolsize) } /* remove memory pool */ -int snd_seq_pool_delete(pool_t **ppool) +int snd_seq_pool_delete(struct snd_seq_pool **ppool) { - pool_t *pool = *ppool; + struct snd_seq_pool *pool = *ppool; *ppool = NULL; if (pool == NULL) @@ -498,7 +508,8 @@ void __exit snd_sequencer_memory_done(void) /* exported to seq_clientmgr.c */ -void snd_seq_info_pool(snd_info_buffer_t * buffer, pool_t *pool, char *space) +void snd_seq_info_pool(struct snd_info_buffer *buffer, + struct snd_seq_pool *pool, char *space) { if (pool == NULL) return; diff --git a/sound/core/seq/seq_memory.h b/sound/core/seq/seq_memory.h index 6c4dde5d3d6..4a2ec779b8a 100644 --- a/sound/core/seq/seq_memory.h +++ b/sound/core/seq/seq_memory.h @@ -24,23 +24,23 @@ #include <sound/seq_kernel.h> #include <linux/poll.h> -typedef struct pool pool_t; +struct snd_info_buffer; /* container for sequencer event (internal use) */ -typedef struct snd_seq_event_cell_t { - snd_seq_event_t event; - pool_t *pool; /* used pool */ - struct snd_seq_event_cell_t *next; /* next cell */ -} snd_seq_event_cell_t; +struct snd_seq_event_cell { + struct snd_seq_event event; + struct snd_seq_pool *pool; /* used pool */ + struct snd_seq_event_cell *next; /* next cell */ +}; -/* design note: the pool is a contigious block of memory, if we dynamicly +/* design note: the pool is a contiguous block of memory, if we dynamicly want to add additional cells to the pool be better store this in another pool as we need to know the base address of the pool when releasing memory. */ -struct pool { - snd_seq_event_cell_t *ptr; /* pointer to first event chunk */ - snd_seq_event_cell_t *free; /* pointer to the head of the free list */ +struct snd_seq_pool { + struct snd_seq_event_cell *ptr; /* pointer to first event chunk */ + struct snd_seq_event_cell *free; /* pointer to the head of the free list */ int total_elements; /* pool size actually allocated */ atomic_t counter; /* cells free */ @@ -63,33 +63,34 @@ struct pool { spinlock_t lock; }; -extern void snd_seq_cell_free(snd_seq_event_cell_t* cell); +void snd_seq_cell_free(struct snd_seq_event_cell *cell); -int snd_seq_event_dup(pool_t *pool, snd_seq_event_t *event, snd_seq_event_cell_t **cellp, int nonblock, struct file *file); +int snd_seq_event_dup(struct snd_seq_pool *pool, struct snd_seq_event *event, + struct snd_seq_event_cell **cellp, int nonblock, struct file *file); /* return number of unused (free) cells */ -static inline int snd_seq_unused_cells(pool_t *pool) +static inline int snd_seq_unused_cells(struct snd_seq_pool *pool) { return pool ? pool->total_elements - atomic_read(&pool->counter) : 0; } /* return total number of allocated cells */ -static inline int snd_seq_total_cells(pool_t *pool) +static inline int snd_seq_total_cells(struct snd_seq_pool *pool) { return pool ? pool->total_elements : 0; } /* init pool - allocate events */ -int snd_seq_pool_init(pool_t *pool); +int snd_seq_pool_init(struct snd_seq_pool *pool); /* done pool - free events */ -int snd_seq_pool_done(pool_t *pool); +int snd_seq_pool_done(struct snd_seq_pool *pool); /* create pool */ -pool_t *snd_seq_pool_new(int poolsize); +struct snd_seq_pool *snd_seq_pool_new(int poolsize); /* remove pool */ -int snd_seq_pool_delete(pool_t **pool); +int snd_seq_pool_delete(struct snd_seq_pool **pool); /* init memory */ int snd_sequencer_memory_init(void); @@ -98,7 +99,9 @@ int snd_sequencer_memory_init(void); void snd_sequencer_memory_done(void); /* polling */ -int snd_seq_pool_poll_wait(pool_t *pool, struct file *file, poll_table *wait); +int snd_seq_pool_poll_wait(struct snd_seq_pool *pool, struct file *file, poll_table *wait); +void snd_seq_info_pool(struct snd_info_buffer *buffer, + struct snd_seq_pool *pool, char *space); #endif diff --git a/sound/core/seq/seq_midi.c b/sound/core/seq/seq_midi.c index b4674ae3bc3..a1fd77af605 100644 --- a/sound/core/seq/seq_midi.c +++ b/sound/core/seq/seq_midi.c @@ -1,7 +1,7 @@ /* * Generic MIDI synth driver for ALSA sequencer * Copyright (c) 1998 by Frank van de Pol <fvdpol@coil.demon.nl> - * Jaroslav Kysela <perex@suse.cz> + * Jaroslav Kysela <perex@perex.cz> * * 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 @@ -26,13 +26,12 @@ Possible options for midisynth module: */ -#include <sound/driver.h> #include <linux/init.h> #include <linux/slab.h> #include <linux/errno.h> #include <linux/string.h> -#include <linux/moduleparam.h> -#include <asm/semaphore.h> +#include <linux/module.h> +#include <linux/mutex.h> #include <sound/core.h> #include <sound/rawmidi.h> #include <sound/seq_kernel.h> @@ -40,7 +39,7 @@ Possible options for midisynth module: #include <sound/seq_midi_event.h> #include <sound/initval.h> -MODULE_AUTHOR("Frank van de Pol <fvdpol@coil.demon.nl>, Jaroslav Kysela <perex@suse.cz>"); +MODULE_AUTHOR("Frank van de Pol <fvdpol@coil.demon.nl>, Jaroslav Kysela <perex@perex.cz>"); MODULE_DESCRIPTION("Advanced Linux Sound Architecture sequencer MIDI synth."); MODULE_LICENSE("GPL"); static int output_buffer_size = PAGE_SIZE; @@ -51,40 +50,40 @@ module_param(input_buffer_size, int, 0644); MODULE_PARM_DESC(input_buffer_size, "Input buffer size in bytes."); /* data for this midi synth driver */ -typedef struct { - snd_card_t *card; +struct seq_midisynth { + struct snd_card *card; int device; int subdevice; - snd_rawmidi_file_t input_rfile; - snd_rawmidi_file_t output_rfile; + struct snd_rawmidi_file input_rfile; + struct snd_rawmidi_file output_rfile; int seq_client; int seq_port; - snd_midi_event_t *parser; -} seq_midisynth_t; + struct snd_midi_event *parser; +}; -typedef struct { +struct seq_midisynth_client { int seq_client; int num_ports; int ports_per_device[SNDRV_RAWMIDI_DEVICES]; - seq_midisynth_t *ports[SNDRV_RAWMIDI_DEVICES]; -} seq_midisynth_client_t; + struct seq_midisynth *ports[SNDRV_RAWMIDI_DEVICES]; +}; -static seq_midisynth_client_t *synths[SNDRV_CARDS]; -static DECLARE_MUTEX(register_mutex); +static struct seq_midisynth_client *synths[SNDRV_CARDS]; +static DEFINE_MUTEX(register_mutex); /* handle rawmidi input event (MIDI v1.0 stream) */ -static void snd_midi_input_event(snd_rawmidi_substream_t * substream) +static void snd_midi_input_event(struct snd_rawmidi_substream *substream) { - snd_rawmidi_runtime_t *runtime; - seq_midisynth_t *msynth; - snd_seq_event_t ev; + struct snd_rawmidi_runtime *runtime; + struct seq_midisynth *msynth; + struct snd_seq_event ev; char buf[16], *pbuf; long res, count; if (substream == NULL) return; runtime = substream->runtime; - msynth = (seq_midisynth_t *) runtime->private_data; + msynth = runtime->private_data; if (msynth == NULL) return; memset(&ev, 0, sizeof(ev)); @@ -112,15 +111,17 @@ static void snd_midi_input_event(snd_rawmidi_substream_t * substream) } } -static int dump_midi(snd_rawmidi_substream_t *substream, const char *buf, int count) +static int dump_midi(struct snd_rawmidi_substream *substream, const char *buf, int count) { - snd_rawmidi_runtime_t *runtime; + struct snd_rawmidi_runtime *runtime; int tmp; - snd_assert(substream != NULL || buf != NULL, return -EINVAL); + if (snd_BUG_ON(!substream || !buf)) + return -EINVAL; runtime = substream->runtime; if ((tmp = runtime->avail) < count) { - snd_printd("warning, output event was lost (count = %i, available = %i)\n", count, tmp); + if (printk_ratelimit()) + pr_err("ALSA: seq_midi: MIDI output buffer overrun\n"); return -ENOMEM; } if (snd_rawmidi_kernel_write(substream, buf, count) < count) @@ -128,22 +129,23 @@ static int dump_midi(snd_rawmidi_substream_t *substream, const char *buf, int co return 0; } -static int event_process_midi(snd_seq_event_t * ev, int direct, +static int event_process_midi(struct snd_seq_event *ev, int direct, void *private_data, int atomic, int hop) { - seq_midisynth_t *msynth = (seq_midisynth_t *) private_data; + struct seq_midisynth *msynth = private_data; unsigned char msg[10]; /* buffer for constructing midi messages */ - snd_rawmidi_substream_t *substream; + struct snd_rawmidi_substream *substream; int len; - snd_assert(msynth != NULL, return -EINVAL); + if (snd_BUG_ON(!msynth)) + return -EINVAL; substream = msynth->output_rfile.output; if (substream == NULL) return -ENODEV; if (ev->type == SNDRV_SEQ_EVENT_SYSEX) { /* special case, to save space */ if ((ev->flags & SNDRV_SEQ_EVENT_LENGTH_MASK) != SNDRV_SEQ_EVENT_LENGTH_VARIABLE) { /* invalid event */ - snd_printd("seq_midi: invalid sysex event flags = 0x%x\n", ev->flags); + pr_debug("ALSA: seq_midi: invalid sysex event flags = 0x%x\n", ev->flags); return 0; } snd_seq_dump_var_event(ev, (snd_seq_dump_func_t)dump_midi, substream); @@ -161,8 +163,8 @@ static int event_process_midi(snd_seq_event_t * ev, int direct, } -static int snd_seq_midisynth_new(seq_midisynth_t *msynth, - snd_card_t *card, +static int snd_seq_midisynth_new(struct seq_midisynth *msynth, + struct snd_card *card, int device, int subdevice) { @@ -175,16 +177,19 @@ static int snd_seq_midisynth_new(seq_midisynth_t *msynth, } /* open associated midi device for input */ -static int midisynth_subscribe(void *private_data, snd_seq_port_subscribe_t *info) +static int midisynth_subscribe(void *private_data, struct snd_seq_port_subscribe *info) { int err; - seq_midisynth_t *msynth = (seq_midisynth_t *)private_data; - snd_rawmidi_runtime_t *runtime; - snd_rawmidi_params_t params; + struct seq_midisynth *msynth = private_data; + struct snd_rawmidi_runtime *runtime; + struct snd_rawmidi_params params; /* open midi port */ - if ((err = snd_rawmidi_kernel_open(msynth->card->number, msynth->device, msynth->subdevice, SNDRV_RAWMIDI_LFLG_INPUT, &msynth->input_rfile)) < 0) { - snd_printd("midi input open failed!!!\n"); + if ((err = snd_rawmidi_kernel_open(msynth->card, msynth->device, + msynth->subdevice, + SNDRV_RAWMIDI_LFLG_INPUT, + &msynth->input_rfile)) < 0) { + pr_debug("ALSA: seq_midi: midi input open failed!!!\n"); return err; } runtime = msynth->input_rfile.input->runtime; @@ -203,31 +208,36 @@ static int midisynth_subscribe(void *private_data, snd_seq_port_subscribe_t *inf } /* close associated midi device for input */ -static int midisynth_unsubscribe(void *private_data, snd_seq_port_subscribe_t *info) +static int midisynth_unsubscribe(void *private_data, struct snd_seq_port_subscribe *info) { int err; - seq_midisynth_t *msynth = (seq_midisynth_t *)private_data; + struct seq_midisynth *msynth = private_data; - snd_assert(msynth->input_rfile.input != NULL, return -EINVAL); + if (snd_BUG_ON(!msynth->input_rfile.input)) + return -EINVAL; err = snd_rawmidi_kernel_release(&msynth->input_rfile); return err; } /* open associated midi device for output */ -static int midisynth_use(void *private_data, snd_seq_port_subscribe_t *info) +static int midisynth_use(void *private_data, struct snd_seq_port_subscribe *info) { int err; - seq_midisynth_t *msynth = (seq_midisynth_t *)private_data; - snd_rawmidi_params_t params; + struct seq_midisynth *msynth = private_data; + struct snd_rawmidi_params params; /* open midi port */ - if ((err = snd_rawmidi_kernel_open(msynth->card->number, msynth->device, msynth->subdevice, SNDRV_RAWMIDI_LFLG_OUTPUT, &msynth->output_rfile)) < 0) { - snd_printd("midi output open failed!!!\n"); + if ((err = snd_rawmidi_kernel_open(msynth->card, msynth->device, + msynth->subdevice, + SNDRV_RAWMIDI_LFLG_OUTPUT, + &msynth->output_rfile)) < 0) { + pr_debug("ALSA: seq_midi: midi output open failed!!!\n"); return err; } memset(¶ms, 0, sizeof(params)); params.avail_min = 1; params.buffer_size = output_buffer_size; + params.no_active_sensing = 1; if ((err = snd_rawmidi_output_params(msynth->output_rfile.output, ¶ms)) < 0) { snd_rawmidi_kernel_release(&msynth->output_rfile); return err; @@ -237,20 +247,18 @@ static int midisynth_use(void *private_data, snd_seq_port_subscribe_t *info) } /* close associated midi device for output */ -static int midisynth_unuse(void *private_data, snd_seq_port_subscribe_t *info) +static int midisynth_unuse(void *private_data, struct snd_seq_port_subscribe *info) { - seq_midisynth_t *msynth = (seq_midisynth_t *)private_data; - unsigned char buf = 0xff; /* MIDI reset */ + struct seq_midisynth *msynth = private_data; - snd_assert(msynth->output_rfile.output != NULL, return -EINVAL); - /* sending single MIDI reset message to shut the device up */ - snd_rawmidi_kernel_write(msynth->output_rfile.output, &buf, 1); + if (snd_BUG_ON(!msynth->output_rfile.output)) + return -EINVAL; snd_rawmidi_drain_output(msynth->output_rfile.output); return snd_rawmidi_kernel_release(&msynth->output_rfile); } /* delete given midi synth port */ -static void snd_seq_midisynth_delete(seq_midisynth_t *msynth) +static void snd_seq_midisynth_delete(struct seq_midisynth *msynth) { if (msynth == NULL) return; @@ -264,38 +272,24 @@ static void snd_seq_midisynth_delete(seq_midisynth_t *msynth) snd_midi_event_free(msynth->parser); } -/* set our client name */ -static int set_client_name(seq_midisynth_client_t *client, snd_card_t *card, - snd_rawmidi_info_t *rmidi) -{ - snd_seq_client_info_t cinfo; - const char *name; - - memset(&cinfo, 0, sizeof(cinfo)); - cinfo.client = client->seq_client; - cinfo.type = KERNEL_CLIENT; - name = rmidi->name[0] ? (const char *)rmidi->name : "External MIDI"; - strlcpy(cinfo.name, name, sizeof(cinfo.name)); - return snd_seq_kernel_client_ctl(client->seq_client, SNDRV_SEQ_IOCTL_SET_CLIENT_INFO, &cinfo); -} - /* register new midi synth port */ static int -snd_seq_midisynth_register_port(snd_seq_device_t *dev) +snd_seq_midisynth_register_port(struct snd_seq_device *dev) { - seq_midisynth_client_t *client; - seq_midisynth_t *msynth, *ms; - snd_seq_port_info_t *port; - snd_rawmidi_info_t *info; + struct seq_midisynth_client *client; + struct seq_midisynth *msynth, *ms; + struct snd_seq_port_info *port; + struct snd_rawmidi_info *info; + struct snd_rawmidi *rmidi = dev->private_data; int newclient = 0; unsigned int p, ports; - snd_seq_client_callback_t callbacks; - snd_seq_port_callback_t pcallbacks; - snd_card_t *card = dev->card; + struct snd_seq_port_callback pcallbacks; + struct snd_card *card = dev->card; int device = dev->device; unsigned int input_count = 0, output_count = 0; - snd_assert(card != NULL && device >= 0 && device < SNDRV_RAWMIDI_DEVICES, return -EINVAL); + if (snd_BUG_ON(!card || device < 0 || device >= SNDRV_RAWMIDI_DEVICES)) + return -EINVAL; info = kmalloc(sizeof(*info), GFP_KERNEL); if (! info) return -ENOMEM; @@ -318,31 +312,29 @@ snd_seq_midisynth_register_port(snd_seq_device_t *dev) if (ports > (256 / SNDRV_RAWMIDI_DEVICES)) ports = 256 / SNDRV_RAWMIDI_DEVICES; - down(®ister_mutex); + mutex_lock(®ister_mutex); client = synths[card->number]; if (client == NULL) { newclient = 1; client = kzalloc(sizeof(*client), GFP_KERNEL); if (client == NULL) { - up(®ister_mutex); + mutex_unlock(®ister_mutex); kfree(info); return -ENOMEM; } - memset(&callbacks, 0, sizeof(callbacks)); - callbacks.private_data = client; - callbacks.allow_input = callbacks.allow_output = 1; - client->seq_client = snd_seq_create_kernel_client(card, 0, &callbacks); + client->seq_client = + snd_seq_create_kernel_client( + card, 0, "%s", card->shortname[0] ? + (const char *)card->shortname : "External MIDI"); if (client->seq_client < 0) { kfree(client); - up(®ister_mutex); + mutex_unlock(®ister_mutex); kfree(info); return -ENOMEM; } - set_client_name(client, card, info); - } else if (device == 0) - set_client_name(client, card, info); /* use the first device's name */ + } - msynth = kcalloc(ports, sizeof(seq_midisynth_t), GFP_KERNEL); + msynth = kcalloc(ports, sizeof(struct seq_midisynth), GFP_KERNEL); port = kmalloc(sizeof(*port), GFP_KERNEL); if (msynth == NULL || port == NULL) goto __nomem; @@ -370,13 +362,13 @@ snd_seq_midisynth_register_port(snd_seq_device_t *dev) if (! port->name[0]) { if (info->name[0]) { if (ports > 1) - snprintf(port->name, sizeof(port->name), "%s-%d", info->name, p); + snprintf(port->name, sizeof(port->name), "%s-%u", info->name, p); else snprintf(port->name, sizeof(port->name), "%s", info->name); } else { /* last resort */ if (ports > 1) - sprintf(port->name, "MIDI %d-%d-%d", card->number, device, p); + sprintf(port->name, "MIDI %d-%d-%u", card->number, device, p); else sprintf(port->name, "MIDI %d-%d", card->number, device); } @@ -388,7 +380,9 @@ snd_seq_midisynth_register_port(snd_seq_device_t *dev) if ((port->capability & (SNDRV_SEQ_PORT_CAP_WRITE|SNDRV_SEQ_PORT_CAP_READ)) == (SNDRV_SEQ_PORT_CAP_WRITE|SNDRV_SEQ_PORT_CAP_READ) && info->flags & SNDRV_RAWMIDI_INFO_DUPLEX) port->capability |= SNDRV_SEQ_PORT_CAP_DUPLEX; - port->type = SNDRV_SEQ_PORT_TYPE_MIDI_GENERIC; + port->type = SNDRV_SEQ_PORT_TYPE_MIDI_GENERIC + | SNDRV_SEQ_PORT_TYPE_HARDWARE + | SNDRV_SEQ_PORT_TYPE_PORT; port->midi_channels = 16; memset(&pcallbacks, 0, sizeof(pcallbacks)); pcallbacks.owner = THIS_MODULE; @@ -399,6 +393,8 @@ snd_seq_midisynth_register_port(snd_seq_device_t *dev) pcallbacks.unuse = midisynth_unuse; pcallbacks.event_input = event_process_midi; port->kernel = &pcallbacks; + if (rmidi->ops && rmidi->ops->get_port_info) + rmidi->ops->get_port_info(rmidi, p, port); if (snd_seq_kernel_client_ctl(client->seq_client, SNDRV_SEQ_IOCTL_CREATE_PORT, port)<0) goto __nomem; ms->seq_client = client->seq_client; @@ -409,7 +405,7 @@ snd_seq_midisynth_register_port(snd_seq_device_t *dev) client->num_ports++; if (newclient) synths[card->number] = client; - up(®ister_mutex); + mutex_unlock(®ister_mutex); kfree(info); kfree(port); return 0; /* success */ @@ -426,48 +422,46 @@ snd_seq_midisynth_register_port(snd_seq_device_t *dev) } kfree(info); kfree(port); - up(®ister_mutex); + mutex_unlock(®ister_mutex); return -ENOMEM; } /* release midi synth port */ static int -snd_seq_midisynth_unregister_port(snd_seq_device_t *dev) +snd_seq_midisynth_unregister_port(struct snd_seq_device *dev) { - seq_midisynth_client_t *client; - seq_midisynth_t *msynth; - snd_card_t *card = dev->card; + struct seq_midisynth_client *client; + struct seq_midisynth *msynth; + struct snd_card *card = dev->card; int device = dev->device, p, ports; - down(®ister_mutex); + mutex_lock(®ister_mutex); client = synths[card->number]; if (client == NULL || client->ports[device] == NULL) { - up(®ister_mutex); + mutex_unlock(®ister_mutex); return -ENODEV; } ports = client->ports_per_device[device]; client->ports_per_device[device] = 0; msynth = client->ports[device]; client->ports[device] = NULL; - snd_runtime_check(msynth != NULL || ports <= 0, goto __skip); for (p = 0; p < ports; p++) snd_seq_midisynth_delete(&msynth[p]); kfree(msynth); - __skip: client->num_ports--; if (client->num_ports <= 0) { snd_seq_delete_kernel_client(client->seq_client); synths[card->number] = NULL; kfree(client); } - up(®ister_mutex); + mutex_unlock(®ister_mutex); return 0; } static int __init alsa_seq_midi_init(void) { - static snd_seq_dev_ops_t ops = { + static struct snd_seq_dev_ops ops = { snd_seq_midisynth_register_port, snd_seq_midisynth_unregister_port, }; diff --git a/sound/core/seq/seq_midi_emul.c b/sound/core/seq/seq_midi_emul.c index 35fe8a7e34b..9b6470cdcf2 100644 --- a/sound/core/seq/seq_midi_emul.c +++ b/sound/core/seq/seq_midi_emul.c @@ -29,10 +29,10 @@ * code in here. If there is it should be reported as a bug. */ -#include <sound/driver.h> #include <linux/init.h> #include <linux/slab.h> #include <linux/string.h> +#include <linux/module.h> #include <sound/core.h> #include <sound/seq_kernel.h> #include <sound/seq_midi_emul.h> @@ -44,17 +44,25 @@ MODULE_DESCRIPTION("Advanced Linux Sound Architecture sequencer MIDI emulation." MODULE_LICENSE("GPL"); /* Prototypes for static functions */ -static void note_off(snd_midi_op_t *ops, void *drv, snd_midi_channel_t *chan, int note, int vel); -static void do_control(snd_midi_op_t *ops, void *private, - snd_midi_channel_set_t *chset, snd_midi_channel_t *chan, +static void note_off(struct snd_midi_op *ops, void *drv, + struct snd_midi_channel *chan, + int note, int vel); +static void do_control(struct snd_midi_op *ops, void *private, + struct snd_midi_channel_set *chset, + struct snd_midi_channel *chan, int control, int value); -static void rpn(snd_midi_op_t *ops, void *drv, snd_midi_channel_t *chan, snd_midi_channel_set_t *chset); -static void nrpn(snd_midi_op_t *ops, void *drv, snd_midi_channel_t *chan, snd_midi_channel_set_t *chset); -static void sysex(snd_midi_op_t *ops, void *private, unsigned char *sysex, int len, snd_midi_channel_set_t *chset); -static void all_sounds_off(snd_midi_op_t *ops, void *private, snd_midi_channel_t *chan); -static void all_notes_off(snd_midi_op_t *ops, void *private, snd_midi_channel_t *chan); -static void snd_midi_reset_controllers(snd_midi_channel_t *chan); -static void reset_all_channels(snd_midi_channel_set_t *chset); +static void rpn(struct snd_midi_op *ops, void *drv, struct snd_midi_channel *chan, + struct snd_midi_channel_set *chset); +static void nrpn(struct snd_midi_op *ops, void *drv, struct snd_midi_channel *chan, + struct snd_midi_channel_set *chset); +static void sysex(struct snd_midi_op *ops, void *private, unsigned char *sysex, + int len, struct snd_midi_channel_set *chset); +static void all_sounds_off(struct snd_midi_op *ops, void *private, + struct snd_midi_channel *chan); +static void all_notes_off(struct snd_midi_op *ops, void *private, + struct snd_midi_channel *chan); +static void snd_midi_reset_controllers(struct snd_midi_channel *chan); +static void reset_all_channels(struct snd_midi_channel_set *chset); /* @@ -63,7 +71,7 @@ static void reset_all_channels(snd_midi_channel_set_t *chset); * such as GM, GS and XG. * There modes that this module will run in are: * Generic MIDI - no interpretation at all, it will just save current values - * of controlers etc. + * of controllers etc. * GM - You can use all gm_ prefixed elements of chan. Controls, RPN, NRPN, * SysEx will be interpreded as defined in General Midi. * GS - You can use all gs_ prefixed elements of chan. Codes for GS will be @@ -72,15 +80,16 @@ static void reset_all_channels(snd_midi_channel_set_t *chset); * be interpreted. */ void -snd_midi_process_event(snd_midi_op_t *ops, - snd_seq_event_t *ev, snd_midi_channel_set_t *chanset) +snd_midi_process_event(struct snd_midi_op *ops, + struct snd_seq_event *ev, + struct snd_midi_channel_set *chanset) { - snd_midi_channel_t *chan; + struct snd_midi_channel *chan; void *drv; int dest_channel = 0; if (ev == NULL || chanset == NULL) { - snd_printd("ev or chanbase NULL (snd_midi_process_event)\n"); + pr_debug("ALSA: seq_midi_emul: ev or chanbase NULL (snd_midi_process_event)\n"); return; } if (chanset->channels == NULL) @@ -89,7 +98,8 @@ snd_midi_process_event(snd_midi_op_t *ops, if (snd_seq_ev_is_channel_type(ev)) { dest_channel = ev->data.note.channel; if (dest_channel >= chanset->max_channels) { - snd_printd("dest channel is %d, max is %d\n", dest_channel, chanset->max_channels); + pr_debug("ALSA: seq_midi_emul: dest channel is %d, max is %d\n", + dest_channel, chanset->max_channels); return; } } @@ -166,7 +176,7 @@ snd_midi_process_event(snd_midi_op_t *ops, ev->data.control.value); break; case SNDRV_SEQ_EVENT_NONREGPARAM: - /* Break it back into its controler values */ + /* Break it back into its controller values */ chan->param_type = SNDRV_MIDI_PARAM_TYPE_NONREGISTERED; chan->control[MIDI_CTL_MSB_DATA_ENTRY] = (ev->data.control.value >> 7) & 0x7f; @@ -179,7 +189,7 @@ snd_midi_process_event(snd_midi_op_t *ops, nrpn(ops, drv, chan, chanset); break; case SNDRV_SEQ_EVENT_REGPARAM: - /* Break it back into its controler values */ + /* Break it back into its controller values */ chan->param_type = SNDRV_MIDI_PARAM_TYPE_REGISTERED; chan->control[MIDI_CTL_MSB_DATA_ENTRY] = (ev->data.control.value >> 7) & 0x7f; @@ -219,17 +229,10 @@ snd_midi_process_event(snd_midi_op_t *ops, case SNDRV_SEQ_EVENT_PORT_START: case SNDRV_SEQ_EVENT_PORT_EXIT: case SNDRV_SEQ_EVENT_PORT_CHANGE: - case SNDRV_SEQ_EVENT_SAMPLE: - case SNDRV_SEQ_EVENT_SAMPLE_START: - case SNDRV_SEQ_EVENT_SAMPLE_STOP: - case SNDRV_SEQ_EVENT_SAMPLE_FREQ: - case SNDRV_SEQ_EVENT_SAMPLE_VOLUME: - case SNDRV_SEQ_EVENT_SAMPLE_LOOP: - case SNDRV_SEQ_EVENT_SAMPLE_POSITION: case SNDRV_SEQ_EVENT_ECHO: not_yet: default: - /*snd_printd("Unimplemented event %d\n", ev->type);*/ + /*pr_debug("ALSA: seq_midi_emul: Unimplemented event %d\n", ev->type);*/ break; } } @@ -239,7 +242,8 @@ snd_midi_process_event(snd_midi_op_t *ops, * release note */ static void -note_off(snd_midi_op_t *ops, void *drv, snd_midi_channel_t *chan, int note, int vel) +note_off(struct snd_midi_op *ops, void *drv, struct snd_midi_channel *chan, + int note, int vel) { if (chan->gm_hold) { /* Hold this note until pedal is turned off */ @@ -256,12 +260,12 @@ note_off(snd_midi_op_t *ops, void *drv, snd_midi_channel_t *chan, int note, int } /* - * Do all driver independent operations for this controler and pass + * Do all driver independent operations for this controller and pass * events that need to take place immediately to the driver. */ static void -do_control(snd_midi_op_t *ops, void *drv, snd_midi_channel_set_t *chset, - snd_midi_channel_t *chan, int control, int value) +do_control(struct snd_midi_op *ops, void *drv, struct snd_midi_channel_set *chset, + struct snd_midi_channel *chan, int control, int value) { int i; @@ -376,7 +380,7 @@ do_control(snd_midi_op_t *ops, void *drv, snd_midi_channel_set_t *chset, * initialize the MIDI status */ void -snd_midi_channel_set_clear(snd_midi_channel_set_t *chset) +snd_midi_channel_set_clear(struct snd_midi_channel_set *chset) { int i; @@ -384,7 +388,7 @@ snd_midi_channel_set_clear(snd_midi_channel_set_t *chset) chset->gs_master_volume = 127; for (i = 0; i < chset->max_channels; i++) { - snd_midi_channel_t *chan = chset->channels + i; + struct snd_midi_channel *chan = chset->channels + i; memset(chan->note, 0, sizeof(chan->note)); chan->midi_aftertouch = 0; @@ -407,8 +411,8 @@ snd_midi_channel_set_clear(snd_midi_channel_set_t *chset) * Process a rpn message. */ static void -rpn(snd_midi_op_t *ops, void *drv, snd_midi_channel_t *chan, - snd_midi_channel_set_t *chset) +rpn(struct snd_midi_op *ops, void *drv, struct snd_midi_channel *chan, + struct snd_midi_channel_set *chset) { int type; int val; @@ -447,8 +451,8 @@ rpn(snd_midi_op_t *ops, void *drv, snd_midi_channel_t *chan, * Process an nrpn message. */ static void -nrpn(snd_midi_op_t *ops, void *drv, snd_midi_channel_t *chan, - snd_midi_channel_set_t *chset) +nrpn(struct snd_midi_op *ops, void *drv, struct snd_midi_channel *chan, + struct snd_midi_channel_set *chset) { /* parse XG NRPNs here if possible */ if (ops->nrpn) @@ -475,7 +479,8 @@ get_channel(unsigned char cmd) * Process a sysex message. */ static void -sysex(snd_midi_op_t *ops, void *private, unsigned char *buf, int len, snd_midi_channel_set_t *chset) +sysex(struct snd_midi_op *ops, void *private, unsigned char *buf, int len, + struct snd_midi_channel_set *chset) { /* GM on */ static unsigned char gm_on_macro[] = { @@ -588,7 +593,7 @@ sysex(snd_midi_op_t *ops, void *private, unsigned char *buf, int len, snd_midi_c * all sound off */ static void -all_sounds_off(snd_midi_op_t *ops, void *drv, snd_midi_channel_t *chan) +all_sounds_off(struct snd_midi_op *ops, void *drv, struct snd_midi_channel *chan) { int n; @@ -606,7 +611,7 @@ all_sounds_off(snd_midi_op_t *ops, void *drv, snd_midi_channel_t *chan) * all notes off */ static void -all_notes_off(snd_midi_op_t *ops, void *drv, snd_midi_channel_t *chan) +all_notes_off(struct snd_midi_op *ops, void *drv, struct snd_midi_channel *chan) { int n; @@ -621,12 +626,12 @@ all_notes_off(snd_midi_op_t *ops, void *drv, snd_midi_channel_t *chan) /* * Initialise a single midi channel control block. */ -static void snd_midi_channel_init(snd_midi_channel_t *p, int n) +static void snd_midi_channel_init(struct snd_midi_channel *p, int n) { if (p == NULL) return; - memset(p, 0, sizeof(snd_midi_channel_t)); + memset(p, 0, sizeof(struct snd_midi_channel)); p->private = NULL; p->number = n; @@ -642,12 +647,12 @@ static void snd_midi_channel_init(snd_midi_channel_t *p, int n) /* * Allocate and initialise a set of midi channel control blocks. */ -static snd_midi_channel_t *snd_midi_channel_init_set(int n) +static struct snd_midi_channel *snd_midi_channel_init_set(int n) { - snd_midi_channel_t *chan; + struct snd_midi_channel *chan; int i; - chan = kmalloc(n * sizeof(snd_midi_channel_t), GFP_KERNEL); + chan = kmalloc(n * sizeof(struct snd_midi_channel), GFP_KERNEL); if (chan) { for (i = 0; i < n; i++) snd_midi_channel_init(chan+i, i); @@ -660,11 +665,11 @@ static snd_midi_channel_t *snd_midi_channel_init_set(int n) * reset all midi channels */ static void -reset_all_channels(snd_midi_channel_set_t *chset) +reset_all_channels(struct snd_midi_channel_set *chset) { int ch; for (ch = 0; ch < chset->max_channels; ch++) { - snd_midi_channel_t *chan = chset->channels + ch; + struct snd_midi_channel *chan = chset->channels + ch; snd_midi_reset_controllers(chan); chan->gm_rpn_pitch_bend_range = 256; /* 2 semitones */ chan->gm_rpn_fine_tuning = 0; @@ -681,9 +686,9 @@ reset_all_channels(snd_midi_channel_set_t *chset) /* * Allocate and initialise a midi channel set. */ -snd_midi_channel_set_t *snd_midi_channel_alloc_set(int n) +struct snd_midi_channel_set *snd_midi_channel_alloc_set(int n) { - snd_midi_channel_set_t *chset; + struct snd_midi_channel_set *chset; chset = kmalloc(sizeof(*chset), GFP_KERNEL); if (chset) { @@ -697,7 +702,7 @@ snd_midi_channel_set_t *snd_midi_channel_alloc_set(int n) /* * Reset the midi controllers on a particular channel to default values. */ -static void snd_midi_reset_controllers(snd_midi_channel_t *chan) +static void snd_midi_reset_controllers(struct snd_midi_channel *chan) { memset(chan->control, 0, sizeof(chan->control)); chan->gm_volume = 127; @@ -709,7 +714,7 @@ static void snd_midi_reset_controllers(snd_midi_channel_t *chan) /* * Free a midi channel set. */ -void snd_midi_channel_free_set(snd_midi_channel_set_t *chset) +void snd_midi_channel_free_set(struct snd_midi_channel_set *chset) { if (chset == NULL) return; diff --git a/sound/core/seq/seq_midi_event.c b/sound/core/seq/seq_midi_event.c index 2dc1aecfb42..37db7ba492a 100644 --- a/sound/core/seq/seq_midi_event.c +++ b/sound/core/seq/seq_midi_event.c @@ -2,7 +2,7 @@ * MIDI byte <-> sequencer event coder * * Copyright (C) 1998,99 Takashi Iwai <tiwai@suse.de>, - * Jaroslav Kysela <perex@suse.cz> + * Jaroslav Kysela <perex@perex.cz> * * 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 @@ -19,90 +19,89 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include <sound/driver.h> #include <linux/slab.h> #include <linux/errno.h> #include <linux/string.h> +#include <linux/module.h> #include <sound/core.h> #include <sound/seq_kernel.h> #include <sound/seq_midi_event.h> #include <sound/asoundef.h> -MODULE_AUTHOR("Takashi Iwai <tiwai@suse.de>, Jaroslav Kysela <perex@suse.cz>"); +MODULE_AUTHOR("Takashi Iwai <tiwai@suse.de>, Jaroslav Kysela <perex@perex.cz>"); MODULE_DESCRIPTION("MIDI byte <-> sequencer event coder"); MODULE_LICENSE("GPL"); -/* queue type */ -/* from 0 to 7 are normal commands (note off, on, etc.) */ -#define ST_NOTEOFF 0 -#define ST_NOTEON 1 +/* event type, index into status_event[] */ +/* from 0 to 6 are normal commands (note off, on, etc.) for 0x9?-0xe? */ +#define ST_INVALID 7 #define ST_SPECIAL 8 #define ST_SYSEX ST_SPECIAL /* from 8 to 15 are events for 0xf0-0xf7 */ -/* status event types */ -typedef void (*event_encode_t)(snd_midi_event_t *dev, snd_seq_event_t *ev); -typedef void (*event_decode_t)(snd_seq_event_t *ev, unsigned char *buf); - /* * prototypes */ -static void note_event(snd_midi_event_t *dev, snd_seq_event_t *ev); -static void one_param_ctrl_event(snd_midi_event_t *dev, snd_seq_event_t *ev); -static void pitchbend_ctrl_event(snd_midi_event_t *dev, snd_seq_event_t *ev); -static void two_param_ctrl_event(snd_midi_event_t *dev, snd_seq_event_t *ev); -static void one_param_event(snd_midi_event_t *dev, snd_seq_event_t *ev); -static void songpos_event(snd_midi_event_t *dev, snd_seq_event_t *ev); -static void note_decode(snd_seq_event_t *ev, unsigned char *buf); -static void one_param_decode(snd_seq_event_t *ev, unsigned char *buf); -static void pitchbend_decode(snd_seq_event_t *ev, unsigned char *buf); -static void two_param_decode(snd_seq_event_t *ev, unsigned char *buf); -static void songpos_decode(snd_seq_event_t *ev, unsigned char *buf); +static void note_event(struct snd_midi_event *dev, struct snd_seq_event *ev); +static void one_param_ctrl_event(struct snd_midi_event *dev, struct snd_seq_event *ev); +static void pitchbend_ctrl_event(struct snd_midi_event *dev, struct snd_seq_event *ev); +static void two_param_ctrl_event(struct snd_midi_event *dev, struct snd_seq_event *ev); +static void one_param_event(struct snd_midi_event *dev, struct snd_seq_event *ev); +static void songpos_event(struct snd_midi_event *dev, struct snd_seq_event *ev); +static void note_decode(struct snd_seq_event *ev, unsigned char *buf); +static void one_param_decode(struct snd_seq_event *ev, unsigned char *buf); +static void pitchbend_decode(struct snd_seq_event *ev, unsigned char *buf); +static void two_param_decode(struct snd_seq_event *ev, unsigned char *buf); +static void songpos_decode(struct snd_seq_event *ev, unsigned char *buf); /* * event list */ -static struct status_event_list_t { +static struct status_event_list { int event; int qlen; - event_encode_t encode; - event_decode_t decode; + void (*encode)(struct snd_midi_event *dev, struct snd_seq_event *ev); + void (*decode)(struct snd_seq_event *ev, unsigned char *buf); } status_event[] = { - /* 0x80 - 0xf0 */ - {SNDRV_SEQ_EVENT_NOTEOFF, 2, note_event, note_decode}, - {SNDRV_SEQ_EVENT_NOTEON, 2, note_event, note_decode}, - {SNDRV_SEQ_EVENT_KEYPRESS, 2, note_event, note_decode}, - {SNDRV_SEQ_EVENT_CONTROLLER, 2, two_param_ctrl_event, two_param_decode}, - {SNDRV_SEQ_EVENT_PGMCHANGE, 1, one_param_ctrl_event, one_param_decode}, - {SNDRV_SEQ_EVENT_CHANPRESS, 1, one_param_ctrl_event, one_param_decode}, - {SNDRV_SEQ_EVENT_PITCHBEND, 2, pitchbend_ctrl_event, pitchbend_decode}, - {SNDRV_SEQ_EVENT_NONE, 0, NULL, NULL}, /* 0xf0 */ + /* 0x80 - 0xef */ + {SNDRV_SEQ_EVENT_NOTEOFF, 2, note_event, note_decode}, + {SNDRV_SEQ_EVENT_NOTEON, 2, note_event, note_decode}, + {SNDRV_SEQ_EVENT_KEYPRESS, 2, note_event, note_decode}, + {SNDRV_SEQ_EVENT_CONTROLLER, 2, two_param_ctrl_event, two_param_decode}, + {SNDRV_SEQ_EVENT_PGMCHANGE, 1, one_param_ctrl_event, one_param_decode}, + {SNDRV_SEQ_EVENT_CHANPRESS, 1, one_param_ctrl_event, one_param_decode}, + {SNDRV_SEQ_EVENT_PITCHBEND, 2, pitchbend_ctrl_event, pitchbend_decode}, + /* invalid */ + {SNDRV_SEQ_EVENT_NONE, -1, NULL, NULL}, /* 0xf0 - 0xff */ - {SNDRV_SEQ_EVENT_SYSEX, 1, NULL, NULL}, /* sysex: 0xf0 */ - {SNDRV_SEQ_EVENT_QFRAME, 1, one_param_event, one_param_decode}, /* 0xf1 */ - {SNDRV_SEQ_EVENT_SONGPOS, 2, songpos_event, songpos_decode}, /* 0xf2 */ - {SNDRV_SEQ_EVENT_SONGSEL, 1, one_param_event, one_param_decode}, /* 0xf3 */ - {SNDRV_SEQ_EVENT_NONE, 0, NULL, NULL}, /* 0xf4 */ - {SNDRV_SEQ_EVENT_NONE, 0, NULL, NULL}, /* 0xf5 */ - {SNDRV_SEQ_EVENT_TUNE_REQUEST, 0, NULL, NULL}, /* 0xf6 */ - {SNDRV_SEQ_EVENT_NONE, 0, NULL, NULL}, /* 0xf7 */ - {SNDRV_SEQ_EVENT_CLOCK, 0, NULL, NULL}, /* 0xf8 */ - {SNDRV_SEQ_EVENT_NONE, 0, NULL, NULL}, /* 0xf9 */ - {SNDRV_SEQ_EVENT_START, 0, NULL, NULL}, /* 0xfa */ - {SNDRV_SEQ_EVENT_CONTINUE, 0, NULL, NULL}, /* 0xfb */ - {SNDRV_SEQ_EVENT_STOP, 0, NULL, NULL}, /* 0xfc */ - {SNDRV_SEQ_EVENT_NONE, 0, NULL, NULL}, /* 0xfd */ - {SNDRV_SEQ_EVENT_SENSING, 0, NULL, NULL}, /* 0xfe */ - {SNDRV_SEQ_EVENT_RESET, 0, NULL, NULL}, /* 0xff */ + {SNDRV_SEQ_EVENT_SYSEX, 1, NULL, NULL}, /* sysex: 0xf0 */ + {SNDRV_SEQ_EVENT_QFRAME, 1, one_param_event, one_param_decode}, /* 0xf1 */ + {SNDRV_SEQ_EVENT_SONGPOS, 2, songpos_event, songpos_decode}, /* 0xf2 */ + {SNDRV_SEQ_EVENT_SONGSEL, 1, one_param_event, one_param_decode}, /* 0xf3 */ + {SNDRV_SEQ_EVENT_NONE, -1, NULL, NULL}, /* 0xf4 */ + {SNDRV_SEQ_EVENT_NONE, -1, NULL, NULL}, /* 0xf5 */ + {SNDRV_SEQ_EVENT_TUNE_REQUEST, 0, NULL, NULL}, /* 0xf6 */ + {SNDRV_SEQ_EVENT_NONE, -1, NULL, NULL}, /* 0xf7 */ + {SNDRV_SEQ_EVENT_CLOCK, 0, NULL, NULL}, /* 0xf8 */ + {SNDRV_SEQ_EVENT_NONE, -1, NULL, NULL}, /* 0xf9 */ + {SNDRV_SEQ_EVENT_START, 0, NULL, NULL}, /* 0xfa */ + {SNDRV_SEQ_EVENT_CONTINUE, 0, NULL, NULL}, /* 0xfb */ + {SNDRV_SEQ_EVENT_STOP, 0, NULL, NULL}, /* 0xfc */ + {SNDRV_SEQ_EVENT_NONE, -1, NULL, NULL}, /* 0xfd */ + {SNDRV_SEQ_EVENT_SENSING, 0, NULL, NULL}, /* 0xfe */ + {SNDRV_SEQ_EVENT_RESET, 0, NULL, NULL}, /* 0xff */ }; -static int extra_decode_ctrl14(snd_midi_event_t *dev, unsigned char *buf, int len, snd_seq_event_t *ev); -static int extra_decode_xrpn(snd_midi_event_t *dev, unsigned char *buf, int count, snd_seq_event_t *ev); +static int extra_decode_ctrl14(struct snd_midi_event *dev, unsigned char *buf, int len, + struct snd_seq_event *ev); +static int extra_decode_xrpn(struct snd_midi_event *dev, unsigned char *buf, int count, + struct snd_seq_event *ev); -static struct extra_event_list_t { +static struct extra_event_list { int event; - int (*decode)(snd_midi_event_t *dev, unsigned char *buf, int len, snd_seq_event_t *ev); + int (*decode)(struct snd_midi_event *dev, unsigned char *buf, int len, + struct snd_seq_event *ev); } extra_event[] = { {SNDRV_SEQ_EVENT_CONTROL14, extra_decode_ctrl14}, {SNDRV_SEQ_EVENT_NONREGPARAM, extra_decode_xrpn}, @@ -113,9 +112,9 @@ static struct extra_event_list_t { * new/delete record */ -int snd_midi_event_new(int bufsize, snd_midi_event_t **rdev) +int snd_midi_event_new(int bufsize, struct snd_midi_event **rdev) { - snd_midi_event_t *dev; + struct snd_midi_event *dev; *rdev = NULL; dev = kzalloc(sizeof(*dev), GFP_KERNEL); @@ -130,12 +129,13 @@ int snd_midi_event_new(int bufsize, snd_midi_event_t **rdev) } dev->bufsize = bufsize; dev->lastcmd = 0xff; + dev->type = ST_INVALID; spin_lock_init(&dev->lock); *rdev = dev; return 0; } -void snd_midi_event_free(snd_midi_event_t *dev) +void snd_midi_event_free(struct snd_midi_event *dev) { if (dev != NULL) { kfree(dev->buf); @@ -146,14 +146,14 @@ void snd_midi_event_free(snd_midi_event_t *dev) /* * initialize record */ -static inline void reset_encode(snd_midi_event_t *dev) +static inline void reset_encode(struct snd_midi_event *dev) { dev->read = 0; dev->qlen = 0; - dev->type = 0; + dev->type = ST_INVALID; } -void snd_midi_event_reset_encode(snd_midi_event_t *dev) +void snd_midi_event_reset_encode(struct snd_midi_event *dev) { unsigned long flags; @@ -162,7 +162,7 @@ void snd_midi_event_reset_encode(snd_midi_event_t *dev) spin_unlock_irqrestore(&dev->lock, flags); } -void snd_midi_event_reset_decode(snd_midi_event_t *dev) +void snd_midi_event_reset_decode(struct snd_midi_event *dev) { unsigned long flags; @@ -172,14 +172,14 @@ void snd_midi_event_reset_decode(snd_midi_event_t *dev) } #if 0 -void snd_midi_event_init(snd_midi_event_t *dev) +void snd_midi_event_init(struct snd_midi_event *dev) { snd_midi_event_reset_encode(dev); snd_midi_event_reset_decode(dev); } #endif /* 0 */ -void snd_midi_event_no_status(snd_midi_event_t *dev, int on) +void snd_midi_event_no_status(struct snd_midi_event *dev, int on) { dev->nostat = on ? 1 : 0; } @@ -188,7 +188,7 @@ void snd_midi_event_no_status(snd_midi_event_t *dev, int on) * resize buffer */ #if 0 -int snd_midi_event_resize_buffer(snd_midi_event_t *dev, int bufsize) +int snd_midi_event_resize_buffer(struct snd_midi_event *dev, int bufsize) { unsigned char *new_buf, *old_buf; unsigned long flags; @@ -213,7 +213,8 @@ int snd_midi_event_resize_buffer(snd_midi_event_t *dev, int bufsize) * read bytes and encode to sequencer event if finished * return the size of encoded bytes */ -long snd_midi_event_encode(snd_midi_event_t *dev, unsigned char *buf, long count, snd_seq_event_t *ev) +long snd_midi_event_encode(struct snd_midi_event *dev, unsigned char *buf, long count, + struct snd_seq_event *ev) { long result = 0; int rc; @@ -238,7 +239,8 @@ long snd_midi_event_encode(snd_midi_event_t *dev, unsigned char *buf, long count * 0 data is not finished * negative for error */ -int snd_midi_event_encode_byte(snd_midi_event_t *dev, int c, snd_seq_event_t *ev) +int snd_midi_event_encode_byte(struct snd_midi_event *dev, int c, + struct snd_seq_event *ev) { int rc = 0; unsigned long flags; @@ -250,29 +252,31 @@ int snd_midi_event_encode_byte(snd_midi_event_t *dev, int c, snd_seq_event_t *ev ev->type = status_event[ST_SPECIAL + c - 0xf0].event; ev->flags &= ~SNDRV_SEQ_EVENT_LENGTH_MASK; ev->flags |= SNDRV_SEQ_EVENT_LENGTH_FIXED; - return 1; + return ev->type != SNDRV_SEQ_EVENT_NONE; } spin_lock_irqsave(&dev->lock, flags); - if (dev->qlen > 0) { - /* rest of command */ - dev->buf[dev->read++] = c; - if (dev->type != ST_SYSEX) - dev->qlen--; - } else { + if ((c & 0x80) && + (c != MIDI_CMD_COMMON_SYSEX_END || dev->type != ST_SYSEX)) { /* new command */ + dev->buf[0] = c; + if ((c & 0xf0) == 0xf0) /* system messages */ + dev->type = (c & 0x0f) + ST_SPECIAL; + else + dev->type = (c >> 4) & 0x07; dev->read = 1; - if (c & 0x80) { - dev->buf[0] = c; - if ((c & 0xf0) == 0xf0) /* special events */ - dev->type = (c & 0x0f) + ST_SPECIAL; - else - dev->type = (c >> 4) & 0x07; - dev->qlen = status_event[dev->type].qlen; - } else { - /* process this byte as argument */ + dev->qlen = status_event[dev->type].qlen; + } else { + if (dev->qlen > 0) { + /* rest of command */ dev->buf[dev->read++] = c; + if (dev->type != ST_SYSEX) + dev->qlen--; + } else { + /* running status */ + dev->buf[1] = c; dev->qlen = status_event[dev->type].qlen - 1; + dev->read = 2; } } if (dev->qlen == 0) { @@ -281,6 +285,8 @@ int snd_midi_event_encode_byte(snd_midi_event_t *dev, int c, snd_seq_event_t *ev ev->flags |= SNDRV_SEQ_EVENT_LENGTH_FIXED; if (status_event[dev->type].encode) /* set data values */ status_event[dev->type].encode(dev, ev); + if (dev->type >= ST_SPECIAL) + dev->type = ST_INVALID; rc = 1; } else if (dev->type == ST_SYSEX) { if (c == MIDI_CMD_COMMON_SYSEX_END || @@ -303,7 +309,7 @@ int snd_midi_event_encode_byte(snd_midi_event_t *dev, int c, snd_seq_event_t *ev } /* encode note event */ -static void note_event(snd_midi_event_t *dev, snd_seq_event_t *ev) +static void note_event(struct snd_midi_event *dev, struct snd_seq_event *ev) { ev->data.note.channel = dev->buf[0] & 0x0f; ev->data.note.note = dev->buf[1]; @@ -311,21 +317,21 @@ static void note_event(snd_midi_event_t *dev, snd_seq_event_t *ev) } /* encode one parameter controls */ -static void one_param_ctrl_event(snd_midi_event_t *dev, snd_seq_event_t *ev) +static void one_param_ctrl_event(struct snd_midi_event *dev, struct snd_seq_event *ev) { ev->data.control.channel = dev->buf[0] & 0x0f; ev->data.control.value = dev->buf[1]; } /* encode pitch wheel change */ -static void pitchbend_ctrl_event(snd_midi_event_t *dev, snd_seq_event_t *ev) +static void pitchbend_ctrl_event(struct snd_midi_event *dev, struct snd_seq_event *ev) { ev->data.control.channel = dev->buf[0] & 0x0f; ev->data.control.value = (int)dev->buf[2] * 128 + (int)dev->buf[1] - 8192; } /* encode midi control change */ -static void two_param_ctrl_event(snd_midi_event_t *dev, snd_seq_event_t *ev) +static void two_param_ctrl_event(struct snd_midi_event *dev, struct snd_seq_event *ev) { ev->data.control.channel = dev->buf[0] & 0x0f; ev->data.control.param = dev->buf[1]; @@ -333,13 +339,13 @@ static void two_param_ctrl_event(snd_midi_event_t *dev, snd_seq_event_t *ev) } /* encode one parameter value*/ -static void one_param_event(snd_midi_event_t *dev, snd_seq_event_t *ev) +static void one_param_event(struct snd_midi_event *dev, struct snd_seq_event *ev) { ev->data.control.value = dev->buf[1]; } /* encode song position */ -static void songpos_event(snd_midi_event_t *dev, snd_seq_event_t *ev) +static void songpos_event(struct snd_midi_event *dev, struct snd_seq_event *ev) { ev->data.control.value = (int)dev->buf[2] * 128 + (int)dev->buf[1]; } @@ -348,7 +354,8 @@ static void songpos_event(snd_midi_event_t *dev, snd_seq_event_t *ev) * decode from a sequencer event to midi bytes * return the size of decoded midi events */ -long snd_midi_event_decode(snd_midi_event_t *dev, unsigned char *buf, long count, snd_seq_event_t *ev) +long snd_midi_event_decode(struct snd_midi_event *dev, unsigned char *buf, long count, + struct snd_seq_event *ev) { unsigned int cmd, type; @@ -404,20 +411,20 @@ long snd_midi_event_decode(snd_midi_event_t *dev, unsigned char *buf, long count /* decode note event */ -static void note_decode(snd_seq_event_t *ev, unsigned char *buf) +static void note_decode(struct snd_seq_event *ev, unsigned char *buf) { buf[0] = ev->data.note.note & 0x7f; buf[1] = ev->data.note.velocity & 0x7f; } /* decode one parameter controls */ -static void one_param_decode(snd_seq_event_t *ev, unsigned char *buf) +static void one_param_decode(struct snd_seq_event *ev, unsigned char *buf) { buf[0] = ev->data.control.value & 0x7f; } /* decode pitch wheel change */ -static void pitchbend_decode(snd_seq_event_t *ev, unsigned char *buf) +static void pitchbend_decode(struct snd_seq_event *ev, unsigned char *buf) { int value = ev->data.control.value + 8192; buf[0] = value & 0x7f; @@ -425,21 +432,22 @@ static void pitchbend_decode(snd_seq_event_t *ev, unsigned char *buf) } /* decode midi control change */ -static void two_param_decode(snd_seq_event_t *ev, unsigned char *buf) +static void two_param_decode(struct snd_seq_event *ev, unsigned char *buf) { buf[0] = ev->data.control.param & 0x7f; buf[1] = ev->data.control.value & 0x7f; } /* decode song position */ -static void songpos_decode(snd_seq_event_t *ev, unsigned char *buf) +static void songpos_decode(struct snd_seq_event *ev, unsigned char *buf) { buf[0] = ev->data.control.value & 0x7f; buf[1] = (ev->data.control.value >> 7) & 0x7f; } /* decode 14bit control */ -static int extra_decode_ctrl14(snd_midi_event_t *dev, unsigned char *buf, int count, snd_seq_event_t *ev) +static int extra_decode_ctrl14(struct snd_midi_event *dev, unsigned char *buf, + int count, struct snd_seq_event *ev) { unsigned char cmd; int idx = 0; @@ -476,7 +484,8 @@ static int extra_decode_ctrl14(snd_midi_event_t *dev, unsigned char *buf, int co } /* decode reg/nonreg param */ -static int extra_decode_xrpn(snd_midi_event_t *dev, unsigned char *buf, int count, snd_seq_event_t *ev) +static int extra_decode_xrpn(struct snd_midi_event *dev, unsigned char *buf, + int count, struct snd_seq_event *ev) { unsigned char cmd; char *cbytes; @@ -496,10 +505,10 @@ static int extra_decode_xrpn(snd_midi_event_t *dev, unsigned char *buf, int coun if (dev->nostat && count < 12) return -ENOMEM; cmd = MIDI_CMD_CONTROL|(ev->data.control.channel & 0x0f); - bytes[0] = ev->data.control.param & 0x007f; - bytes[1] = (ev->data.control.param & 0x3f80) >> 7; - bytes[2] = ev->data.control.value & 0x007f; - bytes[3] = (ev->data.control.value & 0x3f80) >> 7; + bytes[0] = (ev->data.control.param & 0x3f80) >> 7; + bytes[1] = ev->data.control.param & 0x007f; + bytes[2] = (ev->data.control.value & 0x3f80) >> 7; + bytes[3] = ev->data.control.value & 0x007f; if (cmd != dev->lastcmd && !dev->nostat) { if (count < 9) return -ENOMEM; diff --git a/sound/core/seq/seq_ports.c b/sound/core/seq/seq_ports.c index 57ec31df0d1..794a341bf0e 100644 --- a/sound/core/seq/seq_ports.c +++ b/sound/core/seq/seq_ports.c @@ -1,7 +1,7 @@ /* * ALSA sequencer Ports * Copyright (c) 1998 by Frank van de Pol <fvdpol@coil.demon.nl> - * Jaroslav Kysela <perex@suse.cz> + * Jaroslav Kysela <perex@perex.cz> * * * This program is free software; you can redistribute it and/or modify @@ -20,9 +20,9 @@ * */ -#include <sound/driver.h> #include <sound/core.h> #include <linux/slab.h> +#include <linux/module.h> #include "seq_system.h" #include "seq_ports.h" #include "seq_clientmgr.h" @@ -56,16 +56,15 @@ much elements are in array. */ /* return pointer to port structure - port is locked if found */ -client_port_t *snd_seq_port_use_ptr(client_t *client, int num) +struct snd_seq_client_port *snd_seq_port_use_ptr(struct snd_seq_client *client, + int num) { - struct list_head *p; - client_port_t *port; + struct snd_seq_client_port *port; if (client == NULL) return NULL; read_lock(&client->ports_lock); - list_for_each(p, &client->ports_list_head) { - port = list_entry(p, client_port_t, list); + list_for_each_entry(port, &client->ports_list_head, list) { if (port->addr.port == num) { if (port->closing) break; /* deleting now */ @@ -80,17 +79,16 @@ client_port_t *snd_seq_port_use_ptr(client_t *client, int num) /* search for the next port - port is locked if found */ -client_port_t *snd_seq_port_query_nearest(client_t *client, snd_seq_port_info_t *pinfo) +struct snd_seq_client_port *snd_seq_port_query_nearest(struct snd_seq_client *client, + struct snd_seq_port_info *pinfo) { int num; - struct list_head *p; - client_port_t *port, *found; + struct snd_seq_client_port *port, *found; num = pinfo->addr.port; found = NULL; read_lock(&client->ports_lock); - list_for_each(p, &client->ports_list_head) { - port = list_entry(p, client_port_t, list); + list_for_each_entry(port, &client->ports_list_head, list) { if (port->addr.port < num) continue; if (port->addr.port == num) { @@ -111,8 +109,8 @@ client_port_t *snd_seq_port_query_nearest(client_t *client, snd_seq_port_info_t } -/* initialize port_subs_info_t */ -static void port_subs_info_init(port_subs_info_t *grp) +/* initialize snd_seq_port_subs_info */ +static void port_subs_info_init(struct snd_seq_port_subs_info *grp) { INIT_LIST_HEAD(&grp->list_head); grp->count = 0; @@ -125,25 +123,26 @@ static void port_subs_info_init(port_subs_info_t *grp) /* create a port, port number is returned (-1 on failure) */ -client_port_t *snd_seq_create_port(client_t *client, int port) +struct snd_seq_client_port *snd_seq_create_port(struct snd_seq_client *client, + int port) { unsigned long flags; - client_port_t *new_port; - struct list_head *l; + struct snd_seq_client_port *new_port, *p; int num = -1; /* sanity check */ - snd_assert(client, return NULL); + if (snd_BUG_ON(!client)) + return NULL; if (client->num_ports >= SNDRV_SEQ_MAX_PORTS - 1) { - snd_printk(KERN_WARNING "too many ports for client %d\n", client->number); + pr_warn("ALSA: seq: too many ports for client %d\n", client->number); return NULL; } /* create a new port */ new_port = kzalloc(sizeof(*new_port), GFP_KERNEL); if (! new_port) { - snd_printd("malloc failed for registering client port\n"); + pr_debug("ALSA: seq: malloc failed for registering client port\n"); return NULL; /* failure, out of memory */ } /* init port data */ @@ -156,38 +155,44 @@ client_port_t *snd_seq_create_port(client_t *client, int port) port_subs_info_init(&new_port->c_dest); num = port >= 0 ? port : 0; - down(&client->ports_mutex); + mutex_lock(&client->ports_mutex); write_lock_irqsave(&client->ports_lock, flags); - list_for_each(l, &client->ports_list_head) { - client_port_t *p = list_entry(l, client_port_t, list); + list_for_each_entry(p, &client->ports_list_head, list) { if (p->addr.port > num) break; if (port < 0) /* auto-probe mode */ num = p->addr.port + 1; } /* insert the new port */ - list_add_tail(&new_port->list, l); + list_add_tail(&new_port->list, &p->list); client->num_ports++; new_port->addr.port = num; /* store the port number in the port */ write_unlock_irqrestore(&client->ports_lock, flags); - up(&client->ports_mutex); + mutex_unlock(&client->ports_mutex); sprintf(new_port->name, "port-%d", num); return new_port; } /* */ -enum group_type_t { +enum group_type { SRC_LIST, DEST_LIST }; -static int subscribe_port(client_t *client, client_port_t *port, port_subs_info_t *grp, snd_seq_port_subscribe_t *info, int send_ack); -static int unsubscribe_port(client_t *client, client_port_t *port, port_subs_info_t *grp, snd_seq_port_subscribe_t *info, int send_ack); +static int subscribe_port(struct snd_seq_client *client, + struct snd_seq_client_port *port, + struct snd_seq_port_subs_info *grp, + struct snd_seq_port_subscribe *info, int send_ack); +static int unsubscribe_port(struct snd_seq_client *client, + struct snd_seq_client_port *port, + struct snd_seq_port_subs_info *grp, + struct snd_seq_port_subscribe *info, int send_ack); -static client_port_t *get_client_port(snd_seq_addr_t *addr, client_t **cp) +static struct snd_seq_client_port *get_client_port(struct snd_seq_addr *addr, + struct snd_seq_client **cp) { - client_port_t *p; + struct snd_seq_client_port *p; *cp = snd_seq_client_use_ptr(addr->client); if (*cp) { p = snd_seq_port_use_ptr(*cp, addr->port); @@ -204,22 +209,23 @@ static client_port_t *get_client_port(snd_seq_addr_t *addr, client_t **cp) * remove all subscribers on the list * this is called from port_delete, for each src and dest list. */ -static void clear_subscriber_list(client_t *client, client_port_t *port, - port_subs_info_t *grp, int grptype) +static void clear_subscriber_list(struct snd_seq_client *client, + struct snd_seq_client_port *port, + struct snd_seq_port_subs_info *grp, + int grptype) { struct list_head *p, *n; - down_write(&grp->list_mutex); list_for_each_safe(p, n, &grp->list_head) { - subscribers_t *subs; - client_t *c; - client_port_t *aport; + struct snd_seq_subscribers *subs; + struct snd_seq_client *c; + struct snd_seq_client_port *aport; if (grptype == SRC_LIST) { - subs = list_entry(p, subscribers_t, src_list); + subs = list_entry(p, struct snd_seq_subscribers, src_list); aport = get_client_port(&subs->info.dest, &c); } else { - subs = list_entry(p, subscribers_t, dest_list); + subs = list_entry(p, struct snd_seq_subscribers, dest_list); aport = get_client_port(&subs->info.sender, &c); } list_del(p); @@ -233,25 +239,25 @@ static void clear_subscriber_list(client_t *client, client_port_t *port, kfree(subs); } else { /* ok we got the connected port */ - port_subs_info_t *agrp; + struct snd_seq_port_subs_info *agrp; agrp = (grptype == SRC_LIST) ? &aport->c_dest : &aport->c_src; down_write(&agrp->list_mutex); if (grptype == SRC_LIST) list_del(&subs->dest_list); else list_del(&subs->src_list); + up_write(&agrp->list_mutex); unsubscribe_port(c, aport, agrp, &subs->info, 1); kfree(subs); - up_write(&agrp->list_mutex); snd_seq_port_unlock(aport); snd_seq_client_unlock(c); } } - up_write(&grp->list_mutex); } /* delete port data */ -static int port_delete(client_t *client, client_port_t *port) +static int port_delete(struct snd_seq_client *client, + struct snd_seq_client_port *port) { /* set closing flag and wait for all port access are gone */ port->closing = 1; @@ -264,8 +270,8 @@ static int port_delete(client_t *client, client_port_t *port) if (port->private_free) port->private_free(port->private_data); - snd_assert(port->c_src.count == 0,); - snd_assert(port->c_dest.count == 0,); + snd_BUG_ON(port->c_src.count != 0); + snd_BUG_ON(port->c_dest.count != 0); kfree(port); return 0; @@ -273,26 +279,24 @@ static int port_delete(client_t *client, client_port_t *port) /* delete a port with the given port id */ -int snd_seq_delete_port(client_t *client, int port) +int snd_seq_delete_port(struct snd_seq_client *client, int port) { unsigned long flags; - struct list_head *l; - client_port_t *found = NULL; + struct snd_seq_client_port *found = NULL, *p; - down(&client->ports_mutex); + mutex_lock(&client->ports_mutex); write_lock_irqsave(&client->ports_lock, flags); - list_for_each(l, &client->ports_list_head) { - client_port_t *p = list_entry(l, client_port_t, list); + list_for_each_entry(p, &client->ports_list_head, list) { if (p->addr.port == port) { /* ok found. delete from the list at first */ - list_del(l); + list_del(&p->list); client->num_ports--; found = p; break; } } write_unlock_irqrestore(&client->ports_lock, flags); - up(&client->ports_mutex); + mutex_unlock(&client->ports_mutex); if (found) return port_delete(client, found); else @@ -300,21 +304,20 @@ int snd_seq_delete_port(client_t *client, int port) } /* delete the all ports belonging to the given client */ -int snd_seq_delete_all_ports(client_t *client) +int snd_seq_delete_all_ports(struct snd_seq_client *client) { unsigned long flags; - struct list_head deleted_list, *p, *n; + struct list_head deleted_list; + struct snd_seq_client_port *port, *tmp; /* move the port list to deleted_list, and * clear the port list in the client data. */ - down(&client->ports_mutex); + mutex_lock(&client->ports_mutex); write_lock_irqsave(&client->ports_lock, flags); if (! list_empty(&client->ports_list_head)) { - __list_add(&deleted_list, - client->ports_list_head.prev, - client->ports_list_head.next); - INIT_LIST_HEAD(&client->ports_list_head); + list_add(&deleted_list, &client->ports_list_head); + list_del_init(&client->ports_list_head); } else { INIT_LIST_HEAD(&deleted_list); } @@ -322,20 +325,21 @@ int snd_seq_delete_all_ports(client_t *client) write_unlock_irqrestore(&client->ports_lock, flags); /* remove each port in deleted_list */ - list_for_each_safe(p, n, &deleted_list) { - client_port_t *port = list_entry(p, client_port_t, list); - list_del(p); + list_for_each_entry_safe(port, tmp, &deleted_list, list) { + list_del(&port->list); snd_seq_system_client_ev_port_exit(port->addr.client, port->addr.port); port_delete(client, port); } - up(&client->ports_mutex); + mutex_unlock(&client->ports_mutex); return 0; } /* set port info fields */ -int snd_seq_set_port_info(client_port_t * port, snd_seq_port_info_t * info) +int snd_seq_set_port_info(struct snd_seq_client_port * port, + struct snd_seq_port_info * info) { - snd_assert(port && info, return -EINVAL); + if (snd_BUG_ON(!port || !info)) + return -EINVAL; /* set port name */ if (info->name[0]) @@ -361,9 +365,11 @@ int snd_seq_set_port_info(client_port_t * port, snd_seq_port_info_t * info) } /* get port info fields */ -int snd_seq_get_port_info(client_port_t * port, snd_seq_port_info_t * info) +int snd_seq_get_port_info(struct snd_seq_client_port * port, + struct snd_seq_port_info * info) { - snd_assert(port && info, return -EINVAL); + if (snd_BUG_ON(!port || !info)) + return -EINVAL; /* get port name */ strlcpy(info->name, port->name, sizeof(info->name)); @@ -407,11 +413,14 @@ int snd_seq_get_port_info(client_port_t * port, snd_seq_port_info_t * info) * initialization or termination of devices (see seq_midi.c). * * If callback_all option is set, the callback function is invoked - * at each connnection/disconnection. + * at each connection/disconnection. */ -static int subscribe_port(client_t *client, client_port_t *port, port_subs_info_t *grp, - snd_seq_port_subscribe_t *info, int send_ack) +static int subscribe_port(struct snd_seq_client *client, + struct snd_seq_client_port *port, + struct snd_seq_port_subs_info *grp, + struct snd_seq_port_subscribe *info, + int send_ack) { int err = 0; @@ -432,9 +441,11 @@ static int subscribe_port(client_t *client, client_port_t *port, port_subs_info_ return err; } -static int unsubscribe_port(client_t *client, client_port_t *port, - port_subs_info_t *grp, - snd_seq_port_subscribe_t *info, int send_ack) +static int unsubscribe_port(struct snd_seq_client *client, + struct snd_seq_client_port *port, + struct snd_seq_port_subs_info *grp, + struct snd_seq_port_subscribe *info, + int send_ack) { int err = 0; @@ -453,15 +464,15 @@ static int unsubscribe_port(client_t *client, client_port_t *port, /* check if both addresses are identical */ -static inline int addr_match(snd_seq_addr_t *r, snd_seq_addr_t *s) +static inline int addr_match(struct snd_seq_addr *r, struct snd_seq_addr *s) { return (r->client == s->client) && (r->port == s->port); } /* check the two subscribe info match */ /* if flags is zero, checks only sender and destination addresses */ -static int match_subs_info(snd_seq_port_subscribe_t *r, - snd_seq_port_subscribe_t *s) +static int match_subs_info(struct snd_seq_port_subscribe *r, + struct snd_seq_port_subscribe *s) { if (addr_match(&r->sender, &s->sender) && addr_match(&r->dest, &s->dest)) { @@ -475,15 +486,16 @@ static int match_subs_info(snd_seq_port_subscribe_t *r, /* connect two ports */ -int snd_seq_port_connect(client_t *connector, - client_t *src_client, client_port_t *src_port, - client_t *dest_client, client_port_t *dest_port, - snd_seq_port_subscribe_t *info) +int snd_seq_port_connect(struct snd_seq_client *connector, + struct snd_seq_client *src_client, + struct snd_seq_client_port *src_port, + struct snd_seq_client *dest_client, + struct snd_seq_client_port *dest_port, + struct snd_seq_port_subscribe *info) { - port_subs_info_t *src = &src_port->c_src; - port_subs_info_t *dest = &dest_port->c_dest; - subscribers_t *subs; - struct list_head *p; + struct snd_seq_port_subs_info *src = &src_port->c_src; + struct snd_seq_port_subs_info *dest = &dest_port->c_dest; + struct snd_seq_subscribers *subs, *s; int err, src_called = 0; unsigned long flags; int exclusive; @@ -496,7 +508,7 @@ int snd_seq_port_connect(client_t *connector, atomic_set(&subs->ref_count, 2); down_write(&src->list_mutex); - down_write(&dest->list_mutex); + down_write_nested(&dest->list_mutex, SINGLE_DEPTH_NESTING); exclusive = info->flags & SNDRV_SEQ_PORT_SUBS_EXCLUSIVE ? 1 : 0; err = -EBUSY; @@ -507,13 +519,11 @@ int snd_seq_port_connect(client_t *connector, if (src->exclusive || dest->exclusive) goto __error; /* check whether already exists */ - list_for_each(p, &src->list_head) { - subscribers_t *s = list_entry(p, subscribers_t, src_list); + list_for_each_entry(s, &src->list_head, src_list) { if (match_subs_info(info, &s->info)) goto __error; } - list_for_each(p, &dest->list_head) { - subscribers_t *s = list_entry(p, subscribers_t, dest_list); + list_for_each_entry(s, &dest->list_head, dest_list) { if (match_subs_info(info, &s->info)) goto __error; } @@ -554,24 +564,24 @@ int snd_seq_port_connect(client_t *connector, /* remove the connection */ -int snd_seq_port_disconnect(client_t *connector, - client_t *src_client, client_port_t *src_port, - client_t *dest_client, client_port_t *dest_port, - snd_seq_port_subscribe_t *info) +int snd_seq_port_disconnect(struct snd_seq_client *connector, + struct snd_seq_client *src_client, + struct snd_seq_client_port *src_port, + struct snd_seq_client *dest_client, + struct snd_seq_client_port *dest_port, + struct snd_seq_port_subscribe *info) { - port_subs_info_t *src = &src_port->c_src; - port_subs_info_t *dest = &dest_port->c_dest; - subscribers_t *subs; - struct list_head *p; + struct snd_seq_port_subs_info *src = &src_port->c_src; + struct snd_seq_port_subs_info *dest = &dest_port->c_dest; + struct snd_seq_subscribers *subs; int err = -ENOENT; unsigned long flags; down_write(&src->list_mutex); - down_write(&dest->list_mutex); + down_write_nested(&dest->list_mutex, SINGLE_DEPTH_NESTING); /* look for the connection */ - list_for_each(p, &src->list_head) { - subs = list_entry(p, subscribers_t, src_list); + list_for_each_entry(subs, &src->list_head, src_list) { if (match_subs_info(info, &subs->info)) { write_lock_irqsave(&src->list_lock, flags); // write_lock(&dest->list_lock); // no lock yet @@ -597,15 +607,13 @@ int snd_seq_port_disconnect(client_t *connector, /* get matched subscriber */ -subscribers_t *snd_seq_port_get_subscription(port_subs_info_t *src_grp, - snd_seq_addr_t *dest_addr) +struct snd_seq_subscribers *snd_seq_port_get_subscription(struct snd_seq_port_subs_info *src_grp, + struct snd_seq_addr *dest_addr) { - struct list_head *p; - subscribers_t *s, *found = NULL; + struct snd_seq_subscribers *s, *found = NULL; down_read(&src_grp->list_mutex); - list_for_each(p, &src_grp->list_head) { - s = list_entry(p, subscribers_t, src_list); + list_for_each_entry(s, &src_grp->list_head, src_list) { if (addr_match(dest_addr, &s->info.dest)) { found = s; break; @@ -623,11 +631,11 @@ subscribers_t *snd_seq_port_get_subscription(port_subs_info_t *src_grp, */ /* exported */ int snd_seq_event_port_attach(int client, - snd_seq_port_callback_t *pcbp, + struct snd_seq_port_callback *pcbp, int cap, int type, int midi_channels, int midi_voices, char *portname) { - snd_seq_port_info_t portinfo; + struct snd_seq_port_info portinfo; int ret; /* Set up the port */ @@ -653,6 +661,7 @@ int snd_seq_event_port_attach(int client, return ret; } +EXPORT_SYMBOL(snd_seq_event_port_attach); /* * Detach the driver from a port. @@ -660,7 +669,7 @@ int snd_seq_event_port_attach(int client, /* exported */ int snd_seq_event_port_detach(int client, int port) { - snd_seq_port_info_t portinfo; + struct snd_seq_port_info portinfo; int err; memset(&portinfo, 0, sizeof(portinfo)); @@ -672,3 +681,5 @@ int snd_seq_event_port_detach(int client, int port) return err; } + +EXPORT_SYMBOL(snd_seq_event_port_detach); diff --git a/sound/core/seq/seq_ports.h b/sound/core/seq/seq_ports.h index 89fd4416f6f..9d7117118ba 100644 --- a/sound/core/seq/seq_ports.h +++ b/sound/core/seq/seq_ports.h @@ -40,37 +40,38 @@ */ -typedef struct subscribers_t { - snd_seq_port_subscribe_t info; /* additional info */ +struct snd_seq_subscribers { + struct snd_seq_port_subscribe info; /* additional info */ struct list_head src_list; /* link of sources */ struct list_head dest_list; /* link of destinations */ atomic_t ref_count; -} subscribers_t; +}; -typedef struct port_subs_info_t { +struct snd_seq_port_subs_info { struct list_head list_head; /* list of subscribed ports */ unsigned int count; /* count of subscribers */ unsigned int exclusive: 1; /* exclusive mode */ struct rw_semaphore list_mutex; rwlock_t list_lock; - snd_seq_kernel_port_open_t *open; - snd_seq_kernel_port_close_t *close; -} port_subs_info_t; + int (*open)(void *private_data, struct snd_seq_port_subscribe *info); + int (*close)(void *private_data, struct snd_seq_port_subscribe *info); +}; -typedef struct client_port_t { +struct snd_seq_client_port { - snd_seq_addr_t addr; /* client/port number */ + struct snd_seq_addr addr; /* client/port number */ struct module *owner; /* owner of this port */ char name[64]; /* port name */ struct list_head list; /* port list */ snd_use_lock_t use_lock; /* subscribers */ - port_subs_info_t c_src; /* read (sender) list */ - port_subs_info_t c_dest; /* write (dest) list */ + struct snd_seq_port_subs_info c_src; /* read (sender) list */ + struct snd_seq_port_subs_info c_dest; /* write (dest) list */ - snd_seq_kernel_port_input_t *event_input; - snd_seq_kernel_port_private_free_t *private_free; + int (*event_input)(struct snd_seq_event *ev, int direct, void *private_data, + int atomic, int hop); + void (*private_free)(void *private_data); void *private_data; unsigned int callback_all : 1; unsigned int closing : 1; @@ -87,42 +88,55 @@ typedef struct client_port_t { int midi_voices; int synth_voices; -} client_port_t; +}; + +struct snd_seq_client; /* return pointer to port structure and lock port */ -client_port_t *snd_seq_port_use_ptr(client_t *client, int num); +struct snd_seq_client_port *snd_seq_port_use_ptr(struct snd_seq_client *client, int num); /* search for next port - port is locked if found */ -client_port_t *snd_seq_port_query_nearest(client_t *client, snd_seq_port_info_t *pinfo); +struct snd_seq_client_port *snd_seq_port_query_nearest(struct snd_seq_client *client, + struct snd_seq_port_info *pinfo); /* unlock the port */ #define snd_seq_port_unlock(port) snd_use_lock_free(&(port)->use_lock) /* create a port, port number is returned (-1 on failure) */ -client_port_t *snd_seq_create_port(client_t *client, int port_index); +struct snd_seq_client_port *snd_seq_create_port(struct snd_seq_client *client, int port_index); /* delete a port */ -int snd_seq_delete_port(client_t *client, int port); +int snd_seq_delete_port(struct snd_seq_client *client, int port); /* delete all ports */ -int snd_seq_delete_all_ports(client_t *client); +int snd_seq_delete_all_ports(struct snd_seq_client *client); /* set port info fields */ -int snd_seq_set_port_info(client_port_t *port, snd_seq_port_info_t *info); +int snd_seq_set_port_info(struct snd_seq_client_port *port, + struct snd_seq_port_info *info); /* get port info fields */ -int snd_seq_get_port_info(client_port_t *port, snd_seq_port_info_t *info); +int snd_seq_get_port_info(struct snd_seq_client_port *port, + struct snd_seq_port_info *info); /* add subscriber to subscription list */ -int snd_seq_port_connect(client_t *caller, client_t *s, client_port_t *sp, client_t *d, client_port_t *dp, snd_seq_port_subscribe_t *info); +int snd_seq_port_connect(struct snd_seq_client *caller, + struct snd_seq_client *s, struct snd_seq_client_port *sp, + struct snd_seq_client *d, struct snd_seq_client_port *dp, + struct snd_seq_port_subscribe *info); /* remove subscriber from subscription list */ -int snd_seq_port_disconnect(client_t *caller, client_t *s, client_port_t *sp, client_t *d, client_port_t *dp, snd_seq_port_subscribe_t *info); +int snd_seq_port_disconnect(struct snd_seq_client *caller, + struct snd_seq_client *s, struct snd_seq_client_port *sp, + struct snd_seq_client *d, struct snd_seq_client_port *dp, + struct snd_seq_port_subscribe *info); /* subscribe port */ -int snd_seq_port_subscribe(client_port_t *port, snd_seq_port_subscribe_t *info); +int snd_seq_port_subscribe(struct snd_seq_client_port *port, + struct snd_seq_port_subscribe *info); /* get matched subscriber */ -subscribers_t *snd_seq_port_get_subscription(port_subs_info_t *src_grp, snd_seq_addr_t *dest_addr); +struct snd_seq_subscribers *snd_seq_port_get_subscription(struct snd_seq_port_subs_info *src_grp, + struct snd_seq_addr *dest_addr); #endif diff --git a/sound/core/seq/seq_prioq.c b/sound/core/seq/seq_prioq.c index cd641bca994..021b02bc933 100644 --- a/sound/core/seq/seq_prioq.c +++ b/sound/core/seq/seq_prioq.c @@ -19,7 +19,6 @@ * */ -#include <sound/driver.h> #include <linux/time.h> #include <linux/slab.h> #include <sound/core.h> @@ -55,13 +54,13 @@ /* create new prioq (constructor) */ -prioq_t *snd_seq_prioq_new(void) +struct snd_seq_prioq *snd_seq_prioq_new(void) { - prioq_t *f; + struct snd_seq_prioq *f; f = kzalloc(sizeof(*f), GFP_KERNEL); if (f == NULL) { - snd_printd("oops: malloc failed for snd_seq_prioq_new()\n"); + pr_debug("ALSA: seq: malloc failed for snd_seq_prioq_new()\n"); return NULL; } @@ -74,13 +73,13 @@ prioq_t *snd_seq_prioq_new(void) } /* delete prioq (destructor) */ -void snd_seq_prioq_delete(prioq_t **fifo) +void snd_seq_prioq_delete(struct snd_seq_prioq **fifo) { - prioq_t *f = *fifo; + struct snd_seq_prioq *f = *fifo; *fifo = NULL; if (f == NULL) { - snd_printd("oops: snd_seq_prioq_delete() called with NULL prioq\n"); + pr_debug("ALSA: seq: snd_seq_prioq_delete() called with NULL prioq\n"); return; } @@ -101,7 +100,8 @@ void snd_seq_prioq_delete(prioq_t **fifo) /* compare timestamp between events */ /* return 1 if a >= b; 0 */ -static inline int compare_timestamp(snd_seq_event_t * a, snd_seq_event_t * b) +static inline int compare_timestamp(struct snd_seq_event *a, + struct snd_seq_event *b) { if ((a->flags & SNDRV_SEQ_TIME_STAMP_MASK) == SNDRV_SEQ_TIME_STAMP_TICK) { /* compare ticks */ @@ -117,7 +117,8 @@ static inline int compare_timestamp(snd_seq_event_t * a, snd_seq_event_t * b) * zero if a = b; * positive if a > b; */ -static inline int compare_timestamp_rel(snd_seq_event_t *a, snd_seq_event_t *b) +static inline int compare_timestamp_rel(struct snd_seq_event *a, + struct snd_seq_event *b) { if ((a->flags & SNDRV_SEQ_TIME_STAMP_MASK) == SNDRV_SEQ_TIME_STAMP_TICK) { /* compare ticks */ @@ -144,15 +145,16 @@ static inline int compare_timestamp_rel(snd_seq_event_t *a, snd_seq_event_t *b) } /* enqueue cell to prioq */ -int snd_seq_prioq_cell_in(prioq_t * f, snd_seq_event_cell_t * cell) +int snd_seq_prioq_cell_in(struct snd_seq_prioq * f, + struct snd_seq_event_cell * cell) { - snd_seq_event_cell_t *cur, *prev; + struct snd_seq_event_cell *cur, *prev; unsigned long flags; int count; int prior; - snd_assert(f, return -EINVAL); - snd_assert(cell, return -EINVAL); + if (snd_BUG_ON(!f || !cell)) + return -EINVAL; /* check flags */ prior = (cell->event.flags & SNDRV_SEQ_PRIORITY_MASK); @@ -195,7 +197,7 @@ int snd_seq_prioq_cell_in(prioq_t * f, snd_seq_event_cell_t * cell) cur = cur->next; if (! --count) { spin_unlock_irqrestore(&f->lock, flags); - snd_printk(KERN_ERR "cannot find a pointer.. infinite loop?\n"); + pr_err("ALSA: seq: cannot find a pointer.. infinite loop?\n"); return -EINVAL; } } @@ -215,13 +217,13 @@ int snd_seq_prioq_cell_in(prioq_t * f, snd_seq_event_cell_t * cell) } /* dequeue cell from prioq */ -snd_seq_event_cell_t *snd_seq_prioq_cell_out(prioq_t * f) +struct snd_seq_event_cell *snd_seq_prioq_cell_out(struct snd_seq_prioq *f) { - snd_seq_event_cell_t *cell; + struct snd_seq_event_cell *cell; unsigned long flags; if (f == NULL) { - snd_printd("oops: snd_seq_prioq_cell_in() called with NULL prioq\n"); + pr_debug("ALSA: seq: snd_seq_prioq_cell_in() called with NULL prioq\n"); return NULL; } spin_lock_irqsave(&f->lock, flags); @@ -243,10 +245,10 @@ snd_seq_event_cell_t *snd_seq_prioq_cell_out(prioq_t * f) } /* return number of events available in prioq */ -int snd_seq_prioq_avail(prioq_t * f) +int snd_seq_prioq_avail(struct snd_seq_prioq * f) { if (f == NULL) { - snd_printd("oops: snd_seq_prioq_cell_in() called with NULL prioq\n"); + pr_debug("ALSA: seq: snd_seq_prioq_cell_in() called with NULL prioq\n"); return 0; } return f->cells; @@ -254,17 +256,18 @@ int snd_seq_prioq_avail(prioq_t * f) /* peek at cell at the head of the prioq */ -snd_seq_event_cell_t *snd_seq_prioq_cell_peek(prioq_t * f) +struct snd_seq_event_cell *snd_seq_prioq_cell_peek(struct snd_seq_prioq * f) { if (f == NULL) { - snd_printd("oops: snd_seq_prioq_cell_in() called with NULL prioq\n"); + pr_debug("ALSA: seq: snd_seq_prioq_cell_in() called with NULL prioq\n"); return NULL; } return f->head; } -static inline int prioq_match(snd_seq_event_cell_t *cell, int client, int timestamp) +static inline int prioq_match(struct snd_seq_event_cell *cell, + int client, int timestamp) { if (cell->event.source.client == client || cell->event.dest.client == client) @@ -286,12 +289,12 @@ static inline int prioq_match(snd_seq_event_cell_t *cell, int client, int timest } /* remove cells for left client */ -void snd_seq_prioq_leave(prioq_t * f, int client, int timestamp) +void snd_seq_prioq_leave(struct snd_seq_prioq * f, int client, int timestamp) { - register snd_seq_event_cell_t *cell, *next; + register struct snd_seq_event_cell *cell, *next; unsigned long flags; - snd_seq_event_cell_t *prev = NULL; - snd_seq_event_cell_t *freefirst = NULL, *freeprev = NULL, *freenext; + struct snd_seq_event_cell *prev = NULL; + struct snd_seq_event_cell *freefirst = NULL, *freeprev = NULL, *freenext; /* collect all removed cells */ spin_lock_irqsave(&f->lock, flags); @@ -318,7 +321,8 @@ void snd_seq_prioq_leave(prioq_t * f, int client, int timestamp) freeprev = cell; } else { #if 0 - printk("type = %i, source = %i, dest = %i, client = %i\n", + pr_debug("ALSA: seq: type = %i, source = %i, dest = %i, " + "client = %i\n", cell->event.type, cell->event.source.client, cell->event.dest.client, @@ -338,8 +342,8 @@ void snd_seq_prioq_leave(prioq_t * f, int client, int timestamp) } } -static int prioq_remove_match(snd_seq_remove_events_t *info, - snd_seq_event_t *ev) +static int prioq_remove_match(struct snd_seq_remove_events *info, + struct snd_seq_event *ev) { int res; @@ -394,13 +398,13 @@ static int prioq_remove_match(snd_seq_remove_events_t *info, } /* remove cells matching remove criteria */ -void snd_seq_prioq_remove_events(prioq_t * f, int client, - snd_seq_remove_events_t *info) +void snd_seq_prioq_remove_events(struct snd_seq_prioq * f, int client, + struct snd_seq_remove_events *info) { - register snd_seq_event_cell_t *cell, *next; + struct snd_seq_event_cell *cell, *next; unsigned long flags; - snd_seq_event_cell_t *prev = NULL; - snd_seq_event_cell_t *freefirst = NULL, *freeprev = NULL, *freenext; + struct snd_seq_event_cell *prev = NULL; + struct snd_seq_event_cell *freefirst = NULL, *freeprev = NULL, *freenext; /* collect all removed cells */ spin_lock_irqsave(&f->lock, flags); diff --git a/sound/core/seq/seq_prioq.h b/sound/core/seq/seq_prioq.h index f12af79308b..d38bb78d934 100644 --- a/sound/core/seq/seq_prioq.h +++ b/sound/core/seq/seq_prioq.h @@ -26,37 +26,37 @@ /* === PRIOQ === */ -typedef struct { - snd_seq_event_cell_t* head; /* pointer to head of prioq */ - snd_seq_event_cell_t* tail; /* pointer to tail of prioq */ +struct snd_seq_prioq { + struct snd_seq_event_cell *head; /* pointer to head of prioq */ + struct snd_seq_event_cell *tail; /* pointer to tail of prioq */ int cells; spinlock_t lock; -} prioq_t; +}; /* create new prioq (constructor) */ -extern prioq_t *snd_seq_prioq_new(void); +struct snd_seq_prioq *snd_seq_prioq_new(void); /* delete prioq (destructor) */ -extern void snd_seq_prioq_delete(prioq_t **fifo); +void snd_seq_prioq_delete(struct snd_seq_prioq **fifo); /* enqueue cell to prioq */ -extern int snd_seq_prioq_cell_in(prioq_t *f, snd_seq_event_cell_t *cell); +int snd_seq_prioq_cell_in(struct snd_seq_prioq *f, struct snd_seq_event_cell *cell); /* dequeue cell from prioq */ -extern snd_seq_event_cell_t *snd_seq_prioq_cell_out(prioq_t *f); +struct snd_seq_event_cell *snd_seq_prioq_cell_out(struct snd_seq_prioq *f); /* return number of events available in prioq */ -extern int snd_seq_prioq_avail(prioq_t *f); +int snd_seq_prioq_avail(struct snd_seq_prioq *f); /* peek at cell at the head of the prioq */ -extern snd_seq_event_cell_t *snd_seq_prioq_cell_peek(prioq_t *f); +struct snd_seq_event_cell *snd_seq_prioq_cell_peek(struct snd_seq_prioq *f); /* client left queue */ -extern void snd_seq_prioq_leave(prioq_t *f, int client, int timestamp); +void snd_seq_prioq_leave(struct snd_seq_prioq *f, int client, int timestamp); /* Remove events */ -void snd_seq_prioq_remove_events(prioq_t * f, int client, - snd_seq_remove_events_t *info); +void snd_seq_prioq_remove_events(struct snd_seq_prioq *f, int client, + struct snd_seq_remove_events *info); #endif diff --git a/sound/core/seq/seq_queue.c b/sound/core/seq/seq_queue.c index 5f5c3cb37cb..aad4878cee5 100644 --- a/sound/core/seq/seq_queue.c +++ b/sound/core/seq/seq_queue.c @@ -29,13 +29,12 @@ * Aug. 30, 2000 Takashi Iwai * - Queues are managed in static array again, but with better way. * The API itself is identical. - * - The queue is locked when queue_t pinter is returned via + * - The queue is locked when struct snd_seq_queue pointer is returned via * queueptr(). This pointer *MUST* be released afterward by * queuefree(ptr). * - Addition of experimental sync support. */ -#include <sound/driver.h> #include <linux/init.h> #include <linux/slab.h> #include <sound/core.h> @@ -48,7 +47,7 @@ #include "seq_info.h" /* list of allocated queues */ -static queue_t *queue_list[SNDRV_SEQ_MAX_QUEUES]; +static struct snd_seq_queue *queue_list[SNDRV_SEQ_MAX_QUEUES]; static DEFINE_SPINLOCK(queue_list_lock); /* number of queues allocated */ static int num_queues; @@ -61,7 +60,7 @@ int snd_seq_queue_get_cur_queues(void) /*----------------------------------------------------------------*/ /* assign queue id and insert to list */ -static int queue_list_add(queue_t *q) +static int queue_list_add(struct snd_seq_queue *q) { int i; unsigned long flags; @@ -80,9 +79,9 @@ static int queue_list_add(queue_t *q) return -1; } -static queue_t *queue_list_remove(int id, int client) +static struct snd_seq_queue *queue_list_remove(int id, int client) { - queue_t *q; + struct snd_seq_queue *q; unsigned long flags; spin_lock_irqsave(&queue_list_lock, flags); @@ -107,19 +106,19 @@ static queue_t *queue_list_remove(int id, int client) /*----------------------------------------------------------------*/ /* create new queue (constructor) */ -static queue_t *queue_new(int owner, int locked) +static struct snd_seq_queue *queue_new(int owner, int locked) { - queue_t *q; + struct snd_seq_queue *q; q = kzalloc(sizeof(*q), GFP_KERNEL); if (q == NULL) { - snd_printd("malloc failed for snd_seq_queue_new()\n"); + pr_debug("ALSA: seq: malloc failed for snd_seq_queue_new()\n"); return NULL; } spin_lock_init(&q->owner_lock); spin_lock_init(&q->check_lock); - init_MUTEX(&q->timer_mutex); + mutex_init(&q->timer_mutex); snd_use_lock_init(&q->use_lock); q->queue = -1; @@ -142,7 +141,7 @@ static queue_t *queue_new(int owner, int locked) } /* delete queue (destructor) */ -static void queue_delete(queue_t *q) +static void queue_delete(struct snd_seq_queue *q) { /* stop and release the timer */ snd_seq_timer_stop(q->timer); @@ -187,7 +186,7 @@ void __exit snd_seq_queues_delete(void) */ int snd_seq_queue_alloc(int client, int locked, unsigned int info_flags) { - queue_t *q; + struct snd_seq_queue *q; q = queue_new(client, locked); if (q == NULL) @@ -204,7 +203,7 @@ int snd_seq_queue_alloc(int client, int locked, unsigned int info_flags) /* delete a queue - queue must be owned by the client */ int snd_seq_queue_delete(int client, int queueid) { - queue_t *q; + struct snd_seq_queue *q; if (queueid < 0 || queueid >= SNDRV_SEQ_MAX_QUEUES) return -EINVAL; @@ -218,9 +217,9 @@ int snd_seq_queue_delete(int client, int queueid) /* return pointer to queue structure for specified id */ -queue_t *queueptr(int queueid) +struct snd_seq_queue *queueptr(int queueid) { - queue_t *q; + struct snd_seq_queue *q; unsigned long flags; if (queueid < 0 || queueid >= SNDRV_SEQ_MAX_QUEUES) @@ -234,10 +233,10 @@ queue_t *queueptr(int queueid) } /* return the (first) queue matching with the specified name */ -queue_t *snd_seq_queue_find_name(char *name) +struct snd_seq_queue *snd_seq_queue_find_name(char *name) { int i; - queue_t *q; + struct snd_seq_queue *q; for (i = 0; i < SNDRV_SEQ_MAX_QUEUES; i++) { if ((q = queueptr(i)) != NULL) { @@ -252,10 +251,10 @@ queue_t *snd_seq_queue_find_name(char *name) /* -------------------------------------------------------- */ -void snd_seq_check_queue(queue_t *q, int atomic, int hop) +void snd_seq_check_queue(struct snd_seq_queue *q, int atomic, int hop) { unsigned long flags; - snd_seq_event_cell_t *cell; + struct snd_seq_event_cell *cell; if (q == NULL) return; @@ -273,7 +272,8 @@ void snd_seq_check_queue(queue_t *q, int atomic, int hop) __again: /* Process tick queue... */ while ((cell = snd_seq_prioq_cell_peek(q->tickq)) != NULL) { - if (snd_seq_compare_tick_time(&q->timer->tick.cur_tick, &cell->event.time.tick)) { + if (snd_seq_compare_tick_time(&q->timer->tick.cur_tick, + &cell->event.time.tick)) { cell = snd_seq_prioq_cell_out(q->tickq); if (cell) snd_seq_dispatch_event(cell, atomic, hop); @@ -286,7 +286,8 @@ void snd_seq_check_queue(queue_t *q, int atomic, int hop) /* Process time queue... */ while ((cell = snd_seq_prioq_cell_peek(q->timeq)) != NULL) { - if (snd_seq_compare_real_time(&q->timer->cur_time, &cell->event.time.time)) { + if (snd_seq_compare_real_time(&q->timer->cur_time, + &cell->event.time.time)) { cell = snd_seq_prioq_cell_out(q->timeq); if (cell) snd_seq_dispatch_event(cell, atomic, hop); @@ -309,12 +310,13 @@ void snd_seq_check_queue(queue_t *q, int atomic, int hop) /* enqueue a event to singe queue */ -int snd_seq_enqueue_event(snd_seq_event_cell_t *cell, int atomic, int hop) +int snd_seq_enqueue_event(struct snd_seq_event_cell *cell, int atomic, int hop) { int dest, err; - queue_t *q; + struct snd_seq_queue *q; - snd_assert(cell != NULL, return -EINVAL); + if (snd_BUG_ON(!cell)) + return -EINVAL; dest = cell->event.queue; /* destination queue */ q = queueptr(dest); if (q == NULL) @@ -327,7 +329,8 @@ int snd_seq_enqueue_event(snd_seq_event_cell_t *cell, int atomic, int hop) break; case SNDRV_SEQ_TIME_STAMP_REAL: - snd_seq_inc_real_time(&cell->event.time.time, &q->timer->cur_time); + snd_seq_inc_real_time(&cell->event.time.time, + &q->timer->cur_time); break; } cell->event.flags &= ~SNDRV_SEQ_TIME_MODE_MASK; @@ -361,7 +364,7 @@ int snd_seq_enqueue_event(snd_seq_event_cell_t *cell, int atomic, int hop) /*----------------------------------------------------------------*/ -static inline int check_access(queue_t *q, int client) +static inline int check_access(struct snd_seq_queue *q, int client) { return (q->owner == client) || (!q->locked && !q->klocked); } @@ -369,7 +372,7 @@ static inline int check_access(queue_t *q, int client) /* check if the client has permission to modify queue parameters. * if it does, lock the queue */ -static int queue_access_lock(queue_t *q, int client) +static int queue_access_lock(struct snd_seq_queue *q, int client) { unsigned long flags; int access_ok; @@ -383,7 +386,7 @@ static int queue_access_lock(queue_t *q, int client) } /* unlock the queue */ -static inline void queue_access_unlock(queue_t *q) +static inline void queue_access_unlock(struct snd_seq_queue *q) { unsigned long flags; @@ -395,7 +398,7 @@ static inline void queue_access_unlock(queue_t *q) /* exported - only checking permission */ int snd_seq_queue_check_access(int queueid, int client) { - queue_t *q = queueptr(queueid); + struct snd_seq_queue *q = queueptr(queueid); int access_ok; unsigned long flags; @@ -415,7 +418,7 @@ int snd_seq_queue_check_access(int queueid, int client) */ int snd_seq_queue_set_owner(int queueid, int client, int locked) { - queue_t *q = queueptr(queueid); + struct snd_seq_queue *q = queueptr(queueid); if (q == NULL) return -EINVAL; @@ -443,8 +446,8 @@ int snd_seq_queue_set_owner(int queueid, int client, int locked) int snd_seq_queue_timer_open(int queueid) { int result = 0; - queue_t *queue; - seq_timer_t *tmr; + struct snd_seq_queue *queue; + struct snd_seq_timer *tmr; queue = queueptr(queueid); if (queue == NULL) @@ -463,23 +466,22 @@ int snd_seq_queue_timer_open(int queueid) */ int snd_seq_queue_timer_close(int queueid) { - queue_t *queue; - seq_timer_t *tmr; + struct snd_seq_queue *queue; int result = 0; queue = queueptr(queueid); if (queue == NULL) return -EINVAL; - tmr = queue->timer; snd_seq_timer_close(queue); queuefree(queue); return result; } /* change queue tempo and ppq */ -int snd_seq_queue_timer_set_tempo(int queueid, int client, snd_seq_queue_tempo_t *info) +int snd_seq_queue_timer_set_tempo(int queueid, int client, + struct snd_seq_queue_tempo *info) { - queue_t *q = queueptr(queueid); + struct snd_seq_queue *q = queueptr(queueid); int result; if (q == NULL) @@ -493,7 +495,8 @@ int snd_seq_queue_timer_set_tempo(int queueid, int client, snd_seq_queue_tempo_t if (result >= 0) result = snd_seq_timer_set_ppq(q->timer, info->ppq); if (result >= 0 && info->skew_base > 0) - result = snd_seq_timer_set_skew(q->timer, info->skew_value, info->skew_base); + result = snd_seq_timer_set_skew(q->timer, info->skew_value, + info->skew_base); queue_access_unlock(q); queuefree(q); return result; @@ -506,12 +509,12 @@ int snd_seq_queue_timer_set_tempo(int queueid, int client, snd_seq_queue_tempo_t */ int snd_seq_queue_use(int queueid, int client, int use) { - queue_t *queue; + struct snd_seq_queue *queue; queue = queueptr(queueid); if (queue == NULL) return -EINVAL; - down(&queue->timer_mutex); + mutex_lock(&queue->timer_mutex); if (use) { if (!test_and_set_bit(client, queue->clients_bitmap)) queue->clients++; @@ -526,7 +529,7 @@ int snd_seq_queue_use(int queueid, int client, int use) } else { snd_seq_timer_close(queue); } - up(&queue->timer_mutex); + mutex_unlock(&queue->timer_mutex); queuefree(queue); return 0; } @@ -538,7 +541,7 @@ int snd_seq_queue_use(int queueid, int client, int use) */ int snd_seq_queue_is_used(int queueid, int client) { - queue_t *q; + struct snd_seq_queue *q; int result; q = queueptr(queueid); @@ -559,7 +562,7 @@ void snd_seq_queue_client_termination(int client) { unsigned long flags; int i; - queue_t *q; + struct snd_seq_queue *q; for (i = 0; i < SNDRV_SEQ_MAX_QUEUES; i++) { if ((q = queueptr(i)) == NULL) @@ -584,7 +587,7 @@ void snd_seq_queue_client_termination(int client) void snd_seq_queue_client_leave(int client) { int i; - queue_t *q; + struct snd_seq_queue *q; /* delete own queues from queue list */ for (i = 0; i < SNDRV_SEQ_MAX_QUEUES; i++) { @@ -615,7 +618,7 @@ void snd_seq_queue_client_leave(int client) void snd_seq_queue_client_leave_cells(int client) { int i; - queue_t *q; + struct snd_seq_queue *q; for (i = 0; i < SNDRV_SEQ_MAX_QUEUES; i++) { if ((q = queueptr(i)) == NULL) @@ -627,10 +630,10 @@ void snd_seq_queue_client_leave_cells(int client) } /* remove cells based on flush criteria */ -void snd_seq_queue_remove_cells(int client, snd_seq_remove_events_t *info) +void snd_seq_queue_remove_cells(int client, struct snd_seq_remove_events *info) { int i; - queue_t *q; + struct snd_seq_queue *q; for (i = 0; i < SNDRV_SEQ_MAX_QUEUES; i++) { if ((q = queueptr(i)) == NULL) @@ -650,9 +653,10 @@ void snd_seq_queue_remove_cells(int client, snd_seq_remove_events_t *info) /* * send events to all subscribed ports */ -static void queue_broadcast_event(queue_t *q, snd_seq_event_t *ev, int atomic, int hop) +static void queue_broadcast_event(struct snd_seq_queue *q, struct snd_seq_event *ev, + int atomic, int hop) { - snd_seq_event_t sev; + struct snd_seq_event sev; sev = *ev; @@ -672,7 +676,8 @@ static void queue_broadcast_event(queue_t *q, snd_seq_event_t *ev, int atomic, i * process a received queue-control event. * this function is exported for seq_sync.c. */ -static void snd_seq_queue_process_event(queue_t *q, snd_seq_event_t *ev, +static void snd_seq_queue_process_event(struct snd_seq_queue *q, + struct snd_seq_event *ev, int atomic, int hop) { switch (ev->type) { @@ -724,11 +729,12 @@ static void snd_seq_queue_process_event(queue_t *q, snd_seq_event_t *ev, * Queue control via timer control port: * this function is exported as a callback of timer port. */ -int snd_seq_control_queue(snd_seq_event_t *ev, int atomic, int hop) +int snd_seq_control_queue(struct snd_seq_event *ev, int atomic, int hop) { - queue_t *q; + struct snd_seq_queue *q; - snd_assert(ev != NULL, return -EINVAL); + if (snd_BUG_ON(!ev)) + return -EINVAL; q = queueptr(ev->data.queue.queue); if (q == NULL) @@ -749,13 +755,14 @@ int snd_seq_control_queue(snd_seq_event_t *ev, int atomic, int hop) /*----------------------------------------------------------------*/ +#ifdef CONFIG_PROC_FS /* exported to seq_info.c */ -void snd_seq_info_queues_read(snd_info_entry_t *entry, - snd_info_buffer_t * buffer) +void snd_seq_info_queues_read(struct snd_info_entry *entry, + struct snd_info_buffer *buffer) { int i, bpm; - queue_t *q; - seq_timer_t *tmr; + struct snd_seq_queue *q; + struct snd_seq_timer *tmr; for (i = 0; i < SNDRV_SEQ_MAX_QUEUES; i++) { if ((q = queueptr(i)) == NULL) @@ -782,3 +789,5 @@ void snd_seq_info_queues_read(snd_info_entry_t *entry, queuefree(q); } } +#endif /* CONFIG_PROC_FS */ + diff --git a/sound/core/seq/seq_queue.h b/sound/core/seq/seq_queue.h index ea3c54216ea..30c8111477f 100644 --- a/sound/core/seq/seq_queue.h +++ b/sound/core/seq/seq_queue.h @@ -30,15 +30,15 @@ #define SEQ_QUEUE_NO_OWNER (-1) -struct _snd_seq_queue { +struct snd_seq_queue { int queue; /* queue number */ char name[64]; /* name of this queue */ - prioq_t *tickq; /* midi tick event queue */ - prioq_t *timeq; /* real-time event queue */ + struct snd_seq_prioq *tickq; /* midi tick event queue */ + struct snd_seq_prioq *timeq; /* real-time event queue */ - seq_timer_t *timer; /* time keeper for this queue */ + struct snd_seq_timer *timer; /* time keeper for this queue */ int owner; /* client that 'owns' the timer */ unsigned int locked:1, /* timer is only accesibble by owner if set */ klocked:1, /* kernel lock (after START) */ @@ -54,7 +54,7 @@ struct _snd_seq_queue { /* clients which uses this queue (bitmap) */ DECLARE_BITMAP(clients_bitmap, SNDRV_SEQ_MAX_CLIENTS); unsigned int clients; /* users of this queue */ - struct semaphore timer_mutex; + struct mutex timer_mutex; snd_use_lock_t use_lock; }; @@ -83,26 +83,26 @@ void snd_seq_queue_client_termination(int client); void snd_seq_queue_client_leave(int client); /* enqueue a event received from one the clients */ -int snd_seq_enqueue_event(snd_seq_event_cell_t *cell, int atomic, int hop); +int snd_seq_enqueue_event(struct snd_seq_event_cell *cell, int atomic, int hop); /* Remove events */ void snd_seq_queue_client_leave_cells(int client); -void snd_seq_queue_remove_cells(int client, snd_seq_remove_events_t *info); +void snd_seq_queue_remove_cells(int client, struct snd_seq_remove_events *info); /* return pointer to queue structure for specified id */ -queue_t *queueptr(int queueid); +struct snd_seq_queue *queueptr(int queueid); /* unlock */ #define queuefree(q) snd_use_lock_free(&(q)->use_lock) /* return the (first) queue matching with the specified name */ -queue_t *snd_seq_queue_find_name(char *name); +struct snd_seq_queue *snd_seq_queue_find_name(char *name); /* check single queue and dispatch events */ -void snd_seq_check_queue(queue_t *q, int atomic, int hop); +void snd_seq_check_queue(struct snd_seq_queue *q, int atomic, int hop); /* access to queue's parameters */ int snd_seq_queue_check_access(int queueid, int client); -int snd_seq_queue_timer_set_tempo(int queueid, int client, snd_seq_queue_tempo_t *info); +int snd_seq_queue_timer_set_tempo(int queueid, int client, struct snd_seq_queue_tempo *info); int snd_seq_queue_set_owner(int queueid, int client, int locked); int snd_seq_queue_set_locked(int queueid, int client, int locked); int snd_seq_queue_timer_open(int queueid); @@ -110,7 +110,7 @@ int snd_seq_queue_timer_close(int queueid); int snd_seq_queue_use(int queueid, int client, int use); int snd_seq_queue_is_used(int queueid, int client); -int snd_seq_control_queue(snd_seq_event_t *ev, int atomic, int hop); +int snd_seq_control_queue(struct snd_seq_event *ev, int atomic, int hop); /* * 64bit division - for sync stuff.. diff --git a/sound/core/seq/seq_system.c b/sound/core/seq/seq_system.c index 0d9eff85ab8..8ce1d0b40dc 100644 --- a/sound/core/seq/seq_system.c +++ b/sound/core/seq/seq_system.c @@ -19,8 +19,9 @@ * */ -#include <sound/driver.h> #include <linux/init.h> +#include <linux/export.h> +#include <linux/slab.h> #include <sound/core.h> #include "seq_system.h" #include "seq_timer.h" @@ -66,12 +67,12 @@ static int announce_port = -1; /* fill standard header data, source port & channel are filled in */ -static int setheader(snd_seq_event_t * ev, int client, int port) +static int setheader(struct snd_seq_event * ev, int client, int port) { if (announce_port < 0) return -ENODEV; - memset(ev, 0, sizeof(snd_seq_event_t)); + memset(ev, 0, sizeof(struct snd_seq_event)); ev->flags &= ~SNDRV_SEQ_EVENT_LENGTH_MASK; ev->flags |= SNDRV_SEQ_EVENT_LENGTH_FIXED; @@ -92,7 +93,7 @@ static int setheader(snd_seq_event_t * ev, int client, int port) /* entry points for broadcasting system events */ void snd_seq_system_broadcast(int client, int port, int type) { - snd_seq_event_t ev; + struct snd_seq_event ev; if (setheader(&ev, client, port) < 0) return; @@ -101,7 +102,7 @@ void snd_seq_system_broadcast(int client, int port, int type) } /* entry points for broadcasting system events */ -int snd_seq_system_notify(int client, int port, snd_seq_event_t *ev) +int snd_seq_system_notify(int client, int port, struct snd_seq_event *ev) { ev->flags = SNDRV_SEQ_EVENT_LENGTH_FIXED; ev->source.client = sysclient; @@ -112,7 +113,7 @@ int snd_seq_system_notify(int client, int port, snd_seq_event_t *ev) } /* call-back handler for timer events */ -static int event_input_timer(snd_seq_event_t * ev, int direct, void *private_data, int atomic, int hop) +static int event_input_timer(struct snd_seq_event * ev, int direct, void *private_data, int atomic, int hop) { return snd_seq_control_queue(ev, atomic, hop); } @@ -120,34 +121,19 @@ static int event_input_timer(snd_seq_event_t * ev, int direct, void *private_dat /* register our internal client */ int __init snd_seq_system_client_init(void) { + struct snd_seq_port_callback pcallbacks; + struct snd_seq_port_info *port; - snd_seq_client_callback_t callbacks; - snd_seq_port_callback_t pcallbacks; - snd_seq_client_info_t *inf; - snd_seq_port_info_t *port; - - inf = kzalloc(sizeof(*inf), GFP_KERNEL); port = kzalloc(sizeof(*port), GFP_KERNEL); - if (! inf || ! port) { - kfree(inf); - kfree(port); + if (!port) return -ENOMEM; - } - memset(&callbacks, 0, sizeof(callbacks)); memset(&pcallbacks, 0, sizeof(pcallbacks)); pcallbacks.owner = THIS_MODULE; pcallbacks.event_input = event_input_timer; /* register client */ - callbacks.allow_input = callbacks.allow_output = 1; - sysclient = snd_seq_create_kernel_client(NULL, 0, &callbacks); - - /* set our name */ - inf->client = 0; - inf->type = KERNEL_CLIENT; - strcpy(inf->name, "System"); - snd_seq_kernel_client_ctl(sysclient, SNDRV_SEQ_IOCTL_SET_CLIENT_INFO, inf); + sysclient = snd_seq_create_kernel_client(NULL, 0, "System"); /* register timer */ strcpy(port->name, "Timer"); @@ -171,7 +157,6 @@ int __init snd_seq_system_client_init(void) snd_seq_kernel_client_ctl(sysclient, SNDRV_SEQ_IOCTL_CREATE_PORT, port); announce_port = port->addr.port; - kfree(inf); kfree(port); return 0; } diff --git a/sound/core/seq/seq_system.h b/sound/core/seq/seq_system.h index 900007255bb..cf2cfa23430 100644 --- a/sound/core/seq/seq_system.h +++ b/sound/core/seq/seq_system.h @@ -34,7 +34,7 @@ void snd_seq_system_broadcast(int client, int port, int type); #define snd_seq_system_client_ev_port_exit(client, port) snd_seq_system_broadcast(client, port, SNDRV_SEQ_EVENT_PORT_EXIT) #define snd_seq_system_client_ev_port_change(client, port) snd_seq_system_broadcast(client, port, SNDRV_SEQ_EVENT_PORT_CHANGE) -int snd_seq_system_notify(int client, int port, snd_seq_event_t *ev); +int snd_seq_system_notify(int client, int port, struct snd_seq_event *ev); /* register our internal client */ int snd_seq_system_client_init(void); diff --git a/sound/core/seq/seq_timer.c b/sound/core/seq/seq_timer.c index b57a3c07ff6..e73605393ee 100644 --- a/sound/core/seq/seq_timer.c +++ b/sound/core/seq/seq_timer.c @@ -1,7 +1,7 @@ /* * ALSA sequencer Timer * Copyright (c) 1998-1999 by Frank van de Pol <fvdpol@coil.demon.nl> - * Jaroslav Kysela <perex@suse.cz> + * Jaroslav Kysela <perex@perex.cz> * * * This program is free software; you can redistribute it and/or modify @@ -20,49 +20,44 @@ * */ -#include <sound/driver.h> #include <sound/core.h> #include <linux/slab.h> #include "seq_timer.h" #include "seq_queue.h" #include "seq_info.h" -extern int seq_default_timer_class; -extern int seq_default_timer_sclass; -extern int seq_default_timer_card; -extern int seq_default_timer_device; -extern int seq_default_timer_subdevice; -extern int seq_default_timer_resolution; +/* allowed sequencer timer frequencies, in Hz */ +#define MIN_FREQUENCY 10 +#define MAX_FREQUENCY 6250 +#define DEFAULT_FREQUENCY 1000 #define SKEW_BASE 0x10000 /* 16bit shift */ -static void snd_seq_timer_set_tick_resolution(seq_timer_tick_t *tick, - int tempo, int ppq, int nticks) +static void snd_seq_timer_set_tick_resolution(struct snd_seq_timer *tmr) { - if (tempo < 1000000) - tick->resolution = (tempo * 1000) / ppq; + if (tmr->tempo < 1000000) + tmr->tick.resolution = (tmr->tempo * 1000) / tmr->ppq; else { /* might overflow.. */ unsigned int s; - s = tempo % ppq; - s = (s * 1000) / ppq; - tick->resolution = (tempo / ppq) * 1000; - tick->resolution += s; + s = tmr->tempo % tmr->ppq; + s = (s * 1000) / tmr->ppq; + tmr->tick.resolution = (tmr->tempo / tmr->ppq) * 1000; + tmr->tick.resolution += s; } - if (tick->resolution <= 0) - tick->resolution = 1; - tick->resolution *= nticks; - snd_seq_timer_update_tick(tick, 0); + if (tmr->tick.resolution <= 0) + tmr->tick.resolution = 1; + snd_seq_timer_update_tick(&tmr->tick, 0); } /* create new timer (constructor) */ -seq_timer_t *snd_seq_timer_new(void) +struct snd_seq_timer *snd_seq_timer_new(void) { - seq_timer_t *tmr; + struct snd_seq_timer *tmr; tmr = kzalloc(sizeof(*tmr), GFP_KERNEL); if (tmr == NULL) { - snd_printd("malloc failed for snd_seq_timer_new() \n"); + pr_debug("ALSA: seq: malloc failed for snd_seq_timer_new() \n"); return NULL; } spin_lock_init(&tmr->lock); @@ -77,13 +72,13 @@ seq_timer_t *snd_seq_timer_new(void) } /* delete timer (destructor) */ -void snd_seq_timer_delete(seq_timer_t **tmr) +void snd_seq_timer_delete(struct snd_seq_timer **tmr) { - seq_timer_t *t = *tmr; + struct snd_seq_timer *t = *tmr; *tmr = NULL; if (t == NULL) { - snd_printd("oops: snd_seq_timer_delete() called with NULL timer\n"); + pr_debug("ALSA: seq: snd_seq_timer_delete() called with NULL timer\n"); return; } t->running = 0; @@ -95,12 +90,12 @@ void snd_seq_timer_delete(seq_timer_t **tmr) kfree(t); } -void snd_seq_timer_defaults(seq_timer_t * tmr) +void snd_seq_timer_defaults(struct snd_seq_timer * tmr) { /* setup defaults */ tmr->ppq = 96; /* 96 PPQ */ tmr->tempo = 500000; /* 120 BPM */ - snd_seq_timer_set_tick_resolution(&tmr->tick, tmr->tempo, tmr->ppq, 1); + snd_seq_timer_set_tick_resolution(tmr); tmr->running = 0; tmr->type = SNDRV_SEQ_TIMER_ALSA; @@ -114,7 +109,7 @@ void snd_seq_timer_defaults(seq_timer_t * tmr) tmr->skew = tmr->skew_base = SKEW_BASE; } -void snd_seq_timer_reset(seq_timer_t * tmr) +void snd_seq_timer_reset(struct snd_seq_timer * tmr) { unsigned long flags; @@ -132,13 +127,13 @@ void snd_seq_timer_reset(seq_timer_t * tmr) /* called by timer interrupt routine. the period time since previous invocation is passed */ -static void snd_seq_timer_interrupt(snd_timer_instance_t *timeri, +static void snd_seq_timer_interrupt(struct snd_timer_instance *timeri, unsigned long resolution, unsigned long ticks) { unsigned long flags; - queue_t *q = (queue_t *)timeri->callback_data; - seq_timer_t *tmr; + struct snd_seq_queue *q = timeri->callback_data; + struct snd_seq_timer *tmr; if (q == NULL) return; @@ -173,28 +168,30 @@ static void snd_seq_timer_interrupt(snd_timer_instance_t *timeri, } /* set current tempo */ -int snd_seq_timer_set_tempo(seq_timer_t * tmr, int tempo) +int snd_seq_timer_set_tempo(struct snd_seq_timer * tmr, int tempo) { unsigned long flags; - snd_assert(tmr, return -EINVAL); + if (snd_BUG_ON(!tmr)) + return -EINVAL; if (tempo <= 0) return -EINVAL; spin_lock_irqsave(&tmr->lock, flags); if ((unsigned int)tempo != tmr->tempo) { tmr->tempo = tempo; - snd_seq_timer_set_tick_resolution(&tmr->tick, tmr->tempo, tmr->ppq, 1); + snd_seq_timer_set_tick_resolution(tmr); } spin_unlock_irqrestore(&tmr->lock, flags); return 0; } /* set current ppq */ -int snd_seq_timer_set_ppq(seq_timer_t * tmr, int ppq) +int snd_seq_timer_set_ppq(struct snd_seq_timer * tmr, int ppq) { unsigned long flags; - snd_assert(tmr, return -EINVAL); + if (snd_BUG_ON(!tmr)) + return -EINVAL; if (ppq <= 0) return -EINVAL; spin_lock_irqsave(&tmr->lock, flags); @@ -202,22 +199,24 @@ int snd_seq_timer_set_ppq(seq_timer_t * tmr, int ppq) /* refuse to change ppq on running timers */ /* because it will upset the song position (ticks) */ spin_unlock_irqrestore(&tmr->lock, flags); - snd_printd("seq: cannot change ppq of a running timer\n"); + pr_debug("ALSA: seq: cannot change ppq of a running timer\n"); return -EBUSY; } tmr->ppq = ppq; - snd_seq_timer_set_tick_resolution(&tmr->tick, tmr->tempo, tmr->ppq, 1); + snd_seq_timer_set_tick_resolution(tmr); spin_unlock_irqrestore(&tmr->lock, flags); return 0; } /* set current tick position */ -int snd_seq_timer_set_position_tick(seq_timer_t *tmr, snd_seq_tick_time_t position) +int snd_seq_timer_set_position_tick(struct snd_seq_timer *tmr, + snd_seq_tick_time_t position) { unsigned long flags; - snd_assert(tmr, return -EINVAL); + if (snd_BUG_ON(!tmr)) + return -EINVAL; spin_lock_irqsave(&tmr->lock, flags); tmr->tick.cur_tick = position; @@ -227,11 +226,13 @@ int snd_seq_timer_set_position_tick(seq_timer_t *tmr, snd_seq_tick_time_t positi } /* set current real-time position */ -int snd_seq_timer_set_position_time(seq_timer_t *tmr, snd_seq_real_time_t position) +int snd_seq_timer_set_position_time(struct snd_seq_timer *tmr, + snd_seq_real_time_t position) { unsigned long flags; - snd_assert(tmr, return -EINVAL); + if (snd_BUG_ON(!tmr)) + return -EINVAL; snd_seq_sanity_real_time(&position); spin_lock_irqsave(&tmr->lock, flags); @@ -241,15 +242,17 @@ int snd_seq_timer_set_position_time(seq_timer_t *tmr, snd_seq_real_time_t positi } /* set timer skew */ -int snd_seq_timer_set_skew(seq_timer_t *tmr, unsigned int skew, unsigned int base) +int snd_seq_timer_set_skew(struct snd_seq_timer *tmr, unsigned int skew, + unsigned int base) { unsigned long flags; - snd_assert(tmr, return -EINVAL); + if (snd_BUG_ON(!tmr)) + return -EINVAL; /* FIXME */ if (base != SKEW_BASE) { - snd_printd("invalid skew base 0x%x\n", base); + pr_debug("ALSA: seq: invalid skew base 0x%x\n", base); return -EINVAL; } spin_lock_irqsave(&tmr->lock, flags); @@ -258,15 +261,16 @@ int snd_seq_timer_set_skew(seq_timer_t *tmr, unsigned int skew, unsigned int bas return 0; } -int snd_seq_timer_open(queue_t *q) +int snd_seq_timer_open(struct snd_seq_queue *q) { - snd_timer_instance_t *t; - seq_timer_t *tmr; + struct snd_timer_instance *t; + struct snd_seq_timer *tmr; char str[32]; int err; tmr = q->timer; - snd_assert(tmr != NULL, return -EINVAL); + if (snd_BUG_ON(!tmr)) + return -EINVAL; if (tmr->timeri) return -EBUSY; sprintf(str, "sequencer queue %i", q->queue); @@ -278,7 +282,7 @@ int snd_seq_timer_open(queue_t *q) if (err < 0 && tmr->alsa_id.dev_class != SNDRV_TIMER_CLASS_SLAVE) { if (tmr->alsa_id.dev_class != SNDRV_TIMER_CLASS_GLOBAL || tmr->alsa_id.device != SNDRV_TIMER_GLOBAL_SYSTEM) { - snd_timer_id_t tid; + struct snd_timer_id tid; memset(&tid, 0, sizeof(tid)); tid.dev_class = SNDRV_TIMER_CLASS_GLOBAL; tid.dev_sclass = SNDRV_TIMER_SCLASS_SEQUENCER; @@ -286,10 +290,10 @@ int snd_seq_timer_open(queue_t *q) tid.device = SNDRV_TIMER_GLOBAL_SYSTEM; err = snd_timer_open(&t, str, &tid, q->queue); } - if (err < 0) { - snd_printk(KERN_ERR "seq fatal error: cannot create timer (%i)\n", err); - return err; - } + } + if (err < 0) { + pr_err("ALSA: seq fatal error: cannot create timer (%i)\n", err); + return err; } t->callback = snd_seq_timer_interrupt; t->callback_data = q; @@ -298,12 +302,13 @@ int snd_seq_timer_open(queue_t *q) return 0; } -int snd_seq_timer_close(queue_t *q) +int snd_seq_timer_close(struct snd_seq_queue *q) { - seq_timer_t *tmr; + struct snd_seq_timer *tmr; tmr = q->timer; - snd_assert(tmr != NULL, return -EINVAL); + if (snd_BUG_ON(!tmr)) + return -EINVAL; if (tmr->timeri) { snd_timer_stop(tmr->timeri); snd_timer_close(tmr->timeri); @@ -312,7 +317,7 @@ int snd_seq_timer_close(queue_t *q) return 0; } -int snd_seq_timer_stop(seq_timer_t * tmr) +int snd_seq_timer_stop(struct snd_seq_timer * tmr) { if (! tmr->timeri) return -EINVAL; @@ -323,20 +328,30 @@ int snd_seq_timer_stop(seq_timer_t * tmr) return 0; } -static int initialize_timer(seq_timer_t *tmr) +static int initialize_timer(struct snd_seq_timer *tmr) { - snd_timer_t *t; + struct snd_timer *t; + unsigned long freq; + t = tmr->timeri->timer; - snd_assert(t, return -EINVAL); + if (snd_BUG_ON(!t)) + return -EINVAL; + + freq = tmr->preferred_resolution; + if (!freq) + freq = DEFAULT_FREQUENCY; + else if (freq < MIN_FREQUENCY) + freq = MIN_FREQUENCY; + else if (freq > MAX_FREQUENCY) + freq = MAX_FREQUENCY; tmr->ticks = 1; - if (tmr->preferred_resolution && - ! (t->hw.flags & SNDRV_TIMER_HW_SLAVE)) { + if (!(t->hw.flags & SNDRV_TIMER_HW_SLAVE)) { unsigned long r = t->hw.resolution; if (! r && t->hw.c_resolution) r = t->hw.c_resolution(t); if (r) { - tmr->ticks = (unsigned int)(1000000000uL / (r * tmr->preferred_resolution)); + tmr->ticks = (unsigned int)(1000000000uL / (r * freq)); if (! tmr->ticks) tmr->ticks = 1; } @@ -345,7 +360,7 @@ static int initialize_timer(seq_timer_t *tmr) return 0; } -int snd_seq_timer_start(seq_timer_t * tmr) +int snd_seq_timer_start(struct snd_seq_timer * tmr) { if (! tmr->timeri) return -EINVAL; @@ -360,7 +375,7 @@ int snd_seq_timer_start(seq_timer_t * tmr) return 0; } -int snd_seq_timer_continue(seq_timer_t * tmr) +int snd_seq_timer_continue(struct snd_seq_timer * tmr) { if (! tmr->timeri) return -EINVAL; @@ -378,7 +393,7 @@ int snd_seq_timer_continue(seq_timer_t * tmr) } /* return current 'real' time. use timeofday() to get better granularity. */ -snd_seq_real_time_t snd_seq_timer_get_cur_time(seq_timer_t *tmr) +snd_seq_real_time_t snd_seq_timer_get_cur_time(struct snd_seq_timer *tmr) { snd_seq_real_time_t cur_time; @@ -403,19 +418,21 @@ snd_seq_real_time_t snd_seq_timer_get_cur_time(seq_timer_t *tmr) /* TODO: use interpolation on tick queue (will only be useful for very high PPQ values) */ -snd_seq_tick_time_t snd_seq_timer_get_cur_tick(seq_timer_t *tmr) +snd_seq_tick_time_t snd_seq_timer_get_cur_tick(struct snd_seq_timer *tmr) { return tmr->tick.cur_tick; } +#ifdef CONFIG_PROC_FS /* exported to seq_info.c */ -void snd_seq_info_timer_read(snd_info_entry_t *entry, snd_info_buffer_t * buffer) +void snd_seq_info_timer_read(struct snd_info_entry *entry, + struct snd_info_buffer *buffer) { int idx; - queue_t *q; - seq_timer_t *tmr; - snd_timer_instance_t *ti; + struct snd_seq_queue *q; + struct snd_seq_timer *tmr; + struct snd_timer_instance *ti; unsigned long resolution; for (idx = 0; idx < SNDRV_SEQ_MAX_QUEUES; idx++) { @@ -434,3 +451,5 @@ void snd_seq_info_timer_read(snd_info_entry_t *entry, snd_info_buffer_t * buffer queuefree(q); } } +#endif /* CONFIG_PROC_FS */ + diff --git a/sound/core/seq/seq_timer.h b/sound/core/seq/seq_timer.h index 287ed68591d..88dfb71805a 100644 --- a/sound/core/seq/seq_timer.h +++ b/sound/core/seq/seq_timer.h @@ -24,13 +24,13 @@ #include <sound/timer.h> #include <sound/seq_kernel.h> -typedef struct { +struct snd_seq_timer_tick { snd_seq_tick_time_t cur_tick; /* current tick */ unsigned long resolution; /* time per tick in nsec */ unsigned long fraction; /* current time per tick in nsec */ -} seq_timer_tick_t; +}; -typedef struct { +struct snd_seq_timer { /* ... tempo / offset / running state */ unsigned int running:1, /* running state of queue */ @@ -40,12 +40,12 @@ typedef struct { int ppq; /* time resolution, ticks/quarter */ snd_seq_real_time_t cur_time; /* current time */ - seq_timer_tick_t tick; /* current tick */ + struct snd_seq_timer_tick tick; /* current tick */ int tick_updated; int type; /* timer type */ - snd_timer_id_t alsa_id; /* ALSA's timer ID */ - snd_timer_instance_t *timeri; /* timer instance */ + struct snd_timer_id alsa_id; /* ALSA's timer ID */ + struct snd_timer_instance *timeri; /* timer instance */ unsigned int ticks; unsigned long preferred_resolution; /* timer resolution, ticks/sec */ @@ -55,17 +55,18 @@ typedef struct { struct timeval last_update; /* time of last clock update, used for interpolation */ spinlock_t lock; -} seq_timer_t; +}; /* create new timer (constructor) */ -extern seq_timer_t *snd_seq_timer_new(void); +struct snd_seq_timer *snd_seq_timer_new(void); /* delete timer (destructor) */ -extern void snd_seq_timer_delete(seq_timer_t **tmr); +void snd_seq_timer_delete(struct snd_seq_timer **tmr); /* */ -static inline void snd_seq_timer_update_tick(seq_timer_tick_t *tick, unsigned long resolution) +static inline void snd_seq_timer_update_tick(struct snd_seq_timer_tick *tick, + unsigned long resolution) { if (tick->resolution > 0) { tick->fraction += resolution; @@ -119,21 +120,29 @@ static inline void snd_seq_inc_time_nsec(snd_seq_real_time_t *tm, unsigned long } /* called by timer isr */ -int snd_seq_timer_open(queue_t *q); -int snd_seq_timer_close(queue_t *q); -int snd_seq_timer_midi_open(queue_t *q); -int snd_seq_timer_midi_close(queue_t *q); -void snd_seq_timer_defaults(seq_timer_t *tmr); -void snd_seq_timer_reset(seq_timer_t *tmr); -int snd_seq_timer_stop(seq_timer_t *tmr); -int snd_seq_timer_start(seq_timer_t *tmr); -int snd_seq_timer_continue(seq_timer_t *tmr); -int snd_seq_timer_set_tempo(seq_timer_t *tmr, int tempo); -int snd_seq_timer_set_ppq(seq_timer_t *tmr, int ppq); -int snd_seq_timer_set_position_tick(seq_timer_t *tmr, snd_seq_tick_time_t position); -int snd_seq_timer_set_position_time(seq_timer_t *tmr, snd_seq_real_time_t position); -int snd_seq_timer_set_skew(seq_timer_t *tmr, unsigned int skew, unsigned int base); -snd_seq_real_time_t snd_seq_timer_get_cur_time(seq_timer_t *tmr); -snd_seq_tick_time_t snd_seq_timer_get_cur_tick(seq_timer_t *tmr); +struct snd_seq_queue; +int snd_seq_timer_open(struct snd_seq_queue *q); +int snd_seq_timer_close(struct snd_seq_queue *q); +int snd_seq_timer_midi_open(struct snd_seq_queue *q); +int snd_seq_timer_midi_close(struct snd_seq_queue *q); +void snd_seq_timer_defaults(struct snd_seq_timer *tmr); +void snd_seq_timer_reset(struct snd_seq_timer *tmr); +int snd_seq_timer_stop(struct snd_seq_timer *tmr); +int snd_seq_timer_start(struct snd_seq_timer *tmr); +int snd_seq_timer_continue(struct snd_seq_timer *tmr); +int snd_seq_timer_set_tempo(struct snd_seq_timer *tmr, int tempo); +int snd_seq_timer_set_ppq(struct snd_seq_timer *tmr, int ppq); +int snd_seq_timer_set_position_tick(struct snd_seq_timer *tmr, snd_seq_tick_time_t position); +int snd_seq_timer_set_position_time(struct snd_seq_timer *tmr, snd_seq_real_time_t position); +int snd_seq_timer_set_skew(struct snd_seq_timer *tmr, unsigned int skew, unsigned int base); +snd_seq_real_time_t snd_seq_timer_get_cur_time(struct snd_seq_timer *tmr); +snd_seq_tick_time_t snd_seq_timer_get_cur_tick(struct snd_seq_timer *tmr); + +extern int seq_default_timer_class; +extern int seq_default_timer_sclass; +extern int seq_default_timer_card; +extern int seq_default_timer_device; +extern int seq_default_timer_subdevice; +extern int seq_default_timer_resolution; #endif diff --git a/sound/core/seq/seq_virmidi.c b/sound/core/seq/seq_virmidi.c index e4f512aa742..56e0f4cd3f8 100644 --- a/sound/core/seq/seq_virmidi.c +++ b/sound/core/seq/seq_virmidi.c @@ -35,10 +35,9 @@ * */ -#include <sound/driver.h> #include <linux/init.h> #include <linux/wait.h> -#include <linux/sched.h> +#include <linux/module.h> #include <linux/slab.h> #include <sound/core.h> #include <sound/rawmidi.h> @@ -56,7 +55,8 @@ MODULE_LICENSE("GPL"); /* * initialize an event record */ -static void snd_virmidi_init_event(snd_virmidi_t *vmidi, snd_seq_event_t *ev) +static void snd_virmidi_init_event(struct snd_virmidi *vmidi, + struct snd_seq_event *ev) { memset(ev, 0, sizeof(*ev)); ev->source.port = vmidi->port; @@ -76,16 +76,15 @@ static void snd_virmidi_init_event(snd_virmidi_t *vmidi, snd_seq_event_t *ev) /* * decode input event and put to read buffer of each opened file */ -static int snd_virmidi_dev_receive_event(snd_virmidi_dev_t *rdev, snd_seq_event_t *ev) +static int snd_virmidi_dev_receive_event(struct snd_virmidi_dev *rdev, + struct snd_seq_event *ev) { - snd_virmidi_t *vmidi; - struct list_head *list; + struct snd_virmidi *vmidi; unsigned char msg[4]; int len; read_lock(&rdev->filelist_lock); - list_for_each(list, &rdev->filelist) { - vmidi = list_entry(list, snd_virmidi_t, list); + list_for_each_entry(vmidi, &rdev->filelist, list) { if (!vmidi->trigger) continue; if (ev->type == SNDRV_SEQ_EVENT_SYSEX) { @@ -111,9 +110,9 @@ static int snd_virmidi_dev_receive_event(snd_virmidi_dev_t *rdev, snd_seq_event_ * SNDRV_VIRMIDI_SEQ_ATTACH. */ #if 0 -int snd_virmidi_receive(snd_rawmidi_t *rmidi, snd_seq_event_t *ev) +int snd_virmidi_receive(struct snd_rawmidi *rmidi, struct snd_seq_event *ev) { - snd_virmidi_dev_t *rdev; + struct snd_virmidi_dev *rdev; rdev = rmidi->private_data; return snd_virmidi_dev_receive_event(rdev, ev); @@ -123,10 +122,10 @@ int snd_virmidi_receive(snd_rawmidi_t *rmidi, snd_seq_event_t *ev) /* * event handler of virmidi port */ -static int snd_virmidi_event_input(snd_seq_event_t *ev, int direct, +static int snd_virmidi_event_input(struct snd_seq_event *ev, int direct, void *private_data, int atomic, int hop) { - snd_virmidi_dev_t *rdev; + struct snd_virmidi_dev *rdev; rdev = private_data; if (!(rdev->flags & SNDRV_VIRMIDI_USE)) @@ -137,9 +136,9 @@ static int snd_virmidi_event_input(snd_seq_event_t *ev, int direct, /* * trigger rawmidi stream for input */ -static void snd_virmidi_input_trigger(snd_rawmidi_substream_t * substream, int up) +static void snd_virmidi_input_trigger(struct snd_rawmidi_substream *substream, int up) { - snd_virmidi_t *vmidi = substream->runtime->private_data; + struct snd_virmidi *vmidi = substream->runtime->private_data; if (up) { vmidi->trigger = 1; @@ -151,9 +150,9 @@ static void snd_virmidi_input_trigger(snd_rawmidi_substream_t * substream, int u /* * trigger rawmidi stream for output */ -static void snd_virmidi_output_trigger(snd_rawmidi_substream_t * substream, int up) +static void snd_virmidi_output_trigger(struct snd_rawmidi_substream *substream, int up) { - snd_virmidi_t *vmidi = substream->runtime->private_data; + struct snd_virmidi *vmidi = substream->runtime->private_data; int count, res; unsigned char buf[32], *pbuf; @@ -165,7 +164,7 @@ static void snd_virmidi_output_trigger(snd_rawmidi_substream_t * substream, int return; /* ignored */ } if (vmidi->event.type != SNDRV_SEQ_EVENT_NONE) { - if (snd_seq_kernel_client_dispatch(vmidi->client, &vmidi->event, 0, 0) < 0) + if (snd_seq_kernel_client_dispatch(vmidi->client, &vmidi->event, in_atomic(), 0) < 0) return; vmidi->event.type = SNDRV_SEQ_EVENT_NONE; } @@ -184,7 +183,7 @@ static void snd_virmidi_output_trigger(snd_rawmidi_substream_t * substream, int pbuf += res; count -= res; if (vmidi->event.type != SNDRV_SEQ_EVENT_NONE) { - if (snd_seq_kernel_client_dispatch(vmidi->client, &vmidi->event, 0, 0) < 0) + if (snd_seq_kernel_client_dispatch(vmidi->client, &vmidi->event, in_atomic(), 0) < 0) return; vmidi->event.type = SNDRV_SEQ_EVENT_NONE; } @@ -198,11 +197,11 @@ static void snd_virmidi_output_trigger(snd_rawmidi_substream_t * substream, int /* * open rawmidi handle for input */ -static int snd_virmidi_input_open(snd_rawmidi_substream_t * substream) +static int snd_virmidi_input_open(struct snd_rawmidi_substream *substream) { - snd_virmidi_dev_t *rdev = substream->rmidi->private_data; - snd_rawmidi_runtime_t *runtime = substream->runtime; - snd_virmidi_t *vmidi; + struct snd_virmidi_dev *rdev = substream->rmidi->private_data; + struct snd_rawmidi_runtime *runtime = substream->runtime; + struct snd_virmidi *vmidi; unsigned long flags; vmidi = kzalloc(sizeof(*vmidi), GFP_KERNEL); @@ -227,11 +226,11 @@ static int snd_virmidi_input_open(snd_rawmidi_substream_t * substream) /* * open rawmidi handle for output */ -static int snd_virmidi_output_open(snd_rawmidi_substream_t * substream) +static int snd_virmidi_output_open(struct snd_rawmidi_substream *substream) { - snd_virmidi_dev_t *rdev = substream->rmidi->private_data; - snd_rawmidi_runtime_t *runtime = substream->runtime; - snd_virmidi_t *vmidi; + struct snd_virmidi_dev *rdev = substream->rmidi->private_data; + struct snd_rawmidi_runtime *runtime = substream->runtime; + struct snd_virmidi *vmidi; vmidi = kzalloc(sizeof(*vmidi), GFP_KERNEL); if (vmidi == NULL) @@ -253,9 +252,9 @@ static int snd_virmidi_output_open(snd_rawmidi_substream_t * substream) /* * close rawmidi handle for input */ -static int snd_virmidi_input_close(snd_rawmidi_substream_t * substream) +static int snd_virmidi_input_close(struct snd_rawmidi_substream *substream) { - snd_virmidi_t *vmidi = substream->runtime->private_data; + struct snd_virmidi *vmidi = substream->runtime->private_data; snd_midi_event_free(vmidi->parser); list_del(&vmidi->list); substream->runtime->private_data = NULL; @@ -266,9 +265,9 @@ static int snd_virmidi_input_close(snd_rawmidi_substream_t * substream) /* * close rawmidi handle for output */ -static int snd_virmidi_output_close(snd_rawmidi_substream_t * substream) +static int snd_virmidi_output_close(struct snd_rawmidi_substream *substream) { - snd_virmidi_t *vmidi = substream->runtime->private_data; + struct snd_virmidi *vmidi = substream->runtime->private_data; snd_midi_event_free(vmidi->parser); substream->runtime->private_data = NULL; kfree(vmidi); @@ -278,9 +277,10 @@ static int snd_virmidi_output_close(snd_rawmidi_substream_t * substream) /* * subscribe callback - allow output to rawmidi device */ -static int snd_virmidi_subscribe(void *private_data, snd_seq_port_subscribe_t *info) +static int snd_virmidi_subscribe(void *private_data, + struct snd_seq_port_subscribe *info) { - snd_virmidi_dev_t *rdev; + struct snd_virmidi_dev *rdev; rdev = private_data; if (!try_module_get(rdev->card->module)) @@ -292,9 +292,10 @@ static int snd_virmidi_subscribe(void *private_data, snd_seq_port_subscribe_t *i /* * unsubscribe callback - disallow output to rawmidi device */ -static int snd_virmidi_unsubscribe(void *private_data, snd_seq_port_subscribe_t *info) +static int snd_virmidi_unsubscribe(void *private_data, + struct snd_seq_port_subscribe *info) { - snd_virmidi_dev_t *rdev; + struct snd_virmidi_dev *rdev; rdev = private_data; rdev->flags &= ~SNDRV_VIRMIDI_SUBSCRIBE; @@ -306,9 +307,10 @@ static int snd_virmidi_unsubscribe(void *private_data, snd_seq_port_subscribe_t /* * use callback - allow input to rawmidi device */ -static int snd_virmidi_use(void *private_data, snd_seq_port_subscribe_t *info) +static int snd_virmidi_use(void *private_data, + struct snd_seq_port_subscribe *info) { - snd_virmidi_dev_t *rdev; + struct snd_virmidi_dev *rdev; rdev = private_data; if (!try_module_get(rdev->card->module)) @@ -320,9 +322,10 @@ static int snd_virmidi_use(void *private_data, snd_seq_port_subscribe_t *info) /* * unuse callback - disallow input to rawmidi device */ -static int snd_virmidi_unuse(void *private_data, snd_seq_port_subscribe_t *info) +static int snd_virmidi_unuse(void *private_data, + struct snd_seq_port_subscribe *info) { - snd_virmidi_dev_t *rdev; + struct snd_virmidi_dev *rdev; rdev = private_data; rdev->flags &= ~SNDRV_VIRMIDI_USE; @@ -335,13 +338,13 @@ static int snd_virmidi_unuse(void *private_data, snd_seq_port_subscribe_t *info) * Register functions */ -static snd_rawmidi_ops_t snd_virmidi_input_ops = { +static struct snd_rawmidi_ops snd_virmidi_input_ops = { .open = snd_virmidi_input_open, .close = snd_virmidi_input_close, .trigger = snd_virmidi_input_trigger, }; -static snd_rawmidi_ops_t snd_virmidi_output_ops = { +static struct snd_rawmidi_ops snd_virmidi_output_ops = { .open = snd_virmidi_output_open, .close = snd_virmidi_output_close, .trigger = snd_virmidi_output_trigger, @@ -350,52 +353,42 @@ static snd_rawmidi_ops_t snd_virmidi_output_ops = { /* * create a sequencer client and a port */ -static int snd_virmidi_dev_attach_seq(snd_virmidi_dev_t *rdev) +static int snd_virmidi_dev_attach_seq(struct snd_virmidi_dev *rdev) { int client; - snd_seq_client_callback_t callbacks; - snd_seq_port_callback_t pcallbacks; - snd_seq_client_info_t *info; - snd_seq_port_info_t *pinfo; + struct snd_seq_port_callback pcallbacks; + struct snd_seq_port_info *pinfo; int err; if (rdev->client >= 0) return 0; - info = kmalloc(sizeof(*info), GFP_KERNEL); - pinfo = kmalloc(sizeof(*pinfo), GFP_KERNEL); - if (! info || ! pinfo) { + pinfo = kzalloc(sizeof(*pinfo), GFP_KERNEL); + if (!pinfo) { err = -ENOMEM; goto __error; } - memset(&callbacks, 0, sizeof(callbacks)); - callbacks.private_data = rdev; - callbacks.allow_input = 1; - callbacks.allow_output = 1; - client = snd_seq_create_kernel_client(rdev->card, rdev->device, &callbacks); + client = snd_seq_create_kernel_client(rdev->card, rdev->device, + "%s %d-%d", rdev->rmidi->name, + rdev->card->number, + rdev->device); if (client < 0) { err = client; goto __error; } rdev->client = client; - /* set client name */ - memset(info, 0, sizeof(*info)); - info->client = client; - info->type = KERNEL_CLIENT; - sprintf(info->name, "%s %d-%d", rdev->rmidi->name, rdev->card->number, rdev->device); - snd_seq_kernel_client_ctl(client, SNDRV_SEQ_IOCTL_SET_CLIENT_INFO, info); - /* create a port */ - memset(pinfo, 0, sizeof(*pinfo)); pinfo->addr.client = client; sprintf(pinfo->name, "VirMIDI %d-%d", rdev->card->number, rdev->device); /* set all capabilities */ pinfo->capability |= SNDRV_SEQ_PORT_CAP_WRITE | SNDRV_SEQ_PORT_CAP_SYNC_WRITE | SNDRV_SEQ_PORT_CAP_SUBS_WRITE; pinfo->capability |= SNDRV_SEQ_PORT_CAP_READ | SNDRV_SEQ_PORT_CAP_SYNC_READ | SNDRV_SEQ_PORT_CAP_SUBS_READ; pinfo->capability |= SNDRV_SEQ_PORT_CAP_DUPLEX; - pinfo->type = SNDRV_SEQ_PORT_TYPE_MIDI_GENERIC; + pinfo->type = SNDRV_SEQ_PORT_TYPE_MIDI_GENERIC + | SNDRV_SEQ_PORT_TYPE_SOFTWARE + | SNDRV_SEQ_PORT_TYPE_PORT; pinfo->midi_channels = 16; memset(&pcallbacks, 0, sizeof(pcallbacks)); pcallbacks.owner = THIS_MODULE; @@ -417,7 +410,6 @@ static int snd_virmidi_dev_attach_seq(snd_virmidi_dev_t *rdev) err = 0; /* success */ __error: - kfree(info); kfree(pinfo); return err; } @@ -426,7 +418,7 @@ static int snd_virmidi_dev_attach_seq(snd_virmidi_dev_t *rdev) /* * release the sequencer client */ -static void snd_virmidi_dev_detach_seq(snd_virmidi_dev_t *rdev) +static void snd_virmidi_dev_detach_seq(struct snd_virmidi_dev *rdev) { if (rdev->client >= 0) { snd_seq_delete_kernel_client(rdev->client); @@ -437,9 +429,9 @@ static void snd_virmidi_dev_detach_seq(snd_virmidi_dev_t *rdev) /* * register the device */ -static int snd_virmidi_dev_register(snd_rawmidi_t *rmidi) +static int snd_virmidi_dev_register(struct snd_rawmidi *rmidi) { - snd_virmidi_dev_t *rdev = rmidi->private_data; + struct snd_virmidi_dev *rdev = rmidi->private_data; int err; switch (rdev->seq_mode) { @@ -454,7 +446,7 @@ static int snd_virmidi_dev_register(snd_rawmidi_t *rmidi) /* should check presence of port more strictly.. */ break; default: - snd_printk(KERN_ERR "seq_mode is not set: %d\n", rdev->seq_mode); + pr_err("ALSA: seq_virmidi: seq_mode is not set: %d\n", rdev->seq_mode); return -EINVAL; } return 0; @@ -464,9 +456,9 @@ static int snd_virmidi_dev_register(snd_rawmidi_t *rmidi) /* * unregister the device */ -static int snd_virmidi_dev_unregister(snd_rawmidi_t *rmidi) +static int snd_virmidi_dev_unregister(struct snd_rawmidi *rmidi) { - snd_virmidi_dev_t *rdev = rmidi->private_data; + struct snd_virmidi_dev *rdev = rmidi->private_data; if (rdev->seq_mode == SNDRV_VIRMIDI_SEQ_DISPATCH) snd_virmidi_dev_detach_seq(rdev); @@ -476,7 +468,7 @@ static int snd_virmidi_dev_unregister(snd_rawmidi_t *rmidi) /* * */ -static snd_rawmidi_global_ops_t snd_virmidi_global_ops = { +static struct snd_rawmidi_global_ops snd_virmidi_global_ops = { .dev_register = snd_virmidi_dev_register, .dev_unregister = snd_virmidi_dev_unregister, }; @@ -484,9 +476,9 @@ static snd_rawmidi_global_ops_t snd_virmidi_global_ops = { /* * free device */ -static void snd_virmidi_free(snd_rawmidi_t *rmidi) +static void snd_virmidi_free(struct snd_rawmidi *rmidi) { - snd_virmidi_dev_t *rdev = rmidi->private_data; + struct snd_virmidi_dev *rdev = rmidi->private_data; kfree(rdev); } @@ -495,10 +487,10 @@ static void snd_virmidi_free(snd_rawmidi_t *rmidi) * */ /* exported */ -int snd_virmidi_new(snd_card_t *card, int device, snd_rawmidi_t **rrmidi) +int snd_virmidi_new(struct snd_card *card, int device, struct snd_rawmidi **rrmidi) { - snd_rawmidi_t *rmidi; - snd_virmidi_dev_t *rdev; + struct snd_rawmidi *rmidi; + struct snd_virmidi_dev *rdev; int err; *rrmidi = NULL; |
