/* register OSS synth */ void snd_opl3_init_seq_oss(struct snd_opl3 *opl3, char *name) { struct snd_seq_oss_reg *arg; struct snd_seq_device *dev; if (snd_seq_device_new(opl3->card, 0, SNDRV_SEQ_DEV_ID_OSS, sizeof(struct snd_seq_oss_reg), &dev) < 0) return; opl3->oss_seq_dev = dev; strlcpy(dev->name, name, sizeof(dev->name)); arg = SNDRV_SEQ_DEVICE_ARGPTR(dev); arg->type = SYNTH_TYPE_FM; if (opl3->hardware < OPL3_HW_OPL3) { arg->subtype = FM_TYPE_ADLIB; arg->nvoices = MAX_OPL2_VOICES; } else { arg->subtype = FM_TYPE_OPL3; arg->nvoices = MAX_OPL3_VOICES; } arg->oper = oss_callback; arg->private_data = opl3; snd_opl3_oss_create_port(opl3); /* register to OSS synth table */ snd_device_register(opl3->card, dev); }
void snd_pcm_timer_init(struct snd_pcm_substream *substream) { struct snd_timer_id tid; struct snd_timer *timer; tid.dev_sclass = SNDRV_TIMER_SCLASS_NONE; tid.dev_class = SNDRV_TIMER_CLASS_PCM; tid.card = substream->pcm->card->number; tid.device = substream->pcm->device; tid.subdevice = (substream->number << 1) | (substream->stream & 1); if (snd_timer_new(substream->pcm->card, "PCM", &tid, &timer) < 0) return; sprintf(timer->name, "PCM %s %i-%i-%i", substream->stream == SNDRV_PCM_STREAM_CAPTURE ? "capture" : "playback", tid.card, tid.device, tid.subdevice); timer->hw = snd_pcm_timer; if (snd_device_register(timer->card, timer) < 0) { snd_device_free(timer->card, timer); return; } timer->private_data = substream; timer->private_free = snd_pcm_timer_free; substream->timer = timer; }
void snd_emux_init_seq_oss(struct snd_emux *emu) { struct snd_seq_oss_reg *arg; struct snd_seq_device *dev; if (snd_seq_device_new(emu->card, 0, SNDRV_SEQ_DEV_ID_OSS, sizeof(struct snd_seq_oss_reg), &dev) < 0) return; emu->oss_synth = dev; strcpy(dev->name, emu->name); arg = SNDRV_SEQ_DEVICE_ARGPTR(dev); arg->type = SYNTH_TYPE_SAMPLE; arg->subtype = SAMPLE_TYPE_AWE32; arg->nvoices = emu->max_voices; arg->oper = oss_callback; arg->private_data = emu; /* register to OSS synth table */ snd_device_register(emu->card, dev); }
int aoa_snd_device_new(snd_device_type_t type, void * device_data, struct snd_device_ops * ops) { struct snd_card *card = aoa_get_card(); int err; if (!card) return -ENOMEM; err = snd_device_new(card, type, device_data, ops); if (err) { printk(KERN_ERR "snd-aoa: failed to create snd device (%d)\n", err); return err; } err = snd_device_register(card, device_data); if (err) { printk(KERN_ERR "snd-aoa: failed to register " "snd device (%d)\n", err); printk(KERN_ERR "snd-aoa: have you forgotten the " "dev_register callback?\n"); snd_device_free(card, device_data); } return err; }
int aoa_snd_device_new(snd_device_type_t type, void * device_data, struct snd_device_ops * ops) { struct snd_card *card = aoa_get_card(); int err; if (!card) return -ENOMEM; err = snd_device_new(card, type, device_data, ops); if (err) { ; return err; } err = snd_device_register(card, device_data); if (err) { // printk(KERN_ERR "snd-aoa: failed to register " ; // printk(KERN_ERR "snd-aoa: have you forgotten the " ; snd_device_free(card, device_data); } return err; }
/* * attach virtual rawmidi devices */ int snd_emux_init_virmidi(snd_emux_t *emu, snd_card_t *card) { int i; emu->vmidi = NULL; if (emu->midi_ports <= 0) return 0; emu->vmidi = kcalloc(emu->midi_ports, sizeof(snd_rawmidi_t*), GFP_KERNEL); if (emu->vmidi == NULL) return -ENOMEM; for (i = 0; i < emu->midi_ports; i++) { snd_rawmidi_t *rmidi; snd_virmidi_dev_t *rdev; if (snd_virmidi_new(card, emu->midi_devidx + i, &rmidi) < 0) goto __error; rdev = rmidi->private_data; sprintf(rmidi->name, "%s Synth MIDI", emu->name); rdev->seq_mode = SNDRV_VIRMIDI_SEQ_ATTACH; rdev->client = emu->client; rdev->port = emu->ports[i]; if (snd_device_register(card, rmidi) < 0) { snd_device_free(card, rmidi); goto __error; } emu->vmidi[i] = rmidi; //snd_printk("virmidi %d ok\n", i); } return 0; __error: //snd_printk("error init..\n"); snd_emux_delete_virmidi(emu); return -ENOMEM; }