1 // SPDX-License-Identifier: GPL-2.0-or-later 1 2 /* 3 * Copyright (C) 2000 Takashi Iwai <tiwai@sus 4 * 5 * Routines for control of EMU10K1 WaveTable 6 */ 7 8 #include "emu10k1_synth_local.h" 9 #include <linux/init.h> 10 #include <linux/module.h> 11 12 MODULE_AUTHOR("Takashi Iwai"); 13 MODULE_DESCRIPTION("Routines for control of EM 14 MODULE_LICENSE("GPL"); 15 16 /* 17 * create a new hardware dependent device for 18 */ 19 static int snd_emu10k1_synth_probe(struct devi 20 { 21 struct snd_seq_device *dev = to_seq_de 22 struct snd_emux *emux; 23 struct snd_emu10k1 *hw; 24 struct snd_emu10k1_synth_arg *arg; 25 unsigned long flags; 26 27 arg = SNDRV_SEQ_DEVICE_ARGPTR(dev); 28 if (arg == NULL) 29 return -EINVAL; 30 31 if (arg->seq_ports <= 0) 32 return 0; /* nothing */ 33 if (arg->max_voices < 1) 34 arg->max_voices = 1; 35 else if (arg->max_voices > 64) 36 arg->max_voices = 64; 37 38 if (snd_emux_new(&emux) < 0) 39 return -ENOMEM; 40 41 snd_emu10k1_ops_setup(emux); 42 hw = arg->hwptr; 43 emux->hw = hw; 44 emux->max_voices = arg->max_voices; 45 emux->num_ports = arg->seq_ports; 46 emux->pitch_shift = -501; 47 emux->memhdr = hw->memhdr; 48 /* maximum two ports */ 49 emux->midi_ports = arg->seq_ports < 2 50 /* audigy has two external midis */ 51 emux->midi_devidx = hw->audigy ? 2 : 1 52 emux->linear_panning = 0; 53 emux->hwdep_idx = 2; /* FIXED */ 54 55 if (snd_emux_register(emux, dev->card, 56 snd_emux_free(emux); 57 return -ENOMEM; 58 } 59 60 spin_lock_irqsave(&hw->voice_lock, fla 61 hw->synth = emux; 62 hw->get_synth_voice = snd_emu10k1_synt 63 spin_unlock_irqrestore(&hw->voice_lock 64 65 dev->driver_data = emux; 66 67 return 0; 68 } 69 70 static int snd_emu10k1_synth_remove(struct dev 71 { 72 struct snd_seq_device *dev = to_seq_de 73 struct snd_emux *emux; 74 struct snd_emu10k1 *hw; 75 unsigned long flags; 76 77 if (dev->driver_data == NULL) 78 return 0; /* not registered ac 79 80 emux = dev->driver_data; 81 82 hw = emux->hw; 83 spin_lock_irqsave(&hw->voice_lock, fla 84 hw->synth = NULL; 85 hw->get_synth_voice = NULL; 86 spin_unlock_irqrestore(&hw->voice_lock 87 88 snd_emux_free(emux); 89 return 0; 90 } 91 92 /* 93 * INIT part 94 */ 95 96 static struct snd_seq_driver emu10k1_synth_dri 97 .driver = { 98 .name = KBUILD_MODNAME, 99 .probe = snd_emu10k1_synth_pro 100 .remove = snd_emu10k1_synth_re 101 }, 102 .id = SNDRV_SEQ_DEV_ID_EMU10K1_SYNTH, 103 .argsize = sizeof(struct snd_emu10k1_s 104 }; 105 106 module_snd_seq_driver(emu10k1_synth_driver); 107
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.