2 **********************************************************************
3 * audio.c -- /dev/dsp interface for emu10k1 driver
4 * Copyright 1999, 2000 Creative Labs, Inc.
6 **********************************************************************
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
13 **********************************************************************
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.
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.
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,
30 **********************************************************************
33 #include <linux/module.h>
34 #include <linux/poll.h>
35 #include <linux/slab.h>
36 #include <linux/bitops.h>
38 #include <linux/sched.h>
39 #include <linux/smp_lock.h>
49 static void calculate_ofrag(struct woinst *);
50 static void calculate_ifrag(struct wiinst *);
52 /* Audio file operations */
53 static ssize_t emu10k1_audio_read(struct file *file, char __user *buffer, size_t count, loff_t * ppos)
55 struct emu10k1_wavedevice *wave_dev = (struct emu10k1_wavedevice *) file->private_data;
56 struct wiinst *wiinst = wave_dev->wiinst;
60 DPD(3, "emu10k1_audio_read(), buffer=%p, count=%d\n", buffer, (u32) count);
62 if (ppos != &file->f_pos)
65 if (!access_ok(VERIFY_WRITE, buffer, count))
68 spin_lock_irqsave(&wiinst->lock, flags);
70 if (wiinst->mmapped) {
71 spin_unlock_irqrestore(&wiinst->lock, flags);
75 if (wiinst->state == WAVE_STATE_CLOSED) {
76 calculate_ifrag(wiinst);
78 while (emu10k1_wavein_open(wave_dev) < 0) {
79 spin_unlock_irqrestore(&wiinst->lock, flags);
81 if (file->f_flags & O_NONBLOCK)
84 interruptible_sleep_on(&wave_dev->card->open_wait);
86 if (signal_pending(current))
89 spin_lock_irqsave(&wiinst->lock, flags);
93 spin_unlock_irqrestore(&wiinst->lock, flags);
98 spin_lock_irqsave(&wiinst->lock, flags);
100 if (!(wiinst->state & WAVE_STATE_STARTED)
101 && (wave_dev->enablebits & PCM_ENABLE_INPUT))
102 emu10k1_wavein_start(wave_dev);
104 emu10k1_wavein_update(wave_dev->card, wiinst);
105 emu10k1_wavein_getxfersize(wiinst, &bytestocopy);
107 spin_unlock_irqrestore(&wiinst->lock, flags);
109 DPD(3, "bytestocopy --> %d\n", bytestocopy);
111 if ((bytestocopy >= wiinst->buffer.fragment_size)
112 || (bytestocopy >= count)) {
113 bytestocopy = min_t(u32, bytestocopy, count);
115 emu10k1_wavein_xferdata(wiinst, (u8 __user *)buffer, &bytestocopy);
117 count -= bytestocopy;
118 buffer += bytestocopy;
123 if ((file->f_flags & O_NONBLOCK)
124 || (!(wave_dev->enablebits & PCM_ENABLE_INPUT)))
125 return (ret ? ret : -EAGAIN);
127 interruptible_sleep_on(&wiinst->wait_queue);
129 if (signal_pending(current))
130 return (ret ? ret : -ERESTARTSYS);
135 DPD(3, "bytes copied -> %d\n", (u32) ret);
140 static ssize_t emu10k1_audio_write(struct file *file, const char __user *buffer, size_t count, loff_t * ppos)
142 struct emu10k1_wavedevice *wave_dev = (struct emu10k1_wavedevice *) file->private_data;
143 struct woinst *woinst = wave_dev->woinst;
147 DPD(3, "emu10k1_audio_write(), buffer=%p, count=%d\n", buffer, (u32) count);
149 if (ppos != &file->f_pos)
152 if (!access_ok(VERIFY_READ, buffer, count))
155 spin_lock_irqsave(&woinst->lock, flags);
157 if (woinst->mmapped) {
158 spin_unlock_irqrestore(&woinst->lock, flags);
161 // This is for emu10k1 revs less than 7, we need to go through tram
162 if (woinst->format.passthrough == 1) {
165 woinst->buffer.ossfragshift = PT_BLOCKSIZE_LOG2;
166 woinst->buffer.numfrags = PT_BLOCKCOUNT;
167 calculate_ofrag(woinst);
169 r = emu10k1_pt_write(file, buffer, count);
170 spin_unlock_irqrestore(&woinst->lock, flags);
174 if (woinst->state == WAVE_STATE_CLOSED) {
175 calculate_ofrag(woinst);
177 while (emu10k1_waveout_open(wave_dev) < 0) {
178 spin_unlock_irqrestore(&woinst->lock, flags);
180 if (file->f_flags & O_NONBLOCK)
183 interruptible_sleep_on(&wave_dev->card->open_wait);
185 if (signal_pending(current))
188 spin_lock_irqsave(&woinst->lock, flags);
192 spin_unlock_irqrestore(&woinst->lock, flags);
195 if (count % woinst->format.bytespersample)
198 count /= woinst->num_voices;
203 spin_lock_irqsave(&woinst->lock, flags);
204 emu10k1_waveout_update(woinst);
205 emu10k1_waveout_getxfersize(woinst, &bytestocopy);
206 spin_unlock_irqrestore(&woinst->lock, flags);
208 DPD(3, "bytestocopy --> %d\n", bytestocopy);
210 if ((bytestocopy >= woinst->buffer.fragment_size)
211 || (bytestocopy >= count)) {
213 bytestocopy = min_t(u32, bytestocopy, count);
215 emu10k1_waveout_xferdata(woinst, (u8 __user *) buffer, &bytestocopy);
217 count -= bytestocopy;
218 buffer += bytestocopy * woinst->num_voices;
219 ret += bytestocopy * woinst->num_voices;
221 spin_lock_irqsave(&woinst->lock, flags);
222 woinst->total_copied += bytestocopy;
224 if (!(woinst->state & WAVE_STATE_STARTED)
225 && (wave_dev->enablebits & PCM_ENABLE_OUTPUT)
226 && (woinst->total_copied >= woinst->buffer.fragment_size))
227 emu10k1_waveout_start(wave_dev);
229 spin_unlock_irqrestore(&woinst->lock, flags);
233 if ((file->f_flags & O_NONBLOCK)
234 || (!(wave_dev->enablebits & PCM_ENABLE_OUTPUT)))
235 return (ret ? ret : -EAGAIN);
237 interruptible_sleep_on(&woinst->wait_queue);
239 if (signal_pending(current))
240 return (ret ? ret : -ERESTARTSYS);
244 DPD(3, "bytes copied -> %d\n", (u32) ret);
249 static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
251 struct emu10k1_wavedevice *wave_dev = (struct emu10k1_wavedevice *) file->private_data;
252 struct woinst *woinst = NULL;
253 struct wiinst *wiinst = NULL;
257 int __user *p = (int __user *)arg;
259 DPF(4, "emu10k1_audio_ioctl()\n");
261 if (file->f_mode & FMODE_WRITE)
262 woinst = wave_dev->woinst;
264 if (file->f_mode & FMODE_READ)
265 wiinst = wave_dev->wiinst;
269 DPF(2, "OSS_GETVERSION:\n");
270 return put_user(SOUND_VERSION, p);
272 case SNDCTL_DSP_RESET:
273 DPF(2, "SNDCTL_DSP_RESET:\n");
274 wave_dev->enablebits = PCM_ENABLE_OUTPUT | PCM_ENABLE_INPUT;
276 if (file->f_mode & FMODE_WRITE) {
277 spin_lock_irqsave(&woinst->lock, flags);
279 if (woinst->state & WAVE_STATE_OPEN) {
280 emu10k1_waveout_close(wave_dev);
284 woinst->total_copied = 0;
285 woinst->total_played = 0;
288 spin_unlock_irqrestore(&woinst->lock, flags);
291 if (file->f_mode & FMODE_READ) {
292 spin_lock_irqsave(&wiinst->lock, flags);
294 if (wiinst->state & WAVE_STATE_OPEN) {
295 emu10k1_wavein_close(wave_dev);
299 wiinst->total_recorded = 0;
301 spin_unlock_irqrestore(&wiinst->lock, flags);
306 case SNDCTL_DSP_SYNC:
307 DPF(2, "SNDCTL_DSP_SYNC:\n");
309 if (file->f_mode & FMODE_WRITE) {
311 spin_lock_irqsave(&woinst->lock, flags);
313 if (woinst->state & WAVE_STATE_OPEN) {
315 if (woinst->state & WAVE_STATE_STARTED)
316 while ((woinst->total_played < woinst->total_copied)
317 && !signal_pending(current)) {
318 spin_unlock_irqrestore(&woinst->lock, flags);
319 interruptible_sleep_on(&woinst->wait_queue);
320 spin_lock_irqsave(&woinst->lock, flags);
322 emu10k1_waveout_close(wave_dev);
326 woinst->total_copied = 0;
327 woinst->total_played = 0;
330 spin_unlock_irqrestore(&woinst->lock, flags);
333 if (file->f_mode & FMODE_READ) {
334 spin_lock_irqsave(&wiinst->lock, flags);
336 if (wiinst->state & WAVE_STATE_OPEN) {
337 emu10k1_wavein_close(wave_dev);
341 wiinst->total_recorded = 0;
343 spin_unlock_irqrestore(&wiinst->lock, flags);
348 case SNDCTL_DSP_SETDUPLEX:
349 DPF(2, "SNDCTL_DSP_SETDUPLEX:\n");
352 case SNDCTL_DSP_GETCAPS:
353 DPF(2, "SNDCTL_DSP_GETCAPS:\n");
354 return put_user(DSP_CAP_DUPLEX | DSP_CAP_REALTIME |
355 DSP_CAP_TRIGGER | DSP_CAP_MMAP |
356 DSP_CAP_COPROC| DSP_CAP_MULTI, p);
357 case SNDCTL_DSP_SPEED:
358 DPF(2, "SNDCTL_DSP_SPEED:\n");
360 if (get_user(val, p))
363 DPD(2, "val is %d\n", val);
366 if (file->f_mode & FMODE_READ) {
367 struct wave_format format;
369 spin_lock_irqsave(&wiinst->lock, flags);
371 format = wiinst->format;
372 format.samplingrate = val;
374 if (emu10k1_wavein_setformat(wave_dev, &format) < 0) {
375 spin_unlock_irqrestore(&wiinst->lock, flags);
379 val = wiinst->format.samplingrate;
381 spin_unlock_irqrestore(&wiinst->lock, flags);
383 DPD(2, "set recording sampling rate -> %d\n", val);
386 if (file->f_mode & FMODE_WRITE) {
387 struct wave_format format;
389 spin_lock_irqsave(&woinst->lock, flags);
391 format = woinst->format;
392 format.samplingrate = val;
394 if (emu10k1_waveout_setformat(wave_dev, &format) < 0) {
395 spin_unlock_irqrestore(&woinst->lock, flags);
399 val = woinst->format.samplingrate;
401 spin_unlock_irqrestore(&woinst->lock, flags);
403 DPD(2, "set playback sampling rate -> %d\n", val);
406 return put_user(val, p);
408 if (file->f_mode & FMODE_READ)
409 val = wiinst->format.samplingrate;
410 else if (file->f_mode & FMODE_WRITE)
411 val = woinst->format.samplingrate;
413 return put_user(val, p);
417 case SNDCTL_DSP_STEREO:
418 DPF(2, "SNDCTL_DSP_STEREO:\n");
420 if (get_user(val, p))
423 DPD(2, " val is %d\n", val);
425 if (file->f_mode & FMODE_READ) {
426 struct wave_format format;
428 spin_lock_irqsave(&wiinst->lock, flags);
430 format = wiinst->format;
431 format.channels = val ? 2 : 1;
433 if (emu10k1_wavein_setformat(wave_dev, &format) < 0) {
434 spin_unlock_irqrestore(&wiinst->lock, flags);
438 val = wiinst->format.channels - 1;
440 spin_unlock_irqrestore(&wiinst->lock, flags);
441 DPD(2, "set recording stereo -> %d\n", val);
444 if (file->f_mode & FMODE_WRITE) {
445 struct wave_format format;
447 spin_lock_irqsave(&woinst->lock, flags);
449 format = woinst->format;
450 format.channels = val ? 2 : 1;
452 if (emu10k1_waveout_setformat(wave_dev, &format) < 0) {
453 spin_unlock_irqrestore(&woinst->lock, flags);
457 val = woinst->format.channels - 1;
459 spin_unlock_irqrestore(&woinst->lock, flags);
461 DPD(2, "set playback stereo -> %d\n", val);
464 return put_user(val, p);
468 case SNDCTL_DSP_CHANNELS:
469 DPF(2, "SNDCTL_DSP_CHANNELS:\n");
471 if (get_user(val, p))
474 DPD(2, " val is %d\n", val);
477 if (file->f_mode & FMODE_READ) {
478 struct wave_format format;
480 spin_lock_irqsave(&wiinst->lock, flags);
482 format = wiinst->format;
483 format.channels = val;
485 if (emu10k1_wavein_setformat(wave_dev, &format) < 0) {
486 spin_unlock_irqrestore(&wiinst->lock, flags);
489 val = wiinst->format.channels;
491 spin_unlock_irqrestore(&wiinst->lock, flags);
492 DPD(2, "set recording number of channels -> %d\n", val);
495 if (file->f_mode & FMODE_WRITE) {
496 struct wave_format format;
498 spin_lock_irqsave(&woinst->lock, flags);
500 format = woinst->format;
501 format.channels = val;
503 if (emu10k1_waveout_setformat(wave_dev, &format) < 0) {
504 spin_unlock_irqrestore(&woinst->lock, flags);
508 val = woinst->format.channels;
510 spin_unlock_irqrestore(&woinst->lock, flags);
511 DPD(2, "set playback number of channels -> %d\n", val);
514 return put_user(val, p);
516 if (file->f_mode & FMODE_READ)
517 val = wiinst->format.channels;
518 else if (file->f_mode & FMODE_WRITE)
519 val = woinst->format.channels;
521 return put_user(val, p);
525 case SNDCTL_DSP_GETFMTS:
526 DPF(2, "SNDCTL_DSP_GETFMTS:\n");
528 if (file->f_mode & FMODE_READ)
530 else if (file->f_mode & FMODE_WRITE) {
531 val = AFMT_S16_LE | AFMT_U8;
532 if (emu10k1_find_control_gpr(&wave_dev->card->mgr,
533 wave_dev->card->pt.patch_name,
534 wave_dev->card->pt.enable_gpr_name) >= 0)
537 return put_user(val, p);
539 case SNDCTL_DSP_SETFMT: /* Same as SNDCTL_DSP_SAMPLESIZE */
540 DPF(2, "SNDCTL_DSP_SETFMT:\n");
542 if (get_user(val, p))
545 DPD(2, " val is %d\n", val);
547 if (val != AFMT_QUERY) {
548 if (file->f_mode & FMODE_READ) {
549 struct wave_format format;
551 spin_lock_irqsave(&wiinst->lock, flags);
553 format = wiinst->format;
556 if (emu10k1_wavein_setformat(wave_dev, &format) < 0) {
557 spin_unlock_irqrestore(&wiinst->lock, flags);
561 val = wiinst->format.id;
563 spin_unlock_irqrestore(&wiinst->lock, flags);
564 DPD(2, "set recording format -> %d\n", val);
567 if (file->f_mode & FMODE_WRITE) {
568 struct wave_format format;
570 spin_lock_irqsave(&woinst->lock, flags);
572 format = woinst->format;
575 if (emu10k1_waveout_setformat(wave_dev, &format) < 0) {
576 spin_unlock_irqrestore(&woinst->lock, flags);
580 val = woinst->format.id;
582 spin_unlock_irqrestore(&woinst->lock, flags);
583 DPD(2, "set playback format -> %d\n", val);
586 return put_user(val, p);
588 if (file->f_mode & FMODE_READ)
589 val = wiinst->format.id;
590 else if (file->f_mode & FMODE_WRITE)
591 val = woinst->format.id;
593 return put_user(val, p);
597 case SOUND_PCM_READ_BITS:
599 if (file->f_mode & FMODE_READ)
600 val = wiinst->format.bitsperchannel;
601 else if (file->f_mode & FMODE_WRITE)
602 val = woinst->format.bitsperchannel;
604 return put_user(val, p);
606 case SOUND_PCM_READ_RATE:
608 if (file->f_mode & FMODE_READ)
609 val = wiinst->format.samplingrate;
610 else if (file->f_mode & FMODE_WRITE)
611 val = woinst->format.samplingrate;
613 return put_user(val, p);
615 case SOUND_PCM_READ_CHANNELS:
617 if (file->f_mode & FMODE_READ)
618 val = wiinst->format.channels;
619 else if (file->f_mode & FMODE_WRITE)
620 val = woinst->format.channels;
622 return put_user(val, p);
624 case SOUND_PCM_WRITE_FILTER:
625 DPF(2, "SOUND_PCM_WRITE_FILTER: not implemented\n");
628 case SOUND_PCM_READ_FILTER:
629 DPF(2, "SOUND_PCM_READ_FILTER: not implemented\n");
632 case SNDCTL_DSP_SETSYNCRO:
633 DPF(2, "SNDCTL_DSP_SETSYNCRO: not implemented\n");
636 case SNDCTL_DSP_GETTRIGGER:
637 DPF(2, "SNDCTL_DSP_GETTRIGGER:\n");
639 if (file->f_mode & FMODE_WRITE && (wave_dev->enablebits & PCM_ENABLE_OUTPUT))
640 val |= PCM_ENABLE_OUTPUT;
642 if (file->f_mode & FMODE_READ && (wave_dev->enablebits & PCM_ENABLE_INPUT))
643 val |= PCM_ENABLE_INPUT;
645 return put_user(val, p);
647 case SNDCTL_DSP_SETTRIGGER:
648 DPF(2, "SNDCTL_DSP_SETTRIGGER:\n");
650 if (get_user(val, p))
653 if (file->f_mode & FMODE_WRITE) {
654 spin_lock_irqsave(&woinst->lock, flags);
656 if (val & PCM_ENABLE_OUTPUT) {
657 wave_dev->enablebits |= PCM_ENABLE_OUTPUT;
658 if (woinst->state & WAVE_STATE_OPEN)
659 emu10k1_waveout_start(wave_dev);
661 wave_dev->enablebits &= ~PCM_ENABLE_OUTPUT;
662 if (woinst->state & WAVE_STATE_STARTED)
663 emu10k1_waveout_stop(wave_dev);
666 spin_unlock_irqrestore(&woinst->lock, flags);
669 if (file->f_mode & FMODE_READ) {
670 spin_lock_irqsave(&wiinst->lock, flags);
672 if (val & PCM_ENABLE_INPUT) {
673 wave_dev->enablebits |= PCM_ENABLE_INPUT;
674 if (wiinst->state & WAVE_STATE_OPEN)
675 emu10k1_wavein_start(wave_dev);
677 wave_dev->enablebits &= ~PCM_ENABLE_INPUT;
678 if (wiinst->state & WAVE_STATE_STARTED)
679 emu10k1_wavein_stop(wave_dev);
682 spin_unlock_irqrestore(&wiinst->lock, flags);
686 case SNDCTL_DSP_GETOSPACE:
690 DPF(4, "SNDCTL_DSP_GETOSPACE:\n");
692 if (!(file->f_mode & FMODE_WRITE))
695 spin_lock_irqsave(&woinst->lock, flags);
697 if (woinst->state & WAVE_STATE_OPEN) {
698 emu10k1_waveout_update(woinst);
699 emu10k1_waveout_getxfersize(woinst, &bytestocopy);
700 info.bytes = bytestocopy;
702 calculate_ofrag(woinst);
703 info.bytes = woinst->buffer.size;
705 spin_unlock_irqrestore(&woinst->lock, flags);
707 info.bytes *= woinst->num_voices;
708 info.fragsize = woinst->buffer.fragment_size * woinst->num_voices;
709 info.fragstotal = woinst->buffer.numfrags * woinst->num_voices;
710 info.fragments = info.bytes / info.fragsize;
712 if (copy_to_user(p, &info, sizeof(info)))
717 case SNDCTL_DSP_GETISPACE:
721 DPF(4, "SNDCTL_DSP_GETISPACE:\n");
723 if (!(file->f_mode & FMODE_READ))
726 spin_lock_irqsave(&wiinst->lock, flags);
727 if (wiinst->state & WAVE_STATE_OPEN) {
728 emu10k1_wavein_update(wave_dev->card, wiinst);
729 emu10k1_wavein_getxfersize(wiinst, &bytestocopy);
730 info.bytes = bytestocopy;
732 calculate_ifrag(wiinst);
735 spin_unlock_irqrestore(&wiinst->lock, flags);
737 info.fragstotal = wiinst->buffer.numfrags;
738 info.fragments = info.bytes / wiinst->buffer.fragment_size;
739 info.fragsize = wiinst->buffer.fragment_size;
741 if (copy_to_user(p, &info, sizeof(info)))
746 case SNDCTL_DSP_NONBLOCK:
747 DPF(2, "SNDCTL_DSP_NONBLOCK:\n");
749 file->f_flags |= O_NONBLOCK;
752 case SNDCTL_DSP_GETODELAY:
753 DPF(4, "SNDCTL_DSP_GETODELAY:\n");
755 if (!(file->f_mode & FMODE_WRITE))
758 spin_lock_irqsave(&woinst->lock, flags);
759 if (woinst->state & WAVE_STATE_OPEN) {
760 emu10k1_waveout_update(woinst);
761 emu10k1_waveout_getxfersize(woinst, &bytestocopy);
762 val = woinst->buffer.size - bytestocopy;
766 val *= woinst->num_voices;
767 spin_unlock_irqrestore(&woinst->lock, flags);
769 return put_user(val, p);
771 case SNDCTL_DSP_GETIPTR:
775 DPF(4, "SNDCTL_DSP_GETIPTR: \n");
777 if (!(file->f_mode & FMODE_READ))
780 spin_lock_irqsave(&wiinst->lock, flags);
782 if (wiinst->state & WAVE_STATE_OPEN) {
783 emu10k1_wavein_update(wave_dev->card, wiinst);
784 cinfo.ptr = wiinst->buffer.hw_pos;
785 cinfo.bytes = cinfo.ptr + wiinst->total_recorded - wiinst->total_recorded % wiinst->buffer.size;
786 cinfo.blocks = cinfo.bytes / wiinst->buffer.fragment_size - wiinst->blocks;
787 wiinst->blocks = cinfo.bytes / wiinst->buffer.fragment_size;
795 wiinst->buffer.bytestocopy %= wiinst->buffer.fragment_size;
797 spin_unlock_irqrestore(&wiinst->lock, flags);
799 if (copy_to_user(p, &cinfo, sizeof(cinfo)))
804 case SNDCTL_DSP_GETOPTR:
808 DPF(4, "SNDCTL_DSP_GETOPTR:\n");
810 if (!(file->f_mode & FMODE_WRITE))
813 spin_lock_irqsave(&woinst->lock, flags);
815 if (woinst->state & WAVE_STATE_OPEN ||
816 ((woinst->format.passthrough == 1) && wave_dev->card->pt.state)) {
819 if (woinst->format.passthrough == 1) {
820 emu10k1_pt_waveout_update(wave_dev);
821 cinfo.bytes = woinst->total_played;
823 emu10k1_waveout_update(woinst);
824 cinfo.bytes = woinst->total_played;
827 cinfo.ptr = woinst->buffer.hw_pos;
828 num_fragments = cinfo.bytes / woinst->buffer.fragment_size;
829 cinfo.blocks = num_fragments - woinst->blocks;
830 woinst->blocks = num_fragments;
832 cinfo.bytes *= woinst->num_voices;
833 cinfo.ptr *= woinst->num_voices;
841 woinst->buffer.free_bytes %= woinst->buffer.fragment_size;
843 spin_unlock_irqrestore(&woinst->lock, flags);
845 if (copy_to_user(p, &cinfo, sizeof(cinfo)))
850 case SNDCTL_DSP_GETBLKSIZE:
851 DPF(2, "SNDCTL_DSP_GETBLKSIZE:\n");
853 if (file->f_mode & FMODE_WRITE) {
854 spin_lock_irqsave(&woinst->lock, flags);
856 calculate_ofrag(woinst);
857 val = woinst->buffer.fragment_size * woinst->num_voices;
859 spin_unlock_irqrestore(&woinst->lock, flags);
862 if (file->f_mode & FMODE_READ) {
863 spin_lock_irqsave(&wiinst->lock, flags);
865 calculate_ifrag(wiinst);
866 val = wiinst->buffer.fragment_size;
868 spin_unlock_irqrestore(&wiinst->lock, flags);
871 return put_user(val, p);
875 case SNDCTL_DSP_POST:
876 if (file->f_mode & FMODE_WRITE) {
877 spin_lock_irqsave(&woinst->lock, flags);
879 if (!(woinst->state & WAVE_STATE_STARTED)
880 && (wave_dev->enablebits & PCM_ENABLE_OUTPUT)
881 && (woinst->total_copied > 0))
882 emu10k1_waveout_start(wave_dev);
884 spin_unlock_irqrestore(&woinst->lock, flags);
889 case SNDCTL_DSP_SUBDIVIDE:
890 DPF(2, "SNDCTL_DSP_SUBDIVIDE: not implemented\n");
893 case SNDCTL_DSP_SETFRAGMENT:
894 DPF(2, "SNDCTL_DSP_SETFRAGMENT:\n");
896 if (get_user(val, p))
899 DPD(2, "val is %#x\n", val);
904 if (file->f_mode & FMODE_WRITE) {
905 /* digital pass-through fragment count and size are fixed values */
906 if (woinst->state & WAVE_STATE_OPEN || (woinst->format.passthrough == 1))
907 return -EINVAL; /* too late to change */
909 woinst->buffer.ossfragshift = val & 0xffff;
910 woinst->buffer.numfrags = (val >> 16) & 0xffff;
913 if (file->f_mode & FMODE_READ) {
914 if (wiinst->state & WAVE_STATE_OPEN)
915 return -EINVAL; /* too late to change */
917 wiinst->buffer.ossfragshift = val & 0xffff;
918 wiinst->buffer.numfrags = (val >> 16) & 0xffff;
923 case SNDCTL_COPR_LOAD:
928 DPF(4, "SNDCTL_COPR_LOAD:\n");
930 buf = kmalloc(sizeof(copr_buffer), GFP_KERNEL);
934 if (copy_from_user(buf, p, sizeof(copr_buffer))) {
939 if ((buf->command != CMD_READ) && (buf->command != CMD_WRITE)) {
944 if (buf->command == CMD_WRITE) {
947 if ((buf->offs < 0) || (buf->offs + buf->len > 0xe00) || (buf->len > 1000)) {
949 if (((buf->offs < 0x100) || (buf->offs + buf->len > (wave_dev->card->is_audigy ? 0xe00 : 0x800)) || (buf->len > 1000)
951 //any register allowed raw access to users goes here:
954 && (buf->len == 1))) {
960 if ((buf->offs < 0) || (buf->offs + buf->len > 0xe00) || (buf->len > 1000)) {
966 if (((unsigned)buf->flags) > 0x3f)
969 if (buf->command == CMD_READ) {
970 for (i = 0; i < buf->len; i++)
971 ((u32 *) buf->data)[i] = sblive_readptr(wave_dev->card, buf->offs + i, buf->flags);
973 if (copy_to_user(p, buf, sizeof(copr_buffer))) {
978 for (i = 0; i < buf->len; i++)
979 sblive_writeptr(wave_dev->card, buf->offs + i, buf->flags, ((u32 *) buf->data)[i]);
986 default: /* Default is unrecognized command */
987 DPD(2, "default: %#x\n", cmd);
993 static struct page *emu10k1_mm_nopage (struct vm_area_struct * vma, unsigned long address, int *type)
995 struct emu10k1_wavedevice *wave_dev = vma->vm_private_data;
996 struct woinst *woinst = wave_dev->woinst;
997 struct wiinst *wiinst = wave_dev->wiinst;
998 struct page *dmapage;
1002 DPF(3, "emu10k1_mm_nopage()\n");
1003 DPD(3, "addr: %#lx\n", address);
1005 if (address > vma->vm_end) {
1006 DPF(1, "EXIT, returning NOPAGE_SIGBUS\n");
1007 return NOPAGE_SIGBUS; /* Disallow mremap */
1010 pgoff = vma->vm_pgoff + ((address - vma->vm_start) >> PAGE_SHIFT);
1012 wr = woinst->mmapped;
1017 rd = wiinst->mmapped;
1021 /* if full-duplex (read+write) and we have two sets of bufs,
1022 * then the playback buffers come first, sez soundcard.c */
1024 if (pgoff >= woinst->buffer.pages) {
1025 pgoff -= woinst->buffer.pages;
1026 dmapage = virt_to_page ((u8 *) wiinst->buffer.addr + pgoff * PAGE_SIZE);
1028 dmapage = virt_to_page (woinst->voice[0].mem.addr[pgoff]);
1030 dmapage = virt_to_page ((u8 *) wiinst->buffer.addr + pgoff * PAGE_SIZE);
1035 DPD(3, "page: %#lx\n", (unsigned long) dmapage);
1037 *type = VM_FAULT_MINOR;
1041 struct vm_operations_struct emu10k1_mm_ops = {
1042 .nopage = emu10k1_mm_nopage,
1045 static int emu10k1_audio_mmap(struct file *file, struct vm_area_struct *vma)
1047 struct emu10k1_wavedevice *wave_dev = (struct emu10k1_wavedevice *) file->private_data;
1048 unsigned long max_pages, n_pages, pgoffset;
1049 struct woinst *woinst = NULL;
1050 struct wiinst *wiinst = NULL;
1051 unsigned long flags;
1053 DPF(2, "emu10k1_audio_mmap()\n");
1056 if (vma->vm_flags & VM_WRITE) {
1057 woinst = wave_dev->woinst;
1059 spin_lock_irqsave(&woinst->lock, flags);
1061 /* No m'mapping possible for multichannel */
1062 if (woinst->num_voices > 1) {
1063 spin_unlock_irqrestore(&woinst->lock, flags);
1067 if (woinst->state == WAVE_STATE_CLOSED) {
1068 calculate_ofrag(woinst);
1070 if (emu10k1_waveout_open(wave_dev) < 0) {
1071 spin_unlock_irqrestore(&woinst->lock, flags);
1077 woinst->mmapped = 1;
1078 max_pages += woinst->buffer.pages;
1079 spin_unlock_irqrestore(&woinst->lock, flags);
1082 if (vma->vm_flags & VM_READ) {
1083 wiinst = wave_dev->wiinst;
1085 spin_lock_irqsave(&wiinst->lock, flags);
1086 if (wiinst->state == WAVE_STATE_CLOSED) {
1087 calculate_ifrag(wiinst);
1089 if (emu10k1_wavein_open(wave_dev) < 0) {
1090 spin_unlock_irqrestore(&wiinst->lock, flags);
1096 wiinst->mmapped = 1;
1097 max_pages += wiinst->buffer.pages;
1098 spin_unlock_irqrestore(&wiinst->lock, flags);
1101 n_pages = ((vma->vm_end - vma->vm_start) + PAGE_SIZE - 1) >> PAGE_SHIFT;
1102 pgoffset = vma->vm_pgoff;
1104 DPD(2, "vma_start: %#lx, vma_end: %#lx, vma_offset: %ld\n", vma->vm_start, vma->vm_end, pgoffset);
1105 DPD(2, "n_pages: %ld, max_pages: %ld\n", n_pages, max_pages);
1107 if (pgoffset + n_pages > max_pages)
1110 vma->vm_flags |= VM_RESERVED;
1111 vma->vm_ops = &emu10k1_mm_ops;
1112 vma->vm_private_data = wave_dev;
1116 static int emu10k1_audio_open(struct inode *inode, struct file *file)
1118 int minor = iminor(inode);
1119 struct emu10k1_card *card = NULL;
1120 struct list_head *entry;
1121 struct emu10k1_wavedevice *wave_dev;
1123 DPF(2, "emu10k1_audio_open()\n");
1125 /* Check for correct device to open */
1127 list_for_each(entry, &emu10k1_devs) {
1128 card = list_entry(entry, struct emu10k1_card, list);
1130 if (!((card->audio_dev ^ minor) & ~0xf) || !((card->audio_dev1 ^ minor) & ~0xf))
1138 wave_dev = (struct emu10k1_wavedevice *) kmalloc(sizeof(struct emu10k1_wavedevice), GFP_KERNEL);
1140 if (wave_dev == NULL) {
1145 wave_dev->card = card;
1146 wave_dev->wiinst = NULL;
1147 wave_dev->woinst = NULL;
1148 wave_dev->enablebits = PCM_ENABLE_OUTPUT | PCM_ENABLE_INPUT; /* Default */
1150 if (file->f_mode & FMODE_READ) {
1152 struct wiinst *wiinst;
1154 if ((wiinst = (struct wiinst *) kmalloc(sizeof(struct wiinst), GFP_KERNEL)) == NULL) {
1160 wiinst->recsrc = card->wavein.recsrc;
1161 wiinst->fxwc = card->wavein.fxwc;
1163 switch (wiinst->recsrc) {
1164 case WAVERECORD_AC97:
1165 wiinst->format.id = AFMT_S16_LE;
1166 wiinst->format.samplingrate = 8000;
1167 wiinst->format.bitsperchannel = 16;
1168 wiinst->format.channels = 1;
1170 case WAVERECORD_MIC:
1171 wiinst->format.id = AFMT_S16_LE;
1172 wiinst->format.samplingrate = 8000;
1173 wiinst->format.bitsperchannel = 16;
1174 wiinst->format.channels = 1;
1177 wiinst->format.id = AFMT_S16_LE;
1178 wiinst->format.samplingrate = 48000;
1179 wiinst->format.bitsperchannel = 16;
1180 wiinst->format.channels = hweight32(wiinst->fxwc);
1189 wiinst->state = WAVE_STATE_CLOSED;
1191 wiinst->buffer.ossfragshift = 0;
1192 wiinst->buffer.fragment_size = 0;
1193 wiinst->buffer.numfrags = 0;
1195 init_waitqueue_head(&wiinst->wait_queue);
1197 wiinst->mmapped = 0;
1198 wiinst->total_recorded = 0;
1200 wiinst->lock = SPIN_LOCK_UNLOCKED;
1201 tasklet_init(&wiinst->timer.tasklet, emu10k1_wavein_bh, (unsigned long) wave_dev);
1202 wave_dev->wiinst = wiinst;
1203 emu10k1_wavein_setformat(wave_dev, &wiinst->format);
1206 if (file->f_mode & FMODE_WRITE) {
1207 struct woinst *woinst;
1210 if ((woinst = (struct woinst *) kmalloc(sizeof(struct woinst), GFP_KERNEL)) == NULL) {
1216 if (wave_dev->wiinst != NULL) {
1217 woinst->format = wave_dev->wiinst->format;
1219 woinst->format.id = AFMT_U8;
1220 woinst->format.samplingrate = 8000;
1221 woinst->format.bitsperchannel = 8;
1222 woinst->format.channels = 1;
1225 woinst->state = WAVE_STATE_CLOSED;
1227 woinst->buffer.fragment_size = 0;
1228 woinst->buffer.ossfragshift = 0;
1229 woinst->buffer.numfrags = 0;
1230 woinst->device = (card->audio_dev1 == minor);
1231 woinst->timer.state = TIMER_STATE_UNINSTALLED;
1232 woinst->num_voices = 1;
1233 for (i = 0; i < WAVEOUT_MAXVOICES; i++) {
1234 woinst->voice[i].usage = VOICE_USAGE_FREE;
1235 woinst->voice[i].mem.emupageindex = -1;
1238 init_waitqueue_head(&woinst->wait_queue);
1240 woinst->mmapped = 0;
1241 woinst->total_copied = 0;
1242 woinst->total_played = 0;
1244 woinst->lock = SPIN_LOCK_UNLOCKED;
1245 tasklet_init(&woinst->timer.tasklet, emu10k1_waveout_bh, (unsigned long) wave_dev);
1246 wave_dev->woinst = woinst;
1247 emu10k1_waveout_setformat(wave_dev, &woinst->format);
1250 file->private_data = (void *) wave_dev;
1255 static int emu10k1_audio_release(struct inode *inode, struct file *file)
1257 struct emu10k1_wavedevice *wave_dev = (struct emu10k1_wavedevice *) file->private_data;
1258 struct emu10k1_card *card;
1259 unsigned long flags;
1261 card = wave_dev->card;
1263 DPF(2, "emu10k1_audio_release()\n");
1265 if (file->f_mode & FMODE_WRITE) {
1266 struct woinst *woinst = wave_dev->woinst;
1268 spin_lock_irqsave(&woinst->lock, flags);
1269 if(woinst->format.passthrough==2)
1270 card->pt.state=PT_STATE_PLAYING;
1271 if (woinst->format.passthrough && card->pt.state != PT_STATE_INACTIVE){
1272 spin_lock(&card->pt.lock);
1273 emu10k1_pt_stop(card);
1274 spin_unlock(&card->pt.lock);
1276 if (woinst->state & WAVE_STATE_OPEN) {
1277 if (woinst->state & WAVE_STATE_STARTED) {
1278 if (!(file->f_flags & O_NONBLOCK)) {
1279 while (!signal_pending(current)
1280 && (woinst->total_played < woinst->total_copied)) {
1281 DPF(4, "Buffer hasn't been totally played, sleep....\n");
1282 spin_unlock_irqrestore(&woinst->lock, flags);
1283 interruptible_sleep_on(&woinst->wait_queue);
1284 spin_lock_irqsave(&woinst->lock, flags);
1288 emu10k1_waveout_close(wave_dev);
1291 spin_unlock_irqrestore(&woinst->lock, flags);
1292 /* remove the tasklet */
1293 tasklet_kill(&woinst->timer.tasklet);
1294 kfree(wave_dev->woinst);
1297 if (file->f_mode & FMODE_READ) {
1298 struct wiinst *wiinst = wave_dev->wiinst;
1300 spin_lock_irqsave(&wiinst->lock, flags);
1302 if (wiinst->state & WAVE_STATE_OPEN) {
1303 emu10k1_wavein_close(wave_dev);
1306 spin_unlock_irqrestore(&wiinst->lock, flags);
1307 tasklet_kill(&wiinst->timer.tasklet);
1308 kfree(wave_dev->wiinst);
1313 if (waitqueue_active(&card->open_wait))
1314 wake_up_interruptible(&card->open_wait);
1319 /* FIXME sort out poll() + mmap() */
1320 static unsigned int emu10k1_audio_poll(struct file *file, struct poll_table_struct *wait)
1322 struct emu10k1_wavedevice *wave_dev = (struct emu10k1_wavedevice *) file->private_data;
1323 struct woinst *woinst = wave_dev->woinst;
1324 struct wiinst *wiinst = wave_dev->wiinst;
1325 unsigned int mask = 0;
1327 unsigned long flags;
1329 DPF(4, "emu10k1_audio_poll()\n");
1331 if (file->f_mode & FMODE_WRITE)
1332 poll_wait(file, &woinst->wait_queue, wait);
1334 if (file->f_mode & FMODE_READ)
1335 poll_wait(file, &wiinst->wait_queue, wait);
1337 if (file->f_mode & FMODE_WRITE) {
1338 spin_lock_irqsave(&woinst->lock, flags);
1340 if (woinst->state & WAVE_STATE_OPEN) {
1341 emu10k1_waveout_update(woinst);
1342 emu10k1_waveout_getxfersize(woinst, &bytestocopy);
1344 if (bytestocopy >= woinst->buffer.fragment_size)
1345 mask |= POLLOUT | POLLWRNORM;
1347 mask |= POLLOUT | POLLWRNORM;
1349 spin_unlock_irqrestore(&woinst->lock, flags);
1352 if (file->f_mode & FMODE_READ) {
1353 spin_lock_irqsave(&wiinst->lock, flags);
1355 if (wiinst->state & WAVE_STATE_OPEN) {
1356 emu10k1_wavein_update(wave_dev->card, wiinst);
1357 emu10k1_wavein_getxfersize(wiinst, &bytestocopy);
1359 if (bytestocopy >= wiinst->buffer.fragment_size)
1360 mask |= POLLIN | POLLRDNORM;
1363 spin_unlock_irqrestore(&wiinst->lock, flags);
1369 static void calculate_ofrag(struct woinst *woinst)
1371 struct waveout_buffer *buffer = &woinst->buffer;
1374 if (buffer->fragment_size)
1377 if (!buffer->ossfragshift) {
1378 fragsize = (woinst->format.bytespervoicesample * woinst->format.samplingrate * WAVEOUT_DEFAULTFRAGLEN) / 1000 - 1;
1382 buffer->ossfragshift++;
1386 if (buffer->ossfragshift < WAVEOUT_MINFRAGSHIFT)
1387 buffer->ossfragshift = WAVEOUT_MINFRAGSHIFT;
1389 buffer->fragment_size = 1 << buffer->ossfragshift;
1391 while (buffer->fragment_size * WAVEOUT_MINFRAGS > WAVEOUT_MAXBUFSIZE)
1392 buffer->fragment_size >>= 1;
1394 /* now we are sure that:
1395 (2^WAVEOUT_MINFRAGSHIFT) <= (fragment_size = 2^n) <= (WAVEOUT_MAXBUFSIZE / WAVEOUT_MINFRAGS)
1398 if (!buffer->numfrags) {
1401 numfrags = (woinst->format.bytespervoicesample * woinst->format.samplingrate * WAVEOUT_DEFAULTBUFLEN) /
1402 (buffer->fragment_size * 1000) - 1;
1404 buffer->numfrags = 1;
1408 buffer->numfrags <<= 1;
1412 if (buffer->numfrags < WAVEOUT_MINFRAGS)
1413 buffer->numfrags = WAVEOUT_MINFRAGS;
1415 if (buffer->numfrags * buffer->fragment_size > WAVEOUT_MAXBUFSIZE)
1416 buffer->numfrags = WAVEOUT_MAXBUFSIZE / buffer->fragment_size;
1418 if (buffer->numfrags < WAVEOUT_MINFRAGS)
1421 buffer->size = buffer->fragment_size * buffer->numfrags;
1422 buffer->pages = buffer->size / PAGE_SIZE + ((buffer->size % PAGE_SIZE) ? 1 : 0);
1424 DPD(2, " calculated playback fragment_size -> %d\n", buffer->fragment_size);
1425 DPD(2, " calculated playback numfrags -> %d\n", buffer->numfrags);
1430 static void calculate_ifrag(struct wiinst *wiinst)
1432 struct wavein_buffer *buffer = &wiinst->buffer;
1433 u32 fragsize, bufsize, size[4];
1436 if (buffer->fragment_size)
1439 if (!buffer->ossfragshift) {
1440 fragsize = (wiinst->format.bytespersec * WAVEIN_DEFAULTFRAGLEN) / 1000 - 1;
1444 buffer->ossfragshift++;
1448 if (buffer->ossfragshift < WAVEIN_MINFRAGSHIFT)
1449 buffer->ossfragshift = WAVEIN_MINFRAGSHIFT;
1451 buffer->fragment_size = 1 << buffer->ossfragshift;
1453 while (buffer->fragment_size * WAVEIN_MINFRAGS > WAVEIN_MAXBUFSIZE)
1454 buffer->fragment_size >>= 1;
1456 /* now we are sure that:
1457 (2^WAVEIN_MINFRAGSHIFT) <= (fragment_size = 2^n) <= (WAVEIN_MAXBUFSIZE / WAVEIN_MINFRAGS)
1461 if (!buffer->numfrags)
1462 buffer->numfrags = (wiinst->format.bytespersec * WAVEIN_DEFAULTBUFLEN) / (buffer->fragment_size * 1000) - 1;
1464 if (buffer->numfrags < WAVEIN_MINFRAGS)
1465 buffer->numfrags = WAVEIN_MINFRAGS;
1467 if (buffer->numfrags * buffer->fragment_size > WAVEIN_MAXBUFSIZE)
1468 buffer->numfrags = WAVEIN_MAXBUFSIZE / buffer->fragment_size;
1470 if (buffer->numfrags < WAVEIN_MINFRAGS)
1473 bufsize = buffer->fragment_size * buffer->numfrags;
1475 /* the buffer size for recording is restricted to certain values, adjust it now */
1476 if (bufsize >= 0x10000) {
1477 buffer->size = 0x10000;
1478 buffer->sizeregval = 0x1f;
1486 for (i = 0; i < 8; i++)
1487 for (j = 0; j < 4; j++)
1488 if (bufsize >= size[j]) {
1489 buffer->size = size[j];
1491 buffer->sizeregval = i * 4 + j + 1;
1495 if (buffer->size == 0) {
1497 buffer->sizeregval = 0x01;
1501 /* adjust the fragment size so that buffer size is an integer multiple */
1502 while (buffer->size % buffer->fragment_size)
1503 buffer->fragment_size >>= 1;
1505 buffer->numfrags = buffer->size / buffer->fragment_size;
1506 buffer->pages = buffer->size / PAGE_SIZE + ((buffer->size % PAGE_SIZE) ? 1 : 0);
1508 DPD(2, " calculated recording fragment_size -> %d\n", buffer->fragment_size);
1509 DPD(2, " calculated recording numfrags -> %d\n", buffer->numfrags);
1510 DPD(2, " buffer size register -> %#04x\n", buffer->sizeregval);
1515 void emu10k1_wavein_bh(unsigned long refdata)
1517 struct emu10k1_wavedevice *wave_dev = (struct emu10k1_wavedevice *) refdata;
1518 struct wiinst *wiinst = wave_dev->wiinst;
1520 unsigned long flags;
1525 spin_lock_irqsave(&wiinst->lock, flags);
1527 if (!(wiinst->state & WAVE_STATE_STARTED)) {
1528 spin_unlock_irqrestore(&wiinst->lock, flags);
1532 emu10k1_wavein_update(wave_dev->card, wiinst);
1533 emu10k1_wavein_getxfersize(wiinst, &bytestocopy);
1535 spin_unlock_irqrestore(&wiinst->lock, flags);
1537 if (bytestocopy >= wiinst->buffer.fragment_size) {
1538 if (waitqueue_active(&wiinst->wait_queue))
1539 wake_up_interruptible(&wiinst->wait_queue);
1541 DPD(3, "Not enough transfer size, %d\n", bytestocopy);
1546 void emu10k1_waveout_bh(unsigned long refdata)
1548 struct emu10k1_wavedevice *wave_dev = (struct emu10k1_wavedevice *) refdata;
1549 struct woinst *woinst = wave_dev->woinst;
1551 unsigned long flags;
1556 spin_lock_irqsave(&woinst->lock, flags);
1558 if (!(woinst->state & WAVE_STATE_STARTED)) {
1559 spin_unlock_irqrestore(&woinst->lock, flags);
1563 emu10k1_waveout_update(woinst);
1564 emu10k1_waveout_getxfersize(woinst, &bytestocopy);
1566 if (woinst->buffer.fill_silence) {
1567 spin_unlock_irqrestore(&woinst->lock, flags);
1568 emu10k1_waveout_fillsilence(woinst);
1570 spin_unlock_irqrestore(&woinst->lock, flags);
1572 if (bytestocopy >= woinst->buffer.fragment_size) {
1573 if (waitqueue_active(&woinst->wait_queue))
1574 wake_up_interruptible(&woinst->wait_queue);
1576 DPD(3, "Not enough transfer size -> %d\n", bytestocopy);
1581 struct file_operations emu10k1_audio_fops = {
1582 .owner = THIS_MODULE,
1583 .llseek = no_llseek,
1584 .read = emu10k1_audio_read,
1585 .write = emu10k1_audio_write,
1586 .poll = emu10k1_audio_poll,
1587 .ioctl = emu10k1_audio_ioctl,
1588 .mmap = emu10k1_audio_mmap,
1589 .open = emu10k1_audio_open,
1590 .release = emu10k1_audio_release,