awe_wave.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:154k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. printk(KERN_ERR "AWE32: failed to alloc new listn");
  2. return NULL;
  3. }
  4. patch_opened = TRUE;
  5. return sftail;
  6. }
  7. return sftail;
  8. }
  9. /* close the patch; if no voice is loaded, remove the patch */
  10. static int
  11. awe_close_patch(awe_patch_info *patch, const char *addr, int count)
  12. {
  13. if (patch_opened && sftail) {
  14. /* if no voice is loaded, release the current patch */
  15. if (sftail->infos == NULL) {
  16. awe_reset(0);
  17. awe_remove_samples(current_sf_id - 1);
  18. }
  19. }
  20. patch_opened = 0;
  21. return 0;
  22. }
  23. /* remove the latest patch */
  24. static int
  25. awe_unload_patch(awe_patch_info *patch, const char *addr, int count)
  26. {
  27. if (current_sf_id > 0 && current_sf_id > locked_sf_id) {
  28. awe_reset(0);
  29. awe_remove_samples(current_sf_id - 1);
  30. }
  31. return 0;
  32. }
  33. /* allocate voice info list records */
  34. static awe_voice_list *
  35. alloc_new_info(void)
  36. {
  37. awe_voice_list *newlist;
  38. newlist = (awe_voice_list *)kmalloc(sizeof(*newlist), GFP_KERNEL);
  39. if (newlist == NULL) {
  40. printk(KERN_ERR "AWE32: can't alloc info tablen");
  41. return NULL;
  42. }
  43. return newlist;
  44. }
  45. /* allocate sample info list records */
  46. static awe_sample_list *
  47. alloc_new_sample(void)
  48. {
  49. awe_sample_list *newlist;
  50. newlist = (awe_sample_list *)kmalloc(sizeof(*newlist), GFP_KERNEL);
  51. if (newlist == NULL) {
  52. printk(KERN_ERR "AWE32: can't alloc sample tablen");
  53. return NULL;
  54. }
  55. return newlist;
  56. }
  57. /* load voice map */
  58. static int
  59. awe_load_map(awe_patch_info *patch, const char *addr, int count)
  60. {
  61. awe_voice_map map;
  62. awe_voice_list *rec, *p;
  63. sf_list *sf;
  64. /* get the link info */
  65. if (count < sizeof(map)) {
  66. printk(KERN_WARNING "AWE32 Error: invalid patch info lengthn");
  67. return -EINVAL;
  68. }
  69. if (copy_from_user(&map, addr + AWE_PATCH_INFO_SIZE, sizeof(map)))
  70. return -EFAULT;
  71. /* check if the identical mapping already exists */
  72. p = awe_search_instr(map.map_bank, map.map_instr, map.map_key);
  73. for (; p; p = p->next_instr) {
  74. if (p->type == V_ST_MAPPED &&
  75.     p->v.start == map.src_instr &&
  76.     p->v.end == map.src_bank &&
  77.     p->v.fixkey == map.src_key)
  78. return 0; /* already present! */
  79. }
  80. if ((sf = check_patch_opened(AWE_PAT_TYPE_MAP, NULL)) == NULL)
  81. return -ENOMEM;
  82. if ((rec = alloc_new_info()) == NULL)
  83. return -ENOMEM;
  84. rec->bank = map.map_bank;
  85. rec->instr = map.map_instr;
  86. rec->type = V_ST_MAPPED;
  87. rec->disabled = FALSE;
  88. awe_init_voice_info(&rec->v);
  89. if (map.map_key >= 0) {
  90. rec->v.low = map.map_key;
  91. rec->v.high = map.map_key;
  92. }
  93. rec->v.start = map.src_instr;
  94. rec->v.end = map.src_bank;
  95. rec->v.fixkey = map.src_key;
  96. add_sf_info(sf, rec);
  97. add_info_list(rec);
  98. return 0;
  99. }
  100. #if 0
  101. /* probe preset in the current list -- nothing to be loaded */
  102. static int
  103. awe_probe_info(awe_patch_info *patch, const char *addr, int count)
  104. {
  105. #ifdef AWE_ALLOW_SAMPLE_SHARING
  106. awe_voice_map map;
  107. awe_voice_list *p;
  108. if (! patch_opened)
  109. return -EINVAL;
  110. /* get the link info */
  111. if (count < sizeof(map)) {
  112. printk(KERN_WARNING "AWE32 Error: invalid patch info lengthn");
  113. return -EINVAL;
  114. }
  115. if (copy_from_user(&map, addr + AWE_PATCH_INFO_SIZE, sizeof(map)))
  116. return -EFAULT;
  117. /* check if the identical mapping already exists */
  118. if (sftail == NULL)
  119. return -EINVAL;
  120. p = awe_search_instr(map.src_bank, map.src_instr, map.src_key);
  121. for (; p; p = p->next_instr) {
  122. if (p->type == V_ST_NORMAL &&
  123.     is_identical_holder(p->holder, sftail) &&
  124.     p->v.low <= map.src_key &&
  125.     p->v.high >= map.src_key)
  126. return 0; /* already present! */
  127. }
  128. #endif /* allow sharing */
  129. return -EINVAL;
  130. }
  131. #endif
  132. /* probe sample in the current list -- nothing to be loaded */
  133. static int
  134. awe_probe_data(awe_patch_info *patch, const char *addr, int count)
  135. {
  136. #ifdef AWE_ALLOW_SAMPLE_SHARING
  137. if (! patch_opened)
  138. return -EINVAL;
  139. /* search the specified sample by optarg */
  140. if (search_sample_index(sftail, patch->optarg) != NULL)
  141. return 0;
  142. #endif /* allow sharing */
  143. return -EINVAL;
  144. }
  145. /* remove the present instrument layers */
  146. static int
  147. remove_info(sf_list *sf, int bank, int instr)
  148. {
  149. awe_voice_list *prev, *next, *p;
  150. int removed = 0;
  151. prev = NULL;
  152. for (p = sf->infos; p; p = next) {
  153. next = p->next;
  154. if (p->type == V_ST_NORMAL &&
  155.     p->bank == bank && p->instr == instr) {
  156. /* remove this layer */
  157. if (prev)
  158. prev->next = next;
  159. else
  160. sf->infos = next;
  161. if (p == sf->last_infos)
  162. sf->last_infos = prev;
  163. sf->num_info--;
  164. removed++;
  165. kfree(p);
  166. } else
  167. prev = p;
  168. }
  169. if (removed)
  170. rebuild_preset_list();
  171. return removed;
  172. }
  173. /* load voice information data */
  174. static int
  175. awe_load_info(awe_patch_info *patch, const char *addr, int count)
  176. {
  177. int offset;
  178. awe_voice_rec_hdr hdr;
  179. int i;
  180. int total_size;
  181. sf_list *sf;
  182. awe_voice_list *rec;
  183. if (count < AWE_VOICE_REC_SIZE) {
  184. printk(KERN_WARNING "AWE32 Error: invalid patch info lengthn");
  185. return -EINVAL;
  186. }
  187. offset = AWE_PATCH_INFO_SIZE;
  188. if (copy_from_user((char*)&hdr, addr + offset, AWE_VOICE_REC_SIZE))
  189. return -EFAULT;
  190. offset += AWE_VOICE_REC_SIZE;
  191. if (hdr.nvoices <= 0 || hdr.nvoices >= 100) {
  192. printk(KERN_WARNING "AWE32 Error: Invalid voice number %dn", hdr.nvoices);
  193. return -EINVAL;
  194. }
  195. total_size = AWE_VOICE_REC_SIZE + AWE_VOICE_INFO_SIZE * hdr.nvoices;
  196. if (count < total_size) {
  197. printk(KERN_WARNING "AWE32 Error: patch length(%d) is smaller than nvoices(%d)n",
  198.        count, hdr.nvoices);
  199. return -EINVAL;
  200. }
  201. if ((sf = check_patch_opened(AWE_PAT_TYPE_MISC, NULL)) == NULL)
  202. return -ENOMEM;
  203. switch (hdr.write_mode) {
  204. case AWE_WR_EXCLUSIVE:
  205. /* exclusive mode - if the instrument already exists,
  206.    return error */
  207. for (rec = sf->infos; rec; rec = rec->next) {
  208. if (rec->type == V_ST_NORMAL &&
  209.     rec->bank == hdr.bank &&
  210.     rec->instr == hdr.instr)
  211. return -EINVAL;
  212. }
  213. break;
  214. case AWE_WR_REPLACE:
  215. /* replace mode - remove the instrument if it already exists */
  216. remove_info(sf, hdr.bank, hdr.instr);
  217. break;
  218. }
  219. /* append new layers */
  220. for (i = 0; i < hdr.nvoices; i++) {
  221. rec = alloc_new_info();
  222. if (rec == NULL)
  223. return -ENOMEM;
  224. rec->bank = hdr.bank;
  225. rec->instr = hdr.instr;
  226. rec->type = V_ST_NORMAL;
  227. rec->disabled = FALSE;
  228. /* copy awe_voice_info parameters */
  229. if (copy_from_user(&rec->v, addr + offset, AWE_VOICE_INFO_SIZE)) {
  230. kfree(rec);
  231. return -EFAULT;
  232. }
  233. offset += AWE_VOICE_INFO_SIZE;
  234. #ifdef AWE_ALLOW_SAMPLE_SHARING
  235. if (sf && sf->shared) {
  236. if (info_duplicated(sf, rec)) {
  237. kfree(rec);
  238. continue;
  239. }
  240. }
  241. #endif /* allow sharing */
  242. if (rec->v.mode & AWE_MODE_INIT_PARM)
  243. awe_init_voice_parm(&rec->v.parm);
  244. add_sf_info(sf, rec);
  245. awe_set_sample(rec);
  246. add_info_list(rec);
  247. }
  248. return 0;
  249. }
  250. /* remove instrument layers */
  251. static int
  252. awe_remove_info(awe_patch_info *patch, const char *addr, int count)
  253. {
  254. unsigned char bank, instr;
  255. sf_list *sf;
  256. if (! patch_opened || (sf = sftail) == NULL) {
  257. printk(KERN_WARNING "AWE32: remove_info: patch not openedn");
  258. return -EINVAL;
  259. }
  260. bank = ((unsigned short)patch->optarg >> 8) & 0xff;
  261. instr = (unsigned short)patch->optarg & 0xff;
  262. if (! remove_info(sf, bank, instr))
  263. return -EINVAL;
  264. return 0;
  265. }
  266. /* load wave sample data */
  267. static int
  268. awe_load_data(awe_patch_info *patch, const char *addr, int count)
  269. {
  270. int offset, size;
  271. int rc;
  272. awe_sample_info tmprec;
  273. awe_sample_list *rec;
  274. sf_list *sf;
  275. if ((sf = check_patch_opened(AWE_PAT_TYPE_MISC, NULL)) == NULL)
  276. return -ENOMEM;
  277. size = (count - AWE_SAMPLE_INFO_SIZE) / 2;
  278. offset = AWE_PATCH_INFO_SIZE;
  279. if (copy_from_user(&tmprec, addr + offset, AWE_SAMPLE_INFO_SIZE))
  280. return -EFAULT;
  281. offset += AWE_SAMPLE_INFO_SIZE;
  282. if (size != tmprec.size) {
  283. printk(KERN_WARNING "AWE32: load: sample size differed (%d != %d)n",
  284.        tmprec.size, size);
  285. return -EINVAL;
  286. }
  287. if (search_sample_index(sf, tmprec.sample) != NULL) {
  288. #ifdef AWE_ALLOW_SAMPLE_SHARING
  289. /* if shared sample, skip this data */
  290. if (sf->type & AWE_PAT_SHARED)
  291. return 0;
  292. #endif /* allow sharing */
  293. DEBUG(1,printk("AWE32: sample data %d already presentn", tmprec.sample));
  294. return -EINVAL;
  295. }
  296. if ((rec = alloc_new_sample()) == NULL)
  297. return -ENOMEM;
  298. memcpy(&rec->v, &tmprec, sizeof(tmprec));
  299. if (rec->v.size > 0) {
  300. if ((rc = awe_write_wave_data(addr, offset, rec, -1)) < 0) {
  301. kfree(rec);
  302. return rc;
  303. }
  304. sf->mem_ptr += rc;
  305. }
  306. add_sf_sample(sf, rec);
  307. return 0;
  308. }
  309. /* replace wave sample data */
  310. static int
  311. awe_replace_data(awe_patch_info *patch, const char *addr, int count)
  312. {
  313. int offset;
  314. int size;
  315. int rc;
  316. int channels;
  317. awe_sample_info cursmp;
  318. int save_mem_ptr;
  319. sf_list *sf;
  320. awe_sample_list *rec;
  321. if (! patch_opened || (sf = sftail) == NULL) {
  322. printk(KERN_WARNING "AWE32: replace: patch not openedn");
  323. return -EINVAL;
  324. }
  325. size = (count - AWE_SAMPLE_INFO_SIZE) / 2;
  326. offset = AWE_PATCH_INFO_SIZE;
  327. if (copy_from_user(&cursmp, addr + offset, AWE_SAMPLE_INFO_SIZE))
  328. return -EFAULT;
  329. offset += AWE_SAMPLE_INFO_SIZE;
  330. if (cursmp.size == 0 || size != cursmp.size) {
  331. printk(KERN_WARNING "AWE32: replace: invalid sample size (%d!=%d)n",
  332.        cursmp.size, size);
  333. return -EINVAL;
  334. }
  335. channels = patch->optarg;
  336. if (channels <= 0 || channels > AWE_NORMAL_VOICES) {
  337. printk(KERN_WARNING "AWE32: replace: invalid channels %dn", channels);
  338. return -EINVAL;
  339. }
  340. for (rec = sf->samples; rec; rec = rec->next) {
  341. if (rec->v.sample == cursmp.sample)
  342. break;
  343. }
  344. if (rec == NULL) {
  345. printk(KERN_WARNING "AWE32: replace: cannot find existing sample data %dn",
  346.        cursmp.sample);
  347. return -EINVAL;
  348. }
  349. if (rec->v.size != cursmp.size) {
  350. printk(KERN_WARNING "AWE32: replace: exiting size differed (%d!=%d)n",
  351.        rec->v.size, cursmp.size);
  352. return -EINVAL;
  353. }
  354. save_mem_ptr = awe_free_mem_ptr();
  355. sftail->mem_ptr = rec->v.start - awe_mem_start;
  356. memcpy(&rec->v, &cursmp, sizeof(cursmp));
  357. rec->v.sf_id = current_sf_id;
  358. if ((rc = awe_write_wave_data(addr, offset, rec, channels)) < 0)
  359. return rc;
  360. sftail->mem_ptr = save_mem_ptr;
  361. return 0;
  362. }
  363. /*----------------------------------------------------------------*/
  364. static const char *readbuf_addr;
  365. static int readbuf_offs;
  366. static int readbuf_flags;
  367. /* initialize read buffer */
  368. static int
  369. readbuf_init(const char *addr, int offset, awe_sample_info *sp)
  370. {
  371. readbuf_addr = addr;
  372. readbuf_offs = offset;
  373. readbuf_flags = sp->mode_flags;
  374. return 0;
  375. }
  376. /* read directly from user buffer */
  377. static unsigned short
  378. readbuf_word(int pos)
  379. {
  380. unsigned short c;
  381. /* read from user buffer */
  382. if (readbuf_flags & AWE_SAMPLE_8BITS) {
  383. unsigned char cc;
  384. get_user(cc, (unsigned char*)(readbuf_addr + readbuf_offs + pos));
  385. c = (unsigned short)cc << 8; /* convert 8bit -> 16bit */
  386. } else {
  387. get_user(c, (unsigned short*)(readbuf_addr + readbuf_offs + pos * 2));
  388. }
  389. if (readbuf_flags & AWE_SAMPLE_UNSIGNED)
  390. c ^= 0x8000; /* unsigned -> signed */
  391. return c;
  392. }
  393. #define readbuf_word_cache readbuf_word
  394. #define readbuf_end() /**/
  395. /*----------------------------------------------------------------*/
  396. #define BLANK_LOOP_START 8
  397. #define BLANK_LOOP_END 40
  398. #define BLANK_LOOP_SIZE 48
  399. /* loading onto memory - return the actual written size */
  400. static int 
  401. awe_write_wave_data(const char *addr, int offset, awe_sample_list *list, int channels)
  402. {
  403. int i, truesize, dram_offset;
  404. awe_sample_info *sp = &list->v;
  405. int rc;
  406. /* be sure loop points start < end */
  407. if (sp->loopstart > sp->loopend) {
  408. int tmp = sp->loopstart;
  409. sp->loopstart = sp->loopend;
  410. sp->loopend = tmp;
  411. }
  412. /* compute true data size to be loaded */
  413. truesize = sp->size;
  414. if (sp->mode_flags & (AWE_SAMPLE_BIDIR_LOOP|AWE_SAMPLE_REVERSE_LOOP))
  415. truesize += sp->loopend - sp->loopstart;
  416. if (sp->mode_flags & AWE_SAMPLE_NO_BLANK)
  417. truesize += BLANK_LOOP_SIZE;
  418. if (awe_free_mem_ptr() + truesize >= memsize/2) {
  419. DEBUG(-1,printk("AWE32 Error: Sample memory fulln"));
  420. return -ENOSPC;
  421. }
  422. /* recalculate address offset */
  423. sp->end -= sp->start;
  424. sp->loopstart -= sp->start;
  425. sp->loopend -= sp->start;
  426. dram_offset = awe_free_mem_ptr() + awe_mem_start;
  427. sp->start = dram_offset;
  428. sp->end += dram_offset;
  429. sp->loopstart += dram_offset;
  430. sp->loopend += dram_offset;
  431. /* set the total size (store onto obsolete checksum value) */
  432. if (sp->size == 0)
  433. sp->checksum = 0;
  434. else
  435. sp->checksum = truesize;
  436. if ((rc = awe_open_dram_for_write(dram_offset, channels)) != 0)
  437. return rc;
  438. if (readbuf_init(addr, offset, sp) < 0)
  439. return -ENOSPC;
  440. for (i = 0; i < sp->size; i++) {
  441. unsigned short c;
  442. c = readbuf_word(i);
  443. awe_write_dram(c);
  444. if (i == sp->loopend &&
  445.     (sp->mode_flags & (AWE_SAMPLE_BIDIR_LOOP|AWE_SAMPLE_REVERSE_LOOP))) {
  446. int looplen = sp->loopend - sp->loopstart;
  447. /* copy reverse loop */
  448. int k;
  449. for (k = 1; k <= looplen; k++) {
  450. c = readbuf_word_cache(i - k);
  451. awe_write_dram(c);
  452. }
  453. if (sp->mode_flags & AWE_SAMPLE_BIDIR_LOOP) {
  454. sp->end += looplen;
  455. } else {
  456. sp->start += looplen;
  457. sp->end += looplen;
  458. }
  459. }
  460. }
  461. readbuf_end();
  462. /* if no blank loop is attached in the sample, add it */
  463. if (sp->mode_flags & AWE_SAMPLE_NO_BLANK) {
  464. for (i = 0; i < BLANK_LOOP_SIZE; i++)
  465. awe_write_dram(0);
  466. if (sp->mode_flags & AWE_SAMPLE_SINGLESHOT) {
  467. sp->loopstart = sp->end + BLANK_LOOP_START;
  468. sp->loopend = sp->end + BLANK_LOOP_END;
  469. }
  470. }
  471. awe_close_dram();
  472. /* initialize FM */
  473. awe_init_fm();
  474. return truesize;
  475. }
  476. /*----------------------------------------------------------------*/
  477. #ifdef AWE_HAS_GUS_COMPATIBILITY
  478. /* calculate GUS envelope time:
  479.  * is this correct?  i have no idea..
  480.  */
  481. static int
  482. calc_gus_envelope_time(int rate, int start, int end)
  483. {
  484. int r, p, t;
  485. r = (3 - ((rate >> 6) & 3)) * 3;
  486. p = rate & 0x3f;
  487. t = end - start;
  488. if (t < 0) t = -t;
  489. if (13 > r)
  490. t = t << (13 - r);
  491. else
  492. t = t >> (r - 13);
  493. return (t * 10) / (p * 441);
  494. }
  495. #define calc_gus_sustain(val)  (0x7f - vol_table[(val)/2])
  496. #define calc_gus_attenuation(val) vol_table[(val)/2]
  497. /* load GUS patch */
  498. static int
  499. awe_load_guspatch(const char *addr, int offs, int size, int pmgr_flag)
  500. {
  501. struct patch_info patch;
  502. awe_voice_info *rec;
  503. awe_sample_info *smp;
  504. awe_voice_list *vrec;
  505. awe_sample_list *smprec;
  506. int sizeof_patch;
  507. int note, rc;
  508. sf_list *sf;
  509. sizeof_patch = (int)((long)&patch.data[0] - (long)&patch); /* header size */
  510. if (size < sizeof_patch) {
  511. printk(KERN_WARNING "AWE32 Error: Patch header too shortn");
  512. return -EINVAL;
  513. }
  514. if (copy_from_user(((char*)&patch) + offs, addr + offs, sizeof_patch - offs))
  515. return -EFAULT;
  516. size -= sizeof_patch;
  517. if (size < patch.len) {
  518. printk(KERN_WARNING "AWE32 Error: Patch record too short (%d<%d)n",
  519.        size, patch.len);
  520. return -EINVAL;
  521. }
  522. if ((sf = check_patch_opened(AWE_PAT_TYPE_GUS, NULL)) == NULL)
  523. return -ENOMEM;
  524. if ((smprec = alloc_new_sample()) == NULL)
  525. return -ENOMEM;
  526. if ((vrec = alloc_new_info()) == NULL) {
  527. kfree(smprec);
  528. return -ENOMEM;
  529. }
  530. smp = &smprec->v;
  531. smp->sample = sf->num_sample;
  532. smp->start = 0;
  533. smp->end = patch.len;
  534. smp->loopstart = patch.loop_start;
  535. smp->loopend = patch.loop_end;
  536. smp->size = patch.len;
  537. /* set up mode flags */
  538. smp->mode_flags = 0;
  539. if (!(patch.mode & WAVE_16_BITS))
  540. smp->mode_flags |= AWE_SAMPLE_8BITS;
  541. if (patch.mode & WAVE_UNSIGNED)
  542. smp->mode_flags |= AWE_SAMPLE_UNSIGNED;
  543. smp->mode_flags |= AWE_SAMPLE_NO_BLANK;
  544. if (!(patch.mode & (WAVE_LOOPING|WAVE_BIDIR_LOOP|WAVE_LOOP_BACK)))
  545. smp->mode_flags |= AWE_SAMPLE_SINGLESHOT;
  546. if (patch.mode & WAVE_BIDIR_LOOP)
  547. smp->mode_flags |= AWE_SAMPLE_BIDIR_LOOP;
  548. if (patch.mode & WAVE_LOOP_BACK)
  549. smp->mode_flags |= AWE_SAMPLE_REVERSE_LOOP;
  550. DEBUG(0,printk("AWE32: [sample %d mode %x]n", patch.instr_no, smp->mode_flags));
  551. if (patch.mode & WAVE_16_BITS) {
  552. /* convert to word offsets */
  553. smp->size /= 2;
  554. smp->end /= 2;
  555. smp->loopstart /= 2;
  556. smp->loopend /= 2;
  557. }
  558. smp->checksum_flag = 0;
  559. smp->checksum = 0;
  560. if ((rc = awe_write_wave_data(addr, sizeof_patch, smprec, -1)) < 0)
  561. return rc;
  562. sf->mem_ptr += rc;
  563. add_sf_sample(sf, smprec);
  564. /* set up voice info */
  565. rec = &vrec->v;
  566. awe_init_voice_info(rec);
  567. rec->sample = sf->num_info; /* the last sample */
  568. rec->rate_offset = calc_rate_offset(patch.base_freq);
  569. note = freq_to_note(patch.base_note);
  570. rec->root = note / 100;
  571. rec->tune = -(note % 100);
  572. rec->low = freq_to_note(patch.low_note) / 100;
  573. rec->high = freq_to_note(patch.high_note) / 100;
  574. DEBUG(1,printk("AWE32: [gus base offset=%d, note=%d, range=%d-%d(%d-%d)]n",
  575.        rec->rate_offset, note,
  576.        rec->low, rec->high,
  577.       patch.low_note, patch.high_note));
  578. /* panning position; -128 - 127 => 0-127 */
  579. rec->pan = (patch.panning + 128) / 2;
  580. /* detuning is ignored */
  581. /* 6points volume envelope */
  582. if (patch.mode & WAVE_ENVELOPES) {
  583. int attack, hold, decay, release;
  584. attack = calc_gus_envelope_time
  585. (patch.env_rate[0], 0, patch.env_offset[0]);
  586. hold = calc_gus_envelope_time
  587. (patch.env_rate[1], patch.env_offset[0],
  588.  patch.env_offset[1]);
  589. decay = calc_gus_envelope_time
  590. (patch.env_rate[2], patch.env_offset[1],
  591.  patch.env_offset[2]);
  592. release = calc_gus_envelope_time
  593. (patch.env_rate[3], patch.env_offset[1],
  594.  patch.env_offset[4]);
  595. release += calc_gus_envelope_time
  596. (patch.env_rate[4], patch.env_offset[3],
  597.  patch.env_offset[4]);
  598. release += calc_gus_envelope_time
  599. (patch.env_rate[5], patch.env_offset[4],
  600.  patch.env_offset[5]);
  601. rec->parm.volatkhld = (calc_parm_hold(hold) << 8) |
  602. calc_parm_attack(attack);
  603. rec->parm.voldcysus = (calc_gus_sustain(patch.env_offset[2]) << 8) |
  604. calc_parm_decay(decay);
  605. rec->parm.volrelease = 0x8000 | calc_parm_decay(release);
  606. DEBUG(2,printk("AWE32: [gusenv atk=%d, hld=%d, dcy=%d, rel=%d]n", attack, hold, decay, release));
  607. rec->attenuation = calc_gus_attenuation(patch.env_offset[0]);
  608. }
  609. /* tremolo effect */
  610. if (patch.mode & WAVE_TREMOLO) {
  611. int rate = (patch.tremolo_rate * 1000 / 38) / 42;
  612. rec->parm.tremfrq = ((patch.tremolo_depth / 2) << 8) | rate;
  613. DEBUG(2,printk("AWE32: [gusenv tremolo rate=%d, dep=%d, tremfrq=%x]n",
  614.        patch.tremolo_rate, patch.tremolo_depth,
  615.        rec->parm.tremfrq));
  616. }
  617. /* vibrato effect */
  618. if (patch.mode & WAVE_VIBRATO) {
  619. int rate = (patch.vibrato_rate * 1000 / 38) / 42;
  620. rec->parm.fm2frq2 = ((patch.vibrato_depth / 6) << 8) | rate;
  621. DEBUG(2,printk("AWE32: [gusenv vibrato rate=%d, dep=%d, tremfrq=%x]n",
  622.        patch.tremolo_rate, patch.tremolo_depth,
  623.        rec->parm.tremfrq));
  624. }
  625. /* scale_freq, scale_factor, volume, and fractions not implemented */
  626. /* append to the tail of the list */
  627. vrec->bank = ctrls[AWE_MD_GUS_BANK];
  628. vrec->instr = patch.instr_no;
  629. vrec->disabled = FALSE;
  630. vrec->type = V_ST_NORMAL;
  631. add_sf_info(sf, vrec);
  632. add_info_list(vrec);
  633. /* set the voice index */
  634. awe_set_sample(vrec);
  635. return 0;
  636. }
  637. #endif  /* AWE_HAS_GUS_COMPATIBILITY */
  638. /*
  639.  * sample and voice list handlers
  640.  */
  641. /* append this to the current sf list */
  642. static void add_sf_info(sf_list *sf, awe_voice_list *rec)
  643. {
  644. if (sf == NULL)
  645. return;
  646. rec->holder = sf;
  647. rec->v.sf_id = sf->sf_id;
  648. if (sf->last_infos)
  649. sf->last_infos->next = rec;
  650. else
  651. sf->infos = rec;
  652. sf->last_infos = rec;
  653. rec->next = NULL;
  654. sf->num_info++;
  655. }
  656. /* prepend this sample to sf list */
  657. static void add_sf_sample(sf_list *sf, awe_sample_list *rec)
  658. {
  659. if (sf == NULL)
  660. return;
  661. rec->holder = sf;
  662. rec->v.sf_id = sf->sf_id;
  663. if (sf->last_samples)
  664. sf->last_samples->next = rec;
  665. else
  666. sf->samples = rec;
  667. sf->last_samples = rec;
  668. rec->next = NULL;
  669. sf->num_sample++;
  670. }
  671. /* purge the old records which don't belong with the same file id */
  672. static void purge_old_list(awe_voice_list *rec, awe_voice_list *next)
  673. {
  674. rec->next_instr = next;
  675. if (rec->bank == AWE_DRUM_BANK) {
  676. /* remove samples with the same note range */
  677. awe_voice_list *cur, *prev = rec;
  678. int low = rec->v.low;
  679. int high = rec->v.high;
  680. for (cur = next; cur; cur = cur->next_instr) {
  681. if (cur->v.low == low &&
  682.     cur->v.high == high &&
  683.     ! is_identical_holder(cur->holder, rec->holder))
  684. prev->next_instr = cur->next_instr;
  685. else
  686. prev = cur;
  687. }
  688. } else {
  689. if (! is_identical_holder(next->holder, rec->holder))
  690. /* remove all samples */
  691. rec->next_instr = NULL;
  692. }
  693. }
  694. /* prepend to top of the preset table */
  695. static void add_info_list(awe_voice_list *rec)
  696. {
  697. awe_voice_list *prev, *cur;
  698. int key;
  699. if (rec->disabled)
  700. return;
  701. key = awe_search_key(rec->bank, rec->instr, rec->v.low);
  702. prev = NULL;
  703. for (cur = preset_table[key]; cur; cur = cur->next_bank) {
  704. /* search the first record with the same bank number */
  705. if (cur->instr == rec->instr && cur->bank == rec->bank) {
  706. /* replace the list with the new record */
  707. rec->next_bank = cur->next_bank;
  708. if (prev)
  709. prev->next_bank = rec;
  710. else
  711. preset_table[key] = rec;
  712. purge_old_list(rec, cur);
  713. return;
  714. }
  715. prev = cur;
  716. }
  717. /* this is the first bank record.. just add this */
  718. rec->next_instr = NULL;
  719. rec->next_bank = preset_table[key];
  720. preset_table[key] = rec;
  721. }
  722. /* remove samples later than the specified sf_id */
  723. static void
  724. awe_remove_samples(int sf_id)
  725. {
  726. sf_list *p, *prev;
  727. if (sf_id <= 0) {
  728. awe_reset_samples();
  729. return;
  730. }
  731. /* already removed? */
  732. if (current_sf_id <= sf_id)
  733. return;
  734. for (p = sftail; p; p = prev) {
  735. if (p->sf_id <= sf_id)
  736. break;
  737. prev = p->prev;
  738. awe_free_sf(p);
  739. }
  740. sftail = p;
  741. if (sftail) {
  742. sf_id = sftail->sf_id;
  743. sftail->next = NULL;
  744. } else {
  745. sf_id = 0;
  746. sfhead = NULL;
  747. }
  748. current_sf_id = sf_id;
  749. if (locked_sf_id > sf_id)
  750. locked_sf_id = sf_id;
  751. rebuild_preset_list();
  752. }
  753. /* rebuild preset search list */
  754. static void rebuild_preset_list(void)
  755. {
  756. sf_list *p;
  757. awe_voice_list *rec;
  758. memset(preset_table, 0, sizeof(preset_table));
  759. for (p = sfhead; p; p = p->next) {
  760. for (rec = p->infos; rec; rec = rec->next)
  761. add_info_list(rec);
  762. }
  763. }
  764. /* compare the given sf_id pair */
  765. static int is_identical_holder(sf_list *sf1, sf_list *sf2)
  766. {
  767. if (sf1 == NULL || sf2 == NULL)
  768. return FALSE;
  769. if (sf1 == sf2)
  770. return TRUE;
  771. #ifdef AWE_ALLOW_SAMPLE_SHARING
  772. {
  773. /* compare with the sharing id */
  774. sf_list *p;
  775. int counter = 0;
  776. if (sf1->sf_id < sf2->sf_id) { /* make sure id1 > id2 */
  777. sf_list *tmp; tmp = sf1; sf1 = sf2; sf2 = tmp;
  778. }
  779. for (p = sf1->shared; p; p = p->shared) {
  780. if (counter++ > current_sf_id)
  781. break; /* strange sharing loop.. quit */
  782. if (p == sf2)
  783. return TRUE;
  784. }
  785. }
  786. #endif /* allow sharing */
  787. return FALSE;
  788. }
  789. /* search the sample index matching with the given sample id */
  790. static awe_sample_list *
  791. search_sample_index(sf_list *sf, int sample)
  792. {
  793. awe_sample_list *p;
  794. #ifdef AWE_ALLOW_SAMPLE_SHARING
  795. int counter = 0;
  796. while (sf) {
  797. for (p = sf->samples; p; p = p->next) {
  798. if (p->v.sample == sample)
  799. return p;
  800. }
  801. sf = sf->shared;
  802. if (counter++ > current_sf_id)
  803. break; /* strange sharing loop.. quit */
  804. }
  805. #else
  806. if (sf) {
  807. for (p = sf->samples; p; p = p->next) {
  808. if (p->v.sample == sample)
  809. return p;
  810. }
  811. }
  812. #endif
  813. return NULL;
  814. }
  815. /* search the specified sample */
  816. /* non-zero = found */
  817. static short
  818. awe_set_sample(awe_voice_list *rec)
  819. {
  820. awe_sample_list *smp;
  821. awe_voice_info *vp = &rec->v;
  822. vp->index = 0;
  823. if ((smp = search_sample_index(rec->holder, vp->sample)) == NULL)
  824. return 0;
  825. /* set the actual sample offsets */
  826. vp->start += smp->v.start;
  827. vp->end += smp->v.end;
  828. vp->loopstart += smp->v.loopstart;
  829. vp->loopend += smp->v.loopend;
  830. /* copy mode flags */
  831. vp->mode = smp->v.mode_flags;
  832. /* set flag */
  833. vp->index = 1;
  834. return 1;
  835. }
  836. /*
  837.  * voice allocation
  838.  */
  839. /* look for all voices associated with the specified note & velocity */
  840. static int
  841. awe_search_multi_voices(awe_voice_list *rec, int note, int velocity,
  842. awe_voice_info **vlist)
  843. {
  844. int nvoices;
  845. nvoices = 0;
  846. for (; rec; rec = rec->next_instr) {
  847. if (note >= rec->v.low &&
  848.     note <= rec->v.high &&
  849.     velocity >= rec->v.vellow &&
  850.     velocity <= rec->v.velhigh) {
  851. if (rec->type == V_ST_MAPPED) {
  852. /* mapper */
  853. vlist[0] = &rec->v;
  854. return -1;
  855. }
  856. vlist[nvoices++] = &rec->v;
  857. if (nvoices >= AWE_MAX_VOICES)
  858. break;
  859. }
  860. }
  861. return nvoices;
  862. }
  863. /* store the voice list from the specified note and velocity.
  864.    if the preset is mapped, seek for the destination preset, and rewrite
  865.    the note number if necessary.
  866.    */
  867. static int
  868. really_alloc_voices(int bank, int instr, int *note, int velocity, awe_voice_info **vlist)
  869. {
  870. int nvoices;
  871. awe_voice_list *vrec;
  872. int level = 0;
  873. for (;;) {
  874. vrec = awe_search_instr(bank, instr, *note);
  875. nvoices = awe_search_multi_voices(vrec, *note, velocity, vlist);
  876. if (nvoices == 0) {
  877. if (bank == AWE_DRUM_BANK)
  878. /* search default drumset */
  879. vrec = awe_search_instr(bank, ctrls[AWE_MD_DEF_DRUM], *note);
  880. else
  881. /* search default preset */
  882. vrec = awe_search_instr(ctrls[AWE_MD_DEF_BANK], instr, *note);
  883. nvoices = awe_search_multi_voices(vrec, *note, velocity, vlist);
  884. }
  885. if (nvoices == 0) {
  886. if (bank == AWE_DRUM_BANK && ctrls[AWE_MD_DEF_DRUM] != 0)
  887. /* search default drumset */
  888. vrec = awe_search_instr(bank, 0, *note);
  889. else if (bank != AWE_DRUM_BANK && ctrls[AWE_MD_DEF_BANK] != 0)
  890. /* search default preset */
  891. vrec = awe_search_instr(0, instr, *note);
  892. nvoices = awe_search_multi_voices(vrec, *note, velocity, vlist);
  893. }
  894. if (nvoices < 0) { /* mapping */
  895. int key = vlist[0]->fixkey;
  896. instr = vlist[0]->start;
  897. bank = vlist[0]->end;
  898. if (level++ > 5) {
  899. printk(KERN_ERR "AWE32: too deep mapping leveln");
  900. return 0;
  901. }
  902. if (key >= 0)
  903. *note = key;
  904. } else
  905. break;
  906. }
  907. return nvoices;
  908. }
  909. /* allocate voices corresponding note and velocity; supports multiple insts. */
  910. static void
  911. awe_alloc_multi_voices(int ch, int note, int velocity, int key)
  912. {
  913. int i, v, nvoices, bank;
  914. awe_voice_info *vlist[AWE_MAX_VOICES];
  915. if (MULTI_LAYER_MODE() && IS_DRUM_CHANNEL(ch))
  916. bank = AWE_DRUM_BANK; /* always search drumset */
  917. else
  918. bank = channels[ch].bank;
  919. /* check the possible voices; note may be changeable if mapped */
  920. nvoices = really_alloc_voices(bank, channels[ch].instr,
  921.       &note, velocity, vlist);
  922. /* set the voices */
  923. current_alloc_time++;
  924. for (i = 0; i < nvoices; i++) {
  925. v = awe_clear_voice();
  926. voices[v].key = key;
  927. voices[v].ch = ch;
  928. voices[v].note = note;
  929. voices[v].velocity = velocity;
  930. voices[v].time = current_alloc_time;
  931. voices[v].cinfo = &channels[ch];
  932. voices[v].sample = vlist[i];
  933. voices[v].state = AWE_ST_MARK;
  934. voices[v].layer = nvoices - i - 1;  /* in reverse order */
  935. }
  936. /* clear the mark in allocated voices */
  937. for (i = 0; i < awe_max_voices; i++) {
  938. if (voices[i].state == AWE_ST_MARK)
  939. voices[i].state = AWE_ST_OFF;
  940. }
  941. }
  942. /* search an empty voice.
  943.    if no empty voice is found, at least terminate a voice
  944.    */
  945. static int
  946. awe_clear_voice(void)
  947. {
  948. enum {
  949. OFF=0, RELEASED, SUSTAINED, PLAYING, END
  950. };
  951. struct voice_candidate_t {
  952. int best;
  953. int time;
  954. int vtarget;
  955. } candidate[END];
  956. int i, type, vtarget;
  957. vtarget = 0xffff;
  958. for (type = OFF; type < END; type++) {
  959. candidate[type].best = -1;
  960. candidate[type].time = current_alloc_time + 1;
  961. candidate[type].vtarget = vtarget;
  962. }
  963. for (i = 0; i < awe_max_voices; i++) {
  964. if (voices[i].state & AWE_ST_OFF)
  965. type = OFF;
  966. else if (voices[i].state & AWE_ST_RELEASED)
  967. type = RELEASED;
  968. else if (voices[i].state & AWE_ST_SUSTAINED)
  969. type = SUSTAINED;
  970. else if (voices[i].state & ~AWE_ST_MARK)
  971. type = PLAYING;
  972. else
  973. continue;
  974. #ifdef AWE_CHECK_VTARGET
  975. /* get current volume */
  976. vtarget = (awe_peek_dw(AWE_VTFT(i)) >> 16) & 0xffff;
  977. #endif
  978. if (candidate[type].best < 0 ||
  979.     vtarget < candidate[type].vtarget ||
  980.     (vtarget == candidate[type].vtarget &&
  981.      voices[i].time < candidate[type].time)) {
  982. candidate[type].best = i;
  983. candidate[type].time = voices[i].time;
  984. candidate[type].vtarget = vtarget;
  985. }
  986. }
  987. for (type = OFF; type < END; type++) {
  988. if ((i = candidate[type].best) >= 0) {
  989. if (voices[i].state != AWE_ST_OFF)
  990. awe_terminate(i);
  991. awe_voice_init(i, TRUE);
  992. return i;
  993. }
  994. }
  995. return 0;
  996. }
  997. /* search sample for the specified note & velocity and set it on the voice;
  998.  * note that voice is the voice index (not channel index)
  999.  */
  1000. static void
  1001. awe_alloc_one_voice(int voice, int note, int velocity)
  1002. {
  1003. int ch, nvoices, bank;
  1004. awe_voice_info *vlist[AWE_MAX_VOICES];
  1005. ch = voices[voice].ch;
  1006. if (MULTI_LAYER_MODE() && IS_DRUM_CHANNEL(voice))
  1007. bank = AWE_DRUM_BANK; /* always search drumset */
  1008. else
  1009. bank = voices[voice].cinfo->bank;
  1010. nvoices = really_alloc_voices(bank, voices[voice].cinfo->instr,
  1011.       &note, velocity, vlist);
  1012. if (nvoices > 0) {
  1013. voices[voice].time = ++current_alloc_time;
  1014. voices[voice].sample = vlist[0]; /* use the first one */
  1015. voices[voice].layer = 0;
  1016. voices[voice].note = note;
  1017. voices[voice].velocity = velocity;
  1018. }
  1019. }
  1020. /*
  1021.  * sequencer2 functions
  1022.  */
  1023. /* search an empty voice; used by sequencer2 */
  1024. static int
  1025. awe_alloc(int dev, int chn, int note, struct voice_alloc_info *alloc)
  1026. {
  1027. playing_mode = AWE_PLAY_MULTI2;
  1028. awe_info.nr_voices = AWE_MAX_CHANNELS;
  1029. return awe_clear_voice();
  1030. }
  1031. /* set up voice; used by sequencer2 */
  1032. static void
  1033. awe_setup_voice(int dev, int voice, int chn)
  1034. {
  1035. struct channel_info *info;
  1036. if (synth_devs[dev] == NULL ||
  1037.     (info = &synth_devs[dev]->chn_info[chn]) == NULL)
  1038. return;
  1039. if (voice < 0 || voice >= awe_max_voices)
  1040. return;
  1041. DEBUG(2,printk("AWE32: [setup(%d) ch=%d]n", voice, chn));
  1042. channels[chn].expression_vol = info->controllers[CTL_EXPRESSION];
  1043. channels[chn].main_vol = info->controllers[CTL_MAIN_VOLUME];
  1044. channels[chn].panning =
  1045. info->controllers[CTL_PAN] * 2 - 128; /* signed 8bit */
  1046. channels[chn].bender = info->bender_value; /* zero center */
  1047. channels[chn].bank = info->controllers[CTL_BANK_SELECT];
  1048. channels[chn].sustained = info->controllers[CTL_SUSTAIN];
  1049. if (info->controllers[CTL_EXT_EFF_DEPTH]) {
  1050. FX_SET(&channels[chn].fx, AWE_FX_REVERB,
  1051.        info->controllers[CTL_EXT_EFF_DEPTH] * 2);
  1052. }
  1053. if (info->controllers[CTL_CHORUS_DEPTH]) {
  1054. FX_SET(&channels[chn].fx, AWE_FX_CHORUS,
  1055.        info->controllers[CTL_CHORUS_DEPTH] * 2);
  1056. }
  1057. awe_set_instr(dev, chn, info->pgm_num);
  1058. }
  1059. #ifdef CONFIG_AWE32_MIXER
  1060. /*
  1061.  * AWE32 mixer device control
  1062.  */
  1063. static int awe_mixer_ioctl(int dev, unsigned int cmd, caddr_t arg);
  1064. static int my_mixerdev = -1;
  1065. static struct mixer_operations awe_mixer_operations = {
  1066. owner: THIS_MODULE,
  1067. id: "AWE",
  1068. name: "AWE32 Equalizer",
  1069. ioctl: awe_mixer_ioctl,
  1070. };
  1071. static void __init attach_mixer(void)
  1072. {
  1073. if ((my_mixerdev = sound_alloc_mixerdev()) >= 0) {
  1074. mixer_devs[my_mixerdev] = &awe_mixer_operations;
  1075. }
  1076. }
  1077. static void __exit unload_mixer(void)
  1078. {
  1079. if (my_mixerdev >= 0)
  1080. sound_unload_mixerdev(my_mixerdev);
  1081. }
  1082. static int
  1083. awe_mixer_ioctl(int dev, unsigned int cmd, caddr_t arg)
  1084. {
  1085. int i, level, value;
  1086. if (((cmd >> 8) & 0xff) != 'M')
  1087. return -EINVAL;
  1088. level = *(int*)arg;
  1089. level = ((level & 0xff) + (level >> 8)) / 2;
  1090. DEBUG(0,printk("AWEMix: cmd=%x val=%dn", cmd & 0xff, level));
  1091. if (_SIOC_DIR(cmd) & _SIOC_WRITE) {
  1092. switch (cmd & 0xff) {
  1093. case SOUND_MIXER_BASS:
  1094. value = level * 12 / 100;
  1095. if (value >= 12)
  1096. value = 11;
  1097. ctrls[AWE_MD_BASS_LEVEL] = value;
  1098. awe_update_equalizer();
  1099. break;
  1100. case SOUND_MIXER_TREBLE:
  1101. value = level * 12 / 100;
  1102. if (value >= 12)
  1103. value = 11;
  1104. ctrls[AWE_MD_TREBLE_LEVEL] = value;
  1105. awe_update_equalizer();
  1106. break;
  1107. case SOUND_MIXER_VOLUME:
  1108. level = level * 127 / 100;
  1109. if (level >= 128) level = 127;
  1110. atten_relative = FALSE;
  1111. atten_offset = vol_table[level];
  1112. awe_update_volume();
  1113. break;
  1114. }
  1115. }
  1116. switch (cmd & 0xff) {
  1117. case SOUND_MIXER_BASS:
  1118. level = ctrls[AWE_MD_BASS_LEVEL] * 100 / 24;
  1119. level = (level << 8) | level;
  1120. break;
  1121. case SOUND_MIXER_TREBLE:
  1122. level = ctrls[AWE_MD_TREBLE_LEVEL] * 100 / 24;
  1123. level = (level << 8) | level;
  1124. break;
  1125. case SOUND_MIXER_VOLUME:
  1126. value = atten_offset;
  1127. if (atten_relative)
  1128. value += ctrls[AWE_MD_ZERO_ATTEN];
  1129. for (i = 127; i > 0; i--) {
  1130. if (value <= vol_table[i])
  1131. break;
  1132. }
  1133. level = i * 100 / 127;
  1134. level = (level << 8) | level;
  1135. break;
  1136. case SOUND_MIXER_DEVMASK:
  1137. level = SOUND_MASK_BASS|SOUND_MASK_TREBLE|SOUND_MASK_VOLUME;
  1138. break;
  1139. default:
  1140. level = 0;
  1141. break;
  1142. }
  1143. return *(int*)arg = level;
  1144. }
  1145. #endif /* CONFIG_AWE32_MIXER */
  1146. /*
  1147.  * initialization of Emu8000
  1148.  */
  1149. /* intiailize audio channels */
  1150. static void
  1151. awe_init_audio(void)
  1152. {
  1153. int ch;
  1154. /* turn off envelope engines */
  1155. for (ch = 0; ch < AWE_MAX_VOICES; ch++) {
  1156. awe_poke(AWE_DCYSUSV(ch), 0x80);
  1157. }
  1158.   
  1159. /* reset all other parameters to zero */
  1160. for (ch = 0; ch < AWE_MAX_VOICES; ch++) {
  1161. awe_poke(AWE_ENVVOL(ch), 0);
  1162. awe_poke(AWE_ENVVAL(ch), 0);
  1163. awe_poke(AWE_DCYSUS(ch), 0);
  1164. awe_poke(AWE_ATKHLDV(ch), 0);
  1165. awe_poke(AWE_LFO1VAL(ch), 0);
  1166. awe_poke(AWE_ATKHLD(ch), 0);
  1167. awe_poke(AWE_LFO2VAL(ch), 0);
  1168. awe_poke(AWE_IP(ch), 0);
  1169. awe_poke(AWE_IFATN(ch), 0);
  1170. awe_poke(AWE_PEFE(ch), 0);
  1171. awe_poke(AWE_FMMOD(ch), 0);
  1172. awe_poke(AWE_TREMFRQ(ch), 0);
  1173. awe_poke(AWE_FM2FRQ2(ch), 0);
  1174. awe_poke_dw(AWE_PTRX(ch), 0);
  1175. awe_poke_dw(AWE_VTFT(ch), 0);
  1176. awe_poke_dw(AWE_PSST(ch), 0);
  1177. awe_poke_dw(AWE_CSL(ch), 0);
  1178. awe_poke_dw(AWE_CCCA(ch), 0);
  1179. }
  1180. for (ch = 0; ch < AWE_MAX_VOICES; ch++) {
  1181. awe_poke_dw(AWE_CPF(ch), 0);
  1182. awe_poke_dw(AWE_CVCF(ch), 0);
  1183. }
  1184. }
  1185. /* initialize DMA address */
  1186. static void
  1187. awe_init_dma(void)
  1188. {
  1189. awe_poke_dw(AWE_SMALR, 0);
  1190. awe_poke_dw(AWE_SMARR, 0);
  1191. awe_poke_dw(AWE_SMALW, 0);
  1192. awe_poke_dw(AWE_SMARW, 0);
  1193. }
  1194. /* initialization arrays; from ADIP */
  1195. static unsigned short init1[128] = {
  1196. 0x03ff, 0x0030,  0x07ff, 0x0130, 0x0bff, 0x0230,  0x0fff, 0x0330,
  1197. 0x13ff, 0x0430,  0x17ff, 0x0530, 0x1bff, 0x0630,  0x1fff, 0x0730,
  1198. 0x23ff, 0x0830,  0x27ff, 0x0930, 0x2bff, 0x0a30,  0x2fff, 0x0b30,
  1199. 0x33ff, 0x0c30,  0x37ff, 0x0d30, 0x3bff, 0x0e30,  0x3fff, 0x0f30,
  1200. 0x43ff, 0x0030,  0x47ff, 0x0130, 0x4bff, 0x0230,  0x4fff, 0x0330,
  1201. 0x53ff, 0x0430,  0x57ff, 0x0530, 0x5bff, 0x0630,  0x5fff, 0x0730,
  1202. 0x63ff, 0x0830,  0x67ff, 0x0930, 0x6bff, 0x0a30,  0x6fff, 0x0b30,
  1203. 0x73ff, 0x0c30,  0x77ff, 0x0d30, 0x7bff, 0x0e30,  0x7fff, 0x0f30,
  1204. 0x83ff, 0x0030,  0x87ff, 0x0130, 0x8bff, 0x0230,  0x8fff, 0x0330,
  1205. 0x93ff, 0x0430,  0x97ff, 0x0530, 0x9bff, 0x0630,  0x9fff, 0x0730,
  1206. 0xa3ff, 0x0830,  0xa7ff, 0x0930, 0xabff, 0x0a30,  0xafff, 0x0b30,
  1207. 0xb3ff, 0x0c30,  0xb7ff, 0x0d30, 0xbbff, 0x0e30,  0xbfff, 0x0f30,
  1208. 0xc3ff, 0x0030,  0xc7ff, 0x0130, 0xcbff, 0x0230,  0xcfff, 0x0330,
  1209. 0xd3ff, 0x0430,  0xd7ff, 0x0530, 0xdbff, 0x0630,  0xdfff, 0x0730,
  1210. 0xe3ff, 0x0830,  0xe7ff, 0x0930, 0xebff, 0x0a30,  0xefff, 0x0b30,
  1211. 0xf3ff, 0x0c30,  0xf7ff, 0x0d30, 0xfbff, 0x0e30,  0xffff, 0x0f30,
  1212. };
  1213. static unsigned short init2[128] = {
  1214. 0x03ff, 0x8030, 0x07ff, 0x8130, 0x0bff, 0x8230, 0x0fff, 0x8330,
  1215. 0x13ff, 0x8430, 0x17ff, 0x8530, 0x1bff, 0x8630, 0x1fff, 0x8730,
  1216. 0x23ff, 0x8830, 0x27ff, 0x8930, 0x2bff, 0x8a30, 0x2fff, 0x8b30,
  1217. 0x33ff, 0x8c30, 0x37ff, 0x8d30, 0x3bff, 0x8e30, 0x3fff, 0x8f30,
  1218. 0x43ff, 0x8030, 0x47ff, 0x8130, 0x4bff, 0x8230, 0x4fff, 0x8330,
  1219. 0x53ff, 0x8430, 0x57ff, 0x8530, 0x5bff, 0x8630, 0x5fff, 0x8730,
  1220. 0x63ff, 0x8830, 0x67ff, 0x8930, 0x6bff, 0x8a30, 0x6fff, 0x8b30,
  1221. 0x73ff, 0x8c30, 0x77ff, 0x8d30, 0x7bff, 0x8e30, 0x7fff, 0x8f30,
  1222. 0x83ff, 0x8030, 0x87ff, 0x8130, 0x8bff, 0x8230, 0x8fff, 0x8330,
  1223. 0x93ff, 0x8430, 0x97ff, 0x8530, 0x9bff, 0x8630, 0x9fff, 0x8730,
  1224. 0xa3ff, 0x8830, 0xa7ff, 0x8930, 0xabff, 0x8a30, 0xafff, 0x8b30,
  1225. 0xb3ff, 0x8c30, 0xb7ff, 0x8d30, 0xbbff, 0x8e30, 0xbfff, 0x8f30,
  1226. 0xc3ff, 0x8030, 0xc7ff, 0x8130, 0xcbff, 0x8230, 0xcfff, 0x8330,
  1227. 0xd3ff, 0x8430, 0xd7ff, 0x8530, 0xdbff, 0x8630, 0xdfff, 0x8730,
  1228. 0xe3ff, 0x8830, 0xe7ff, 0x8930, 0xebff, 0x8a30, 0xefff, 0x8b30,
  1229. 0xf3ff, 0x8c30, 0xf7ff, 0x8d30, 0xfbff, 0x8e30, 0xffff, 0x8f30,
  1230. };
  1231. static unsigned short init3[128] = {
  1232. 0x0C10, 0x8470, 0x14FE, 0xB488, 0x167F, 0xA470, 0x18E7, 0x84B5,
  1233. 0x1B6E, 0x842A, 0x1F1D, 0x852A, 0x0DA3, 0x8F7C, 0x167E, 0xF254,
  1234. 0x0000, 0x842A, 0x0001, 0x852A, 0x18E6, 0x8BAA, 0x1B6D, 0xF234,
  1235. 0x229F, 0x8429, 0x2746, 0x8529, 0x1F1C, 0x86E7, 0x229E, 0xF224,
  1236. 0x0DA4, 0x8429, 0x2C29, 0x8529, 0x2745, 0x87F6, 0x2C28, 0xF254,
  1237. 0x383B, 0x8428, 0x320F, 0x8528, 0x320E, 0x8F02, 0x1341, 0xF264,
  1238. 0x3EB6, 0x8428, 0x3EB9, 0x8528, 0x383A, 0x8FA9, 0x3EB5, 0xF294,
  1239. 0x3EB7, 0x8474, 0x3EBA, 0x8575, 0x3EB8, 0xC4C3, 0x3EBB, 0xC5C3,
  1240. 0x0000, 0xA404, 0x0001, 0xA504, 0x141F, 0x8671, 0x14FD, 0x8287,
  1241. 0x3EBC, 0xE610, 0x3EC8, 0x8C7B, 0x031A, 0x87E6, 0x3EC8, 0x86F7,
  1242. 0x3EC0, 0x821E, 0x3EBE, 0xD208, 0x3EBD, 0x821F, 0x3ECA, 0x8386,
  1243. 0x3EC1, 0x8C03, 0x3EC9, 0x831E, 0x3ECA, 0x8C4C, 0x3EBF, 0x8C55,
  1244. 0x3EC9, 0xC208, 0x3EC4, 0xBC84, 0x3EC8, 0x8EAD, 0x3EC8, 0xD308,
  1245. 0x3EC2, 0x8F7E, 0x3ECB, 0x8219, 0x3ECB, 0xD26E, 0x3EC5, 0x831F,
  1246. 0x3EC6, 0xC308, 0x3EC3, 0xB2FF, 0x3EC9, 0x8265, 0x3EC9, 0x8319,
  1247. 0x1342, 0xD36E, 0x3EC7, 0xB3FF, 0x0000, 0x8365, 0x1420, 0x9570,
  1248. };
  1249. static unsigned short init4[128] = {
  1250. 0x0C10, 0x8470, 0x14FE, 0xB488, 0x167F, 0xA470, 0x18E7, 0x84B5,
  1251. 0x1B6E, 0x842A, 0x1F1D, 0x852A, 0x0DA3, 0x0F7C, 0x167E, 0x7254,
  1252. 0x0000, 0x842A, 0x0001, 0x852A, 0x18E6, 0x0BAA, 0x1B6D, 0x7234,
  1253. 0x229F, 0x8429, 0x2746, 0x8529, 0x1F1C, 0x06E7, 0x229E, 0x7224,
  1254. 0x0DA4, 0x8429, 0x2C29, 0x8529, 0x2745, 0x07F6, 0x2C28, 0x7254,
  1255. 0x383B, 0x8428, 0x320F, 0x8528, 0x320E, 0x0F02, 0x1341, 0x7264,
  1256. 0x3EB6, 0x8428, 0x3EB9, 0x8528, 0x383A, 0x0FA9, 0x3EB5, 0x7294,
  1257. 0x3EB7, 0x8474, 0x3EBA, 0x8575, 0x3EB8, 0x44C3, 0x3EBB, 0x45C3,
  1258. 0x0000, 0xA404, 0x0001, 0xA504, 0x141F, 0x0671, 0x14FD, 0x0287,
  1259. 0x3EBC, 0xE610, 0x3EC8, 0x0C7B, 0x031A, 0x07E6, 0x3EC8, 0x86F7,
  1260. 0x3EC0, 0x821E, 0x3EBE, 0xD208, 0x3EBD, 0x021F, 0x3ECA, 0x0386,
  1261. 0x3EC1, 0x0C03, 0x3EC9, 0x031E, 0x3ECA, 0x8C4C, 0x3EBF, 0x0C55,
  1262. 0x3EC9, 0xC208, 0x3EC4, 0xBC84, 0x3EC8, 0x0EAD, 0x3EC8, 0xD308,
  1263. 0x3EC2, 0x8F7E, 0x3ECB, 0x0219, 0x3ECB, 0xD26E, 0x3EC5, 0x031F,
  1264. 0x3EC6, 0xC308, 0x3EC3, 0x32FF, 0x3EC9, 0x0265, 0x3EC9, 0x8319,
  1265. 0x1342, 0xD36E, 0x3EC7, 0x33FF, 0x0000, 0x8365, 0x1420, 0x9570,
  1266. };
  1267. /* send initialization arrays to start up */
  1268. static void
  1269. awe_init_array(void)
  1270. {
  1271. awe_send_array(init1);
  1272. awe_wait(1024);
  1273. awe_send_array(init2);
  1274. awe_send_array(init3);
  1275. awe_poke_dw(AWE_HWCF4, 0);
  1276. awe_poke_dw(AWE_HWCF5, 0x83);
  1277. awe_poke_dw(AWE_HWCF6, 0x8000);
  1278. awe_send_array(init4);
  1279. }
  1280. /* send an initialization array */
  1281. static void
  1282. awe_send_array(unsigned short *data)
  1283. {
  1284. int i;
  1285. unsigned short *p;
  1286. p = data;
  1287. for (i = 0; i < AWE_MAX_VOICES; i++, p++)
  1288. awe_poke(AWE_INIT1(i), *p);
  1289. for (i = 0; i < AWE_MAX_VOICES; i++, p++)
  1290. awe_poke(AWE_INIT2(i), *p);
  1291. for (i = 0; i < AWE_MAX_VOICES; i++, p++)
  1292. awe_poke(AWE_INIT3(i), *p);
  1293. for (i = 0; i < AWE_MAX_VOICES; i++, p++)
  1294. awe_poke(AWE_INIT4(i), *p);
  1295. }
  1296. /*
  1297.  * set up awe32 channels to some known state.
  1298.  */
  1299. /* set the envelope & LFO parameters to the default values; see ADIP */
  1300. static void
  1301. awe_tweak_voice(int i)
  1302. {
  1303. /* set all mod/vol envelope shape to minimum */
  1304. awe_poke(AWE_ENVVOL(i), 0x8000);
  1305. awe_poke(AWE_ENVVAL(i), 0x8000);
  1306. awe_poke(AWE_DCYSUS(i), 0x7F7F);
  1307. awe_poke(AWE_ATKHLDV(i), 0x7F7F);
  1308. awe_poke(AWE_ATKHLD(i), 0x7F7F);
  1309. awe_poke(AWE_PEFE(i), 0);  /* mod envelope height to zero */
  1310. awe_poke(AWE_LFO1VAL(i), 0x8000); /* no delay for LFO1 */
  1311. awe_poke(AWE_LFO2VAL(i), 0x8000);
  1312. awe_poke(AWE_IP(i), 0xE000); /* no pitch shift */
  1313. awe_poke(AWE_IFATN(i), 0xFF00); /* volume to minimum */
  1314. awe_poke(AWE_FMMOD(i), 0);
  1315. awe_poke(AWE_TREMFRQ(i), 0);
  1316. awe_poke(AWE_FM2FRQ2(i), 0);
  1317. }
  1318. static void
  1319. awe_tweak(void)
  1320. {
  1321. int i;
  1322. /* reset all channels */
  1323. for (i = 0; i < awe_max_voices; i++)
  1324. awe_tweak_voice(i);
  1325. }
  1326. /*
  1327.  *  initializes the FM section of AWE32;
  1328.  *   see Vince Vu's unofficial AWE32 programming guide
  1329.  */
  1330. static void
  1331. awe_init_fm(void)
  1332. {
  1333. #ifndef AWE_ALWAYS_INIT_FM
  1334. /* if no extended memory is on board.. */
  1335. if (memsize <= 0)
  1336. return;
  1337. #endif
  1338. DEBUG(3,printk("AWE32: initializing FMn"));
  1339. /* Initialize the last two channels for DRAM refresh and producing
  1340.    the reverb and chorus effects for Yamaha OPL-3 synthesizer */
  1341. /* 31: FM left channel, 0xffffe0-0xffffe8 */
  1342. awe_poke(AWE_DCYSUSV(30), 0x80);
  1343. awe_poke_dw(AWE_PSST(30), 0xFFFFFFE0); /* full left */
  1344. awe_poke_dw(AWE_CSL(30), 0x00FFFFE8 |
  1345.     (DEF_FM_CHORUS_DEPTH << 24));
  1346. awe_poke_dw(AWE_PTRX(30), (DEF_FM_REVERB_DEPTH << 8));
  1347. awe_poke_dw(AWE_CPF(30), 0);
  1348. awe_poke_dw(AWE_CCCA(30), 0x00FFFFE3);
  1349. /* 32: FM right channel, 0xfffff0-0xfffff8 */
  1350. awe_poke(AWE_DCYSUSV(31), 0x80);
  1351. awe_poke_dw(AWE_PSST(31), 0x00FFFFF0); /* full right */
  1352. awe_poke_dw(AWE_CSL(31), 0x00FFFFF8 |
  1353.     (DEF_FM_CHORUS_DEPTH << 24));
  1354. awe_poke_dw(AWE_PTRX(31), (DEF_FM_REVERB_DEPTH << 8));
  1355. awe_poke_dw(AWE_CPF(31), 0x8000);
  1356. awe_poke_dw(AWE_CCCA(31), 0x00FFFFF3);
  1357. /* skew volume & cutoff */
  1358. awe_poke_dw(AWE_VTFT(30), 0x8000FFFF);
  1359. awe_poke_dw(AWE_VTFT(31), 0x8000FFFF);
  1360. voices[30].state = AWE_ST_FM;
  1361. voices[31].state = AWE_ST_FM;
  1362. /* change maximum channels to 30 */
  1363. awe_max_voices = AWE_NORMAL_VOICES;
  1364. if (playing_mode == AWE_PLAY_DIRECT)
  1365. awe_info.nr_voices = awe_max_voices;
  1366. else
  1367. awe_info.nr_voices = AWE_MAX_CHANNELS;
  1368. voice_alloc->max_voice = awe_max_voices;
  1369. }
  1370. /*
  1371.  *  AWE32 DRAM access routines
  1372.  */
  1373. /* open DRAM write accessing mode */
  1374. static int
  1375. awe_open_dram_for_write(int offset, int channels)
  1376. {
  1377. int vidx[AWE_NORMAL_VOICES];
  1378. int i;
  1379. if (channels < 0 || channels >= AWE_NORMAL_VOICES) {
  1380. channels = AWE_NORMAL_VOICES;
  1381. for (i = 0; i < AWE_NORMAL_VOICES; i++)
  1382. vidx[i] = i;
  1383. } else {
  1384. for (i = 0; i < channels; i++) {
  1385. vidx[i] = awe_clear_voice();
  1386. voices[vidx[i]].state = AWE_ST_MARK;
  1387. }
  1388. }
  1389. /* use all channels for DMA transfer */
  1390. for (i = 0; i < channels; i++) {
  1391. if (vidx[i] < 0) continue;
  1392. awe_poke(AWE_DCYSUSV(vidx[i]), 0x80);
  1393. awe_poke_dw(AWE_VTFT(vidx[i]), 0);
  1394. awe_poke_dw(AWE_CVCF(vidx[i]), 0);
  1395. awe_poke_dw(AWE_PTRX(vidx[i]), 0x40000000);
  1396. awe_poke_dw(AWE_CPF(vidx[i]), 0x40000000);
  1397. awe_poke_dw(AWE_PSST(vidx[i]), 0);
  1398. awe_poke_dw(AWE_CSL(vidx[i]), 0);
  1399. awe_poke_dw(AWE_CCCA(vidx[i]), 0x06000000);
  1400. voices[vidx[i]].state = AWE_ST_DRAM;
  1401. }
  1402. /* point channels 31 & 32 to ROM samples for DRAM refresh */
  1403. awe_poke_dw(AWE_VTFT(30), 0);
  1404. awe_poke_dw(AWE_PSST(30), 0x1d8);
  1405. awe_poke_dw(AWE_CSL(30), 0x1e0);
  1406. awe_poke_dw(AWE_CCCA(30), 0x1d8);
  1407. awe_poke_dw(AWE_VTFT(31), 0);
  1408. awe_poke_dw(AWE_PSST(31), 0x1d8);
  1409. awe_poke_dw(AWE_CSL(31), 0x1e0);
  1410. awe_poke_dw(AWE_CCCA(31), 0x1d8);
  1411. voices[30].state = AWE_ST_FM;
  1412. voices[31].state = AWE_ST_FM;
  1413. /* if full bit is on, not ready to write on */
  1414. if (awe_peek_dw(AWE_SMALW) & 0x80000000) {
  1415. for (i = 0; i < channels; i++) {
  1416. awe_poke_dw(AWE_CCCA(vidx[i]), 0);
  1417. voices[vidx[i]].state = AWE_ST_OFF;
  1418. }
  1419. printk("awe: not ready to write..n");
  1420. return -EPERM;
  1421. }
  1422. /* set address to write */
  1423. awe_poke_dw(AWE_SMALW, offset);
  1424. return 0;
  1425. }
  1426. /* open DRAM for RAM size detection */
  1427. static void
  1428. awe_open_dram_for_check(void)
  1429. {
  1430. int i;
  1431. for (i = 0; i < AWE_NORMAL_VOICES; i++) {
  1432. awe_poke(AWE_DCYSUSV(i), 0x80);
  1433. awe_poke_dw(AWE_VTFT(i), 0);
  1434. awe_poke_dw(AWE_CVCF(i), 0);
  1435. awe_poke_dw(AWE_PTRX(i), 0x40000000);
  1436. awe_poke_dw(AWE_CPF(i), 0x40000000);
  1437. awe_poke_dw(AWE_PSST(i), 0);
  1438. awe_poke_dw(AWE_CSL(i), 0);
  1439. if (i & 1) /* DMA write */
  1440. awe_poke_dw(AWE_CCCA(i), 0x06000000);
  1441. else    /* DMA read */
  1442. awe_poke_dw(AWE_CCCA(i), 0x04000000);
  1443. voices[i].state = AWE_ST_DRAM;
  1444. }
  1445. }
  1446. /* close dram access */
  1447. static void
  1448. awe_close_dram(void)
  1449. {
  1450. int i;
  1451. /* wait until FULL bit in SMAxW register be false */
  1452. for (i = 0; i < 10000; i++) {
  1453. if (!(awe_peek_dw(AWE_SMALW) & 0x80000000))
  1454. break;
  1455. awe_wait(10);
  1456. }
  1457. for (i = 0; i < AWE_NORMAL_VOICES; i++) {
  1458. if (voices[i].state == AWE_ST_DRAM) {
  1459. awe_poke_dw(AWE_CCCA(i), 0);
  1460. awe_poke(AWE_DCYSUSV(i), 0x807F);
  1461. voices[i].state = AWE_ST_OFF;
  1462. }
  1463. }
  1464. }
  1465. /*
  1466.  * detect presence of AWE32 and check memory size
  1467.  */
  1468. /* detect emu8000 chip on the specified address; from VV's guide */
  1469. static int __init
  1470. awe_detect_base(int addr)
  1471. {
  1472. setup_ports(addr, 0, 0);
  1473. if ((awe_peek(AWE_U1) & 0x000F) != 0x000C)
  1474. return 0;
  1475. if ((awe_peek(AWE_HWCF1) & 0x007E) != 0x0058)
  1476. return 0;
  1477. if ((awe_peek(AWE_HWCF2) & 0x0003) != 0x0003)
  1478. return 0;
  1479.         DEBUG(0,printk("AWE32 found at %xn", addr));
  1480. return 1;
  1481. }
  1482. #if defined CONFIG_ISAPNP || defined CONFIG_ISAPNP_MODULE
  1483. static struct isapnp_device_id isapnp_awe_list[] __initdata = {
  1484. { ISAPNP_ANY_ID, ISAPNP_ANY_ID,
  1485. ISAPNP_VENDOR('C','T','L'), ISAPNP_FUNCTION(0x0021),
  1486. (unsigned long)"AWE32 WaveTable" },
  1487. { ISAPNP_ANY_ID, ISAPNP_ANY_ID,
  1488. ISAPNP_VENDOR('C','T','L'), ISAPNP_FUNCTION(0x0022),
  1489. (unsigned long)"AWE64 WaveTable" },
  1490. { ISAPNP_ANY_ID, ISAPNP_ANY_ID,
  1491. ISAPNP_VENDOR('C','T','L'), ISAPNP_FUNCTION(0x0023),
  1492. (unsigned long)"AWE64 Gold WaveTable" },
  1493. {0}
  1494. };
  1495. MODULE_DEVICE_TABLE(isapnp, isapnp_awe_list);
  1496. static struct pci_dev *idev = NULL;
  1497. static int __init awe_probe_isapnp(int *port)
  1498. {
  1499. int i;
  1500. for (i = 0; isapnp_awe_list[i].vendor != 0; i++) {
  1501. while ((idev = isapnp_find_dev(NULL,
  1502.                                isapnp_awe_list[i].vendor,
  1503.                                isapnp_awe_list[i].function,
  1504.                                idev))) {
  1505. if (idev->prepare(idev) < 0)
  1506. continue;
  1507. if (idev->activate(idev) < 0 ||
  1508.     !idev->resource[0].start) {
  1509. idev->deactivate(idev);
  1510. idev->deactivate(idev);
  1511. continue;
  1512. }
  1513. *port = idev->resource[0].start;
  1514. break;
  1515. }
  1516. if (!idev)
  1517. continue;
  1518. printk(KERN_INFO "ISAPnP reports %s at i/o %#xn",
  1519.        (char*)isapnp_awe_list[i].driver_data, *port);
  1520. return 0;
  1521. }
  1522. return -ENODEV;
  1523. }
  1524. static void __exit awe_deactivate_isapnp(void)
  1525. {
  1526. #if 1
  1527. if (idev) {
  1528. idev->deactivate(idev);
  1529. idev = NULL;
  1530. }
  1531. #endif
  1532. }
  1533. #endif
  1534. static int __init
  1535. awe_detect(void)
  1536. {
  1537. int base;
  1538. #if defined CONFIG_ISAPNP || defined CONFIG_ISAPNP_MODULE
  1539. if (isapnp) {
  1540. if (awe_probe_isapnp(&io) < 0) {
  1541. printk(KERN_ERR "AWE32: No ISAPnP cards foundn");
  1542. if (isapnp != -1)
  1543.   return 0;
  1544. } else {
  1545. setup_ports(io, 0, 0);
  1546. return 1;
  1547. }
  1548. }
  1549. #endif /* isapnp */
  1550. if (io) /* use default i/o port value */
  1551. setup_ports(io, 0, 0);
  1552. else { /* probe it */
  1553. for (base = 0x620; base <= 0x680; base += 0x20)
  1554. if (awe_detect_base(base))
  1555. return 1;
  1556. DEBUG(0,printk("AWE32 not foundn"));
  1557. return 0;
  1558. }
  1559. return 1;
  1560. }
  1561. /*
  1562.  * check dram size on AWE board
  1563.  */
  1564. /* any three numbers you like */
  1565. #define UNIQUE_ID1 0x1234
  1566. #define UNIQUE_ID2 0x4321
  1567. #define UNIQUE_ID3 0xABCD
  1568. static void __init
  1569. awe_check_dram(void)
  1570. {
  1571. if (awe_present) /* already initialized */
  1572. return;
  1573. if (memsize >= 0) { /* given by config file or module option */
  1574. memsize *= 1024; /* convert to Kbytes */
  1575. return;
  1576. }
  1577. awe_open_dram_for_check();
  1578. memsize = 0;
  1579. /* set up unique two id numbers */
  1580. awe_poke_dw(AWE_SMALW, AWE_DRAM_OFFSET);
  1581. awe_poke(AWE_SMLD, UNIQUE_ID1);
  1582. awe_poke(AWE_SMLD, UNIQUE_ID2);
  1583. while (memsize < AWE_MAX_DRAM_SIZE) {
  1584. awe_wait(5);
  1585. /* read a data on the DRAM start address */
  1586. awe_poke_dw(AWE_SMALR, AWE_DRAM_OFFSET);
  1587. awe_peek(AWE_SMLD); /* discard stale data  */
  1588. if (awe_peek(AWE_SMLD) != UNIQUE_ID1)
  1589. break;
  1590. if (awe_peek(AWE_SMLD) != UNIQUE_ID2)
  1591. break;
  1592. memsize += 512;  /* increment 512kbytes */
  1593. /* Write a unique data on the test address;
  1594.  * if the address is out of range, the data is written on
  1595.  * 0x200000(=AWE_DRAM_OFFSET).  Then the two id words are
  1596.  * broken by this data.
  1597.  */
  1598. awe_poke_dw(AWE_SMALW, AWE_DRAM_OFFSET + memsize*512L);
  1599. awe_poke(AWE_SMLD, UNIQUE_ID3);
  1600. awe_wait(5);
  1601. /* read a data on the just written DRAM address */
  1602. awe_poke_dw(AWE_SMALR, AWE_DRAM_OFFSET + memsize*512L);
  1603. awe_peek(AWE_SMLD); /* discard stale data  */
  1604. if (awe_peek(AWE_SMLD) != UNIQUE_ID3)
  1605. break;
  1606. }
  1607. awe_close_dram();
  1608. DEBUG(0,printk("AWE32: %d Kbytes memory detectedn", memsize));
  1609. /* convert to Kbytes */
  1610. memsize *= 1024;
  1611. }
  1612. /*----------------------------------------------------------------*/
  1613. /*
  1614.  * chorus and reverb controls; from VV's guide
  1615.  */
  1616. /* 5 parameters for each chorus mode; 3 x 16bit, 2 x 32bit */
  1617. static char chorus_defined[AWE_CHORUS_NUMBERS];
  1618. static awe_chorus_fx_rec chorus_parm[AWE_CHORUS_NUMBERS] = {
  1619. {0xE600, 0x03F6, 0xBC2C ,0x00000000, 0x0000006D}, /* chorus 1 */
  1620. {0xE608, 0x031A, 0xBC6E, 0x00000000, 0x0000017C}, /* chorus 2 */
  1621. {0xE610, 0x031A, 0xBC84, 0x00000000, 0x00000083}, /* chorus 3 */
  1622. {0xE620, 0x0269, 0xBC6E, 0x00000000, 0x0000017C}, /* chorus 4 */
  1623. {0xE680, 0x04D3, 0xBCA6, 0x00000000, 0x0000005B}, /* feedback */
  1624. {0xE6E0, 0x044E, 0xBC37, 0x00000000, 0x00000026}, /* flanger */
  1625. {0xE600, 0x0B06, 0xBC00, 0x0000E000, 0x00000083}, /* short delay */
  1626. {0xE6C0, 0x0B06, 0xBC00, 0x0000E000, 0x00000083}, /* short delay + feedback */
  1627. };
  1628. static int
  1629. awe_load_chorus_fx(awe_patch_info *patch, const char *addr, int count)
  1630. {
  1631. if (patch->optarg < AWE_CHORUS_PREDEFINED || patch->optarg >= AWE_CHORUS_NUMBERS) {
  1632. printk(KERN_WARNING "AWE32 Error: invalid chorus mode %d for uploadingn", patch->optarg);
  1633. return -EINVAL;
  1634. }
  1635. if (count < sizeof(awe_chorus_fx_rec)) {
  1636. printk(KERN_WARNING "AWE32 Error: too short chorus fx parametersn");
  1637. return -EINVAL;
  1638. }
  1639. if (copy_from_user(&chorus_parm[patch->optarg], addr + AWE_PATCH_INFO_SIZE,
  1640.    sizeof(awe_chorus_fx_rec)))
  1641. return -EFAULT;
  1642. chorus_defined[patch->optarg] = TRUE;
  1643. return 0;
  1644. }
  1645. static void
  1646. awe_set_chorus_mode(int effect)
  1647. {
  1648. if (effect < 0 || effect >= AWE_CHORUS_NUMBERS ||
  1649.     (effect >= AWE_CHORUS_PREDEFINED && !chorus_defined[effect]))
  1650. return;
  1651. awe_poke(AWE_INIT3(9), chorus_parm[effect].feedback);
  1652. awe_poke(AWE_INIT3(12), chorus_parm[effect].delay_offset);
  1653. awe_poke(AWE_INIT4(3), chorus_parm[effect].lfo_depth);
  1654. awe_poke_dw(AWE_HWCF4, chorus_parm[effect].delay);
  1655. awe_poke_dw(AWE_HWCF5, chorus_parm[effect].lfo_freq);
  1656. awe_poke_dw(AWE_HWCF6, 0x8000);
  1657. awe_poke_dw(AWE_HWCF7, 0x0000);
  1658. }
  1659. static void
  1660. awe_update_chorus_mode(void)
  1661. {
  1662. awe_set_chorus_mode(ctrls[AWE_MD_CHORUS_MODE]);
  1663. }
  1664. /*----------------------------------------------------------------*/
  1665. /* reverb mode settings; write the following 28 data of 16 bit length
  1666.  *   on the corresponding ports in the reverb_cmds array
  1667.  */
  1668. static char reverb_defined[AWE_CHORUS_NUMBERS];
  1669. static awe_reverb_fx_rec reverb_parm[AWE_REVERB_NUMBERS] = {
  1670. {{  /* room 1 */
  1671. 0xB488, 0xA450, 0x9550, 0x84B5, 0x383A, 0x3EB5, 0x72F4,
  1672. 0x72A4, 0x7254, 0x7204, 0x7204, 0x7204, 0x4416, 0x4516,
  1673. 0xA490, 0xA590, 0x842A, 0x852A, 0x842A, 0x852A, 0x8429,
  1674. 0x8529, 0x8429, 0x8529, 0x8428, 0x8528, 0x8428, 0x8528,
  1675. }},
  1676. {{  /* room 2 */
  1677. 0xB488, 0xA458, 0x9558, 0x84B5, 0x383A, 0x3EB5, 0x7284,
  1678. 0x7254, 0x7224, 0x7224, 0x7254, 0x7284, 0x4448, 0x4548,
  1679. 0xA440, 0xA540, 0x842A, 0x852A, 0x842A, 0x852A, 0x8429,
  1680. 0x8529, 0x8429, 0x8529, 0x8428, 0x8528, 0x8428, 0x8528,
  1681. }},
  1682. {{  /* room 3 */
  1683. 0xB488, 0xA460, 0x9560, 0x84B5, 0x383A, 0x3EB5, 0x7284,
  1684. 0x7254, 0x7224, 0x7224, 0x7254, 0x7284, 0x4416, 0x4516,
  1685. 0xA490, 0xA590, 0x842C, 0x852C, 0x842C, 0x852C, 0x842B,
  1686. 0x852B, 0x842B, 0x852B, 0x842A, 0x852A, 0x842A, 0x852A,
  1687. }},
  1688. {{  /* hall 1 */
  1689. 0xB488, 0xA470, 0x9570, 0x84B5, 0x383A, 0x3EB5, 0x7284,
  1690. 0x7254, 0x7224, 0x7224, 0x7254, 0x7284, 0x4448, 0x4548,
  1691. 0xA440, 0xA540, 0x842B, 0x852B, 0x842B, 0x852B, 0x842A,
  1692. 0x852A, 0x842A, 0x852A, 0x8429, 0x8529, 0x8429, 0x8529,
  1693. }},
  1694. {{  /* hall 2 */
  1695. 0xB488, 0xA470, 0x9570, 0x84B5, 0x383A, 0x3EB5, 0x7254,
  1696. 0x7234, 0x7224, 0x7254, 0x7264, 0x7294, 0x44C3, 0x45C3,
  1697. 0xA404, 0xA504, 0x842A, 0x852A, 0x842A, 0x852A, 0x8429,
  1698. 0x8529, 0x8429, 0x8529, 0x8428, 0x8528, 0x8428, 0x8528,
  1699. }},
  1700. {{  /* plate */
  1701. 0xB4FF, 0xA470, 0x9570, 0x84B5, 0x383A, 0x3EB5, 0x7234,
  1702. 0x7234, 0x7234, 0x7234, 0x7234, 0x7234, 0x4448, 0x4548,
  1703. 0xA440, 0xA540, 0x842A, 0x852A, 0x842A, 0x852A, 0x8429,
  1704. 0x8529, 0x8429, 0x8529, 0x8428, 0x8528, 0x8428, 0x8528,
  1705. }},
  1706. {{  /* delay */
  1707. 0xB4FF, 0xA470, 0x9500, 0x84B5, 0x333A, 0x39B5, 0x7204,
  1708. 0x7204, 0x7204, 0x7204, 0x7204, 0x72F4, 0x4400, 0x4500,
  1709. 0xA4FF, 0xA5FF, 0x8420, 0x8520, 0x8420, 0x8520, 0x8420,
  1710. 0x8520, 0x8420, 0x8520, 0x8420, 0x8520, 0x8420, 0x8520,
  1711. }},
  1712. {{  /* panning delay */
  1713. 0xB4FF, 0xA490, 0x9590, 0x8474, 0x333A, 0x39B5, 0x7204,
  1714. 0x7204, 0x7204, 0x7204, 0x7204, 0x72F4, 0x4400, 0x4500,
  1715. 0xA4FF, 0xA5FF, 0x8420, 0x8520, 0x8420, 0x8520, 0x8420,
  1716. 0x8520, 0x8420, 0x8520, 0x8420, 0x8520, 0x8420, 0x8520,
  1717. }},
  1718. };
  1719. static struct ReverbCmdPair {
  1720. unsigned short cmd, port;
  1721. } reverb_cmds[28] = {
  1722.   {AWE_INIT1(0x03)}, {AWE_INIT1(0x05)}, {AWE_INIT4(0x1F)}, {AWE_INIT1(0x07)},
  1723.   {AWE_INIT2(0x14)}, {AWE_INIT2(0x16)}, {AWE_INIT1(0x0F)}, {AWE_INIT1(0x17)},
  1724.   {AWE_INIT1(0x1F)}, {AWE_INIT2(0x07)}, {AWE_INIT2(0x0F)}, {AWE_INIT2(0x17)},
  1725.   {AWE_INIT2(0x1D)}, {AWE_INIT2(0x1F)}, {AWE_INIT3(0x01)}, {AWE_INIT3(0x03)},
  1726.   {AWE_INIT1(0x09)}, {AWE_INIT1(0x0B)}, {AWE_INIT1(0x11)}, {AWE_INIT1(0x13)},
  1727.   {AWE_INIT1(0x19)}, {AWE_INIT1(0x1B)}, {AWE_INIT2(0x01)}, {AWE_INIT2(0x03)},
  1728.   {AWE_INIT2(0x09)}, {AWE_INIT2(0x0B)}, {AWE_INIT2(0x11)}, {AWE_INIT2(0x13)},
  1729. };
  1730. static int
  1731. awe_load_reverb_fx(awe_patch_info *patch, const char *addr, int count)
  1732. {
  1733. if (patch->optarg < AWE_REVERB_PREDEFINED || patch->optarg >= AWE_REVERB_NUMBERS) {
  1734. printk(KERN_WARNING "AWE32 Error: invalid reverb mode %d for uploadingn", patch->optarg);
  1735. return -EINVAL;
  1736. }
  1737. if (count < sizeof(awe_reverb_fx_rec)) {
  1738. printk(KERN_WARNING "AWE32 Error: too short reverb fx parametersn");
  1739. return -EINVAL;
  1740. }
  1741. if (copy_from_user(&reverb_parm[patch->optarg], addr + AWE_PATCH_INFO_SIZE,
  1742.    sizeof(awe_reverb_fx_rec)))
  1743. return -EFAULT;
  1744. reverb_defined[patch->optarg] = TRUE;
  1745. return 0;
  1746. }
  1747. static void
  1748. awe_set_reverb_mode(int effect)
  1749. {
  1750. int i;
  1751. if (effect < 0 || effect >= AWE_REVERB_NUMBERS ||
  1752.     (effect >= AWE_REVERB_PREDEFINED && !reverb_defined[effect]))
  1753. return;
  1754. for (i = 0; i < 28; i++)
  1755. awe_poke(reverb_cmds[i].cmd, reverb_cmds[i].port,
  1756.  reverb_parm[effect].parms[i]);
  1757. }
  1758. static void
  1759. awe_update_reverb_mode(void)
  1760. {
  1761. awe_set_reverb_mode(ctrls[AWE_MD_REVERB_MODE]);
  1762. }
  1763. /*
  1764.  * treble/bass equalizer control
  1765.  */
  1766. static unsigned short bass_parm[12][3] = {
  1767. {0xD26A, 0xD36A, 0x0000}, /* -12 dB */
  1768. {0xD25B, 0xD35B, 0x0000}, /*  -8 */
  1769. {0xD24C, 0xD34C, 0x0000}, /*  -6 */
  1770. {0xD23D, 0xD33D, 0x0000}, /*  -4 */
  1771. {0xD21F, 0xD31F, 0x0000}, /*  -2 */
  1772. {0xC208, 0xC308, 0x0001}, /*   0 (HW default) */
  1773. {0xC219, 0xC319, 0x0001}, /*  +2 */
  1774. {0xC22A, 0xC32A, 0x0001}, /*  +4 */
  1775. {0xC24C, 0xC34C, 0x0001}, /*  +6 */
  1776. {0xC26E, 0xC36E, 0x0001}, /*  +8 */
  1777. {0xC248, 0xC348, 0x0002}, /* +10 */
  1778. {0xC26A, 0xC36A, 0x0002}, /* +12 dB */
  1779. };
  1780. static unsigned short treble_parm[12][9] = {
  1781. {0x821E, 0xC26A, 0x031E, 0xC36A, 0x021E, 0xD208, 0x831E, 0xD308, 0x0001}, /* -12 dB */
  1782. {0x821E, 0xC25B, 0x031E, 0xC35B, 0x021E, 0xD208, 0x831E, 0xD308, 0x0001},
  1783. {0x821E, 0xC24C, 0x031E, 0xC34C, 0x021E, 0xD208, 0x831E, 0xD308, 0x0001},
  1784. {0x821E, 0xC23D, 0x031E, 0xC33D, 0x021E, 0xD208, 0x831E, 0xD308, 0x0001},
  1785. {0x821E, 0xC21F, 0x031E, 0xC31F, 0x021E, 0xD208, 0x831E, 0xD308, 0x0001},
  1786. {0x821E, 0xD208, 0x031E, 0xD308, 0x021E, 0xD208, 0x831E, 0xD308, 0x0002},
  1787. {0x821E, 0xD208, 0x031E, 0xD308, 0x021D, 0xD219, 0x831D, 0xD319, 0x0002},
  1788. {0x821E, 0xD208, 0x031E, 0xD308, 0x021C, 0xD22A, 0x831C, 0xD32A, 0x0002},
  1789. {0x821E, 0xD208, 0x031E, 0xD308, 0x021A, 0xD24C, 0x831A, 0xD34C, 0x0002},
  1790. {0x821E, 0xD208, 0x031E, 0xD308, 0x0219, 0xD26E, 0x8319, 0xD36E, 0x0002}, /* +8 (HW default) */
  1791. {0x821D, 0xD219, 0x031D, 0xD319, 0x0219, 0xD26E, 0x8319, 0xD36E, 0x0002},
  1792. {0x821C, 0xD22A, 0x031C, 0xD32A, 0x0219, 0xD26E, 0x8319, 0xD36E, 0x0002}, /* +12 dB */
  1793. };
  1794. /*
  1795.  * set Emu8000 digital equalizer; from 0 to 11 [-12dB - 12dB]
  1796.  */
  1797. static void
  1798. awe_equalizer(int bass, int treble)
  1799. {
  1800. unsigned short w;
  1801. if (bass < 0 || bass > 11 || treble < 0 || treble > 11)
  1802. return;
  1803. awe_poke(AWE_INIT4(0x01), bass_parm[bass][0]);
  1804. awe_poke(AWE_INIT4(0x11), bass_parm[bass][1]);
  1805. awe_poke(AWE_INIT3(0x11), treble_parm[treble][0]);
  1806. awe_poke(AWE_INIT3(0x13), treble_parm[treble][1]);
  1807. awe_poke(AWE_INIT3(0x1B), treble_parm[treble][2]);
  1808. awe_poke(AWE_INIT4(0x07), treble_parm[treble][3]);
  1809. awe_poke(AWE_INIT4(0x0B), treble_parm[treble][4]);
  1810. awe_poke(AWE_INIT4(0x0D), treble_parm[treble][5]);
  1811. awe_poke(AWE_INIT4(0x17), treble_parm[treble][6]);
  1812. awe_poke(AWE_INIT4(0x19), treble_parm[treble][7]);
  1813. w = bass_parm[bass][2] + treble_parm[treble][8];
  1814. awe_poke(AWE_INIT4(0x15), (unsigned short)(w + 0x0262));
  1815. awe_poke(AWE_INIT4(0x1D), (unsigned short)(w + 0x8362));
  1816. }
  1817. static void awe_update_equalizer(void)
  1818. {
  1819. awe_equalizer(ctrls[AWE_MD_BASS_LEVEL], ctrls[AWE_MD_TREBLE_LEVEL]);
  1820. }
  1821. /*----------------------------------------------------------------*/
  1822. #ifdef CONFIG_AWE32_MIDIEMU
  1823. /*
  1824.  * Emu8000 MIDI Emulation
  1825.  */
  1826. /*
  1827.  * midi queue record
  1828.  */
  1829. /* queue type */
  1830. enum { Q_NONE, Q_VARLEN, Q_READ, Q_SYSEX, };
  1831. #define MAX_MIDIBUF 64
  1832. /* midi status */
  1833. typedef struct MidiStatus {
  1834. int queue; /* queue type */
  1835. int qlen; /* queue length */
  1836. int read; /* chars read */
  1837. int status; /* current status */
  1838. int chan; /* current channel */
  1839. unsigned char buf[MAX_MIDIBUF];
  1840. } MidiStatus;
  1841. /* MIDI mode type */
  1842. enum { MODE_GM, MODE_GS, MODE_XG, };
  1843. /* NRPN / CC -> Emu8000 parameter converter */
  1844. typedef struct {
  1845. int control;
  1846. int awe_effect;
  1847. unsigned short (*convert)(int val);
  1848. } ConvTable;
  1849. /*
  1850.  * prototypes
  1851.  */
  1852. static int awe_midi_open(int dev, int mode, void (*input)(int,unsigned char), void (*output)(int));
  1853. static void awe_midi_close(int dev);
  1854. static int awe_midi_ioctl(int dev, unsigned cmd, caddr_t arg);
  1855. static int awe_midi_outputc(int dev, unsigned char midi_byte);
  1856. static void init_midi_status(MidiStatus *st);
  1857. static void clear_rpn(void);
  1858. static void get_midi_char(MidiStatus *st, int c);
  1859. /*static void queue_varlen(MidiStatus *st, int c);*/
  1860. static void special_event(MidiStatus *st, int c);
  1861. static void queue_read(MidiStatus *st, int c);
  1862. static void midi_note_on(MidiStatus *st);
  1863. static void midi_note_off(MidiStatus *st);
  1864. static void midi_key_pressure(MidiStatus *st);
  1865. static void midi_channel_pressure(MidiStatus *st);
  1866. static void midi_pitch_wheel(MidiStatus *st);
  1867. static void midi_program_change(MidiStatus *st);
  1868. static void midi_control_change(MidiStatus *st);
  1869. static void midi_select_bank(MidiStatus *st, int val);
  1870. static void midi_nrpn_event(MidiStatus *st);
  1871. static void midi_rpn_event(MidiStatus *st);
  1872. static void midi_detune(int chan, int coarse, int fine);
  1873. static void midi_system_exclusive(MidiStatus *st);
  1874. static int send_converted_effect(ConvTable *table, int num_tables, MidiStatus *st, int type, int val);
  1875. static int add_converted_effect(ConvTable *table, int num_tables, MidiStatus *st, int type, int val);
  1876. static int xg_control_change(MidiStatus *st, int cmd, int val);
  1877. #define numberof(ary) (sizeof(ary)/sizeof(ary[0]))
  1878. /*
  1879.  * OSS Midi device record
  1880.  */
  1881. static struct midi_operations awe_midi_operations =
  1882. {
  1883. owner: THIS_MODULE,
  1884. info: {"AWE Midi Emu", 0, 0, SNDCARD_SB},
  1885. in_info: {0},
  1886. open: awe_midi_open, /*open*/
  1887. close: awe_midi_close, /*close*/
  1888. ioctl: awe_midi_ioctl, /*ioctl*/
  1889. outputc: awe_midi_outputc, /*outputc*/
  1890. };
  1891. static int my_mididev = -1;
  1892. static void __init attach_midiemu(void)
  1893. {
  1894. if ((my_mididev = sound_alloc_mididev()) < 0)
  1895. printk ("Sound: Too many midi devices detectedn");
  1896. else
  1897. midi_devs[my_mididev] = &awe_midi_operations;
  1898. }
  1899. static void __exit unload_midiemu(void)
  1900. {
  1901. if (my_mididev >= 0)
  1902. sound_unload_mididev(my_mididev);
  1903. }
  1904. /*
  1905.  * open/close midi device
  1906.  */
  1907. static int midi_opened = FALSE;
  1908. static int midi_mode;
  1909. static int coarsetune = 0, finetune = 0;
  1910. static int xg_mapping = TRUE;
  1911. static int xg_bankmode = 0;
  1912. /* effect sensitivity */
  1913. #define FX_CUTOFF 0
  1914. #define FX_RESONANCE 1
  1915. #define FX_ATTACK 2
  1916. #define FX_RELEASE 3
  1917. #define FX_VIBRATE 4
  1918. #define FX_VIBDEPTH 5
  1919. #define FX_VIBDELAY 6
  1920. #define FX_NUMS 7
  1921. #define DEF_FX_CUTOFF 170
  1922. #define DEF_FX_RESONANCE 6
  1923. #define DEF_FX_ATTACK 50
  1924. #define DEF_FX_RELEASE 50
  1925. #define DEF_FX_VIBRATE 30
  1926. #define DEF_FX_VIBDEPTH 4
  1927. #define DEF_FX_VIBDELAY 1500
  1928. /* effect sense: */
  1929. static int gs_sense[] = 
  1930. {
  1931. DEF_FX_CUTOFF, DEF_FX_RESONANCE, DEF_FX_ATTACK, DEF_FX_RELEASE,
  1932. DEF_FX_VIBRATE, DEF_FX_VIBDEPTH, DEF_FX_VIBDELAY
  1933. };
  1934. static int xg_sense[] = 
  1935. {
  1936. DEF_FX_CUTOFF, DEF_FX_RESONANCE, DEF_FX_ATTACK, DEF_FX_RELEASE,
  1937. DEF_FX_VIBRATE, DEF_FX_VIBDEPTH, DEF_FX_VIBDELAY
  1938. };
  1939. /* current status */
  1940. static MidiStatus curst;
  1941. static int
  1942. awe_midi_open (int dev, int mode,
  1943.        void (*input)(int,unsigned char),
  1944.        void (*output)(int))
  1945. {
  1946. if (midi_opened)
  1947. return -EBUSY;
  1948. midi_opened = TRUE;
  1949. midi_mode = MODE_GM;
  1950. curst.queue = Q_NONE;
  1951. curst.qlen = 0;
  1952. curst.read = 0;
  1953. curst.status = 0;
  1954. curst.chan = 0;
  1955. memset(curst.buf, 0, sizeof(curst.buf));
  1956. init_midi_status(&curst);
  1957. return 0;
  1958. }
  1959. static void
  1960. awe_midi_close (int dev)
  1961. {
  1962. midi_opened = FALSE;
  1963. }
  1964. static int
  1965. awe_midi_ioctl (int dev, unsigned cmd, caddr_t arg)
  1966. {
  1967. return -EPERM;
  1968. }
  1969. static int
  1970. awe_midi_outputc (int dev, unsigned char midi_byte)
  1971. {
  1972. if (! midi_opened)
  1973. return 1;
  1974. /* force to change playing mode */
  1975. playing_mode = AWE_PLAY_MULTI;
  1976. get_midi_char(&curst, midi_byte);
  1977. return 1;
  1978. }
  1979. /*
  1980.  * initialize
  1981.  */
  1982. static void init_midi_status(MidiStatus *st)
  1983. {
  1984. clear_rpn();
  1985. coarsetune = 0;
  1986. finetune = 0;
  1987. }
  1988. /*
  1989.  * RPN & NRPN
  1990.  */
  1991. #define MAX_MIDI_CHANNELS 16
  1992. /* RPN & NRPN */
  1993. static unsigned char nrpn[MAX_MIDI_CHANNELS];  /* current event is NRPN? */
  1994. static int msb_bit;  /* current event is msb for RPN/NRPN */
  1995. /* RPN & NRPN indeces */
  1996. static unsigned char rpn_msb[MAX_MIDI_CHANNELS], rpn_lsb[MAX_MIDI_CHANNELS];
  1997. /* RPN & NRPN values */
  1998. static int rpn_val[MAX_MIDI_CHANNELS];
  1999. static void clear_rpn(void)
  2000. {
  2001. int i;
  2002. for (i = 0; i < MAX_MIDI_CHANNELS; i++) {
  2003. nrpn[i] = 0;
  2004. rpn_msb[i] = 127;
  2005. rpn_lsb[i] = 127;
  2006. rpn_val[i] = 0;
  2007. }
  2008. msb_bit = 0;
  2009. }
  2010. /*
  2011.  * process midi queue
  2012.  */
  2013. /* status event types */
  2014. typedef void (*StatusEvent)(MidiStatus *st);
  2015. static struct StatusEventList {
  2016. StatusEvent process;
  2017. int qlen;
  2018. } status_event[8] = {
  2019. {midi_note_off, 2},
  2020. {midi_note_on, 2},
  2021. {midi_key_pressure, 2},
  2022. {midi_control_change, 2},
  2023. {midi_program_change, 1},
  2024. {midi_channel_pressure, 1},
  2025. {midi_pitch_wheel, 2},
  2026. {NULL, 0},
  2027. };
  2028. /* read a char from fifo and process it */
  2029. static void get_midi_char(MidiStatus *st, int c)
  2030. {
  2031. if (c == 0xfe) {
  2032. /* ignore active sense */
  2033. st->queue = Q_NONE;
  2034. return;
  2035. }
  2036. switch (st->queue) {
  2037. /* case Q_VARLEN: queue_varlen(st, c); break;*/
  2038. case Q_READ:
  2039. case Q_SYSEX:
  2040. queue_read(st, c);
  2041. break;
  2042. case Q_NONE:
  2043. st->read = 0;
  2044. if ((c & 0xf0) == 0xf0) {
  2045. special_event(st, c);
  2046. } else if (c & 0x80) { /* status change */
  2047. st->status = (c >> 4) & 0x07;
  2048. st->chan = c & 0x0f;
  2049. st->queue = Q_READ;
  2050. st->qlen = status_event[st->status].qlen;
  2051. if (st->qlen == 0)
  2052. st->queue = Q_NONE;
  2053. }
  2054. break;
  2055. }
  2056. }
  2057. /* 0xfx events */
  2058. static void special_event(MidiStatus *st, int c)
  2059. {
  2060. switch (c) {
  2061. case 0xf0: /* system exclusive */
  2062. st->queue = Q_SYSEX;
  2063. st->qlen = 0;
  2064. break;
  2065. case 0xf1: /* MTC quarter frame */
  2066. case 0xf3: /* song select */
  2067. st->queue = Q_READ;
  2068. st->qlen = 1;
  2069. break;
  2070. case 0xf2: /* song position */
  2071. st->queue = Q_READ;
  2072. st->qlen = 2;
  2073. break;
  2074. }
  2075. }
  2076. #if 0
  2077. /* read variable length value */
  2078. static void queue_varlen(MidiStatus *st, int c)
  2079. {
  2080. st->qlen += (c & 0x7f);
  2081. if (c & 0x80) {
  2082. st->qlen <<= 7;
  2083. return;
  2084. }
  2085. if (st->qlen <= 0) {
  2086. st->qlen = 0;
  2087. st->queue = Q_NONE;
  2088. }
  2089. st->queue = Q_READ;
  2090. st->read = 0;
  2091. }
  2092. #endif
  2093. /* read a char */
  2094. static void queue_read(MidiStatus *st, int c)
  2095. {
  2096. if (st->read < MAX_MIDIBUF) {
  2097. if (st->queue != Q_SYSEX)
  2098. c &= 0x7f;
  2099. st->buf[st->read] = (unsigned char)c;
  2100. }
  2101. st->read++;
  2102. if (st->queue == Q_SYSEX && c == 0xf7) {
  2103. midi_system_exclusive(st);
  2104. st->queue = Q_NONE;
  2105. } else if (st->queue == Q_READ && st->read >= st->qlen) {
  2106. if (status_event[st->status].process)
  2107. status_event[st->status].process(st);
  2108. st->queue = Q_NONE;
  2109. }
  2110. }
  2111. /*
  2112.  * status events
  2113.  */
  2114. /* note on */
  2115. static void midi_note_on(MidiStatus *st)
  2116. {
  2117. DEBUG(2,printk("midi: note_on (%d) %d %dn", st->chan, st->buf[0], st->buf[1]));
  2118. if (st->buf[1] == 0)
  2119. midi_note_off(st);
  2120. else
  2121. awe_start_note(0, st->chan, st->buf[0], st->buf[1]);
  2122. }
  2123. /* note off */
  2124. static void midi_note_off(MidiStatus *st)
  2125. {
  2126. DEBUG(2,printk("midi: note_off (%d) %d %dn", st->chan, st->buf[0], st->buf[1]));
  2127. awe_kill_note(0, st->chan, st->buf[0], st->buf[1]);
  2128. }
  2129. /* key pressure change */
  2130. static void midi_key_pressure(MidiStatus *st)
  2131. {
  2132. awe_key_pressure(0, st->chan, st->buf[0], st->buf[1]);
  2133. }
  2134. /* channel pressure change */
  2135. static void midi_channel_pressure(MidiStatus *st)
  2136. {
  2137. channels[st->chan].chan_press = st->buf[0];
  2138. awe_modwheel_change(st->chan, st->buf[0]);
  2139. }
  2140. /* pitch wheel change */
  2141. static void midi_pitch_wheel(MidiStatus *st)
  2142. {
  2143. int val = (int)st->buf[1] * 128 + st->buf[0];
  2144. awe_bender(0, st->chan, val);
  2145. }
  2146. /* program change */
  2147. static void midi_program_change(MidiStatus *st)
  2148. {
  2149. int preset;
  2150. preset = st->buf[0];
  2151. if (midi_mode == MODE_GS && IS_DRUM_CHANNEL(st->chan) && preset == 127)
  2152. preset = 0;
  2153. else if (midi_mode == MODE_XG && xg_mapping && IS_DRUM_CHANNEL(st->chan))
  2154. preset += 64;
  2155. awe_set_instr(0, st->chan, preset);
  2156. }
  2157. #define send_effect(chan,type,val) awe_send_effect(chan,-1,type,val)
  2158. #define add_effect(chan,type,val) awe_send_effect(chan,-1,(type)|0x80,val)
  2159. #define unset_effect(chan,type) awe_send_effect(chan,-1,(type)|0x40,0)
  2160. /* midi control change */
  2161. static void midi_control_change(MidiStatus *st)
  2162. {
  2163. int cmd = st->buf[0];
  2164. int val = st->buf[1];
  2165. DEBUG(2,printk("midi: control (%d) %d %dn", st->chan, cmd, val));
  2166. if (midi_mode == MODE_XG) {
  2167. if (xg_control_change(st, cmd, val))
  2168. return;
  2169. }
  2170. /* controls #31 - #64 are LSB of #0 - #31 */
  2171. msb_bit = 1;
  2172. if (cmd >= 0x20 && cmd < 0x40) {
  2173. msb_bit = 0;
  2174. cmd -= 0x20;
  2175. }
  2176. switch (cmd) {
  2177. case CTL_SOFT_PEDAL:
  2178. if (val == 127)
  2179. add_effect(st->chan, AWE_FX_CUTOFF, -160);
  2180. else
  2181. unset_effect(st->chan, AWE_FX_CUTOFF);
  2182. break;
  2183. case CTL_BANK_SELECT:
  2184. midi_select_bank(st, val);
  2185. break;
  2186. /* set RPN/NRPN parameter */
  2187. case CTL_REGIST_PARM_NUM_MSB:
  2188. nrpn[st->chan]=0; rpn_msb[st->chan]=val;
  2189. break;
  2190. case CTL_REGIST_PARM_NUM_LSB:
  2191. nrpn[st->chan]=0; rpn_lsb[st->chan]=val;
  2192. break;
  2193. case CTL_NONREG_PARM_NUM_MSB:
  2194. nrpn[st->chan]=1; rpn_msb[st->chan]=val;
  2195. break;
  2196. case CTL_NONREG_PARM_NUM_LSB:
  2197. nrpn[st->chan]=1; rpn_lsb[st->chan]=val;
  2198. break;
  2199. /* send RPN/NRPN entry */
  2200. case CTL_DATA_ENTRY:
  2201. if (msb_bit)
  2202. rpn_val[st->chan] = val * 128;
  2203. else
  2204. rpn_val[st->chan] |= val;
  2205. if (nrpn[st->chan])
  2206. midi_nrpn_event(st);
  2207. else
  2208. midi_rpn_event(st);
  2209. break;
  2210. /* increase/decrease data entry */
  2211. case CTL_DATA_INCREMENT:
  2212. rpn_val[st->chan]++;
  2213. midi_rpn_event(st);
  2214. break;
  2215. case CTL_DATA_DECREMENT:
  2216. rpn_val[st->chan]--;
  2217. midi_rpn_event(st);
  2218. break;
  2219. /* default */
  2220. default:
  2221. awe_controller(0, st->chan, cmd, val);
  2222. break;
  2223. }
  2224. }
  2225. /* tone bank change */
  2226. static void midi_select_bank(MidiStatus *st, int val)
  2227. {
  2228. if (midi_mode == MODE_XG && msb_bit) {
  2229. xg_bankmode = val;
  2230. /* XG MSB value; not normal bank selection */
  2231. switch (val) {
  2232. case 127: /* remap to drum channel */
  2233. awe_controller(0, st->chan, CTL_BANK_SELECT, 128);
  2234. break;
  2235. default: /* remap to normal channel */
  2236. awe_controller(0, st->chan, CTL_BANK_SELECT, val);
  2237. break;
  2238. }
  2239. return;
  2240. } else if (midi_mode == MODE_GS && !msb_bit)
  2241. /* ignore LSB bank in GS mode (used for mapping) */
  2242. return;
  2243. /* normal bank controls; accept both MSB and LSB */
  2244. if (! IS_DRUM_CHANNEL(st->chan)) {
  2245. if (midi_mode == MODE_XG) {
  2246. if (xg_bankmode) return;
  2247. if (val == 64 || val == 126)
  2248. val = 0;
  2249. } else if (midi_mode == MODE_GS && val == 127)
  2250. val = 0;
  2251. awe_controller(0, st->chan, CTL_BANK_SELECT, val);
  2252. }
  2253. }
  2254. /*
  2255.  * RPN events
  2256.  */
  2257. static void midi_rpn_event(MidiStatus *st)
  2258. {
  2259. int type;
  2260. type = (rpn_msb[st->chan]<<8) | rpn_lsb[st->chan];
  2261. switch (type) {
  2262. case 0x0000: /* Pitch bend sensitivity */
  2263. /* MSB only / 1 semitone per 128 */
  2264. if (msb_bit) {
  2265. channels[st->chan].bender_range = 
  2266. rpn_val[st->chan] * 100 / 128;
  2267. }
  2268. break;
  2269. case 0x0001: /* fine tuning: */
  2270. /* MSB/LSB, 8192=center, 100/8192 cent step */
  2271. finetune = rpn_val[st->chan] - 8192;
  2272. midi_detune(st->chan, coarsetune, finetune);
  2273. break;
  2274. case 0x0002: /* coarse tuning */
  2275. /* MSB only / 8192=center, 1 semitone per 128 */
  2276. if (msb_bit) {
  2277. coarsetune = rpn_val[st->chan] - 8192;
  2278. midi_detune(st->chan, coarsetune, finetune);
  2279. }
  2280. break;
  2281. case 0x7F7F: /* "lock-in" RPN */
  2282. break;
  2283. }
  2284. }
  2285. /* tuning:
  2286.  *   coarse = -8192 to 8192 (100 cent per 128)
  2287.  *   fine = -8192 to 8192 (max=100cent)
  2288.  */
  2289. static void midi_detune(int chan, int coarse, int fine)
  2290. {
  2291. /* 4096 = 1200 cents in AWE parameter */
  2292. int val;
  2293. val = coarse * 4096 / (12 * 128);
  2294. val += fine / 24;
  2295. if (val)
  2296. send_effect(chan, AWE_FX_INIT_PITCH, val);
  2297. else
  2298. unset_effect(chan, AWE_FX_INIT_PITCH);
  2299. }
  2300. /*
  2301.  * system exclusive message
  2302.  * GM/GS/XG macros are accepted
  2303.  */
  2304. static void midi_system_exclusive(MidiStatus *st)
  2305. {
  2306. /* GM on */
  2307. static unsigned char gm_on_macro[] = {
  2308. 0x7e,0x7f,0x09,0x01,
  2309. };
  2310. /* XG on */
  2311. static unsigned char xg_on_macro[] = {
  2312. 0x43,0x10,0x4c,0x00,0x00,0x7e,0x00,
  2313. };
  2314. /* GS prefix
  2315.  * drum channel: XX=0x1?(channel), YY=0x15, ZZ=on/off
  2316.  * reverb mode: XX=0x01, YY=0x30, ZZ=0-7
  2317.  * chorus mode: XX=0x01, YY=0x38, ZZ=0-7
  2318.  */
  2319. static unsigned char gs_pfx_macro[] = {
  2320. 0x41,0x10,0x42,0x12,0x40,/*XX,YY,ZZ*/
  2321. };
  2322. #if 0
  2323. /* SC88 system mode set
  2324.  * single module mode: XX=1
  2325.  * double module mode: XX=0
  2326.  */
  2327. static unsigned char gs_mode_macro[] = {
  2328. 0x41,0x10,0x42,0x12,0x00,0x00,0x7F,/*ZZ*/
  2329. };
  2330. /* SC88 display macro: XX=01:bitmap, 00:text
  2331.  */
  2332. static unsigned char gs_disp_macro[] = {
  2333. 0x41,0x10,0x45,0x12,0x10,/*XX,00*/
  2334. };
  2335. #endif
  2336. /* GM on */
  2337. if (memcmp(st->buf, gm_on_macro, sizeof(gm_on_macro)) == 0) {
  2338. if (midi_mode != MODE_GS && midi_mode != MODE_XG)
  2339. midi_mode = MODE_GM;
  2340. init_midi_status(st);
  2341. }
  2342. /* GS macros */
  2343. else if (memcmp(st->buf, gs_pfx_macro, sizeof(gs_pfx_macro)) == 0) {
  2344. if (midi_mode != MODE_GS && midi_mode != MODE_XG)
  2345. midi_mode = MODE_GS;
  2346. if (st->buf[5] == 0x00 && st->buf[6] == 0x7f && st->buf[7] == 0x00) {
  2347. /* GS reset */
  2348. init_midi_status(st);
  2349. }
  2350. else if ((st->buf[5] & 0xf0) == 0x10 && st->buf[6] == 0x15) {
  2351. /* drum pattern */
  2352. int p = st->buf[5] & 0x0f;
  2353. if (p == 0) p = 9;
  2354. else if (p < 10) p--;
  2355. if (st->buf[7] == 0)
  2356. DRUM_CHANNEL_OFF(p);
  2357. else
  2358. DRUM_CHANNEL_ON(p);
  2359. } else if ((st->buf[5] & 0xf0) == 0x10 && st->buf[6] == 0x21) {
  2360. /* program */
  2361. int p = st->buf[5] & 0x0f;
  2362. if (p == 0) p = 9;
  2363. else if (p < 10) p--;
  2364. if (! IS_DRUM_CHANNEL(p))
  2365. awe_set_instr(0, p, st->buf[7]);
  2366. } else if (st->buf[5] == 0x01 && st->buf[6] == 0x30) {
  2367. /* reverb mode */
  2368. awe_set_reverb_mode(st->buf[7]);
  2369. } else if (st->buf[5] == 0x01 && st->buf[6] == 0x38) {
  2370. /* chorus mode */
  2371. awe_set_chorus_mode(st->buf[7]);
  2372. } else if (st->buf[5] == 0x00 && st->buf[6] == 0x04) {
  2373. /* master volume */
  2374. awe_change_master_volume(st->buf[7]);
  2375. }
  2376. }
  2377. /* XG on */
  2378. else if (memcmp(st->buf, xg_on_macro, sizeof(xg_on_macro)) == 0) {
  2379. midi_mode = MODE_XG;
  2380. xg_mapping = TRUE;
  2381. xg_bankmode = 0;
  2382. }
  2383. }
  2384. /*----------------------------------------------------------------*/
  2385. /*
  2386.  * convert NRPN/control values
  2387.  */
  2388. static int send_converted_effect(ConvTable *table, int num_tables, MidiStatus *st, int type, int val)
  2389. {
  2390. int i, cval;
  2391. for (i = 0; i < num_tables; i++) {
  2392. if (table[i].control == type) {
  2393. cval = table[i].convert(val);
  2394. send_effect(st->chan, table[i].awe_effect, cval);
  2395. return TRUE;
  2396. }
  2397. }
  2398. return FALSE;
  2399. }
  2400. static int add_converted_effect(ConvTable *table, int num_tables, MidiStatus *st, int type, int val)
  2401. {
  2402. int i, cval;
  2403. for (i = 0; i < num_tables; i++) {
  2404. if (table[i].control == type) {
  2405. cval = table[i].convert(val);
  2406. add_effect(st->chan, table[i].awe_effect|0x80, cval);
  2407. return TRUE;
  2408. }
  2409. }
  2410. return FALSE;
  2411. }
  2412. /*
  2413.  * AWE32 NRPN effects
  2414.  */
  2415. static unsigned short fx_delay(int val);
  2416. static unsigned short fx_attack(int val);
  2417. static unsigned short fx_hold(int val);
  2418. static unsigned short fx_decay(int val);
  2419. static unsigned short fx_the_value(int val);
  2420. static unsigned short fx_twice_value(int val);
  2421. static unsigned short fx_conv_pitch(int val);
  2422. static unsigned short fx_conv_Q(int val);
  2423. /* function for each NRPN */ /* [range]  units */
  2424. #define fx_env1_delay fx_delay /* [0,5900] 4msec */
  2425. #define fx_env1_attack fx_attack /* [0,5940] 1msec */
  2426. #define fx_env1_hold fx_hold /* [0,8191] 1msec */
  2427. #define fx_env1_decay fx_decay /* [0,5940] 4msec */
  2428. #define fx_env1_release fx_decay /* [0,5940] 4msec */
  2429. #define fx_env1_sustain fx_the_value /* [0,127] 0.75dB */
  2430. #define fx_env1_pitch fx_the_value /* [-127,127] 9.375cents */
  2431. #define fx_env1_cutoff fx_the_value /* [-127,127] 56.25cents */
  2432. #define fx_env2_delay fx_delay /* [0,5900] 4msec */
  2433. #define fx_env2_attack fx_attack /* [0,5940] 1msec */
  2434. #define fx_env2_hold fx_hold /* [0,8191] 1msec */
  2435. #define fx_env2_decay fx_decay /* [0,5940] 4msec */
  2436. #define fx_env2_release fx_decay /* [0,5940] 4msec */
  2437. #define fx_env2_sustain fx_the_value /* [0,127] 0.75dB */
  2438. #define fx_lfo1_delay fx_delay /* [0,5900] 4msec */
  2439. #define fx_lfo1_freq fx_twice_value /* [0,127] 84mHz */
  2440. #define fx_lfo1_volume fx_twice_value /* [0,127] 0.1875dB */
  2441. #define fx_lfo1_pitch fx_the_value /* [-127,127] 9.375cents */
  2442. #define fx_lfo1_cutoff fx_twice_value /* [-64,63] 56.25cents */
  2443. #define fx_lfo2_delay fx_delay /* [0,5900] 4msec */
  2444. #define fx_lfo2_freq fx_twice_value /* [0,127] 84mHz */
  2445. #define fx_lfo2_pitch fx_the_value /* [-127,127] 9.375cents */
  2446. #define fx_init_pitch fx_conv_pitch /* [-8192,8192] cents */
  2447. #define fx_chorus fx_the_value /* [0,255] -- */
  2448. #define fx_reverb fx_the_value /* [0,255] -- */
  2449. #define fx_cutoff fx_twice_value /* [0,127] 62Hz */
  2450. #define fx_filterQ fx_conv_Q /* [0,127] -- */
  2451. static unsigned short fx_delay(int val)
  2452. {
  2453. return (unsigned short)calc_parm_delay(val);
  2454. }
  2455. static unsigned short fx_attack(int val)
  2456. {
  2457. return (unsigned short)calc_parm_attack(val);
  2458. }
  2459. static unsigned short fx_hold(int val)
  2460. {
  2461. return (unsigned short)calc_parm_hold(val);
  2462. }
  2463. static unsigned short fx_decay(int val)
  2464. {
  2465. return (unsigned short)calc_parm_decay(val);
  2466. }
  2467. static unsigned short fx_the_value(int val)
  2468. {
  2469. return (unsigned short)(val & 0xff);
  2470. }
  2471. static unsigned short fx_twice_value(int val)
  2472. {
  2473. return (unsigned short)((val * 2) & 0xff);
  2474. }
  2475. static unsigned short fx_conv_pitch(int val)
  2476. {
  2477. return (short)(val * 4096 / 1200);
  2478. }
  2479. static unsigned short fx_conv_Q(int val)
  2480. {
  2481. return (unsigned short)((val / 8) & 0xff);
  2482. }
  2483. static ConvTable awe_effects[] =
  2484. {
  2485. { 0, AWE_FX_LFO1_DELAY, fx_lfo1_delay},
  2486. { 1, AWE_FX_LFO1_FREQ, fx_lfo1_freq},
  2487. { 2, AWE_FX_LFO2_DELAY, fx_lfo2_delay},
  2488. { 3, AWE_FX_LFO2_FREQ, fx_lfo2_freq},
  2489. { 4, AWE_FX_ENV1_DELAY, fx_env1_delay},
  2490. { 5, AWE_FX_ENV1_ATTACK,fx_env1_attack},
  2491. { 6, AWE_FX_ENV1_HOLD, fx_env1_hold},
  2492. { 7, AWE_FX_ENV1_DECAY, fx_env1_decay},
  2493. { 8, AWE_FX_ENV1_SUSTAIN, fx_env1_sustain},
  2494. { 9, AWE_FX_ENV1_RELEASE, fx_env1_release},
  2495. {10, AWE_FX_ENV2_DELAY, fx_env2_delay},
  2496. {11, AWE_FX_ENV2_ATTACK, fx_env2_attack},
  2497. {12, AWE_FX_ENV2_HOLD, fx_env2_hold},
  2498. {13, AWE_FX_ENV2_DECAY, fx_env2_decay},
  2499. {14, AWE_FX_ENV2_SUSTAIN, fx_env2_sustain},
  2500. {15, AWE_FX_ENV2_RELEASE, fx_env2_release},
  2501. {16, AWE_FX_INIT_PITCH, fx_init_pitch},
  2502. {17, AWE_FX_LFO1_PITCH, fx_lfo1_pitch},
  2503. {18, AWE_FX_LFO2_PITCH, fx_lfo2_pitch},
  2504. {19, AWE_FX_ENV1_PITCH, fx_env1_pitch},
  2505. {20, AWE_FX_LFO1_VOLUME, fx_lfo1_volume},
  2506. {21, AWE_FX_CUTOFF, fx_cutoff},
  2507. {22, AWE_FX_FILTERQ, fx_filterQ},
  2508. {23, AWE_FX_LFO1_CUTOFF, fx_lfo1_cutoff},
  2509. {24, AWE_FX_ENV1_CUTOFF, fx_env1_cutoff},
  2510. {25, AWE_FX_CHORUS, fx_chorus},
  2511. {26, AWE_FX_REVERB, fx_reverb},
  2512. };
  2513. static int num_awe_effects = numberof(awe_effects);
  2514. /*
  2515.  * GS(SC88) NRPN effects; still experimental
  2516.  */
  2517. /* cutoff: quarter semitone step, max=255 */
  2518. static unsigned short gs_cutoff(int val)
  2519. {
  2520. return (val - 64) * gs_sense[FX_CUTOFF] / 50;
  2521. }
  2522. /* resonance: 0 to 15(max) */
  2523. static unsigned short gs_filterQ(int val)
  2524. {
  2525. return (val - 64) * gs_sense[FX_RESONANCE] / 50;
  2526. }
  2527. /* attack: */
  2528. static unsigned short gs_attack(int val)
  2529. {
  2530. return -(val - 64) * gs_sense[FX_ATTACK] / 50;
  2531. }
  2532. /* decay: */
  2533. static unsigned short gs_decay(int val)
  2534. {
  2535. return -(val - 64) * gs_sense[FX_RELEASE] / 50;
  2536. }
  2537. /* release: */
  2538. static unsigned short gs_release(int val)
  2539. {
  2540. return -(val - 64) * gs_sense[FX_RELEASE] / 50;
  2541. }
  2542. /* vibrato freq: 0.042Hz step, max=255 */
  2543. static unsigned short gs_vib_rate(int val)
  2544. {
  2545. return (val - 64) * gs_sense[FX_VIBRATE] / 50;
  2546. }
  2547. /* vibrato depth: max=127, 1 octave */
  2548. static unsigned short gs_vib_depth(int val)
  2549. {
  2550. return (val - 64) * gs_sense[FX_VIBDEPTH] / 50;
  2551. }
  2552. /* vibrato delay: -0.725msec step */
  2553. static unsigned short gs_vib_delay(int val)
  2554. {
  2555. return -(val - 64) * gs_sense[FX_VIBDELAY] / 50;
  2556. }
  2557. static ConvTable gs_effects[] =
  2558. {
  2559. {32, AWE_FX_CUTOFF, gs_cutoff},
  2560. {33, AWE_FX_FILTERQ, gs_filterQ},
  2561. {99, AWE_FX_ENV2_ATTACK, gs_attack},
  2562. {100, AWE_FX_ENV2_DECAY, gs_decay},
  2563. {102, AWE_FX_ENV2_RELEASE, gs_release},
  2564. {8, AWE_FX_LFO1_FREQ, gs_vib_rate},
  2565. {9, AWE_FX_LFO1_VOLUME, gs_vib_depth},
  2566. {10, AWE_FX_LFO1_DELAY, gs_vib_delay},
  2567. };
  2568. static int num_gs_effects = numberof(gs_effects);
  2569. /*
  2570.  * NRPN events: accept as AWE32/SC88 specific controls
  2571.  */
  2572. static void midi_nrpn_event(MidiStatus *st)
  2573. {
  2574. if (rpn_msb[st->chan] == 127 && rpn_lsb[st->chan] <= 26) {
  2575. if (! msb_bit) /* both MSB/LSB necessary */
  2576. send_converted_effect(awe_effects, num_awe_effects,
  2577.       st, rpn_lsb[st->chan],
  2578.       rpn_val[st->chan] - 8192);
  2579. } else if (rpn_msb[st->chan] == 1) {
  2580. if (msb_bit) /* only MSB is valid */
  2581. add_converted_effect(gs_effects, num_gs_effects,
  2582.      st, rpn_lsb[st->chan],
  2583.      rpn_val[st->chan] / 128);
  2584. }
  2585. }
  2586. /*
  2587.  * XG control effects; still experimental
  2588.  */
  2589. /* cutoff: quarter semitone step, max=255 */
  2590. static unsigned short xg_cutoff(int val)
  2591. {
  2592. return (val - 64) * xg_sense[FX_CUTOFF] / 64;
  2593. }
  2594. /* resonance: 0(open) to 15(most nasal) */
  2595. static unsigned short xg_filterQ(int val)
  2596. {
  2597. return (val - 64) * xg_sense[FX_RESONANCE] / 64;
  2598. }
  2599. /* attack: */
  2600. static unsigned short xg_attack(int val)
  2601. {
  2602. return -(val - 64) * xg_sense[FX_ATTACK] / 64;
  2603. }
  2604. /* release: */
  2605. static unsigned short xg_release(int val)
  2606. {
  2607. return -(val - 64) * xg_sense[FX_RELEASE] / 64;
  2608. }
  2609. static ConvTable xg_effects[] =
  2610. {
  2611. {71, AWE_FX_CUTOFF, xg_cutoff},
  2612. {74, AWE_FX_FILTERQ, xg_filterQ},
  2613. {72, AWE_FX_ENV2_RELEASE, xg_release},
  2614. {73, AWE_FX_ENV2_ATTACK, xg_attack},
  2615. };
  2616. static int num_xg_effects = numberof(xg_effects);
  2617. static int xg_control_change(MidiStatus *st, int cmd, int val)
  2618. {
  2619. return add_converted_effect(xg_effects, num_xg_effects, st, cmd, val);
  2620. }
  2621. #endif /* CONFIG_AWE32_MIDIEMU */
  2622. /*----------------------------------------------------------------*/
  2623. /*
  2624.  * device / lowlevel (module) interface
  2625.  */
  2626. int __init attach_awe(void)
  2627. {
  2628. return _attach_awe() ? 0 : -ENODEV;
  2629. }
  2630. void __exit unload_awe(void)
  2631. {
  2632. _unload_awe();
  2633. #if defined CONFIG_ISAPNP || defined CONFIG_ISAPNP_MODULE
  2634. if (isapnp)
  2635. awe_deactivate_isapnp();
  2636. #endif /* isapnp */
  2637. }
  2638. module_init(attach_awe);
  2639. module_exit(unload_awe);
  2640. #ifndef MODULE
  2641. static int __init setup_awe(char *str)
  2642. {
  2643. /* io, memsize, isapnp */
  2644. int ints[4];
  2645. str = get_options(str, ARRAY_SIZE(ints), ints);
  2646. io = ints[1];
  2647. memsize = ints[2];
  2648. isapnp = ints[3];
  2649. return 1;
  2650. }
  2651. __setup("awe=", setup_awe);
  2652. #endif