Lines Matching +full:smp +full:- +full:offset

1 // SPDX-License-Identifier: GPL-2.0-or-later
8 * Copyright (c) 1999-2000 Takashi Iwai <tiwai@suse.de>
69 mutex_lock(&sflist->presets_mutex); in lock_preset()
70 spin_lock_irqsave(&sflist->lock, flags); in lock_preset()
71 sflist->presets_locked = 1; in lock_preset()
72 spin_unlock_irqrestore(&sflist->lock, flags); in lock_preset()
83 spin_lock_irqsave(&sflist->lock, flags); in unlock_preset()
84 sflist->presets_locked = 0; in unlock_preset()
85 spin_unlock_irqrestore(&sflist->lock, flags); in unlock_preset()
86 mutex_unlock(&sflist->presets_mutex); in unlock_preset()
97 spin_lock_irqsave(&sflist->lock, flags); in snd_soundfont_close_check()
98 if (sflist->open_client == client) { in snd_soundfont_close_check()
99 spin_unlock_irqrestore(&sflist->lock, flags); in snd_soundfont_close_check()
102 spin_unlock_irqrestore(&sflist->lock, flags); in snd_soundfont_close_check()
125 return -EINVAL; in snd_soundfont_load()
128 return -EFAULT; in snd_soundfont_load()
130 count -= sizeof(patch); in snd_soundfont_load()
135 return -EINVAL; in snd_soundfont_load()
140 return -EINVAL; in snd_soundfont_load()
144 return -EINVAL; in snd_soundfont_load()
156 spin_lock_irqsave(&sflist->lock, flags); in snd_soundfont_load()
157 if (sflist->open_client != client) { in snd_soundfont_load()
158 spin_unlock_irqrestore(&sflist->lock, flags); in snd_soundfont_load()
159 return -EBUSY; in snd_soundfont_load()
161 spin_unlock_irqrestore(&sflist->lock, flags); in snd_soundfont_load()
164 rc = -EINVAL; in snd_soundfont_load()
186 if (!sflist->currsf) { in snd_soundfont_load()
189 rc = -EINVAL; in snd_soundfont_load()
194 if (! remove_info(sflist, sflist->currsf, bank, instr)) in snd_soundfont_load()
195 rc = -EINVAL; in snd_soundfont_load()
207 /* check if specified type is special font (GUS or preset-alias) */
226 spin_lock_irqsave(&sflist->lock, flags); in open_patch()
227 if (sflist->open_client >= 0 || sflist->currsf) { in open_patch()
228 spin_unlock_irqrestore(&sflist->lock, flags); in open_patch()
229 return -EBUSY; in open_patch()
231 spin_unlock_irqrestore(&sflist->lock, flags); in open_patch()
234 return -EFAULT; in open_patch()
242 return -ENOMEM; in open_patch()
245 spin_lock_irqsave(&sflist->lock, flags); in open_patch()
246 sflist->open_client = client; in open_patch()
247 sflist->currsf = sf; in open_patch()
248 spin_unlock_irqrestore(&sflist->lock, flags); in open_patch()
263 for (sf = sflist->fonts; sf; sf = sf->next) { in newsf()
270 /* not found -- create a new one */ in newsf()
274 sf->id = sflist->fonts_size; in newsf()
275 sflist->fonts_size++; in newsf()
278 sf->next = sflist->fonts; in newsf()
279 sflist->fonts = sf; in newsf()
281 sf->type = type; in newsf()
282 sf->zones = NULL; in newsf()
283 sf->samples = NULL; in newsf()
285 memcpy(sf->name, name, SNDRV_SFNT_PATCH_NAME_LEN); in newsf()
294 return ((sf->type & SNDRV_SFNT_PAT_SHARED) && in is_identical_font()
295 (sf->type & 0x0f) == (type & 0x0f) && in is_identical_font()
297 memcmp(sf->name, name, SNDRV_SFNT_PATCH_NAME_LEN) == 0)); in is_identical_font()
308 spin_lock_irqsave(&sflist->lock, flags); in close_patch()
309 sflist->currsf = NULL; in close_patch()
310 sflist->open_client = -1; in close_patch()
311 spin_unlock_irqrestore(&sflist->lock, flags); in close_patch()
319 /* probe sample in the current list -- nothing to be loaded */
324 if (sflist->currsf) { in probe_data()
326 if (find_sample(sflist->currsf, sample_id)) in probe_data()
329 return -EINVAL; in probe_data()
339 zp->counter = sflist->zone_counter++; in set_zone_counter()
340 if (sf->type & SNDRV_SFNT_PAT_LOCKED) in set_zone_counter()
341 sflist->zone_locked = sflist->zone_counter; in set_zone_counter()
355 zp->next = sf->zones; in sf_zone_new()
356 sf->zones = zp; in sf_zone_new()
358 init_voice_info(&zp->v); in sf_zone_new()
372 sp->counter = sflist->sample_counter++; in set_sample_counter()
373 if (sf->type & SNDRV_SFNT_PAT_LOCKED) in set_sample_counter()
374 sflist->sample_locked = sflist->sample_counter; in set_sample_counter()
389 sp->next = sf->samples; in sf_sample_new()
390 sf->samples = sp; in sf_sample_new()
397 * delete sample list -- this is an exceptional job.
405 if (sp == sf->samples) { in sf_sample_delete()
406 sf->samples = sp->next; in sf_sample_delete()
422 return -EINVAL; in load_map()
424 return -EFAULT; in load_map()
427 return -EINVAL; in load_map()
431 return -ENOMEM; in load_map()
434 for (zp = sf->zones; zp; prevp = zp, zp = zp->next) { in load_map()
435 if (zp->mapped && in load_map()
436 zp->instr == map.map_instr && in load_map()
437 zp->bank == map.map_bank && in load_map()
438 zp->v.low == map.map_key && in load_map()
439 zp->v.start == map.src_instr && in load_map()
440 zp->v.end == map.src_bank && in load_map()
441 zp->v.fixkey == map.src_key) { in load_map()
445 prevp->next = zp->next; in load_map()
446 zp->next = sf->zones; in load_map()
447 sf->zones = zp; in load_map()
458 return -ENOMEM; in load_map()
460 zp->bank = map.map_bank; in load_map()
461 zp->instr = map.map_instr; in load_map()
462 zp->mapped = 1; in load_map()
464 zp->v.low = map.map_key; in load_map()
465 zp->v.high = map.map_key; in load_map()
467 zp->v.start = map.src_instr; in load_map()
468 zp->v.end = map.src_bank; in load_map()
469 zp->v.fixkey = map.src_key; in load_map()
470 zp->v.sf_id = sf->id; in load_map()
487 for (p = sf->zones; p; p = next) { in remove_info()
488 next = p->next; in remove_info()
489 if (! p->mapped && in remove_info()
490 p->bank == bank && p->instr == instr) { in remove_info()
493 prev->next = next; in remove_info()
495 sf->zones = next; in remove_info()
520 sf = sflist->currsf; in load_info()
522 return -EINVAL; in load_info()
524 if (is_special_type(sf->type)) in load_info()
525 return -EINVAL; in load_info()
529 return -EINVAL; in load_info()
532 return -EFAULT; in load_info()
535 count -= sizeof(hdr); in load_info()
540 return -EINVAL; in load_info()
547 return -EINVAL; in load_info()
552 /* exclusive mode - if the instrument already exists, in load_info()
554 for (zone = sf->zones; zone; zone = zone->next) { in load_info()
555 if (!zone->mapped && in load_info()
556 zone->bank == hdr.bank && in load_info()
557 zone->instr == hdr.instr) in load_info()
558 return -EINVAL; in load_info()
562 /* replace mode - remove the instrument if it already exists */ in load_info()
572 return -EFAULT; in load_info()
576 count -= sizeof(tmpzone.v); in load_info()
581 tmpzone.v.sf_id = sf->id; in load_info()
588 return -ENOMEM; in load_info()
591 zone->bank = tmpzone.bank; in load_info()
592 zone->instr = tmpzone.instr; in load_info()
593 zone->v = tmpzone.v; in load_info()
596 zone->sample = set_sample(sf, &zone->v); in load_info()
609 avp->root = 60; in init_voice_info()
610 avp->high = 127; in init_voice_info()
611 avp->velhigh = 127; in init_voice_info()
612 avp->fixkey = -1; in init_voice_info()
613 avp->fixvel = -1; in init_voice_info()
614 avp->fixpan = -1; in init_voice_info()
615 avp->pan = -1; in init_voice_info()
616 avp->amplitude = 127; in init_voice_info()
617 avp->scaleTuning = 100; in init_voice_info()
619 init_voice_parm(&avp->parm); in init_voice_info()
633 pp->moddelay = 0x8000; in init_voice_parm()
634 pp->modatkhld = 0x7f7f; in init_voice_parm()
635 pp->moddcysus = 0x7f7f; in init_voice_parm()
636 pp->modrelease = 0x807f; in init_voice_parm()
638 pp->voldelay = 0x8000; in init_voice_parm()
639 pp->volatkhld = 0x7f7f; in init_voice_parm()
640 pp->voldcysus = 0x7f7f; in init_voice_parm()
641 pp->volrelease = 0x807f; in init_voice_parm()
643 pp->lfo1delay = 0x8000; in init_voice_parm()
644 pp->lfo2delay = 0x8000; in init_voice_parm()
646 pp->cutoff = 0xff; in init_voice_parm()
655 sample = find_sample(sf, avp->sample); in set_sample()
660 * The voice_info addresses define only the relative offset in set_sample()
662 * offset from sample pointers. in set_sample()
664 avp->start += sample->v.start; in set_sample()
665 avp->end += sample->v.end; in set_sample()
666 avp->loopstart += sample->v.loopstart; in set_sample()
667 avp->loopend += sample->v.loopend; in set_sample()
670 avp->sample_mode = sample->v.mode_flags; in set_sample()
684 for (p = sf->samples; p; p = p->next) { in find_sample()
685 if (p->v.sample == sample_id) in find_sample()
707 sf = sflist->currsf; in load_data()
709 return -EINVAL; in load_data()
711 if (is_special_type(sf->type)) in load_data()
712 return -EINVAL; in load_data()
715 return -EFAULT; in load_data()
719 if (sample_info.size != (count-off)/2) in load_data()
720 return -EINVAL; in load_data()
725 if (sf->type & SNDRV_SFNT_PAT_SHARED) in load_data()
727 return -EINVAL; in load_data()
733 return -ENOMEM; in load_data()
735 sp->v = sample_info; in load_data()
736 sp->v.sf_id = sf->id; in load_data()
737 sp->v.dummy = 0; in load_data()
738 sp->v.truesize = sp->v.size; in load_data()
743 if (sp->v.size > 0) { in load_data()
745 rc = sflist->callback.sample_new in load_data()
746 (sflist->callback.private_data, sp, sflist->memhdr, in load_data()
747 data + off, count - off); in load_data()
752 sflist->mem_used += sp->v.truesize; in load_data()
786 * offset = base offset (:= log2(base) * 0x10000)
791 snd_sf_linear_to_log(unsigned int amount, int offset, int ratio) in snd_sf_linear_to_log() argument
803 v = (log_tbl[s + 1] * low + log_tbl[s] * (0x100 - low)) >> 8; in snd_sf_linear_to_log()
804 v -= offset; in snd_sf_linear_to_log()
806 v += (24 - bit) * ratio; in snd_sf_linear_to_log()
831 /* convert Hz to AWE32 rate offset:
832 * sample pitch offset for the specified sample rate
833 * rate=44100 is no offset, each 4096 is 1 octave (twice).
834 * eg, when rate is 22050, this offset becomes -4096.
836 * conversion: offset = log2(Hz / 44100) * 4096
850 r = (3 - ((rate >> 6) & 3)) * 3; in calc_gus_envelope_time()
854 t = end - start; in calc_gus_envelope_time()
855 if (t < 0) t = -t; in calc_gus_envelope_time()
857 t = t << (13 - r); in calc_gus_envelope_time()
859 t = t >> (r - 13); in calc_gus_envelope_time()
888 /* delay time = 0x8000 - msec/92 */
892 int val = (0x7f * 92 - msec) / 92; in snd_sf_calc_parm_hold()
939 #define calc_gus_sustain(val) (0x7f - snd_sf_vol_table[(val)/2])
950 struct snd_sf_sample *smp; in load_guspatch() local
956 return -EINVAL; in load_guspatch()
959 return -EFAULT; in load_guspatch()
961 count -= sizeof(patch); in load_guspatch()
966 return -ENOMEM; in load_guspatch()
967 smp = sf_sample_new(sflist, sf); in load_guspatch()
968 if (!smp) in load_guspatch()
969 return -ENOMEM; in load_guspatch()
970 sample_id = sflist->sample_counter; in load_guspatch()
971 smp->v.sample = sample_id; in load_guspatch()
972 smp->v.start = 0; in load_guspatch()
973 smp->v.end = patch.len; in load_guspatch()
974 smp->v.loopstart = patch.loop_start; in load_guspatch()
975 smp->v.loopend = patch.loop_end; in load_guspatch()
976 smp->v.size = patch.len; in load_guspatch()
979 smp->v.mode_flags = 0; in load_guspatch()
981 smp->v.mode_flags |= SNDRV_SFNT_SAMPLE_8BITS; in load_guspatch()
983 smp->v.mode_flags |= SNDRV_SFNT_SAMPLE_UNSIGNED; in load_guspatch()
984 smp->v.mode_flags |= SNDRV_SFNT_SAMPLE_NO_BLANK; in load_guspatch()
986 smp->v.mode_flags |= SNDRV_SFNT_SAMPLE_SINGLESHOT; in load_guspatch()
988 smp->v.mode_flags |= SNDRV_SFNT_SAMPLE_BIDIR_LOOP; in load_guspatch()
990 smp->v.mode_flags |= SNDRV_SFNT_SAMPLE_REVERSE_LOOP; in load_guspatch()
994 smp->v.size /= 2; in load_guspatch()
995 smp->v.end /= 2; in load_guspatch()
996 smp->v.loopstart /= 2; in load_guspatch()
997 smp->v.loopend /= 2; in load_guspatch()
999 /*smp->v.loopend++;*/ in load_guspatch()
1001 smp->v.dummy = 0; in load_guspatch()
1002 smp->v.truesize = 0; in load_guspatch()
1003 smp->v.sf_id = sf->id; in load_guspatch()
1008 sf_sample_delete(sflist, sf, smp); in load_guspatch()
1009 return -ENOMEM; in load_guspatch()
1015 if (sflist->callback.sample_new) { in load_guspatch()
1016 rc = sflist->callback.sample_new in load_guspatch()
1017 (sflist->callback.private_data, smp, sflist->memhdr, in load_guspatch()
1020 sf_sample_delete(sflist, sf, smp); in load_guspatch()
1024 /* memory offset is updated after */ in load_guspatch()
1027 /* update the memory offset here */ in load_guspatch()
1028 sflist->mem_used += smp->v.truesize; in load_guspatch()
1030 zone->v.sample = sample_id; /* the last sample */ in load_guspatch()
1031 zone->v.rate_offset = calc_rate_offset(patch.base_freq); in load_guspatch()
1033 zone->v.root = note / 100; in load_guspatch()
1034 zone->v.tune = -(note % 100); in load_guspatch()
1035 zone->v.low = (freq_to_note(patch.low_note) + 99) / 100; in load_guspatch()
1036 zone->v.high = freq_to_note(patch.high_note) / 100; in load_guspatch()
1037 /* panning position; -128 - 127 => 0-127 */ in load_guspatch()
1038 zone->v.pan = (patch.panning + 128) / 2; in load_guspatch()
1041 "gus: basefrq=%d (ofs=%d) root=%d,tune=%d, range:%d-%d\n", in load_guspatch()
1042 (int)patch.base_freq, zone->v.rate_offset, in load_guspatch()
1043 zone->v.root, zone->v.tune, zone->v.low, zone->v.high); in load_guspatch()
1067 zone->v.parm.volatkhld = in load_guspatch()
1070 zone->v.parm.voldcysus = (calc_gus_sustain(patch.env_offset[2]) << 8) | in load_guspatch()
1072 zone->v.parm.volrelease = 0x8000 | snd_sf_calc_parm_decay(release); in load_guspatch()
1073 zone->v.attenuation = calc_gus_attenuation(patch.env_offset[0]); in load_guspatch()
1077 zone->v.parm.volatkhld, in load_guspatch()
1078 zone->v.parm.voldcysus, in load_guspatch()
1079 zone->v.parm.volrelease, in load_guspatch()
1080 zone->v.attenuation); in load_guspatch()
1086 zone->v.parm.volrelease = 0x807f; in load_guspatch()
1092 zone->v.parm.tremfrq = ((patch.tremolo_depth / 2) << 8) | rate; in load_guspatch()
1097 zone->v.parm.fm2frq2 = ((patch.vibrato_depth / 6) << 8) | rate; in load_guspatch()
1102 if (!(smp->v.mode_flags & SNDRV_SFNT_SAMPLE_SINGLESHOT)) in load_guspatch()
1103 zone->v.mode = SNDRV_SFNT_MODE_LOOPING; in load_guspatch()
1105 zone->v.mode = 0; in load_guspatch()
1108 /*zone->bank = ctrls[AWE_MD_GUS_BANK];*/ in load_guspatch()
1109 zone->bank = 0; in load_guspatch()
1110 zone->instr = patch.instr_no; in load_guspatch()
1111 zone->mapped = 0; in load_guspatch()
1112 zone->v.sf_id = sf->id; in load_guspatch()
1114 zone->sample = set_sample(sf, &zone->v); in load_guspatch()
1149 memset(sflist->presets, 0, sizeof(sflist->presets)); in rebuild_presets()
1152 for (sf = sflist->fonts; sf; sf = sf->next) { in rebuild_presets()
1153 for (cur = sf->zones; cur; cur = cur->next) { in rebuild_presets()
1154 if (! cur->mapped && cur->sample == NULL) { in rebuild_presets()
1156 cur->sample = set_sample(sf, &cur->v); in rebuild_presets()
1157 if (cur->sample == NULL) in rebuild_presets()
1176 zone = search_first_zone(sflist, cur->bank, cur->instr, cur->v.low); in add_preset()
1177 if (zone && zone->v.sf_id != cur->v.sf_id) { in add_preset()
1181 for (p = zone; p; p = p->next_zone) { in add_preset()
1182 if (p->counter > cur->counter) in add_preset()
1192 index = get_index(cur->bank, cur->instr, cur->v.low); in add_preset()
1195 cur->next_zone = zone; /* zone link */ in add_preset()
1196 cur->next_instr = sflist->presets[index]; /* preset table link */ in add_preset()
1197 sflist->presets[index] = cur; in add_preset()
1209 index = get_index(zp->bank, zp->instr, zp->v.low); in delete_preset()
1212 for (p = sflist->presets[index]; p; p = p->next_instr) { in delete_preset()
1213 while (p->next_instr == zp) { in delete_preset()
1214 p->next_instr = zp->next_instr; in delete_preset()
1215 zp = zp->next_zone; in delete_preset()
1243 spin_lock_irqsave(&sflist->lock, flags); in snd_soundfont_search_zone()
1244 if (sflist->presets_locked) { in snd_soundfont_search_zone()
1245 spin_unlock_irqrestore(&sflist->lock, flags); in snd_soundfont_search_zone()
1256 spin_unlock_irqrestore(&sflist->lock, flags); in snd_soundfont_search_zone()
1273 for (zp = sflist->presets[index]; zp; zp = zp->next_instr) { in search_first_zone()
1274 if (zp->instr == preset && zp->bank == bank) in search_first_zone()
1294 for (; zp; zp = zp->next_zone) { in search_zones()
1295 if (*notep >= zp->v.low && *notep <= zp->v.high && in search_zones()
1296 vel >= zp->v.vellow && vel <= zp->v.velhigh) { in search_zones()
1297 if (zp->mapped) { in search_zones()
1299 int key = zp->v.fixkey; in search_zones()
1300 preset = zp->v.start; in search_zones()
1301 bank = zp->v.end; in search_zones()
1327 * if the index is out of range, return -1.
1339 return -1; in get_index()
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()
1372 for (sf = sflist->fonts; sf; sf = nextsf) { in snd_sf_clear()
1373 nextsf = sf->next; in snd_sf_clear()
1374 for (zp = sf->zones; zp; zp = nextzp) { in snd_sf_clear()
1375 nextzp = zp->next; in snd_sf_clear()
1378 for (sp = sf->samples; sp; sp = nextsp) { in snd_sf_clear()
1379 nextsp = sp->next; 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()
1404 mutex_init(&sflist->presets_mutex); in snd_sf_new()
1405 spin_lock_init(&sflist->lock); in snd_sf_new()
1406 sflist->memhdr = hdr; in snd_sf_new()
1409 sflist->callback = *callback; in snd_sf_new()
1426 if (sflist->callback.sample_reset) in snd_sf_free()
1427 sflist->callback.sample_reset(sflist->callback.private_data); in snd_sf_free()
1442 if (sflist->callback.sample_reset) in snd_soundfont_remove_samples()
1443 sflist->callback.sample_reset(sflist->callback.private_data); in snd_soundfont_remove_samples()
1463 if (sflist->callback.sample_reset) in snd_soundfont_remove_unlocked()
1464 sflist->callback.sample_reset(sflist->callback.private_data); in snd_soundfont_remove_unlocked()
1467 memset(sflist->presets, 0, sizeof(sflist->presets)); in snd_soundfont_remove_unlocked()
1469 for (sf = sflist->fonts; sf; sf = sf->next) { in snd_soundfont_remove_unlocked()
1470 for (zp = sf->zones; zp; zp = nextzp) { in snd_soundfont_remove_unlocked()
1471 if (zp->counter < sflist->zone_locked) in snd_soundfont_remove_unlocked()
1473 nextzp = zp->next; in snd_soundfont_remove_unlocked()
1474 sf->zones = nextzp; in snd_soundfont_remove_unlocked()
1478 for (sp = sf->samples; sp; sp = nextsp) { in snd_soundfont_remove_unlocked()
1479 if (sp->counter < sflist->sample_locked) in snd_soundfont_remove_unlocked()
1481 nextsp = sp->next; in snd_soundfont_remove_unlocked()
1482 sf->samples = nextsp; in snd_soundfont_remove_unlocked()
1483 sflist->mem_used -= sp->v.truesize; in snd_soundfont_remove_unlocked()
1484 if (sflist->callback.sample_free) in snd_soundfont_remove_unlocked()
1485 sflist->callback.sample_free(sflist->callback.private_data, in snd_soundfont_remove_unlocked()
1486 sp, sflist->memhdr); in snd_soundfont_remove_unlocked()
1491 sflist->zone_counter = sflist->zone_locked; in snd_soundfont_remove_unlocked()
1492 sflist->sample_counter = sflist->sample_locked; in snd_soundfont_remove_unlocked()