audio.c 39 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588
  1. /*
  2. **********************************************************************
  3. * audio.c -- /dev/dsp interface for emu10k1 driver
  4. * Copyright 1999, 2000 Creative Labs, Inc.
  5. *
  6. **********************************************************************
  7. *
  8. * Date Author Summary of changes
  9. * ---- ------ ------------------
  10. * October 20, 1999 Bertrand Lee base code release
  11. * November 2, 1999 Alan Cox cleaned up types/leaks
  12. *
  13. **********************************************************************
  14. *
  15. * This program is free software; you can redistribute it and/or
  16. * modify it under the terms of the GNU General Public License as
  17. * published by the Free Software Foundation; either version 2 of
  18. * the License, or (at your option) any later version.
  19. *
  20. * This program is distributed in the hope that it will be useful,
  21. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  22. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  23. * GNU General Public License for more details.
  24. *
  25. * You should have received a copy of the GNU General Public
  26. * License along with this program; if not, write to the Free
  27. * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
  28. * USA.
  29. *
  30. **********************************************************************
  31. */
  32. #include <linux/module.h>
  33. #include <linux/poll.h>
  34. #include <linux/slab.h>
  35. #include <linux/bitops.h>
  36. #include <asm/io.h>
  37. #include <linux/sched.h>
  38. #include <linux/smp_lock.h>
  39. #include "hwaccess.h"
  40. #include "cardwo.h"
  41. #include "cardwi.h"
  42. #include "recmgr.h"
  43. #include "irqmgr.h"
  44. #include "audio.h"
  45. #include "8010.h"
  46. static void calculate_ofrag(struct woinst *);
  47. static void calculate_ifrag(struct wiinst *);
  48. static void emu10k1_waveout_bh(unsigned long refdata);
  49. static void emu10k1_wavein_bh(unsigned long refdata);
  50. /* Audio file operations */
  51. static ssize_t emu10k1_audio_read(struct file *file, char __user *buffer, size_t count, loff_t * ppos)
  52. {
  53. struct emu10k1_wavedevice *wave_dev = (struct emu10k1_wavedevice *) file->private_data;
  54. struct wiinst *wiinst = wave_dev->wiinst;
  55. ssize_t ret = 0;
  56. unsigned long flags;
  57. DPD(3, "emu10k1_audio_read(), buffer=%p, count=%d\n", buffer, (u32) count);
  58. if (!access_ok(VERIFY_WRITE, buffer, count))
  59. return -EFAULT;
  60. spin_lock_irqsave(&wiinst->lock, flags);
  61. if (wiinst->mmapped) {
  62. spin_unlock_irqrestore(&wiinst->lock, flags);
  63. return -ENXIO;
  64. }
  65. if (wiinst->state == WAVE_STATE_CLOSED) {
  66. calculate_ifrag(wiinst);
  67. while (emu10k1_wavein_open(wave_dev) < 0) {
  68. spin_unlock_irqrestore(&wiinst->lock, flags);
  69. if (file->f_flags & O_NONBLOCK)
  70. return -EAGAIN;
  71. interruptible_sleep_on(&wave_dev->card->open_wait);
  72. if (signal_pending(current))
  73. return -ERESTARTSYS;
  74. spin_lock_irqsave(&wiinst->lock, flags);
  75. }
  76. }
  77. spin_unlock_irqrestore(&wiinst->lock, flags);
  78. while (count > 0) {
  79. u32 bytestocopy;
  80. spin_lock_irqsave(&wiinst->lock, flags);
  81. if (!(wiinst->state & WAVE_STATE_STARTED)
  82. && (wave_dev->enablebits & PCM_ENABLE_INPUT))
  83. emu10k1_wavein_start(wave_dev);
  84. emu10k1_wavein_update(wave_dev->card, wiinst);
  85. emu10k1_wavein_getxfersize(wiinst, &bytestocopy);
  86. spin_unlock_irqrestore(&wiinst->lock, flags);
  87. DPD(3, "bytestocopy --> %d\n", bytestocopy);
  88. if ((bytestocopy >= wiinst->buffer.fragment_size)
  89. || (bytestocopy >= count)) {
  90. bytestocopy = min_t(u32, bytestocopy, count);
  91. emu10k1_wavein_xferdata(wiinst, (u8 __user *)buffer, &bytestocopy);
  92. count -= bytestocopy;
  93. buffer += bytestocopy;
  94. ret += bytestocopy;
  95. }
  96. if (count > 0) {
  97. if ((file->f_flags & O_NONBLOCK)
  98. || (!(wave_dev->enablebits & PCM_ENABLE_INPUT)))
  99. return (ret ? ret : -EAGAIN);
  100. interruptible_sleep_on(&wiinst->wait_queue);
  101. if (signal_pending(current))
  102. return (ret ? ret : -ERESTARTSYS);
  103. }
  104. }
  105. DPD(3, "bytes copied -> %d\n", (u32) ret);
  106. return ret;
  107. }
  108. static ssize_t emu10k1_audio_write(struct file *file, const char __user *buffer, size_t count, loff_t * ppos)
  109. {
  110. struct emu10k1_wavedevice *wave_dev = (struct emu10k1_wavedevice *) file->private_data;
  111. struct woinst *woinst = wave_dev->woinst;
  112. ssize_t ret;
  113. unsigned long flags;
  114. DPD(3, "emu10k1_audio_write(), buffer=%p, count=%d\n", buffer, (u32) count);
  115. if (!access_ok(VERIFY_READ, buffer, count))
  116. return -EFAULT;
  117. spin_lock_irqsave(&woinst->lock, flags);
  118. if (woinst->mmapped) {
  119. spin_unlock_irqrestore(&woinst->lock, flags);
  120. return -ENXIO;
  121. }
  122. // This is for emu10k1 revs less than 7, we need to go through tram
  123. if (woinst->format.passthrough == 1) {
  124. int r;
  125. woinst->buffer.ossfragshift = PT_BLOCKSIZE_LOG2;
  126. woinst->buffer.numfrags = PT_BLOCKCOUNT;
  127. calculate_ofrag(woinst);
  128. r = emu10k1_pt_write(file, buffer, count);
  129. spin_unlock_irqrestore(&woinst->lock, flags);
  130. return r;
  131. }
  132. if (woinst->state == WAVE_STATE_CLOSED) {
  133. calculate_ofrag(woinst);
  134. while (emu10k1_waveout_open(wave_dev) < 0) {
  135. spin_unlock_irqrestore(&woinst->lock, flags);
  136. if (file->f_flags & O_NONBLOCK)
  137. return -EAGAIN;
  138. interruptible_sleep_on(&wave_dev->card->open_wait);
  139. if (signal_pending(current))
  140. return -ERESTARTSYS;
  141. spin_lock_irqsave(&woinst->lock, flags);
  142. }
  143. }
  144. spin_unlock_irqrestore(&woinst->lock, flags);
  145. ret = 0;
  146. if (count % woinst->format.bytespersample)
  147. return -EINVAL;
  148. count /= woinst->num_voices;
  149. while (count > 0) {
  150. u32 bytestocopy;
  151. spin_lock_irqsave(&woinst->lock, flags);
  152. emu10k1_waveout_update(woinst);
  153. emu10k1_waveout_getxfersize(woinst, &bytestocopy);
  154. spin_unlock_irqrestore(&woinst->lock, flags);
  155. DPD(3, "bytestocopy --> %d\n", bytestocopy);
  156. if ((bytestocopy >= woinst->buffer.fragment_size)
  157. || (bytestocopy >= count)) {
  158. bytestocopy = min_t(u32, bytestocopy, count);
  159. emu10k1_waveout_xferdata(woinst, (u8 __user *) buffer, &bytestocopy);
  160. count -= bytestocopy;
  161. buffer += bytestocopy * woinst->num_voices;
  162. ret += bytestocopy * woinst->num_voices;
  163. spin_lock_irqsave(&woinst->lock, flags);
  164. woinst->total_copied += bytestocopy;
  165. if (!(woinst->state & WAVE_STATE_STARTED)
  166. && (wave_dev->enablebits & PCM_ENABLE_OUTPUT)
  167. && (woinst->total_copied >= woinst->buffer.fragment_size))
  168. emu10k1_waveout_start(wave_dev);
  169. spin_unlock_irqrestore(&woinst->lock, flags);
  170. }
  171. if (count > 0) {
  172. if ((file->f_flags & O_NONBLOCK)
  173. || (!(wave_dev->enablebits & PCM_ENABLE_OUTPUT)))
  174. return (ret ? ret : -EAGAIN);
  175. interruptible_sleep_on(&woinst->wait_queue);
  176. if (signal_pending(current))
  177. return (ret ? ret : -ERESTARTSYS);
  178. }
  179. }
  180. DPD(3, "bytes copied -> %d\n", (u32) ret);
  181. return ret;
  182. }
  183. static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
  184. {
  185. struct emu10k1_wavedevice *wave_dev = (struct emu10k1_wavedevice *) file->private_data;
  186. struct woinst *woinst = NULL;
  187. struct wiinst *wiinst = NULL;
  188. int val = 0;
  189. u32 bytestocopy;
  190. unsigned long flags;
  191. int __user *p = (int __user *)arg;
  192. DPF(4, "emu10k1_audio_ioctl()\n");
  193. if (file->f_mode & FMODE_WRITE)
  194. woinst = wave_dev->woinst;
  195. if (file->f_mode & FMODE_READ)
  196. wiinst = wave_dev->wiinst;
  197. switch (cmd) {
  198. case OSS_GETVERSION:
  199. DPF(2, "OSS_GETVERSION:\n");
  200. return put_user(SOUND_VERSION, p);
  201. case SNDCTL_DSP_RESET:
  202. DPF(2, "SNDCTL_DSP_RESET:\n");
  203. wave_dev->enablebits = PCM_ENABLE_OUTPUT | PCM_ENABLE_INPUT;
  204. if (file->f_mode & FMODE_WRITE) {
  205. spin_lock_irqsave(&woinst->lock, flags);
  206. if (woinst->state & WAVE_STATE_OPEN) {
  207. emu10k1_waveout_close(wave_dev);
  208. }
  209. woinst->mmapped = 0;
  210. woinst->total_copied = 0;
  211. woinst->total_played = 0;
  212. woinst->blocks = 0;
  213. spin_unlock_irqrestore(&woinst->lock, flags);
  214. }
  215. if (file->f_mode & FMODE_READ) {
  216. spin_lock_irqsave(&wiinst->lock, flags);
  217. if (wiinst->state & WAVE_STATE_OPEN) {
  218. emu10k1_wavein_close(wave_dev);
  219. }
  220. wiinst->mmapped = 0;
  221. wiinst->total_recorded = 0;
  222. wiinst->blocks = 0;
  223. spin_unlock_irqrestore(&wiinst->lock, flags);
  224. }
  225. break;
  226. case SNDCTL_DSP_SYNC:
  227. DPF(2, "SNDCTL_DSP_SYNC:\n");
  228. if (file->f_mode & FMODE_WRITE) {
  229. spin_lock_irqsave(&woinst->lock, flags);
  230. if (woinst->state & WAVE_STATE_OPEN) {
  231. if (woinst->state & WAVE_STATE_STARTED)
  232. while ((woinst->total_played < woinst->total_copied)
  233. && !signal_pending(current)) {
  234. spin_unlock_irqrestore(&woinst->lock, flags);
  235. interruptible_sleep_on(&woinst->wait_queue);
  236. spin_lock_irqsave(&woinst->lock, flags);
  237. }
  238. emu10k1_waveout_close(wave_dev);
  239. }
  240. woinst->mmapped = 0;
  241. woinst->total_copied = 0;
  242. woinst->total_played = 0;
  243. woinst->blocks = 0;
  244. spin_unlock_irqrestore(&woinst->lock, flags);
  245. }
  246. if (file->f_mode & FMODE_READ) {
  247. spin_lock_irqsave(&wiinst->lock, flags);
  248. if (wiinst->state & WAVE_STATE_OPEN) {
  249. emu10k1_wavein_close(wave_dev);
  250. }
  251. wiinst->mmapped = 0;
  252. wiinst->total_recorded = 0;
  253. wiinst->blocks = 0;
  254. spin_unlock_irqrestore(&wiinst->lock, flags);
  255. }
  256. break;
  257. case SNDCTL_DSP_SETDUPLEX:
  258. DPF(2, "SNDCTL_DSP_SETDUPLEX:\n");
  259. break;
  260. case SNDCTL_DSP_GETCAPS:
  261. DPF(2, "SNDCTL_DSP_GETCAPS:\n");
  262. return put_user(DSP_CAP_DUPLEX | DSP_CAP_REALTIME |
  263. DSP_CAP_TRIGGER | DSP_CAP_MMAP |
  264. DSP_CAP_COPROC| DSP_CAP_MULTI, p);
  265. case SNDCTL_DSP_SPEED:
  266. DPF(2, "SNDCTL_DSP_SPEED:\n");
  267. if (get_user(val, p))
  268. return -EFAULT;
  269. DPD(2, "val is %d\n", val);
  270. if (val > 0) {
  271. if (file->f_mode & FMODE_READ) {
  272. struct wave_format format;
  273. spin_lock_irqsave(&wiinst->lock, flags);
  274. format = wiinst->format;
  275. format.samplingrate = val;
  276. if (emu10k1_wavein_setformat(wave_dev, &format) < 0) {
  277. spin_unlock_irqrestore(&wiinst->lock, flags);
  278. return -EINVAL;
  279. }
  280. val = wiinst->format.samplingrate;
  281. spin_unlock_irqrestore(&wiinst->lock, flags);
  282. DPD(2, "set recording sampling rate -> %d\n", val);
  283. }
  284. if (file->f_mode & FMODE_WRITE) {
  285. struct wave_format format;
  286. spin_lock_irqsave(&woinst->lock, flags);
  287. format = woinst->format;
  288. format.samplingrate = val;
  289. if (emu10k1_waveout_setformat(wave_dev, &format) < 0) {
  290. spin_unlock_irqrestore(&woinst->lock, flags);
  291. return -EINVAL;
  292. }
  293. val = woinst->format.samplingrate;
  294. spin_unlock_irqrestore(&woinst->lock, flags);
  295. DPD(2, "set playback sampling rate -> %d\n", val);
  296. }
  297. return put_user(val, p);
  298. } else {
  299. if (file->f_mode & FMODE_READ)
  300. val = wiinst->format.samplingrate;
  301. else if (file->f_mode & FMODE_WRITE)
  302. val = woinst->format.samplingrate;
  303. return put_user(val, p);
  304. }
  305. break;
  306. case SNDCTL_DSP_STEREO:
  307. DPF(2, "SNDCTL_DSP_STEREO:\n");
  308. if (get_user(val, p))
  309. return -EFAULT;
  310. DPD(2, " val is %d\n", val);
  311. if (file->f_mode & FMODE_READ) {
  312. struct wave_format format;
  313. spin_lock_irqsave(&wiinst->lock, flags);
  314. format = wiinst->format;
  315. format.channels = val ? 2 : 1;
  316. if (emu10k1_wavein_setformat(wave_dev, &format) < 0) {
  317. spin_unlock_irqrestore(&wiinst->lock, flags);
  318. return -EINVAL;
  319. }
  320. val = wiinst->format.channels - 1;
  321. spin_unlock_irqrestore(&wiinst->lock, flags);
  322. DPD(2, "set recording stereo -> %d\n", val);
  323. }
  324. if (file->f_mode & FMODE_WRITE) {
  325. struct wave_format format;
  326. spin_lock_irqsave(&woinst->lock, flags);
  327. format = woinst->format;
  328. format.channels = val ? 2 : 1;
  329. if (emu10k1_waveout_setformat(wave_dev, &format) < 0) {
  330. spin_unlock_irqrestore(&woinst->lock, flags);
  331. return -EINVAL;
  332. }
  333. val = woinst->format.channels - 1;
  334. spin_unlock_irqrestore(&woinst->lock, flags);
  335. DPD(2, "set playback stereo -> %d\n", val);
  336. }
  337. return put_user(val, p);
  338. break;
  339. case SNDCTL_DSP_CHANNELS:
  340. DPF(2, "SNDCTL_DSP_CHANNELS:\n");
  341. if (get_user(val, p))
  342. return -EFAULT;
  343. DPD(2, " val is %d\n", val);
  344. if (val > 0) {
  345. if (file->f_mode & FMODE_READ) {
  346. struct wave_format format;
  347. spin_lock_irqsave(&wiinst->lock, flags);
  348. format = wiinst->format;
  349. format.channels = val;
  350. if (emu10k1_wavein_setformat(wave_dev, &format) < 0) {
  351. spin_unlock_irqrestore(&wiinst->lock, flags);
  352. return -EINVAL;
  353. }
  354. val = wiinst->format.channels;
  355. spin_unlock_irqrestore(&wiinst->lock, flags);
  356. DPD(2, "set recording number of channels -> %d\n", val);
  357. }
  358. if (file->f_mode & FMODE_WRITE) {
  359. struct wave_format format;
  360. spin_lock_irqsave(&woinst->lock, flags);
  361. format = woinst->format;
  362. format.channels = val;
  363. if (emu10k1_waveout_setformat(wave_dev, &format) < 0) {
  364. spin_unlock_irqrestore(&woinst->lock, flags);
  365. return -EINVAL;
  366. }
  367. val = woinst->format.channels;
  368. spin_unlock_irqrestore(&woinst->lock, flags);
  369. DPD(2, "set playback number of channels -> %d\n", val);
  370. }
  371. return put_user(val, p);
  372. } else {
  373. if (file->f_mode & FMODE_READ)
  374. val = wiinst->format.channels;
  375. else if (file->f_mode & FMODE_WRITE)
  376. val = woinst->format.channels;
  377. return put_user(val, p);
  378. }
  379. break;
  380. case SNDCTL_DSP_GETFMTS:
  381. DPF(2, "SNDCTL_DSP_GETFMTS:\n");
  382. if (file->f_mode & FMODE_READ)
  383. val = AFMT_S16_LE;
  384. else if (file->f_mode & FMODE_WRITE) {
  385. val = AFMT_S16_LE | AFMT_U8;
  386. if (emu10k1_find_control_gpr(&wave_dev->card->mgr,
  387. wave_dev->card->pt.patch_name,
  388. wave_dev->card->pt.enable_gpr_name) >= 0)
  389. val |= AFMT_AC3;
  390. }
  391. return put_user(val, p);
  392. case SNDCTL_DSP_SETFMT: /* Same as SNDCTL_DSP_SAMPLESIZE */
  393. DPF(2, "SNDCTL_DSP_SETFMT:\n");
  394. if (get_user(val, p))
  395. return -EFAULT;
  396. DPD(2, " val is %d\n", val);
  397. if (val != AFMT_QUERY) {
  398. if (file->f_mode & FMODE_READ) {
  399. struct wave_format format;
  400. spin_lock_irqsave(&wiinst->lock, flags);
  401. format = wiinst->format;
  402. format.id = val;
  403. if (emu10k1_wavein_setformat(wave_dev, &format) < 0) {
  404. spin_unlock_irqrestore(&wiinst->lock, flags);
  405. return -EINVAL;
  406. }
  407. val = wiinst->format.id;
  408. spin_unlock_irqrestore(&wiinst->lock, flags);
  409. DPD(2, "set recording format -> %d\n", val);
  410. }
  411. if (file->f_mode & FMODE_WRITE) {
  412. struct wave_format format;
  413. spin_lock_irqsave(&woinst->lock, flags);
  414. format = woinst->format;
  415. format.id = val;
  416. if (emu10k1_waveout_setformat(wave_dev, &format) < 0) {
  417. spin_unlock_irqrestore(&woinst->lock, flags);
  418. return -EINVAL;
  419. }
  420. val = woinst->format.id;
  421. spin_unlock_irqrestore(&woinst->lock, flags);
  422. DPD(2, "set playback format -> %d\n", val);
  423. }
  424. return put_user(val, p);
  425. } else {
  426. if (file->f_mode & FMODE_READ)
  427. val = wiinst->format.id;
  428. else if (file->f_mode & FMODE_WRITE)
  429. val = woinst->format.id;
  430. return put_user(val, p);
  431. }
  432. break;
  433. case SOUND_PCM_READ_BITS:
  434. if (file->f_mode & FMODE_READ)
  435. val = wiinst->format.bitsperchannel;
  436. else if (file->f_mode & FMODE_WRITE)
  437. val = woinst->format.bitsperchannel;
  438. return put_user(val, p);
  439. case SOUND_PCM_READ_RATE:
  440. if (file->f_mode & FMODE_READ)
  441. val = wiinst->format.samplingrate;
  442. else if (file->f_mode & FMODE_WRITE)
  443. val = woinst->format.samplingrate;
  444. return put_user(val, p);
  445. case SOUND_PCM_READ_CHANNELS:
  446. if (file->f_mode & FMODE_READ)
  447. val = wiinst->format.channels;
  448. else if (file->f_mode & FMODE_WRITE)
  449. val = woinst->format.channels;
  450. return put_user(val, p);
  451. case SOUND_PCM_WRITE_FILTER:
  452. DPF(2, "SOUND_PCM_WRITE_FILTER: not implemented\n");
  453. break;
  454. case SOUND_PCM_READ_FILTER:
  455. DPF(2, "SOUND_PCM_READ_FILTER: not implemented\n");
  456. break;
  457. case SNDCTL_DSP_SETSYNCRO:
  458. DPF(2, "SNDCTL_DSP_SETSYNCRO: not implemented\n");
  459. break;
  460. case SNDCTL_DSP_GETTRIGGER:
  461. DPF(2, "SNDCTL_DSP_GETTRIGGER:\n");
  462. if (file->f_mode & FMODE_WRITE && (wave_dev->enablebits & PCM_ENABLE_OUTPUT))
  463. val |= PCM_ENABLE_OUTPUT;
  464. if (file->f_mode & FMODE_READ && (wave_dev->enablebits & PCM_ENABLE_INPUT))
  465. val |= PCM_ENABLE_INPUT;
  466. return put_user(val, p);
  467. case SNDCTL_DSP_SETTRIGGER:
  468. DPF(2, "SNDCTL_DSP_SETTRIGGER:\n");
  469. if (get_user(val, p))
  470. return -EFAULT;
  471. if (file->f_mode & FMODE_WRITE) {
  472. spin_lock_irqsave(&woinst->lock, flags);
  473. if (val & PCM_ENABLE_OUTPUT) {
  474. wave_dev->enablebits |= PCM_ENABLE_OUTPUT;
  475. if (woinst->state & WAVE_STATE_OPEN)
  476. emu10k1_waveout_start(wave_dev);
  477. } else {
  478. wave_dev->enablebits &= ~PCM_ENABLE_OUTPUT;
  479. if (woinst->state & WAVE_STATE_STARTED)
  480. emu10k1_waveout_stop(wave_dev);
  481. }
  482. spin_unlock_irqrestore(&woinst->lock, flags);
  483. }
  484. if (file->f_mode & FMODE_READ) {
  485. spin_lock_irqsave(&wiinst->lock, flags);
  486. if (val & PCM_ENABLE_INPUT) {
  487. wave_dev->enablebits |= PCM_ENABLE_INPUT;
  488. if (wiinst->state & WAVE_STATE_OPEN)
  489. emu10k1_wavein_start(wave_dev);
  490. } else {
  491. wave_dev->enablebits &= ~PCM_ENABLE_INPUT;
  492. if (wiinst->state & WAVE_STATE_STARTED)
  493. emu10k1_wavein_stop(wave_dev);
  494. }
  495. spin_unlock_irqrestore(&wiinst->lock, flags);
  496. }
  497. break;
  498. case SNDCTL_DSP_GETOSPACE:
  499. {
  500. audio_buf_info info;
  501. DPF(4, "SNDCTL_DSP_GETOSPACE:\n");
  502. if (!(file->f_mode & FMODE_WRITE))
  503. return -EINVAL;
  504. spin_lock_irqsave(&woinst->lock, flags);
  505. if (woinst->state & WAVE_STATE_OPEN) {
  506. emu10k1_waveout_update(woinst);
  507. emu10k1_waveout_getxfersize(woinst, &bytestocopy);
  508. info.bytes = bytestocopy;
  509. } else {
  510. calculate_ofrag(woinst);
  511. info.bytes = woinst->buffer.size;
  512. }
  513. spin_unlock_irqrestore(&woinst->lock, flags);
  514. info.bytes *= woinst->num_voices;
  515. info.fragsize = woinst->buffer.fragment_size * woinst->num_voices;
  516. info.fragstotal = woinst->buffer.numfrags * woinst->num_voices;
  517. info.fragments = info.bytes / info.fragsize;
  518. if (copy_to_user(p, &info, sizeof(info)))
  519. return -EFAULT;
  520. }
  521. break;
  522. case SNDCTL_DSP_GETISPACE:
  523. {
  524. audio_buf_info info;
  525. DPF(4, "SNDCTL_DSP_GETISPACE:\n");
  526. if (!(file->f_mode & FMODE_READ))
  527. return -EINVAL;
  528. spin_lock_irqsave(&wiinst->lock, flags);
  529. if (wiinst->state & WAVE_STATE_OPEN) {
  530. emu10k1_wavein_update(wave_dev->card, wiinst);
  531. emu10k1_wavein_getxfersize(wiinst, &bytestocopy);
  532. info.bytes = bytestocopy;
  533. } else {
  534. calculate_ifrag(wiinst);
  535. info.bytes = 0;
  536. }
  537. spin_unlock_irqrestore(&wiinst->lock, flags);
  538. info.fragstotal = wiinst->buffer.numfrags;
  539. info.fragments = info.bytes / wiinst->buffer.fragment_size;
  540. info.fragsize = wiinst->buffer.fragment_size;
  541. if (copy_to_user(p, &info, sizeof(info)))
  542. return -EFAULT;
  543. }
  544. break;
  545. case SNDCTL_DSP_NONBLOCK:
  546. DPF(2, "SNDCTL_DSP_NONBLOCK:\n");
  547. file->f_flags |= O_NONBLOCK;
  548. break;
  549. case SNDCTL_DSP_GETODELAY:
  550. DPF(4, "SNDCTL_DSP_GETODELAY:\n");
  551. if (!(file->f_mode & FMODE_WRITE))
  552. return -EINVAL;
  553. spin_lock_irqsave(&woinst->lock, flags);
  554. if (woinst->state & WAVE_STATE_OPEN) {
  555. emu10k1_waveout_update(woinst);
  556. emu10k1_waveout_getxfersize(woinst, &bytestocopy);
  557. val = woinst->buffer.size - bytestocopy;
  558. } else
  559. val = 0;
  560. val *= woinst->num_voices;
  561. spin_unlock_irqrestore(&woinst->lock, flags);
  562. return put_user(val, p);
  563. case SNDCTL_DSP_GETIPTR:
  564. {
  565. count_info cinfo;
  566. DPF(4, "SNDCTL_DSP_GETIPTR: \n");
  567. if (!(file->f_mode & FMODE_READ))
  568. return -EINVAL;
  569. spin_lock_irqsave(&wiinst->lock, flags);
  570. if (wiinst->state & WAVE_STATE_OPEN) {
  571. emu10k1_wavein_update(wave_dev->card, wiinst);
  572. cinfo.ptr = wiinst->buffer.hw_pos;
  573. cinfo.bytes = cinfo.ptr + wiinst->total_recorded - wiinst->total_recorded % wiinst->buffer.size;
  574. cinfo.blocks = cinfo.bytes / wiinst->buffer.fragment_size - wiinst->blocks;
  575. wiinst->blocks = cinfo.bytes / wiinst->buffer.fragment_size;
  576. } else {
  577. cinfo.ptr = 0;
  578. cinfo.bytes = 0;
  579. cinfo.blocks = 0;
  580. }
  581. if (wiinst->mmapped)
  582. wiinst->buffer.bytestocopy %= wiinst->buffer.fragment_size;
  583. spin_unlock_irqrestore(&wiinst->lock, flags);
  584. if (copy_to_user(p, &cinfo, sizeof(cinfo)))
  585. return -EFAULT;
  586. }
  587. break;
  588. case SNDCTL_DSP_GETOPTR:
  589. {
  590. count_info cinfo;
  591. DPF(4, "SNDCTL_DSP_GETOPTR:\n");
  592. if (!(file->f_mode & FMODE_WRITE))
  593. return -EINVAL;
  594. spin_lock_irqsave(&woinst->lock, flags);
  595. if (woinst->state & WAVE_STATE_OPEN ||
  596. ((woinst->format.passthrough == 1) && wave_dev->card->pt.state)) {
  597. int num_fragments;
  598. if (woinst->format.passthrough == 1) {
  599. emu10k1_pt_waveout_update(wave_dev);
  600. cinfo.bytes = woinst->total_played;
  601. } else {
  602. emu10k1_waveout_update(woinst);
  603. cinfo.bytes = woinst->total_played;
  604. }
  605. cinfo.ptr = woinst->buffer.hw_pos;
  606. num_fragments = cinfo.bytes / woinst->buffer.fragment_size;
  607. cinfo.blocks = num_fragments - woinst->blocks;
  608. woinst->blocks = num_fragments;
  609. cinfo.bytes *= woinst->num_voices;
  610. cinfo.ptr *= woinst->num_voices;
  611. } else {
  612. cinfo.ptr = 0;
  613. cinfo.bytes = 0;
  614. cinfo.blocks = 0;
  615. }
  616. if (woinst->mmapped)
  617. woinst->buffer.free_bytes %= woinst->buffer.fragment_size;
  618. spin_unlock_irqrestore(&woinst->lock, flags);
  619. if (copy_to_user(p, &cinfo, sizeof(cinfo)))
  620. return -EFAULT;
  621. }
  622. break;
  623. case SNDCTL_DSP_GETBLKSIZE:
  624. DPF(2, "SNDCTL_DSP_GETBLKSIZE:\n");
  625. if (file->f_mode & FMODE_WRITE) {
  626. spin_lock_irqsave(&woinst->lock, flags);
  627. calculate_ofrag(woinst);
  628. val = woinst->buffer.fragment_size * woinst->num_voices;
  629. spin_unlock_irqrestore(&woinst->lock, flags);
  630. }
  631. if (file->f_mode & FMODE_READ) {
  632. spin_lock_irqsave(&wiinst->lock, flags);
  633. calculate_ifrag(wiinst);
  634. val = wiinst->buffer.fragment_size;
  635. spin_unlock_irqrestore(&wiinst->lock, flags);
  636. }
  637. return put_user(val, p);
  638. break;
  639. case SNDCTL_DSP_POST:
  640. if (file->f_mode & FMODE_WRITE) {
  641. spin_lock_irqsave(&woinst->lock, flags);
  642. if (!(woinst->state & WAVE_STATE_STARTED)
  643. && (wave_dev->enablebits & PCM_ENABLE_OUTPUT)
  644. && (woinst->total_copied > 0))
  645. emu10k1_waveout_start(wave_dev);
  646. spin_unlock_irqrestore(&woinst->lock, flags);
  647. }
  648. break;
  649. case SNDCTL_DSP_SUBDIVIDE:
  650. DPF(2, "SNDCTL_DSP_SUBDIVIDE: not implemented\n");
  651. break;
  652. case SNDCTL_DSP_SETFRAGMENT:
  653. DPF(2, "SNDCTL_DSP_SETFRAGMENT:\n");
  654. if (get_user(val, p))
  655. return -EFAULT;
  656. DPD(2, "val is %#x\n", val);
  657. if (val == 0)
  658. return -EIO;
  659. if (file->f_mode & FMODE_WRITE) {
  660. /* digital pass-through fragment count and size are fixed values */
  661. if (woinst->state & WAVE_STATE_OPEN || (woinst->format.passthrough == 1))
  662. return -EINVAL; /* too late to change */
  663. woinst->buffer.ossfragshift = val & 0xffff;
  664. woinst->buffer.numfrags = (val >> 16) & 0xffff;
  665. }
  666. if (file->f_mode & FMODE_READ) {
  667. if (wiinst->state & WAVE_STATE_OPEN)
  668. return -EINVAL; /* too late to change */
  669. wiinst->buffer.ossfragshift = val & 0xffff;
  670. wiinst->buffer.numfrags = (val >> 16) & 0xffff;
  671. }
  672. break;
  673. case SNDCTL_COPR_LOAD:
  674. {
  675. copr_buffer *buf;
  676. u32 i;
  677. DPF(4, "SNDCTL_COPR_LOAD:\n");
  678. buf = kmalloc(sizeof(copr_buffer), GFP_KERNEL);
  679. if (!buf)
  680. return -ENOMEM;
  681. if (copy_from_user(buf, p, sizeof(copr_buffer))) {
  682. kfree (buf);
  683. return -EFAULT;
  684. }
  685. if ((buf->command != CMD_READ) && (buf->command != CMD_WRITE)) {
  686. kfree (buf);
  687. return -EINVAL;
  688. }
  689. if (buf->command == CMD_WRITE) {
  690. #ifdef DBGEMU
  691. if ((buf->offs < 0) || (buf->offs + buf->len > 0xe00) || (buf->len > 1000)) {
  692. #else
  693. if (((buf->offs < 0x100) || (buf->offs + buf->len > (wave_dev->card->is_audigy ? 0xe00 : 0x800)) || (buf->len > 1000)
  694. ) && !(
  695. //any register allowed raw access to users goes here:
  696. (buf->offs == DBG ||
  697. buf->offs == A_DBG)
  698. && (buf->len == 1))) {
  699. #endif
  700. kfree(buf);
  701. return -EINVAL;
  702. }
  703. } else {
  704. if ((buf->offs < 0) || (buf->offs + buf->len > 0xe00) || (buf->len > 1000)) {
  705. kfree(buf);
  706. return -EINVAL;
  707. }
  708. }
  709. if (((unsigned)buf->flags) > 0x3f)
  710. buf->flags = 0;
  711. if (buf->command == CMD_READ) {
  712. for (i = 0; i < buf->len; i++)
  713. ((u32 *) buf->data)[i] = sblive_readptr(wave_dev->card, buf->offs + i, buf->flags);
  714. if (copy_to_user(p, buf, sizeof(copr_buffer))) {
  715. kfree(buf);
  716. return -EFAULT;
  717. }
  718. } else {
  719. for (i = 0; i < buf->len; i++)
  720. sblive_writeptr(wave_dev->card, buf->offs + i, buf->flags, ((u32 *) buf->data)[i]);
  721. }
  722. kfree (buf);
  723. break;
  724. }
  725. default: /* Default is unrecognized command */
  726. DPD(2, "default: %#x\n", cmd);
  727. return -EINVAL;
  728. }
  729. return 0;
  730. }
  731. static struct page *emu10k1_mm_nopage (struct vm_area_struct * vma, unsigned long address, int *type)
  732. {
  733. struct emu10k1_wavedevice *wave_dev = vma->vm_private_data;
  734. struct woinst *woinst = wave_dev->woinst;
  735. struct wiinst *wiinst = wave_dev->wiinst;
  736. struct page *dmapage;
  737. unsigned long pgoff;
  738. int rd, wr;
  739. DPF(3, "emu10k1_mm_nopage()\n");
  740. DPD(3, "addr: %#lx\n", address);
  741. if (address > vma->vm_end) {
  742. DPF(1, "EXIT, returning NOPAGE_SIGBUS\n");
  743. return NOPAGE_SIGBUS; /* Disallow mremap */
  744. }
  745. pgoff = vma->vm_pgoff + ((address - vma->vm_start) >> PAGE_SHIFT);
  746. if (woinst != NULL)
  747. wr = woinst->mmapped;
  748. else
  749. wr = 0;
  750. if (wiinst != NULL)
  751. rd = wiinst->mmapped;
  752. else
  753. rd = 0;
  754. /* if full-duplex (read+write) and we have two sets of bufs,
  755. * then the playback buffers come first, sez soundcard.c */
  756. if (wr) {
  757. if (pgoff >= woinst->buffer.pages) {
  758. pgoff -= woinst->buffer.pages;
  759. dmapage = virt_to_page ((u8 *) wiinst->buffer.addr + pgoff * PAGE_SIZE);
  760. } else
  761. dmapage = virt_to_page (woinst->voice[0].mem.addr[pgoff]);
  762. } else {
  763. dmapage = virt_to_page ((u8 *) wiinst->buffer.addr + pgoff * PAGE_SIZE);
  764. }
  765. get_page (dmapage);
  766. DPD(3, "page: %#lx\n", (unsigned long) dmapage);
  767. if (type)
  768. *type = VM_FAULT_MINOR;
  769. return dmapage;
  770. }
  771. static struct vm_operations_struct emu10k1_mm_ops = {
  772. .nopage = emu10k1_mm_nopage,
  773. };
  774. static int emu10k1_audio_mmap(struct file *file, struct vm_area_struct *vma)
  775. {
  776. struct emu10k1_wavedevice *wave_dev = (struct emu10k1_wavedevice *) file->private_data;
  777. unsigned long max_pages, n_pages, pgoffset;
  778. struct woinst *woinst = NULL;
  779. struct wiinst *wiinst = NULL;
  780. unsigned long flags;
  781. DPF(2, "emu10k1_audio_mmap()\n");
  782. max_pages = 0;
  783. if (vma->vm_flags & VM_WRITE) {
  784. woinst = wave_dev->woinst;
  785. spin_lock_irqsave(&woinst->lock, flags);
  786. /* No m'mapping possible for multichannel */
  787. if (woinst->num_voices > 1) {
  788. spin_unlock_irqrestore(&woinst->lock, flags);
  789. return -EINVAL;
  790. }
  791. if (woinst->state == WAVE_STATE_CLOSED) {
  792. calculate_ofrag(woinst);
  793. if (emu10k1_waveout_open(wave_dev) < 0) {
  794. spin_unlock_irqrestore(&woinst->lock, flags);
  795. ERROR();
  796. return -EINVAL;
  797. }
  798. }
  799. woinst->mmapped = 1;
  800. max_pages += woinst->buffer.pages;
  801. spin_unlock_irqrestore(&woinst->lock, flags);
  802. }
  803. if (vma->vm_flags & VM_READ) {
  804. wiinst = wave_dev->wiinst;
  805. spin_lock_irqsave(&wiinst->lock, flags);
  806. if (wiinst->state == WAVE_STATE_CLOSED) {
  807. calculate_ifrag(wiinst);
  808. if (emu10k1_wavein_open(wave_dev) < 0) {
  809. spin_unlock_irqrestore(&wiinst->lock, flags);
  810. ERROR();
  811. return -EINVAL;
  812. }
  813. }
  814. wiinst->mmapped = 1;
  815. max_pages += wiinst->buffer.pages;
  816. spin_unlock_irqrestore(&wiinst->lock, flags);
  817. }
  818. n_pages = ((vma->vm_end - vma->vm_start) + PAGE_SIZE - 1) >> PAGE_SHIFT;
  819. pgoffset = vma->vm_pgoff;
  820. DPD(2, "vma_start: %#lx, vma_end: %#lx, vma_offset: %ld\n", vma->vm_start, vma->vm_end, pgoffset);
  821. DPD(2, "n_pages: %ld, max_pages: %ld\n", n_pages, max_pages);
  822. if (pgoffset + n_pages > max_pages)
  823. return -EINVAL;
  824. vma->vm_flags |= VM_RESERVED;
  825. vma->vm_ops = &emu10k1_mm_ops;
  826. vma->vm_private_data = wave_dev;
  827. return 0;
  828. }
  829. static int emu10k1_audio_open(struct inode *inode, struct file *file)
  830. {
  831. int minor = iminor(inode);
  832. struct emu10k1_card *card = NULL;
  833. struct list_head *entry;
  834. struct emu10k1_wavedevice *wave_dev;
  835. DPF(2, "emu10k1_audio_open()\n");
  836. /* Check for correct device to open */
  837. list_for_each(entry, &emu10k1_devs) {
  838. card = list_entry(entry, struct emu10k1_card, list);
  839. if (!((card->audio_dev ^ minor) & ~0xf) || !((card->audio_dev1 ^ minor) & ~0xf))
  840. goto match;
  841. }
  842. return -ENODEV;
  843. match:
  844. wave_dev = (struct emu10k1_wavedevice *) kmalloc(sizeof(struct emu10k1_wavedevice), GFP_KERNEL);
  845. if (wave_dev == NULL) {
  846. ERROR();
  847. return -ENOMEM;
  848. }
  849. wave_dev->card = card;
  850. wave_dev->wiinst = NULL;
  851. wave_dev->woinst = NULL;
  852. wave_dev->enablebits = PCM_ENABLE_OUTPUT | PCM_ENABLE_INPUT; /* Default */
  853. if (file->f_mode & FMODE_READ) {
  854. /* Recording */
  855. struct wiinst *wiinst;
  856. if ((wiinst = (struct wiinst *) kmalloc(sizeof(struct wiinst), GFP_KERNEL)) == NULL) {
  857. ERROR();
  858. kfree(wave_dev);
  859. return -ENOMEM;
  860. }
  861. wiinst->recsrc = card->wavein.recsrc;
  862. wiinst->fxwc = card->wavein.fxwc;
  863. switch (wiinst->recsrc) {
  864. case WAVERECORD_AC97:
  865. wiinst->format.id = AFMT_S16_LE;
  866. wiinst->format.samplingrate = 8000;
  867. wiinst->format.bitsperchannel = 16;
  868. wiinst->format.channels = 1;
  869. break;
  870. case WAVERECORD_MIC:
  871. wiinst->format.id = AFMT_S16_LE;
  872. wiinst->format.samplingrate = 8000;
  873. wiinst->format.bitsperchannel = 16;
  874. wiinst->format.channels = 1;
  875. break;
  876. case WAVERECORD_FX:
  877. wiinst->format.id = AFMT_S16_LE;
  878. wiinst->format.samplingrate = 48000;
  879. wiinst->format.bitsperchannel = 16;
  880. wiinst->format.channels = hweight32(wiinst->fxwc);
  881. break;
  882. default:
  883. kfree(wave_dev);
  884. kfree(wiinst);
  885. BUG();
  886. break;
  887. }
  888. wiinst->state = WAVE_STATE_CLOSED;
  889. wiinst->buffer.ossfragshift = 0;
  890. wiinst->buffer.fragment_size = 0;
  891. wiinst->buffer.numfrags = 0;
  892. init_waitqueue_head(&wiinst->wait_queue);
  893. wiinst->mmapped = 0;
  894. wiinst->total_recorded = 0;
  895. wiinst->blocks = 0;
  896. spin_lock_init(&wiinst->lock);
  897. tasklet_init(&wiinst->timer.tasklet, emu10k1_wavein_bh, (unsigned long) wave_dev);
  898. wave_dev->wiinst = wiinst;
  899. emu10k1_wavein_setformat(wave_dev, &wiinst->format);
  900. }
  901. if (file->f_mode & FMODE_WRITE) {
  902. struct woinst *woinst;
  903. int i;
  904. if ((woinst = (struct woinst *) kmalloc(sizeof(struct woinst), GFP_KERNEL)) == NULL) {
  905. ERROR();
  906. kfree(wave_dev);
  907. return -ENOMEM;
  908. }
  909. if (wave_dev->wiinst != NULL) {
  910. woinst->format = wave_dev->wiinst->format;
  911. } else {
  912. woinst->format.id = AFMT_U8;
  913. woinst->format.samplingrate = 8000;
  914. woinst->format.bitsperchannel = 8;
  915. woinst->format.channels = 1;
  916. }
  917. woinst->state = WAVE_STATE_CLOSED;
  918. woinst->buffer.fragment_size = 0;
  919. woinst->buffer.ossfragshift = 0;
  920. woinst->buffer.numfrags = 0;
  921. woinst->device = (card->audio_dev1 == minor);
  922. woinst->timer.state = TIMER_STATE_UNINSTALLED;
  923. woinst->num_voices = 1;
  924. for (i = 0; i < WAVEOUT_MAXVOICES; i++) {
  925. woinst->voice[i].usage = VOICE_USAGE_FREE;
  926. woinst->voice[i].mem.emupageindex = -1;
  927. }
  928. init_waitqueue_head(&woinst->wait_queue);
  929. woinst->mmapped = 0;
  930. woinst->total_copied = 0;
  931. woinst->total_played = 0;
  932. woinst->blocks = 0;
  933. spin_lock_init(&woinst->lock);
  934. tasklet_init(&woinst->timer.tasklet, emu10k1_waveout_bh, (unsigned long) wave_dev);
  935. wave_dev->woinst = woinst;
  936. emu10k1_waveout_setformat(wave_dev, &woinst->format);
  937. }
  938. file->private_data = (void *) wave_dev;
  939. return nonseekable_open(inode, file);
  940. }
  941. static int emu10k1_audio_release(struct inode *inode, struct file *file)
  942. {
  943. struct emu10k1_wavedevice *wave_dev = (struct emu10k1_wavedevice *) file->private_data;
  944. struct emu10k1_card *card;
  945. unsigned long flags;
  946. card = wave_dev->card;
  947. DPF(2, "emu10k1_audio_release()\n");
  948. if (file->f_mode & FMODE_WRITE) {
  949. struct woinst *woinst = wave_dev->woinst;
  950. spin_lock_irqsave(&woinst->lock, flags);
  951. if(woinst->format.passthrough==2)
  952. card->pt.state=PT_STATE_PLAYING;
  953. if (woinst->format.passthrough && card->pt.state != PT_STATE_INACTIVE){
  954. spin_lock(&card->pt.lock);
  955. emu10k1_pt_stop(card);
  956. spin_unlock(&card->pt.lock);
  957. }
  958. if (woinst->state & WAVE_STATE_OPEN) {
  959. if (woinst->state & WAVE_STATE_STARTED) {
  960. if (!(file->f_flags & O_NONBLOCK)) {
  961. while (!signal_pending(current)
  962. && (woinst->total_played < woinst->total_copied)) {
  963. DPF(4, "Buffer hasn't been totally played, sleep....\n");
  964. spin_unlock_irqrestore(&woinst->lock, flags);
  965. interruptible_sleep_on(&woinst->wait_queue);
  966. spin_lock_irqsave(&woinst->lock, flags);
  967. }
  968. }
  969. }
  970. emu10k1_waveout_close(wave_dev);
  971. }
  972. spin_unlock_irqrestore(&woinst->lock, flags);
  973. /* remove the tasklet */
  974. tasklet_kill(&woinst->timer.tasklet);
  975. kfree(wave_dev->woinst);
  976. }
  977. if (file->f_mode & FMODE_READ) {
  978. struct wiinst *wiinst = wave_dev->wiinst;
  979. spin_lock_irqsave(&wiinst->lock, flags);
  980. if (wiinst->state & WAVE_STATE_OPEN) {
  981. emu10k1_wavein_close(wave_dev);
  982. }
  983. spin_unlock_irqrestore(&wiinst->lock, flags);
  984. tasklet_kill(&wiinst->timer.tasklet);
  985. kfree(wave_dev->wiinst);
  986. }
  987. kfree(wave_dev);
  988. if (waitqueue_active(&card->open_wait))
  989. wake_up_interruptible(&card->open_wait);
  990. return 0;
  991. }
  992. /* FIXME sort out poll() + mmap() */
  993. static unsigned int emu10k1_audio_poll(struct file *file, struct poll_table_struct *wait)
  994. {
  995. struct emu10k1_wavedevice *wave_dev = (struct emu10k1_wavedevice *) file->private_data;
  996. struct woinst *woinst = wave_dev->woinst;
  997. struct wiinst *wiinst = wave_dev->wiinst;
  998. unsigned int mask = 0;
  999. u32 bytestocopy;
  1000. unsigned long flags;
  1001. DPF(4, "emu10k1_audio_poll()\n");
  1002. if (file->f_mode & FMODE_WRITE)
  1003. poll_wait(file, &woinst->wait_queue, wait);
  1004. if (file->f_mode & FMODE_READ)
  1005. poll_wait(file, &wiinst->wait_queue, wait);
  1006. if (file->f_mode & FMODE_WRITE) {
  1007. spin_lock_irqsave(&woinst->lock, flags);
  1008. if (woinst->state & WAVE_STATE_OPEN) {
  1009. emu10k1_waveout_update(woinst);
  1010. emu10k1_waveout_getxfersize(woinst, &bytestocopy);
  1011. if (bytestocopy >= woinst->buffer.fragment_size)
  1012. mask |= POLLOUT | POLLWRNORM;
  1013. } else
  1014. mask |= POLLOUT | POLLWRNORM;
  1015. spin_unlock_irqrestore(&woinst->lock, flags);
  1016. }
  1017. if (file->f_mode & FMODE_READ) {
  1018. spin_lock_irqsave(&wiinst->lock, flags);
  1019. if (wiinst->state & WAVE_STATE_OPEN) {
  1020. emu10k1_wavein_update(wave_dev->card, wiinst);
  1021. emu10k1_wavein_getxfersize(wiinst, &bytestocopy);
  1022. if (bytestocopy >= wiinst->buffer.fragment_size)
  1023. mask |= POLLIN | POLLRDNORM;
  1024. }
  1025. spin_unlock_irqrestore(&wiinst->lock, flags);
  1026. }
  1027. return mask;
  1028. }
  1029. static void calculate_ofrag(struct woinst *woinst)
  1030. {
  1031. struct waveout_buffer *buffer = &woinst->buffer;
  1032. u32 fragsize;
  1033. if (buffer->fragment_size)
  1034. return;
  1035. if (!buffer->ossfragshift) {
  1036. fragsize = (woinst->format.bytespervoicesample * woinst->format.samplingrate * WAVEOUT_DEFAULTFRAGLEN) / 1000 - 1;
  1037. while (fragsize) {
  1038. fragsize >>= 1;
  1039. buffer->ossfragshift++;
  1040. }
  1041. }
  1042. if (buffer->ossfragshift < WAVEOUT_MINFRAGSHIFT)
  1043. buffer->ossfragshift = WAVEOUT_MINFRAGSHIFT;
  1044. buffer->fragment_size = 1 << buffer->ossfragshift;
  1045. while (buffer->fragment_size * WAVEOUT_MINFRAGS > WAVEOUT_MAXBUFSIZE)
  1046. buffer->fragment_size >>= 1;
  1047. /* now we are sure that:
  1048. (2^WAVEOUT_MINFRAGSHIFT) <= (fragment_size = 2^n) <= (WAVEOUT_MAXBUFSIZE / WAVEOUT_MINFRAGS)
  1049. */
  1050. if (!buffer->numfrags) {
  1051. u32 numfrags;
  1052. numfrags = (woinst->format.bytespervoicesample * woinst->format.samplingrate * WAVEOUT_DEFAULTBUFLEN) /
  1053. (buffer->fragment_size * 1000) - 1;
  1054. buffer->numfrags = 1;
  1055. while (numfrags) {
  1056. numfrags >>= 1;
  1057. buffer->numfrags <<= 1;
  1058. }
  1059. }
  1060. if (buffer->numfrags < WAVEOUT_MINFRAGS)
  1061. buffer->numfrags = WAVEOUT_MINFRAGS;
  1062. if (buffer->numfrags * buffer->fragment_size > WAVEOUT_MAXBUFSIZE)
  1063. buffer->numfrags = WAVEOUT_MAXBUFSIZE / buffer->fragment_size;
  1064. if (buffer->numfrags < WAVEOUT_MINFRAGS)
  1065. BUG();
  1066. buffer->size = buffer->fragment_size * buffer->numfrags;
  1067. buffer->pages = buffer->size / PAGE_SIZE + ((buffer->size % PAGE_SIZE) ? 1 : 0);
  1068. DPD(2, " calculated playback fragment_size -> %d\n", buffer->fragment_size);
  1069. DPD(2, " calculated playback numfrags -> %d\n", buffer->numfrags);
  1070. return;
  1071. }
  1072. static void calculate_ifrag(struct wiinst *wiinst)
  1073. {
  1074. struct wavein_buffer *buffer = &wiinst->buffer;
  1075. u32 fragsize, bufsize, size[4];
  1076. int i, j;
  1077. if (buffer->fragment_size)
  1078. return;
  1079. if (!buffer->ossfragshift) {
  1080. fragsize = (wiinst->format.bytespersec * WAVEIN_DEFAULTFRAGLEN) / 1000 - 1;
  1081. while (fragsize) {
  1082. fragsize >>= 1;
  1083. buffer->ossfragshift++;
  1084. }
  1085. }
  1086. if (buffer->ossfragshift < WAVEIN_MINFRAGSHIFT)
  1087. buffer->ossfragshift = WAVEIN_MINFRAGSHIFT;
  1088. buffer->fragment_size = 1 << buffer->ossfragshift;
  1089. while (buffer->fragment_size * WAVEIN_MINFRAGS > WAVEIN_MAXBUFSIZE)
  1090. buffer->fragment_size >>= 1;
  1091. /* now we are sure that:
  1092. (2^WAVEIN_MINFRAGSHIFT) <= (fragment_size = 2^n) <= (WAVEIN_MAXBUFSIZE / WAVEIN_MINFRAGS)
  1093. */
  1094. if (!buffer->numfrags)
  1095. buffer->numfrags = (wiinst->format.bytespersec * WAVEIN_DEFAULTBUFLEN) / (buffer->fragment_size * 1000) - 1;
  1096. if (buffer->numfrags < WAVEIN_MINFRAGS)
  1097. buffer->numfrags = WAVEIN_MINFRAGS;
  1098. if (buffer->numfrags * buffer->fragment_size > WAVEIN_MAXBUFSIZE)
  1099. buffer->numfrags = WAVEIN_MAXBUFSIZE / buffer->fragment_size;
  1100. if (buffer->numfrags < WAVEIN_MINFRAGS)
  1101. BUG();
  1102. bufsize = buffer->fragment_size * buffer->numfrags;
  1103. /* the buffer size for recording is restricted to certain values, adjust it now */
  1104. if (bufsize >= 0x10000) {
  1105. buffer->size = 0x10000;
  1106. buffer->sizeregval = 0x1f;
  1107. } else {
  1108. buffer->size = 0;
  1109. size[0] = 384;
  1110. size[1] = 448;
  1111. size[2] = 512;
  1112. size[3] = 640;
  1113. for (i = 0; i < 8; i++)
  1114. for (j = 0; j < 4; j++)
  1115. if (bufsize >= size[j]) {
  1116. buffer->size = size[j];
  1117. size[j] *= 2;
  1118. buffer->sizeregval = i * 4 + j + 1;
  1119. } else
  1120. goto exitloop;
  1121. exitloop:
  1122. if (buffer->size == 0) {
  1123. buffer->size = 384;
  1124. buffer->sizeregval = 0x01;
  1125. }
  1126. }
  1127. /* adjust the fragment size so that buffer size is an integer multiple */
  1128. while (buffer->size % buffer->fragment_size)
  1129. buffer->fragment_size >>= 1;
  1130. buffer->numfrags = buffer->size / buffer->fragment_size;
  1131. buffer->pages = buffer->size / PAGE_SIZE + ((buffer->size % PAGE_SIZE) ? 1 : 0);
  1132. DPD(2, " calculated recording fragment_size -> %d\n", buffer->fragment_size);
  1133. DPD(2, " calculated recording numfrags -> %d\n", buffer->numfrags);
  1134. DPD(2, " buffer size register -> %#04x\n", buffer->sizeregval);
  1135. return;
  1136. }
  1137. static void emu10k1_wavein_bh(unsigned long refdata)
  1138. {
  1139. struct emu10k1_wavedevice *wave_dev = (struct emu10k1_wavedevice *) refdata;
  1140. struct wiinst *wiinst = wave_dev->wiinst;
  1141. u32 bytestocopy;
  1142. unsigned long flags;
  1143. if (!wiinst)
  1144. return;
  1145. spin_lock_irqsave(&wiinst->lock, flags);
  1146. if (!(wiinst->state & WAVE_STATE_STARTED)) {
  1147. spin_unlock_irqrestore(&wiinst->lock, flags);
  1148. return;
  1149. }
  1150. emu10k1_wavein_update(wave_dev->card, wiinst);
  1151. emu10k1_wavein_getxfersize(wiinst, &bytestocopy);
  1152. spin_unlock_irqrestore(&wiinst->lock, flags);
  1153. if (bytestocopy >= wiinst->buffer.fragment_size) {
  1154. if (waitqueue_active(&wiinst->wait_queue))
  1155. wake_up_interruptible(&wiinst->wait_queue);
  1156. } else
  1157. DPD(3, "Not enough transfer size, %d\n", bytestocopy);
  1158. return;
  1159. }
  1160. static void emu10k1_waveout_bh(unsigned long refdata)
  1161. {
  1162. struct emu10k1_wavedevice *wave_dev = (struct emu10k1_wavedevice *) refdata;
  1163. struct woinst *woinst = wave_dev->woinst;
  1164. u32 bytestocopy;
  1165. unsigned long flags;
  1166. if (!woinst)
  1167. return;
  1168. spin_lock_irqsave(&woinst->lock, flags);
  1169. if (!(woinst->state & WAVE_STATE_STARTED)) {
  1170. spin_unlock_irqrestore(&woinst->lock, flags);
  1171. return;
  1172. }
  1173. emu10k1_waveout_update(woinst);
  1174. emu10k1_waveout_getxfersize(woinst, &bytestocopy);
  1175. if (woinst->buffer.fill_silence) {
  1176. spin_unlock_irqrestore(&woinst->lock, flags);
  1177. emu10k1_waveout_fillsilence(woinst);
  1178. } else
  1179. spin_unlock_irqrestore(&woinst->lock, flags);
  1180. if (bytestocopy >= woinst->buffer.fragment_size) {
  1181. if (waitqueue_active(&woinst->wait_queue))
  1182. wake_up_interruptible(&woinst->wait_queue);
  1183. } else
  1184. DPD(3, "Not enough transfer size -> %d\n", bytestocopy);
  1185. return;
  1186. }
  1187. struct file_operations emu10k1_audio_fops = {
  1188. .owner = THIS_MODULE,
  1189. .llseek = no_llseek,
  1190. .read = emu10k1_audio_read,
  1191. .write = emu10k1_audio_write,
  1192. .poll = emu10k1_audio_poll,
  1193. .ioctl = emu10k1_audio_ioctl,
  1194. .mmap = emu10k1_audio_mmap,
  1195. .open = emu10k1_audio_open,
  1196. .release = emu10k1_audio_release,
  1197. };