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

Linux/Unix编程

开发平台:

Unix_Linux

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