Lines Matching refs:sflist

24 static int open_patch(struct snd_sf_list *sflist, const char __user *data,
26 static struct snd_soundfont *newsf(struct snd_sf_list *sflist, int type, char *name);
28 static int close_patch(struct snd_sf_list *sflist);
29 static int probe_data(struct snd_sf_list *sflist, int sample_id);
30 static void set_zone_counter(struct snd_sf_list *sflist,
32 static struct snd_sf_zone *sf_zone_new(struct snd_sf_list *sflist,
34 static void set_sample_counter(struct snd_sf_list *sflist,
36 static struct snd_sf_sample *sf_sample_new(struct snd_sf_list *sflist,
38 static void sf_sample_delete(struct snd_sf_list *sflist,
40 static int load_map(struct snd_sf_list *sflist, const void __user *data, int count);
41 static int load_info(struct snd_sf_list *sflist, const void __user *data, long count);
42 static int remove_info(struct snd_sf_list *sflist, struct snd_soundfont *sf,
49 static int load_data(struct snd_sf_list *sflist, const void __user *data, long count);
50 static void rebuild_presets(struct snd_sf_list *sflist);
51 static void add_preset(struct snd_sf_list *sflist, struct snd_sf_zone *cur);
52 static void delete_preset(struct snd_sf_list *sflist, struct snd_sf_zone *zp);
53 static struct snd_sf_zone *search_first_zone(struct snd_sf_list *sflist,
55 static int search_zones(struct snd_sf_list *sflist, int *notep, int vel,
59 static void snd_sf_init(struct snd_sf_list *sflist);
60 static void snd_sf_clear(struct snd_sf_list *sflist);
63 * lock access to sflist
66 lock_preset(struct snd_sf_list *sflist)
69 mutex_lock(&sflist->presets_mutex);
70 spin_lock_irqsave(&sflist->lock, flags);
71 sflist->presets_locked = 1;
72 spin_unlock_irqrestore(&sflist->lock, flags);
80 unlock_preset(struct snd_sf_list *sflist)
83 spin_lock_irqsave(&sflist->lock, flags);
84 sflist->presets_locked = 0;
85 spin_unlock_irqrestore(&sflist->lock, flags);
86 mutex_unlock(&sflist->presets_mutex);
94 snd_soundfont_close_check(struct snd_sf_list *sflist, int client)
97 spin_lock_irqsave(&sflist->lock, flags);
98 if (sflist->open_client == client) {
99 spin_unlock_irqrestore(&sflist->lock, flags);
100 return close_patch(sflist);
102 spin_unlock_irqrestore(&sflist->lock, flags);
116 snd_soundfont_load(struct snd_sf_list *sflist, const void __user *data,
148 /* grab sflist to open */
149 lock_preset(sflist);
150 rc = open_patch(sflist, data, count, client);
151 unlock_preset(sflist);
156 spin_lock_irqsave(&sflist->lock, flags);
157 if (sflist->open_client != client) {
158 spin_unlock_irqrestore(&sflist->lock, flags);
161 spin_unlock_irqrestore(&sflist->lock, flags);
163 lock_preset(sflist);
167 rc = load_info(sflist, data, count);
170 rc = load_data(sflist, data, count);
173 rc = close_patch(sflist);
179 rc = load_map(sflist, data, count);
182 rc = probe_data(sflist, patch.optarg);
186 if (!sflist->currsf) {
194 if (! remove_info(sflist, sflist->currsf, bank, instr))
201 unlock_preset(sflist);
219 open_patch(struct snd_sf_list *sflist, const char __user *data,
226 spin_lock_irqsave(&sflist->lock, flags);
227 if (sflist->open_client >= 0 || sflist->currsf) {
228 spin_unlock_irqrestore(&sflist->lock, flags);
231 spin_unlock_irqrestore(&sflist->lock, flags);
238 sf = newsf(sflist, parm.type, NULL);
240 sf = newsf(sflist, parm.type, parm.name);
245 spin_lock_irqsave(&sflist->lock, flags);
246 sflist->open_client = client;
247 sflist->currsf = sf;
248 spin_unlock_irqrestore(&sflist->lock, flags);
257 newsf(struct snd_sf_list *sflist, int type, char *name)
263 for (sf = sflist->fonts; sf; sf = sf->next) {
274 sf->id = sflist->fonts_size;
275 sflist->fonts_size++;
278 sf->next = sflist->fonts;
279 sflist->fonts = sf;
304 close_patch(struct snd_sf_list *sflist)
308 spin_lock_irqsave(&sflist->lock, flags);
309 sflist->currsf = NULL;
310 sflist->open_client = -1;
311 spin_unlock_irqrestore(&sflist->lock, flags);
313 rebuild_presets(sflist);
321 probe_data(struct snd_sf_list *sflist, int sample_id)
324 if (sflist->currsf) {
326 if (find_sample(sflist->currsf, sample_id))
336 set_zone_counter(struct snd_sf_list *sflist, struct snd_soundfont *sf,
339 zp->counter = sflist->zone_counter++;
341 sflist->zone_locked = sflist->zone_counter;
348 sf_zone_new(struct snd_sf_list *sflist, struct snd_soundfont *sf)
360 set_zone_counter(sflist, sf, zp);
369 set_sample_counter(struct snd_sf_list *sflist, struct snd_soundfont *sf,
372 sp->counter = sflist->sample_counter++;
374 sflist->sample_locked = sflist->sample_counter;
381 sf_sample_new(struct snd_sf_list *sflist, struct snd_soundfont *sf)
392 set_sample_counter(sflist, sf, sp);
401 sf_sample_delete(struct snd_sf_list *sflist, struct snd_soundfont *sf,
414 load_map(struct snd_sf_list *sflist, const void __user *data, int count)
429 sf = newsf(sflist, SNDRV_SFNT_PAT_TYPE_MAP|SNDRV_SFNT_PAT_SHARED, NULL);
450 set_zone_counter(sflist, sf, zp);
456 zp = sf_zone_new(sflist, sf);
472 add_preset(sflist, zp);
480 remove_info(struct snd_sf_list *sflist, struct snd_soundfont *sf,
502 rebuild_presets(sflist);
512 load_info(struct snd_sf_list *sflist, const void __user *data, long count)
520 sf = sflist->currsf;
563 remove_info(sflist, sf, hdr.bank, hdr.instr);
586 zone = sf_zone_new(sflist, sf);
699 load_data(struct snd_sf_list *sflist, const void __user *data, long count)
707 sf = sflist->currsf;
731 sp = sf_sample_new(sflist, sf);
745 rc = sflist->callback.sample_new
746 (sflist->callback.private_data, sp, sflist->memhdr,
749 sf_sample_delete(sflist, sf, sp);
752 sflist->mem_used += sp->v.truesize;
944 load_guspatch(struct snd_sf_list *sflist, const char __user *data,
964 sf = newsf(sflist, SNDRV_SFNT_PAT_TYPE_GUS|SNDRV_SFNT_PAT_SHARED, NULL);
967 smp = sf_sample_new(sflist, sf);
970 sample_id = sflist->sample_counter;
1006 zone = sf_zone_new(sflist, sf);
1008 sf_sample_delete(sflist, sf, smp);
1015 if (sflist->callback.sample_new) {
1016 rc = sflist->callback.sample_new
1017 (sflist->callback.private_data, smp, sflist->memhdr,
1020 sf_sample_delete(sflist, sf, smp);
1028 sflist->mem_used += smp->v.truesize;
1117 add_preset(sflist, zone);
1124 snd_soundfont_load_guspatch(struct snd_sf_list *sflist, const char __user *data,
1128 lock_preset(sflist);
1129 rc = load_guspatch(sflist, data, count, client);
1130 unlock_preset(sflist);
1143 rebuild_presets(struct snd_sf_list *sflist)
1149 memset(sflist->presets, 0, sizeof(sflist->presets));
1152 for (sf = sflist->fonts; sf; sf = sf->next) {
1161 add_preset(sflist, cur);
1171 add_preset(struct snd_sf_list *sflist, struct snd_sf_zone *cur)
1176 zone = search_first_zone(sflist, cur->bank, cur->instr, cur->v.low);
1187 delete_preset(sflist, zone);
1196 cur->next_instr = sflist->presets[index]; /* preset table link */
1197 sflist->presets[index] = cur;
1204 delete_preset(struct snd_sf_list *sflist, struct snd_sf_zone *zp)
1212 for (p = sflist->presets[index]; p; p = p->next_instr) {
1231 snd_soundfont_search_zone(struct snd_sf_list *sflist, int *notep, int vel,
1243 spin_lock_irqsave(&sflist->lock, flags);
1244 if (sflist->presets_locked) {
1245 spin_unlock_irqrestore(&sflist->lock, flags);
1248 nvoices = search_zones(sflist, notep, vel, preset, bank,
1252 nvoices = search_zones(sflist, notep, vel,
1256 spin_unlock_irqrestore(&sflist->lock, flags);
1265 search_first_zone(struct snd_sf_list *sflist, int bank, int preset, int key)
1273 for (zp = sflist->presets[index]; zp; zp = zp->next_instr) {
1282 * search matching zones from sflist. can be called recursively.
1285 search_zones(struct snd_sf_list *sflist, int *notep, int vel,
1292 zp = search_first_zone(sflist, bank, preset, *notep);
1307 nvoices = search_zones(sflist, &key, vel,
1344 * Initialise the sflist structure.
1347 snd_sf_init(struct snd_sf_list *sflist)
1349 memset(sflist->presets, 0, sizeof(sflist->presets));
1351 sflist->mem_used = 0;
1352 sflist->currsf = NULL;
1353 sflist->open_client = -1;
1354 sflist->fonts = NULL;
1355 sflist->fonts_size = 0;
1356 sflist->zone_counter = 0;
1357 sflist->sample_counter = 0;
1358 sflist->zone_locked = 0;
1359 sflist->sample_locked = 0;
1366 snd_sf_clear(struct snd_sf_list *sflist)
1372 for (sf = sflist->fonts; sf; sf = nextsf) {
1380 if (sflist->callback.sample_free)
1381 sflist->callback.sample_free(sflist->callback.private_data,
1382 sp, sflist->memhdr);
1388 snd_sf_init(sflist);
1393 * Create a new sflist structure
1398 struct snd_sf_list *sflist;
1400 sflist = kzalloc(sizeof(*sflist), GFP_KERNEL);
1401 if (!sflist)
1404 mutex_init(&sflist->presets_mutex);
1405 spin_lock_init(&sflist->lock);
1406 sflist->memhdr = hdr;
1409 sflist->callback = *callback;
1411 snd_sf_init(sflist);
1412 return sflist;
1417 * Free everything allocated off the sflist structure.
1420 snd_sf_free(struct snd_sf_list *sflist)
1422 if (sflist == NULL)
1425 lock_preset(sflist);
1426 if (sflist->callback.sample_reset)
1427 sflist->callback.sample_reset(sflist->callback.private_data);
1428 snd_sf_clear(sflist);
1429 unlock_preset(sflist);
1431 kfree(sflist);
1439 snd_soundfont_remove_samples(struct snd_sf_list *sflist)
1441 lock_preset(sflist);
1442 if (sflist->callback.sample_reset)
1443 sflist->callback.sample_reset(sflist->callback.private_data);
1444 snd_sf_clear(sflist);
1445 unlock_preset(sflist);
1455 snd_soundfont_remove_unlocked(struct snd_sf_list *sflist)
1461 lock_preset(sflist);
1463 if (sflist->callback.sample_reset)
1464 sflist->callback.sample_reset(sflist->callback.private_data);
1467 memset(sflist->presets, 0, sizeof(sflist->presets));
1469 for (sf = sflist->fonts; sf; sf = sf->next) {
1471 if (zp->counter < sflist->zone_locked)
1479 if (sp->counter < sflist->sample_locked)
1483 sflist->mem_used -= sp->v.truesize;
1484 if (sflist->callback.sample_free)
1485 sflist->callback.sample_free(sflist->callback.private_data,
1486 sp, sflist->memhdr);
1491 sflist->zone_counter = sflist->zone_locked;
1492 sflist->sample_counter = sflist->sample_locked;
1494 rebuild_presets(sflist);
1496 unlock_preset(sflist);