if (snd_opl3_oss_create_port(opl3)) { /* register to OSS synth table */
snd_device_register(opl3->card, dev);
}
}
/* unregister */ void snd_opl3_free_seq_oss(struct snd_opl3 *opl3)
{ if (opl3->oss_seq_dev) { /* The instance should have been released in prior */
opl3->oss_seq_dev = NULL;
}
}
/* ------------------------------ */
/* open OSS sequencer */ staticint snd_opl3_open_seq_oss(struct snd_seq_oss_arg *arg, void *closure)
{ struct snd_opl3 *opl3 = closure; int err;
if (snd_BUG_ON(!arg)) return -ENXIO;
err = snd_opl3_synth_setup(opl3); if (err < 0) return err;
/* fill the argument data */
arg->private_data = opl3;
arg->addr.client = opl3->oss_chset->client;
arg->addr.port = opl3->oss_chset->port;
err = snd_opl3_synth_use_inc(opl3); if (err < 0) return err;
if (snd_BUG_ON(!arg)) return -ENXIO;
opl3 = arg->private_data;
snd_opl3_synth_cleanup(opl3);
snd_opl3_synth_use_dec(opl3); return 0;
}
/* load patch */
/* from sound_config.h */ #define SBFM_MAXINSTR 256
staticint snd_opl3_load_patch_seq_oss(struct snd_seq_oss_arg *arg, int format, constchar __user *buf, int offs, int count)
{ struct snd_opl3 *opl3; struct sbi_instrument sbi; char name[32]; int err, type;
if (snd_BUG_ON(!arg)) return -ENXIO;
opl3 = arg->private_data;
if (format == FM_PATCH)
type = FM_PATCH_OPL2; elseif (format == OPL3_PATCH)
type = FM_PATCH_OPL3; else return -EINVAL;
if (count < (int)sizeof(sbi)) {
dev_err(opl3->card->dev, "FM Error: Patch record too short\n"); return -EINVAL;
} if (copy_from_user(&sbi, buf, sizeof(sbi))) return -EFAULT;
if (sbi.channel < 0 || sbi.channel >= SBFM_MAXINSTR) {
dev_err(opl3->card->dev, "FM Error: Invalid instrument number %d\n",
sbi.channel); return -EINVAL;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.