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)
359 set_zone_counter(sflist, sf, zp);
368 set_sample_counter(struct snd_sf_list *sflist, struct snd_soundfont *sf,
371 sp->counter = sflist->sample_counter++;
373 sflist->sample_locked = sflist->sample_counter;
380 sf_sample_new(struct snd_sf_list *sflist, struct snd_soundfont *sf)
390 set_sample_counter(sflist, sf, sp);
399 sf_sample_delete(struct snd_sf_list *sflist, struct snd_soundfont *sf,
412 load_map(struct snd_sf_list *sflist, const void __user *data, int count)
427 sf = newsf(sflist, SNDRV_SFNT_PAT_TYPE_MAP|SNDRV_SFNT_PAT_SHARED, NULL);
448 set_zone_counter(sflist, sf, zp);
454 if ((zp = sf_zone_new(sflist, sf)) == NULL)
469 add_preset(sflist, zp);
477 remove_info(struct snd_sf_list *sflist, struct snd_soundfont *sf,
499 rebuild_presets(sflist);
509 load_info(struct snd_sf_list *sflist, const void __user *data, long count)
517 if ((sf = sflist->currsf) == NULL)
559 remove_info(sflist, sf, hdr.bank, hdr.instr);
582 if ((zone = sf_zone_new(sflist, sf)) == NULL) {
695 load_data(struct snd_sf_list *sflist, const void __user *data, long count)
703 if ((sf = sflist->currsf) == NULL)
726 if ((sp = sf_sample_new(sflist, sf)) == NULL)
739 rc = sflist->callback.sample_new
740 (sflist->callback.private_data, sp, sflist->memhdr,
743 sf_sample_delete(sflist, sf, sp);
746 sflist->mem_used += sp->v.truesize;
938 load_guspatch(struct snd_sf_list *sflist, const char __user *data,
958 sf = newsf(sflist, SNDRV_SFNT_PAT_TYPE_GUS|SNDRV_SFNT_PAT_SHARED, NULL);
961 if ((smp = sf_sample_new(sflist, sf)) == NULL)
963 sample_id = sflist->sample_counter;
999 if ((zone = sf_zone_new(sflist, sf)) == NULL) {
1000 sf_sample_delete(sflist, sf, smp);
1007 if (sflist->callback.sample_new) {
1008 rc = sflist->callback.sample_new
1009 (sflist->callback.private_data, smp, sflist->memhdr,
1012 sf_sample_delete(sflist, sf, smp);
1020 sflist->mem_used += smp->v.truesize;
1109 add_preset(sflist, zone);
1116 snd_soundfont_load_guspatch(struct snd_sf_list *sflist, const char __user *data,
1120 lock_preset(sflist);
1121 rc = load_guspatch(sflist, data, count, client);
1122 unlock_preset(sflist);
1135 rebuild_presets(struct snd_sf_list *sflist)
1141 memset(sflist->presets, 0, sizeof(sflist->presets));
1144 for (sf = sflist->fonts; sf; sf = sf->next) {
1153 add_preset(sflist, cur);
1163 add_preset(struct snd_sf_list *sflist, struct snd_sf_zone *cur)
1168 zone = search_first_zone(sflist, cur->bank, cur->instr, cur->v.low);
1179 delete_preset(sflist, zone);
1187 cur->next_instr = sflist->presets[index]; /* preset table link */
1188 sflist->presets[index] = cur;
1195 delete_preset(struct snd_sf_list *sflist, struct snd_sf_zone *zp)
1202 for (p = sflist->presets[index]; p; p = p->next_instr) {
1221 snd_soundfont_search_zone(struct snd_sf_list *sflist, int *notep, int vel,
1233 spin_lock_irqsave(&sflist->lock, flags);
1234 if (sflist->presets_locked) {
1235 spin_unlock_irqrestore(&sflist->lock, flags);
1238 nvoices = search_zones(sflist, notep, vel, preset, bank,
1242 nvoices = search_zones(sflist, notep, vel,
1246 spin_unlock_irqrestore(&sflist->lock, flags);
1255 search_first_zone(struct snd_sf_list *sflist, int bank, int preset, int key)
1262 for (zp = sflist->presets[index]; zp; zp = zp->next_instr) {
1271 * search matching zones from sflist. can be called recursively.
1274 search_zones(struct snd_sf_list *sflist, int *notep, int vel,
1281 zp = search_first_zone(sflist, bank, preset, *notep);
1296 nvoices = search_zones(sflist, &key, vel,
1333 * Initialise the sflist structure.
1336 snd_sf_init(struct snd_sf_list *sflist)
1338 memset(sflist->presets, 0, sizeof(sflist->presets));
1340 sflist->mem_used = 0;
1341 sflist->currsf = NULL;
1342 sflist->open_client = -1;
1343 sflist->fonts = NULL;
1344 sflist->fonts_size = 0;
1345 sflist->zone_counter = 0;
1346 sflist->sample_counter = 0;
1347 sflist->zone_locked = 0;
1348 sflist->sample_locked = 0;
1355 snd_sf_clear(struct snd_sf_list *sflist)
1361 for (sf = sflist->fonts; sf; sf = nextsf) {
1369 if (sflist->callback.sample_free)
1370 sflist->callback.sample_free(sflist->callback.private_data,
1371 sp, sflist->memhdr);
1377 snd_sf_init(sflist);
1382 * Create a new sflist structure
1387 struct snd_sf_list *sflist;
1389 if ((sflist = kzalloc(sizeof(*sflist), GFP_KERNEL)) == NULL)
1392 mutex_init(&sflist->presets_mutex);
1393 spin_lock_init(&sflist->lock);
1394 sflist->memhdr = hdr;
1397 sflist->callback = *callback;
1399 snd_sf_init(sflist);
1400 return sflist;
1405 * Free everything allocated off the sflist structure.
1408 snd_sf_free(struct snd_sf_list *sflist)
1410 if (sflist == NULL)
1413 lock_preset(sflist);
1414 if (sflist->callback.sample_reset)
1415 sflist->callback.sample_reset(sflist->callback.private_data);
1416 snd_sf_clear(sflist);
1417 unlock_preset(sflist);
1419 kfree(sflist);
1427 snd_soundfont_remove_samples(struct snd_sf_list *sflist)
1429 lock_preset(sflist);
1430 if (sflist->callback.sample_reset)
1431 sflist->callback.sample_reset(sflist->callback.private_data);
1432 snd_sf_clear(sflist);
1433 unlock_preset(sflist);
1443 snd_soundfont_remove_unlocked(struct snd_sf_list *sflist)
1449 lock_preset(sflist);
1451 if (sflist->callback.sample_reset)
1452 sflist->callback.sample_reset(sflist->callback.private_data);
1455 memset(sflist->presets, 0, sizeof(sflist->presets));
1457 for (sf = sflist->fonts; sf; sf = sf->next) {
1459 if (zp->counter < sflist->zone_locked)
1467 if (sp->counter < sflist->sample_locked)
1471 sflist->mem_used -= sp->v.truesize;
1472 if (sflist->callback.sample_free)
1473 sflist->callback.sample_free(sflist->callback.private_data,
1474 sp, sflist->memhdr);
1479 sflist->zone_counter = sflist->zone_locked;
1480 sflist->sample_counter = sflist->sample_locked;
1482 rebuild_presets(sflist);
1484 unlock_preset(sflist);