Changeset 305 for GPL/branches/uniaud-2.0/alsa-kernel/drivers/virmidi.c
- Timestamp:
- Mar 24, 2008, 2:43:42 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
GPL/branches/uniaud-2.0/alsa-kernel/drivers/virmidi.c
r32 r305 16 16 * You should have received a copy of the GNU General Public License 17 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 19 19 * 20 20 */ … … 30 30 * 31 31 * Typical usage is like following: 32 * - Load snd- card-virmidi module.33 * # modprobe snd- card-virmidi snd_index=232 * - Load snd-virmidi module. 33 * # modprobe snd-virmidi index=2 34 34 * Then, sequencer clients 72:0 to 75:0 will be created, which are 35 35 * mapped from /dev/snd/midiC1D0 to /dev/snd/midiC1D3, respectively. … … 42 42 */ 43 43 44 #define SNDRV_MAIN_OBJECT_FILE 45 #include <sound/driver.h> 44 #include <linux/init.h> 45 #include <linux/wait.h> 46 #include <linux/err.h> 47 #include <linux/platform_device.h> 48 #include <linux/moduleparam.h> 49 #include <sound/core.h> 46 50 #include <sound/seq_kernel.h> 47 51 #include <sound/seq_virmidi.h> 48 #define SNDRV_GET_ID49 52 #include <sound/initval.h> 50 53 51 EXPORT_NO_SYMBOLS; 54 /* hack: OSS defines midi_devs, so undefine it (versioned symbols) */ 55 #undef midi_devs 56 57 MODULE_AUTHOR("Takashi Iwai <tiwai@suse.de>"); 52 58 MODULE_DESCRIPTION("Dummy soundcard for virtual rawmidi devices"); 53 MODULE_ CLASSES("{sound}");54 MODULE_ DEVICES("{{ALSA,Virtual rawmidi device}}");59 MODULE_LICENSE("GPL"); 60 MODULE_SUPPORTED_DEVICE("{{ALSA,Virtual rawmidi device}}"); 55 61 56 #define MAX_MIDI_DEVICES 862 #define MAX_MIDI_DEVICES 4 57 63 58 static int snd_index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */ 59 static char *snd_id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */ 60 #ifdef TARGET_OS2 61 static int snd_enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE; 62 static int snd_midi_devs[SNDRV_CARDS] = SNDDRV_DEFAULT_MIDI_DEVS 63 #else 64 static int snd_enable[SNDRV_CARDS] = {1, [1 ... (SNDRV_CARDS - 1)] = 0}; 65 static int snd_midi_devs[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 4}; 66 #endif 64 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */ 65 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */ 66 static int enable[SNDRV_CARDS] = {1, [1 ... (SNDRV_CARDS - 1)] = 0}; 67 static int midi_devs[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 4}; 67 68 68 MODULE_PARM(snd_index, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); 69 MODULE_PARM_DESC(snd_index, "Index value for virmidi soundcard."); 70 MODULE_PARM_SYNTAX(snd_index, SNDRV_INDEX_DESC); 71 MODULE_PARM(snd_id, "1-" __MODULE_STRING(SNDRV_CARDS) "s"); 72 MODULE_PARM_DESC(snd_id, "ID string for virmidi soundcard."); 73 MODULE_PARM_SYNTAX(snd_id, SNDRV_ID_DESC); 74 MODULE_PARM(snd_enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); 75 MODULE_PARM_DESC(snd_enable, "Enable this soundcard."); 76 MODULE_PARM_SYNTAX(snd_enable, SNDRV_ENABLE_DESC); 77 MODULE_PARM(snd_midi_devs, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); 78 MODULE_PARM_DESC(snd_midi_devs, "MIDI devices # (1-8)"); 79 MODULE_PARM_SYNTAX(snd_midi_devs, SNDRV_ENABLED ",allows:{{1,8}}"); 69 module_param_array(index, int, NULL, 0444); 70 MODULE_PARM_DESC(index, "Index value for virmidi soundcard."); 71 module_param_array(id, charp, NULL, 0444); 72 MODULE_PARM_DESC(id, "ID string for virmidi soundcard."); 73 module_param_array(enable, bool, NULL, 0444); 74 MODULE_PARM_DESC(enable, "Enable this soundcard."); 75 module_param_array(midi_devs, int, NULL, 0444); 76 MODULE_PARM_DESC(midi_devs, "MIDI devices # (1-4)"); 80 77 81 typedefstruct snd_card_virmidi {82 snd_card_t*card;83 snd_rawmidi_t*midi[MAX_MIDI_DEVICES];84 } snd_card_virmidi_t;78 struct snd_card_virmidi { 79 struct snd_card *card; 80 struct snd_rawmidi *midi[MAX_MIDI_DEVICES]; 81 }; 85 82 86 static s nd_card_t *snd_virmidi_cards[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;83 static struct platform_device *devices[SNDRV_CARDS]; 87 84 88 85 89 static int __ init snd_card_virmidi_probe(int dev)86 static int __devinit snd_virmidi_probe(struct platform_device *devptr) 90 87 { 91 snd_card_t *card; 92 struct snd_card_virmidi *vmidi; 93 int idx, err; 88 struct snd_card *card; 89 struct snd_card_virmidi *vmidi; 90 int idx, err; 91 int dev = devptr->id; 94 92 95 if (!snd_enable[dev]) 96 return -ENODEV; 97 card = snd_card_new(snd_index[dev], snd_id[dev], THIS_MODULE, 98 sizeof(struct snd_card_virmidi)); 99 if (card == NULL) 100 return -ENOMEM; 101 vmidi = (struct snd_card_virmidi *)card->private_data; 102 vmidi->card = card; 93 card = snd_card_new(index[dev], id[dev], THIS_MODULE, 94 sizeof(struct snd_card_virmidi)); 95 if (card == NULL) 96 return -ENOMEM; 97 vmidi = (struct snd_card_virmidi *)card->private_data; 98 vmidi->card = card; 103 99 104 if (snd_midi_devs[dev] > MAX_MIDI_DEVICES) { 105 snd_printk("too much midi devices for virmidi %d: force to use %d\n", dev, MAX_MIDI_DEVICES); 106 snd_midi_devs[dev] = MAX_MIDI_DEVICES; 107 } 108 for (idx = 0; idx < snd_midi_devs[dev]; idx++) { 109 snd_rawmidi_t *rmidi; 110 snd_virmidi_dev_t *rdev; 111 if ((err = snd_virmidi_new(card, idx, &rmidi)) < 0) 112 goto __nodev; 113 rdev = rmidi->private_data; 114 vmidi->midi[idx] = rmidi; 115 strcpy(rmidi->name, "Virtual Raw MIDI"); 116 rdev->seq_mode = SNDRV_VIRMIDI_SEQ_DISPATCH; 117 } 100 if (midi_devs[dev] > MAX_MIDI_DEVICES) { 101 snd_printk("too much midi devices for virmidi %d: force to use %d\n", dev, MAX_MIDI_DEVICES); 102 midi_devs[dev] = MAX_MIDI_DEVICES; 103 } 104 for (idx = 0; idx < midi_devs[dev]; idx++) { 105 struct snd_rawmidi *rmidi; 106 struct snd_virmidi_dev *rdev; 107 if ((err = snd_virmidi_new(card, idx, &rmidi)) < 0) 108 goto __nodev; 109 rdev = rmidi->private_data; 110 vmidi->midi[idx] = rmidi; 111 strcpy(rmidi->name, "Virtual Raw MIDI"); 112 rdev->seq_mode = SNDRV_VIRMIDI_SEQ_DISPATCH; 113 } 114 115 strcpy(card->driver, "VirMIDI"); 116 strcpy(card->shortname, "VirMIDI"); 117 sprintf(card->longname, "Virtual MIDI Card %i", dev + 1); 118 118 119 strcpy(card->driver, "VirMIDI"); 120 strcpy(card->shortname, "VirMIDI"); 121 sprintf(card->longname, "Virtual MIDI Card %i", dev + 1); 122 if ((err = snd_card_register(card)) == 0) { 123 snd_virmidi_cards[dev] = card; 124 return 0; 125 } 126 __nodev: 127 snd_card_free(card); 128 return err; 119 snd_card_set_dev(card, &devptr->dev); 120 121 if ((err = snd_card_register(card)) == 0) { 122 platform_set_drvdata(devptr, card); 123 return 0; 124 } 125 __nodev: 126 snd_card_free(card); 127 return err; 128 } 129 130 static int __devexit snd_virmidi_remove(struct platform_device *devptr) 131 { 132 snd_card_free(platform_get_drvdata(devptr)); 133 platform_set_drvdata(devptr, NULL); 134 return 0; 135 } 136 137 #define SND_VIRMIDI_DRIVER "snd_virmidi" 138 139 static struct platform_driver snd_virmidi_driver = { 140 .probe = snd_virmidi_probe, 141 .remove = __devexit_p(snd_virmidi_remove), 142 .driver = { 143 .name = SND_VIRMIDI_DRIVER 144 }, 145 }; 146 147 static void snd_virmidi_unregister_all(void) 148 { 149 int i; 150 151 for (i = 0; i < ARRAY_SIZE(devices); ++i) 152 platform_device_unregister(devices[i]); 153 platform_driver_unregister(&snd_virmidi_driver); 129 154 } 130 155 131 156 static int __init alsa_card_virmidi_init(void) 132 157 { 133 int dev, cards;158 int i, cards, err; 134 159 135 for (dev = cards = 0; dev < SNDRV_CARDS && snd_enable[dev]; dev++) { 136 if (snd_card_virmidi_probe(dev) < 0) { 160 if ((err = platform_driver_register(&snd_virmidi_driver)) < 0) 161 return err; 162 163 cards = 0; 164 for (i = 0; i < SNDRV_CARDS; i++) { 165 struct platform_device *device; 166 if (! enable[i]) 167 continue; 168 device = platform_device_register_simple(SND_VIRMIDI_DRIVER, 169 i, NULL, 0); 170 if (IS_ERR(device)) 171 continue; 172 if (!platform_get_drvdata(device)) { 173 platform_device_unregister(device); 174 continue; 175 } 176 devices[i] = device; 177 cards++; 178 } 179 if (!cards) { 137 180 #ifdef MODULE 138 snd_printk("Card-VirMIDI #%i not found or device busy\n", dev + 1);181 printk(KERN_ERR "Card-VirMIDI soundcard not found or device busy\n"); 139 182 #endif 140 break; 141 } 142 cards++; 143 } 144 if (!cards) { 145 #ifdef MODULE 146 snd_printk("Card-VirMIDI soundcard not found or device busy\n"); 147 #endif 148 return -ENODEV; 149 } 150 return 0; 183 snd_virmidi_unregister_all(); 184 return -ENODEV; 185 } 186 return 0; 151 187 } 152 188 153 189 static void __exit alsa_card_virmidi_exit(void) 154 190 { 155 int dev; 156 157 for (dev = 0; dev < SNDRV_CARDS; dev++) 158 snd_card_free(snd_virmidi_cards[dev]); 191 snd_virmidi_unregister_all(); 159 192 } 160 193 161 194 module_init(alsa_card_virmidi_init) 162 195 module_exit(alsa_card_virmidi_exit) 163 164 #ifndef MODULE165 166 /* format is: snd-card-virmidi=snd_enable,snd_index,snd_id,snd_midi_devs */167 168 static int __init alsa_card_virmidi_setup(char *str)169 {170 static unsigned __initdata nr_dev = 0;171 172 if (nr_dev >= SNDRV_CARDS)173 return 0;174 (void)(get_option(&str,&snd_enable[nr_dev]) == 2 &&175 get_option(&str,&snd_index[nr_dev]) == 2 &&176 get_id(&str,&snd_id[nr_dev]) == 2 &&177 get_option(&str,&snd_midi_devs[nr_dev]) == 2);178 nr_dev++;179 return 1;180 }181 182 __setup("snd-card-virmidi=", alsa_card_virmidi_setup);183 184 #endif /* ifndef MODULE */
Note:
See TracChangeset
for help on using the changeset viewer.