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 #define __NO_VERSION__
34 #include <linux/module.h>
35 #include <linux/poll.h>
36 #include <linux/malloc.h>
37 #include <linux/version.h>
38 #include <linux/bitops.h>
40 #include <linux/sched.h>
41 #include <linux/smp_lock.h>
42 #include <linux/wrapper.h>
52 static void calculate_ofrag(struct woinst
*);
53 static void calculate_ifrag(struct wiinst
*);
55 /* Audio file operations */
56 static loff_t
emu10k1_audio_llseek(struct file
*file
, loff_t offset
, int origin
)
61 static ssize_t
emu10k1_audio_read(struct file
*file
, char *buffer
, size_t count
, loff_t
* ppos
)
63 struct emu10k1_wavedevice
*wave_dev
= (struct emu10k1_wavedevice
*) file
->private_data
;
64 struct wiinst
*wiinst
= wave_dev
->wiinst
;
68 DPD(3, "emu10k1_audio_read(), buffer=%p, count=%d\n", buffer
, (u32
) count
);
70 if (ppos
!= &file
->f_pos
)
73 if (!access_ok(VERIFY_WRITE
, buffer
, count
))
76 spin_lock_irqsave(&wiinst
->lock
, flags
);
78 if (wiinst
->mmapped
) {
79 spin_unlock_irqrestore(&wiinst
->lock
, flags
);
83 if (wiinst
->state
== WAVE_STATE_CLOSED
) {
84 calculate_ifrag(wiinst
);
86 while (emu10k1_wavein_open(wave_dev
) < 0) {
87 spin_unlock_irqrestore(&wiinst
->lock
, flags
);
89 if (file
->f_flags
& O_NONBLOCK
)
92 interruptible_sleep_on(&wave_dev
->card
->open_wait
);
94 if (signal_pending(current
))
97 spin_lock_irqsave(&wiinst
->lock
, flags
);
101 spin_unlock_irqrestore(&wiinst
->lock
, flags
);
106 spin_lock_irqsave(&wiinst
->lock
, flags
);
108 if (!(wiinst
->state
& WAVE_STATE_STARTED
)
109 && (wave_dev
->enablebits
& PCM_ENABLE_INPUT
))
110 emu10k1_wavein_start(wave_dev
);
112 emu10k1_wavein_update(wave_dev
->card
, wiinst
);
113 emu10k1_wavein_getxfersize(wiinst
, &bytestocopy
);
115 spin_unlock_irqrestore(&wiinst
->lock
, flags
);
117 DPD(3, "bytestocopy --> %d\n", bytestocopy
);
119 if ((bytestocopy
>= wiinst
->buffer
.fragment_size
)
120 || (bytestocopy
>= count
)) {
121 bytestocopy
= min(bytestocopy
, count
);
123 emu10k1_wavein_xferdata(wiinst
, (u8
*) buffer
, &bytestocopy
);
125 count
-= bytestocopy
;
126 buffer
+= bytestocopy
;
131 if ((file
->f_flags
& O_NONBLOCK
)
132 || (!(wave_dev
->enablebits
& PCM_ENABLE_INPUT
)))
133 return (ret
? ret
: -EAGAIN
);
135 interruptible_sleep_on(&wiinst
->wait_queue
);
137 if (signal_pending(current
))
138 return (ret
? ret
: -ERESTARTSYS
);
143 DPD(3, "bytes copied -> %d\n", (u32
) ret
);
148 static ssize_t
emu10k1_audio_write(struct file
*file
, const char *buffer
, size_t count
, loff_t
* ppos
)
150 struct emu10k1_wavedevice
*wave_dev
= (struct emu10k1_wavedevice
*) file
->private_data
;
151 struct woinst
*woinst
= wave_dev
->woinst
;
155 DPD(3, "emu10k1_audio_write(), buffer=%p, count=%d\n", buffer
, (u32
) count
);
157 if (ppos
!= &file
->f_pos
)
160 if (!access_ok(VERIFY_READ
, buffer
, count
))
163 spin_lock_irqsave(&woinst
->lock
, flags
);
165 if (woinst
->mmapped
) {
166 spin_unlock_irqrestore(&woinst
->lock
, flags
);
170 if (woinst
->state
== WAVE_STATE_CLOSED
) {
171 calculate_ofrag(woinst
);
173 while (emu10k1_waveout_open(wave_dev
) < 0) {
174 spin_unlock_irqrestore(&woinst
->lock
, flags
);
176 if (file
->f_flags
& O_NONBLOCK
)
179 interruptible_sleep_on(&wave_dev
->card
->open_wait
);
181 if (signal_pending(current
))
184 spin_lock_irqsave(&woinst
->lock
, flags
);
188 spin_unlock_irqrestore(&woinst
->lock
, flags
);
194 spin_lock_irqsave(&woinst
->lock
, flags
);
195 emu10k1_waveout_update(woinst
);
196 emu10k1_waveout_getxfersize(woinst
, &bytestocopy
);
197 spin_unlock_irqrestore(&woinst
->lock
, flags
);
199 DPD(3, "bytestocopy --> %d\n", bytestocopy
);
201 if ((bytestocopy
>= woinst
->buffer
.fragment_size
)
202 || (bytestocopy
>= count
)) {
204 bytestocopy
= min(bytestocopy
, count
);
206 emu10k1_waveout_xferdata(woinst
, (u8
*) buffer
, &bytestocopy
);
208 count
-= bytestocopy
;
209 buffer
+= bytestocopy
;
212 spin_lock_irqsave(&woinst
->lock
, flags
);
213 woinst
->total_copied
+= bytestocopy
;
215 if (!(woinst
->state
& WAVE_STATE_STARTED
)
216 && (wave_dev
->enablebits
& PCM_ENABLE_OUTPUT
)
217 && (woinst
->total_copied
>= woinst
->buffer
.fragment_size
))
218 emu10k1_waveout_start(wave_dev
);
220 spin_unlock_irqrestore(&woinst
->lock
, flags
);
224 if ((file
->f_flags
& O_NONBLOCK
)
225 || (!(wave_dev
->enablebits
& PCM_ENABLE_OUTPUT
)))
226 return (ret
? ret
: -EAGAIN
);
228 interruptible_sleep_on(&woinst
->wait_queue
);
230 if (signal_pending(current
))
231 return (ret
? ret
: -ERESTARTSYS
);
235 DPD(3, "bytes copied -> %d\n", (u32
) ret
);
240 static int emu10k1_audio_ioctl(struct inode
*inode
, struct file
*file
, unsigned int cmd
, unsigned long arg
)
242 struct emu10k1_wavedevice
*wave_dev
= (struct emu10k1_wavedevice
*) file
->private_data
;
243 struct woinst
*woinst
= NULL
;
244 struct wiinst
*wiinst
= NULL
;
249 DPF(4, "emu10k1_audio_ioctl()\n");
251 if (file
->f_mode
& FMODE_WRITE
)
252 woinst
= wave_dev
->woinst
;
254 if (file
->f_mode
& FMODE_READ
)
255 wiinst
= wave_dev
->wiinst
;
259 DPF(2, "OSS_GETVERSION:\n");
260 return put_user(SOUND_VERSION
, (int *) arg
);
262 case SNDCTL_DSP_RESET
:
263 DPF(2, "SNDCTL_DSP_RESET:\n");
264 wave_dev
->enablebits
= PCM_ENABLE_OUTPUT
| PCM_ENABLE_INPUT
;
266 if (file
->f_mode
& FMODE_WRITE
) {
267 spin_lock_irqsave(&woinst
->lock
, flags
);
269 if (woinst
->state
& WAVE_STATE_OPEN
) {
270 if (woinst
->mmapped
) {
273 /* Undo marking the pages as reserved */
274 for (i
= 0; i
< woinst
->buffer
.pages
; i
++)
275 mem_map_reserve(virt_to_page(woinst
->buffer
.addr
[i
]));
278 emu10k1_waveout_close(wave_dev
);
282 woinst
->total_copied
= 0;
283 woinst
->total_played
= 0;
286 spin_unlock_irqrestore(&woinst
->lock
, flags
);
289 if (file
->f_mode
& FMODE_READ
) {
290 spin_lock_irqsave(&wiinst
->lock
, flags
);
292 if (wiinst
->state
& WAVE_STATE_OPEN
)
293 emu10k1_wavein_close(wave_dev
);
296 wiinst
->total_recorded
= 0;
298 spin_unlock_irqrestore(&wiinst
->lock
, flags
);
303 case SNDCTL_DSP_SYNC
:
304 DPF(2, "SNDCTL_DSP_SYNC:\n");
306 if (file
->f_mode
& FMODE_WRITE
) {
308 spin_lock_irqsave(&woinst
->lock
, flags
);
310 if (woinst
->state
& WAVE_STATE_OPEN
) {
312 if (woinst
->state
& WAVE_STATE_STARTED
)
313 while ((woinst
->total_played
< woinst
->total_copied
)
314 && !signal_pending(current
)) {
315 spin_unlock_irqrestore(&woinst
->lock
, flags
);
316 interruptible_sleep_on(&woinst
->wait_queue
);
317 spin_lock_irqsave(&woinst
->lock
, flags
);
320 if (woinst
->mmapped
) {
323 /* Undo marking the pages as reserved */
324 for (i
= 0; i
< woinst
->buffer
.pages
; i
++)
325 mem_map_reserve(virt_to_page(woinst
->buffer
.addr
[i
]));
328 emu10k1_waveout_close(wave_dev
);
332 woinst
->total_copied
= 0;
333 woinst
->total_played
= 0;
336 spin_unlock_irqrestore(&woinst
->lock
, flags
);
339 if (file
->f_mode
& FMODE_READ
) {
340 spin_lock_irqsave(&wiinst
->lock
, flags
);
342 if (wiinst
->state
& WAVE_STATE_OPEN
)
343 emu10k1_wavein_close(wave_dev
);
346 wiinst
->total_recorded
= 0;
348 spin_unlock_irqrestore(&wiinst
->lock
, flags
);
353 case SNDCTL_DSP_SETDUPLEX
:
354 DPF(2, "SNDCTL_DSP_SETDUPLEX:\n");
357 case SNDCTL_DSP_GETCAPS
:
358 DPF(2, "SNDCTL_DSP_GETCAPS:\n");
359 return put_user(DSP_CAP_DUPLEX
| DSP_CAP_REALTIME
| DSP_CAP_TRIGGER
| DSP_CAP_MMAP
| DSP_CAP_COPROC
, (int *) arg
);
361 case SNDCTL_DSP_SPEED
:
362 DPF(2, "SNDCTL_DSP_SPEED:\n");
364 if (get_user(val
, (int *) arg
))
366 DPD(2, "val is %d\n", val
);
369 if (file
->f_mode
& FMODE_READ
) {
370 struct wave_format format
;
372 spin_lock_irqsave(&wiinst
->lock
, flags
);
374 format
= wiinst
->format
;
375 format
.samplingrate
= val
;
377 if (emu10k1_wavein_setformat(wave_dev
, &format
) < 0)
380 val
= wiinst
->format
.samplingrate
;
382 spin_unlock_irqrestore(&wiinst
->lock
, flags
);
384 DPD(2, "set recording sampling rate -> %d\n", val
);
387 if (file
->f_mode
& FMODE_WRITE
) {
388 struct wave_format format
;
390 spin_lock_irqsave(&woinst
->lock
, flags
);
392 format
= woinst
->format
;
393 format
.samplingrate
= val
;
395 if (emu10k1_waveout_setformat(wave_dev
, &format
) < 0)
398 val
= woinst
->format
.samplingrate
;
400 spin_unlock_irqrestore(&woinst
->lock
, flags
);
402 DPD(2, "set playback sampling rate -> %d\n", val
);
405 return put_user(val
, (int *) arg
);
407 if (file
->f_mode
& FMODE_READ
)
408 val
= wiinst
->format
.samplingrate
;
409 else if (file
->f_mode
& FMODE_WRITE
)
410 val
= woinst
->format
.samplingrate
;
412 return put_user(val
, (int *) arg
);
416 case SNDCTL_DSP_STEREO
:
417 DPF(2, "SNDCTL_DSP_STEREO:\n");
419 if (get_user(val
, (int *) arg
))
421 DPD(2, " val is %d\n", val
);
423 if (file
->f_mode
& FMODE_READ
) {
424 struct wave_format format
;
426 spin_lock_irqsave(&wiinst
->lock
, flags
);
428 format
= wiinst
->format
;
429 format
.channels
= val
? 2 : 1;
431 if (emu10k1_wavein_setformat(wave_dev
, &format
) < 0)
434 val
= wiinst
->format
.channels
- 1;
436 spin_unlock_irqrestore(&wiinst
->lock
, flags
);
437 DPD(2, "set recording stereo -> %d\n", val
);
440 if (file
->f_mode
& FMODE_WRITE
) {
441 struct wave_format format
;
443 spin_lock_irqsave(&woinst
->lock
, flags
);
445 format
= woinst
->format
;
446 format
.channels
= val
? 2 : 1;
448 if (emu10k1_waveout_setformat(wave_dev
, &format
) < 0)
451 val
= woinst
->format
.channels
- 1;
453 spin_unlock_irqrestore(&woinst
->lock
, flags
);
455 DPD(2, "set playback stereo -> %d\n", val
);
458 return put_user(val
, (int *) arg
);
462 case SNDCTL_DSP_CHANNELS
:
463 DPF(2, "SNDCTL_DSP_CHANNELS:\n");
465 if (get_user(val
, (int *) arg
))
467 DPD(2, " val is %d\n", val
);
470 if (file
->f_mode
& FMODE_READ
) {
471 struct wave_format format
;
473 spin_lock_irqsave(&wiinst
->lock
, flags
);
475 format
= wiinst
->format
;
476 format
.channels
= val
;
478 if (emu10k1_wavein_setformat(wave_dev
, &format
) < 0)
481 val
= wiinst
->format
.channels
;
483 spin_unlock_irqrestore(&wiinst
->lock
, flags
);
484 DPD(2, "set recording number of channels -> %d\n", val
);
487 if (file
->f_mode
& FMODE_WRITE
) {
488 struct wave_format format
;
490 spin_lock_irqsave(&woinst
->lock
, flags
);
492 format
= woinst
->format
;
493 format
.channels
= val
;
495 if (emu10k1_waveout_setformat(wave_dev
, &format
) < 0)
498 val
= woinst
->format
.channels
;
500 spin_unlock_irqrestore(&woinst
->lock
, flags
);
501 DPD(2, "set playback number of channels -> %d\n", val
);
504 return put_user(val
, (int *) arg
);
506 if (file
->f_mode
& FMODE_READ
)
507 val
= wiinst
->format
.channels
;
508 else if (file
->f_mode
& FMODE_WRITE
)
509 val
= woinst
->format
.channels
;
511 return put_user(val
, (int *) arg
);
515 case SNDCTL_DSP_GETFMTS
:
516 DPF(2, "SNDCTL_DSP_GETFMTS:\n");
518 if (file
->f_mode
& FMODE_READ
)
520 else if (file
->f_mode
& FMODE_WRITE
)
521 val
= AFMT_S16_LE
| AFMT_U8
;
523 return put_user(val
, (int *) arg
);
525 case SNDCTL_DSP_SETFMT
: /* Same as SNDCTL_DSP_SAMPLESIZE */
526 DPF(2, "SNDCTL_DSP_SETFMT:\n");
528 if (get_user(val
, (int *) arg
))
530 DPD(2, " val is %d\n", val
);
532 if (val
!= AFMT_QUERY
) {
533 if (file
->f_mode
& FMODE_READ
) {
534 struct wave_format format
;
536 spin_lock_irqsave(&wiinst
->lock
, flags
);
538 format
= wiinst
->format
;
539 format
.bitsperchannel
= val
;
541 if (emu10k1_wavein_setformat(wave_dev
, &format
) < 0)
544 val
= wiinst
->format
.bitsperchannel
;
546 spin_unlock_irqrestore(&wiinst
->lock
, flags
);
547 DPD(2, "set recording sample size -> %d\n", val
);
550 if (file
->f_mode
& FMODE_WRITE
) {
551 struct wave_format format
;
553 spin_lock_irqsave(&woinst
->lock
, flags
);
555 format
= woinst
->format
;
556 format
.bitsperchannel
= val
;
558 if (emu10k1_waveout_setformat(wave_dev
, &format
) < 0)
561 val
= woinst
->format
.bitsperchannel
;
563 spin_unlock_irqrestore(&woinst
->lock
, flags
);
564 DPD(2, "set playback sample size -> %d\n", val
);
567 return put_user((val
== 16) ? AFMT_S16_LE
: AFMT_U8
, (int *) arg
);
569 if (file
->f_mode
& FMODE_READ
)
570 val
= wiinst
->format
.bitsperchannel
;
571 else if (file
->f_mode
& FMODE_WRITE
)
572 val
= woinst
->format
.bitsperchannel
;
574 return put_user((val
== 16) ? AFMT_S16_LE
: AFMT_U8
, (int *) arg
);
578 case SOUND_PCM_READ_BITS
:
580 if (file
->f_mode
& FMODE_READ
)
581 val
= wiinst
->format
.bitsperchannel
;
582 else if (file
->f_mode
& FMODE_WRITE
)
583 val
= woinst
->format
.bitsperchannel
;
585 return put_user((val
== 16) ? AFMT_S16_LE
: AFMT_U8
, (int *) arg
);
587 case SOUND_PCM_READ_RATE
:
589 if (file
->f_mode
& FMODE_READ
)
590 val
= wiinst
->format
.samplingrate
;
591 else if (file
->f_mode
& FMODE_WRITE
)
592 val
= woinst
->format
.samplingrate
;
594 return put_user(val
, (int *) arg
);
596 case SOUND_PCM_READ_CHANNELS
:
598 if (file
->f_mode
& FMODE_READ
)
599 val
= wiinst
->format
.channels
;
600 else if (file
->f_mode
& FMODE_WRITE
)
601 val
= woinst
->format
.channels
;
603 return put_user(val
, (int *) arg
);
605 case SOUND_PCM_WRITE_FILTER
:
606 DPF(2, "SOUND_PCM_WRITE_FILTER: not implemented\n");
609 case SOUND_PCM_READ_FILTER
:
610 DPF(2, "SOUND_PCM_READ_FILTER: not implemented\n");
613 case SNDCTL_DSP_SETSYNCRO
:
614 DPF(2, "SNDCTL_DSP_SETSYNCRO: not implemented\n");
617 case SNDCTL_DSP_GETTRIGGER
:
618 DPF(2, "SNDCTL_DSP_GETTRIGGER:\n");
620 if (file
->f_mode
& FMODE_WRITE
&& (wave_dev
->enablebits
& PCM_ENABLE_OUTPUT
))
621 val
|= PCM_ENABLE_OUTPUT
;
623 if (file
->f_mode
& FMODE_READ
&& (wave_dev
->enablebits
& PCM_ENABLE_INPUT
))
624 val
|= PCM_ENABLE_INPUT
;
626 return put_user(val
, (int *) arg
);
628 case SNDCTL_DSP_SETTRIGGER
:
629 DPF(2, "SNDCTL_DSP_SETTRIGGER:\n");
631 if (get_user(val
, (int *) arg
))
634 if (file
->f_mode
& FMODE_WRITE
) {
635 spin_lock_irqsave(&woinst
->lock
, flags
);
637 if (val
& PCM_ENABLE_OUTPUT
) {
638 wave_dev
->enablebits
|= PCM_ENABLE_OUTPUT
;
639 if (woinst
->state
& WAVE_STATE_OPEN
)
640 emu10k1_waveout_start(wave_dev
);
642 wave_dev
->enablebits
&= ~PCM_ENABLE_OUTPUT
;
643 if (woinst
->state
& WAVE_STATE_STARTED
)
644 emu10k1_waveout_stop(wave_dev
);
647 spin_unlock_irqrestore(&woinst
->lock
, flags
);
650 if (file
->f_mode
& FMODE_READ
) {
651 spin_lock_irqsave(&wiinst
->lock
, flags
);
653 if (val
& PCM_ENABLE_INPUT
) {
654 wave_dev
->enablebits
|= PCM_ENABLE_INPUT
;
655 if (wiinst
->state
& WAVE_STATE_OPEN
)
656 emu10k1_wavein_start(wave_dev
);
658 wave_dev
->enablebits
&= ~PCM_ENABLE_INPUT
;
659 if (wiinst
->state
& WAVE_STATE_STARTED
)
660 emu10k1_wavein_stop(wave_dev
);
663 spin_unlock_irqrestore(&wiinst
->lock
, flags
);
667 case SNDCTL_DSP_GETOSPACE
:
671 DPF(4, "SNDCTL_DSP_GETOSPACE:\n");
673 if (!(file
->f_mode
& FMODE_WRITE
))
676 spin_lock_irqsave(&woinst
->lock
, flags
);
678 if (woinst
->state
& WAVE_STATE_OPEN
) {
679 emu10k1_waveout_update(woinst
);
680 emu10k1_waveout_getxfersize(woinst
, &bytestocopy
);
681 info
.bytes
= bytestocopy
;
683 calculate_ofrag(woinst
);
684 info
.bytes
= woinst
->buffer
.size
;
686 spin_unlock_irqrestore(&woinst
->lock
, flags
);
688 info
.fragstotal
= woinst
->buffer
.numfrags
;
689 info
.fragments
= info
.bytes
/ woinst
->buffer
.fragment_size
;
690 info
.fragsize
= woinst
->buffer
.fragment_size
;
692 if (copy_to_user((int *) arg
, &info
, sizeof(info
)))
697 case SNDCTL_DSP_GETISPACE
:
701 DPF(4, "SNDCTL_DSP_GETISPACE:\n");
703 if (!(file
->f_mode
& FMODE_READ
))
706 spin_lock_irqsave(&wiinst
->lock
, flags
);
707 if (wiinst
->state
& WAVE_STATE_OPEN
) {
708 emu10k1_wavein_update(wave_dev
->card
, wiinst
);
709 emu10k1_wavein_getxfersize(wiinst
, &bytestocopy
);
710 info
.bytes
= bytestocopy
;
712 calculate_ifrag(wiinst
);
715 spin_unlock_irqrestore(&wiinst
->lock
, flags
);
717 info
.fragstotal
= wiinst
->buffer
.numfrags
;
718 info
.fragments
= info
.bytes
/ wiinst
->buffer
.fragment_size
;
719 info
.fragsize
= wiinst
->buffer
.fragment_size
;
721 if (copy_to_user((int *) arg
, &info
, sizeof(info
)))
726 case SNDCTL_DSP_NONBLOCK
:
727 DPF(2, "SNDCTL_DSP_NONBLOCK:\n");
729 file
->f_flags
|= O_NONBLOCK
;
732 case SNDCTL_DSP_GETODELAY
:
733 DPF(4, "SNDCTL_DSP_GETODELAY:\n");
735 if (!(file
->f_mode
& FMODE_WRITE
))
738 spin_lock_irqsave(&woinst
->lock
, flags
);
739 if (woinst
->state
& WAVE_STATE_OPEN
) {
740 emu10k1_waveout_update(woinst
);
741 emu10k1_waveout_getxfersize(woinst
, &bytestocopy
);
742 val
= woinst
->buffer
.size
- bytestocopy
;
746 spin_unlock_irqrestore(&woinst
->lock
, flags
);
748 return put_user(val
, (int *) arg
);
750 case SNDCTL_DSP_GETIPTR
:
754 DPF(4, "SNDCTL_DSP_GETIPTR: \n");
756 if (!(file
->f_mode
& FMODE_READ
))
759 spin_lock_irqsave(&wiinst
->lock
, flags
);
761 if (wiinst
->state
& WAVE_STATE_OPEN
) {
762 emu10k1_wavein_update(wave_dev
->card
, wiinst
);
763 cinfo
.ptr
= wiinst
->buffer
.hw_pos
;
764 cinfo
.bytes
= cinfo
.ptr
+ wiinst
->total_recorded
- wiinst
->total_recorded
% wiinst
->buffer
.size
;
765 cinfo
.blocks
= cinfo
.bytes
/ wiinst
->buffer
.fragment_size
- wiinst
->blocks
;
766 wiinst
->blocks
= cinfo
.bytes
/ wiinst
->buffer
.fragment_size
;
773 spin_unlock_irqrestore(&wiinst
->lock
, flags
);
775 if (copy_to_user((void *) arg
, &cinfo
, sizeof(cinfo
)))
780 case SNDCTL_DSP_GETOPTR
:
784 DPF(4, "SNDCTL_DSP_GETOPTR:\n");
786 if (!(file
->f_mode
& FMODE_WRITE
))
789 spin_lock_irqsave(&woinst
->lock
, flags
);
791 if (woinst
->state
& WAVE_STATE_OPEN
) {
792 emu10k1_waveout_update(woinst
);
793 cinfo
.ptr
= woinst
->buffer
.hw_pos
;
794 cinfo
.bytes
= cinfo
.ptr
+ woinst
->total_played
- woinst
->total_played
% woinst
->buffer
.size
;
795 cinfo
.blocks
= cinfo
.bytes
/ woinst
->buffer
.fragment_size
- woinst
->blocks
;
796 woinst
->blocks
= cinfo
.bytes
/ woinst
->buffer
.fragment_size
;
803 woinst
->buffer
.bytestocopy
%= woinst
->buffer
.fragment_size
;
805 spin_unlock_irqrestore(&woinst
->lock
, flags
);
807 if (copy_to_user((void *) arg
, &cinfo
, sizeof(cinfo
)))
812 case SNDCTL_DSP_GETBLKSIZE
:
813 DPF(2, "SNDCTL_DSP_GETBLKSIZE:\n");
815 if (file
->f_mode
& FMODE_WRITE
) {
816 spin_lock_irqsave(&woinst
->lock
, flags
);
818 calculate_ofrag(woinst
);
819 val
= woinst
->buffer
.fragment_size
;
821 spin_unlock_irqrestore(&woinst
->lock
, flags
);
824 if (file
->f_mode
& FMODE_READ
) {
825 spin_lock_irqsave(&wiinst
->lock
, flags
);
827 calculate_ifrag(wiinst
);
828 val
= wiinst
->buffer
.fragment_size
;
830 spin_unlock_irqrestore(&wiinst
->lock
, flags
);
833 return put_user(val
, (int *) arg
);
837 case SNDCTL_DSP_POST
:
838 if (file
->f_mode
& FMODE_WRITE
) {
839 spin_lock_irqsave(&woinst
->lock
, flags
);
841 if (!(woinst
->state
& WAVE_STATE_STARTED
)
842 && (wave_dev
->enablebits
& PCM_ENABLE_OUTPUT
)
843 && (woinst
->total_copied
> 0))
844 emu10k1_waveout_start(wave_dev
);
846 spin_unlock_irqrestore(&woinst
->lock
, flags
);
851 case SNDCTL_DSP_SUBDIVIDE
:
852 DPF(2, "SNDCTL_DSP_SUBDIVIDE: not implemented\n");
855 case SNDCTL_DSP_SETFRAGMENT
:
856 DPF(2, "SNDCTL_DSP_SETFRAGMENT:\n");
858 if (get_user(val
, (int *) arg
))
861 DPD(2, "val is 0x%x\n", val
);
866 if (file
->f_mode
& FMODE_WRITE
) {
867 if (woinst
->state
& WAVE_STATE_OPEN
)
868 return -EINVAL
; /* too late to change */
870 woinst
->buffer
.ossfragshift
= val
& 0xffff;
871 woinst
->buffer
.numfrags
= (val
>> 16) & 0xffff;
874 if (file
->f_mode
& FMODE_READ
) {
875 if (wiinst
->state
& WAVE_STATE_OPEN
)
876 return -EINVAL
; /* too late to change */
878 wiinst
->buffer
.ossfragshift
= val
& 0xffff;
879 wiinst
->buffer
.numfrags
= (val
>> 16) & 0xffff;
884 case SNDCTL_COPR_LOAD
:
889 DPF(2, "SNDCTL_COPR_LOAD:\n");
891 if (copy_from_user(&buf
, (copr_buffer
*) arg
, sizeof(buf
)))
894 if ((buf
.command
!= 1) && (buf
.command
!= 2))
897 if ((buf
.offs
< 0x100)
898 || (buf
.offs
< 0x000)
899 || (buf
.offs
+ buf
.len
> 0x800) || (buf
.len
> 1000))
902 if (buf
.command
== 1) {
903 for (i
= 0; i
< buf
.len
; i
++)
904 ((u32
*) buf
.data
)[i
] = sblive_readptr(wave_dev
->card
, buf
.offs
+ i
, 0);
906 if (copy_to_user((copr_buffer
*) arg
, &buf
, sizeof(buf
)))
909 for (i
= 0; i
< buf
.len
; i
++)
910 sblive_writeptr(wave_dev
->card
, buf
.offs
+ i
, 0, ((u32
*) buf
.data
)[i
]);
915 default: /* Default is unrecognized command */
916 DPD(2, "default: 0x%x\n", cmd
);
922 static int emu10k1_audio_mmap(struct file
*file
, struct vm_area_struct
*vma
)
924 struct emu10k1_wavedevice
*wave_dev
= (struct emu10k1_wavedevice
*) file
->private_data
;
926 DPF(2, "emu10k1_audio_mmap()\n");
928 if (vma_get_pgoff(vma
) != 0)
933 if (vma
->vm_flags
& VM_WRITE
) {
934 struct woinst
*woinst
= wave_dev
->woinst
;
939 spin_lock_irqsave(&woinst
->lock
, flags
);
941 if (woinst
->state
== WAVE_STATE_CLOSED
) {
942 calculate_ofrag(woinst
);
944 if (emu10k1_waveout_open(wave_dev
) < 0) {
945 spin_unlock_irqrestore(&woinst
->lock
, flags
);
951 /* Now mark the pages as reserved, otherwise remap_page_range doesn't do what we want */
952 for (i
= 0; i
< woinst
->buffer
.pages
; i
++)
953 mem_map_reserve(virt_to_page(woinst
->buffer
.addr
[i
]));
956 size
= vma
->vm_end
- vma
->vm_start
;
958 if (size
> (PAGE_SIZE
* woinst
->buffer
.pages
)) {
959 spin_unlock_irqrestore(&woinst
->lock
, flags
);
964 for (i
= 0; i
< woinst
->buffer
.pages
; i
++) {
965 if (remap_page_range(vma
->vm_start
+ (i
* PAGE_SIZE
), virt_to_phys(woinst
->buffer
.addr
[i
]), PAGE_SIZE
, vma
->vm_page_prot
)) {
966 spin_unlock_irqrestore(&woinst
->lock
, flags
);
973 spin_unlock_irqrestore(&woinst
->lock
, flags
);
976 if (vma
->vm_flags
& VM_READ
) {
977 struct wiinst
*wiinst
= wave_dev
->wiinst
;
980 spin_lock_irqsave(&wiinst
->lock
, flags
);
982 spin_unlock_irqrestore(&wiinst
->lock
, flags
);
990 static int emu10k1_audio_open(struct inode
*inode
, struct file
*file
)
992 int minor
= MINOR(inode
->i_rdev
);
993 struct emu10k1_card
*card
;
994 struct list_head
*entry
;
995 struct emu10k1_wavedevice
*wave_dev
;
997 DPF(2, "emu10k1_audio_open()\n");
999 /* Check for correct device to open */
1001 list_for_each(entry
, &emu10k1_devs
) {
1002 card
= list_entry(entry
, struct emu10k1_card
, list
);
1004 if (!((card
->audio_num
^ minor
) & ~0xf) || !((card
->audio1_num
^ minor
) & ~0xf))
1008 if (entry
== &emu10k1_devs
)
1011 if ((wave_dev
= (struct emu10k1_wavedevice
*)
1012 kmalloc(sizeof(struct emu10k1_wavedevice
), GFP_KERNEL
)) == NULL
) {
1017 wave_dev
->card
= card
;
1018 wave_dev
->wiinst
= NULL
;
1019 wave_dev
->woinst
= NULL
;
1020 wave_dev
->enablebits
= PCM_ENABLE_OUTPUT
| PCM_ENABLE_INPUT
; /* Default */
1022 if (file
->f_mode
& FMODE_READ
) {
1024 struct wiinst
*wiinst
;
1026 if ((wiinst
= (struct wiinst
*) kmalloc(sizeof(struct wiinst
), GFP_KERNEL
)) == NULL
) {
1031 wiinst
->recsrc
= card
->wavein
.recsrc
;
1032 wiinst
->fxwc
= card
->wavein
.fxwc
;
1034 switch (wiinst
->recsrc
) {
1035 case WAVERECORD_AC97
:
1036 wiinst
->format
.samplingrate
= 8000;
1037 wiinst
->format
.bitsperchannel
= 16;
1038 wiinst
->format
.channels
= 1;
1040 case WAVERECORD_MIC
:
1041 wiinst
->format
.samplingrate
= 8000;
1042 wiinst
->format
.bitsperchannel
= 16;
1043 wiinst
->format
.channels
= 1;
1046 wiinst
->format
.samplingrate
= 48000;
1047 wiinst
->format
.bitsperchannel
= 16;
1048 wiinst
->format
.channels
= hweight32(wiinst
->fxwc
);
1055 wiinst
->state
= WAVE_STATE_CLOSED
;
1057 wiinst
->buffer
.ossfragshift
= 0;
1058 wiinst
->buffer
.fragment_size
= 0;
1059 wiinst
->buffer
.numfrags
= 0;
1061 init_waitqueue_head(&wiinst
->wait_queue
);
1063 wiinst
->mmapped
= 0;
1064 wiinst
->total_recorded
= 0;
1066 wiinst
->lock
= SPIN_LOCK_UNLOCKED
;
1067 tasklet_init(&wiinst
->timer
.tasklet
, emu10k1_wavein_bh
, (unsigned long) wave_dev
);
1068 wave_dev
->wiinst
= wiinst
;
1069 emu10k1_wavein_setformat(wave_dev
, &wiinst
->format
);
1072 if (file
->f_mode
& FMODE_WRITE
) {
1073 struct woinst
*woinst
;
1075 if ((woinst
= (struct woinst
*) kmalloc(sizeof(struct woinst
), GFP_KERNEL
)) == NULL
) {
1080 if (wave_dev
->wiinst
!= NULL
) {
1081 woinst
->format
= wave_dev
->wiinst
->format
;
1083 woinst
->format
.samplingrate
= 8000;
1084 woinst
->format
.bitsperchannel
= 8;
1085 woinst
->format
.channels
= 1;
1088 woinst
->state
= WAVE_STATE_CLOSED
;
1090 woinst
->buffer
.fragment_size
= 0;
1091 woinst
->buffer
.ossfragshift
= 0;
1092 woinst
->buffer
.numfrags
= 0;
1093 woinst
->device
= (card
->audio1_num
== minor
);
1095 init_waitqueue_head(&woinst
->wait_queue
);
1097 woinst
->mmapped
= 0;
1098 woinst
->total_copied
= 0;
1099 woinst
->total_played
= 0;
1101 woinst
->lock
= SPIN_LOCK_UNLOCKED
;
1102 tasklet_init(&woinst
->timer
.tasklet
, emu10k1_waveout_bh
, (unsigned long) wave_dev
);
1103 wave_dev
->woinst
= woinst
;
1104 emu10k1_waveout_setformat(wave_dev
, &woinst
->format
);
1106 #ifdef PRIVATE_PCM_VOLUME
1112 * find out if we've already been in this table
1113 * xmms reopens dsp on every move of slider
1114 * this way we keep the same local pcm for such
1117 for (i
= 0; i
< MAX_PCM_CHANNELS
; i
++) {
1118 if (sblive_pcm_volume
[i
].files
== current
->files
)
1120 // here we should select last used memeber
1121 // improve me in case its not sufficient
1122 if (j
< 0 && !sblive_pcm_volume
[i
].opened
)
1125 // current task not found
1126 if (i
== MAX_PCM_CHANNELS
) {
1129 printk(KERN_WARNING
"emu10k1: too many writters!\n");
1130 i
= (j
>= 0) ? j
: 0;
1131 DPD(2, "new pcm private %p\n", current
->files
);
1132 sblive_pcm_volume
[i
].files
= current
->files
;
1133 sblive_pcm_volume
[i
].mixer
= pcm_last_mixer
;
1134 sblive_pcm_volume
[i
].attn_l
= 0;
1135 sblive_pcm_volume
[i
].attn_r
= 0;
1136 sblive_pcm_volume
[i
].channel_l
= NUM_G
;
1137 sblive_pcm_volume
[i
].channel_r
= NUM_G
;
1139 DPD(2, "old pcm private %p 0x%x\n", current
->files
,
1140 sblive_pcm_volume
[i
].mixer
);
1142 sblive_pcm_volume
[i
].opened
++;
1147 file
->private_data
= (void *) wave_dev
;
1152 static int emu10k1_audio_release(struct inode
*inode
, struct file
*file
)
1154 struct emu10k1_wavedevice
*wave_dev
= (struct emu10k1_wavedevice
*) file
->private_data
;
1155 struct emu10k1_card
*card
;
1156 unsigned long flags
;
1159 card
= wave_dev
->card
;
1161 DPF(2, "emu10k1_audio_release()\n");
1163 if (file
->f_mode
& FMODE_WRITE
) {
1164 struct woinst
*woinst
= wave_dev
->woinst
;
1166 spin_lock_irqsave(&woinst
->lock
, flags
);
1168 if (woinst
->state
& WAVE_STATE_OPEN
) {
1169 if (woinst
->state
& WAVE_STATE_STARTED
) {
1170 if (!(file
->f_flags
& O_NONBLOCK
)) {
1171 while (!signal_pending(current
)
1172 && (woinst
->total_played
< woinst
->total_copied
)) {
1173 DPF(4, "Buffer hasn't been totally played, sleep....\n");
1174 spin_unlock_irqrestore(&woinst
->lock
, flags
);
1175 interruptible_sleep_on(&woinst
->wait_queue
);
1176 spin_lock_irqsave(&woinst
->lock
, flags
);
1181 if (woinst
->mmapped
) {
1184 /* Undo marking the pages as reserved */
1185 for (i
= 0; i
< woinst
->buffer
.pages
; i
++)
1186 mem_map_reserve(virt_to_page(woinst
->buffer
.addr
[i
]));
1189 emu10k1_waveout_close(wave_dev
);
1191 #ifdef PRIVATE_PCM_VOLUME
1196 * NOTE: structure remains unchanged for next reopen */
1197 for (i
= 0; i
< MAX_PCM_CHANNELS
; i
++) {
1198 if (sblive_pcm_volume
[i
].files
== current
->files
) {
1199 sblive_pcm_volume
[i
].opened
--;
1205 spin_unlock_irqrestore(&woinst
->lock
, flags
);
1206 /* wait for the tasklet (bottom-half) to finish */
1207 tasklet_unlock_wait(&woinst
->timer
.tasklet
);
1208 kfree(wave_dev
->woinst
);
1211 if (file
->f_mode
& FMODE_READ
) {
1212 struct wiinst
*wiinst
= wave_dev
->wiinst
;
1214 spin_lock_irqsave(&wiinst
->lock
, flags
);
1216 if (wiinst
->state
& WAVE_STATE_OPEN
)
1217 emu10k1_wavein_close(wave_dev
);
1219 spin_unlock_irqrestore(&wiinst
->lock
, flags
);
1220 tasklet_unlock_wait(&wiinst
->timer
.tasklet
);
1221 kfree(wave_dev
->wiinst
);
1226 wake_up_interruptible(&card
->open_wait
);
1232 static unsigned int emu10k1_audio_poll(struct file
*file
, struct poll_table_struct
*wait
)
1234 struct emu10k1_wavedevice
*wave_dev
= (struct emu10k1_wavedevice
*) file
->private_data
;
1235 struct woinst
*woinst
= wave_dev
->woinst
;
1236 struct wiinst
*wiinst
= wave_dev
->wiinst
;
1237 unsigned int mask
= 0;
1239 unsigned long flags
;
1241 DPF(4, "emu10k1_audio_poll()\n");
1243 if (file
->f_mode
& FMODE_WRITE
)
1244 poll_wait(file
, &woinst
->wait_queue
, wait
);
1246 if (file
->f_mode
& FMODE_READ
)
1247 poll_wait(file
, &wiinst
->wait_queue
, wait
);
1249 if (file
->f_mode
& FMODE_WRITE
) {
1250 spin_lock_irqsave(&woinst
->lock
, flags
);
1252 if (woinst
->state
& WAVE_STATE_OPEN
) {
1253 emu10k1_waveout_update(woinst
);
1254 emu10k1_waveout_getxfersize(woinst
, &bytestocopy
);
1256 if (bytestocopy
>= woinst
->buffer
.fragment_size
)
1257 mask
|= POLLOUT
| POLLWRNORM
;
1259 mask
|= POLLOUT
| POLLWRNORM
;
1261 if(woinst
->mmapped
) {
1262 spin_unlock_irqrestore(&woinst
->lock
, flags
);
1266 spin_unlock_irqrestore(&woinst
->lock
, flags
);
1269 if (file
->f_mode
& FMODE_READ
) {
1270 spin_lock_irqsave(&wiinst
->lock
, flags
);
1272 if (wiinst
->state
== WAVE_STATE_CLOSED
) {
1273 calculate_ifrag(wiinst
);
1274 if (emu10k1_wavein_open(wave_dev
) < 0) {
1275 spin_unlock_irqrestore(&wiinst
->lock
, flags
);
1276 return (mask
|= POLLERR
);
1280 if (!(wiinst
->state
& WAVE_STATE_STARTED
)) {
1281 wave_dev
->enablebits
|= PCM_ENABLE_INPUT
;
1282 emu10k1_wavein_start(wave_dev
);
1284 emu10k1_wavein_update(wave_dev
->card
, wiinst
);
1285 emu10k1_wavein_getxfersize(wiinst
, &bytestocopy
);
1287 if (bytestocopy
>= wiinst
->buffer
.fragment_size
)
1288 mask
|= POLLIN
| POLLRDNORM
;
1290 spin_unlock_irqrestore(&wiinst
->lock
, flags
);
1296 static void calculate_ofrag(struct woinst
*woinst
)
1298 struct waveout_buffer
*buffer
= &woinst
->buffer
;
1301 if (buffer
->fragment_size
)
1304 if (!buffer
->ossfragshift
) {
1305 fragsize
= (woinst
->format
.bytespersec
* WAVEOUT_DEFAULTFRAGLEN
) / 1000 - 1;
1309 buffer
->ossfragshift
++;
1313 if (buffer
->ossfragshift
< WAVEOUT_MINFRAGSHIFT
)
1314 buffer
->ossfragshift
= WAVEOUT_MINFRAGSHIFT
;
1316 buffer
->fragment_size
= 1 << buffer
->ossfragshift
;
1318 if (!buffer
->numfrags
) {
1321 numfrags
= (woinst
->format
.bytespersec
* WAVEOUT_DEFAULTBUFLEN
) / (buffer
->fragment_size
* 1000) - 1;
1323 buffer
->numfrags
= 1;
1327 buffer
->numfrags
<<= 1;
1331 if (buffer
->numfrags
< MINFRAGS
)
1332 buffer
->numfrags
= MINFRAGS
;
1334 if (buffer
->numfrags
* buffer
->fragment_size
> WAVEOUT_MAXBUFSIZE
) {
1335 buffer
->numfrags
= WAVEOUT_MAXBUFSIZE
/ buffer
->fragment_size
;
1337 if (buffer
->numfrags
< MINFRAGS
) {
1338 buffer
->numfrags
= MINFRAGS
;
1339 buffer
->fragment_size
= WAVEOUT_MAXBUFSIZE
/ MINFRAGS
;
1342 } else if (buffer
->numfrags
* buffer
->fragment_size
< WAVEOUT_MINBUFSIZE
)
1343 buffer
->numfrags
= WAVEOUT_MINBUFSIZE
/ buffer
->fragment_size
;
1345 buffer
->size
= buffer
->fragment_size
* buffer
->numfrags
;
1346 buffer
->pages
= buffer
->size
/ PAGE_SIZE
+ ((buffer
->size
% PAGE_SIZE
) ? 1 : 0);
1348 DPD(2, " calculated playback fragment_size -> %d\n", buffer
->fragment_size
);
1349 DPD(2, " calculated playback numfrags -> %d\n", buffer
->numfrags
);
1354 static void calculate_ifrag(struct wiinst
*wiinst
)
1356 struct wavein_buffer
*buffer
= &wiinst
->buffer
;
1357 u32 fragsize
, bufsize
, size
[4];
1360 if (buffer
->fragment_size
)
1363 if (!buffer
->ossfragshift
) {
1364 fragsize
= (wiinst
->format
.bytespersec
* WAVEIN_DEFAULTFRAGLEN
) / 1000 - 1;
1368 buffer
->ossfragshift
++;
1372 if (buffer
->ossfragshift
< WAVEIN_MINFRAGSHIFT
)
1373 buffer
->ossfragshift
= WAVEIN_MINFRAGSHIFT
;
1375 buffer
->fragment_size
= 1 << buffer
->ossfragshift
;
1377 if (!buffer
->numfrags
)
1378 buffer
->numfrags
= (wiinst
->format
.bytespersec
* WAVEIN_DEFAULTBUFLEN
) / (buffer
->fragment_size
* 1000) - 1;
1380 if (buffer
->numfrags
< MINFRAGS
)
1381 buffer
->numfrags
= MINFRAGS
;
1383 if (buffer
->numfrags
* buffer
->fragment_size
> WAVEIN_MAXBUFSIZE
) {
1384 buffer
->numfrags
= WAVEIN_MAXBUFSIZE
/ buffer
->fragment_size
;
1386 if (buffer
->numfrags
< MINFRAGS
) {
1387 buffer
->numfrags
= MINFRAGS
;
1388 buffer
->fragment_size
= WAVEIN_MAXBUFSIZE
/ MINFRAGS
;
1390 } else if (buffer
->numfrags
* buffer
->fragment_size
< WAVEIN_MINBUFSIZE
)
1391 buffer
->numfrags
= WAVEIN_MINBUFSIZE
/ buffer
->fragment_size
;
1393 bufsize
= buffer
->fragment_size
* buffer
->numfrags
;
1395 if (bufsize
>= 0x10000) {
1396 buffer
->size
= 0x10000;
1397 buffer
->sizeregval
= 0x1f;
1405 for (i
= 0; i
< 8; i
++)
1406 for (j
= 0; j
< 4; j
++)
1407 if (bufsize
>= size
[j
]) {
1408 buffer
->size
= size
[j
];
1410 buffer
->sizeregval
= i
* 4 + j
+ 1;
1414 if (buffer
->size
== 0) {
1416 buffer
->sizeregval
= 0x01;
1420 buffer
->numfrags
= buffer
->size
/ buffer
->fragment_size
;
1422 if (buffer
->size
% buffer
->fragment_size
)
1425 DPD(2, " calculated recording fragment_size -> %d\n", buffer
->fragment_size
);
1426 DPD(2, " calculated recording numfrags -> %d\n", buffer
->numfrags
);
1427 DPD(2, " buffer size register -> 0x%2x\n", buffer
->sizeregval
);
1432 void emu10k1_wavein_bh(unsigned long refdata
)
1434 struct emu10k1_wavedevice
*wave_dev
= (struct emu10k1_wavedevice
*) refdata
;
1435 struct wiinst
*wiinst
= wave_dev
->wiinst
;
1437 unsigned long flags
;
1439 spin_lock_irqsave(&wiinst
->lock
, flags
);
1441 if (!(wiinst
->state
& WAVE_STATE_STARTED
)) {
1442 spin_unlock_irqrestore(&wiinst
->lock
, flags
);
1446 emu10k1_wavein_update(wave_dev
->card
, wiinst
);
1448 if (wiinst
->mmapped
) {
1449 spin_unlock_irqrestore(&wiinst
->lock
, flags
);
1453 emu10k1_wavein_getxfersize(wiinst
, &bytestocopy
);
1455 spin_unlock_irqrestore(&wiinst
->lock
, flags
);
1457 if (bytestocopy
>= wiinst
->buffer
.fragment_size
)
1458 wake_up_interruptible(&wiinst
->wait_queue
);
1460 DPD(3, "Not enough transfer size, %d\n", bytestocopy
);
1465 void emu10k1_waveout_bh(unsigned long refdata
)
1467 struct emu10k1_wavedevice
*wave_dev
= (struct emu10k1_wavedevice
*) refdata
;
1468 struct woinst
*woinst
= wave_dev
->woinst
;
1470 unsigned long flags
;
1472 spin_lock_irqsave(&woinst
->lock
, flags
);
1474 if (!(woinst
->state
& WAVE_STATE_STARTED
)) {
1475 spin_unlock_irqrestore(&woinst
->lock
, flags
);
1479 emu10k1_waveout_update(woinst
);
1480 emu10k1_waveout_getxfersize(woinst
, &bytestocopy
);
1482 if (woinst
->buffer
.fill_silence
) {
1483 spin_unlock_irqrestore(&woinst
->lock
, flags
);
1484 emu10k1_waveout_fillsilence(woinst
);
1486 spin_unlock_irqrestore(&woinst
->lock
, flags
);
1488 if (bytestocopy
>= woinst
->buffer
.fragment_size
)
1489 wake_up_interruptible(&woinst
->wait_queue
);
1491 DPD(3, "Not enough transfer size -> %d\n", bytestocopy
);
1496 struct file_operations emu10k1_audio_fops
= {
1498 llseek
: emu10k1_audio_llseek
,
1499 read
: emu10k1_audio_read
,
1500 write
: emu10k1_audio_write
,
1501 poll
: emu10k1_audio_poll
,
1502 ioctl
: emu10k1_audio_ioctl
,
1503 mmap
: emu10k1_audio_mmap
,
1504 open
: emu10k1_audio_open
,
1505 release
: emu10k1_audio_release
,