Lines Matching refs:sflist

37 static int open_patch(struct snd_sf_list *sflist, const char __user *data,
39 static struct snd_soundfont *newsf(struct snd_sf_list *sflist, int type, char *name);
41 static int close_patch(struct snd_sf_list *sflist);
42 static int probe_data(struct snd_sf_list *sflist, int sample_id);
43 static void set_zone_counter(struct snd_sf_list *sflist,
45 static struct snd_sf_zone *sf_zone_new(struct snd_sf_list *sflist,
47 static void set_sample_counter(struct snd_sf_list *sflist,
49 static struct snd_sf_sample *sf_sample_new(struct snd_sf_list *sflist,
51 static void sf_sample_delete(struct snd_sf_list *sflist,
53 static int load_map(struct snd_sf_list *sflist, const void __user *data, int count);
54 static int load_info(struct snd_sf_list *sflist, const void __user *data, long count);
55 static int remove_info(struct snd_sf_list *sflist, struct snd_soundfont *sf,
62 static int load_data(struct snd_sf_list *sflist, const void __user *data, long count);
63 static void rebuild_presets(struct snd_sf_list *sflist);
64 static void add_preset(struct snd_sf_list *sflist, struct snd_sf_zone *cur);
65 static void delete_preset(struct snd_sf_list *sflist, struct snd_sf_zone *zp);
66 static struct snd_sf_zone *search_first_zone(struct snd_sf_list *sflist,
68 static int search_zones(struct snd_sf_list *sflist, int *notep, int vel,
72 static void snd_sf_init(struct snd_sf_list *sflist);
73 static void snd_sf_clear(struct snd_sf_list *sflist);
79 lock_preset(struct snd_sf_list *sflist) in lock_preset() argument
82 mutex_lock(&sflist->presets_mutex); in lock_preset()
83 spin_lock_irqsave(&sflist->lock, flags); in lock_preset()
84 sflist->presets_locked = 1; in lock_preset()
85 spin_unlock_irqrestore(&sflist->lock, flags); in lock_preset()
93 unlock_preset(struct snd_sf_list *sflist) in unlock_preset() argument
96 spin_lock_irqsave(&sflist->lock, flags); in unlock_preset()
97 sflist->presets_locked = 0; in unlock_preset()
98 spin_unlock_irqrestore(&sflist->lock, flags); in unlock_preset()
99 mutex_unlock(&sflist->presets_mutex); in unlock_preset()
107 snd_soundfont_close_check(struct snd_sf_list *sflist, int client) in snd_soundfont_close_check() argument
110 spin_lock_irqsave(&sflist->lock, flags); in snd_soundfont_close_check()
111 if (sflist->open_client == client) { in snd_soundfont_close_check()
112 spin_unlock_irqrestore(&sflist->lock, flags); in snd_soundfont_close_check()
113 return close_patch(sflist); in snd_soundfont_close_check()
115 spin_unlock_irqrestore(&sflist->lock, flags); in snd_soundfont_close_check()
129 snd_soundfont_load(struct snd_sf_list *sflist, const void __user *data, in snd_soundfont_load() argument
162 lock_preset(sflist); in snd_soundfont_load()
163 rc = open_patch(sflist, data, count, client); in snd_soundfont_load()
164 unlock_preset(sflist); in snd_soundfont_load()
169 spin_lock_irqsave(&sflist->lock, flags); in snd_soundfont_load()
170 if (sflist->open_client != client) { in snd_soundfont_load()
171 spin_unlock_irqrestore(&sflist->lock, flags); in snd_soundfont_load()
174 spin_unlock_irqrestore(&sflist->lock, flags); in snd_soundfont_load()
176 lock_preset(sflist); in snd_soundfont_load()
180 rc = load_info(sflist, data, count); in snd_soundfont_load()
183 rc = load_data(sflist, data, count); in snd_soundfont_load()
186 rc = close_patch(sflist); in snd_soundfont_load()
192 rc = load_map(sflist, data, count); in snd_soundfont_load()
195 rc = probe_data(sflist, patch.optarg); in snd_soundfont_load()
199 if (!sflist->currsf) { in snd_soundfont_load()
207 if (! remove_info(sflist, sflist->currsf, bank, instr)) in snd_soundfont_load()
214 unlock_preset(sflist); in snd_soundfont_load()
232 open_patch(struct snd_sf_list *sflist, const char __user *data, in open_patch() argument
239 spin_lock_irqsave(&sflist->lock, flags); in open_patch()
240 if (sflist->open_client >= 0 || sflist->currsf) { in open_patch()
241 spin_unlock_irqrestore(&sflist->lock, flags); in open_patch()
244 spin_unlock_irqrestore(&sflist->lock, flags); in open_patch()
251 sf = newsf(sflist, parm.type, NULL); in open_patch()
253 sf = newsf(sflist, parm.type, parm.name); in open_patch()
258 spin_lock_irqsave(&sflist->lock, flags); in open_patch()
259 sflist->open_client = client; in open_patch()
260 sflist->currsf = sf; in open_patch()
261 spin_unlock_irqrestore(&sflist->lock, flags); in open_patch()
270 newsf(struct snd_sf_list *sflist, int type, char *name) in newsf() argument
276 for (sf = sflist->fonts; sf; sf = sf->next) { in newsf()
287 sf->id = sflist->fonts_size; in newsf()
288 sflist->fonts_size++; in newsf()
291 sf->next = sflist->fonts; in newsf()
292 sflist->fonts = sf; in newsf()
317 close_patch(struct snd_sf_list *sflist) in close_patch() argument
321 spin_lock_irqsave(&sflist->lock, flags); in close_patch()
322 sflist->currsf = NULL; in close_patch()
323 sflist->open_client = -1; in close_patch()
324 spin_unlock_irqrestore(&sflist->lock, flags); in close_patch()
326 rebuild_presets(sflist); in close_patch()
334 probe_data(struct snd_sf_list *sflist, int sample_id) in probe_data() argument
337 if (sflist->currsf) { in probe_data()
339 if (find_sample(sflist->currsf, sample_id)) in probe_data()
349 set_zone_counter(struct snd_sf_list *sflist, struct snd_soundfont *sf, in set_zone_counter() argument
352 zp->counter = sflist->zone_counter++; in set_zone_counter()
354 sflist->zone_locked = sflist->zone_counter; in set_zone_counter()
361 sf_zone_new(struct snd_sf_list *sflist, struct snd_soundfont *sf) in sf_zone_new() argument
372 set_zone_counter(sflist, sf, zp); in sf_zone_new()
381 set_sample_counter(struct snd_sf_list *sflist, struct snd_soundfont *sf, in set_sample_counter() argument
384 sp->counter = sflist->sample_counter++; in set_sample_counter()
386 sflist->sample_locked = sflist->sample_counter; in set_sample_counter()
393 sf_sample_new(struct snd_sf_list *sflist, struct snd_soundfont *sf) in sf_sample_new() argument
403 set_sample_counter(sflist, sf, sp); in sf_sample_new()
412 sf_sample_delete(struct snd_sf_list *sflist, struct snd_soundfont *sf, in sf_sample_delete() argument
425 load_map(struct snd_sf_list *sflist, const void __user *data, int count) in load_map() argument
440 sf = newsf(sflist, SNDRV_SFNT_PAT_TYPE_MAP|SNDRV_SFNT_PAT_SHARED, NULL); in load_map()
461 set_zone_counter(sflist, sf, zp); in load_map()
467 if ((zp = sf_zone_new(sflist, sf)) == NULL) in load_map()
482 add_preset(sflist, zp); in load_map()
490 remove_info(struct snd_sf_list *sflist, struct snd_soundfont *sf, in remove_info() argument
512 rebuild_presets(sflist); in remove_info()
522 load_info(struct snd_sf_list *sflist, const void __user *data, long count) in load_info() argument
530 if ((sf = sflist->currsf) == NULL) in load_info()
572 remove_info(sflist, sf, hdr.bank, hdr.instr); in load_info()
595 if ((zone = sf_zone_new(sflist, sf)) == NULL) { in load_info()
708 load_data(struct snd_sf_list *sflist, const void __user *data, long count) in load_data() argument
716 if ((sf = sflist->currsf) == NULL) in load_data()
739 if ((sp = sf_sample_new(sflist, sf)) == NULL) in load_data()
752 rc = sflist->callback.sample_new in load_data()
753 (sflist->callback.private_data, sp, sflist->memhdr, in load_data()
756 sf_sample_delete(sflist, sf, sp); in load_data()
759 sflist->mem_used += sp->v.truesize; in load_data()
949 load_guspatch(struct snd_sf_list *sflist, const char __user *data, in load_guspatch() argument
969 sf = newsf(sflist, SNDRV_SFNT_PAT_TYPE_GUS|SNDRV_SFNT_PAT_SHARED, NULL); in load_guspatch()
972 if ((smp = sf_sample_new(sflist, sf)) == NULL) in load_guspatch()
974 sample_id = sflist->sample_counter; in load_guspatch()
1010 if ((zone = sf_zone_new(sflist, sf)) == NULL) { in load_guspatch()
1011 sf_sample_delete(sflist, sf, smp); in load_guspatch()
1018 if (sflist->callback.sample_new) { in load_guspatch()
1019 rc = sflist->callback.sample_new in load_guspatch()
1020 (sflist->callback.private_data, smp, sflist->memhdr, in load_guspatch()
1023 sf_sample_delete(sflist, sf, smp); in load_guspatch()
1031 sflist->mem_used += smp->v.truesize; in load_guspatch()
1120 add_preset(sflist, zone); in load_guspatch()
1127 snd_soundfont_load_guspatch(struct snd_sf_list *sflist, const char __user *data, in snd_soundfont_load_guspatch() argument
1131 lock_preset(sflist); in snd_soundfont_load_guspatch()
1132 rc = load_guspatch(sflist, data, count, client); in snd_soundfont_load_guspatch()
1133 unlock_preset(sflist); in snd_soundfont_load_guspatch()
1146 rebuild_presets(struct snd_sf_list *sflist) in rebuild_presets() argument
1152 memset(sflist->presets, 0, sizeof(sflist->presets)); in rebuild_presets()
1155 for (sf = sflist->fonts; sf; sf = sf->next) { in rebuild_presets()
1164 add_preset(sflist, cur); in rebuild_presets()
1174 add_preset(struct snd_sf_list *sflist, struct snd_sf_zone *cur) in add_preset() argument
1179 zone = search_first_zone(sflist, cur->bank, cur->instr, cur->v.low); in add_preset()
1190 delete_preset(sflist, zone); in add_preset()
1198 cur->next_instr = sflist->presets[index]; /* preset table link */ in add_preset()
1199 sflist->presets[index] = cur; in add_preset()
1206 delete_preset(struct snd_sf_list *sflist, struct snd_sf_zone *zp) in delete_preset() argument
1213 for (p = sflist->presets[index]; p; p = p->next_instr) { in delete_preset()
1232 snd_soundfont_search_zone(struct snd_sf_list *sflist, int *notep, int vel, in snd_soundfont_search_zone() argument
1244 spin_lock_irqsave(&sflist->lock, flags); in snd_soundfont_search_zone()
1245 if (sflist->presets_locked) { in snd_soundfont_search_zone()
1246 spin_unlock_irqrestore(&sflist->lock, flags); in snd_soundfont_search_zone()
1249 nvoices = search_zones(sflist, notep, vel, preset, bank, in snd_soundfont_search_zone()
1253 nvoices = search_zones(sflist, notep, vel, in snd_soundfont_search_zone()
1257 spin_unlock_irqrestore(&sflist->lock, flags); in snd_soundfont_search_zone()
1266 search_first_zone(struct snd_sf_list *sflist, int bank, int preset, int key) in search_first_zone() argument
1273 for (zp = sflist->presets[index]; zp; zp = zp->next_instr) { in search_first_zone()
1285 search_zones(struct snd_sf_list *sflist, int *notep, int vel, in search_zones() argument
1292 zp = search_first_zone(sflist, bank, preset, *notep); in search_zones()
1307 nvoices = search_zones(sflist, &key, vel, in search_zones()
1347 snd_sf_init(struct snd_sf_list *sflist) in snd_sf_init() argument
1349 memset(sflist->presets, 0, sizeof(sflist->presets)); in snd_sf_init()
1351 sflist->mem_used = 0; in snd_sf_init()
1352 sflist->currsf = NULL; in snd_sf_init()
1353 sflist->open_client = -1; in snd_sf_init()
1354 sflist->fonts = NULL; in snd_sf_init()
1355 sflist->fonts_size = 0; in snd_sf_init()
1356 sflist->zone_counter = 0; in snd_sf_init()
1357 sflist->sample_counter = 0; in snd_sf_init()
1358 sflist->zone_locked = 0; in snd_sf_init()
1359 sflist->sample_locked = 0; in snd_sf_init()
1366 snd_sf_clear(struct snd_sf_list *sflist) in snd_sf_clear() argument
1372 for (sf = sflist->fonts; sf; sf = nextsf) { in snd_sf_clear()
1380 if (sflist->callback.sample_free) in snd_sf_clear()
1381 sflist->callback.sample_free(sflist->callback.private_data, in snd_sf_clear()
1382 sp, sflist->memhdr); in snd_sf_clear()
1388 snd_sf_init(sflist); in snd_sf_clear()
1398 struct snd_sf_list *sflist; in snd_sf_new() local
1400 if ((sflist = kzalloc(sizeof(*sflist), GFP_KERNEL)) == NULL) in snd_sf_new()
1403 mutex_init(&sflist->presets_mutex); in snd_sf_new()
1404 spin_lock_init(&sflist->lock); in snd_sf_new()
1405 sflist->memhdr = hdr; in snd_sf_new()
1408 sflist->callback = *callback; in snd_sf_new()
1410 snd_sf_init(sflist); in snd_sf_new()
1411 return sflist; in snd_sf_new()
1419 snd_sf_free(struct snd_sf_list *sflist) in snd_sf_free() argument
1421 if (sflist == NULL) in snd_sf_free()
1424 lock_preset(sflist); in snd_sf_free()
1425 if (sflist->callback.sample_reset) in snd_sf_free()
1426 sflist->callback.sample_reset(sflist->callback.private_data); in snd_sf_free()
1427 snd_sf_clear(sflist); in snd_sf_free()
1428 unlock_preset(sflist); in snd_sf_free()
1430 kfree(sflist); in snd_sf_free()
1438 snd_soundfont_remove_samples(struct snd_sf_list *sflist) in snd_soundfont_remove_samples() argument
1440 lock_preset(sflist); in snd_soundfont_remove_samples()
1441 if (sflist->callback.sample_reset) in snd_soundfont_remove_samples()
1442 sflist->callback.sample_reset(sflist->callback.private_data); in snd_soundfont_remove_samples()
1443 snd_sf_clear(sflist); in snd_soundfont_remove_samples()
1444 unlock_preset(sflist); in snd_soundfont_remove_samples()
1454 snd_soundfont_remove_unlocked(struct snd_sf_list *sflist) in snd_soundfont_remove_unlocked() argument
1460 lock_preset(sflist); in snd_soundfont_remove_unlocked()
1462 if (sflist->callback.sample_reset) in snd_soundfont_remove_unlocked()
1463 sflist->callback.sample_reset(sflist->callback.private_data); in snd_soundfont_remove_unlocked()
1466 memset(sflist->presets, 0, sizeof(sflist->presets)); in snd_soundfont_remove_unlocked()
1468 for (sf = sflist->fonts; sf; sf = sf->next) { in snd_soundfont_remove_unlocked()
1470 if (zp->counter < sflist->zone_locked) in snd_soundfont_remove_unlocked()
1478 if (sp->counter < sflist->sample_locked) in snd_soundfont_remove_unlocked()
1482 sflist->mem_used -= sp->v.truesize; in snd_soundfont_remove_unlocked()
1483 if (sflist->callback.sample_free) in snd_soundfont_remove_unlocked()
1484 sflist->callback.sample_free(sflist->callback.private_data, in snd_soundfont_remove_unlocked()
1485 sp, sflist->memhdr); in snd_soundfont_remove_unlocked()
1490 sflist->zone_counter = sflist->zone_locked; in snd_soundfont_remove_unlocked()
1491 sflist->sample_counter = sflist->sample_locked; in snd_soundfont_remove_unlocked()
1493 rebuild_presets(sflist); in snd_soundfont_remove_unlocked()
1495 unlock_preset(sflist); in snd_soundfont_remove_unlocked()