Lines Matching full:client
43 /* sequencer client, per UMP EP (rawmidi) */
46 int seq_client; /* sequencer client id */
51 void *ump_info[SNDRV_UMP_MAX_BLOCKS + 1]; /* shadow of seq client ump_info */
72 struct seq_ump_client *client = ump->seq_client; in seq_ump_input_receive() local
75 if (!client->opened[STR_IN]) in seq_ump_input_receive()
82 ev.dest.client = SNDRV_SEQ_ADDRESS_SUBSCRIBERS; in seq_ump_input_receive()
85 snd_seq_kernel_client_dispatch(client->seq_client, in seq_ump_input_receive()
94 struct seq_ump_client *client = private_data; in seq_ump_process_event() local
100 substream = client->out_rfile.output; in seq_ump_process_event()
115 static int seq_ump_client_open(struct seq_ump_client *client, int dir) in seq_ump_client_open() argument
117 struct snd_ump_endpoint *ump = client->ump; in seq_ump_client_open()
121 if (dir == STR_OUT && !client->opened[dir]) { in seq_ump_client_open()
125 &client->out_rfile); in seq_ump_client_open()
129 client->opened[dir]++; in seq_ump_client_open()
136 static int seq_ump_client_close(struct seq_ump_client *client, int dir) in seq_ump_client_close() argument
138 struct snd_ump_endpoint *ump = client->ump; in seq_ump_client_close()
141 if (!--client->opened[dir]) in seq_ump_client_close()
143 snd_rawmidi_kernel_release(&client->out_rfile); in seq_ump_client_close()
148 /* sequencer subscription ops for each client */
151 struct seq_ump_client *client = pdata; in seq_ump_subscribe() local
153 return seq_ump_client_open(client, STR_IN); in seq_ump_subscribe()
158 struct seq_ump_client *client = pdata; in seq_ump_unsubscribe() local
160 return seq_ump_client_close(client, STR_IN); in seq_ump_unsubscribe()
165 struct seq_ump_client *client = pdata; in seq_ump_use() local
167 return seq_ump_client_open(client, STR_OUT); in seq_ump_use()
172 struct seq_ump_client *client = pdata; in seq_ump_unuse() local
174 return seq_ump_client_close(client, STR_OUT); in seq_ump_unuse()
179 struct seq_ump_client *client, in fill_port_info() argument
182 unsigned int rawmidi_info = client->ump->core.info_flags; in fill_port_info()
184 port->addr.client = client->seq_client; in fill_port_info()
217 static int seq_ump_group_init(struct seq_ump_client *client, int group_index) in seq_ump_group_init() argument
219 struct seq_ump_group *group = &client->groups[group_index]; in seq_ump_group_init()
230 fill_port_info(port, client, group); in seq_ump_group_init()
234 pcallbacks.private_data = client; in seq_ump_group_init()
241 err = snd_seq_kernel_client_ctl(client->seq_client, in seq_ump_group_init()
250 static void update_port_infos(struct seq_ump_client *client) in update_port_infos() argument
261 old->addr.client = client->seq_client; in update_port_infos()
263 err = snd_seq_kernel_client_ctl(client->seq_client, in update_port_infos()
268 fill_port_info(new, client, &client->groups[i]); in update_port_infos()
272 err = snd_seq_kernel_client_ctl(client->seq_client, in update_port_infos()
278 snd_seq_system_client_ev_port_change(client->seq_client, i); in update_port_infos()
285 /* update dir_bits and active flag for all groups in the client */
286 static void update_group_attrs(struct seq_ump_client *client) in update_group_attrs() argument
293 group = &client->groups[i]; in update_group_attrs()
300 list_for_each_entry(fb, &client->ump->block_list, list) { in update_group_attrs()
303 group = &client->groups[fb->info.first_group]; in update_group_attrs()
335 static int create_ump_endpoint_port(struct seq_ump_client *client) in create_ump_endpoint_port() argument
339 unsigned int rawmidi_info = client->ump->core.info_flags; in create_ump_endpoint_port()
346 port->addr.client = client->seq_client; in create_ump_endpoint_port()
372 pcallbacks.private_data = client; in create_ump_endpoint_port()
383 err = snd_seq_kernel_client_ctl(client->seq_client, in create_ump_endpoint_port()
390 /* release the client resources */
391 static void seq_ump_client_free(struct seq_ump_client *client) in seq_ump_client_free() argument
393 cancel_work_sync(&client->group_notify_work); in seq_ump_client_free()
395 if (client->seq_client >= 0) in seq_ump_client_free()
396 snd_seq_delete_kernel_client(client->seq_client); in seq_ump_client_free()
398 client->ump->seq_ops = NULL; in seq_ump_client_free()
399 client->ump->seq_client = NULL; in seq_ump_client_free()
401 kfree(client); in seq_ump_client_free()
404 /* update the MIDI version for the given client */
405 static void setup_client_midi_version(struct seq_ump_client *client) in setup_client_midi_version() argument
409 cptr = snd_seq_kernel_client_get(client->seq_client); in setup_client_midi_version()
412 if (client->ump->info.protocol & SNDRV_UMP_EP_INFO_PROTO_MIDI2) in setup_client_midi_version()
419 /* set up client's group_filter bitmap */
420 static void setup_client_group_filter(struct seq_ump_client *client) in setup_client_group_filter() argument
426 cptr = snd_seq_kernel_client_get(client->seq_client); in setup_client_group_filter()
431 if (client->groups[p].active) in setup_client_group_filter()
441 struct seq_ump_client *client = in handle_group_notify() local
444 update_group_attrs(client); in handle_group_notify()
445 update_port_infos(client); in handle_group_notify()
446 setup_client_group_filter(client); in handle_group_notify()
453 struct seq_ump_client *client = ump->seq_client; in seq_ump_notify_fb_change() local
455 if (!client) in seq_ump_notify_fb_change()
457 schedule_work(&client->group_notify_work); in seq_ump_notify_fb_change()
476 /* create a sequencer client and ports for the given UMP endpoint */
482 struct seq_ump_client *client; in snd_seq_ump_probe() local
487 client = kzalloc(sizeof(*client), GFP_KERNEL); in snd_seq_ump_probe()
488 if (!client) in snd_seq_ump_probe()
491 INIT_WORK(&client->group_notify_work, handle_group_notify); in snd_seq_ump_probe()
492 client->ump = ump; in snd_seq_ump_probe()
494 client->seq_client = in snd_seq_ump_probe()
497 if (client->seq_client < 0) { in snd_seq_ump_probe()
498 err = client->seq_client; in snd_seq_ump_probe()
502 client->ump_info[0] = &ump->info; in snd_seq_ump_probe()
504 client->ump_info[fb->info.block_id + 1] = &fb->info; in snd_seq_ump_probe()
506 setup_client_midi_version(client); in snd_seq_ump_probe()
507 update_group_attrs(client); in snd_seq_ump_probe()
510 err = seq_ump_group_init(client, p); in snd_seq_ump_probe()
515 setup_client_group_filter(client); in snd_seq_ump_probe()
517 err = create_ump_endpoint_port(client); in snd_seq_ump_probe()
521 cptr = snd_seq_kernel_client_get(client->seq_client); in snd_seq_ump_probe()
526 cptr->ump_info = client->ump_info; in snd_seq_ump_probe()
529 ump->seq_client = client; in snd_seq_ump_probe()
534 seq_ump_client_free(client); in snd_seq_ump_probe()
538 /* remove a sequencer client */
561 MODULE_DESCRIPTION("ALSA sequencer client for UMP rawmidi");