Lines Matching +full:smp +full:- +full:offset
7 * Copyright (c) 1999-2000 Takashi Iwai <tiwai@suse.de>
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
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()
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()
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()
115 spin_unlock_irqrestore(&sflist->lock, flags); in snd_soundfont_close_check()
138 return -EINVAL; in snd_soundfont_load()
141 return -EFAULT; in snd_soundfont_load()
143 count -= sizeof(patch); in snd_soundfont_load()
148 return -EINVAL; in snd_soundfont_load()
153 return -EINVAL; in snd_soundfont_load()
157 return -EINVAL; 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()
172 return -EBUSY; in snd_soundfont_load()
174 spin_unlock_irqrestore(&sflist->lock, flags); in snd_soundfont_load()
177 rc = -EINVAL; in snd_soundfont_load()
199 if (!sflist->currsf) { in snd_soundfont_load()
202 rc = -EINVAL; in snd_soundfont_load()
207 if (! remove_info(sflist, sflist->currsf, bank, instr)) in snd_soundfont_load()
208 rc = -EINVAL; in snd_soundfont_load()
220 /* check if specified type is special font (GUS or preset-alias) */
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()
242 return -EBUSY; in open_patch()
244 spin_unlock_irqrestore(&sflist->lock, flags); in open_patch()
247 return -EFAULT; in open_patch()
255 return -ENOMEM; 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()
276 for (sf = sflist->fonts; sf; sf = sf->next) { in newsf()
283 /* not found -- create a new one */ 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()
294 sf->type = type; in newsf()
295 sf->zones = NULL; in newsf()
296 sf->samples = NULL; in newsf()
298 memcpy(sf->name, name, SNDRV_SFNT_PATCH_NAME_LEN); in newsf()
307 return ((sf->type & SNDRV_SFNT_PAT_SHARED) && in is_identical_font()
308 (sf->type & 0x0f) == (type & 0x0f) && in is_identical_font()
310 memcmp(sf->name, name, SNDRV_SFNT_PATCH_NAME_LEN) == 0)); in is_identical_font()
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()
332 /* probe sample in the current list -- nothing to be loaded */
337 if (sflist->currsf) { in probe_data()
339 if (find_sample(sflist->currsf, sample_id)) in probe_data()
342 return -EINVAL; in probe_data()
352 zp->counter = sflist->zone_counter++; in set_zone_counter()
353 if (sf->type & SNDRV_SFNT_PAT_LOCKED) in set_zone_counter()
354 sflist->zone_locked = sflist->zone_counter; in set_zone_counter()
367 zp->next = sf->zones; in sf_zone_new()
368 sf->zones = zp; in sf_zone_new()
370 init_voice_info(&zp->v); in sf_zone_new()
384 sp->counter = sflist->sample_counter++; in set_sample_counter()
385 if (sf->type & SNDRV_SFNT_PAT_LOCKED) in set_sample_counter()
386 sflist->sample_locked = sflist->sample_counter; in set_sample_counter()
400 sp->next = sf->samples; in sf_sample_new()
401 sf->samples = sp; in sf_sample_new()
408 * delete sample list -- this is an exceptional job.
416 if (sp == sf->samples) { in sf_sample_delete()
417 sf->samples = sp->next; in sf_sample_delete()
433 return -EINVAL; in load_map()
435 return -EFAULT; in load_map()
438 return -EINVAL; in load_map()
442 return -ENOMEM; in load_map()
445 for (zp = sf->zones; zp; prevp = zp, zp = zp->next) { in load_map()
446 if (zp->mapped && in load_map()
447 zp->instr == map.map_instr && in load_map()
448 zp->bank == map.map_bank && in load_map()
449 zp->v.low == map.map_key && in load_map()
450 zp->v.start == map.src_instr && in load_map()
451 zp->v.end == map.src_bank && in load_map()
452 zp->v.fixkey == map.src_key) { in load_map()
456 prevp->next = zp->next; in load_map()
457 zp->next = sf->zones; in load_map()
458 sf->zones = zp; in load_map()
468 return -ENOMEM; in load_map()
470 zp->bank = map.map_bank; in load_map()
471 zp->instr = map.map_instr; in load_map()
472 zp->mapped = 1; in load_map()
474 zp->v.low = map.map_key; in load_map()
475 zp->v.high = map.map_key; in load_map()
477 zp->v.start = map.src_instr; in load_map()
478 zp->v.end = map.src_bank; in load_map()
479 zp->v.fixkey = map.src_key; in load_map()
480 zp->v.sf_id = sf->id; in load_map()
497 for (p = sf->zones; p; p = next) { in remove_info()
498 next = p->next; in remove_info()
499 if (! p->mapped && in remove_info()
500 p->bank == bank && p->instr == instr) { in remove_info()
503 prev->next = next; in remove_info()
505 sf->zones = next; in remove_info()
530 if ((sf = sflist->currsf) == NULL) in load_info()
531 return -EINVAL; in load_info()
533 if (is_special_type(sf->type)) in load_info()
534 return -EINVAL; in load_info()
538 return -EINVAL; in load_info()
541 return -EFAULT; in load_info()
544 count -= sizeof(hdr); in load_info()
549 return -EINVAL; in load_info()
556 return -EINVAL; in load_info()
561 /* exclusive mode - if the instrument already exists, in load_info()
563 for (zone = sf->zones; zone; zone = zone->next) { in load_info()
564 if (!zone->mapped && in load_info()
565 zone->bank == hdr.bank && in load_info()
566 zone->instr == hdr.instr) in load_info()
567 return -EINVAL; in load_info()
571 /* replace mode - remove the instrument if it already exists */ in load_info()
581 return -EFAULT; in load_info()
585 count -= sizeof(tmpzone.v); in load_info()
590 tmpzone.v.sf_id = sf->id; in load_info()
596 return -ENOMEM; in load_info()
600 zone->bank = tmpzone.bank; in load_info()
601 zone->instr = tmpzone.instr; in load_info()
602 zone->v = tmpzone.v; in load_info()
605 zone->sample = set_sample(sf, &zone->v); in load_info()
618 avp->root = 60; in init_voice_info()
619 avp->high = 127; in init_voice_info()
620 avp->velhigh = 127; in init_voice_info()
621 avp->fixkey = -1; in init_voice_info()
622 avp->fixvel = -1; in init_voice_info()
623 avp->fixpan = -1; in init_voice_info()
624 avp->pan = -1; in init_voice_info()
625 avp->amplitude = 127; in init_voice_info()
626 avp->scaleTuning = 100; in init_voice_info()
628 init_voice_parm(&avp->parm); in init_voice_info()
642 pp->moddelay = 0x8000; in init_voice_parm()
643 pp->modatkhld = 0x7f7f; in init_voice_parm()
644 pp->moddcysus = 0x7f7f; in init_voice_parm()
645 pp->modrelease = 0x807f; in init_voice_parm()
647 pp->voldelay = 0x8000; in init_voice_parm()
648 pp->volatkhld = 0x7f7f; in init_voice_parm()
649 pp->voldcysus = 0x7f7f; in init_voice_parm()
650 pp->volrelease = 0x807f; in init_voice_parm()
652 pp->lfo1delay = 0x8000; in init_voice_parm()
653 pp->lfo2delay = 0x8000; in init_voice_parm()
655 pp->cutoff = 0xff; in init_voice_parm()
664 sample = find_sample(sf, avp->sample); in set_sample()
669 * The voice_info addresses define only the relative offset in set_sample()
671 * offset from sample pointers. in set_sample()
673 avp->start += sample->v.start; in set_sample()
674 avp->end += sample->v.end; in set_sample()
675 avp->loopstart += sample->v.loopstart; in set_sample()
676 avp->loopend += sample->v.loopend; in set_sample()
679 avp->sample_mode = sample->v.mode_flags; in set_sample()
693 for (p = sf->samples; p; p = p->next) { in find_sample()
694 if (p->v.sample == sample_id) in find_sample()
716 if ((sf = sflist->currsf) == NULL) in load_data()
717 return -EINVAL; in load_data()
719 if (is_special_type(sf->type)) in load_data()
720 return -EINVAL; in load_data()
723 return -EFAULT; in load_data()
727 if (sample_info.size != (count-off)/2) in load_data()
728 return -EINVAL; in load_data()
733 if (sf->type & SNDRV_SFNT_PAT_SHARED) in load_data()
735 return -EINVAL; in load_data()
740 return -ENOMEM; in load_data()
742 sp->v = sample_info; in load_data()
743 sp->v.sf_id = sf->id; in load_data()
744 sp->v.dummy = 0; in load_data()
745 sp->v.truesize = sp->v.size; in load_data()
750 if (sp->v.size > 0) { in load_data()
752 rc = sflist->callback.sample_new in load_data()
753 (sflist->callback.private_data, sp, sflist->memhdr, in load_data()
754 data + off, count - off); in load_data()
759 sflist->mem_used += sp->v.truesize; in load_data()
793 * offset = base offset (:= log2(base) * 0x10000)
798 snd_sf_linear_to_log(unsigned int amount, int offset, int ratio) in snd_sf_linear_to_log() argument
810 v = (log_tbl[s + 1] * low + log_tbl[s] * (0x100 - low)) >> 8; in snd_sf_linear_to_log()
811 v -= offset; in snd_sf_linear_to_log()
813 v += (24 - bit) * ratio; in snd_sf_linear_to_log()
838 /* convert Hz to AWE32 rate offset:
839 * sample pitch offset for the specified sample rate
840 * rate=44100 is no offset, each 4096 is 1 octave (twice).
841 * eg, when rate is 22050, this offset becomes -4096.
843 * conversion: offset = log2(Hz / 44100) * 4096
857 r = (3 - ((rate >> 6) & 3)) * 3; in calc_gus_envelope_time()
859 t = end - start; in calc_gus_envelope_time()
860 if (t < 0) t = -t; in calc_gus_envelope_time()
862 t = t << (13 - r); in calc_gus_envelope_time()
864 t = t >> (r - 13); in calc_gus_envelope_time()
893 /* delay time = 0x8000 - msec/92 */
897 int val = (0x7f * 92 - msec) / 92; in snd_sf_calc_parm_hold()
944 #define calc_gus_sustain(val) (0x7f - snd_sf_vol_table[(val)/2])
955 struct snd_sf_sample *smp; in load_guspatch() local
961 return -EINVAL; in load_guspatch()
964 return -EFAULT; in load_guspatch()
966 count -= sizeof(patch); in load_guspatch()
971 return -ENOMEM; in load_guspatch()
972 if ((smp = sf_sample_new(sflist, sf)) == NULL) in load_guspatch()
973 return -ENOMEM; in load_guspatch()
974 sample_id = sflist->sample_counter; in load_guspatch()
975 smp->v.sample = sample_id; in load_guspatch()
976 smp->v.start = 0; in load_guspatch()
977 smp->v.end = patch.len; in load_guspatch()
978 smp->v.loopstart = patch.loop_start; in load_guspatch()
979 smp->v.loopend = patch.loop_end; in load_guspatch()
980 smp->v.size = patch.len; in load_guspatch()
983 smp->v.mode_flags = 0; in load_guspatch()
985 smp->v.mode_flags |= SNDRV_SFNT_SAMPLE_8BITS; in load_guspatch()
987 smp->v.mode_flags |= SNDRV_SFNT_SAMPLE_UNSIGNED; in load_guspatch()
988 smp->v.mode_flags |= SNDRV_SFNT_SAMPLE_NO_BLANK; in load_guspatch()
990 smp->v.mode_flags |= SNDRV_SFNT_SAMPLE_SINGLESHOT; in load_guspatch()
992 smp->v.mode_flags |= SNDRV_SFNT_SAMPLE_BIDIR_LOOP; in load_guspatch()
994 smp->v.mode_flags |= SNDRV_SFNT_SAMPLE_REVERSE_LOOP; in load_guspatch()
998 smp->v.size /= 2; in load_guspatch()
999 smp->v.end /= 2; in load_guspatch()
1000 smp->v.loopstart /= 2; in load_guspatch()
1001 smp->v.loopend /= 2; in load_guspatch()
1003 /*smp->v.loopend++;*/ in load_guspatch()
1005 smp->v.dummy = 0; in load_guspatch()
1006 smp->v.truesize = 0; in load_guspatch()
1007 smp->v.sf_id = sf->id; in load_guspatch()
1011 sf_sample_delete(sflist, sf, smp); in load_guspatch()
1012 return -ENOMEM; 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()
1027 /* memory offset is updated after */ in load_guspatch()
1030 /* update the memory offset here */ in load_guspatch()
1031 sflist->mem_used += smp->v.truesize; in load_guspatch()
1033 zone->v.sample = sample_id; /* the last sample */ in load_guspatch()
1034 zone->v.rate_offset = calc_rate_offset(patch.base_freq); in load_guspatch()
1036 zone->v.root = note / 100; in load_guspatch()
1037 zone->v.tune = -(note % 100); in load_guspatch()
1038 zone->v.low = (freq_to_note(patch.low_note) + 99) / 100; in load_guspatch()
1039 zone->v.high = freq_to_note(patch.high_note) / 100; in load_guspatch()
1040 /* panning position; -128 - 127 => 0-127 */ in load_guspatch()
1041 zone->v.pan = (patch.panning + 128) / 2; in load_guspatch()
1044 "gus: basefrq=%d (ofs=%d) root=%d,tune=%d, range:%d-%d\n", in load_guspatch()
1045 (int)patch.base_freq, zone->v.rate_offset, in load_guspatch()
1046 zone->v.root, zone->v.tune, zone->v.low, zone->v.high); in load_guspatch()
1070 zone->v.parm.volatkhld = in load_guspatch()
1073 zone->v.parm.voldcysus = (calc_gus_sustain(patch.env_offset[2]) << 8) | in load_guspatch()
1075 zone->v.parm.volrelease = 0x8000 | snd_sf_calc_parm_decay(release); in load_guspatch()
1076 zone->v.attenuation = calc_gus_attenuation(patch.env_offset[0]); in load_guspatch()
1080 zone->v.parm.volatkhld, in load_guspatch()
1081 zone->v.parm.voldcysus, in load_guspatch()
1082 zone->v.parm.volrelease, in load_guspatch()
1083 zone->v.attenuation); in load_guspatch()
1089 zone->v.parm.volrelease = 0x807f; in load_guspatch()
1095 zone->v.parm.tremfrq = ((patch.tremolo_depth / 2) << 8) | rate; in load_guspatch()
1100 zone->v.parm.fm2frq2 = ((patch.vibrato_depth / 6) << 8) | rate; in load_guspatch()
1105 if (!(smp->v.mode_flags & SNDRV_SFNT_SAMPLE_SINGLESHOT)) in load_guspatch()
1106 zone->v.mode = SNDRV_SFNT_MODE_LOOPING; in load_guspatch()
1108 zone->v.mode = 0; in load_guspatch()
1111 /*zone->bank = ctrls[AWE_MD_GUS_BANK];*/ in load_guspatch()
1112 zone->bank = 0; in load_guspatch()
1113 zone->instr = patch.instr_no; in load_guspatch()
1114 zone->mapped = 0; in load_guspatch()
1115 zone->v.sf_id = sf->id; in load_guspatch()
1117 zone->sample = set_sample(sf, &zone->v); in load_guspatch()
1152 memset(sflist->presets, 0, sizeof(sflist->presets)); in rebuild_presets()
1155 for (sf = sflist->fonts; sf; sf = sf->next) { in rebuild_presets()
1156 for (cur = sf->zones; cur; cur = cur->next) { in rebuild_presets()
1157 if (! cur->mapped && cur->sample == NULL) { in rebuild_presets()
1159 cur->sample = set_sample(sf, &cur->v); in rebuild_presets()
1160 if (cur->sample == NULL) in rebuild_presets()
1179 zone = search_first_zone(sflist, cur->bank, cur->instr, cur->v.low); in add_preset()
1180 if (zone && zone->v.sf_id != cur->v.sf_id) { in add_preset()
1184 for (p = zone; p; p = p->next_zone) { in add_preset()
1185 if (p->counter > cur->counter) in add_preset()
1195 if ((index = get_index(cur->bank, cur->instr, cur->v.low)) < 0) in add_preset()
1197 cur->next_zone = zone; /* zone link */ in add_preset()
1198 cur->next_instr = sflist->presets[index]; /* preset table link */ in add_preset()
1199 sflist->presets[index] = cur; in add_preset()
1211 if ((index = get_index(zp->bank, zp->instr, zp->v.low)) < 0) in delete_preset()
1213 for (p = sflist->presets[index]; p; p = p->next_instr) { in delete_preset()
1214 while (p->next_instr == zp) { in delete_preset()
1215 p->next_instr = zp->next_instr; in delete_preset()
1216 zp = zp->next_zone; in delete_preset()
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()
1257 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()
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()
1425 if (sflist->callback.sample_reset) in snd_sf_free()
1426 sflist->callback.sample_reset(sflist->callback.private_data); in snd_sf_free()
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()
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()
1469 for (zp = sf->zones; zp; zp = nextzp) { in snd_soundfont_remove_unlocked()
1470 if (zp->counter < sflist->zone_locked) in snd_soundfont_remove_unlocked()
1472 nextzp = zp->next; in snd_soundfont_remove_unlocked()
1473 sf->zones = nextzp; in snd_soundfont_remove_unlocked()
1477 for (sp = sf->samples; sp; sp = nextsp) { in snd_soundfont_remove_unlocked()
1478 if (sp->counter < sflist->sample_locked) in snd_soundfont_remove_unlocked()
1480 nextsp = sp->next; in snd_soundfont_remove_unlocked()
1481 sf->samples = nextsp; 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()