};
/* interface for kernel client */
-int snd_seq_create_kernel_client(struct snd_card *card, int client_index);
+int snd_seq_create_kernel_client(struct snd_card *card, int client_index,
+ const char *name_fmt, ...)
+ __attribute__ ((format (printf, 3, 4)));
int snd_seq_delete_kernel_client(int client);
int snd_seq_kernel_client_enqueue(int client, struct snd_seq_event *ev, int atomic, int hop);
int snd_seq_kernel_client_dispatch(int client, struct snd_seq_event *ev, int atomic, int hop);
snd_seq_oss_create_client(void)
{
int rc;
- struct snd_seq_client_info *info;
struct snd_seq_port_info *port;
struct snd_seq_port_callback port_callback;
- info = kmalloc(sizeof(*info), GFP_KERNEL);
port = kmalloc(sizeof(*port), GFP_KERNEL);
- if (!info || !port) {
+ if (!port) {
rc = -ENOMEM;
goto __error;
}
/* create ALSA client */
- rc = snd_seq_create_kernel_client(NULL, SNDRV_SEQ_CLIENT_OSS);
+ rc = snd_seq_create_kernel_client(NULL, SNDRV_SEQ_CLIENT_OSS,
+ "OSS sequencer");
if (rc < 0)
goto __error;
system_client = rc;
debug_printk(("new client = %d\n", rc));
- /* set client information */
- memset(info, 0, sizeof(*info));
- info->client = system_client;
- info->type = KERNEL_CLIENT;
- strcpy(info->name, "OSS sequencer");
-
- rc = call_ctl(SNDRV_SEQ_IOCTL_SET_CLIENT_INFO, info);
-
/* look up midi devices */
snd_seq_oss_midi_lookup_ports(system_client);
__error:
kfree(port);
- kfree(info);
return rc;
}
/* exported to kernel modules */
-int snd_seq_create_kernel_client(struct snd_card *card, int client_index)
+int snd_seq_create_kernel_client(struct snd_card *card, int client_index,
+ const char *name_fmt, ...)
{
struct snd_seq_client *client;
+ va_list args;
snd_assert(! in_interrupt(), return -EBUSY);
client->accept_input = 1;
client->accept_output = 1;
- sprintf(client->name, "Client-%d", client->number);
+ va_start(args, name_fmt);
+ vsnprintf(client->name, sizeof(client->name), name_fmt, args);
+ va_end(args);
client->type = KERNEL_CLIENT;
up(®ister_mutex);
static int __init
register_client(void)
{
- struct snd_seq_client_info cinfo;
struct snd_seq_dummy_port *rec1, *rec2;
int i;
}
/* create client */
- my_client = snd_seq_create_kernel_client(NULL, SNDRV_SEQ_CLIENT_DUMMY);
+ my_client = snd_seq_create_kernel_client(NULL, SNDRV_SEQ_CLIENT_DUMMY,
+ "Midi Through");
if (my_client < 0)
return my_client;
- /* set client name */
- memset(&cinfo, 0, sizeof(cinfo));
- cinfo.client = my_client;
- cinfo.type = KERNEL_CLIENT;
- strcpy(cinfo.name, "Midi Through");
- snd_seq_kernel_client_ctl(my_client, SNDRV_SEQ_IOCTL_SET_CLIENT_INFO, &cinfo);
-
/* create ports */
for (i = 0; i < ports; i++) {
rec1 = create_port(i, 0);
snd_midi_event_free(msynth->parser);
}
-/* set our client name */
-static int set_client_name(struct seq_midisynth_client *client, struct snd_card *card,
- struct snd_rawmidi_info *rmidi)
-{
- struct snd_seq_client_info cinfo;
- const char *name;
-
- memset(&cinfo, 0, sizeof(cinfo));
- cinfo.client = client->seq_client;
- cinfo.type = KERNEL_CLIENT;
- name = rmidi->name[0] ? (const char *)rmidi->name : "External MIDI";
- strlcpy(cinfo.name, name, sizeof(cinfo.name));
- return snd_seq_kernel_client_ctl(client->seq_client, SNDRV_SEQ_IOCTL_SET_CLIENT_INFO, &cinfo);
-}
-
/* register new midi synth port */
static int
snd_seq_midisynth_register_port(struct snd_seq_device *dev)
kfree(info);
return -ENOMEM;
}
- client->seq_client = snd_seq_create_kernel_client(card, 0);
+ client->seq_client =
+ snd_seq_create_kernel_client(
+ card, 0, "%s", info->name[0] ?
+ (const char *)info->name : "External MIDI");
if (client->seq_client < 0) {
kfree(client);
up(®ister_mutex);
kfree(info);
return -ENOMEM;
}
- set_client_name(client, card, info);
- } else if (device == 0)
- set_client_name(client, card, info); /* use the first device's name */
+ }
msynth = kcalloc(ports, sizeof(struct seq_midisynth), GFP_KERNEL);
port = kmalloc(sizeof(*port), GFP_KERNEL);
int __init snd_seq_system_client_init(void)
{
struct snd_seq_port_callback pcallbacks;
- struct snd_seq_client_info *inf;
struct snd_seq_port_info *port;
- inf = kzalloc(sizeof(*inf), GFP_KERNEL);
port = kzalloc(sizeof(*port), GFP_KERNEL);
- if (! inf || ! port) {
- kfree(inf);
- kfree(port);
+ if (!port)
return -ENOMEM;
- }
memset(&pcallbacks, 0, sizeof(pcallbacks));
pcallbacks.owner = THIS_MODULE;
pcallbacks.event_input = event_input_timer;
/* register client */
- sysclient = snd_seq_create_kernel_client(NULL, 0);
-
- /* set our name */
- inf->client = 0;
- inf->type = KERNEL_CLIENT;
- strcpy(inf->name, "System");
- snd_seq_kernel_client_ctl(sysclient, SNDRV_SEQ_IOCTL_SET_CLIENT_INFO, inf);
+ sysclient = snd_seq_create_kernel_client(NULL, 0, "System");
/* register timer */
strcpy(port->name, "Timer");
snd_seq_kernel_client_ctl(sysclient, SNDRV_SEQ_IOCTL_CREATE_PORT, port);
announce_port = port->addr.port;
- kfree(inf);
kfree(port);
return 0;
}
{
int client;
struct snd_seq_port_callback pcallbacks;
- struct snd_seq_client_info *info;
struct snd_seq_port_info *pinfo;
int err;
if (rdev->client >= 0)
return 0;
- info = kmalloc(sizeof(*info), GFP_KERNEL);
pinfo = kmalloc(sizeof(*pinfo), GFP_KERNEL);
- if (! info || ! pinfo) {
+ if (!pinfo) {
err = -ENOMEM;
goto __error;
}
- client = snd_seq_create_kernel_client(rdev->card, rdev->device);
+ client = snd_seq_create_kernel_client(rdev->card, rdev->device,
+ "%s %d-%d", rdev->rmidi->name,
+ rdev->card->number,
+ rdev->device);
if (client < 0) {
err = client;
goto __error;
}
rdev->client = client;
- /* set client name */
- memset(info, 0, sizeof(*info));
- info->client = client;
- info->type = KERNEL_CLIENT;
- sprintf(info->name, "%s %d-%d", rdev->rmidi->name, rdev->card->number, rdev->device);
- snd_seq_kernel_client_ctl(client, SNDRV_SEQ_IOCTL_SET_CLIENT_INFO, info);
-
/* create a port */
memset(pinfo, 0, sizeof(*pinfo));
pinfo->addr.client = client;
err = 0; /* success */
__error:
- kfree(info);
kfree(pinfo);
return err;
}
{
struct snd_opl3 *opl3;
int client;
- struct snd_seq_client_info cinfo;
+ char name[32];
int opl_ver;
opl3 = *(struct snd_opl3 **)SNDRV_SEQ_DEVICE_ARGPTR(dev);
opl3->seq_client = -1;
/* allocate new client */
+ opl_ver = (opl3->hardware & OPL3_HW_MASK) >> 8;
+ sprintf(name, "OPL%i FM synth", opl_ver);
client = opl3->seq_client =
- snd_seq_create_kernel_client(opl3->card, opl3->seq_dev_num);
+ snd_seq_create_kernel_client(opl3->card, opl3->seq_dev_num,
+ name);
if (client < 0)
return client;
- /* change name of client */
- memset(&cinfo, 0, sizeof(cinfo));
- cinfo.client = client;
- cinfo.type = KERNEL_CLIENT;
- opl_ver = (opl3->hardware & OPL3_HW_MASK) >> 8;
- sprintf(cinfo.name, "OPL%i FM synth", opl_ver);
- snd_seq_kernel_client_ctl(client, SNDRV_SEQ_IOCTL_SET_CLIENT_INFO, &cinfo);
-
snd_opl3_synth_create_port(opl3);
/* initialize instrument list */
opl3->sys_timer_status = 0;
#ifdef CONFIG_SND_SEQUENCER_OSS
- snd_opl3_init_seq_oss(opl3, cinfo.name);
+ snd_opl3_init_seq_oss(opl3, name);
#endif
return 0;
}
{
struct snd_opl4 *opl4;
int client;
- struct snd_seq_client_info cinfo;
struct snd_seq_port_callback pcallbacks;
opl4 = *(struct snd_opl4 **)SNDRV_SEQ_DEVICE_ARGPTR(dev);
opl4->chset->private_data = opl4;
/* allocate new client */
- client = snd_seq_create_kernel_client(opl4->card, opl4->seq_dev_num);
+ client = snd_seq_create_kernel_client(opl4->card, opl4->seq_dev_num,
+ "OPL4 Wavetable");
if (client < 0) {
snd_midi_channel_free_set(opl4->chset);
return client;
opl4->seq_client = client;
opl4->chset->client = client;
- /* change name of client */
- memset(&cinfo, 0, sizeof(cinfo));
- cinfo.client = client;
- cinfo.type = KERNEL_CLIENT;
- strcpy(cinfo.name, "OPL4 Wavetable");
- snd_seq_kernel_client_ctl(client, SNDRV_SEQ_IOCTL_SET_CLIENT_INFO, &cinfo);
-
/* create new port */
memset(&pcallbacks, 0, sizeof(pcallbacks));
pcallbacks.owner = THIS_MODULE;
{
struct snd_gus_card *gus;
int client, i;
- struct snd_seq_client_info *cinfo;
struct snd_seq_port_subscribe sub;
struct snd_iwffff_ops *iwops;
struct snd_gf1_ops *gf1ops;
init_MUTEX(&gus->register_mutex);
gus->gf1.seq_client = -1;
- cinfo = kmalloc(sizeof(*cinfo), GFP_KERNEL);
- if (! cinfo)
- return -ENOMEM;
-
/* allocate new client */
client = gus->gf1.seq_client =
- snd_seq_create_kernel_client(gus->card, 1);
- if (client < 0) {
- kfree(cinfo);
+ snd_seq_create_kernel_client(gus->card, 1, gus->interwave ?
+ "AMD InterWave" : "GF1");
+ if (client < 0)
return client;
- }
-
- /* change name of client */
- memset(cinfo, 0, sizeof(*cinfo));
- cinfo->client = client;
- cinfo->type = KERNEL_CLIENT;
- sprintf(cinfo->name, gus->interwave ? "AMD InterWave" : "GF1");
- snd_seq_kernel_client_ctl(client, SNDRV_SEQ_IOCTL_SET_CLIENT_INFO, cinfo);
- kfree(cinfo);
for (i = 0; i < 4; i++)
snd_gus_synth_create_port(gus, i);
{
struct snd_trident *trident;
int client, i;
- struct snd_seq_client_info cinfo;
struct snd_seq_port_subscribe sub;
struct snd_simple_ops *simpleops;
char *str;
trident->synth.seq_client = -1;
/* allocate new client */
- client = trident->synth.seq_client =
- snd_seq_create_kernel_client(trident->card, 1);
- if (client < 0)
- return client;
-
- /* change name of client */
- memset(&cinfo, 0, sizeof(cinfo));
- cinfo.client = client;
- cinfo.type = KERNEL_CLIENT;
str = "???";
switch (trident->device) {
case TRIDENT_DEVICE_ID_DX: str = "Trident 4DWave-DX"; break;
case TRIDENT_DEVICE_ID_NX: str = "Trident 4DWave-NX"; break;
case TRIDENT_DEVICE_ID_SI7018: str = "SiS 7018"; break;
}
- sprintf(cinfo.name, str);
- snd_seq_kernel_client_ctl(client, SNDRV_SEQ_IOCTL_SET_CLIENT_INFO, &cinfo);
+ client = trident->synth.seq_client =
+ snd_seq_create_kernel_client(trident->card, 1, str);
+ if (client < 0)
+ return client;
for (i = 0; i < 4; i++)
snd_trident_synth_create_port(trident, i);
static void snd_emux_init_port(struct snd_emux_port *p);
static int snd_emux_use(void *private_data, struct snd_seq_port_subscribe *info);
static int snd_emux_unuse(void *private_data, struct snd_seq_port_subscribe *info);
-static int get_client(struct snd_card *card, int index, char *name);
/*
* MIDI emulation operators
struct snd_seq_port_callback pinfo;
char tmpname[64];
- sprintf(tmpname, "%s WaveTable", emu->name);
- emu->client = get_client(card, index, tmpname);
+ emu->client = snd_seq_create_kernel_client(card, index,
+ "%s WaveTable", emu->name);
if (emu->client < 0) {
snd_printk("can't create client\n");
return -ENODEV;
}
-/*
- * Create a sequencer client
- */
-static int
-get_client(struct snd_card *card, int index, char *name)
-{
- struct snd_seq_client_info cinfo;
- int client;
-
- /* Find a free client, start from 1 as the MPU expects to use 0 */
- client = snd_seq_create_kernel_client(card, index);
- if (client < 0)
- return client;
-
- memset(&cinfo, 0, sizeof(cinfo));
- cinfo.client = client;
- cinfo.type = KERNEL_CLIENT;
- strcpy(cinfo.name, name);
- snd_seq_kernel_client_ctl(client, SNDRV_SEQ_IOCTL_SET_CLIENT_INFO, &cinfo);
-
- return client;
-}
-
-
/*
* attach virtual rawmidi devices
*/