Lines Matching full:client
35 /* sequencer client, per UMP EP (rawmidi) */
38 int seq_client; /* sequencer client id */
42 void *ump_info[SNDRV_UMP_MAX_BLOCKS + 1]; /* shadow of seq client ump_info */
63 struct seq_ump_client *client = ump->seq_client; in seq_ump_input_receive() local
66 if (!client->opened[STR_IN]) in seq_ump_input_receive()
73 ev.dest.client = SNDRV_SEQ_ADDRESS_SUBSCRIBERS; in seq_ump_input_receive()
76 snd_seq_kernel_client_dispatch(client->seq_client, in seq_ump_input_receive()
85 struct seq_ump_client *client = private_data; in seq_ump_process_event() local
91 substream = client->out_rfile.output; in seq_ump_process_event()
106 static int seq_ump_client_open(struct seq_ump_client *client, int dir) in seq_ump_client_open() argument
108 struct snd_ump_endpoint *ump = client->ump; in seq_ump_client_open()
112 if (dir == STR_OUT && !client->opened[dir]) { in seq_ump_client_open()
116 &client->out_rfile); in seq_ump_client_open()
120 client->opened[dir]++; in seq_ump_client_open()
125 static int seq_ump_client_close(struct seq_ump_client *client, int dir) in seq_ump_client_close() argument
127 struct snd_ump_endpoint *ump = client->ump; in seq_ump_client_close()
130 if (!--client->opened[dir]) in seq_ump_client_close()
132 snd_rawmidi_kernel_release(&client->out_rfile); in seq_ump_client_close()
136 /* sequencer subscription ops for each client */
139 struct seq_ump_client *client = pdata; in seq_ump_subscribe() local
141 return seq_ump_client_open(client, STR_IN); in seq_ump_subscribe()
146 struct seq_ump_client *client = pdata; in seq_ump_unsubscribe() local
148 return seq_ump_client_close(client, STR_IN); in seq_ump_unsubscribe()
153 struct seq_ump_client *client = pdata; in seq_ump_use() local
155 return seq_ump_client_open(client, STR_OUT); in seq_ump_use()
160 struct seq_ump_client *client = pdata; in seq_ump_unuse() local
162 return seq_ump_client_close(client, STR_OUT); in seq_ump_unuse()
167 struct seq_ump_client *client, in fill_port_info() argument
170 unsigned int rawmidi_info = client->ump->core.info_flags; in fill_port_info()
172 port->addr.client = client->seq_client; in fill_port_info()
207 static bool skip_group(struct seq_ump_client *client, struct snd_ump_group *group) in skip_group() argument
210 (client->ump->info.flags & SNDRV_UMP_EP_INFO_STATIC_BLOCKS); in skip_group()
214 static int seq_ump_group_init(struct seq_ump_client *client, int group_index) in seq_ump_group_init() argument
216 struct snd_ump_group *group = &client->ump->groups[group_index]; in seq_ump_group_init()
220 if (skip_group(client, group)) in seq_ump_group_init()
227 fill_port_info(port, client, group); in seq_ump_group_init()
231 pcallbacks.private_data = client; in seq_ump_group_init()
238 return snd_seq_kernel_client_ctl(client->seq_client, in seq_ump_group_init()
244 static void update_port_infos(struct seq_ump_client *client) in update_port_infos() argument
256 if (skip_group(client, &client->ump->groups[i])) in update_port_infos()
259 old->addr.client = client->seq_client; in update_port_infos()
261 err = snd_seq_kernel_client_ctl(client->seq_client, in update_port_infos()
266 fill_port_info(new, client, &client->ump->groups[i]); in update_port_infos()
270 err = snd_seq_kernel_client_ctl(client->seq_client, in update_port_infos()
279 static int create_ump_endpoint_port(struct seq_ump_client *client) in create_ump_endpoint_port() argument
283 unsigned int rawmidi_info = client->ump->core.info_flags; in create_ump_endpoint_port()
290 port->addr.client = client->seq_client; in create_ump_endpoint_port()
316 pcallbacks.private_data = client; in create_ump_endpoint_port()
327 err = snd_seq_kernel_client_ctl(client->seq_client, in create_ump_endpoint_port()
333 /* release the client resources */
334 static void seq_ump_client_free(struct seq_ump_client *client) in seq_ump_client_free() argument
336 cancel_work_sync(&client->group_notify_work); in seq_ump_client_free()
338 if (client->seq_client >= 0) in seq_ump_client_free()
339 snd_seq_delete_kernel_client(client->seq_client); in seq_ump_client_free()
341 client->ump->seq_ops = NULL; in seq_ump_client_free()
342 client->ump->seq_client = NULL; in seq_ump_client_free()
344 kfree(client); in seq_ump_client_free()
347 /* update the MIDI version for the given client */
348 static void setup_client_midi_version(struct seq_ump_client *client) in setup_client_midi_version() argument
352 cptr = snd_seq_kernel_client_get(client->seq_client); in setup_client_midi_version()
355 if (client->ump->info.protocol & SNDRV_UMP_EP_INFO_PROTO_MIDI2) in setup_client_midi_version()
362 /* set up client's group_filter bitmap */
363 static void setup_client_group_filter(struct seq_ump_client *client) in setup_client_group_filter() argument
369 cptr = snd_seq_kernel_client_get(client->seq_client); in setup_client_group_filter()
374 if (client->ump->groups[p].active) in setup_client_group_filter()
384 struct seq_ump_client *client = in handle_group_notify() local
387 update_port_infos(client); in handle_group_notify()
388 setup_client_group_filter(client); in handle_group_notify()
394 struct seq_ump_client *client = ump->seq_client; in seq_ump_notify_ep_change() local
398 if (!client) in seq_ump_notify_ep_change()
400 client_id = client->seq_client; in seq_ump_notify_ep_change()
408 /* update sequencer client name if needed */ in seq_ump_notify_ep_change()
422 struct seq_ump_client *client = ump->seq_client; in seq_ump_notify_fb_change() local
424 if (!client) in seq_ump_notify_fb_change()
426 schedule_work(&client->group_notify_work); in seq_ump_notify_fb_change()
427 snd_seq_system_ump_notify(client->seq_client, fb->info.block_id, in seq_ump_notify_fb_change()
436 struct seq_ump_client *client = ump->seq_client; in seq_ump_switch_protocol() local
438 if (!client) in seq_ump_switch_protocol()
440 setup_client_midi_version(client); in seq_ump_switch_protocol()
441 snd_seq_system_ump_notify(client->seq_client, 0, in seq_ump_switch_protocol()
454 /* create a sequencer client and ports for the given UMP endpoint */
460 struct seq_ump_client *client; in snd_seq_ump_probe() local
465 client = kzalloc(sizeof(*client), GFP_KERNEL); in snd_seq_ump_probe()
466 if (!client) in snd_seq_ump_probe()
469 INIT_WORK(&client->group_notify_work, handle_group_notify); in snd_seq_ump_probe()
470 client->ump = ump; in snd_seq_ump_probe()
472 client->seq_client = in snd_seq_ump_probe()
475 if (client->seq_client < 0) { in snd_seq_ump_probe()
476 err = client->seq_client; in snd_seq_ump_probe()
480 client->ump_info[0] = &ump->info; in snd_seq_ump_probe()
482 client->ump_info[fb->info.block_id + 1] = &fb->info; in snd_seq_ump_probe()
484 setup_client_midi_version(client); in snd_seq_ump_probe()
487 err = seq_ump_group_init(client, p); in snd_seq_ump_probe()
492 setup_client_group_filter(client); in snd_seq_ump_probe()
494 err = create_ump_endpoint_port(client); in snd_seq_ump_probe()
498 cptr = snd_seq_kernel_client_get(client->seq_client); in snd_seq_ump_probe()
503 cptr->ump_info = client->ump_info; in snd_seq_ump_probe()
506 ump->seq_client = client; in snd_seq_ump_probe()
511 seq_ump_client_free(client); in snd_seq_ump_probe()
515 /* remove a sequencer client */
538 MODULE_DESCRIPTION("ALSA sequencer client for UMP rawmidi");