Ignore:
Timestamp:
Mar 24, 2008, 2:43:42 AM (17 years ago)
Author:
Paul Smedley
Message:

Update source to ALSA 1.0.16 level

File:
1 edited

Legend:

Unmodified
Added
Removed
  • GPL/branches/uniaud-2.0/alsa-kernel/drivers/virmidi.c

    r32 r305  
    1616 *   You should have received a copy of the GNU General Public License
    1717 *   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
    1919 *
    2020 */
     
    3030 *
    3131 * Typical usage is like following:
    32  * - Load snd-card-virmidi module.
    33  *      # modprobe snd-card-virmidi snd_index=2
     32 * - Load snd-virmidi module.
     33 *      # modprobe snd-virmidi index=2
    3434 *   Then, sequencer clients 72:0 to 75:0 will be created, which are
    3535 *   mapped from /dev/snd/midiC1D0 to /dev/snd/midiC1D3, respectively.
     
    4242 */
    4343
    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>
    4650#include <sound/seq_kernel.h>
    4751#include <sound/seq_virmidi.h>
    48 #define SNDRV_GET_ID
    4952#include <sound/initval.h>
    5053
    51 EXPORT_NO_SYMBOLS;
     54/* hack: OSS defines midi_devs, so undefine it (versioned symbols) */
     55#undef midi_devs
     56
     57MODULE_AUTHOR("Takashi Iwai <tiwai@suse.de>");
    5258MODULE_DESCRIPTION("Dummy soundcard for virtual rawmidi devices");
    53 MODULE_CLASSES("{sound}");
    54 MODULE_DEVICES("{{ALSA,Virtual rawmidi device}}");
     59MODULE_LICENSE("GPL");
     60MODULE_SUPPORTED_DEVICE("{{ALSA,Virtual rawmidi device}}");
    5561
    56 #define MAX_MIDI_DEVICES        8
     62#define MAX_MIDI_DEVICES        4
    5763
    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
     64static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;      /* Index 0-MAX */
     65static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;       /* ID for this card */
     66static int enable[SNDRV_CARDS] = {1, [1 ... (SNDRV_CARDS - 1)] = 0};
     67static int midi_devs[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 4};
    6768
    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}}");
     69module_param_array(index, int, NULL, 0444);
     70MODULE_PARM_DESC(index, "Index value for virmidi soundcard.");
     71module_param_array(id, charp, NULL, 0444);
     72MODULE_PARM_DESC(id, "ID string for virmidi soundcard.");
     73module_param_array(enable, bool, NULL, 0444);
     74MODULE_PARM_DESC(enable, "Enable this soundcard.");
     75module_param_array(midi_devs, int, NULL, 0444);
     76MODULE_PARM_DESC(midi_devs, "MIDI devices # (1-4)");
    8077
    81 typedef struct snd_card_virmidi {
    82     snd_card_t *card;
    83     snd_rawmidi_t *midi[MAX_MIDI_DEVICES];
    84 } snd_card_virmidi_t;
     78struct snd_card_virmidi {
     79        struct snd_card *card;
     80        struct snd_rawmidi *midi[MAX_MIDI_DEVICES];
     81};
    8582
    86 static snd_card_t *snd_virmidi_cards[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
     83static struct platform_device *devices[SNDRV_CARDS];
    8784
    8885
    89 static int __init snd_card_virmidi_probe(int dev)
     86static int __devinit snd_virmidi_probe(struct platform_device *devptr)
    9087{
    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;
    9492
    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;
    10399
    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);
    118118
    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
     130static 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
     139static 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
     147static 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);
    129154}
    130155
    131156static int __init alsa_card_virmidi_init(void)
    132157{
    133     int dev, cards;
     158        int i, cards, err;
    134159
    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) {
    137180#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");
    139182#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;
    151187}
    152188
    153189static void __exit alsa_card_virmidi_exit(void)
    154190{
    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();
    159192}
    160193
    161194module_init(alsa_card_virmidi_init)
    162195module_exit(alsa_card_virmidi_exit)
    163 
    164 #ifndef MODULE
    165 
    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.